From: Daniel Kirschten Date: Mon, 16 Sep 2019 07:22:09 +0000 (+0200) Subject: Merge branch 'cont-integr-2' into 'development' X-Git-Url: https://mograsim.net/gitweb/?p=Mograsim.git;a=commitdiff_plain;h=58babf45ae7d259a296656451d796dbe601377a4;hp=be391655605fed71095d1ac7dafb8c4d6f06312d Merge branch 'cont-integr-2' into 'development' Switch to automatic build and test See merge request lrr-tum/students/eragp-misim-2019!1 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..9224174c --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +target/ +bin/ +*.class +.flattened-pom.xml +pom.tycho +**.polyglot* +**.takari* +**.META-INF_MANIFEST.MF \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..ff039dba --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,55 @@ +# This file is a template, and might need editing before it works on your project. + +# Build JAVA applications using Apache Maven (http://maven.apache.org) +# For docker image tags see https://hub.docker.com/_/maven/ +# +# For general lifecycle information see https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html + +# This template will build and test your projects +# * Caches downloaded dependencies and plugins between invocation. +# * Verify but don't deploy merge requests. +# * Deploy built artifacts from master branch only. + +variables: + GIT_SUBMODULE_STRATEGY: recursive + # This will suppress any download for dependencies and plugins or upload messages which would clutter the console log. + # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. + MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true" + # As of Maven 3.3.0 instead of this you may define these options in `.mvn/maven.config` so the same config is used + # when running from the command line. + # `installAtEnd` and `deployAtEnd` are only effective with recent version of the corresponding plugins. + MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true" + +# This template uses jdk11 for verifying and deploying images +image: maven:3.6.1-jdk-11 # Maven 3.6.2 will currently NOT WORK! + +# Cache downloaded dependencies and plugins between builds. +# To keep cache across branches add 'key: "$CI_JOB_NAME"' +cache: + key: "$CI_COMMIT_REF_SLUG" + paths: + - .m2/repository + +stages: + - validate + - test + +default: + before_script: + - cd TempMavenTychoSnapshotWorkaround + - mvn $MAVEN_CLI_OPTS clean # This is only temporary to resolve TYCHO 1.5.0-SNAPSHOT for the main build + - cd .. + +validate: + stage: validate + script: + - mvn $MAVEN_CLI_OPTS clean validate + +test: + stage: test + script: + - mvn $MAVEN_CLI_OPTS verify + artifacts: + reports: + junit: + - tests/*/target/surefire-reports/TEST-*.xml diff --git a/.gitmodules b/.gitmodules index 74725734..3f39c8a7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ [submodule "SWTHelper"] - path = SWTHelper - url = https://github.com/Haspamelodica/SWTHelper - branch = master + path = SWTHelper/bundles + url = https://github.com/Haspamelodica/SWTHelper.git diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml new file mode 100644 index 00000000..e06fb0e5 --- /dev/null +++ b/.mvn/extensions.xml @@ -0,0 +1,9 @@ + + + + org.eclipse.tycho.extras + tycho-pomless + 1.5.0-SNAPSHOT + + \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 00000000..e4bb21ad --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + eragp-misim-2019 + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/MAVEN-TYCHO-README.MD b/MAVEN-TYCHO-README.MD new file mode 100644 index 00000000..0682faec --- /dev/null +++ b/MAVEN-TYCHO-README.MD @@ -0,0 +1,247 @@ +# Mograsim Development Environment + +_Mograsim Development Documentation Version 0.1 --- 2019-09-13_ + +A short guide to the Mograsim Maven Tycho configuration and Maven Tycho in general, +as well as some information on Eclipse Plugin Development and OSGi. + + +## Maven Tycho + +[Maven Tycho](https://www.eclipse.org/tycho/sitedocs/index.html) is a plugin for +[Maven](http://maven.apache.org) that allows building Eclipse and OSGi Projects comfortably +and automatically using Maven. + +Useful links: +- [eclipse.org/tycho](https://www.eclipse.org/tycho/) +- [wiki.eclipse.org/Category:Tycho](https://wiki.eclipse.org/Category:Tycho) +- [vogella.com/tutorials/EclipseTycho](https://www.vogella.com/tutorials/EclipseTycho/article.html) +- [eclipse.org/tycho/sitedocs](https://www.eclipse.org/tycho/sitedocs/index.html) +- [Tycho pomless sources](https://git.eclipse.org/c/tycho/org.eclipse.tycho.extras.git/tree/tycho-pomless/src/main/java/org/eclipse/tycho/pomless) + (see *Mapping for naming and other conventions, TychoAggregatorMapping for folders) + +## OSGi + +OSGi is a module system for Java (completely unrelated to the Java 9 Jigsaw module +system) that allows detailed control over modules, dependencies, versions and more. +The file associated with OSGi here is a specific MANIFEST.MF in the META-INF directory +of each project. + +Roughly, an OSGi bundle has: +- a **symbolic name** that acts as an identifier, therefore it should be unique and + must not be changed, otherwise it a large portion of the configuration would break. + Never change that field after distribution. +- a **bundle name** and **bundle vendor**; this is only for the users and developers + and is not constrained in any way. You can change that, but it should be consistent + across all Mograsim modules. Both can be externalized to +- a **bundle version** that denotes current the version of the bundle. The `qualifier` + is replaced during the build process with a timestamp of the format `YYYYMMDDhhmmss`. + The version itself can be set using the maven tycho version plugin, which replaces + not only the maven versions, but all (equivalent) versions in the MANIFEST as well. +- a **bundle required execution environment** (abbr. BREE) where the bundle's *minimal* + JDK version is set. This is also the one eclipse uses and displays as JRE System + Library in the Eclipse projects.
This should be the same as the one the target + definition used for the build and the same that maven is run with ( -> check the + Run Configuration) + +## Eclipse Plugins + +- Short explanation of the different names and terms used in Eclipse Plugin Dev, + and short introduction to the different mechanisms used. + +## Mograsim Structure + +The tree of Mograsim projects: + +- `bundles` - _This contains all bundles/plugins that provide functionality to Mograsim_ + - `extenal/swthelper` - _This contains the [SWTHelper](https://github.com/Haspamelodica/SWTHelper) + git submodule._ + - `bundles` - _This submodule folder needs to be named like that for Tycho + pom-less build to work._ + - _SWTInput_ - _unused_ + - **SWTObjectWrappers** - SWT object abstractions to enable zooming and + optimizations. + - _SWTSystemInOutApplication_ - _unused_ + - _SWTTiledZoomableCanvas_ - _unused_ + - **SWTZoomableCanvas** - The SWT canvas we draw the simulation in. + - **net.mograsim.logic.core**
The core logic for pure simulation. This contains + the most important low-level logic circuits and gates and defines how that + logic gets simulated. The underlying system for simulation in Mograsim is an + event based approach (see `Timeline`), using VHDL-like logic defined in `Bit` + and `BitVector`. More complex ciruits are build out of `Wire`s connecting `Component`s. + - **net.mograsim.logic.model**
The model describes how that core logic is + displayed and arranged, and allows (de-)serialization to JSON. The core logic + model gets generated based on this. Every basic net.mograsim.logic.core Component + has a model equivalent here that represents it in the GUI and persisted state + (JSON). + - **net.mograsim.logic.model.editor**
This bundle contains a standalone + SWT-based editor to edit Mograsim JSON-models in a comfortable way. It can + be used to create a new `SubmodelComponent` by arranging existing ones to a + new component. Note that editing and simulation are entirely different processes + in Mograsim, the editor cannot simulate and a running simulation cannot be + edited. (At least in the current state) + - **net.mograsim.logic.model.am2900**
This plugin contains a model for the + AMD Am2900 Family Microprocessors arranged into a microprogrammable model. + This can be used in the microprogram editor of the Mograsim plugin and in the + Mograsim assembler editor (by using a properly set up instruction set). We + took care that the plugin is independent, meaning that it only provides an + implementation for an extension point of the net.mograsim.machine plugin and + no other Mograsim depends on it.
This is also the way to go if you want + to add your own machine definitions to Mograsim and use them there. + - **net.mograsim.machine**
The machine plugin defines an extension point + that can be extended and implemented in other (your own) plugins to provide + new machines to Mograsim. In addition to the extension point and the most important + interfaces, it contains some commonly required or useful components to build/define + another machine. net.mograsim.logic.model.am2900 for example is such an extension. + The machine plugin itself scans for all available implementations of the interface + given by the extension point, and other parts of the Mograsim plugin get access + to them that way. + - **net.mograsim.plugin.core**
This is - as the name says - the core plugin + of mograsim. Here lie all the Eclipse Platform specific parts that make Mograsim + as an Eclipse plugin work. This includes the different editors, view, settings + and other functional extension to the Eclipse IDE. + - **net.mograsim.plugin.core.nl_de**
This optional plugin provides a German + localization for Mograsim. + - **net.mograsim.plugin.branding**
This contains elements for branding the + feature plugin, and additional resources and raw files (original logo and icon + in SVG and Adobe Illustrator and similar). + - **net.mograsim.plugin.docs**
The Plugin providing the user documentation. + - **net.mograsim.preferences**
A plugin for managing and accessing preferences. +- `features` - _This contains all Mograsim feature plugins_ + - **net.mograsim.feature**
The Mograsim feature plugin, containing all the + plugins above and combining them into a feature. A feature is a plugin collection + with additional properties that allows for easy installation by the end user. + For this purpose, it also contains license information, authors, updatesite + location (allows eclipse to automatically check if updates are available) and + more. +- `products` - _This contains standalone Mograsim product(s)_ + - **net.mograsim.product**
A product can be pretty much anything (see Eclipse + RCP), in our case, this is simply a pre-configured Eclipse package, comparable + to the packages located at [www.eclipse.org/downloads/packages](https://www.eclipse.org/downloads/packages/). +- `releng` - _Abbreviation for **Rel**ease **Eng**ineering, contains important configuration_ + - **net.mograsim.configuration**
This contains the configuration for the + Mograsim project and the build in particular. The central Maven configuration + is located here in a single `pom.xml`, that is the super-parent of all others, + including the generated ones. + - **net.mograsim.updatesite**
This updatesite project collects features + in form of an update site that can be accessed by Eclipse to install new features + or update features. The features are grouped into categories which can come + with further descriptions. The `target/repository/` is the part of the whole + Mograsim project that actually gets deployed. By using Help -> Install New + Software -> Add -> Local, the `repository`-folder can be selected and features + can be installed offline, e.g. to test them. + - **net.mograsim.target**
The target definition for the build. This is a + well-defined environment that we expect the plugins to work in/with. That includes + all plugin dependencies (like all plugins the Eclipse Platform is comprised + of) and the (minimum) JRE that is expected. Some plugins exclusively for testing + are included here, too. +- `tests` - _This contains (integration-like) tests in form of plugin fragments_ + - **net.mograsim.logic.tests** + - **net.mograsim.logic.model.am2900.tests** + - **net.mograsim.machine.tests** + +## Build Mograsim + +Use the main aggregator `pom.xml` next to this markdown file to build mograsim, take +care to use the correct JDK to run it (see Run Configuration). + +A short guide to the [Maven goals (Maven Lifecycle)](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html): +- The `clean` goal will remove all `target`-folders and other generated files like + flattened poms and polyglot build artifacts (all are listed in `.gitignore`). +- The `validate` goal is useful to simply check if the setup itself (Maven Tycho) + is ok and everything needed is available. +- The `integration-test` goal will run the test plugins, the `test` goal beforehand + **will not.** +- I recommend running `clean verify` or `verify`, this will do everything up to and + including the testing. + +Please note that Tycho 1.5.0 is not released yet, and thus requires a workaround. +More information can be found under [Maven Core Extension Problems](#mceps). + +## Challenges + +Not everything is as simple as it seems at first glance. + +### Maven Core Extension Problems + +The Tycho extra `tycho-pomless` is a Maven core extension allows for simpler structure +and less redundancy. Maven core extensions must be available at [the central maven repository](http://repo.maven.apache.org/maven2/) +(or already in the local repository), you cannot specify an alternative remote repository +in `.mvn/extensions.xml`. If a core extension cannot be resolved, you will get currently +(Maven 3.6.2) only a warning like + +> [WARNING] The POM for org.eclipse.tycho.extras:tycho-pomless:jar:1.5.0-SNAPSHOT is missing, no dependency information available + +This means that the extension was not found, and it cannot be used, which leads to +a failure later on. To get around that, create a dummy pom that only serves the purpose +to "request" and resolve the extension: + +```xml + + 4.0.0 + net.mograsim + net.mograsim.tycho-download + 1.0.0 + pom + + + + + tycho-snapshots + https://repo.eclipse.org/content/repositories/tycho-snapshots/ + + true + + + true + always + + + + + + + + org.eclipse.tycho.extras + tycho-pomless + 1.5.0-SNAPSHOT + + + + +``` +While that this is not the most compact way, it can be run by the developer and build +server equally easy and does not require special CLI knowledge. As developer, you +need to run that only once (in Eclipse: right click on pom.xml -> Run As -> Maven +clean). For continuous integration, you can insert one more line in the YAML (or +equivalent), like in our case ` - mvn $MAVEN_CLI_OPTS clean`. + +### Git Submodules + +Git submodules are a challenge with a tycho build, because the projects that reside +in it need to be build, too. But not only that, they need to use the same configuration +for the build, which is problematic if you do not have control over them. The solution +only exists with Tycho 1.5.0 (currently only as snapshot), where deep folder structures +are automatically scanned and poms get gnereated; not every folder requires an aggregator +pom. This however requires (at the moment) certain naming conventions (see section +on Tycho itself). + +In our case, [SWTHelper](https://github.com/Haspamelodica/SWTHelper) is a git submodule +containing several plain Java Eclipse projects with OSGi configuration (MANIFEST.MF), +which is the reason this works at all. Due to the naming conventions, the submodule +folder is named `bundles`. + +### Maven incompatibility + +Maven 3.6.2 is currently incompatible with Tycho <= 1.5.0. + +If you encounter + +> [FATAL] Non-readable POM "somepath"\tests\.polyglot.pom.tycho: input contained no data @ + +or + +> [FATAL] Non-readable POM "somepath"\bundles\net.mograsim.logic.core\.polyglot..META-INF_MANIFEST.MF: input contained no data @ + +make sure to use Maven 3.6.1 to fix that (this is the default Eclipse embedded Maven +at the moment). diff --git a/MAVEN-TYCHO-README.html b/MAVEN-TYCHO-README.html new file mode 100644 index 00000000..41829c29 --- /dev/null +++ b/MAVEN-TYCHO-README.html @@ -0,0 +1,251 @@ + + + + + + + + + +

Mograsim Development Environment

+

Mograsim Development Documentation Version 0.1 — 2019-09-13

+

A short guide to the Mograsim Maven Tycho configuration and Maven Tycho in general, +as well as some information on Eclipse Plugin Development and OSGi.

+

Maven Tycho

+

Maven Tycho is a plugin for +Maven that allows building Eclipse and OSGi Projects comfortably +and automatically using Maven.

+

Useful links:

+ +

OSGi

+

OSGi is a module system for Java (completely unrelated to the Java 9 Jigsaw module +system) that allows detailed control over modules, dependencies, versions and more. +The file associated with OSGi here is a specific MANIFEST.MF in the META-INF directory +of each project.

+

Roughly, an OSGi bundle has:

+ +

Eclipse Plugins

+ +

Mograsim Structure

+

The tree of Mograsim projects:

+ +

Build Mograsim

+

Use the main aggregator pom.xml next to this markdown file to build mograsim, take +care to use the correct JDK to run it (see Run Configuration).

+

A short guide to the Maven goals (Maven Lifecycle):

+ +

Please note that Tycho 1.5.0 is not released yet, and thus requires a workaround. +More information can be found under Maven Core Extension Problems.

+

Challenges

+

Not everything is as simple as it seems at first glance.

+

Maven Core Extension Problems

+

The Tycho extra tycho-pomless is a Maven core extension allows for simpler structure +and less redundancy. Maven core extensions must be available at the central maven repository +(or already in the local repository), you cannot specify an alternative remote repository +in .mvn/extensions.xml. If a core extension cannot be resolved, you will get currently +(Maven 3.6.2) only a warning like

+

[WARNING] The POM for org.eclipse.tycho.extras:tycho-pomless:jar:1.5.0-SNAPSHOT is missing, no dependency information available

+
+

This means that the extension was not found, and it cannot be used, which leads to +a failure later on. To get around that, create a dummy pom that only serves the purpose +to “request” and resolve the extension:

+
<project .. bla .. bla ..>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>net.mograsim</groupId>
+    <artifactId>net.mograsim.tycho-download</artifactId>
+    <version>1.0.0</version>
+    <packaging>pom</packaging>
+
+    <pluginRepositories>
+        <!-- currently necessary because we are using a SNAPSHOT build of tycho -->
+        <pluginRepository>
+            <id>tycho-snapshots</id>
+            <url>https://repo.eclipse.org/content/repositories/tycho-snapshots/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <build>
+        <extensions>
+            <extension>
+                <groupId>org.eclipse.tycho.extras</groupId>
+                <artifactId>tycho-pomless</artifactId>
+                <version>1.5.0-SNAPSHOT</version>
+            </extension>
+        </extensions>
+    </build>
+</project>
+
+

While that this is not the most compact way, it can be run by the developer and build +server equally easy and does not require special CLI knowledge. As developer, you +need to run that only once (in Eclipse: right click on pom.xml -> Run As -> Maven +clean). For continuous integration, you can insert one more line in the YAML (or +equivalent), like in our case - mvn $MAVEN_CLI_OPTS clean.

+

Git Submodules

+

Git submodules are a challenge with a tycho build, because the projects that reside +in it need to be build, too. But not only that, they need to use the same configuration +for the build, which is problematic if you do not have control over them. The solution +only exists with Tycho 1.5.0 (currently only as snapshot), where deep folder structures +are automatically scanned and poms get gnereated; not every folder requires an aggregator +pom. This however requires (at the moment) certain naming conventions (see section +on Tycho itself).

+

In our case, SWTHelper is a git submodule +containing several plain Java Eclipse projects with OSGi configuration (MANIFEST.MF), +which is the reason this works at all. Due to the naming conventions, the submodule +folder is named bundles.

+

Maven incompatibility

+

Maven 3.6.2 is currently incompatible with Tycho <= 1.5.0.

+

If you encounter

+

[FATAL] Non-readable POM “somepath”\tests.polyglot.pom.tycho: input contained no data @

+
+

or

+

[FATAL] Non-readable POM “somepath”\bundles\net.mograsim.logic.core.polyglot..META-INF_MANIFEST.MF: input contained no data @

+
+

make sure to use Maven 3.6.1 to fix that (this is the default Eclipse embedded Maven +at the moment).

+ + \ No newline at end of file diff --git a/SWTHelper b/SWTHelper deleted file mode 160000 index 78574589..00000000 --- a/SWTHelper +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7857458991642e998c691d9b65d5a9bf7f7bbfae diff --git a/SWTHelper/bundles b/SWTHelper/bundles new file mode 160000 index 00000000..78574589 --- /dev/null +++ b/SWTHelper/bundles @@ -0,0 +1 @@ +Subproject commit 7857458991642e998c691d9b65d5a9bf7f7bbfae diff --git a/SWTHelper/pom.xml b/SWTHelper/pom.xml new file mode 100644 index 00000000..c583e163 --- /dev/null +++ b/SWTHelper/pom.xml @@ -0,0 +1,17 @@ + + 4.0.0 + net.mograsim.swthelper + pom + + + net.mograsim + net.mograsim + ${revision}${changelist} + + + + bundles + + \ No newline at end of file diff --git a/TempMavenTychoSnapshotWorkaround/.project b/TempMavenTychoSnapshotWorkaround/.project new file mode 100644 index 00000000..872cf5e6 --- /dev/null +++ b/TempMavenTychoSnapshotWorkaround/.project @@ -0,0 +1,17 @@ + + + TempMavenTychoSnapshotWorkaround + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/TempMavenTychoSnapshotWorkaround/pom.xml b/TempMavenTychoSnapshotWorkaround/pom.xml new file mode 100644 index 00000000..8c6713f0 --- /dev/null +++ b/TempMavenTychoSnapshotWorkaround/pom.xml @@ -0,0 +1,37 @@ + + 4.0.0 + net.mograsim + net.mograsim.tycho-download + 1.0.0 + pom + + + + + + + tycho-snapshots + https://repo.eclipse.org/content/repositories/tycho-snapshots/ + + true + + + true + always + + + + + + + + org.eclipse.tycho.extras + tycho-pomless + 1.5.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/features/net.mograsim.feature/.project b/features/net.mograsim.feature/.project new file mode 100644 index 00000000..254cd9e2 --- /dev/null +++ b/features/net.mograsim.feature/.project @@ -0,0 +1,21 @@ + + + net.mograsim.feature + + + net.mograsim.logic.model.am2900 + net.mograsim.plugin.branding + net.mograsim.plugin.core + net.mograsim.plugin.docs + + + + org.eclipse.pde.FeatureBuilder + + + + + + org.eclipse.pde.FeatureNature + + diff --git a/features/net.mograsim.feature/.settings/org.eclipse.core.resources.prefs b/features/net.mograsim.feature/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/features/net.mograsim.feature/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/features/net.mograsim.feature/build.properties b/features/net.mograsim.feature/build.properties new file mode 100644 index 00000000..64f93a9f --- /dev/null +++ b/features/net.mograsim.feature/build.properties @@ -0,0 +1 @@ +bin.includes = feature.xml diff --git a/features/net.mograsim.feature/feature.xml b/features/net.mograsim.feature/feature.xml new file mode 100644 index 00000000..7e121014 --- /dev/null +++ b/features/net.mograsim.feature/feature.xml @@ -0,0 +1,770 @@ + + + + + Mograsim - Modular Graphical Simulator + +For teaching microprogramming, ISAs and circuit logic at the Technical University of Munich (TUM). +By Christian Femers, Daniel Kirschten and Fabian Stemmler + + + + Copyright (c) 2019 Christian Femers, Daniel Kirschten and Fabian Stemmler + +This program and the accompanying materials are made +available under the terms of the Eclipse Public License 2.0 +which is available at https://www.eclipse.org/legal/epl-2.0/ + +This Source Code may also be made available under the following Secondary +Licenses when the conditions for such availability set forth in the Eclipse +Public License, v. 2.0 are satisfied: GNU General Public License, version 2 +with the GNU Classpath Exception which is +available at https://www.gnu.org/software/classpath/license.html. + +SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + + + + This program and the accompanying materials are made available under the +terms of the Eclipse Public License 2.0 which is available at +http://www.eclipse.org/legal/epl-2.0, or GNU General Public License, +version 2 with the GNU Classpath Exception which is available at +https://www.gnu.org/software/classpath/license.html. + +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/features/net.mograsim.feature/sourceTemplateFeature/.gitkeep b/features/net.mograsim.feature/sourceTemplateFeature/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/net.mograsim.logic.core/.classpath b/net.mograsim.logic.core/.classpath deleted file mode 100644 index da70a87e..00000000 --- a/net.mograsim.logic.core/.classpath +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.logic.core/.gitignore b/net.mograsim.logic.core/.gitignore deleted file mode 100644 index 265a1ae2..00000000 --- a/net.mograsim.logic.core/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -/bin/ -*.log - -# package files -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# vm crash logs -hs_err_pid* \ No newline at end of file diff --git a/net.mograsim.logic.core/.project b/net.mograsim.logic.core/.project deleted file mode 100644 index 2f347c0a..00000000 --- a/net.mograsim.logic.core/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - net.mograsim.logic.core - - - net.mograsim.preferences - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs b/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index e5f98893..00000000 --- a/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,468 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert -org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 94658822..00000000 --- a/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=false -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true -sp_cleanup.correct_indentation=true -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=true -sp_cleanup.never_use_blocks=true -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=true -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=true -sp_cleanup.remove_redundant_semicolons=true -sp_cleanup.remove_redundant_type_arguments=true -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=true -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=true -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=true -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.logic.core/META-INF/MANIFEST.MF b/net.mograsim.logic.core/META-INF/MANIFEST.MF deleted file mode 100644 index 2aff2ab9..00000000 --- a/net.mograsim.logic.core/META-INF/MANIFEST.MF +++ /dev/null @@ -1,15 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %Bundle-Name -Bundle-SymbolicName: net.mograsim.logic.core -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.logic.core, - net.mograsim.logic.core.components, - net.mograsim.logic.core.components.gates, - net.mograsim.logic.core.timeline, - net.mograsim.logic.core.types, - net.mograsim.logic.core.wires -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Automatic-Module-Name: net.mograsim.logic.core -Bundle-Vendor: Mograsim Team -Require-Bundle: net.mograsim.preferences;bundle-version="0.1.0" diff --git a/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties b/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties deleted file mode 100644 index 8ea411e4..00000000 --- a/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Properties file for net.mograsim.logic.core -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim logic core \ No newline at end of file diff --git a/net.mograsim.logic.core/build.properties b/net.mograsim.logic.core/build.properties deleted file mode 100644 index d6642e65..00000000 --- a/net.mograsim.logic.core/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - .,\ - OSGI-INF/ diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java deleted file mode 100644 index 3a51c27c..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.mograsim.logic.core; - -public interface LogicObservable -{ - public void registerObserver(LogicObserver ob); - - public void deregisterObserver(LogicObserver ob); - - public void notifyObservers(); - -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java deleted file mode 100644 index 259fe4d7..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.mograsim.logic.core; - -@FunctionalInterface -public interface LogicObserver -{ - public void update(LogicObservable initiator); -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java deleted file mode 100644 index c82f2b37..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.logic.core.components; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; - -/** - * A basic component that recomputes all outputs (with a delay), when it is updated. - * - * @author Fabian Stemmler - */ -public abstract class BasicCoreComponent extends CoreComponent implements LogicObserver -{ - private int processTime; - - /** - * - * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed. - * - * @author Fabian Stemmler - */ - public BasicCoreComponent(Timeline timeline, int processTime) - { - super(timeline); - this.processTime = processTime > 0 ? processTime : 1; - } - - @Override - public final void update(LogicObservable initiator) - { - update(); - } - - public void update() - { - TimelineEventHandler delayedUpdates = compute(); - if (delayedUpdates != null) - timeline.addEvent(delayedUpdates, processTime); - } - - protected abstract TimelineEventHandler compute(); -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java deleted file mode 100644 index 345bc0ab..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreBitDisplay extends BasicCoreComponent implements LogicObservable -{ - private Collection observers; - private final ReadEnd in; - private BitVector displayedValue; - - public CoreBitDisplay(Timeline timeline, ReadEnd in) - { - super(timeline, 1); - observers = new ArrayList<>(); - this.in = in; - in.registerObserver(this); - compute(); - } - - @Override - protected TimelineEventHandler compute() - { - BitVector newValues = in.getValues(); - return e -> - { - displayedValue = newValues; - notifyObservers(); - }; - } - - public BitVector getDisplayedValue() - { - return displayedValue; - } - - public boolean isDisplaying(Bit... values) - { - return displayedValue.equals(BitVector.of(values)); - } - - @Override - public List getAllInputs() - { - return List.of(in); - } - - @Override - public List getAllOutputs() - { - return List.of(); - } - - @Override - public void registerObserver(LogicObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(LogicObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers() - { - observers.forEach(ob -> ob.update(this)); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java deleted file mode 100644 index 0cccdfdd..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.Collection; -import java.util.HashSet; -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEvent; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreClock extends CoreComponent implements TimelineEventHandler, LogicObservable -{ - private Collection observers; - private boolean toggle = false; - private ReadWriteEnd out; - private int delta; - - /** - * - * @param out {@link CoreWire} the clock's impulses are fed into - * @param delta ticks between rising and falling edge - */ - public CoreClock(Timeline timeline, ReadWriteEnd out, int delta) - { - super(timeline); - this.delta = delta; - this.out = out; - this.observers = new HashSet<>(); - addToTimeline(); - } - - @Override - public void handle(TimelineEvent e) - { - addToTimeline(); - out.feedSignals(toggle ? Bit.ONE : Bit.ZERO); - toggle = !toggle; - notifyObservers(); - } - - public ReadWriteEnd getOut() - { - return out; - } - - public boolean isOn() - { - return !toggle; - } - - private void addToTimeline() - { - timeline.addEvent(this, delta); - } - - @Override - public List getAllInputs() - { - return List.of(); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } - - @Override - public void registerObserver(LogicObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(LogicObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers() - { - observers.forEach(ob -> ob.update(this)); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java deleted file mode 100644 index 734f48de..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public abstract class CoreComponent -{ - protected Timeline timeline; - - public CoreComponent(Timeline timeline) - { - this.timeline = timeline; - } - - /** - * Returns immutable list of all inputs to the {@link CoreComponent} (including e.g. the select bits to a MUX). Intended for - * visualization in the UI. - */ - public abstract List getAllInputs(); - - /** - * Returns immutable list of all outputs to the {@link CoreComponent}. Intended for visualization in the UI. - */ - public abstract List getAllOutputs(); -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java deleted file mode 100644 index 8f4fe428..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java +++ /dev/null @@ -1,92 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -/** - * Models a multiplexer. Takes an arbitrary amount of input {@link CoreWire}s, one of which, as determined by select, is put through to the - * output. - * - * @author Fabian Stemmler - * - */ -public class CoreDemux extends BasicCoreComponent -{ - private final ReadEnd select, in; - private final ReadWriteEnd[] outputs; - private final int outputSize; - private int selected = -1; - - /** - * Output {@link CoreWire}s and in must be of uniform width - * - * @param in Must be of uniform width with all outputs. - * @param select Indexes the output array to which the input is mapped. Must have enough bits to index all outputs. - * @param outputs One of these outputs receives the input signal, depending on the select bits - */ - public CoreDemux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs) - { - super(timeline, processTime); - outputSize = in.width(); - - this.in = in; - this.outputs = outputs; - for (int i = 0; i < this.outputs.length; i++) - { - if (outputs[i].width() != outputSize) - throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform width!"); - this.outputs[i] = outputs[i]; - } - - this.select = select; - select.registerObserver(this); - - int maxInputs = 1 << select.width(); - if (this.outputs.length > maxInputs) - throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by " - + select.width() + " select bits (" + maxInputs + ")."); - in.registerObserver(this); - } - - @Override - public TimelineEventHandler compute() - { - int selectValue = select.getValues().isBinary() ? (int) select.getValues().getUnsignedValueLong() : -1; - if (selectValue >= outputs.length) - selectValue = -1; - - boolean hasOldSelection = selected != selectValue && selected != -1; - int oldSelection = selected; - boolean hasNewSelection = selectValue != -1; - int newSelection = selectValue; - BitVector inputValues = in.getValues(); - - selected = selectValue; - - return e -> - { - if (hasOldSelection) - outputs[oldSelection].clearSignals(); - if (hasNewSelection) - outputs[newSelection].feedSignals(inputValues); - }; - } - - @Override - public List getAllInputs() - { - return List.of(in, select); - } - - @Override - public List getAllOutputs() - { - return List.of(outputs); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java deleted file mode 100644 index b7e5d3a6..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -/** - * This class models a simple on/off (ONE/ZERO) switch for user interaction. - * - * @author Christian Femers - * - */ -public class CoreManualSwitch extends CoreComponent implements LogicObservable -{ - private Collection observers; - private ReadWriteEnd output; - private BitVector inputValues; - - public CoreManualSwitch(Timeline timeline, ReadWriteEnd output) - { - super(timeline); - observers = new ArrayList<>(); - this.output = output; - this.inputValues = output.getInputValues(); - } - - public void switchFullOn() - { - setState(BitVector.of(Bit.ONE, output.width())); - } - - public void switchFullOff() - { - setState(BitVector.of(Bit.ZERO, output.width())); - } - - public void toggle() - { - if (isFullOn()) - switchFullOff(); - else - switchFullOn(); - } - - public void setState(Bit bit) - { - setState(BitVector.of(bit)); - } - - public void setState(BitVector bits) - { - if (bits.length() != output.width()) - throw new IllegalArgumentException("Incorrect bit vector length"); - if (bits.equals(inputValues)) - return; - inputValues = bits; - output.feedSignals(bits); - notifyObservers(); - } - - public boolean isFullOn() - { - return BitVector.of(Bit.ONE, output.width()).equals(output.getInputValues()); - } - - public BitVector getValues() - { - return inputValues; - } - - @Override - public List getAllInputs() - { - return List.of(); - } - - @Override - public List getAllOutputs() - { - return List.of(output); - } - - @Override - public void registerObserver(LogicObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(LogicObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers() - { - observers.forEach(ob -> ob.update(this)); - } - -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java deleted file mode 100644 index 5b4220a5..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java +++ /dev/null @@ -1,96 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -/** - * Models a multiplexer. Takes an arbitrary amount of input {@link CoreWire}s, one of which, as determined by select, is put through to the - * output. - * - * @author Fabian Stemmler - * - */ -public class CoreMux extends BasicCoreComponent -{ - private ReadEnd select; - private ReadWriteEnd out; - private ReadEnd[] inputs; - private final int outputSize; - - /** - * Input {@link CoreWire}s and out must be of uniform width - * - * @param out Must be of uniform width with all inputs. - * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs. - * @param inputs One of these inputs is mapped to the output, depending on the select bits - */ - public CoreMux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs) - { - super(timeline, processTime); - outputSize = out.width(); - - this.inputs = inputs.clone(); - for (int i = 0; i < this.inputs.length; i++) - { - if (inputs[i].width() != outputSize) - throw new IllegalArgumentException("All MUX wire arrays must be of uniform width!"); - inputs[i].registerObserver(this); - } - - this.select = select; - select.registerObserver(this); - - int maxInputs = 1 << select.width(); - if (this.inputs.length > maxInputs) - throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by " - + select.width() + " select bits (" + maxInputs + ")."); - - this.out = out; - } - - public ReadEnd getOut() - { - return out; - } - - public ReadEnd getSelect() - { - return select; - } - - @Override - public TimelineEventHandler compute() - { - int selectValue; - if (!select.getValues().isBinary() || (selectValue = (int) select.getValues().getUnsignedValueLong()) >= inputs.length) - { - return e -> out.clearSignals(); - } - - BitVector activeValues = inputs[selectValue].getValues(); - return e -> out.feedSignals(activeValues); - } - - @Override - public List getAllInputs() - { - ArrayList wires = new ArrayList<>(Arrays.asList(inputs)); - wires.add(select); - return Collections.unmodifiableList(wires); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java deleted file mode 100644 index 4b7a339f..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreTriStateBuffer extends BasicCoreComponent -{ - ReadEnd in, enable; - ReadWriteEnd out; - - public CoreTriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable) - { - super(timeline, processTime); - if (in.width() != out.width()) - throw new IllegalArgumentException( - "Tri-state output must have the same amount of bits as the input. Input: " + in.width() + " Output: " + out.width()); - if (enable.width() != 1) - throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.width() + "."); - this.in = in; - in.registerObserver(this); - this.enable = enable; - enable.registerObserver(this); - this.out = out; - } - - @Override - protected TimelineEventHandler compute() - { - if (enable.getValue() == Bit.ONE) - { - BitVector inValues = in.getValues(); - return e -> out.feedSignals(inValues); - } - return e -> out.clearSignals(); - } - - @Override - public List getAllInputs() - { - return List.of(in, enable); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } - -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java deleted file mode 100644 index 6e6b0f15..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreUnidirectionalMerger extends CoreComponent implements LogicObserver -{ - private ReadWriteEnd out; - private ReadEnd[] inputs; - private int[] beginningIndex; - - /** - * - * @param union The output of merging n {@link CoreWire}s into one. Must have width = a1.width() + a2.width() + ... + an.width(). - * @param inputs The inputs to be merged into the union - */ - public CoreUnidirectionalMerger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs) - { - super(timeline); - this.inputs = inputs; - this.out = union; - this.beginningIndex = new int[inputs.length]; - - int width = 0; - for (int i = 0; i < inputs.length; i++) - { - beginningIndex[i] = width; - width += inputs[i].width(); - inputs[i].registerObserver(this); - } - - if (width != union.width()) - throw new IllegalArgumentException( - "The output of merging n WireArrays into one must have width = a1.width() + a2.width() + ... + an.width()."); - } - - public ReadEnd getInput(int index) - { - return inputs[index]; - } - - public ReadEnd getUnion() - { - return out; - } - - @Override - public void update(LogicObservable initiator) - { - int index = find(initiator); - int beginning = beginningIndex[index]; - out.feedSignals(beginning, inputs[index].getValues()); - } - - private int find(LogicObservable r) - { - for (int i = 0; i < inputs.length; i++) - if (inputs[i] == r) - return i; - return -1; - } - - public ReadEnd[] getInputs() - { - return inputs.clone(); - } - - @Override - public List getAllInputs() - { - return List.of(inputs); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java deleted file mode 100644 index d77e1541..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.mograsim.logic.core.components; - -import java.util.List; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreUnidirectionalSplitter extends CoreComponent implements LogicObserver -{ - private ReadEnd input; - private ReadWriteEnd[] outputs; - - public CoreUnidirectionalSplitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs) - { - super(timeline); - this.input = input; - this.outputs = outputs; - input.registerObserver(this); - int width = 0; - for (ReadEnd out : outputs) - width += out.width(); - - if (input.width() != width) - throw new IllegalArgumentException( - "The input of splitting one into n WireArrays must have width = a1.width() + a2.width() + ... + an.width()."); - } - - protected void compute() - { - BitVector inputBits = input.getValues(); - int startIndex = 0; - for (int i = 0; i < outputs.length; i++) - { - outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].width())); - startIndex += outputs[i].width(); - } - } - - @Override - public void update(LogicObservable initiator) - { - compute(); - } - - @Override - public List getAllInputs() - { - return List.of(input); - } - - @Override - public List getAllOutputs() - { - return List.of(outputs); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java deleted file mode 100644 index d71e08e1..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreAndGate extends MultiInputCoreGate -{ - public CoreAndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::and, out, in); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java deleted file mode 100644 index e847d0ec..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreNandGate extends MultiInputCoreGate -{ - public CoreNandGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::and, true, out, in); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java deleted file mode 100644 index 12336274..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreNorGate extends MultiInputCoreGate -{ - public CoreNorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::or, true, out, in); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java deleted file mode 100644 index b7808be9..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import java.util.List; - -import net.mograsim.logic.core.components.BasicCoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreNotGate extends BasicCoreComponent -{ - private ReadEnd in; - private ReadWriteEnd out; - - public CoreNotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out) - { - super(timeline, processTime); - this.in = in; - in.registerObserver(this); - this.out = out; - } - - @Override - protected TimelineEventHandler compute() - { - BitVector values = in.getValues().not(); - return e -> out.feedSignals(values); - } - - public ReadEnd getIn() - { - return in; - } - - public ReadEnd getOut() - { - return out; - } - - @Override - public List getAllInputs() - { - return List.of(in); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java deleted file mode 100644 index 97d75c80..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public class CoreOrGate extends MultiInputCoreGate -{ - public CoreOrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::or, out, in); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java deleted file mode 100644 index 8bc98934..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -/** - * Outputs 1 when the number of 1 inputs is odd. - * - * @author Fabian Stemmler - */ -public class CoreXorGate extends MultiInputCoreGate -{ - public CoreXorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime, BitVectorMutator::xor, out, in); - } - -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java deleted file mode 100644 index 010ae74f..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.mograsim.logic.core.components.gates; - -import java.util.List; - -import net.mograsim.logic.core.components.BasicCoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.logic.core.types.MutationOperation; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -public abstract class MultiInputCoreGate extends BasicCoreComponent -{ - protected ReadEnd[] in; - protected ReadWriteEnd out; - protected final int width; - protected MutationOperation op; - protected boolean invert = false; - - protected MultiInputCoreGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in) - { - super(timeline, processTime); - this.op = op; - width = out.width(); - this.in = in.clone(); - if (in.length < 1) - throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length)); - for (ReadEnd w : in) - { - if (w.width() != width) - throw new IllegalArgumentException("All wires connected to the gate must be of uniform length."); - w.registerObserver(this); - } - this.out = out; - } - - protected MultiInputCoreGate(Timeline timeline, int processTime, MutationOperation op, boolean invert, ReadWriteEnd out, ReadEnd... in) - { - this(timeline, processTime, op, out, in); - this.invert = invert; - } - - @Override - public List getAllInputs() - { - return List.of(in); - } - - @Override - public List getAllOutputs() - { - return List.of(out); - } - - @Override - public TimelineEventHandler compute() - { - BitVectorMutator mutator = BitVectorMutator.empty(); - for (ReadEnd w : in) - op.apply(mutator, w.getValues()); - return e -> out.feedSignals(invert ? mutator.toBitVector().not() : mutator.toBitVector()); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java deleted file mode 100644 index 9dbc31d4..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java +++ /dev/null @@ -1,256 +0,0 @@ -package net.mograsim.logic.core.timeline; - -import java.util.ArrayList; -import java.util.List; -import java.util.PriorityQueue; -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; -import java.util.function.LongSupplier; - -/** - * Orders Events by the time they are due to be executed. Can execute Events individually. - * - * @author Fabian Stemmler - * - */ -public class Timeline -{ - private PriorityQueue events; - private LongSupplier time; - private long lastTimeUpdated = 0; - private long eventCounter = 0; - - private final List> eventAddedListener; - - public final LongSupplier stepByStepExec = () -> lastTimeUpdated; - public final LongSupplier realTimeExec = () -> System.currentTimeMillis(); - - /** - * Constructs a Timeline object. Per default the time function is set to step by step execution. - * - * @param initCapacity The initial capacity of the event queue. - */ - public Timeline(int initCapacity) - { - events = new PriorityQueue<>(initCapacity); - eventAddedListener = new ArrayList<>(); - time = stepByStepExec; - } - - /** - * @param timestamp exclusive - * @return true if the first event in queue is later than the given timestamp - */ - public BooleanSupplier laterThan(long timestamp) - { - return () -> timeCmp(events.peek().getTiming(), timestamp) > 0; - } - - /** - * @return true if there is at least one event enqueued. false otherwise - */ - public boolean hasNext() - { - return !events.isEmpty(); - } - - /** - * Executes all events at the next timestamp, at which there are any - */ - public void executeNext() - { - InnerEvent first = events.peek(); - if (first != null) - executeUntil(laterThan(first.getTiming()), -1); - } - - /** - * Executes all events enqueued in the {@link Timeline}. Use very carefully! Events may generate new events, causing an infinite loop. - */ - public void executeAll() - { - while (hasNext()) - executeNext(); - } - - /** - * Executes all events until a given condition is met. The simulation process can be constrained by a real world timestamp. - * - * @param condition the condition until which the events are be processed - * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout. - * @return State of the event execution - * @formatter:off - * NOTHING_DONE if the {@link Timeline} was already empty - * EXEC_OUT_OF_TIME if the given maximum time was reached - * EXEC_UNTIL_CONDITION if the condition was met - * EXEC_UNTIL_EMPTY if events were executed until the {@link Timeline} was empty - * @formatter:on - */ - public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis) - { - if (events.isEmpty()) - { - lastTimeUpdated = getSimulationTime(); - return ExecutionResult.NOTHING_DONE; - } - int checkStop = 0; - while (hasNext() && !condition.getAsBoolean()) - { - InnerEvent event; - synchronized (events) - { - event = events.remove(); - } - lastTimeUpdated = event.getTiming(); - event.run(); - // Don't check after every run - checkStop = (checkStop + 1) % 10; - if (checkStop == 0 && System.currentTimeMillis() >= stopMillis) - return ExecutionResult.EXEC_OUT_OF_TIME; - } - lastTimeUpdated = getSimulationTime(); - return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION; - } - - /** - * Sets the function, which defines the current simulation time at any time. - * - * @param time The return value of calling this function is the current simulation time. - */ - public void setTimeFunction(LongSupplier time) - { - this.time = time; - } - - /** - * Calculates the current simulation time. - * - * @return The simulation time as defined by the time function. - */ - public long getSimulationTime() - { - return time.getAsLong(); - } - - /** - * Retrieves the timestamp of the next event. - * - * @return The timestamp of the next enqueued event, if the {@link Timeline} is not empty, -1 otherwise. - */ - public long nextEventTime() - { - if (!hasNext()) - return -1; - return events.peek().getTiming(); - } - - /** - * Clears the {@link Timeline} of enqueued events. - */ - public void reset() - { - synchronized (events) - { - events.clear(); - } - lastTimeUpdated = 0; - } - - /** - * Adds a listener, that is called when a {@link TimelineEvent} is added. - */ - public void addEventAddedListener(Consumer listener) - { - eventAddedListener.add(listener); - } - - /** - * Removes the listener, if possible. It will no longer be called when a {@link TimelineEvent} is added. - */ - public void removeEventAddedListener(Consumer listener) - { - eventAddedListener.remove(listener); - } - - /** - * Adds an Event to the {@link Timeline} - * - * @param function The {@link TimelineEventHandler} that will be executed, when the {@link InnerEvent} occurs on the timeline. - * @param relativeTiming The amount of MI ticks in which the {@link InnerEvent} is called, starting from the current time. - */ - public void addEvent(TimelineEventHandler function, int relativeTiming) - { - long timing = getSimulationTime() + relativeTiming; - TimelineEvent event = new TimelineEvent(timing); - synchronized (events) - { - events.add(new InnerEvent(function, event, eventCounter++)); - } - eventAddedListener.forEach(l -> l.accept(event)); - } - - private class InnerEvent implements Runnable, Comparable - { - private final TimelineEventHandler function; - private final TimelineEvent event; - private final long id; - - /** - * Creates an {@link InnerEvent} - * - * @param function {@link TimelineEventHandler} to be executed when the {@link InnerEvent} occurs - * @param timing Point in the MI simulation {@link Timeline}, at which the {@link InnerEvent} is executed; - */ - InnerEvent(TimelineEventHandler function, TimelineEvent event, long id) - { - this.function = function; - this.event = event; - this.id = id; - } - - public long getTiming() - { - return event.getTiming(); - } - - @Override - public void run() - { - function.handle(event); - } - - @Override - public String toString() - { - return event.toString(); - } - - @Override - public int compareTo(InnerEvent o) - { - int c1; - return (c1 = timeCmp(getTiming(), o.getTiming())) == 0 ? timeCmp(id, o.id) : c1; - } - } - - public static int timeCmp(long a, long b) - { - return Long.signum(a - b); - } - - @Override - public String toString() - { - String eventsString; - synchronized (events) - { - eventsString = events.toString(); - } - return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, eventsString); - } - - public enum ExecutionResult - { - NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME - } -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java deleted file mode 100644 index c46e6ad6..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.mograsim.logic.core.timeline; - -/** - * A class that stores all relevant information about an event in the {@link Timeline}. Currently, there is not much relevant information to - * store. - * - * @author Fabian Stemmler - * - */ -public class TimelineEvent -{ - private final long timing; - - TimelineEvent(long timing) - { - super(); - this.timing = timing; - } - - public long getTiming() - { - return timing; - } - - @Override - public String toString() - { - return "timestamp: " + timing; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java deleted file mode 100644 index badbabcb..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.mograsim.logic.core.timeline; - -@FunctionalInterface -public interface TimelineEventHandler -{ - public void handle(TimelineEvent e); -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java deleted file mode 100644 index 752fbb80..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java +++ /dev/null @@ -1,181 +0,0 @@ -package net.mograsim.logic.core.types; - -import java.util.Arrays; -import java.util.Map; -import java.util.Objects; - -/** - * stdlogic according to IEEE 1164 - */ -public enum Bit implements StrictLogicType -{ - U("U"), X("X"), ZERO("0"), ONE("1"), Z("Z"); - - private final String symbol; - - private Bit(String symbol) - { - this.symbol = symbol; - } - - /** - * Returns if the Bit is binary, this is only true for ZERO and ONE. - * - * @return true if and only if this == ONE || this == ZERO - */ - public boolean isBinary() - { - return this == ONE || this == ZERO; - } - - @Override - public Bit and(Bit other) - { - return fromTable(AND_TABLE, this, other); - } - - public static void and(Bit[] dst, Bit[] src) - { - for (int i = 0; i < dst.length; i++) - dst[i] = dst[i].and(src[i]); - } - - @Override - public Bit or(Bit other) - { - return fromTable(OR_TABLE, this, other); - } - - public static void or(Bit[] dst, Bit[] src) - { - for (int i = 0; i < dst.length; i++) - dst[i] = dst[i].or(src[i]); - } - - @Override - public Bit xor(Bit other) - { - return fromTable(XOR_TABLE, this, other); - } - - public static void xor(Bit[] dst, Bit[] src) - { - for (int i = 0; i < dst.length; i++) - dst[i] = dst[i].xor(src[i]); - } - - @Override - public Bit not() - { - switch (this) - { - case U: - return U; - case ONE: - return ZERO; - case ZERO: - return ONE; - default: - return X; - } - } - - public Bit[] makeArray(int length) - { - Bit[] bits = new Bit[length]; - Arrays.fill(bits, this); - return bits; - } - - public BitVector toVector() - { - return BitVector.of(this, 1); - } - - public BitVector toVector(int length) - { - return BitVector.of(this, length); - } - - @Override - public Bit join(Bit other) - { - return fromTable(JOIN_TABLE, this, other); - } - - public static void join(Bit[] dst, Bit[] src) - { - for (int i = 0; i < dst.length; i++) - dst[i] = dst[i].join(src[i]); - } - - @Override - public String toString() - { - return getSymbol(); - } - - public String getSymbol() - { - return symbol; - } - - public static Bit lastBitOf(int value) - { - return values()[2 + (value & 1)]; - } - - public static Bit of(boolean binaryValue) - { - return binaryValue ? ONE : ZERO; - } - - public static Bit parse(String s) - { - Bit bit = SYMBOL_MAP.get(s); - Objects.requireNonNull(bit, "No Bit found for symbol " + s); - return bit; - } - - public static Bit parse(String s, int symbolPosition) - { - return parse(s.substring(symbolPosition, symbolPosition + 1)); - } - - private static Bit fromTable(Bit[][] table, Bit a, Bit b) - { - return table[a.ordinal()][b.ordinal()]; - } - - static final Map SYMBOL_MAP = Map.of(U.symbol, U, X.symbol, X, ZERO.symbol, ZERO, ONE.symbol, ONE, Z.symbol, Z); - - // @formatter:off - private static final Bit[][] JOIN_TABLE = - { { U, U, U, U, U }, - { U, X, X, X, X }, - { U, X, ZERO, X, ZERO }, - { U, X, X, ONE, ONE }, - { U, X, ZERO, ONE, Z } }; - - private static final Bit[][] AND_TABLE = - { { U, U, ZERO, U, U }, - { U, X, ZERO, X, X }, - { ZERO, ZERO, ZERO, ZERO, ZERO }, - { U, X, ZERO, ONE, X }, - { U, X, ZERO, X, X } }; - - private static final Bit[][] OR_TABLE = - { { U, U, U, ONE, U }, - { U, X, X, ONE, X }, - { U, X, ZERO, ONE, X }, - { ONE, ONE, ONE, ONE, ONE }, - { U, X, X, ONE, X } }; - - private static final Bit[][] XOR_TABLE = - { { U, U, U, U, U }, - { U, X, X, X, X }, - { U, X, ZERO, ONE, X }, - { U, X, ONE, ZERO, X }, - { U, X, X, X, X } }; - // @formatter:on -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java deleted file mode 100644 index 13466949..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java +++ /dev/null @@ -1,530 +0,0 @@ -package net.mograsim.logic.core.types; - -import static java.lang.String.format; - -import java.math.BigInteger; -import java.util.Arrays; -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.RandomAccess; -import java.util.function.BinaryOperator; -import java.util.function.UnaryOperator; - -/** - * Immutable class representing a {@link Bit}Vector - * - * @author Christian Femers - * - */ -public final class BitVector implements StrictLogicType, Iterable, RandomAccess -{ - public static final BitVector SINGLE_U = new BitVector(Bit.U); - public static final BitVector SINGLE_X = new BitVector(Bit.X); - public static final BitVector SINGLE_0 = new BitVector(Bit.ZERO); - public static final BitVector SINGLE_1 = new BitVector(Bit.ONE); - public static final BitVector SINGLE_Z = new BitVector(Bit.Z); - - private static final BitVector[] SINGLE_BIT_MAPPING = { SINGLE_U, SINGLE_X, SINGLE_0, SINGLE_1, SINGLE_Z }; - - private final Bit[] bits; - - private BitVector(Bit single) - { - Objects.requireNonNull(single); - bits = new Bit[] { single }; - } - - private BitVector(Bit[] bits) - { - this.bits = Objects.requireNonNull(bits); // do this first to "catch" bits==null before the foreach loop - for (Bit bit : bits) - if (bit == null) - throw new NullPointerException(); - } - - public static BitVector of(Bit... bits) - { - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].ordinal()]; - return new BitVector(bits.clone()); - } - - public static BitVector of(Bit bit, int length) - { - if (length == 1) - return SINGLE_BIT_MAPPING[bit.ordinal()]; - return new BitVector(bit.makeArray(length)); - } - - public static BitVector from(long value, int bits) - { - return from(BigInteger.valueOf(value), bits); - } - - public static BitVector from(BigInteger value, int bits) - { - Bit[] values = new Bit[bits]; - for (int i = 0; i < bits; i++) - values[bits - i - 1] = Bit.of(value.testBit(i)); - return new BitVector(values); - } - - public BitVectorMutator mutator() - { - return BitVectorMutator.of(this); - } - - /** - * Returns the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) - */ - public Bit getMSBit(int bitIndex) - { - return bits[bitIndex]; - } - - /** - * Returns the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) - */ - public Bit getLSBit(int bitIndex) - { - return bits[bits.length - bitIndex - 1]; - } - - public Bit[] getBits() - { - return bits.clone(); - } - - /** - * Checks if all bits are {@link Bit#isBinary() binary}. - * - * @see Bit#isBinary() - */ - public boolean isBinary() - { - for (int i = 0; i < bits.length; i++) - { - if (!bits[i].isBinary()) - return false; - } - return true; - } - - @Override - public BitVector join(BitVector t) - { - checkCompatibility(t); - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].join(t.bits[0]).ordinal()]; - return new BitVector(binOp(bits.clone(), t.bits, Bit::join)); - } - - @Override - public BitVector and(BitVector t) - { - checkCompatibility(t); - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].and(t.bits[0]).ordinal()]; - return new BitVector(binOp(bits.clone(), t.bits, Bit::and)); - } - - @Override - public BitVector or(BitVector t) - { - checkCompatibility(t); - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].or(t.bits[0]).ordinal()]; - return new BitVector(binOp(bits.clone(), t.bits, Bit::or)); - } - - @Override - public BitVector xor(BitVector t) - { - checkCompatibility(t); - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].xor(t.bits[0]).ordinal()]; - return new BitVector(binOp(bits.clone(), t.bits, Bit::xor)); - } - - @Override - public BitVector not() - { - if (bits.length == 1) - return SINGLE_BIT_MAPPING[bits[0].not().ordinal()]; - return new BitVector(unOp(bits.clone(), Bit::not)); - } - - public int length() - { - return bits.length; - } - - public BitVector concat(BitVector other) - { - Bit[] newBits = Arrays.copyOf(bits, length() + other.length()); - System.arraycopy(other.bits, 0, newBits, length(), other.length()); - return new BitVector(newBits); - } - - public BitVector subVector(int start) - { - return new BitVector(Arrays.copyOfRange(bits, start, length())); - } - - public BitVector subVector(int start, int end) - { - return new BitVector(Arrays.copyOfRange(bits, start, end)); - } - - private void checkCompatibility(BitVector bv) - { - if (length() != bv.length()) - throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", length(), bv.length())); - } - - static Bit[] binOp(Bit[] dest, Bit[] second, BinaryOperator op) - { - if (dest == null) - return second.clone(); - for (int i = 0; i < dest.length; i++) - { - dest[i] = op.apply(dest[i], second[i]); - } - return dest; - } - - static Bit[] unOp(Bit[] dest, UnaryOperator op) - { - if (dest == null) - return null; - for (int i = 0; i < dest.length; i++) - { - dest[i] = op.apply(dest[i]); - } - return dest; - } - - /** - * Class for comfortable and efficient manipulation of {@link BitVector}s, similar to {@link StringBuilder} - * - * @author Christian Femers - */ - public static final class BitVectorMutator implements LogicType - { - private Bit[] bits; - - private BitVectorMutator(Bit[] bits) - { - this.bits = bits; - } - - static BitVectorMutator of(BitVector bv) - { - return new BitVectorMutator(bv.getBits()); - } - - /** - * Returns a new mutator of the specified length, with all bits set to null. Use with care! - */ - public static BitVectorMutator ofLength(int length) - { - return new BitVectorMutator(new Bit[length]); - } - - /** - * Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed. - *

- * An empty BitVectorMutator must not be converted to BitVector or used to manipulate single bits until at least one two - * operand logic operation is performed. - */ - public static BitVectorMutator empty() - { - return new BitVectorMutator(null); - } - - /** - * @see #empty() - */ - public boolean isEmpty() - { - return bits == null; - } - - /** - * Produces the resulting, immutable {@link BitVector}
- * - * @throws IllegalStateException if the mutator is (still) empty - */ - public BitVector toBitVector() - { - if (bits == null) - throw new IllegalStateException("cannot create a BitVector from an empty mutator"); - return new BitVector(bits); - } - - @Override - public BitVectorMutator join(BitVector t) - { - checkCompatibility(t); - bits = binOp(bits, t.bits, Bit::join); - return this; - } - - @Override - public BitVectorMutator and(BitVector t) - { - checkCompatibility(t); - bits = binOp(bits, t.bits, Bit::and); - return this; - } - - @Override - public BitVectorMutator or(BitVector t) - { - checkCompatibility(t); - bits = binOp(bits, t.bits, Bit::or); - return this; - } - - @Override - public BitVectorMutator xor(BitVector t) - { - checkCompatibility(t); - bits = binOp(bits, t.bits, Bit::xor); - return this; - } - - @Override - public BitVectorMutator not() - { - unOp(bits, Bit::not); - return this; - } - - /** - * Set the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) - */ - public void setMSBit(int bitIndex, Bit bit) - { - if (bits == null) - throw new IllegalStateException("cannot set a bit of an empty mutator"); - bits[bitIndex] = bit; - } - - /** - * Set the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) - */ - public void setLSBit(int bitIndex, Bit bit) - { - if (bits == null) - throw new IllegalStateException("cannot set a bit of an empty mutator"); - bits[bits.length - bitIndex - 1] = bit; - } - - /** - * Returns the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) - */ - public Bit getMSBit(int bitIndex) - { - if (bits == null) - throw new IllegalStateException("cannot get a bit of an empty mutator"); - return bits[bitIndex]; - } - - /** - * Returns the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) - */ - public Bit getLSBit(int bitIndex) - { - if (bits == null) - throw new IllegalStateException("cannot get a bit of an empty mutator"); - return bits[bits.length - bitIndex - 1]; - } - - public int length() - { - if (bits == null) - throw new IllegalStateException("cannot obtain a length of an empty mutator"); - return bits.length; - } - - private void checkCompatibility(BitVector bv) - { - if (bits != null && bits.length != bv.length()) - throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", bits.length, bv.length())); - } - } - - /** - * @see Arrays#hashCode(Object[]) - */ - @Override - public int hashCode() - { - return Arrays.hashCode(bits); - } - - /** - * Does test for equality of values/content - * - * @see Object#equals(Object) - */ - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof BitVector)) - return false; - BitVector other = (BitVector) obj; - return Arrays.equals(bits, other.bits); - } - - /** - * Does test for equality of values/content, shifting the other BitVector by offset to the right.
- * Therefore offset + other.length() <= this.wdith() needs to be true. - * - * @throws ArrayIndexOutOfBoundsException if offset + other.length() > this.length() - * - * @see Object#equals(Object) - */ - public boolean equalsWithOffset(BitVector other, int offset) - { - if (other == null) - return false; - return Arrays.equals(bits, offset, offset + other.length(), other.bits, 0, other.length()); - } - - /** - * All {@link Bit}s symbols concatenated together (MSB first) - * - * @see #parse(String) - */ - @Override - public String toString() - { - StringBuilder sb = new StringBuilder(bits.length); - for (Bit bit : bits) - sb.append(bit); - return sb.toString(); - } - - /** - * Returns the value of the BitVector as BigInteger. - * - * @throws NumberFormatException if the BitVector is not {@link #isBinary() binary}. - */ - public BigInteger getUnsignedValue() - { - if (!isBinary()) - throw new NumberFormatException(this + " is not binary"); - byte[] bytes = new byte[(bits.length / 8 + (bits.length % 8 == 0 ? 0 : 1)) + 1]; - for (int i = bits.length - 1; i >= 0; i--) - { - if (Bit.ONE == bits[bits.length - i - 1]) - { - try - { - bytes[bytes.length - (i / 8) - 1] |= 1 << (i % 8); - } - catch (IndexOutOfBoundsException e) - { - e.printStackTrace(); - } - } - } - return new BigInteger(bytes); - } - - public long getUnsignedValueLong() - { - return getUnsignedValue().longValue(); - } - - /** - * Returns the value of the BitVector as BigInteger interpreted as a two's complement number. - * - * @throws NumberFormatException if the BitVector is not {@link #isBinary() binary}. - * - * @author Daniel Kirschten - */ - public BigInteger getSignedValue() - { - BigInteger unsignedValue = getUnsignedValue(); - if (bits[bits.length - 1] == Bit.ZERO) - return unsignedValue; - return unsignedValue.subtract(BitVector.of(Bit.ONE, bits.length).getUnsignedValue()).subtract(BigInteger.ONE);// TODO speed this up! - } - - public long getSignedValueLong() - { - return getSignedValue().longValue(); - } - - /** - * Parses a String containing solely {@link Bit} symbols (MSB first) - * - * @see #toString() - */ - public static BitVector parse(String s) - { - Bit[] values = new Bit[s.length()]; - for (int i = 0; i < s.length(); i++) - { - values[i] = Bit.parse(s, i); - } - return new BitVector(values); - } - - /** - * Changes a single Bit using the given operation. This can be used to set, clear or flip bits. - * - * @param msbIndex index of the MSB to be changed - * @param singleBitOperation the operation to perform on that Bit - * @return the resulting, new BitVektor - */ - public BitVector withBitChanged(int msbIndex, UnaryOperator singleBitOperation) - { - Bit[] newBits = bits.clone(); - newBits[msbIndex] = singleBitOperation.apply(newBits[msbIndex]); - return new BitVector(newBits); - } - - /** - * Iterate over the {@link Bit}s of the BitVector from MSB to LSB (left to right). - */ - @Override - public Iterator iterator() - { - return new Iterator<>() - { - private int pos = 0; - - @Override - public Bit next() - { - if (!hasNext()) - throw new NoSuchElementException(); - return getMSBit(pos++); - } - - @Override - public boolean hasNext() - { - return pos != length(); - } - }; - } - - public BitVector reverse() - { - int length = length(); - Bit[] other = new Bit[length]; - for (int i = 0, j = length - 1; i < length; i++, j--) - { - other[i] = bits[j]; - } - return new BitVector(other); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java deleted file mode 100644 index 5f645a2e..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.mograsim.logic.core.types; - -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorDefinition.BuiltInColor; -import net.mograsim.preferences.Preferences; - -public class BitVectorFormatter -{ - public static String formatValueAsString(ReadEnd end) - { - return formatAsString(end == null ? null : end.getValues()); - } - - public static String formatAsString(BitVector bitVector) - { - if (bitVector == null) - return "null"; - return bitVector.toString(); - } - - // TODO doesn't this belong to logic.model? - public static ColorDefinition formatAsColor(ReadEnd end) - { - return formatAsColor(end == null ? null : end.getValues()); - } - - public static ColorDefinition formatAsColor(BitVector bitVector) - { - // TODO maybe find a color assignment for multiple-bit bit vectors? - if (bitVector == null || bitVector.length() != 1) - return new ColorDefinition(BuiltInColor.COLOR_BLACK); - switch (bitVector.getLSBit(0)) - { - case ONE: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.one"); - case U: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.u"); - case X: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.x"); - case Z: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.z"); - case ZERO: - return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.zero"); - default: - throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getLSBit(0)); - } - } - - private BitVectorFormatter() - { - throw new UnsupportedOperationException("No BitVectorFormatter instances"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java deleted file mode 100644 index 39ae6816..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.mograsim.logic.core.types; - -/** - * Interface for types that support the basic logic operations - * - * @author Christian Femers - * - * @param the logic type itself, to make the operations closed in T - * @param the operand type, may be the same as T, see {@link StrictLogicType} - */ -public interface LogicType, S> -{ - /** - * Determines the result when two signals meet each other directly, also called resolution (IEEE 1164) - * - * For example: - * - *

-	 * 0 joined 0 == 0
-	 * 1 joined 0 == X
-	 * 0 joined 1 == X
-	 * 1 joined 1 == 1
-	 * 
- * - * @param t the second logic signal - * @return the resulting value - * @author Christian Femers - */ - T join(S t); - - /** - * Classical logic AND - * - * For example: - * - *
-	 * 0 AND 0 == 0
-	 * 1 AND 0 == 0
-	 * 0 AND 1 == 0
-	 * 1 AND 1 == 1
-	 * 
- * - * @param t the second logic signal - * @return the resulting value - * @author Christian Femers - */ - T and(S t); - - /** - * Classical logic OR - * - * For example: - * - *
-	 * 0 OR 0 == 0
-	 * 1 OR 0 == 1
-	 * 0 OR 1 == 1
-	 * 1 OR 1 == 1
-	 * 
- * - * @param t the second logic signal - * @return the resulting value - * @author Christian Femers - */ - T or(S t); - - /** - * Classical logic XOR (exclusive OR) - * - * For example: - * - *
-	 * 0 XOR 0 == 0
-	 * 1 XOR 0 == 1
-	 * 0 XOR 1 == 1
-	 * 1 XOR 1 == 0
-	 * 
- * - * @param t the second logic signal - * @return the resulting value - * @author Christian Femers - */ - T xor(S t); - - /** - * Classical logic NOT (logical negation) - * - * For example: - * - *
-	 * NOT 0 == 1
-	 * NOT 1 == 0
-	 * 
- * - * @return the resulting value - * @author Christian Femers - */ - T not(); - - /** - * {@link #and(Object) AND} and then {@link #not() NOT} - * - * @author Christian Femers - */ - default T nand(S t) - { - return and(t).not(); - } - - /** - * {@link #or(Object) OR} and then {@link #not() NOT} - * - * @author Christian Femers - */ - default T nor(S t) - { - return or(t).not(); - } - - /** - * {@link #xor(Object) XOR} and then {@link #not() NOT}
- * Used to determine equality (alias parity, consistency) - * - * @author Christian Femers - */ - default T xnor(S t) - { - return xor(t).not(); - } -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java deleted file mode 100644 index 1fdae21c..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.mograsim.logic.core.types; - -import java.util.function.BiFunction; - -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; - -@FunctionalInterface -public interface MutationOperation extends BiFunction -{ - // no changes necessary, only for convenience and readability -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java deleted file mode 100644 index c830b586..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.logic.core.types; - -/** - * Interface for types that support the basic logic operations only among themselves, making it mathematically closed - * - * @author Christian Femers - * @see LogicType - * - * @param the logic type itself to make the operations closed - */ -public interface StrictLogicType> extends LogicType -{ - // this is just a matter of type parameters -} diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java deleted file mode 100644 index 13f54a01..00000000 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java +++ /dev/null @@ -1,662 +0,0 @@ -package net.mograsim.logic.core.wires; - -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.Z; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import net.mograsim.logic.core.LogicObservable; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; - -/** - * Represents an array of wires that can store n bits of information. - * - * @author Fabian Stemmler - * - */ -public class CoreWire -{ - public final String name; - private BitVector cachedValues; - public final int travelTime; - private List attached = new ArrayList<>(); - public final int width; - List inputs = new ArrayList<>(); - Timeline timeline; - private Bit[] bitsWithoutFusions; - FusedBit[] fusedBits; - - public CoreWire(Timeline timeline, int width, int travelTime) - { - this(timeline, width, travelTime, null); - } - - public CoreWire(Timeline timeline, int width, int travelTime, String name) - { - if (width < 1) - throw new IllegalArgumentException( - String.format("Tried to create an array of wires with width %d, but a width of less than 1 makes no sense.", width)); - this.name = name; - this.timeline = timeline; - this.width = width; - this.travelTime = travelTime; - initValues(); - } - - private void initValues() - { - cachedValues = U.toVector(width); - bitsWithoutFusions = cachedValues.getBits(); - } - - private void setNewValues(BitVector newValues) - { - cachedValues = newValues; - notifyObservers(); - } - - private void invalidateCachedValuesForAllFusedWires() - { - invalidateCachedValues(); - if (fusedBits != null) - for (FusedBit fusion : fusedBits) - if (fusion != null) - fusion.invalidateCachedValuesForAllParticipatingWires(); - } - - private void invalidateCachedValues() - { - cachedValues = null; - notifyObservers(); - } - - void recalculateValuesWithoutFusions() - { - Bit[] bits = new Bit[width]; - if (inputs.isEmpty()) - Arrays.fill(bits, U); - else - { - System.arraycopy(inputs.get(0).getInputValues().getBits(), 0, bits, 0, width); - for (int i = 1; i < inputs.size(); i++) - Bit.join(bits, inputs.get(i).getInputValues().getBits()); - } - bitsWithoutFusions = bits; - if (fusedBits == null) - setNewValues(BitVector.of(bits)); - else - invalidateCachedValuesForAllFusedWires(); - } - - private void recalculatedCachedValues() - { - Bit[] bits; - if (fusedBits == null) - bits = bitsWithoutFusions; - else - { - bits = new Bit[width]; - for (int i = 0; i < width; i++) - { - FusedBit fusion = fusedBits[i]; - if (fusion == null) - bits[i] = bitsWithoutFusions[i]; - else - bits[i] = fusion.getValue(); - } - } - cachedValues = BitVector.of(bits); - } - - /** - * Forces a Wire to take on specific values. If the new values differ from the old ones, the observers of the Wire will be notified. - * WARNING! Use this with care! The preferred way of writing the values is ReadWriteEnd.feedSignals(BitVector) - * - * @param values The values the Wire will have immediately after this method is called - */ - public void forceValues(BitVector values) - { - bitsWithoutFusions = values.getBits(); - invalidateCachedValuesForAllFusedWires(); - notifyObservers(); - } - - /** - * Returns the least significant bit (LSB) - */ - public Bit getValue() - { - return getValue(0); - } - - /** - * Returns the least significant bit (LSB) of the given index - */ - public Bit getValue(int index) - { - return getValues().getLSBit(index); - } - - public BitVector getValues(int start, int end) - { - return getValues().subVector(start, end); - } - - public BitVector getValues() - { - if (cachedValues == null) - recalculatedCachedValues(); - return cachedValues; - } - - /** - * Adds an {@link LogicObserver}, who will be notified when the value of the {@link CoreWire} is updated. - * - * @param ob The {@link LogicObserver} to be notified of changes. - * @return true if the given {@link LogicObserver} was not already registered, false otherwise - * - * @author Fabian Stemmler - */ - boolean attachEnd(ReadEnd end) - { - return attached.add(end); - } - - void detachEnd(ReadEnd end) - { - attached.remove(end); - } - - private void notifyObservers() - { - attached.forEach(ReadEnd::update); - } - - /** - * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link CoreWire}. This {@link ReadWriteEnd} can be written - * to. - */ - public ReadWriteEnd createReadWriteEnd() - { - return new ReadWriteEnd(); - } - - /** - * Create a {@link ReadEnd} object, which is tied to this {@link CoreWire}. This {@link ReadEnd} cannot be written to. - */ - public ReadEnd createReadOnlyEnd() - { - return new ReadEnd(); - } - - void registerInput(ReadWriteEnd toRegister) - { - inputs.add(toRegister); - recalculateValuesWithoutFusions(); - } - - /** - * A {@link ReadEnd} feeds a constant signal into the {@link CoreWire} it is tied to. The combination of all inputs determines the - * {@link CoreWire}s final value. X dominates all other inputs Z does not affect the final value, unless there are no other inputs than - * Z 0 and 1 turn into X when they are mixed - * - * @author Fabian Stemmler - */ - public class ReadEnd implements LogicObservable - { - private List observers = new ArrayList<>(); - - ReadEnd() - { - super(); - CoreWire.this.attachEnd(this); - } - - public void update() - { - notifyObservers(); - } - - /** - * Included for convenient use on {@link CoreWire}s of width 1. - * - * @return The value of bit 0. - * - * @author Fabian Stemmler - */ - public Bit getValue() - { - return CoreWire.this.getValue(); - } - - /** - * @param index Index of the requested bit. - * @return The value of the indexed bit. - * - * @author Fabian Stemmler - */ - public Bit getValue(int index) - { - return CoreWire.this.getValue(index); - } - - public BitVector getValues() - { - return CoreWire.this.getValues(); - } - - /** - * @param start Start of the wanted segment. (inclusive) - * @param end End of the wanted segment. (exclusive) - * @return The values of the segment of {@link Bit}s indexed. - * - * @author Fabian Stemmler - */ - public BitVector getValues(int start, int end) - { - return CoreWire.this.getValues(start, end); - } - - @Override - public String toString() - { - return CoreWire.this.toString(); - } - - public void close() - { - inputs.remove(this); - detachEnd(this); - recalculateValuesWithoutFusions(); - } - - public int width() - { - return width; - } - - public CoreWire getWire() - { - return CoreWire.this; - } - - @Override - public void registerObserver(LogicObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(LogicObserver ob) - { - observers.remove(ob); - } - -// void registerCloseObserver(LogicObserver ob) -// { -// closeObserver.add(ob); -// } -// -// void deregisterCloseObserver(LogicObserver ob) -// { -// closeObserver.remove(ob); -// } - - @Override - public void notifyObservers() - { - observers.forEach(ob -> ob.update(this)); - } - } - - public class ReadWriteEnd extends ReadEnd - { - private boolean open; - private boolean isWriting; - private BitVector inputValues; - - ReadWriteEnd() - { - super(); - open = true; - isWriting = true; - initValues(); - registerInput(this); - } - - private void initValues() - { - inputValues = U.toVector(width); - } - - /** - * Sets the wires values. This takes up time, as specified by the {@link CoreWire}s travel time. - * - * @param newValues The new values the wires should take on. - * - * @author Fabian Stemmler - */ - public void feedSignals(Bit... newValues) - { - feedSignals(BitVector.of(newValues)); - } - - // TODO what if this is called multiple times at the same simulation time? (happens in component unit tests) - public void feedSignals(BitVector newValues) - { - if (newValues.length() != width) - throw new IllegalArgumentException( - String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), width)); - if (!open) - throw new IllegalStateException("Attempted to write to closed WireArrayEnd."); - timeline.addEvent(e -> setValues(newValues), travelTime); - } - - /** - * Sets values of a subarray of wires. This takes up time, as specified by the {@link CoreWire}s travel time. - * - * @param bitVector The new values the wires should take on. - * @param startingBit The first index of the subarray of wires. - * - * @author Fabian Stemmler - */ - public void feedSignals(int startingBit, BitVector bitVector) - { - if (!open) - throw new IllegalStateException("Attempted to write to closed WireArrayEnd."); - timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime); - } - - /** - * Sets the values that are being fed into the {@link CoreWire}. The preferred way of setting {@link ReadWriteEnd} values is via - * feedValues(...) with a delay. - */ - void setValues(int startingBit, BitVector newValues) - { - // index check covered in equals - if (!inputValues.equalsWithOffset(newValues, startingBit)) - { - Bit[] vals = inputValues.getBits(); - System.arraycopy(newValues.getBits(), 0, vals, startingBit, newValues.length()); - inputValues = BitVector.of(vals); - CoreWire.this.recalculateValuesWithoutFusions(); - } - } - - /** - * Sets the values that are being fed into the {@link CoreWire}. The preferred way of setting {@link ReadWriteEnd} values is via - * feedValues(...) with a delay. - */ - void setValues(BitVector newValues) - { - if (inputValues.equals(newValues)) - return; - inputValues = newValues; - CoreWire.this.recalculateValuesWithoutFusions(); - } - - /** - * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link CoreWire}.Returns the least - * significant bit (LSB) - */ - public Bit getInputValue() - { - return getInputValue(0); - } - - /** - * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link CoreWire} at the indexed {@link Bit}. - * Returns the least significant bit (LSB) - * - */ - public Bit getInputValue(int index) - { - return inputValues.getLSBit(index); - } - - /** - * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link CoreWire}. - */ - public BitVector getInputValues() - { - return inputValues; - } - - public BitVector getInputValues(int start, int end) - { - return inputValues.subVector(start, end); - } - - /** - * {@link ReadEnd} now feeds Z into the associated {@link CoreWire}. - */ - public void clearSignals() - { - feedSignals(Z.toVector(width)); - } - - public BitVector wireValuesExcludingMe() - { - BitVectorMutator mutator = BitVectorMutator.empty(); - boolean modified = false; - for (ReadWriteEnd wireEnd : inputs) - { - if (wireEnd == this) - continue; - modified = true; - mutator.join(wireEnd.inputValues); - } - if (!modified) - mutator.join(BitVector.of(Bit.Z, width)); - return mutator.toBitVector(); - } - - @Override - public String toString() - { - return inputValues.toString(); - } - - @Override - public void close() - { - super.close(); - open = false; - } - - void setWriting(boolean isWriting) - { - if (this.isWriting != isWriting) - { - this.isWriting = isWriting; - if (isWriting) - inputs.add(this); - else - inputs.remove(this); - CoreWire.this.recalculateValuesWithoutFusions(); - } - } - - boolean isWriting() - { - return isWriting; - } - } - - @Override - public String toString() - { - String name = this.name == null ? String.format("0x%08x", hashCode()) : this.name; - return String.format("wire %s value: %s inputs: %s", name, getValues(), inputs); - } - - public static ReadEnd[] extractEnds(CoreWire[] w) - { - ReadEnd[] inputs = new ReadEnd[w.length]; - for (int i = 0; i < w.length; i++) - inputs[i] = w[i].createReadWriteEnd(); - return inputs; - } - - /** - * - * Fuses two wires together. If the bits change in one Wire, the other is changed accordingly immediately. Warning: The bits are - * permanently fused together. - * - * @param a The {@link CoreWire} to be fused with b - * @param b The {@link CoreWire} to be fused with a - */ - public static void fuse(CoreWire a, CoreWire b) - { - fuse(a, b, 0, 0, a.width); - } - - /** - * Fuses the selected bits of two wires together. If the bits change in one Wire, the other is changed accordingly immediately. Warning: - * The bits are permanently fused together. - * - * @param a The {@link CoreWire} to be (partially) fused with b - * @param b The {@link CoreWire} to be (partially) fused with a - * @param fromA The first bit of {@link CoreWire} a to be fused - * @param fromB The first bit of {@link CoreWire} b to be fused - * @param width The amount of bits to fuse - */ - public static void fuse(CoreWire a, CoreWire b, int fromA, int fromB, int width) - { - // iterate in this direction to be fail-fast (rely on the checks in fuse(Wire, Wire, int, int) - for (int i = width - 1; i >= 0; i--) - fuse(a, b, fromA + i, fromB + i); - } - - /** - * Fuses one bit of two wires together. If this bit changes in one Wire, the other is changed accordingly immediately. Warning: The bits - * are permanently fused together. - * - * @param a The {@link CoreWire} to be (partially) fused with b - * @param b The {@link CoreWire} to be (partially) fused with a - * @param bitA The bit of {@link CoreWire} a to be fused - * @param bitB The bit of {@link CoreWire} b to be fused - */ - public static void fuse(CoreWire a, CoreWire b, int bitA, int bitB) - { - if (bitA >= a.width) - throw new IllegalArgumentException("No bit " + bitA + " in " + a + " (width " + a.width + ")"); - if (bitB >= b.width) - throw new IllegalArgumentException("No bit " + bitB + " in " + b + " (width " + b.width + ")"); - if (a.fusedBits == null) - a.fusedBits = new FusedBit[a.width]; - if (b.fusedBits == null) - b.fusedBits = new FusedBit[b.width]; - FusedBit oldFusionA = a.fusedBits[bitA]; - FusedBit oldFusionB = b.fusedBits[bitB]; - if (oldFusionA == null) - if (oldFusionB == null) - { - FusedBit fusion = new FusedBit(); - fusion.addParticipatingWireBit(a, bitA); - fusion.addParticipatingWireBit(b, bitB); - } else - oldFusionB.addParticipatingWireBit(a, bitA); - else if (oldFusionB == null) - oldFusionA.addParticipatingWireBit(b, bitB); - else - oldFusionA.mergeOtherIntoThis(oldFusionB); - } - - private static class FusedBit - { - private final Set participatingWireBits; - - public FusedBit() - { - this.participatingWireBits = new HashSet<>(); - } - - public void addParticipatingWireBit(CoreWire w, int bit) - { - addParticipatingWireBit(new WireBit(w, bit)); - } - - private void addParticipatingWireBit(WireBit wb) - { - wb.wire.fusedBits[wb.bit] = this; - participatingWireBits.add(wb); - wb.wire.invalidateCachedValuesForAllFusedWires(); - } - - public void mergeOtherIntoThis(FusedBit other) - { - for (WireBit wb : other.participatingWireBits) - addParticipatingWireBit(wb); - } - - public void invalidateCachedValuesForAllParticipatingWires() - { - for (WireBit wb : participatingWireBits) - wb.wire.invalidateCachedValues(); - } - - public Bit getValue() - { - Bit result = null; - for (WireBit wb : participatingWireBits) - if (!wb.wire.inputs.isEmpty()) - { - Bit bit = wb.wire.bitsWithoutFusions[wb.bit]; - result = result == null ? bit : result.join(bit); - } - return result == null ? U : result; - } - } - - private static class WireBit - { - public final CoreWire wire; - public final int bit; - - public WireBit(CoreWire wire, int bit) - { - this.wire = wire; - this.bit = bit; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + bit; - result = prime * result + ((wire == null) ? 0 : wire.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - WireBit other = (WireBit) obj; - if (bit != other.bit) - return false; - if (wire == null) - { - if (other.wire != null) - return false; - } else if (!wire.equals(other.wire)) - return false; - return true; - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/CoreComponentTest.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/CoreComponentTest.java deleted file mode 100644 index 12df5844..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/CoreComponentTest.java +++ /dev/null @@ -1,465 +0,0 @@ -package net.mograsim.logic.core.tests; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import net.mograsim.logic.core.components.CoreDemux; -import net.mograsim.logic.core.components.CoreMux; -import net.mograsim.logic.core.components.CoreTriStateBuffer; -import net.mograsim.logic.core.components.CoreUnidirectionalMerger; -import net.mograsim.logic.core.components.CoreUnidirectionalSplitter; -import net.mograsim.logic.core.components.gates.CoreAndGate; -import net.mograsim.logic.core.components.gates.CoreNandGate; -import net.mograsim.logic.core.components.gates.CoreNorGate; -import net.mograsim.logic.core.components.gates.CoreNotGate; -import net.mograsim.logic.core.components.gates.CoreOrGate; -import net.mograsim.logic.core.components.gates.CoreXorGate; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; - -@SuppressWarnings("unused") -class CoreComponentTest -{ - private Timeline t = new Timeline(11); - - @BeforeEach - void resetTimeline() - { - t.reset(); - } - - @Test - void circuitExampleTest() - { - CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), c = new CoreWire(t, 1, 10), d = new CoreWire(t, 2, 1), - e = new CoreWire(t, 1, 1), f = new CoreWire(t, 1, 1), g = new CoreWire(t, 1, 1), h = new CoreWire(t, 2, 1), - i = new CoreWire(t, 2, 1), j = new CoreWire(t, 1, 1), k = new CoreWire(t, 1, 1); - new CoreAndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - new CoreNotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd()); - new CoreUnidirectionalMerger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd()); - new CoreMux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd()); - new CoreUnidirectionalSplitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd()); - - a.createReadWriteEnd().feedSignals(Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ZERO); - d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE); - e.createReadWriteEnd().feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ONE, j.getValue()); - assertEquals(Bit.ZERO, k.getValue()); - } - - @Test - void splitterTest() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), in = new CoreWire(t, 8, 1); - in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - new CoreUnidirectionalSplitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd()); - - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO); - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void mergerTest() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - new CoreUnidirectionalMerger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void fusionTest1() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1); - CoreWire.fuse(a, out, 0, 0, a.width); - CoreWire.fuse(b, out, 0, a.width, b.width); - CoreWire.fuse(c, out, 0, a.width + b.width, c.width); - ReadWriteEnd rA = a.createReadWriteEnd(); - rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); - ReadWriteEnd rB = b.createReadWriteEnd(); - rB.feedSignals(Bit.ONE, Bit.ZERO); - ReadWriteEnd rC = c.createReadWriteEnd(); - rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - t.executeAll(); - assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X); - assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X); - assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X); - rA.clearSignals(); - rB.clearSignals(); - rC.clearSignals(); - t.executeAll(); - assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); - assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE); - assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); - } - - @Test - void fusionTest2() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); - CoreWire.fuse(a, b); - ReadWriteEnd rw = a.createReadWriteEnd(); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); - - rw.feedSignals(Bit.ONE, Bit.U, Bit.Z); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z); - } - - @Test - void fusionTest3() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); - a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X); - t.executeAll(); - CoreWire.fuse(a, b); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X); - } - - @Test - void fusionTest4() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); - a.createReadWriteEnd(); - t.executeAll(); - - CoreWire.fuse(a, b); - t.executeAll(); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); - } - -// @Test -// void connectorTest() -// { -// t.reset(); -// Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1); -// new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect(); -//// b.createReadWriteEnd(); -// a.createReadWriteEnd(); -// t.executeAll(); -// assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); -// } - - @Test - void triStateBufferTest() - { - CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), en = new CoreWire(t, 1, 1), notEn = new CoreWire(t, 1, 1); - new CoreNotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd()); - new CoreTriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd()); - new CoreTriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd()); - - ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd(); - enI.feedSignals(Bit.ONE); - aI.feedSignals(Bit.ONE); - bI.feedSignals(Bit.Z); - - t.executeAll(); - - assertEquals(Bit.ONE, b.getValue()); - - bI.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.X, b.getValue()); - assertEquals(Bit.ONE, a.getValue()); - - aI.clearSignals(); - enI.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ZERO, a.getValue()); - - } - - @Test - void muxTest() - { - CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), - out = new CoreWire(t, 4, 1); - ReadWriteEnd selectIn = select.createReadWriteEnd(); - - selectIn.feedSignals(Bit.ZERO, Bit.ZERO); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - new CoreMux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), - c.createReadOnlyEnd()); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - selectIn.feedSignals(Bit.ONE, Bit.ZERO); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - selectIn.feedSignals(Bit.ONE, Bit.ONE); - t.executeAll(); - - assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - - } - - @Test - void demuxTest() - { - CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), - in = new CoreWire(t, 4, 1); - ReadWriteEnd selectIn = select.createReadWriteEnd(); - - selectIn.feedSignals(Bit.ZERO, Bit.ZERO); - in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - - new CoreDemux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), - c.createReadWriteEnd()); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - selectIn.feedSignals(Bit.ONE, Bit.ZERO); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); - - selectIn.feedSignals(Bit.ONE, Bit.ONE); - t.executeAll(); - - assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); - assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); - - } - - @Test - void andTest() - { - CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1); - new CoreAndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO); - } - - @Test - void orTest() - { - CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1); - new CoreOrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE); - } - - @Test - void nandTest() - { - CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1); - new CoreNandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); - } - - @Test - void norTest() - { - CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1); - new CoreNorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO); - } - - @Test - void xorTest() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2), c = new CoreWire(t, 3, 1), d = new CoreWire(t, 3, 1); - new CoreXorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); - b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE); - } - - @Test - void notTest() - { - CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2); - new CoreNotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd()); - a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); - - t.executeAll(); - - assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO); - } - - @Test - void rsLatchCircuitTest() - { - CoreWire r = new CoreWire(t, 1, 1), s = new CoreWire(t, 1, 1), t1 = new CoreWire(t, 1, 15), t2 = new CoreWire(t, 1, 1), - q = new CoreWire(t, 1, 1), nq = new CoreWire(t, 1, 1); - - new CoreOrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); - new CoreOrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); - new CoreNotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd()); - new CoreNotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); - - ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd(); - - sIn.feedSignals(Bit.ONE); - rIn.feedSignals(Bit.ZERO); - - t.executeAll(); - - assertEquals(Bit.ONE, q.getValue()); - assertEquals(Bit.ZERO, nq.getValue()); - - sIn.feedSignals(Bit.ZERO); - - t.executeAll(); - assertEquals(Bit.ONE, q.getValue()); - assertEquals(Bit.ZERO, nq.getValue()); - - rIn.feedSignals(Bit.ONE); - - t.executeAll(); - - assertEquals(Bit.ZERO, q.getValue()); - assertEquals(Bit.ONE, nq.getValue()); - } - - @Test - void numericValueTest() - { - CoreWire a = new CoreWire(t, 4, 1); - a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); - - t.executeAll(); - - assertEquals(11, a.getValues().getUnsignedValueLong()); - assertEquals(-5, a.getValues().getSignedValueLong()); - } - - boolean flag = false; - - @Test - void simpleTimelineTest() - { - Timeline t = new Timeline(3); - flag = false; - t.addEvent((e) -> - { - if (!flag) - fail("Events executed out of order!"); - flag = false; - }, 15); - t.addEvent((e) -> - { - if (flag) - fail("Events executed out of order!"); - flag = true; - }, 10); - t.addEvent((e) -> - { - if (flag) - fail("Events executed out of order!"); - flag = true; - }, 20); - t.addEvent((e) -> - { - fail("Only supposed to execute until timestamp 20, not 25"); - }, 25); - - t.executeUntil(t.laterThan(20), 100); - - if (!flag) - fail("Not all events were executed in order!"); - } - - // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes - @Disabled("Out of date") - @Test - void multipleInputs() - { - CoreWire w = new CoreWire(t, 2, 1); - ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd(); - wI1.feedSignals(Bit.ONE, Bit.Z); - wI2.feedSignals(Bit.Z, Bit.X); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X); - - wI2.feedSignals(Bit.ZERO, Bit.Z); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z); - - wI2.feedSignals(Bit.Z, Bit.Z); - t.executeAll(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); - - wI2.feedSignals(Bit.ONE, Bit.Z); - ReadEnd rE = w.createReadOnlyEnd(); - rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change.")); - t.executeAll(); - rE.close(); - wI1.feedSignals(Bit.X, Bit.X); - t.executeAll(); - wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed.")); - wI1.close(); - assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); - } - - private static void assertBitArrayEquals(BitVector actual, Bit... expected) - { - assertArrayEquals(expected, actual.getBits()); - } -} diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/GUITest.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/GUITest.java deleted file mode 100644 index a3689a30..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/GUITest.java +++ /dev/null @@ -1,302 +0,0 @@ -package net.mograsim.logic.core.tests; - -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.WindowConstants; - -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.components.gates.CoreNotGate; -import net.mograsim.logic.core.components.gates.CoreOrGate; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.Timeline.ExecutionResult; -import net.mograsim.logic.core.wires.CoreWire; - -public class GUITest extends JPanel -{ - - private static final long serialVersionUID = 1L; - - private static final int WIRE_DELAY = 40; - private static final int OR_DELAY = 100; - private static final int NOT_DELAY = 100; - - private Timeline t = new Timeline(11); - - CoreWire r = new CoreWire(t, 1, WIRE_DELAY); - CoreWire s = new CoreWire(t, 1, WIRE_DELAY); - CoreWire t1 = new CoreWire(t, 1, WIRE_DELAY); - CoreWire t2 = new CoreWire(t, 1, WIRE_DELAY); - CoreWire q = new CoreWire(t, 1, WIRE_DELAY); - CoreWire nq = new CoreWire(t, 1, WIRE_DELAY); - - CoreManualSwitch rIn = new CoreManualSwitch(t, r.createReadWriteEnd()); - CoreManualSwitch sIn = new CoreManualSwitch(t, s.createReadWriteEnd()); - - CoreOrGate or1 = new CoreOrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); - CoreOrGate or2 = new CoreOrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); - CoreNotGate not1 = new CoreNotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd()); - CoreNotGate not2 = new CoreNotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); - - Map switchMap = new HashMap<>(); - - int height; - int width; - boolean sizeChanged; - - public GUITest() - { - addMouseListener(new MouseListener() - { - - @Override - public void mouseReleased(MouseEvent e) - { - for (Entry dim : switchMap.entrySet()) - { - if (dim.getValue().contains(e.getPoint())) - { - dim.getKey().switchFullOff(); - repaint(); - } - } - } - - @Override - public void mousePressed(MouseEvent e) - { - for (Entry dim : switchMap.entrySet()) - { - if (dim.getValue().contains(e.getPoint())) - { - dim.getKey().switchFullOn(); - repaint(); - } - } - } - - @Override - public void mouseExited(MouseEvent e) - { - // none - } - - @Override - public void mouseEntered(MouseEvent e) - { - // none - } - - @Override - public void mouseClicked(MouseEvent e) - { - // If you want toggle buttons, use this code instead -// for (Entry dim : switchMap.entrySet()) { -// if (dim.getValue().contains(e.getPoint())) { -// dim.getKey().toggle(); -// repaint(); -// } -// } - } - }); - } - - public Timeline getTimeline() - { - return t; - } - - @Override - public void paint(Graphics some_g) - { - super.paint(some_g); - Graphics2D g = ((Graphics2D) some_g); - g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); - - checkSizeChange(); - adaptFont(g); - - drawWire(g, r, "r", 2, 9, 4, 9); - - drawWire(g, s, "s", 2, 3, 4, 3); - - drawWire(g, t2, "t2", 5, 8.5, 6, 8.5); - - drawWire(g, t1, "t1", 5, 3.5, 6, 3.5); - - drawWire(g, q, "q", 7, 8.5, 9, 8.5); - - drawWire(g, nq, "nq", 7, 3.5, 9, 3.5); - - drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5); - drawWire(g, q, "", 7.5, 7.5, 3, 4.5); - drawWire(g, q, "", 3, 4.5, 3, 4); - drawWire(g, q, "q", 3, 4, 4, 4); - - drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5); - drawWire(g, nq, "", 7.5, 4.5, 3, 7.5); - drawWire(g, nq, "", 3, 7.5, 3, 8); - drawWire(g, nq, "nq", 3, 8, 4, 8); - - drawSquare(g, 4, 8, "OR"); - drawSquare(g, 4, 3, "OR"); - - drawSquare(g, 6, 8, "NOT"); - drawSquare(g, 6, 3, "NOT"); - - drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75); - drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75); - - drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0); - } - - private void checkSizeChange() - { - sizeChanged = height != getHeight() || width != getWidth(); - if (sizeChanged) - { - height = getHeight(); - width = getWidth(); - } - } - - private void adaptFont(Graphics g) - { - g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f)); - } - - @SuppressWarnings("static-method") - private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY) - { - int h = g.getFontMetrics().getAscent(); - int w = g.getFontMetrics().stringWidth(s); - g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY)); - } - - private void drawWire(Graphics g, CoreWire wa, String name, double x1, double y1, double x2, double y2) - { - setTo(g, wa); - g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2)); - drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0); - } - - private void drawSquare(Graphics g, int posX, int posY, String text) - { - int x1 = gX(posX) - 5; - int x2 = gX(posX + 1) + 5; - int y1 = gY(posY) - 5; - int y2 = gY(posY + 1) + 5; - - g.setColor(Color.WHITE); - g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - setBlack(g); - g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5); - - } - - private void drawSwitch(Graphics g, CoreManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2) - { - int x1 = gX(posX1) - 5; - int x2 = gX(posX2) + 5; - int y1 = gY(posY1) - 5; - int y2 = gY(posY2) + 5; - - if (sizeChanged) - { - Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1); - switchMap.put(ms, r); - } - - g.setColor(ms.isFullOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE); - g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - setBlack(g); - g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); - drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5); - } - - private static void setBlack(Graphics g) - { - g.setColor(Color.BLACK); - } - - private static void setTo(Graphics g, CoreWire wa) - { - switch (wa.getValue()) - { - case ONE: - g.setColor(Color.GREEN); - break; - case X: - g.setColor(Color.RED); - break; - case Z: - g.setColor(Color.DARK_GRAY); - break; - case ZERO: - g.setColor(Color.BLACK); - break; - case U: - g.setColor(Color.MAGENTA); - break; - default: - throw new IllegalArgumentException(); - } - } - - private int gY(double pos) - { - return (int) (pos * height / 11); - } - - private int gX(double pos) - { - return (int) (pos * width / 11) + 50; - } - - public static void main(String[] args) - { - JFrame f = new JFrame("Test circuit 1.0.0"); - GUITest gt = new GUITest(); - f.add(gt); - f.setSize(800, 600); - f.setLocation(500, 400); - f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - f.setVisible(true); - - long begin = System.currentTimeMillis(); - - long lastFrame = begin; - long updateT = 16; - - while (f.isVisible()) - { - ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14); -// if (t.hasNext()) -// t.executeNext(); - if (er != ExecutionResult.NOTHING_DONE) - gt.repaint(12); - try - { - Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0)); - } - catch (Exception e) - { - e.printStackTrace(); - } - lastFrame = System.currentTimeMillis(); - } - } -} diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java deleted file mode 100644 index 5056345f..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/tests/TestCoreBitDisplay.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.mograsim.logic.core.tests; - -import static org.junit.jupiter.api.Assertions.assertArrayEquals; - -import java.util.function.LongConsumer; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; - -public final class TestCoreBitDisplay extends CoreBitDisplay -{ - - public TestCoreBitDisplay(Timeline timeline, ReadEnd in) - { - super(timeline, in); - } - - public void assertDisplays(Bit... expected) - { - assertArrayEquals(expected, getDisplayedValue().getBits()); - } - - public void assertAfterSimulationIs(Bit... expected) - { - timeline.executeAll(); - assertDisplays(expected); - } - - public void assertAfterSimulationIs(LongConsumer r, Bit... expected) - { - while (timeline.hasNext()) - { - timeline.executeNext(); - r.accept(timeline.getSimulationTime()); - } - assertDisplays(expected); - } - - @Override - protected TimelineEventHandler compute() - { - TimelineEventHandler handler = super.compute(); - return e -> - { - handler.handle(e); - System.out.println("update: value is " + getDisplayedValue()); - }; - } -} diff --git a/net.mograsim.logic.core/test/net/mograsim/logic/core/types/BitVectorTest.java b/net.mograsim.logic.core/test/net/mograsim/logic/core/types/BitVectorTest.java deleted file mode 100644 index 2b46a6c7..00000000 --- a/net.mograsim.logic.core/test/net/mograsim/logic/core/types/BitVectorTest.java +++ /dev/null @@ -1,289 +0,0 @@ -package net.mograsim.logic.core.types; - -import static net.mograsim.logic.core.types.BitVector.*; -import static net.mograsim.logic.core.types.Bit.*; -import static org.junit.jupiter.api.Assertions.*; - -import java.math.BigInteger; -import java.util.Iterator; - -import org.junit.jupiter.api.Test; - -class BitVectorTest -{ - - @Test - void testOfBitArray() - { - BitVector.of(); // should be allowed and work - - assertSame(SINGLE_U, BitVector.of(U)); - assertSame(SINGLE_X, BitVector.of(X)); - assertSame(SINGLE_0, BitVector.of(ZERO)); - assertSame(SINGLE_1, BitVector.of(ONE)); - assertSame(SINGLE_Z, BitVector.of(Z)); - } - - @Test - void testOfBitInt() - { - assertEquals(BitVector.of(), BitVector.of(ONE, 0)); - - assertSame(SINGLE_U, BitVector.of(U, 1)); - assertSame(SINGLE_X, BitVector.of(X, 1)); - assertSame(SINGLE_0, BitVector.of(ZERO, 1)); - assertSame(SINGLE_1, BitVector.of(ONE, 1)); - assertSame(SINGLE_Z, BitVector.of(Z, 1)); - - assertEquals(BitVector.of(X, X, X), BitVector.of(X, 3)); - } - - @Test - void testGetUnsignedValue() - { - assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").getUnsignedValue()); - assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").getUnsignedValue()); - assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").getUnsignedValue()); - assertEquals(BigInteger.valueOf(0b0000000101), BitVector.parse("0000000101").getUnsignedValue()); - assertEquals(BigInteger.valueOf(0b1010000000), BitVector.parse("1010000000").getUnsignedValue()); - - assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").getUnsignedValue()); - } - - @Test - void testOfLongInt() - { - assertEquals(BitVector.parse("101"), BitVector.from(0b101L, 3)); - assertEquals(BitVector.parse("01010"), BitVector.from(0b01010L, 5)); - assertEquals(BitVector.parse("10101"), BitVector.from(-11L, 5)); - assertEquals(BitVector.parse("0000"), BitVector.from(0L, 4)); - } - - @Test - void testOfBigIntegerInt() - { - assertEquals(BitVector.parse("101"), BitVector.from(BigInteger.valueOf(0b101), 3)); - assertEquals(BitVector.parse("01010"), BitVector.from(BigInteger.valueOf(0b01010), 5)); - assertEquals(BitVector.parse("10101"), BitVector.from(BigInteger.valueOf(-11), 5)); - assertEquals(BitVector.parse("0000"), BitVector.from(BigInteger.valueOf(0), 4)); - } - - @Test - void testMutator() - { - var bv = BitVector.SINGLE_1; - var bvm = bv.mutator(); - - assertFalse(bvm.isEmpty()); - assertEquals(ONE, bvm.getLSBit(0)); - assertEquals(SINGLE_1, bvm.toBitVector()); - } - - @Test - void testGetMSBit() - { - assertEquals(ONE, SINGLE_1.getMSBit(0)); - assertEquals(ONE, BitVector.of(ONE, X, X, X).getMSBit(0)); - assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getMSBit(4)); - } - - @Test - void testGetLSBit() - { - assertEquals(ONE, SINGLE_1.getLSBit(0)); - assertEquals(ONE, BitVector.of(X, X, X, ONE).getLSBit(0)); - assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getLSBit(1)); - } - - @Test - void testGetBits() - { - assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.of(X, ONE, Z).getBits()); - assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.parse("X1Z").getBits()); - } - - @Test - void testIsBinary() - { - assertTrue(SINGLE_0.isBinary()); - assertTrue(SINGLE_1.isBinary()); - - assertFalse(SINGLE_U.isBinary()); - assertFalse(SINGLE_X.isBinary()); - assertFalse(SINGLE_Z.isBinary()); - - assertTrue(BitVector.of(ONE, ZERO, ONE, ONE, ZERO).isBinary()); - assertFalse(BitVector.of(ONE, ZERO, ZERO, X).isBinary()); - } - - @Test - void testJoin() - { - // binary - assertEquals(SINGLE_0, SINGLE_0.join(SINGLE_0)); - assertEquals(SINGLE_X, SINGLE_0.join(SINGLE_1)); - assertEquals(SINGLE_1, SINGLE_1.join(SINGLE_1)); - - // other - assertEquals(SINGLE_1, SINGLE_Z.join(SINGLE_1)); - assertEquals(SINGLE_U, SINGLE_0.join(SINGLE_U)); - assertEquals(SINGLE_X, SINGLE_X.join(SINGLE_Z)); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, Z).join(BitVector.of(ONE, ZERO, ZERO, ONE, Z)); - assertEquals(BitVector.of(U, X, ZERO, ONE, Z), result); - } - - @Test - void testAnd() - { - // binary - assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_0)); - assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_1)); - assertEquals(SINGLE_1, SINGLE_1.and(SINGLE_1)); - - // other - assertEquals(SINGLE_X, SINGLE_Z.and(SINGLE_1)); - assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_U)); - assertEquals(SINGLE_X, SINGLE_X.and(SINGLE_Z)); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, ONE).and(BitVector.of(ONE, ONE, ZERO, ZERO, ONE)); - assertEquals(BitVector.of(U, X, ZERO, ZERO, ONE), result); - } - - @Test - void testOr() - { - // binary - assertEquals(SINGLE_0, SINGLE_0.or(SINGLE_0)); - assertEquals(SINGLE_1, SINGLE_0.or(SINGLE_1)); - assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_1)); - - // other - assertEquals(SINGLE_1, SINGLE_Z.or(SINGLE_1)); - assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_U)); - assertEquals(SINGLE_X, SINGLE_X.or(SINGLE_Z)); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, ZERO).or(BitVector.of(ZERO, ZERO, ZERO, ONE, ONE)); - assertEquals(BitVector.of(U, X, ZERO, ONE, ONE), result); - } - - @Test - void testXor() - { - // binary - assertEquals(SINGLE_0, SINGLE_0.xor(SINGLE_0)); - assertEquals(SINGLE_1, SINGLE_0.xor(SINGLE_1)); - assertEquals(SINGLE_0, SINGLE_1.xor(SINGLE_1)); - - // other - assertEquals(SINGLE_X, SINGLE_Z.xor(SINGLE_1)); - assertEquals(SINGLE_U, SINGLE_0.xor(SINGLE_U)); - assertEquals(SINGLE_X, SINGLE_X.xor(SINGLE_Z)); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, ONE).xor(BitVector.of(ONE, ZERO, ZERO, ZERO, ONE)); - assertEquals(BitVector.of(U, X, ZERO, ONE, ZERO), result); - } - - @Test - void testNot() - { - // binary - assertEquals(SINGLE_1, SINGLE_0.not()); - assertEquals(SINGLE_0, SINGLE_1.not()); - - // other - assertEquals(SINGLE_U, SINGLE_U.not()); - assertEquals(SINGLE_X, SINGLE_X.not()); - assertEquals(SINGLE_X, SINGLE_Z.not()); - - // higher length - var result = BitVector.of(U, X, ZERO, ONE, Z).not(); - assertEquals(BitVector.of(U, X, ONE, ZERO, X), result); - } - - @Test - void testLength() - { - assertEquals(0, BitVector.of().length()); - assertEquals(1, SINGLE_0.length()); - assertEquals(3, BitVector.of(X, X, Z).length()); - } - - @Test - void testConcat() - { - assertEquals(BitVector.of(U, X), SINGLE_U.concat(SINGLE_X)); - assertEquals(BitVector.of(Z, X, U, ONE, X), BitVector.of(Z, X, U).concat(BitVector.of(ONE, X))); - } - - @Test - void testSubVectorInt() - { - assertEquals(SINGLE_0, SINGLE_0.subVector(0)); - assertEquals(BitVector.of(), SINGLE_0.subVector(1)); - assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1)); - assertEquals(BitVector.of(X, Z), BitVector.of(ZERO, U, ONE, X, Z).subVector(3)); - } - - @Test - void testSubVectorIntInt() - { - assertEquals(SINGLE_0, SINGLE_0.subVector(0, 1)); - assertEquals(BitVector.of(), SINGLE_0.subVector(0, 0)); - assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1, 2)); - assertEquals(BitVector.of(ONE, X), BitVector.of(ZERO, U, ONE, X, Z).subVector(2, 4)); - } - - @Test - void testEqualsObject() - { - assertEquals(SINGLE_X, SINGLE_X); - assertNotEquals(SINGLE_0, SINGLE_1); - - assertEquals(BitVector.of(X, Z, U), BitVector.of(X, Z, U)); - assertNotEquals(BitVector.of(X, Z, U), BitVector.of(X, X, U)); - } - - @Test - void testEqualsWithOffset() - { - assertTrue(SINGLE_X.equalsWithOffset(SINGLE_X, 0)); - assertFalse(SINGLE_0.equalsWithOffset(SINGLE_1, 0)); - - assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(Z, U), 1)); - assertFalse(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(X, U), 1)); - assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(U), 2)); - } - - @Test - void testParse() - { - assertEquals(SINGLE_U, BitVector.parse("U")); - assertEquals(SINGLE_X, BitVector.parse("X")); - assertEquals(SINGLE_0, BitVector.parse("0")); - assertEquals(SINGLE_1, BitVector.parse("1")); - assertEquals(SINGLE_Z, BitVector.parse("Z")); - - assertEquals(BitVector.of(X, U, Z, ONE, ZERO), BitVector.parse("XUZ10")); - - assertThrows(RuntimeException.class, () -> BitVector.parse("01BX")); - } - - @Test - void testIterator() - { - var bv = BitVector.of(U, Z, ONE, ZERO, X); - Iterator it = bv.iterator(); - - assertEquals(U, it.next()); - assertEquals(Z, it.next()); - assertEquals(ONE, it.next()); - assertEquals(ZERO, it.next()); - assertEquals(X, it.next()); - assertFalse(it.hasNext()); - } -} diff --git a/net.mograsim.logic.model.am2900/.classpath b/net.mograsim.logic.model.am2900/.classpath deleted file mode 100644 index c8dbda91..00000000 --- a/net.mograsim.logic.model.am2900/.classpath +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.logic.model.am2900/.gitignore b/net.mograsim.logic.model.am2900/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.logic.model.am2900/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.logic.model.am2900/.project b/net.mograsim.logic.model.am2900/.project deleted file mode 100644 index 494b451f..00000000 --- a/net.mograsim.logic.model.am2900/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - net.mograsim.logic.model.am2900 - - - net.mograsim.logic.model - SWTZoomableCanvas - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs b/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.logic.model.am2900/Am2904Testbench.json b/net.mograsim.logic.model.am2900/Am2904Testbench.json deleted file mode 100644 index c7bec19f..00000000 --- a/net.mograsim.logic.model.am2900/Am2904Testbench.json +++ /dev/null @@ -1,2341 +0,0 @@ -{ - "width": 0.0, - "height": 0.0, - "interfacePins": [], - "innerScale": 1.0, - "submodel": { - "components": [ - { - "id": "Am2904", - "name": "Am2904#0", - "pos": { - "x": 220.0, - "y": 175.0 - } - }, - { - "id": "BitDisplay", - "name": "BitDisplay#0", - "pos": { - "x": 391.0, - "y": 150.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#1", - "pos": { - "x": 391.0, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#2", - "pos": { - "x": 391.0, - "y": 180.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#3", - "pos": { - "x": 391.0, - "y": 195.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#4", - "pos": { - "x": 365.0, - "y": 240.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#5", - "pos": { - "x": 365.0, - "y": 275.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#6", - "pos": { - "x": 365.0, - "y": 370.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#7", - "pos": { - "x": 365.0, - "y": 385.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#8", - "pos": { - "x": 365.0, - "y": 330.0 - }, - "params": 1 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#9", - "pos": { - "x": 365.0, - "y": 315.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#0", - "pos": { - "x": 255.0, - "y": 152.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#1", - "pos": { - "x": 170.0, - "y": 82.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#10", - "pos": { - "x": 160.0, - "y": 247.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#11", - "pos": { - "x": 160.0, - "y": 217.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#12", - "pos": { - "x": 160.0, - "y": 202.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#13", - "pos": { - "x": 60.0, - "y": 132.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#14", - "pos": { - "x": 165.0, - "y": 287.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#15", - "pos": { - "x": 140.0, - "y": 317.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#16", - "pos": { - "x": 140.0, - "y": 332.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#17", - "pos": { - "x": 140.0, - "y": 387.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#18", - "pos": { - "x": 140.0, - "y": 372.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#19", - "pos": { - "x": 140.0, - "y": 357.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#2", - "pos": { - "x": 170.0, - "y": 112.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#20", - "pos": { - "x": 140.0, - "y": 302.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#21", - "pos": { - "x": 55.0, - "y": 142.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#22", - "pos": { - "x": 60.0, - "y": 152.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#23", - "pos": { - "x": 60.0, - "y": 172.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#24", - "pos": { - "x": 55.0, - "y": 162.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#25", - "pos": { - "x": 55.0, - "y": 182.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#26", - "pos": { - "x": 60.0, - "y": 192.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#27", - "pos": { - "x": 60.0, - "y": 232.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#28", - "pos": { - "x": 55.0, - "y": 202.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#29", - "pos": { - "x": 55.0, - "y": 222.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#3", - "pos": { - "x": 55.0, - "y": 122.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#30", - "pos": { - "x": 60.0, - "y": 212.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#31", - "pos": { - "x": 55.0, - "y": 242.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#32", - "pos": { - "x": 300.0, - "y": 107.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#33", - "pos": { - "x": 300.0, - "y": 137.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#34", - "pos": { - "x": 300.0, - "y": 92.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#35", - "pos": { - "x": 300.0, - "y": 122.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#36", - "pos": { - "x": 300.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#37", - "pos": { - "x": 165.0, - "y": 270.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#38", - "pos": { - "x": 385.0, - "y": 220.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#4", - "pos": { - "x": 170.0, - "y": 127.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#5", - "pos": { - "x": 170.0, - "y": 142.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#6", - "pos": { - "x": 170.0, - "y": 157.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#7", - "pos": { - "x": 155.0, - "y": 172.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#8", - "pos": { - "x": 155.0, - "y": 187.5 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "ManualSwitch#9", - "pos": { - "x": 160.0, - "y": 232.5 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Merger#0", - "pos": { - "x": 85.0, - "y": 130.0 - }, - "params": { - "logicWidth": 13, - "orientation": "LEFT" - } - }, - { - "id": "TextComponent", - "name": "TextComponent#0", - "pos": { - "x": 140.0, - "y": 110.0 - }, - "params": "IZ" - }, - { - "id": "TextComponent", - "name": "TextComponent#1", - "pos": { - "x": 140.0, - "y": 125.0 - }, - "params": "IC" - }, - { - "id": "TextComponent", - "name": "TextComponent#10", - "pos": { - "x": 35.0, - "y": 240.0 - }, - "params": "I0" - }, - { - "id": "TextComponent", - "name": "TextComponent#11", - "pos": { - "x": 35.0, - "y": 120.0 - }, - "params": "I12" - }, - { - "id": "TextComponent", - "name": "TextComponent#12", - "pos": { - "x": 35.0, - "y": 220.0 - }, - "params": "I2" - }, - { - "id": "TextComponent", - "name": "TextComponent#13", - "pos": { - "x": 40.0, - "y": 190.0 - }, - "params": "I5" - }, - { - "id": "TextComponent", - "name": "TextComponent#14", - "pos": { - "x": 40.0, - "y": 230.0 - }, - "params": "I1" - }, - { - "id": "TextComponent", - "name": "TextComponent#15", - "pos": { - "x": 40.0, - "y": 210.0 - }, - "params": "I3" - }, - { - "id": "TextComponent", - "name": "TextComponent#16", - "pos": { - "x": 35.0, - "y": 200.0 - }, - "params": "I4" - }, - { - "id": "TextComponent", - "name": "TextComponent#17", - "pos": { - "x": 35.0, - "y": 180.0 - }, - "params": "I6" - }, - { - "id": "TextComponent", - "name": "TextComponent#18", - "pos": { - "x": 40.0, - "y": 170.0 - }, - "params": "I7" - }, - { - "id": "TextComponent", - "name": "TextComponent#19", - "pos": { - "x": 35.0, - "y": 160.0 - }, - "params": "I8" - }, - { - "id": "TextComponent", - "name": "TextComponent#2", - "pos": { - "x": 140.0, - "y": 140.0 - }, - "params": "IN" - }, - { - "id": "TextComponent", - "name": "TextComponent#20", - "pos": { - "x": 40.0, - "y": 150.0 - }, - "params": "I9" - }, - { - "id": "TextComponent", - "name": "TextComponent#21", - "pos": { - "x": 35.0, - "y": 140.0 - }, - "params": "I10" - }, - { - "id": "TextComponent", - "name": "TextComponent#22", - "pos": { - "x": 40.0, - "y": 130.0 - }, - "params": "I11" - }, - { - "id": "TextComponent", - "name": "TextComponent#23", - "pos": { - "x": 145.0, - "y": 285.0 - }, - "params": "CX" - }, - { - "id": "TextComponent", - "name": "TextComponent#24", - "pos": { - "x": 150.0, - "y": 80.0 - }, - "params": "C" - }, - { - "id": "TextComponent", - "name": "TextComponent#25", - "pos": { - "x": 225.0, - "y": 150.0 - }, - "params": "_OEY" - }, - { - "id": "TextComponent", - "name": "TextComponent#26", - "pos": { - "x": 416.0, - "y": 150.0 - }, - "params": "YZ" - }, - { - "id": "TextComponent", - "name": "TextComponent#27", - "pos": { - "x": 416.0, - "y": 165.0 - }, - "params": "YC" - }, - { - "id": "TextComponent", - "name": "TextComponent#28", - "pos": { - "x": 416.0, - "y": 180.0 - }, - "params": "YN" - }, - { - "id": "TextComponent", - "name": "TextComponent#29", - "pos": { - "x": 416.0, - "y": 195.0 - }, - "params": "YOVR" - }, - { - "id": "TextComponent", - "name": "TextComponent#3", - "pos": { - "x": 140.0, - "y": 155.0 - }, - "params": "IOVR" - }, - { - "id": "TextComponent", - "name": "TextComponent#30", - "pos": { - "x": 390.0, - "y": 240.0 - }, - "params": "CT" - }, - { - "id": "TextComponent", - "name": "TextComponent#31", - "pos": { - "x": 390.0, - "y": 275.0 - }, - "params": "C0" - }, - { - "id": "TextComponent", - "name": "TextComponent#32", - "pos": { - "x": 390.0, - "y": 315.0 - }, - "params": "SIOn" - }, - { - "id": "TextComponent", - "name": "TextComponent#33", - "pos": { - "x": 390.0, - "y": 330.0 - }, - "params": "QIOn" - }, - { - "id": "TextComponent", - "name": "TextComponent#34", - "pos": { - "x": 390.0, - "y": 370.0 - }, - "params": "SIO0" - }, - { - "id": "TextComponent", - "name": "TextComponent#35", - "pos": { - "x": 390.0, - "y": 385.0 - }, - "params": "QIO0" - }, - { - "id": "TextComponent", - "name": "TextComponent#36", - "pos": { - "x": 30.0, - "y": 300.0 - }, - "params": "enable S/QIOn input" - }, - { - "id": "TextComponent", - "name": "TextComponent#37", - "pos": { - "x": 30.0, - "y": 355.0 - }, - "params": "enable S/QIO0 input" - }, - { - "id": "TextComponent", - "name": "TextComponent#38", - "pos": { - "x": 110.0, - "y": 385.0 - }, - "params": "QIO0" - }, - { - "id": "TextComponent", - "name": "TextComponent#39", - "pos": { - "x": 110.0, - "y": 370.0 - }, - "params": "SIO0" - }, - { - "id": "TextComponent", - "name": "TextComponent#4", - "pos": { - "x": 115.0, - "y": 170.0 - }, - "params": "_CEM" - }, - { - "id": "TextComponent", - "name": "TextComponent#40", - "pos": { - "x": 110.0, - "y": 315.0 - }, - "params": "SIOn" - }, - { - "id": "TextComponent", - "name": "TextComponent#41", - "pos": { - "x": 110.0, - "y": 330.0 - }, - "params": "QIOn" - }, - { - "id": "TextComponent", - "name": "TextComponent#42", - "pos": { - "x": 270.0, - "y": 135.0 - }, - "params": "YOVR" - }, - { - "id": "TextComponent", - "name": "TextComponent#43", - "pos": { - "x": 270.0, - "y": 120.0 - }, - "params": "YN" - }, - { - "id": "TextComponent", - "name": "TextComponent#44", - "pos": { - "x": 270.0, - "y": 90.0 - }, - "params": "YZ" - }, - { - "id": "TextComponent", - "name": "TextComponent#45", - "pos": { - "x": 270.0, - "y": 105.0 - }, - "params": "YC" - }, - { - "id": "TextComponent", - "name": "TextComponent#46", - "pos": { - "x": 220.0, - "y": 75.0 - }, - "params": "enable Y input" - }, - { - "id": "TextComponent", - "name": "TextComponent#47", - "pos": { - "x": 145.0, - "y": 270.0 - }, - "params": "_SE" - }, - { - "id": "TextComponent", - "name": "TextComponent#48", - "pos": { - "x": 350.0, - "y": 220.0 - }, - "params": "_OECT" - }, - { - "id": "TextComponent", - "name": "TextComponent#5", - "pos": { - "x": 115.0, - "y": 185.0 - }, - "params": "_CEmu" - }, - { - "id": "TextComponent", - "name": "TextComponent#6", - "pos": { - "x": 125.0, - "y": 200.0 - }, - "params": "_EZ" - }, - { - "id": "TextComponent", - "name": "TextComponent#7", - "pos": { - "x": 125.0, - "y": 215.0 - }, - "params": "_EC" - }, - { - "id": "TextComponent", - "name": "TextComponent#8", - "pos": { - "x": 125.0, - "y": 230.0 - }, - "params": "_EN" - }, - { - "id": "TextComponent", - "name": "TextComponent#9", - "pos": { - "x": 125.0, - "y": 245.0 - }, - "params": "_EOVR" - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 175.0, - "y": 315.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#1", - "pos": { - "x": 175.0, - "y": 330.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#2", - "pos": { - "x": 175.0, - "y": 385.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#3", - "pos": { - "x": 175.0, - "y": 370.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#4", - "pos": { - "x": 335.0, - "y": 105.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#5", - "pos": { - "x": 335.0, - "y": 90.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#6", - "pos": { - "x": 335.0, - "y": 120.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#7", - "pos": { - "x": 335.0, - "y": 135.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 184.0, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 184.0, - "y": 309.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 369.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 374.0, - "y": 189.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 379.0, - "y": 199.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 209.0, - "y": 324.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 214.0, - "y": 339.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 354.0, - "y": 379.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 359.0, - "y": 389.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 344.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 359.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 359.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 364.0, - "y": 159.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "ManualSwitch#0", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OEY" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 280.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "C" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 215.0, - "y": 90.0 - }, - { - "x": 215.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "ManualSwitch#10", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 205.0, - "y": 220.0 - }, - { - "x": 205.0, - "y": 255.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#9", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EN" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 200.0, - "y": 240.0 - }, - { - "x": 200.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "I" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 105.0, - "y": 190.0 - }, - { - "x": 105.0, - "y": 265.0 - }, - { - "x": 210.0, - "y": 265.0 - }, - { - "x": 210.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "Cx" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 200.0, - "y": 295.0 - }, - { - "x": 200.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "YOVR" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YN" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 375.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#1", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "YZ" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 365.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "CT" - }, - "pin2": { - "compName": "BitDisplay#4", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 345.0, - "y": 235.0 - }, - { - "x": 345.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "C0" - }, - "pin2": { - "compName": "BitDisplay#5", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#2", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IZ" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 210.0, - "y": 120.0 - }, - { - "x": 210.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "SIOn" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 210.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "QIOn" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 215.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#1", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#15", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#16", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "IN" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "IN" - }, - "pin2": { - "compName": "ManualSwitch#17", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#18", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "IN" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "EN" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IC" - }, - "pin2": { - "compName": "ManualSwitch#4", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 205.0, - "y": 190.0 - }, - { - "x": 205.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "EN" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 200.0, - "y": 365.0 - }, - { - "x": 200.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#20", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "EN" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 200.0, - "y": 310.0 - }, - { - "x": 200.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#9", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 210.0, - "y": 375.0 - }, - { - "x": 345.0, - "y": 375.0 - }, - { - "x": 345.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "BitDisplay#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 350.0, - "y": 340.0 - }, - { - "x": 350.0, - "y": 380.0 - }, - { - "x": 215.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 210.0, - "y": 380.0 - }, - { - "x": 210.0, - "y": 385.0 - }, - { - "x": 355.0, - "y": 385.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "OUT" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 210.0, - "y": 390.0 - }, - { - "x": 210.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#7", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 360.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "BitDisplay#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#5", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IN" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 200.0, - "y": 150.0 - }, - { - "x": 200.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "SIO0" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 355.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "QIO0" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 360.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#3", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O12" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O11" - }, - "pin2": { - "compName": "ManualSwitch#13", - "pinName": "" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#21", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O10" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O9" - }, - "pin2": { - "compName": "ManualSwitch#22", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#24", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O8" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O7" - }, - "pin2": { - "compName": "ManualSwitch#23", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#25", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O6" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O5" - }, - "pin2": { - "compName": "ManualSwitch#26", - "pinName": "" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IOVR" - }, - "pin2": { - "compName": "ManualSwitch#6", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 195.0, - "y": 200.0 - }, - { - "x": 195.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#28", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O4" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O3" - }, - "pin2": { - "compName": "ManualSwitch#30", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#29", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O2" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O1" - }, - "pin2": { - "compName": "ManualSwitch#27", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#31", - "pinName": "" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "O0" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#7", - "pinName": "IN" - }, - "pin2": { - "compName": "ManualSwitch#33", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#35", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#6", - "pinName": "IN" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#4", - "pinName": "IN" - }, - "pin2": { - "compName": "ManualSwitch#32", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#34", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "IN" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "EN" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "ManualSwitch#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_CEM" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 190.0, - "y": 180.0 - }, - { - "x": 190.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "ManualSwitch#36", - "pinName": "" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 360.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#4", - "pinName": "EN" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#6", - "pinName": "EN" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#7", - "pinName": "EN" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 360.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#0", - "pinName": "" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "OUT" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 365.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "YC" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 370.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#4", - "pinName": "OUT" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 370.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_CEmu" - }, - "pin2": { - "compName": "ManualSwitch#8", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 185.0, - "y": 205.0 - }, - { - "x": 185.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#6", - "pinName": "OUT" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 375.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#2", - "pinName": "" - }, - "name": "unnamedWire#71", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#3", - "pinName": "" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 380.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#7", - "pinName": "OUT" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 380.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_SE" - }, - "pin2": { - "compName": "ManualSwitch#37", - "pinName": "" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 215.0, - "y": 260.0 - }, - { - "x": 215.0, - "y": 280.0 - } - ] - }, - { - "pin1": { - "compName": "ManualSwitch#38", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OECT" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 410.0, - "y": 230.0 - }, - { - "x": 410.0, - "y": 215.0 - }, - { - "x": 345.0, - "y": 215.0 - }, - { - "x": 345.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EZ" - }, - "pin2": { - "compName": "ManualSwitch#12", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EC" - }, - "pin2": { - "compName": "ManualSwitch#11", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 195.0, - "y": 215.0 - }, - { - "x": 195.0, - "y": 225.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "default", - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF b/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF deleted file mode 100644 index 08b14e04..00000000 --- a/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF +++ /dev/null @@ -1,20 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %Bundle-Name -Bundle-SymbolicName: net.mograsim.logic.model.am2900;singleton:=true -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.logic.model.am2900, - net.mograsim.logic.model.am2900.components, - net.mograsim.logic.model.am2900.components.am2901, - net.mograsim.logic.model.am2900.components.am2904, - net.mograsim.logic.model.am2900.components.am2910, - net.mograsim.logic.model.am2900.machine, - net.mograsim.logic.model.examples -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.eclipse.osgi, - net.mograsim.machine;bundle-version="0.1.0";visibility:=reexport, - net.mograsim.logic.core -Automatic-Module-Name: net.mograsim.logic.model.am2900 -Bundle-Vendor: Mograsim Team -Bundle-Activator: net.mograsim.logic.model.am2900.Am2900Loader -Bundle-ActivationPolicy: lazy diff --git a/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties b/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties deleted file mode 100644 index 3fe36700..00000000 --- a/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Properties file for net.mograsim.logic.model.am2900 -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim Am2900 logic \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/build.properties b/net.mograsim.logic.model.am2900/build.properties deleted file mode 100644 index 1eb041da..00000000 --- a/net.mograsim.logic.model.am2900/build.properties +++ /dev/null @@ -1,6 +0,0 @@ -source.. = src/,\ - components/ -bin.includes = META-INF/,\ - .,\ - OSGI-INF/,\ - plugin.xml diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json deleted file mode 100644 index b97159cb..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json +++ /dev/null @@ -1,6913 +0,0 @@ -{ - "width": 504.0, - "height": 342.0, - "interfacePins": [], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "ManualSwitch", - "name": "@bz_pc_cpol", - "pos": { - "x": 120.0, - "y": 435.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "@c", - "pos": { - "x": 120.0, - "y": 350.0 - }, - "params": 1 - }, - { - "id": "dlatch80", - "name": "@dlatch80#1", - "pos": { - "x": 295.0, - "y": 675.0 - } - }, - { - "id": "ManualSwitch", - "name": "@ireg_cpol", - "pos": { - "x": 120.0, - "y": 410.0 - }, - "params": 1 - }, - { - "id": "ManualSwitch", - "name": "@mireg_cpol", - "pos": { - "x": 120.0, - "y": 385.0 - }, - "params": 1 - }, - { - "id": "Am2900MainMemory", - "name": "Am2900MainMemory#0", - "pos": { - "x": 35.0, - "y": 30.0 - } - }, - { - "id": "Am2900MicroInstructionMemory", - "name": "Am2900MicroInstructionMemory#0", - "pos": { - "x": 65.0, - "y": 565.0 - } - }, - { - "id": "Am2901", - "name": "Am2901#0", - "pos": { - "x": 725.0, - "y": 400.0 - } - }, - { - "id": "Am2901", - "name": "Am2901#1", - "pos": { - "x": 850.0, - "y": 400.0 - } - }, - { - "id": "Am2901", - "name": "Am2901#2", - "pos": { - "x": 975.0, - "y": 400.0 - } - }, - { - "id": "Am2901", - "name": "Am2901#3", - "pos": { - "x": 1110.0, - "y": 400.0 - } - }, - { - "id": "Am2904", - "name": "Am2904#0", - "pos": { - "x": 550.0, - "y": 405.0 - } - }, - { - "id": "Am2910", - "name": "Am2910#0", - "pos": { - "x": 405.0, - "y": 510.0 - } - }, - { - "id": "BitDisplay", - "name": "BitDisplay#1", - "pos": { - "x": 255.0, - "y": 30.0 - }, - "params": 16 - }, - { - "id": "BitDisplay", - "name": "BitDisplay#2", - "pos": { - "x": 255.0, - "y": 45.0 - }, - "params": 16 - }, - { - "id": "FixedOutput", - "name": "FixedOutput#0", - "pos": { - "x": 540.0, - "y": 270.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#1", - "pos": { - "x": 635.0, - "y": 380.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#2", - "pos": { - "x": 365.0, - "y": 505.0 - }, - "params": { - "bits": [ - "ONE" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#3", - "pos": { - "x": 455.0, - "y": 560.0 - }, - "params": { - "bits": [ - "ONE" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#4", - "pos": { - "x": 420.0, - "y": 570.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#5", - "pos": { - "x": 475.0, - "y": 505.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#6", - "pos": { - "x": 535.0, - "y": 370.0 - }, - "params": { - "bits": [ - "ZERO" - ] - } - }, - { - "id": "FixedOutput", - "name": "FixedOutput#7", - "pos": { - "x": 260.0, - "y": 370.0 - }, - "params": { - "bits": [ - null - ] - } - }, - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 395.0, - "y": 195.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 335.0, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 395.0, - "y": 220.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 935.0, - "y": 685.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 935.0, - "y": 710.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 190.0, - "y": 100.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 240.0, - "y": 525.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 555.0, - "y": 115.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 620.0, - "y": 160.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#11", - "pos": { - "x": 575.0, - "y": 115.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#12", - "pos": { - "x": 575.0, - "y": 195.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#13", - "pos": { - "x": 575.0, - "y": 235.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#14", - "pos": { - "x": 675.0, - "y": 150.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#15", - "pos": { - "x": 675.0, - "y": 245.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#16", - "pos": { - "x": 345.0, - "y": 830.0 - }, - "params": { - "logicWidth": 80, - "orientation": "UP_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#17", - "pos": { - "x": 405.0, - "y": 815.0 - }, - "params": { - "logicWidth": 12, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#18", - "pos": { - "x": 525.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#19", - "pos": { - "x": 660.0, - "y": 755.0 - }, - "params": { - "logicWidth": 13, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 620.0, - "y": 255.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#20", - "pos": { - "x": 575.0, - "y": 815.0 - }, - "params": { - "logicWidth": 6, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#21", - "pos": { - "x": 695.0, - "y": 815.0 - }, - "params": { - "logicWidth": 2, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#22", - "pos": { - "x": 655.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#23", - "pos": { - "x": 730.0, - "y": 770.0 - }, - "params": { - "logicWidth": 6, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#24", - "pos": { - "x": 690.0, - "y": 770.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#25", - "pos": { - "x": 660.0, - "y": 770.0 - }, - "params": { - "logicWidth": 2, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#26", - "pos": { - "x": 925.0, - "y": 815.0 - }, - "params": { - "logicWidth": 16, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#27", - "pos": { - "x": 895.0, - "y": 815.0 - }, - "params": { - "logicWidth": 3, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#28", - "pos": { - "x": 865.0, - "y": 815.0 - }, - "params": { - "logicWidth": 3, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#29", - "pos": { - "x": 835.0, - "y": 815.0 - }, - "params": { - "logicWidth": 3, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 205.0, - "y": 390.0 - }, - "params": { - "logicWidth": 8, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#30", - "pos": { - "x": 795.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#31", - "pos": { - "x": 745.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#32", - "pos": { - "x": 895.0, - "y": 800.0 - }, - "params": { - "logicWidth": 3, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#33", - "pos": { - "x": 835.0, - "y": 800.0 - }, - "params": { - "logicWidth": 3, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#34", - "pos": { - "x": 865.0, - "y": 800.0 - }, - "params": { - "logicWidth": 3, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#35", - "pos": { - "x": 835.0, - "y": 780.0 - }, - "params": { - "logicWidth": 9, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#36", - "pos": { - "x": 895.0, - "y": 330.0 - }, - "params": { - "logicWidth": 16, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#37", - "pos": { - "x": 895.0, - "y": 580.0 - }, - "params": { - "logicWidth": 16, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#38", - "pos": { - "x": 895.0, - "y": 565.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#39", - "pos": { - "x": 935.0, - "y": 565.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 205.0, - "y": 405.0 - }, - "params": { - "logicWidth": 12, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#40", - "pos": { - "x": 975.0, - "y": 565.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#41", - "pos": { - "x": 1015.0, - "y": 565.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "Splitter", - "name": "Splitter#42", - "pos": { - "x": 895.0, - "y": 345.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#43", - "pos": { - "x": 935.0, - "y": 345.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#44", - "pos": { - "x": 975.0, - "y": 345.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#45", - "pos": { - "x": 1015.0, - "y": 345.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#46", - "pos": { - "x": 310.0, - "y": 235.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#47", - "pos": { - "x": 620.0, - "y": 200.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#48", - "pos": { - "x": 365.0, - "y": 815.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN_ALT" - } - }, - { - "id": "Splitter", - "name": "Splitter#49", - "pos": { - "x": 620.0, - "y": 295.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "TextComponent", - "name": "TextComponent#0", - "pos": { - "x": 305.0, - "y": 30.0 - }, - "params": "D bus" - }, - { - "id": "TextComponent", - "name": "TextComponent#1", - "pos": { - "x": 305.0, - "y": 60.0 - }, - "params": "A bus" - }, - { - "id": "TextComponent", - "name": "TextComponent#13", - "pos": { - "x": 60.0, - "y": 385.0 - }, - "params": "mireg cpol" - }, - { - "id": "TextComponent", - "name": "TextComponent#14", - "pos": { - "x": 60.0, - "y": 415.0 - }, - "params": "ireg cpol" - }, - { - "id": "TextComponent", - "name": "TextComponent#15", - "pos": { - "x": 60.0, - "y": 435.0 - }, - "params": "bz/pc cpol" - }, - { - "id": "TextComponent", - "name": "TextComponent#3", - "pos": { - "x": 515.0, - "y": 110.0 - }, - "params": "asdf" - }, - { - "id": "TextComponent", - "name": "TextComponent#4", - "pos": { - "x": 60.0, - "y": 350.0 - }, - "params": "c" - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 990.0, - "y": 590.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#1", - "pos": { - "x": 990.0, - "y": 615.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#2", - "pos": { - "x": 425.0, - "y": 120.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#3", - "pos": { - "x": 425.0, - "y": 145.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#5", - "pos": { - "x": 205.0, - "y": 70.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 604.0, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 714.0, - "y": 394.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 819.0, - "y": 384.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 824.0, - "y": 389.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 329.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 474.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 419.0, - "y": 129.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 894.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 844.0, - "y": 794.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 984.0, - "y": 599.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 249.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 244.0, - "y": 59.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 839.0, - "y": 394.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 444.0, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 389.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 449.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 454.0, - "y": 59.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 389.0, - "y": 224.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 929.0, - "y": 714.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 819.0, - "y": 529.0 - }, - "params": 9 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 944.0, - "y": 529.0 - }, - "params": 9 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 1069.0, - "y": 529.0 - }, - "params": 9 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 244.0, - "y": 44.0 - }, - "params": 16 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 964.0, - "y": 394.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 564.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 569.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#32", - "pos": { - "x": 929.0, - "y": 699.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#33", - "pos": { - "x": 284.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#34", - "pos": { - "x": 294.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#35", - "pos": { - "x": 304.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#36", - "pos": { - "x": 339.0, - "y": 229.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#37", - "pos": { - "x": 824.0, - "y": 699.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#38", - "pos": { - "x": 234.0, - "y": 529.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#39", - "pos": { - "x": 234.0, - "y": 539.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 569.0, - "y": 234.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 559.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 1074.0, - "y": 389.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 1069.0, - "y": 384.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 944.0, - "y": 384.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 949.0, - "y": 389.0 - }, - "params": 4 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 860.0, - "y": 590.0 - } - }, - { - "id": "and", - "name": "and#1", - "pos": { - "x": 860.0, - "y": 610.0 - } - }, - { - "id": "and", - "name": "and#2", - "pos": { - "x": 905.0, - "y": 595.0 - } - }, - { - "id": "dff16", - "name": "dff16#0", - "pos": { - "x": 370.0, - "y": 105.0 - } - }, - { - "id": "dff16_invwe", - "name": "dff16_invwe#0", - "pos": { - "x": 490.0, - "y": 165.0 - } - }, - { - "id": "dlatch80", - "name": "dlatch80#0", - "pos": { - "x": 240.0, - "y": 675.0 - } - }, - { - "id": "inc", - "name": "inc#0", - "pos": { - "x": 315.0, - "y": 135.0 - }, - "params": 16 - }, - { - "id": "mux1_12", - "name": "mux1_12#0", - "pos": { - "x": 365.0, - "y": 420.0 - } - }, - { - "id": "mux1_16", - "name": "mux1_16#0", - "pos": { - "x": 255.0, - "y": 110.0 - } - }, - { - "id": "mux1_16", - "name": "mux1_16#1", - "pos": { - "x": 910.0, - "y": 215.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 635.0, - "y": 145.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#1", - "pos": { - "x": 635.0, - "y": 240.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 145.0, - "y": 380.0 - } - }, - { - "id": "xor", - "name": "xor#1", - "pos": { - "x": 145.0, - "y": 405.0 - } - }, - { - "id": "xor", - "name": "xor#2", - "pos": { - "x": 145.0, - "y": 430.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Am2904#0", - "pinName": "CT" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "_CC" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 675.0, - "y": 460.0 - }, - { - "x": 675.0, - "y": 355.0 - }, - { - "x": 470.0, - "y": 355.0 - }, - { - "x": 470.0, - "y": 505.0 - }, - { - "x": 400.0, - "y": 505.0 - }, - { - "x": 400.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Qn+3" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "Qn" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 835.0, - "y": 515.0 - }, - { - "x": 835.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "QIOn" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "Qn+3" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 540.0, - "y": 530.0 - }, - { - "x": 540.0, - "y": 660.0 - }, - { - "x": 1215.0, - "y": 660.0 - }, - { - "x": 1215.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "@mireg_cpol", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "Am2900MicroInstructionMemory#0", - "pinName": "D" - }, - "pin2": { - "compName": "dlatch80#0", - "pinName": "D" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 205.0, - "y": 615.0 - }, - { - "x": 205.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16_invwe#0", - "pinName": "C" - }, - "name": "unnamedWire#102", - "path": [ - { - "x": 255.0, - "y": 310.0 - }, - { - "x": 480.0, - "y": 310.0 - }, - { - "x": 480.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 390.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "O2" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 320.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "EN" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 450.0, - "y": 205.0 - }, - { - "x": 450.0, - "y": 140.0 - }, - { - "x": 435.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 390.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IN" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "F3" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 525.0, - "y": 425.0 - }, - { - "x": 525.0, - "y": 645.0 - }, - { - "x": 1105.0, - "y": 645.0 - }, - { - "x": 1105.0, - "y": 455.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "EN" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 435.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#111", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 930.0, - "y": 725.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 760.0, - "y": 165.0 - }, - { - "x": 760.0, - "y": 385.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "I" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 755.0, - "y": 390.0 - }, - { - "x": 755.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#117", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O37" - }, - "name": "unnamedWire#119", - "path": [ - { - "x": 830.0, - "y": 715.0 - }, - { - "x": 830.0, - "y": 810.0 - }, - { - "x": 715.0, - "y": 810.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "F\u003d0" - }, - "pin2": { - "compName": "and#1", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 720.0, - "y": 445.0 - }, - { - "x": 720.0, - "y": 535.0 - }, - { - "x": 840.0, - "y": 535.0 - }, - { - "x": 840.0, - "y": 625.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "name": "unnamedWire#120", - "path": [ - { - "x": 1015.0, - "y": 720.0 - }, - { - "x": 1015.0, - "y": 610.0 - }, - { - "x": 1000.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#121", - "path": [ - { - "x": 340.0, - "y": 700.0 - }, - { - "x": 340.0, - "y": 285.0 - }, - { - "x": 180.0, - "y": 285.0 - }, - { - "x": 180.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#122", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#123", - "path": [ - { - "x": 930.0, - "y": 690.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#1", - "pinName": "EN" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "name": "unnamedWire#124", - "path": [ - { - "x": 1000.0, - "y": 695.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "Am2900MainMemory#0", - "pinName": "A" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "Am2900MainMemory#0", - "pinName": "D" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "IN" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "S" - }, - "name": "unnamedWire#127", - "path": [ - { - "x": 310.0, - "y": 225.0 - }, - { - "x": 240.0, - "y": 225.0 - }, - { - "x": 240.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "D" - }, - "name": "unnamedWire#128", - "path": [ - { - "x": 335.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "A" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "Y" - }, - "name": "unnamedWire#129", - "path": [ - { - "x": 335.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#1", - "pinName": "F\u003d0" - }, - "pin2": { - "compName": "and#1", - "pinName": "A" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 845.0, - "y": 445.0 - }, - { - "x": 845.0, - "y": 615.0 - } - ] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "CI" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "name": "unnamedWire#130", - "path": [ - { - "x": 360.0, - "y": 145.0 - }, - { - "x": 360.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#131", - "path": [ - { - "x": 330.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#132", - "path": [] - }, - { - "pin1": { - "compName": "FixedOutput#7", - "pinName": "out" - }, - "pin2": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "name": "unnamedWire#133", - "path": [ - { - "x": 285.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "IN" - }, - "name": "unnamedWire#134", - "path": [ - { - "x": 420.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#5", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#135", - "path": [ - { - "x": 230.0, - "y": 80.0 - }, - { - "x": 230.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910#0", - "pinName": "_MAP" - }, - "pin2": { - "compName": "mux1_12#0", - "pinName": "S" - }, - "name": "unnamedWire#136", - "path": [ - { - "x": 420.0, - "y": 560.0 - }, - { - "x": 360.0, - "y": 560.0 - }, - { - "x": 360.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "Q" - }, - "name": "unnamedWire#137", - "path": [] - }, - { - "pin1": { - "compName": "@dlatch80#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "I" - }, - "name": "unnamedWire#138", - "path": [ - { - "x": 330.0, - "y": 760.0 - }, - { - "x": 330.0, - "y": 845.0 - }, - { - "x": 740.0, - "y": 845.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O22" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "_CCEN" - }, - "name": "unnamedWire#139", - "path": [ - { - "x": 565.0, - "y": 735.0 - }, - { - "x": 395.0, - "y": 735.0 - }, - { - "x": 395.0, - "y": 525.0 - } - ] - }, - { - "pin1": { - "compName": "and#1", - "pinName": "Y" - }, - "pin2": { - "compName": "and#2", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 900.0, - "y": 615.0 - }, - { - "x": 900.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O21" - }, - "name": "unnamedWire#140", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O20" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O2" - }, - "name": "unnamedWire#141", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O19" - }, - "name": "unnamedWire#142", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O18" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O0" - }, - "name": "unnamedWire#143", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "I" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "I" - }, - "name": "unnamedWire#144", - "path": [ - { - "x": 540.0, - "y": 730.0 - }, - { - "x": 400.0, - "y": 730.0 - }, - { - "x": 400.0, - "y": 535.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O17" - }, - "name": "unnamedWire#145", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O16" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O10" - }, - "name": "unnamedWire#146", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O15" - }, - "name": "unnamedWire#147", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O14" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O8" - }, - "name": "unnamedWire#148", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O13" - }, - "name": "unnamedWire#149", - "path": [] - }, - { - "pin1": { - "compName": "and#2", - "pinName": "A" - }, - "pin2": { - "compName": "and#0", - "pinName": "Y" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 900.0, - "y": 600.0 - }, - { - "x": 900.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O12" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O6" - }, - "name": "unnamedWire#150", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O11" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O10" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O4" - }, - "name": "unnamedWire#152", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O9" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O2" - }, - "name": "unnamedWire#154", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O7" - }, - "name": "unnamedWire#155", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O0" - }, - "name": "unnamedWire#156", - "path": [] - }, - { - "pin1": { - "compName": "mux1_12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "D" - }, - "name": "unnamedWire#157", - "path": [ - { - "x": 435.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_12#0", - "pinName": "I1" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "I" - }, - "name": "unnamedWire#158", - "path": [ - { - "x": 350.0, - "y": 480.0 - }, - { - "x": 350.0, - "y": 760.0 - }, - { - "x": 460.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "@dlatch80#1", - "pinName": "D" - }, - "pin2": { - "compName": "dlatch80#0", - "pinName": "Q" - }, - "name": "unnamedWire#159", - "path": [] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "B" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "F\u003d0" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 850.0, - "y": 605.0 - }, - { - "x": 850.0, - "y": 535.0 - }, - { - "x": 970.0, - "y": 535.0 - }, - { - "x": 970.0, - "y": 445.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#160", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#48", - "pinName": "O3" - }, - "name": "unnamedWire#161", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#48", - "pinName": "I" - }, - "name": "unnamedWire#162", - "path": [ - { - "x": 325.0, - "y": 640.0 - }, - { - "x": 380.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2900MicroInstructionMemory#0", - "pinName": "A" - }, - "name": "unnamedWire#163", - "path": [ - { - "x": 440.0, - "y": 565.0 - }, - { - "x": 205.0, - "y": 565.0 - }, - { - "x": 205.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O29" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_CEM" - }, - "name": "unnamedWire#164", - "path": [ - { - "x": 635.0, - "y": 780.0 - }, - { - "x": 505.0, - "y": 780.0 - }, - { - "x": 505.0, - "y": 400.0 - }, - { - "x": 555.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O30" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_CEmu" - }, - "name": "unnamedWire#165", - "path": [ - { - "x": 645.0, - "y": 775.0 - }, - { - "x": 500.0, - "y": 775.0 - }, - { - "x": 500.0, - "y": 395.0 - }, - { - "x": 595.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O23" - }, - "name": "unnamedWire#166", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O25" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O24" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O26" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O3" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "F\u003d0" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 1095.0, - "y": 445.0 - }, - { - "x": 1095.0, - "y": 540.0 - }, - { - "x": 855.0, - "y": 540.0 - }, - { - "x": 855.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O27" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O28" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O5" - }, - "name": "unnamedWire#171", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#22", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O31" - }, - "name": "unnamedWire#172", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O32" - }, - "pin2": { - "compName": "Splitter#22", - "pinName": "O1" - }, - "name": "unnamedWire#173", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#22", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O33" - }, - "name": "unnamedWire#174", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O34" - }, - "pin2": { - "compName": "Splitter#22", - "pinName": "O3" - }, - "name": "unnamedWire#175", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O35" - }, - "name": "unnamedWire#176", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O36" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O1" - }, - "name": "unnamedWire#177", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "I" - }, - "name": "unnamedWire#178", - "path": [ - { - "x": 755.0, - "y": 785.0 - }, - { - "x": 600.0, - "y": 785.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#22", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#24", - "pinName": "I" - }, - "name": "unnamedWire#179", - "path": [ - { - "x": 670.0, - "y": 790.0 - }, - { - "x": 705.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "and#2", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IZ" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 945.0, - "y": 600.0 - }, - { - "x": 945.0, - "y": 635.0 - }, - { - "x": 515.0, - "y": 635.0 - }, - { - "x": 515.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#25", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "I" - }, - "name": "unnamedWire#180", - "path": [ - { - "x": 665.0, - "y": 800.0 - }, - { - "x": 700.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O0" - }, - "name": "unnamedWire#181", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O1" - }, - "name": "unnamedWire#182", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#23", - "pinName": "O2" - }, - "name": "unnamedWire#183", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O3" - }, - "name": "unnamedWire#184", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#23", - "pinName": "O4" - }, - "name": "unnamedWire#185", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#23", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O5" - }, - "name": "unnamedWire#186", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#24", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O6" - }, - "name": "unnamedWire#187", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#24", - "pinName": "O1" - }, - "name": "unnamedWire#188", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#24", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O8" - }, - "name": "unnamedWire#189", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "OVR" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IOVR" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 1100.0, - "y": 450.0 - }, - { - "x": 1100.0, - "y": 650.0 - }, - { - "x": 530.0, - "y": 650.0 - }, - { - "x": 530.0, - "y": 430.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#24", - "pinName": "O3" - }, - "name": "unnamedWire#190", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#25", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O11" - }, - "name": "unnamedWire#191", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O12" - }, - "pin2": { - "compName": "Splitter#25", - "pinName": "O1" - }, - "name": "unnamedWire#192", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O73" - }, - "name": "unnamedWire#193", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O72" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O14" - }, - "name": "unnamedWire#194", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O71" - }, - "name": "unnamedWire#195", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O70" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O12" - }, - "name": "unnamedWire#196", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O69" - }, - "name": "unnamedWire#197", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O68" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O10" - }, - "name": "unnamedWire#198", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O67" - }, - "name": "unnamedWire#199", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "RAMn+3" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "RAMn" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 830.0, - "y": 510.0 - }, - { - "x": 830.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IC" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 1220.0, - "y": 520.0 - }, - { - "x": 1220.0, - "y": 640.0 - }, - { - "x": 520.0, - "y": 640.0 - }, - { - "x": 520.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O66" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O8" - }, - "name": "unnamedWire#200", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O65" - }, - "name": "unnamedWire#201", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O64" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O6" - }, - "name": "unnamedWire#202", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O63" - }, - "name": "unnamedWire#203", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O62" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O4" - }, - "name": "unnamedWire#204", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O61" - }, - "name": "unnamedWire#205", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O60" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O2" - }, - "name": "unnamedWire#206", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O59" - }, - "name": "unnamedWire#207", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O58" - }, - "pin2": { - "compName": "Splitter#26", - "pinName": "O0" - }, - "name": "unnamedWire#208", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#27", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O57" - }, - "name": "unnamedWire#209", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "Cn" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 840.0, - "y": 520.0 - }, - { - "x": 840.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O56" - }, - "pin2": { - "compName": "Splitter#27", - "pinName": "O1" - }, - "name": "unnamedWire#210", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#27", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O55" - }, - "name": "unnamedWire#211", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O54" - }, - "pin2": { - "compName": "Splitter#28", - "pinName": "O2" - }, - "name": "unnamedWire#212", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#28", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O53" - }, - "name": "unnamedWire#213", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O52" - }, - "pin2": { - "compName": "Splitter#28", - "pinName": "O0" - }, - "name": "unnamedWire#214", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#29", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O51" - }, - "name": "unnamedWire#215", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O50" - }, - "pin2": { - "compName": "Splitter#29", - "pinName": "O1" - }, - "name": "unnamedWire#216", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#29", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O49" - }, - "name": "unnamedWire#217", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#30", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O48" - }, - "name": "unnamedWire#218", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#30", - "pinName": "O2" - }, - "name": "unnamedWire#219", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#1", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "Cn" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 965.0, - "y": 520.0 - }, - { - "x": 965.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#30", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O46" - }, - "name": "unnamedWire#220", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#30", - "pinName": "O0" - }, - "name": "unnamedWire#221", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#31", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O40" - }, - "name": "unnamedWire#222", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#31", - "pinName": "O1" - }, - "name": "unnamedWire#223", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#31", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O42" - }, - "name": "unnamedWire#224", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#31", - "pinName": "O3" - }, - "name": "unnamedWire#225", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O10" - }, - "name": "unnamedWire#226", - "path": [ - { - "x": 680.0, - "y": 795.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#33", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#29", - "pinName": "I" - }, - "name": "unnamedWire#227", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#34", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#28", - "pinName": "I" - }, - "name": "unnamedWire#228", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#32", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#27", - "pinName": "I" - }, - "name": "unnamedWire#229", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#2", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "Cn" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 1090.0, - "y": 520.0 - }, - { - "x": 1090.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#32", - "pinName": "O0" - }, - "name": "unnamedWire#230", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#32", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#35", - "pinName": "O1" - }, - "name": "unnamedWire#231", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#32", - "pinName": "O2" - }, - "name": "unnamedWire#232", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#34", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#35", - "pinName": "O3" - }, - "name": "unnamedWire#233", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#34", - "pinName": "O1" - }, - "name": "unnamedWire#234", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#34", - "pinName": "O2" - }, - "name": "unnamedWire#235", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#33", - "pinName": "O0" - }, - "name": "unnamedWire#236", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#33", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#237", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#35", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#33", - "pinName": "O2" - }, - "name": "unnamedWire#238", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#35", - "pinName": "O7" - }, - "name": "unnamedWire#239", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "I" - }, - "name": "unnamedWire#240", - "path": [ - { - "x": 720.0, - "y": 730.0 - }, - { - "x": 545.0, - "y": 730.0 - }, - { - "x": 545.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "Am2900MainMemory#0", - "pinName": "RW" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O0" - }, - "name": "unnamedWire#241", - "path": [ - { - "x": 175.0, - "y": 100.0 - }, - { - "x": 175.0, - "y": 290.0 - }, - { - "x": 345.0, - "y": 290.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "I" - }, - "name": "unnamedWire#242", - "path": [ - { - "x": 590.0, - "y": 150.0 - }, - { - "x": 590.0, - "y": 335.0 - }, - { - "x": 240.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#42", - "pinName": "O3" - }, - "name": "unnamedWire#243", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#42", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O14" - }, - "name": "unnamedWire#244", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#42", - "pinName": "O1" - }, - "name": "unnamedWire#245", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#42", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O12" - }, - "name": "unnamedWire#246", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#43", - "pinName": "O3" - }, - "name": "unnamedWire#247", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#43", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O10" - }, - "name": "unnamedWire#248", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#43", - "pinName": "O1" - }, - "name": "unnamedWire#249", - "path": [] - }, - { - "pin1": { - "compName": "@c", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#43", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O8" - }, - "name": "unnamedWire#250", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#44", - "pinName": "O3" - }, - "name": "unnamedWire#251", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#44", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O6" - }, - "name": "unnamedWire#252", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#44", - "pinName": "O1" - }, - "name": "unnamedWire#253", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#44", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O4" - }, - "name": "unnamedWire#254", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#45", - "pinName": "O3" - }, - "name": "unnamedWire#255", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#45", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O2" - }, - "name": "unnamedWire#256", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#36", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#45", - "pinName": "O1" - }, - "name": "unnamedWire#257", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#45", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "O0" - }, - "name": "unnamedWire#258", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#38", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O15" - }, - "name": "unnamedWire#259", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "C" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 1090.0, - "y": 395.0 - }, - { - "x": 1090.0, - "y": 495.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O14" - }, - "pin2": { - "compName": "Splitter#38", - "pinName": "O2" - }, - "name": "unnamedWire#260", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#38", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O13" - }, - "name": "unnamedWire#261", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O12" - }, - "pin2": { - "compName": "Splitter#38", - "pinName": "O0" - }, - "name": "unnamedWire#262", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#39", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O11" - }, - "name": "unnamedWire#263", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O10" - }, - "pin2": { - "compName": "Splitter#39", - "pinName": "O2" - }, - "name": "unnamedWire#264", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#39", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O9" - }, - "name": "unnamedWire#265", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#39", - "pinName": "O0" - }, - "name": "unnamedWire#266", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#40", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O7" - }, - "name": "unnamedWire#267", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#40", - "pinName": "O2" - }, - "name": "unnamedWire#268", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#40", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O5" - }, - "name": "unnamedWire#269", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#2", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 965.0, - "y": 495.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#40", - "pinName": "O0" - }, - "name": "unnamedWire#270", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#41", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O3" - }, - "name": "unnamedWire#271", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#41", - "pinName": "O2" - }, - "name": "unnamedWire#272", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#41", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#37", - "pinName": "O1" - }, - "name": "unnamedWire#273", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#41", - "pinName": "O0" - }, - "name": "unnamedWire#274", - "path": [] - }, - { - "pin1": { - "compName": "mux1_16#1", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#36", - "pinName": "I" - }, - "name": "unnamedWire#275", - "path": [ - { - "x": 970.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_16#1", - "pinName": "S" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O74" - }, - "name": "unnamedWire#276", - "path": [ - { - "x": 905.0, - "y": 220.0 - }, - { - "x": 905.0, - "y": 210.0 - }, - { - "x": 1230.0, - "y": 210.0 - }, - { - "x": 1230.0, - "y": 760.0 - }, - { - "x": 1085.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#26", - "pinName": "I" - }, - "pin2": { - "compName": "mux1_16#1", - "pinName": "I0" - }, - "name": "unnamedWire#277", - "path": [ - { - "x": 1000.0, - "y": 740.0 - }, - { - "x": 1235.0, - "y": 740.0 - }, - { - "x": 1235.0, - "y": 205.0 - }, - { - "x": 900.0, - "y": 205.0 - }, - { - "x": 900.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#37", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#278", - "path": [ - { - "x": 970.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "name": "unnamedWire#279", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#1", - "pinName": "IN" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#280", - "path": [ - { - "x": 985.0, - "y": 625.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "IN" - }, - "name": "unnamedWire#281", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I1" - }, - "name": "unnamedWire#282", - "path": [ - { - "x": 420.0, - "y": 95.0 - }, - { - "x": 245.0, - "y": 95.0 - }, - { - "x": 245.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#283", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "name": "unnamedWire#284", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#285", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "name": "unnamedWire#286", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#287", - "path": [ - { - "x": 450.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "OUT" - }, - "name": "unnamedWire#288", - "path": [ - { - "x": 455.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "dff16_invwe#0", - "pinName": "D" - }, - "name": "unnamedWire#289", - "path": [ - { - "x": 475.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#1", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 840.0, - "y": 495.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#46", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#290", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O1" - }, - "pin2": { - "compName": "dff16_invwe#0", - "pinName": "_WE" - }, - "name": "unnamedWire#291", - "path": [ - { - "x": 355.0, - "y": 285.0 - }, - { - "x": 485.0, - "y": 285.0 - }, - { - "x": 485.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "name": "unnamedWire#292", - "path": [ - { - "x": 315.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "name": "unnamedWire#293", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "name": "unnamedWire#294", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "name": "unnamedWire#295", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#48", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O4" - }, - "name": "unnamedWire#296", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#48", - "pinName": "O1" - }, - "name": "unnamedWire#297", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#48", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O2" - }, - "name": "unnamedWire#298", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O11" - }, - "name": "unnamedWire#299", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#1", - "pinName": "Qn+3" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "Qn" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 960.0, - "y": 515.0 - }, - { - "x": 960.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O10" - }, - "name": "unnamedWire#300", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O9" - }, - "name": "unnamedWire#301", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#47", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#302", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "pin2": { - "compName": "Splitter#47", - "pinName": "O2" - }, - "name": "unnamedWire#303", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#47", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#304", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "pin2": { - "compName": "Splitter#47", - "pinName": "O0" - }, - "name": "unnamedWire#305", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#49", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_1" - }, - "name": "unnamedWire#306", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_2" - }, - "pin2": { - "compName": "Splitter#49", - "pinName": "O2" - }, - "name": "unnamedWire#307", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#49", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_3" - }, - "name": "unnamedWire#308", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_4" - }, - "pin2": { - "compName": "Splitter#49", - "pinName": "O0" - }, - "name": "unnamedWire#309", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "C" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 715.0, - "y": 495.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#47", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#30", - "pinName": "I" - }, - "name": "unnamedWire#310", - "path": [ - { - "x": 600.0, - "y": 215.0 - }, - { - "x": 600.0, - "y": 335.0 - }, - { - "x": 690.0, - "y": 335.0 - }, - { - "x": 690.0, - "y": 675.0 - }, - { - "x": 810.0, - "y": 675.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#31", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#49", - "pinName": "I" - }, - "name": "unnamedWire#311", - "path": [ - { - "x": 760.0, - "y": 785.0 - }, - { - "x": 800.0, - "y": 785.0 - }, - { - "x": 800.0, - "y": 685.0 - }, - { - "x": 700.0, - "y": 685.0 - }, - { - "x": 700.0, - "y": 345.0 - }, - { - "x": 610.0, - "y": 345.0 - }, - { - "x": 610.0, - "y": 310.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O44" - }, - "name": "unnamedWire#312", - "path": [ - { - "x": 605.0, - "y": 150.0 - }, - { - "x": 605.0, - "y": 340.0 - }, - { - "x": 695.0, - "y": 340.0 - }, - { - "x": 695.0, - "y": 680.0 - }, - { - "x": 805.0, - "y": 680.0 - }, - { - "x": 805.0, - "y": 800.0 - }, - { - "x": 785.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "S0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O39" - }, - "name": "unnamedWire#313", - "path": [ - { - "x": 615.0, - "y": 245.0 - }, - { - "x": 615.0, - "y": 350.0 - }, - { - "x": 705.0, - "y": 350.0 - }, - { - "x": 705.0, - "y": 690.0 - }, - { - "x": 795.0, - "y": 690.0 - }, - { - "x": 795.0, - "y": 790.0 - }, - { - "x": 735.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#35", - "pinName": "I" - }, - "name": "unnamedWire#314", - "path": [ - { - "x": 820.0, - "y": 735.0 - }, - { - "x": 875.0, - "y": 735.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#315", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "name": "unnamedWire#316", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "I" - }, - "name": "unnamedWire#317", - "path": [ - { - "x": 820.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "I" - }, - "name": "unnamedWire#318", - "path": [ - { - "x": 945.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "I" - }, - "name": "unnamedWire#319", - "path": [ - { - "x": 1070.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 715.0, - "y": 365.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "I" - }, - "name": "unnamedWire#320", - "path": [ - { - "x": 1205.0, - "y": 530.0 - }, - { - "x": 1205.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#38", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "Y" - }, - "name": "unnamedWire#321", - "path": [ - { - "x": 910.0, - "y": 545.0 - }, - { - "x": 1185.0, - "y": 545.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#39", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "Y" - }, - "name": "unnamedWire#322", - "path": [ - { - "x": 950.0, - "y": 550.0 - }, - { - "x": 1050.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#40", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "Y" - }, - "name": "unnamedWire#323", - "path": [ - { - "x": 990.0, - "y": 555.0 - }, - { - "x": 925.0, - "y": 555.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#41", - "pinName": "I" - }, - "name": "unnamedWire#324", - "path": [ - { - "x": 800.0, - "y": 560.0 - }, - { - "x": 1030.0, - "y": 560.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#45", - "pinName": "I" - }, - "name": "unnamedWire#325", - "path": [ - { - "x": 785.0, - "y": 375.0 - }, - { - "x": 1030.0, - "y": 375.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#44", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "D" - }, - "name": "unnamedWire#326", - "path": [ - { - "x": 990.0, - "y": 370.0 - }, - { - "x": 910.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#43", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "D" - }, - "name": "unnamedWire#327", - "path": [ - { - "x": 950.0, - "y": 365.0 - }, - { - "x": 1035.0, - "y": 365.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#42", - "pinName": "I" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "D" - }, - "name": "unnamedWire#328", - "path": [ - { - "x": 910.0, - "y": 360.0 - }, - { - "x": 1170.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#329", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Cn" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "C0" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 675.0, - "y": 505.0 - }, - { - "x": 675.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I0" - }, - "name": "unnamedWire#330", - "path": [ - { - "x": 250.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O8" - }, - "name": "unnamedWire#331", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#1", - "pinName": "" - }, - "name": "unnamedWire#332", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "BitDisplay#2", - "pinName": "" - }, - "name": "unnamedWire#333", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#334", - "path": [ - { - "x": 340.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#335", - "path": [ - { - "x": 185.0, - "y": 230.0 - }, - { - "x": 185.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "name": "unnamedWire#336", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O7" - }, - "name": "unnamedWire#337", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#338", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#339", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "C" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 445.0, - "y": 365.0981951658187 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O6" - }, - "name": "unnamedWire#340", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O5" - }, - "name": "unnamedWire#341", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O4" - }, - "name": "unnamedWire#342", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "mux1_12#0", - "pinName": "I0" - }, - "name": "unnamedWire#343", - "path": [ - { - "x": 260.0, - "y": 440.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#5", - "pinName": "EN" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "name": "unnamedWire#344", - "path": [ - { - "x": 215.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O38" - }, - "pin2": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "name": "unnamedWire#345", - "path": [ - { - "x": 725.0, - "y": 805.0 - }, - { - "x": 825.0, - "y": 805.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "name": "unnamedWire#346", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "name": "unnamedWire#347", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "dlatch80#0", - "pinName": "E" - }, - "name": "unnamedWire#348", - "path": [ - { - "x": 235.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#349", - "path": [] - }, - { - "pin1": { - "compName": "FixedOutput#1", - "pinName": "out" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OECT" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 660.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#350", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "@dlatch80#1", - "pinName": "E" - }, - "name": "unnamedWire#351", - "path": [ - { - "x": 290.0, - "y": 535.0 - }, - { - "x": 290.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "FixedOutput#2", - "pinName": "out" - }, - "pin2": { - "compName": "Am2910#0", - "pinName": "_RLD" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "Am2910#0", - "pinName": "CI" - }, - "pin2": { - "compName": "FixedOutput#3", - "pinName": "out" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 480.0, - "y": 540.0 - }, - { - "x": 480.0, - "y": 570.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910#0", - "pinName": "_OE" - }, - "pin2": { - "compName": "FixedOutput#4", - "pinName": "out" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 445.0, - "y": 580.0 - } - ] - }, - { - "pin1": { - "compName": "FixedOutput#5", - "pinName": "out" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_SE" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#2", - "pinName": "RAMn" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "RAMn+3" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 955.0, - "y": 410.0 - }, - { - "x": 955.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "FixedOutput#6", - "pinName": "out" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 560.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EZ" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EOVR" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 575.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EC" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EN" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "dff16_invwe#0", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O7" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O5" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "RAMn" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "RAMn+3" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 1080.0, - "y": 410.0 - }, - { - "x": 1080.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O3" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O2" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O0" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "FixedOutput#0", - "pinName": "out" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 570.0, - "y": 280.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O3" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 570.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O3" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O1" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#2", - "pinName": "Qn+3" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "Qn" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 1085.0, - "y": 515.0 - }, - { - "x": 1085.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O1" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_1" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_2" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_3" - }, - "name": "unnamedWire#69", - "path": [] - }, - { - "pin1": { - "compName": "Am2901#0", - "pinName": "Qn" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "QIO0" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 685.0, - "y": 420.0 - }, - { - "x": 685.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_4" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 610.0, - "y": 250.0 - }, - { - "x": 610.0, - "y": 270.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 610.0, - "y": 210.0 - }, - { - "x": 610.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O3" - }, - "name": "unnamedWire#73", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O1" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O3" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y2" - }, - "name": "unnamedWire#78", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O1" - }, - "name": "unnamedWire#79", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "SIO0" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "RAMn" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 680.0, - "y": 525.0 - }, - { - "x": 680.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y4" - }, - "name": "unnamedWire#80", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "A" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 820.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#0", - "pinName": "B" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 825.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "A" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 945.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#1", - "pinName": "B" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 950.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "A" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 1070.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#2", - "pinName": "B" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 1075.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "A" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 1205.0, - "y": 385.0 - }, - { - "x": 1205.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901#3", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 1210.0, - "y": 435.0 - }, - { - "x": 1210.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "SIOn" - }, - "pin2": { - "compName": "Am2901#3", - "pinName": "RAMn+3" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 535.0, - "y": 525.0 - }, - { - "x": 535.0, - "y": 655.0 - }, - { - "x": 1210.0, - "y": 655.0 - }, - { - "x": 1210.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "OUT" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 1245.0, - "y": 60.0 - }, - { - "x": 1245.0, - "y": 625.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#1", - "pinName": "I1" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 895.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 1240.0, - "y": 45.0 - }, - { - "x": 1240.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "xor#2", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "C" - }, - "name": "unnamedWire#94", - "path": [ - { - "x": 245.0, - "y": 270.0 - }, - { - "x": 365.0, - "y": 270.0 - }, - { - "x": 365.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "@bz_pc_cpol", - "pinName": "" - }, - "pin2": { - "compName": "xor#2", - "pinName": "B" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "@c", - "pinName": "" - }, - "pin2": { - "compName": "xor#2", - "pinName": "A" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "B" - }, - "pin2": { - "compName": "@ireg_cpol", - "pinName": "" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "A" - }, - "pin2": { - "compName": "@c", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "A" - }, - "pin2": { - "compName": "@c", - "pinName": "" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2900", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json deleted file mode 100644 index 7a0b4b2c..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json +++ /dev/null @@ -1,253 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "_Q", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "_R", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "_S", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 7.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 40.0, - "y": 12.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 34.0, - "y": 16.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 64.0, - "y": 36.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_Q" - }, - "name": "_q", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "q", - "path": [ - { - "x": 35.0, - "y": 17.5 - }, - { - "x": 35.0, - "y": 7.5 - }, - { - "x": 65.0, - "y": 7.5 - }, - { - "x": 65.0, - "y": 12.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_S" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_R" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 35.0, - "y": 37.5 - }, - { - "x": 35.0, - "y": 27.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 65.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 65.0, - "y": 42.5 - }, - { - "x": 5.0, - "y": 42.5 - }, - { - "x": 5.0, - "y": 22.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "_rsLatch", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "wireForcing", - "params": { - "wiresToForce": [ - "q" - ], - "wiresToForceInverted": [ - "_q" - ] - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json deleted file mode 100644 index 270afa21..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json +++ /dev/null @@ -1,4003 +0,0 @@ -{ - "width": 90.0, - "height": 125.0, - "interfacePins": [ - { - "location": { - "x": 90.0, - "y": 15.0 - }, - "name": "A", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 90.0, - "y": 35.0 - }, - "name": "B", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 105.0 - }, - "name": "Cn", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 90.0, - "y": 120.0 - }, - "name": "Cn+4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 0.0 - }, - "name": "D", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "F3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "F\u003d0", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 90.0, - "y": 80.0 - }, - "name": "I", - "logicWidth": 9, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "OVR", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "Qn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 90.0, - "y": 115.0 - }, - "name": "Qn+3", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "RAMn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 90.0, - "y": 110.0 - }, - "name": "RAMn+3", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 75.0, - "y": 125.0 - }, - "name": "Y", - "logicWidth": 4, - "usage": "INPUT" - } - ], - "innerScale": 0.1, - "submodel": { - "components": [ - { - "id": "Am2901ALUInclSourceDecodeInclFunctionDecode", - "name": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pos": { - "x": 510.0, - "y": 620.0 - } - }, - { - "id": "Am2901DestDecode", - "name": "Am2901DestDecode#0", - "pos": { - "x": 380.0, - "y": 160.0 - } - }, - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 465.0, - "y": 190.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 420.0, - "y": 440.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 855.0, - "y": 760.0 - }, - "params": { - "logicWidth": 9, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 735.0, - "y": 1235.0 - }, - "params": { - "logicWidth": 4, - "orientation": "UP" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 670.0, - "y": 135.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 670.0, - "y": 335.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#5", - "pos": { - "x": 475.0, - "y": 615.0 - }, - "params": { - "logicWidth": 4, - "orientation": "DOWN" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 355.0, - "y": 920.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#1", - "pos": { - "x": 370.0, - "y": 850.0 - }, - "params": { - "logicWidth": 1, - "orientation": "DOWN" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#2", - "pos": { - "x": 400.0, - "y": 950.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#3", - "pos": { - "x": 400.0, - "y": 725.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT_ALT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 14.0, - "y": 714.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 459.0, - "y": 194.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 239.0, - "y": 929.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 244.0, - "y": 939.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 249.0, - "y": 949.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 254.0, - "y": 959.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 319.0, - "y": 929.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 334.0, - "y": 959.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 134.0, - "y": 1039.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 139.0, - "y": 1049.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 379.0, - "y": 529.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 394.0, - "y": 544.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 254.0, - "y": 749.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 434.0, - "y": 734.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 354.0, - "y": 504.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 359.0, - "y": 509.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 364.0, - "y": 514.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 369.0, - "y": 519.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 354.0, - "y": 449.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 359.0, - "y": 459.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 364.0, - "y": 469.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 369.0, - "y": 479.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 104.0, - "y": 769.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 134.0, - "y": 729.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 109.0, - "y": 779.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 114.0, - "y": 789.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#32", - "pos": { - "x": 109.0, - "y": 809.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#33", - "pos": { - "x": 114.0, - "y": 819.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#34", - "pos": { - "x": 119.0, - "y": 829.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#35", - "pos": { - "x": 104.0, - "y": 799.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#36", - "pos": { - "x": 109.0, - "y": 839.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#37", - "pos": { - "x": 114.0, - "y": 849.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#38", - "pos": { - "x": 119.0, - "y": 859.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#39", - "pos": { - "x": 414.0, - "y": 449.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 129.0, - "y": 739.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#40", - "pos": { - "x": 99.0, - "y": 964.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#41", - "pos": { - "x": 99.0, - "y": 764.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#42", - "pos": { - "x": 124.0, - "y": 889.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#43", - "pos": { - "x": 364.0, - "y": 889.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#44", - "pos": { - "x": 134.0, - "y": 894.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#45", - "pos": { - "x": 409.0, - "y": 894.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#46", - "pos": { - "x": 424.0, - "y": 1079.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 124.0, - "y": 749.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 349.0, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 344.0, - "y": 374.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 339.0, - "y": 384.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 334.0, - "y": 394.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 495.0, - "y": 180.0 - } - }, - { - "id": "dff4", - "name": "dff4#0", - "pos": { - "x": 200.0, - "y": 925.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#0", - "pos": { - "x": 720.0, - "y": 170.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#1", - "pos": { - "x": 260.0, - "y": 690.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 500.0, - "y": 350.0 - } - }, - { - "id": "or4", - "name": "or4#0", - "pos": { - "x": 375.0, - "y": 445.0 - } - }, - { - "id": "ram4", - "name": "ram4#0", - "pos": { - "x": 655.0, - "y": 170.0 - } - }, - { - "id": "sel3_4", - "name": "sel3_4#0", - "pos": { - "x": 145.0, - "y": 725.0 - } - }, - { - "id": "sel3_4", - "name": "sel3_4#1", - "pos": { - "x": 150.0, - "y": 925.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "Am2901DestDecode#0", - "pinName": "I6" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 845.0, - "y": 780.0 - }, - { - "x": 845.0, - "y": 305.0 - }, - { - "x": 375.0, - "y": 305.0 - }, - { - "x": 375.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I5" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 805.0, - "y": 790.0 - }, - { - "x": 805.0, - "y": 615.0 - }, - { - "x": 585.0, - "y": 615.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 15.0, - "y": 90.0 - }, - { - "x": 460.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "F3" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#100", - "path": [ - { - "x": 625.0, - "y": 645.0 - }, - { - "x": 625.0, - "y": 540.0 - }, - { - "x": 390.0, - "y": 540.0 - }, - { - "x": 390.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 395.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#102", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#104", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "name": "unnamedWire#105", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "or4#0", - "pinName": "A1" - }, - "name": "unnamedWire#106", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "or4#0", - "pinName": "A2" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "or4#0", - "pinName": "A3" - }, - "name": "unnamedWire#108", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "or4#0", - "pinName": "A4" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 355.0, - "y": 405.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 360.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 365.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 370.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 105.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#115", - "path": [ - { - "x": 110.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 115.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "name": "unnamedWire#117", - "path": [ - { - "x": 100.0, - "y": 960.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#119", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 460.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#120", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "name": "unnamedWire#121", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "name": "unnamedWire#122", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "name": "unnamedWire#123", - "path": [ - { - "x": 120.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "name": "unnamedWire#124", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#127", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#128", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "name": "unnamedWire#129", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 230.0, - "y": 715.0 - }, - { - "x": 230.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "name": "unnamedWire#130", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "name": "unnamedWire#131", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C1" - }, - "name": "unnamedWire#132", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C2" - }, - "name": "unnamedWire#133", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C3" - }, - "name": "unnamedWire#134", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "IN" - }, - "name": "unnamedWire#135", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "B1" - }, - "name": "unnamedWire#136", - "path": [ - { - "x": 105.0, - "y": 1000.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "B2" - }, - "name": "unnamedWire#137", - "path": [ - { - "x": 110.0, - "y": 1010.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "B3" - }, - "name": "unnamedWire#138", - "path": [ - { - "x": 115.0, - "y": 1020.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "B4" - }, - "name": "unnamedWire#139", - "path": [ - { - "x": 120.0, - "y": 1030.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "C" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 715.0, - "y": 750.0 - }, - { - "x": 715.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "D1" - }, - "name": "unnamedWire#140", - "path": [ - { - "x": 195.0, - "y": 730.0 - }, - { - "x": 195.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "D2" - }, - "name": "unnamedWire#141", - "path": [ - { - "x": 200.0, - "y": 740.0 - }, - { - "x": 200.0, - "y": 275.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "D3" - }, - "name": "unnamedWire#142", - "path": [ - { - "x": 205.0, - "y": 750.0 - }, - { - "x": 205.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "D4" - }, - "name": "unnamedWire#143", - "path": [ - { - "x": 210.0, - "y": 760.0 - }, - { - "x": 210.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "RAMWE" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#144", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#145" - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "WE" - }, - "name": "unnamedWire#146", - "path": [ - { - "x": 630.0, - "y": 185.0 - }, - { - "x": 630.0, - "y": 255.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "QWE" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "WE" - }, - "name": "unnamedWire#147", - "path": [ - { - "x": 450.0, - "y": 215.0 - }, - { - "x": 450.0, - "y": 245.0 - }, - { - "x": 190.0, - "y": 245.0 - }, - { - "x": 190.0, - "y": 980.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "YF" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#148", - "path": [ - { - "x": 435.0, - "y": 195.0 - }, - { - "x": 435.0, - "y": 355.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O0" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "D1" - }, - "name": "unnamedWire#149", - "path": [ - { - "x": 505.0, - "y": 630.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "Am2901DestDecode#0", - "pinName": "I8" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 835.0, - "y": 760.0 - }, - { - "x": 835.0, - "y": 315.0 - }, - { - "x": 365.0, - "y": 315.0 - }, - { - "x": 365.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#152", - "path": [ - { - "x": 555.0, - "y": 375.0 - }, - { - "x": 555.0, - "y": 520.0 - }, - { - "x": 740.0, - "y": 520.0 - }, - { - "x": 740.0, - "y": 1230.0 - }, - { - "x": 745.0, - "y": 1230.0 - } - ] - }, - { - "pin1": { - "compName": "or4#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#154", - "path": [ - { - "x": 415.0, - "y": 445.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#155", - "path": [ - { - "x": 415.0, - "y": 455.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F\u003d0" - }, - "name": "unnamedWire#156", - "path": [ - { - "x": 445.0, - "y": 450.0 - }, - { - "x": 445.0, - "y": 490.0 - }, - { - "x": 310.0, - "y": 490.0 - }, - { - "x": 310.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "name": "unnamedWire#157", - "path": [ - { - "x": 765.0, - "y": 1220.0 - }, - { - "x": 750.0, - "y": 1220.0 - }, - { - "x": 750.0, - "y": 510.0 - }, - { - "x": 565.0, - "y": 510.0 - }, - { - "x": 565.0, - "y": 355.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "name": "unnamedWire#158", - "path": [ - { - "x": 100.0, - "y": 1115.0 - }, - { - "x": 380.0, - "y": 1115.0 - }, - { - "x": 380.0, - "y": 930.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "IN" - }, - "name": "unnamedWire#159", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "C" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 255.0, - "y": 735.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#160", - "path": [ - { - "x": 100.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "OUT" - }, - "name": "unnamedWire#161", - "path": [ - { - "x": 100.0, - "y": 885.0 - }, - { - "x": 380.0, - "y": 885.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F3" - }, - "name": "unnamedWire#162", - "path": [ - { - "x": 5.0, - "y": 545.0 - }, - { - "x": 5.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "name": "unnamedWire#163", - "path": [ - { - "x": 550.0, - "y": 385.0 - }, - { - "x": 550.0, - "y": 525.0 - }, - { - "x": 735.0, - "y": 525.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#42", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#164", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#43", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "EN" - }, - "name": "unnamedWire#165", - "path": [ - { - "x": 395.0, - "y": 890.0 - }, - { - "x": 395.0, - "y": 860.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#43", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "name": "unnamedWire#166", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#43", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#42", - "pinName": "" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#44", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#44", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#45", - "pinName": "" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "C" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 255.0, - "y": 900.0 - }, - { - "x": 195.0, - "y": 900.0 - }, - { - "x": 195.0, - "y": 970.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "EN" - }, - "pin2": { - "compName": "WireCrossPoint#45", - "pinName": "" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "IN" - }, - "name": "unnamedWire#171", - "path": [ - { - "x": 395.0, - "y": 735.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "C4" - }, - "pin2": { - "compName": "WireCrossPoint#46", - "pinName": "" - }, - "name": "unnamedWire#172", - "path": [ - { - "x": 145.0, - "y": 1070.0 - }, - { - "x": 145.0, - "y": 1080.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#46", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "OUT" - }, - "name": "unnamedWire#173", - "path": [ - { - "x": 425.0, - "y": 960.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#46", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Qn+3" - }, - "name": "unnamedWire#174", - "path": [ - { - "x": 425.0, - "y": 1150.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "B0" - }, - "name": "unnamedWire#178", - "path": [ - { - "x": 635.0, - "y": 365.0 - }, - { - "x": 635.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "name": "unnamedWire#179", - "path": [] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "LSH" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 420.0, - "y": 205.0 - }, - { - "x": 420.0, - "y": 240.0 - }, - { - "x": 135.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "NSH" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 425.0, - "y": 165.0 - }, - { - "x": 425.0, - "y": 235.0 - }, - { - "x": 130.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I4" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 800.0, - "y": 800.0 - }, - { - "x": 800.0, - "y": 610.0 - }, - { - "x": 575.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901DestDecode#0", - "pinName": "RSH" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 430.0, - "y": 175.0 - }, - { - "x": 430.0, - "y": 230.0 - }, - { - "x": 125.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "SA" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "SB" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "SC" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#44", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "SA" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 135.0, - "y": 930.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "SB" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 130.0, - "y": 940.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "SC" - }, - "pin2": { - "compName": "WireCrossPoint#42", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 125.0, - "y": 950.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "B3" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 650.0, - "y": 245.0 - }, - { - "x": 650.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "B2" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 645.0, - "y": 235.0 - }, - { - "x": 645.0, - "y": 345.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I3" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 795.0, - "y": 810.0 - }, - { - "x": 795.0, - "y": 605.0 - }, - { - "x": 565.0, - "y": 605.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "B1" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 640.0, - "y": 355.0 - }, - { - "x": 640.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 490.0, - "y": 480.0 - }, - { - "x": 600.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "D4" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O3" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 475.0, - "y": 645.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O2" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "D3" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 485.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "D2" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O1" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 495.0, - "y": 635.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QA1" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D1" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QA2" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D2" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QA3" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D3" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QA4" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D4" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QB1" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D1" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 695.0, - "y": 215.0 - }, - { - "x": 695.0, - "y": 575.0 - }, - { - "x": 250.0, - "y": 575.0 - }, - { - "x": 250.0, - "y": 695.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I2" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 790.0, - "y": 820.0 - }, - { - "x": 790.0, - "y": 600.0 - }, - { - "x": 555.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QB2" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D2" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 700.0, - "y": 225.0 - }, - { - "x": 700.0, - "y": 570.0 - }, - { - "x": 245.0, - "y": 570.0 - }, - { - "x": 245.0, - "y": 705.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QB3" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D3" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 705.0, - "y": 235.0 - }, - { - "x": 705.0, - "y": 565.0 - }, - { - "x": 240.0, - "y": 565.0 - }, - { - "x": 240.0, - "y": 715.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "QB4" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D4" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 710.0, - "y": 245.0 - }, - { - "x": 710.0, - "y": 560.0 - }, - { - "x": 235.0, - "y": 560.0 - }, - { - "x": 235.0, - "y": 725.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cn" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Cn" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 55.0, - "y": 1050.0 - }, - { - "x": 55.0, - "y": 600.0 - }, - { - "x": 520.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "ram4#0", - "pinName": "A0" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 650.0, - "y": 175.0 - }, - { - "x": 650.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "A1" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 645.0, - "y": 155.0 - }, - { - "x": 645.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "A2" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 640.0, - "y": 145.0 - }, - { - "x": 640.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "pin2": { - "compName": "ram4#0", - "pinName": "A3" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 635.0, - "y": 135.0 - }, - { - "x": 635.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 765.0, - "y": 175.0 - }, - { - "x": 765.0, - "y": 80.0 - }, - { - "x": 350.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 770.0, - "y": 185.0 - }, - { - "x": 770.0, - "y": 75.0 - }, - { - "x": 345.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I1" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 785.0, - "y": 830.0 - }, - { - "x": 785.0, - "y": 595.0 - }, - { - "x": 545.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [ - { - "x": 775.0, - "y": 195.0 - }, - { - "x": 775.0, - "y": 70.0 - }, - { - "x": 340.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [ - { - "x": 780.0, - "y": 205.0 - }, - { - "x": 780.0, - "y": 65.0 - }, - { - "x": 335.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "A1" - }, - "name": "unnamedWire#56", - "path": [ - { - "x": 350.0, - "y": 655.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "A2" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 345.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "A3" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 340.0, - "y": 665.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "A4" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 335.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "I0" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 780.0, - "y": 840.0 - }, - { - "x": 780.0, - "y": 590.0 - }, - { - "x": 535.0, - "y": 590.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q1" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "B1" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 300.0, - "y": 695.0 - }, - { - "x": 300.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q2" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "B2" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 305.0, - "y": 705.0 - }, - { - "x": 305.0, - "y": 685.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q3" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "B3" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 310.0, - "y": 715.0 - }, - { - "x": 310.0, - "y": 690.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q4" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "B4" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 315.0, - "y": 725.0 - }, - { - "x": 315.0, - "y": 695.0 - } - ] - }, - { - "pin1": { - "compName": "dff4#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "dff4#0", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "dff4#0", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "dff4#0", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "name": "unnamedWire#69", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Qn" - }, - "pin2": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 80.0, - "y": 200.0 - }, - { - "x": 80.0, - "y": 965.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 245.0, - "y": 1095.0 - }, - { - "x": 130.0, - "y": 1095.0 - }, - { - "x": 130.0, - "y": 1050.0 - }, - { - "x": 135.0, - "y": 1050.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 250.0, - "y": 1100.0 - }, - { - "x": 135.0, - "y": 1100.0 - }, - { - "x": 135.0, - "y": 1055.0 - }, - { - "x": 140.0, - "y": 1055.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "C1" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "C2" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "C3" - }, - "name": "unnamedWire#76", - "path": [ - { - "x": 255.0, - "y": 1105.0 - }, - { - "x": 140.0, - "y": 1105.0 - }, - { - "x": 140.0, - "y": 1060.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "Am2901DestDecode#0", - "pinName": "I7" - }, - "name": "unnamedWire#77", - "path": [ - { - "x": 840.0, - "y": 770.0 - }, - { - "x": 840.0, - "y": 310.0 - }, - { - "x": 370.0, - "y": 310.0 - }, - { - "x": 370.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "RAMn" - }, - "pin2": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 75.0, - "y": 100.0 - }, - { - "x": 75.0, - "y": 765.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "A2" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 240.0, - "y": 1090.0 - }, - { - "x": 125.0, - "y": 1090.0 - }, - { - "x": 125.0, - "y": 1045.0 - }, - { - "x": 130.0, - "y": 1045.0 - }, - { - "x": 130.0, - "y": 970.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 755.0, - "y": 1225.0 - }, - { - "x": 745.0, - "y": 1225.0 - }, - { - "x": 745.0, - "y": 515.0 - }, - { - "x": 560.0, - "y": 515.0 - }, - { - "x": 560.0, - "y": 365.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Q1" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 320.0, - "y": 705.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Q2" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 325.0, - "y": 940.0 - }, - { - "x": 325.0, - "y": 710.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Q3" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 330.0, - "y": 950.0 - }, - { - "x": 330.0, - "y": 715.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Q4" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 335.0, - "y": 720.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "A3" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 135.0, - "y": 980.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#1", - "pinName": "A4" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 140.0, - "y": 990.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "D1" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "D2" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "D3" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "sel3_4#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "dff4#0", - "pinName": "D4" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 15.0, - "y": 950.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cn+4" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 615.0, - "y": 665.0 - }, - { - "x": 615.0, - "y": 1200.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "OVR" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "OVR" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 610.0, - "y": 675.0 - }, - { - "x": 610.0, - "y": 1125.0 - }, - { - "x": 95.0, - "y": 1125.0 - }, - { - "x": 95.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "F1" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 635.0, - "y": 625.0 - }, - { - "x": 635.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "F4" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 620.0, - "y": 655.0 - }, - { - "x": 620.0, - "y": 545.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#45", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#3", - "pinName": "EN" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C4" - }, - "name": "unnamedWire#96", - "path": [ - { - "x": 435.0, - "y": 795.0 - }, - { - "x": 195.0, - "y": 795.0 - }, - { - "x": 195.0, - "y": 880.0 - }, - { - "x": 140.0, - "y": 880.0 - }, - { - "x": 140.0, - "y": 870.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RAMn+3" - }, - "name": "unnamedWire#97", - "path": [ - { - "x": 455.0, - "y": 735.0 - }, - { - "x": 455.0, - "y": 1100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [ - { - "x": 380.0, - "y": 505.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", - "pinName": "F2" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#99", - "path": [ - { - "x": 630.0, - "y": 635.0 - }, - { - "x": 630.0, - "y": 535.0 - }, - { - "x": 385.0, - "y": 535.0 - }, - { - "x": 385.0, - "y": 510.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "qreg": { - "id": "delegating", - "params": { - "delegateTarget": "dff4#0" - } - }, - "regs": { - "id": "delegating", - "params": { - "delegateTarget": "ram4#0" - } - } - }, - "atomicHighLevelStates": {} - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json deleted file mode 100644 index 90f0ad95..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json +++ /dev/null @@ -1,725 +0,0 @@ -{ - "width": 35.0, - "height": 60.0, - "interfacePins": [ - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "CinE", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "FN", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "I5", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "L", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "RN", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "SBE", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "SN", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 15.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 15.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 55.0, - "y": 45.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 55.0, - "y": 70.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 100.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 39.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 4.0, - "y": 44.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 9.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 9.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 9.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 9.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 49.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 49.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 39.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 100.0, - "y": 135.0 - } - }, - { - "id": "nand3", - "name": "nand3#0", - "pos": { - "x": 55.0, - "y": 10.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I5" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SN" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 10.0, - "y": 105.0 - }, - { - "x": 135.0, - "y": 105.0 - }, - { - "x": 135.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I3" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 50.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RN" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 50.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 50.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "CinE" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 40.0, - "y": 5.0 - }, - { - "x": 115.0, - "y": 5.0 - }, - { - "x": 115.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "C" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 40.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "nand3#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#27" - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#28" - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#29" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "L" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SBE" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 45.0, - "y": 45.0 - }, - { - "x": 45.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "FN" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 5.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "A" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 40.0 - }, - { - "x": 45.0, - "y": 40.0 - }, - { - "x": 45.0, - "y": 15.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901ALUFuncDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json deleted file mode 100644 index 9652a6d6..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json +++ /dev/null @@ -1,1541 +0,0 @@ -{ - "width": 35.0, - "height": 120.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "Cn", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "Cn+4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "F1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "F2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "F3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "F4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "I5", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "OVR", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "R1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "R2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "R3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "R4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "S2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 105.0 - }, - "name": "S3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 115.0 - }, - "name": "S4", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "Am2901ALUFuncDecode", - "name": "Am2901ALUFuncDecode#0", - "pos": { - "x": 20.0, - "y": 2.5 - } - }, - { - "id": "Am2901ALUOneBit", - "name": "Am2901ALUOneBit#0", - "pos": { - "x": 45.0, - "y": 80.0 - } - }, - { - "id": "Am2901ALUOneBit", - "name": "Am2901ALUOneBit#1", - "pos": { - "x": 45.0, - "y": 180.0 - } - }, - { - "id": "Am2901ALUOneBit", - "name": "Am2901ALUOneBit#2", - "pos": { - "x": 45.0, - "y": 280.0 - } - }, - { - "id": "Am2901ALUOneBit", - "name": "Am2901ALUOneBit#3", - "pos": { - "x": 45.0, - "y": 380.0 - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 24.0, - "y": 94.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 194.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 31.5, - "y": 244.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 31.5, - "y": 344.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 34.0, - "y": 154.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 34.0, - "y": 254.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 34.0, - "y": 354.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 36.5, - "y": 164.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 36.5, - "y": 264.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 36.5, - "y": 364.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 84.0, - "y": 374.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 84.0, - "y": 384.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 24.0, - "y": 294.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 26.5, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 26.5, - "y": 204.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 26.5, - "y": 304.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 29.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 29.0, - "y": 224.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 29.0, - "y": 324.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 31.5, - "y": 144.0 - }, - "params": 1 - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 95.0, - "y": 400.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I5" - }, - "pin2": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "I5" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 5.0, - "y": 20.0 - }, - { - "x": 5.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I4" - }, - "pin2": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "I4" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 10.0, - "y": 60.0 - }, - { - "x": 10.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "CinE" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 70.0, - "y": 7.5 - }, - { - "x": 70.0, - "y": 77.5 - }, - { - "x": 27.5, - "y": 77.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "CinE" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "CinE" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "CinE" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "CinE" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 27.5, - "y": 405.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "RN" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 57.5, - "y": 57.5 - }, - { - "x": 57.5, - "y": 65.0 - }, - { - "x": 30.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I3" - }, - "pin2": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "I3" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 15.0, - "y": 100.0 - }, - { - "x": 15.0, - "y": 27.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "RN" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "RN" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "RN" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "RN" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 30.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "SN" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 65.0, - "y": 27.5 - }, - { - "x": 65.0, - "y": 72.5 - }, - { - "x": 32.5, - "y": 72.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "SN" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "SN" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "SN" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "SBE" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 62.5, - "y": 37.5 - }, - { - "x": 62.5, - "y": 70.0 - }, - { - "x": 25.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "SN" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 32.5, - "y": 445.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "FN" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 60.0, - "y": 47.5 - }, - { - "x": 60.0, - "y": 67.5 - }, - { - "x": 35.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "FN" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "FN" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "FN" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "FN" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 35.0, - "y": 455.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUFuncDecode#0", - "pinName": "L" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 67.5, - "y": 17.5 - }, - { - "x": 67.5, - "y": 75.0 - }, - { - "x": 37.5, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "L" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "L" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "L" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "L" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 37.5, - "y": 465.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R1" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "R" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 10.0, - "y": 180.0 - }, - { - "x": 10.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R2" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "R" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 10.0, - "y": 220.0 - }, - { - "x": 10.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R3" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "R" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 10.0, - "y": 260.0 - }, - { - "x": 10.0, - "y": 315.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R4" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "R" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 20.0, - "y": 300.0 - }, - { - "x": 20.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "S" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 15.0, - "y": 340.0 - }, - { - "x": 15.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S2" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "S" - }, - "name": "unnamedWire#50", - "path": [ - { - "x": 5.0, - "y": 380.0 - }, - { - "x": 5.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S3" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "S" - }, - "name": "unnamedWire#51", - "path": [ - { - "x": 10.0, - "y": 420.0 - }, - { - "x": 10.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S4" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "S" - }, - "name": "unnamedWire#52", - "path": [ - { - "x": 10.0, - "y": 460.0 - }, - { - "x": 10.0, - "y": 435.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cn" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "Cin" - }, - "name": "unnamedWire#53", - "path": [ - { - "x": 5.0, - "y": 140.0 - }, - { - "x": 5.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#0", - "pinName": "Cout" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "Cin" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 85.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 175.0 - }, - { - "x": 40.0, - "y": 175.0 - }, - { - "x": 40.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#1", - "pinName": "Cout" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "Cin" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 85.0, - "y": 185.0 - }, - { - "x": 85.0, - "y": 275.0 - }, - { - "x": 40.0, - "y": 275.0 - }, - { - "x": 40.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#2", - "pinName": "Cout" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [ - { - "x": 85.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "Cin" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 40.0, - "y": 375.0 - }, - { - "x": 40.0, - "y": 385.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#3", - "pinName": "Cout" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#0", - "pinName": "F" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F1" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 90.0, - "y": 95.0 - }, - { - "x": 90.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#0", - "pinName": "CoutE" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#1", - "pinName": "F" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F2" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 95.0, - "y": 195.0 - }, - { - "x": 95.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#2", - "pinName": "F" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F3" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 100.0, - "y": 295.0 - }, - { - "x": 100.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUOneBit#3", - "pinName": "F" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F4" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 105.0, - "y": 395.0 - }, - { - "x": 105.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "A" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 90.0, - "y": 375.0 - }, - { - "x": 90.0, - "y": 405.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 85.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cn+4" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 130.0, - "y": 385.0 - }, - { - "x": 130.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "OVR" - }, - "name": "unnamedWire#66" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#1", - "pinName": "CoutE" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#2", - "pinName": "CoutE" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "Am2901ALUOneBit#3", - "pinName": "CoutE" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 25.0, - "y": 395.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901ALUInclDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json deleted file mode 100644 index 38b9bd59..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json +++ /dev/null @@ -1,1346 +0,0 @@ -{ - "width": 95.0, - "height": 110.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 70.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 0.0 - }, - "name": "Cn", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 95.0, - "y": 45.0 - }, - "name": "Cn+4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 95.0, - "y": 5.0 - }, - "name": "F1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 95.0, - "y": 15.0 - }, - "name": "F2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 95.0, - "y": 25.0 - }, - "name": "F3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 95.0, - "y": 35.0 - }, - "name": "F4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 25.0, - "y": 0.0 - }, - "name": "I0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 0.0 - }, - "name": "I1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 0.0 - }, - "name": "I2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 55.0, - "y": 0.0 - }, - "name": "I3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 65.0, - "y": 0.0 - }, - "name": "I4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 75.0, - "y": 0.0 - }, - "name": "I5", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 95.0, - "y": 55.0 - }, - "name": "OVR", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "Q1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 90.0 - }, - "name": "Q2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "Q3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 100.0 - }, - "name": "Q4", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "Am2901ALUInclDecode", - "name": "Am2901ALUInclDecode#0", - "pos": { - "x": 315.0, - "y": 15.0 - } - }, - { - "id": "Am2901SourceDecode", - "name": "Am2901SourceDecode#0", - "pos": { - "x": 155.0, - "y": 160.0 - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 209.0, - "y": 224.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 214.0, - "y": 234.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 219.0, - "y": 244.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 224.0, - "y": 254.0 - }, - "params": 1 - }, - { - "id": "sel2_4", - "name": "sel2_4#0", - "pos": { - "x": 235.0, - "y": 85.0 - } - }, - { - "id": "sel3_4", - "name": "sel3_4#0", - "pos": { - "x": 235.0, - "y": 190.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I5" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "I5" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 300.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cn" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "Cn" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 40.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 10.0, - "y": 100.0 - }, - { - "x": 10.0, - "y": 85.0 - }, - { - "x": 170.0, - "y": 85.0 - }, - { - "x": 170.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 55.0, - "y": 140.0 - }, - { - "x": 55.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 50.0, - "y": 160.0 - }, - { - "x": 50.0, - "y": 235.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 45.0, - "y": 180.0 - }, - { - "x": 45.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 40.0, - "y": 200.0 - }, - { - "x": 40.0, - "y": 255.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 210.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 215.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 220.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 225.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "I3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I3" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 220.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 25.0, - "y": 240.0 - }, - { - "x": 25.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 20.0, - "y": 260.0 - }, - { - "x": 20.0, - "y": 275.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 20.0, - "y": 280.0 - }, - { - "x": 20.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B4" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 20.0, - "y": 300.0 - }, - { - "x": 20.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q1" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C1" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 20.0, - "y": 340.0 - }, - { - "x": 20.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q2" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C2" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 25.0, - "y": 360.0 - }, - { - "x": 25.0, - "y": 315.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q3" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C3" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 30.0, - "y": 380.0 - }, - { - "x": 30.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I2" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "I2" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 180.0, - "y": 5.0 - }, - { - "x": 150.0, - "y": 5.0 - }, - { - "x": 150.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q4" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "C4" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 35.0, - "y": 400.0 - }, - { - "x": 35.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "SC" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "SQ" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 200.0, - "y": 215.0 - }, - { - "x": 200.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901SourceDecode#0", - "pinName": "RD" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "SA" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 195.0, - "y": 205.0 - }, - { - "x": 195.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901SourceDecode#0", - "pinName": "SB" - }, - "pin2": { - "compName": "sel3_4#0", - "pinName": "SB" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 205.0, - "y": 185.0 - }, - { - "x": 205.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "SA" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "SA" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "R1" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 275.0, - "y": 90.0 - }, - { - "x": 275.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "R2" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 280.0, - "y": 100.0 - }, - { - "x": 280.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "R3" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 285.0, - "y": 110.0 - }, - { - "x": 285.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "R4" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 290.0, - "y": 120.0 - }, - { - "x": 290.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "I1" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 140.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "S1" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 295.0, - "y": 195.0 - }, - { - "x": 295.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "S2" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 300.0, - "y": 205.0 - }, - { - "x": 300.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "S3" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 305.0, - "y": 215.0 - }, - { - "x": 305.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "sel3_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "S4" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 310.0, - "y": 225.0 - }, - { - "x": 310.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "F1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F1" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "F2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F2" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 375.0, - "y": 30.0 - }, - { - "x": 375.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "F3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F3" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 370.0, - "y": 40.0 - }, - { - "x": 370.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "F4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F4" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 365.0, - "y": 50.0 - }, - { - "x": 365.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "Cn+4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cn+4" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 360.0, - "y": 60.0 - }, - { - "x": 360.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "OVR" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "OVR" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 355.0, - "y": 70.0 - }, - { - "x": 355.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "Am2901SourceDecode#0", - "pinName": "I0" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 100.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I4" - }, - "pin2": { - "compName": "Am2901ALUInclDecode#0", - "pinName": "I4" - }, - "name": "unnamedWire#50", - "path": [ - { - "x": 260.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "Am2901SourceDecode#0", - "pinName": "RA" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "SB" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 205.0, - "y": 175.0 - }, - { - "x": 205.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 10.0, - "y": 40.0 - }, - { - "x": 10.0, - "y": 55.0 - }, - { - "x": 185.0, - "y": 55.0 - }, - { - "x": 185.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 10.0, - "y": 60.0 - }, - { - "x": 10.0, - "y": 65.0 - }, - { - "x": 180.0, - "y": 65.0 - }, - { - "x": 180.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 80.0 - }, - { - "x": 10.0, - "y": 75.0 - }, - { - "x": 175.0, - "y": 75.0 - }, - { - "x": 175.0, - "y": 130.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901ALUInclSourceDecodeInclFunctionDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json deleted file mode 100644 index 31cf8af2..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json +++ /dev/null @@ -1,557 +0,0 @@ -{ - "width": 35.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "Cin", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "CinE", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Cout", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "CoutE", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "F", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "FN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "L", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "R", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "RN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "S", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "SN", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 60.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 49.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 54.0, - "y": 69.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 10.0, - "y": 20.0 - } - }, - { - "id": "and", - "name": "and#1", - "pos": { - "x": 135.0, - "y": 20.0 - } - }, - { - "id": "fulladder", - "name": "fulladder#0", - "pos": { - "x": 60.0, - "y": 20.0 - } - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 90.0, - "y": 70.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 10.0, - "y": 190.0 - } - }, - { - "id": "xor", - "name": "xor#1", - "pos": { - "x": 10.0, - "y": 290.0 - } - }, - { - "id": "xor", - "name": "xor#2", - "pos": { - "x": 135.0, - "y": 70.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cin" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "CoutE" - }, - "pin2": { - "compName": "and#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 75.0 - }, - { - "x": 5.0, - "y": 10.0 - }, - { - "x": 130.0, - "y": 10.0 - }, - { - "x": 130.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 50.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "fulladder#0", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 50.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 55.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "fulladder#0", - "pinName": "C" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 55.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "fulladder#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 100.0, - "y": 25.0 - }, - { - "x": 100.0, - "y": 65.0 - }, - { - "x": 85.0, - "y": 65.0 - }, - { - "x": 85.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "fulladder#0", - "pinName": "Z" - }, - "pin2": { - "compName": "and#1", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 82.5, - "y": 65.0 - }, - { - "x": 82.5, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "xor#2", - "pinName": "A" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "CinE" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 7.5, - "y": 125.0 - }, - { - "x": 7.5, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "and#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cout" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "xor#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "F" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "R" - }, - "pin2": { - "compName": "xor#0", - "pinName": "A" - }, - "name": "unnamedWire#3" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "RN" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#4" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S" - }, - "pin2": { - "compName": "xor#1", - "pinName": "A" - }, - "name": "unnamedWire#5" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SN" - }, - "pin2": { - "compName": "xor#1", - "pinName": "B" - }, - "name": "unnamedWire#6" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "FN" - }, - "pin2": { - "compName": "xor#2", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 130.0, - "y": 375.0 - }, - { - "x": 130.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "L" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 87.5, - "y": 425.0 - }, - { - "x": 87.5, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "fulladder#0", - "pinName": "A" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901ALUOneBit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json deleted file mode 100644 index 27cd4f01..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json +++ /dev/null @@ -1,1095 +0,0 @@ -{ - "width": 35.0, - "height": 60.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I6", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I7", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "I8", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "LSH", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "NSH", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "QWE", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "RAMWE", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "RSH", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "YF", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 15.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 15.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 80.0, - "y": 145.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 110.0, - "y": 105.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#12", - "pos": { - "x": 115.0, - "y": 210.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 15.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 15.0, - "y": 150.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 50.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 50.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 50.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 50.0, - "y": 130.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 80.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 80.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 39.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 74.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 74.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 74.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 74.0, - "y": 159.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 109.0, - "y": 214.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 4.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 9.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 9.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 9.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 4.0, - "y": 154.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 39.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 44.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 44.0, - "y": 54.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I8" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 5.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I6" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 5.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 5.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 5.0, - "y": 5.0 - }, - { - "x": 40.0, - "y": 5.0 - }, - { - "x": 40.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 40.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 40.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "NSH" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 45.0, - "y": 5.0 - }, - { - "x": 135.0, - "y": 5.0 - }, - { - "x": 135.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 45.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 10.0, - "y": 115.0 - }, - { - "x": 45.0, - "y": 115.0 - }, - { - "x": 45.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 40.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 40.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 75.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 75.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RAMWE" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 125.0, - "y": 60.0 - }, - { - "x": 125.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "A" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 75.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "LSH" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 125.0, - "y": 140.0 - }, - { - "x": 125.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 75.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "B" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RSH" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 130.0, - "y": 20.0 - }, - { - "x": 130.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#41" - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "B" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 75.0, - "y": 170.0 - }, - { - "x": 105.0, - "y": 170.0 - }, - { - "x": 105.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 110.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#12", - "pinName": "A" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#12", - "pinName": "B" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 110.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "YF" - }, - "name": "unnamedWire#46" - }, - { - "pin1": { - "compName": "NandGate#12", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QWE" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I7" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 10.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901DestDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json deleted file mode 100644 index 25a64839..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json +++ /dev/null @@ -1,1138 +0,0 @@ -{ - "width": 35.0, - "height": 50.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "I2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "RA", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "RD", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "SA", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "SB", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "SQ", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 10.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 70.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 70.0, - "y": 130.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#12", - "pos": { - "x": 70.0, - "y": 170.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#13", - "pos": { - "x": 100.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#14", - "pos": { - "x": 100.0, - "y": 170.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 10.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 40.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 40.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 40.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 40.0, - "y": 130.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 40.0, - "y": 170.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 70.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 70.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 6.5, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 36.5, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 64.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 64.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 64.0, - "y": 139.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 94.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 94.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 4.0, - "y": 144.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 6.5, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 6.5, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 6.5, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 31.5, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 34.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 34.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 34.0, - "y": 134.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I2" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 5.0 - }, - { - "x": 35.0, - "y": 5.0 - }, - { - "x": 35.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 7.5, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 7.5, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 7.5, - "y": 112.5 - }, - { - "x": 32.5, - "y": 112.5 - }, - { - "x": 32.5, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 32.5, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 32.5, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 35.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 35.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 37.5, - "y": 35.0 - }, - { - "x": 65.0, - "y": 35.0 - }, - { - "x": 65.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 37.5, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#29" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 7.5, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "A" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 65.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 65.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 65.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "B" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 65.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 65.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "B" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 65.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#12", - "pinName": "A" - }, - "name": "unnamedWire#39" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 7.5, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#13", - "pinName": "A" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 95.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#13", - "pinName": "B" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 95.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RA" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SB" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SA" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#12", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#14", - "pinName": "A" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 95.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#14", - "pinName": "B" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 95.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#13", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SQ" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#14", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "RD" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#12", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 5.0, - "y": 195.0 - }, - { - "x": 65.0, - "y": 195.0 - }, - { - "x": 65.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 7.5, - "y": 55.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2901SourceDecode", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json deleted file mode 100644 index 424c5471..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json +++ /dev/null @@ -1,5222 +0,0 @@ -{ - "width": 120.0, - "height": 155.0, - "interfacePins": [ - { - "location": { - "x": 55.0, - "y": 0.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 120.0, - "y": 85.0 - }, - "name": "C0", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 120.0, - "y": 55.0 - }, - "name": "CT", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "Cx", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "I", - "logicWidth": 13, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "IC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "IN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "IOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "IZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 120.0, - "y": 125.0 - }, - "name": "QIO0", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 125.0 - }, - "name": "QIOn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 120.0 - }, - "name": "SIO0", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 120.0 - }, - "name": "SIOn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 10.0 - }, - "name": "YC", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 15.0 - }, - "name": "YN", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 20.0 - }, - "name": "YOVR", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 120.0, - "y": 5.0 - }, - "name": "YZ", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 5.0, - "y": 0.0 - }, - "name": "_CEM", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 0.0 - }, - "name": "_CEmu", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 15.0, - "y": 0.0 - }, - "name": "_EC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 20.0, - "y": 0.0 - }, - "name": "_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 25.0, - "y": 0.0 - }, - "name": "_EOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 0.0 - }, - "name": "_EZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 110.0, - "y": 0.0 - }, - "name": "_OECT", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 90.0, - "y": 0.0 - }, - "name": "_OEY", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 110.0 - }, - "name": "_SE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Am2904MSR", - "name": "Am2904MSR#0", - "pos": { - "x": 205.0, - "y": 90.0 - } - }, - { - "id": "Am2904RegCTInstrDecode", - "name": "Am2904RegCTInstrDecode#0", - "pos": { - "x": 180.0, - "y": 190.0 - } - }, - { - "id": "Am2904ShiftInstrDecode", - "name": "Am2904ShiftInstrDecode#0", - "pos": { - "x": 100.0, - "y": 495.0 - } - }, - { - "id": "Am2904TestLogic", - "name": "Am2904TestLogic#0", - "pos": { - "x": 260.0, - "y": 330.0 - } - }, - { - "id": "Am2904muSR", - "name": "Am2904muSR#0", - "pos": { - "x": 350.0, - "y": 95.0 - } - }, - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 230.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 140.0, - "y": 5.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 455.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 555.0, - "y": 235.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 325.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 325.0, - "y": 75.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 325.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 325.0, - "y": 35.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 185.0, - "y": 70.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 185.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 185.0, - "y": 30.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 185.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 165.0 - }, - "params": { - "logicWidth": 13, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 575.0, - "y": 40.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#10", - "pos": { - "x": 445.0, - "y": 300.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#11", - "pos": { - "x": 455.0, - "y": 635.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#12", - "pos": { - "x": 455.0, - "y": 710.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#13", - "pos": { - "x": 135.0, - "y": 645.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#14", - "pos": { - "x": 310.0, - "y": 645.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#15", - "pos": { - "x": 430.0, - "y": 535.0 - }, - "params": { - "logicWidth": 2, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#16", - "pos": { - "x": 20.0, - "y": 235.0 - }, - "params": { - "logicWidth": 6, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#17", - "pos": { - "x": 20.0, - "y": 185.0 - }, - "params": { - "logicWidth": 5, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#18", - "pos": { - "x": 15.0, - "y": 65.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#19", - "pos": { - "x": 520.0, - "y": 90.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 440.0, - "y": 90.0 - }, - "params": { - "logicWidth": 2, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#20", - "pos": { - "x": 20.0, - "y": 165.0 - }, - "params": { - "logicWidth": 2, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 465.0, - "y": 100.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 425.0, - "y": 150.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#5", - "pos": { - "x": 425.0, - "y": 190.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#6", - "pos": { - "x": 320.0, - "y": 310.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#7", - "pos": { - "x": 445.0, - "y": 340.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#8", - "pos": { - "x": 445.0, - "y": 380.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#9", - "pos": { - "x": 255.0, - "y": 430.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 540.0, - "y": 70.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#1", - "pos": { - "x": 400.0, - "y": 635.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#2", - "pos": { - "x": 240.0, - "y": 635.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#3", - "pos": { - "x": 550.0, - "y": 625.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#4", - "pos": { - "x": 550.0, - "y": 650.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#5", - "pos": { - "x": 575.0, - "y": 265.0 - }, - "params": { - "logicWidth": 1, - "orientation": "RIGHT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 274.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 189.0, - "y": 139.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 179.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 179.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 179.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 449.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 534.0, - "y": 104.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 334.0, - "y": 174.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 384.0, - "y": 164.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 349.0, - "y": 439.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 434.0, - "y": 674.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 264.0, - "y": 619.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 329.0, - "y": 124.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 289.0, - "y": 609.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 294.0, - "y": 614.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 359.0, - "y": 514.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 359.0, - "y": 594.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 149.0, - "y": 664.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 149.0, - "y": 674.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 299.0, - "y": 584.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 464.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 459.0, - "y": 349.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 559.0, - "y": 619.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 404.0, - "y": 114.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 249.0, - "y": 629.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 549.0, - "y": 239.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#32", - "pos": { - "x": 404.0, - "y": 169.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#33", - "pos": { - "x": 389.0, - "y": 204.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#34", - "pos": { - "x": 439.0, - "y": 684.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#35", - "pos": { - "x": 429.0, - "y": 664.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#36", - "pos": { - "x": 429.0, - "y": 619.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#37", - "pos": { - "x": 434.0, - "y": 644.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#38", - "pos": { - "x": 579.0, - "y": 609.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#39", - "pos": { - "x": 429.0, - "y": 609.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 224.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#40", - "pos": { - "x": 584.0, - "y": 624.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#41", - "pos": { - "x": 434.0, - "y": 614.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 569.0, - "y": 54.0 - }, - "params": 4 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 134.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 319.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 319.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 319.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 495.0, - "y": 60.0 - } - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 495.0, - "y": 280.0 - } - }, - { - "id": "mux1", - "name": "mux1#1", - "pos": { - "x": 275.0, - "y": 475.0 - } - }, - { - "id": "mux1", - "name": "mux1#2", - "pos": { - "x": 355.0, - "y": 445.0 - } - }, - { - "id": "mux1", - "name": "mux1#3", - "pos": { - "x": 395.0, - "y": 425.0 - } - }, - { - "id": "mux1", - "name": "mux1#4", - "pos": { - "x": 490.0, - "y": 530.0 - } - }, - { - "id": "mux1", - "name": "mux1#5", - "pos": { - "x": 445.0, - "y": 540.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 480.0, - "y": 85.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#1", - "pos": { - "x": 440.0, - "y": 135.0 - } - }, - { - "id": "mux2", - "name": "mux2#0", - "pos": { - "x": 470.0, - "y": 625.0 - } - }, - { - "id": "mux2", - "name": "mux2#1", - "pos": { - "x": 470.0, - "y": 700.0 - } - }, - { - "id": "mux2", - "name": "mux2#2", - "pos": { - "x": 325.0, - "y": 635.0 - } - }, - { - "id": "mux3", - "name": "mux3#0", - "pos": { - "x": 335.0, - "y": 300.0 - } - }, - { - "id": "mux3", - "name": "mux3#1", - "pos": { - "x": 155.0, - "y": 635.0 - } - }, - { - "id": "not4", - "name": "not4#0", - "pos": { - "x": 130.0, - "y": 40.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 535.0, - "y": 270.0 - } - }, - { - "id": "xor", - "name": "xor#1", - "pos": { - "x": 475.0, - "y": 320.0 - } - }, - { - "id": "xor", - "name": "xor#2", - "pos": { - "x": 315.0, - "y": 465.0 - } - }, - { - "id": "xor", - "name": "xor#3", - "pos": { - "x": 115.0, - "y": 740.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_MUX" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "MUX" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 325.0, - "y": 200.0 - }, - { - "x": 325.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O0" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#101", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_1" - }, - "name": "unnamedWire#102", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_2" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_3" - }, - "name": "unnamedWire#104", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_4" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "name": "unnamedWire#105", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 330.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_4" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_3" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O1" - }, - "name": "unnamedWire#108", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_2" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_1" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O3" - }, - "name": "unnamedWire#110", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 435.0, - "y": 355.0 - }, - { - "x": 435.0, - "y": 245.0 - }, - { - "x": 390.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 535.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Am2904TestLogic#0", - "pinName": "I" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 535.0, - "y": 260.0 - }, - { - "x": 385.0, - "y": 260.0 - }, - { - "x": 385.0, - "y": 290.0 - }, - { - "x": 255.0, - "y": 290.0 - }, - { - "x": 255.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y111" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I111" - }, - "name": "unnamedWire#114", - "path": [] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "I110" - }, - "pin2": { - "compName": "Am2904TestLogic#0", - "pinName": "Y110" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y101" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I101" - }, - "name": "unnamedWire#116", - "path": [] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "I100" - }, - "pin2": { - "compName": "Am2904TestLogic#0", - "pinName": "Y100" - }, - "name": "unnamedWire#117", - "path": [] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y011" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I011" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y010" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I010" - }, - "name": "unnamedWire#119", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O2" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "I001" - }, - "pin2": { - "compName": "Am2904TestLogic#0", - "pinName": "Y001" - }, - "name": "unnamedWire#120", - "path": [] - }, - { - "pin1": { - "compName": "Am2904TestLogic#0", - "pinName": "Y000" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "I000" - }, - "name": "unnamedWire#121", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#5", - "pinName": "EN" - }, - "name": "unnamedWire#122", - "path": [ - { - "x": 585.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#123", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "CT_MUX" - }, - "name": "unnamedWire#124", - "path": [ - { - "x": 210.0, - "y": 320.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O0" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "S0" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "S1" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O1" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O2" - }, - "pin2": { - "compName": "mux3#0", - "pinName": "S2" - }, - "name": "unnamedWire#127", - "path": [] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "CT_EXP" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#128", - "path": [ - { - "x": 230.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "mux3#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#129", - "path": [ - { - "x": 420.0, - "y": 310.0 - }, - { - "x": 420.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "A" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "CT_INV" - }, - "name": "unnamedWire#130", - "path": [ - { - "x": 415.0, - "y": 275.0 - }, - { - "x": 415.0, - "y": 280.0 - }, - { - "x": 220.0, - "y": 280.0 - } - ] - }, - { - "pin1": { - "compName": "xor#1", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#131", - "path": [ - { - "x": 515.0, - "y": 325.0 - }, - { - "x": 515.0, - "y": 315.0 - }, - { - "x": 490.0, - "y": 315.0 - }, - { - "x": 490.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "I" - }, - "name": "unnamedWire#132", - "path": [ - { - "x": 335.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#133", - "path": [ - { - "x": 390.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O2" - }, - "pin2": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "name": "unnamedWire#134", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#135", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "name": "unnamedWire#136", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "I" - }, - "name": "unnamedWire#137", - "path": [ - { - "x": 385.0, - "y": 250.0 - }, - { - "x": 430.0, - "y": 250.0 - }, - { - "x": 430.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "OEN" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#138", - "path": [ - { - "x": 240.0, - "y": 185.0 - }, - { - "x": 410.0, - "y": 185.0 - }, - { - "x": 410.0, - "y": 80.0 - }, - { - "x": 485.0, - "y": 80.0 - }, - { - "x": 485.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O0" - }, - "name": "unnamedWire#139", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O4" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#140", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "I12-11" - }, - "name": "unnamedWire#141", - "path": [ - { - "x": 105.0, - "y": 170.0 - }, - { - "x": 105.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "C0_MUX" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "I" - }, - "name": "unnamedWire#142", - "path": [ - { - "x": 250.0, - "y": 445.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#1", - "pinName": "I1" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#143", - "path": [ - { - "x": 270.0, - "y": 500.0 - }, - { - "x": 270.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "mu" - }, - "name": "unnamedWire#144", - "path": [ - { - "x": 185.0, - "y": 170.0 - }, - { - "x": 185.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#1", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O2" - }, - "name": "unnamedWire#145", - "path": [ - { - "x": 265.0, - "y": 490.0 - }, - { - "x": 265.0, - "y": 510.0 - }, - { - "x": 480.0, - "y": 510.0 - }, - { - "x": 480.0, - "y": 350.0 - }, - { - "x": 470.0, - "y": 350.0 - }, - { - "x": 470.0, - "y": 310.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1#1", - "pinName": "S0" - }, - "name": "unnamedWire#146", - "path": [ - { - "x": 270.0, - "y": 450.0 - }, - { - "x": 270.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#1", - "pinName": "Y" - }, - "pin2": { - "compName": "xor#2", - "pinName": "B" - }, - "name": "unnamedWire#147", - "path": [] - }, - { - "pin1": { - "compName": "xor#2", - "pinName": "A" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O0" - }, - "name": "unnamedWire#148", - "path": [ - { - "x": 290.0, - "y": 470.0 - }, - { - "x": 290.0, - "y": 460.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O2" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#149", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "I5-0" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 105.0, - "y": 260.0 - }, - { - "x": 105.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "S0" - }, - "name": "unnamedWire#150", - "path": [ - { - "x": 350.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "xor#2", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "I1" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "mux1#2", - "pinName": "I0" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Cx" - }, - "name": "unnamedWire#152", - "path": [ - { - "x": 300.0, - "y": 460.0 - }, - { - "x": 300.0, - "y": 465.0 - }, - { - "x": 240.0, - "y": 465.0 - }, - { - "x": 240.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#2", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#3", - "pinName": "I1" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "mux1#3", - "pinName": "I0" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#154", - "path": [] - }, - { - "pin1": { - "compName": "mux1#3", - "pinName": "S0" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O3" - }, - "name": "unnamedWire#155", - "path": [] - }, - { - "pin1": { - "compName": "mux1#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C0" - }, - "name": "unnamedWire#156", - "path": [ - { - "x": 560.0, - "y": 430.0 - }, - { - "x": 560.0, - "y": 425.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#4", - "pinName": "I1" - }, - "pin2": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "name": "unnamedWire#157", - "path": [ - { - "x": 485.0, - "y": 555.0 - }, - { - "x": 485.0, - "y": 620.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SIOn" - }, - "name": "unnamedWire#158", - "path": [ - { - "x": 55.0, - "y": 620.0 - }, - { - "x": 55.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "SIO0" - }, - "name": "unnamedWire#159", - "path": [ - { - "x": 580.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "I" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 75.0, - "y": 520.0 - }, - { - "x": 75.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#5", - "pinName": "I1" - }, - "pin2": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "name": "unnamedWire#160", - "path": [ - { - "x": 435.0, - "y": 565.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QIOn" - }, - "name": "unnamedWire#161", - "path": [ - { - "x": 435.0, - "y": 625.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "name": "unnamedWire#162", - "path": [ - { - "x": 580.0, - "y": 635.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#38", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "name": "unnamedWire#163", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#164", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "IN" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "Y" - }, - "name": "unnamedWire#165", - "path": [] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "SIO0_MUX" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "I" - }, - "name": "unnamedWire#166", - "path": [ - { - "x": 165.0, - "y": 500.0 - }, - { - "x": 165.0, - "y": 575.0 - }, - { - "x": 450.0, - "y": 575.0 - }, - { - "x": 450.0, - "y": 645.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O0" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I00" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O2" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "S1" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "S0" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O1" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IOVR" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O0" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 10.0, - "y": 125.0 - }, - { - "x": 10.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I10" - }, - "name": "unnamedWire#171", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O2" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#172", - "path": [ - { - "x": 485.0, - "y": 390.0 - }, - { - "x": 485.0, - "y": 515.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#173", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O1" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "S0" - }, - "name": "unnamedWire#174", - "path": [] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "S1" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O2" - }, - "name": "unnamedWire#175", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O0" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I00" - }, - "name": "unnamedWire#176", - "path": [] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#4", - "pinName": "IN" - }, - "name": "unnamedWire#177", - "path": [ - { - "x": 545.0, - "y": 710.0 - }, - { - "x": 545.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "QIO0_MUX" - }, - "name": "unnamedWire#178", - "path": [ - { - "x": 445.0, - "y": 720.0 - }, - { - "x": 445.0, - "y": 580.0 - }, - { - "x": 175.0, - "y": 580.0 - }, - { - "x": 175.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#36", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "name": "unnamedWire#179", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IN" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O1" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 5.0, - "y": 100.0 - }, - { - "x": 5.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I10" - }, - "name": "unnamedWire#180", - "path": [ - { - "x": 435.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I01" - }, - "name": "unnamedWire#181", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I11" - }, - "name": "unnamedWire#182", - "path": [ - { - "x": 440.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#183", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "S0" - }, - "name": "unnamedWire#184", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#185", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "I000" - }, - "name": "unnamedWire#186", - "path": [] - }, - { - "pin1": { - "compName": "mux3#1", - "pinName": "I001" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#187", - "path": [ - { - "x": 150.0, - "y": 685.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "SIOn_MUX" - }, - "name": "unnamedWire#188", - "path": [ - { - "x": 130.0, - "y": 655.0 - }, - { - "x": 130.0, - "y": 580.0 - }, - { - "x": 170.0, - "y": 580.0 - }, - { - "x": 170.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O2" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "S2" - }, - "name": "unnamedWire#189", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "IC" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O1" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "S1" - }, - "name": "unnamedWire#190", - "path": [] - }, - { - "pin1": { - "compName": "mux3#1", - "pinName": "I010" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#191", - "path": [ - { - "x": 105.0, - "y": 695.0 - }, - { - "x": 105.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "I011" - }, - "name": "unnamedWire#192", - "path": [ - { - "x": 110.0, - "y": 615.0 - }, - { - "x": 110.0, - "y": 705.0 - } - ] - }, - { - "pin1": { - "compName": "mux3#1", - "pinName": "I100" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#193", - "path": [ - { - "x": 115.0, - "y": 715.0 - }, - { - "x": 115.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "xor#3", - "pinName": "Y" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "I111" - }, - "name": "unnamedWire#194", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#195", - "path": [ - { - "x": 465.0, - "y": 495.0 - }, - { - "x": 345.0, - "y": 495.0 - }, - { - "x": 345.0, - "y": 585.0 - } - ] - }, - { - "pin1": { - "compName": "mux3#1", - "pinName": "I110" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O1" - }, - "name": "unnamedWire#196", - "path": [ - { - "x": 125.0, - "y": 735.0 - }, - { - "x": 125.0, - "y": 605.0 - }, - { - "x": 350.0, - "y": 605.0 - }, - { - "x": 350.0, - "y": 500.0 - }, - { - "x": 470.0, - "y": 500.0 - }, - { - "x": 470.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#2", - "pinName": "I01" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#197", - "path": [ - { - "x": 290.0, - "y": 675.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#2", - "pinName": "I10" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#198", - "path": [ - { - "x": 295.0, - "y": 685.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "I101" - }, - "name": "unnamedWire#199", - "path": [ - { - "x": 120.0, - "y": 585.0 - }, - { - "x": 120.0, - "y": 725.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_OVRRET" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "OVRRET" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 345.0, - "y": 210.0 - }, - { - "x": 345.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IZ" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O3" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 5.0, - "y": 50.0 - }, - { - "x": 5.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "xor#1", - "pinName": "B" - }, - "name": "unnamedWire#200", - "path": [ - { - "x": 465.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "mux2#2", - "pinName": "I11" - }, - "name": "unnamedWire#201", - "path": [ - { - "x": 300.0, - "y": 695.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "OEn" - }, - "name": "unnamedWire#202", - "path": [ - { - "x": 250.0, - "y": 540.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "OE0" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#203", - "path": [ - { - "x": 390.0, - "y": 550.0 - }, - { - "x": 390.0, - "y": 585.0 - }, - { - "x": 560.0, - "y": 585.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "xor#1", - "pinName": "A" - }, - "name": "unnamedWire#204", - "path": [ - { - "x": 460.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "xor#3", - "pinName": "A" - }, - "name": "unnamedWire#205", - "path": [ - { - "x": 460.0, - "y": 490.0 - }, - { - "x": 340.0, - "y": 490.0 - }, - { - "x": 340.0, - "y": 600.0 - }, - { - "x": 100.0, - "y": 600.0 - }, - { - "x": 100.0, - "y": 745.0 - } - ] - }, - { - "pin1": { - "compName": "xor#3", - "pinName": "B" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O0" - }, - "name": "unnamedWire#206", - "path": [ - { - "x": 95.0, - "y": 755.0 - }, - { - "x": 95.0, - "y": 590.0 - }, - { - "x": 355.0, - "y": 590.0 - }, - { - "x": 355.0, - "y": 505.0 - }, - { - "x": 475.0, - "y": 505.0 - }, - { - "x": 475.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#2", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "IN" - }, - "name": "unnamedWire#207", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O2" - }, - "pin2": { - "compName": "mux2#2", - "pinName": "S1" - }, - "name": "unnamedWire#208", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O1" - }, - "pin2": { - "compName": "mux2#2", - "pinName": "S0" - }, - "name": "unnamedWire#209", - "path": [] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_CINV" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "CINV" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 340.0, - "y": 220.0 - }, - { - "x": 340.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "I" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "QIOn_MUX" - }, - "name": "unnamedWire#210", - "path": [ - { - "x": 305.0, - "y": 655.0 - }, - { - "x": 305.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O0" - }, - "pin2": { - "compName": "mux2#2", - "pinName": "I00" - }, - "name": "unnamedWire#211", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "IN" - }, - "pin2": { - "compName": "mux3#1", - "pinName": "Y" - }, - "name": "unnamedWire#212", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_SE" - }, - "pin2": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "_SE" - }, - "name": "unnamedWire#213", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#3", - "pinName": "EN" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#214", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#4", - "pinName": "EN" - }, - "name": "unnamedWire#215", - "path": [ - { - "x": 575.0, - "y": 620.0 - }, - { - "x": 575.0, - "y": 645.0 - }, - { - "x": 560.0, - "y": 645.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "M" - }, - "name": "unnamedWire#216", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#32", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "I" - }, - "name": "unnamedWire#217", - "path": [ - { - "x": 405.0, - "y": 240.0 - }, - { - "x": 440.0, - "y": 240.0 - }, - { - "x": 440.0, - "y": 315.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#2", - "pinName": "EN" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#218", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "EN" - }, - "name": "unnamedWire#219", - "path": [ - { - "x": 410.0, - "y": 630.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 105.0, - "y": 80.0 - }, - { - "x": 105.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "name": "unnamedWire#220", - "path": [ - { - "x": 440.0, - "y": 595.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#5", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#4", - "pinName": "I0" - }, - "name": "unnamedWire#221", - "path": [] - }, - { - "pin1": { - "compName": "mux1#4", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "COVD_V" - }, - "name": "unnamedWire#222", - "path": [ - { - "x": 530.0, - "y": 535.0 - }, - { - "x": 530.0, - "y": 525.0 - }, - { - "x": 230.0, - "y": 525.0 - }, - { - "x": 230.0, - "y": 310.0 - }, - { - "x": 295.0, - "y": 310.0 - }, - { - "x": 295.0, - "y": 85.0 - }, - { - "x": 275.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#2", - "pinName": "OUT" - }, - "name": "unnamedWire#223", - "path": [ - { - "x": 265.0, - "y": 645.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#4", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "name": "unnamedWire#224", - "path": [ - { - "x": 585.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "MC_MUX" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "I" - }, - "name": "unnamedWire#226", - "path": [ - { - "x": 410.0, - "y": 560.0 - }, - { - "x": 410.0, - "y": 540.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1#5", - "pinName": "S0" - }, - "name": "unnamedWire#227", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1#4", - "pinName": "S0" - }, - "name": "unnamedWire#228", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#34", - "pinName": "" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I11" - }, - "name": "unnamedWire#229", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "I" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#35", - "pinName": "" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I01" - }, - "name": "unnamedWire#230", - "path": [ - { - "x": 430.0, - "y": 740.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "name": "unnamedWire#231", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#37", - "pinName": "" - }, - "pin2": { - "compName": "TriStateBuffer#1", - "pinName": "OUT" - }, - "name": "unnamedWire#232", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#233", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#234", - "path": [ - { - "x": 550.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_OECT" - }, - "name": "unnamedWire#235", - "path": [ - { - "x": 550.0, - "y": 215.0 - }, - { - "x": 565.0, - "y": 215.0 - }, - { - "x": 565.0, - "y": 25.0 - }, - { - "x": 550.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#5", - "pinName": "OUT" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "CT" - }, - "name": "unnamedWire#236", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#5", - "pinName": "IN" - }, - "pin2": { - "compName": "xor#0", - "pinName": "Y" - }, - "name": "unnamedWire#237", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "mux1#5", - "pinName": "I0" - }, - "name": "unnamedWire#238", - "path": [ - { - "x": 430.0, - "y": 555.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#39", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#239", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 190.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QIO0" - }, - "name": "unnamedWire#240", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#41", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#40", - "pinName": "" - }, - "name": "unnamedWire#242", - "path": [ - { - "x": 585.0, - "y": 615.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904MSR#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 300.0, - "y": 110.0 - }, - { - "x": 300.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "I" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "Am2904muSR#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 405.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#33", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "I" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "C" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 255.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "C" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 300.0, - "y": 60.0 - }, - { - "x": 300.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "MSR_MUX" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "MUX" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 200.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904ShiftInstrDecode#0", - "pinName": "MC_EN" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "COVD_EN" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 225.0, - "y": 570.0 - }, - { - "x": 225.0, - "y": 305.0 - }, - { - "x": 290.0, - "y": 305.0 - }, - { - "x": 290.0, - "y": 80.0 - }, - { - "x": 265.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 225.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_CEmu" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O0" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 320.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "_EOVR" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 390.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "_EN" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 380.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904muSR#0", - "pinName": "_EC" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 370.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904muSR#0", - "pinName": "_EZ" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 360.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "B" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_WEZ" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 305.0, - "y": 30.0 - }, - { - "x": 305.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_WEC" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 310.0, - "y": 240.0 - }, - { - "x": 310.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "YZ" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 595.0, - "y": 40.0 - }, - { - "x": 595.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YC" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "YN" - }, - "name": "unnamedWire#51", - "path": [ - { - "x": 595.0, - "y": 60.0 - }, - { - "x": 595.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YOVR" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#52", - "path": [ - { - "x": 590.0, - "y": 100.0 - }, - { - "x": 590.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "Y" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 570.0, - "y": 50.0 - }, - { - "x": 415.0, - "y": 50.0 - }, - { - "x": 415.0, - "y": 180.0 - }, - { - "x": 195.0, - "y": 180.0 - }, - { - "x": 195.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 135.0, - "y": 10.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_CEM" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 25.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "B" - }, - "pin2": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_WEN" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 315.0, - "y": 70.0 - }, - { - "x": 315.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "muSR_WEOVR" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 320.0, - "y": 260.0 - }, - { - "x": 320.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O2" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 180.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "_EOVR" - }, - "name": "unnamedWire#66", - "path": [ - { - "x": 245.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Am2904MSR#0", - "pinName": "_EN" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 235.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "_EC" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 225.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2904MSR#0", - "pinName": "_EZ" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 215.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 170.0, - "y": 45.0 - }, - { - "x": 170.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "B" - }, - "pin2": { - "compName": "not4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 175.0, - "y": 45.0 - }, - { - "x": 175.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#73", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 175.0, - "y": 75.0 - }, - { - "x": 175.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "A1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EZ" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 50.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EC" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A2" - }, - "name": "unnamedWire#76", - "path": [ - { - "x": 75.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "A3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EN" - }, - "name": "unnamedWire#77", - "path": [ - { - "x": 100.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A4" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 125.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 570.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O4" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#80", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 450.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_OEY" - }, - "name": "unnamedWire#82", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#83", - "path": [] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 550.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#85", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y2" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y4" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O1" - }, - "name": "unnamedWire#90", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#91", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O3" - }, - "name": "unnamedWire#92", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "I" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "Am2904RegCTInstrDecode#0", - "pinName": "Y_MUX" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#94", - "path": [ - { - "x": 190.0, - "y": 275.0 - }, - { - "x": 360.0, - "y": 275.0 - }, - { - "x": 360.0, - "y": 225.0 - }, - { - "x": 420.0, - "y": 225.0 - }, - { - "x": 420.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "S0" - }, - "name": "unnamedWire#95", - "path": [ - { - "x": 455.0, - "y": 100.0 - }, - { - "x": 455.0, - "y": 130.0 - }, - { - "x": 435.0, - "y": 130.0 - }, - { - "x": 435.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2904", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "msr": { - "id": "delegating", - "params": { - "delegateTarget": "Am2904MSR#0" - } - }, - "musr": { - "id": "delegating", - "params": { - "delegateTarget": "Am2904muSR#0" - } - } - }, - "atomicHighLevelStates": {} - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json deleted file mode 100644 index 927d41f8..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json +++ /dev/null @@ -1,1936 +0,0 @@ -{ - "width": 80.0, - "height": 75.0, - "interfacePins": [ - { - "location": { - "x": 50.0, - "y": 0.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 60.0, - "y": 0.0 - }, - "name": "COVD_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 70.0, - "y": 0.0 - }, - "name": "COVD_V", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "I", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 70.0 - }, - "name": "MUX", - "logicWidth": 3, - "usage": "INPUT" - }, - { - "location": { - "x": 80.0, - "y": 20.0 - }, - "name": "Q", - "logicWidth": 4, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 30.0 - }, - "name": "Y", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 20.0, - "y": 0.0 - }, - "name": "_EC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 30.0, - "y": 0.0 - }, - "name": "_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 40.0, - "y": 0.0 - }, - "name": "_EOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 0.0 - }, - "name": "_EZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "mu", - "logicWidth": 4, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 170.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 35.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 135.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 45.0, - "y": 340.0 - }, - "params": { - "logicWidth": 3, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 5.0, - "y": 235.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 385.0, - "y": 85.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 19.0, - "y": 224.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 364.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 74.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 74.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 34.0, - "y": 234.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 124.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 74.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 164.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 269.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 369.0, - "y": 94.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 374.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 379.0, - "y": 114.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 29.0, - "y": 284.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 39.0, - "y": 304.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 19.0, - "y": 194.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 79.0, - "y": 254.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 39.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 195.0, - "y": 50.0 - } - }, - { - "id": "dff4_finewe", - "name": "dff4_finewe#0", - "pos": { - "x": 325.0, - "y": 80.0 - } - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 280.0, - "y": 175.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 45.0, - "y": 80.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#1", - "pos": { - "x": 85.0, - "y": 220.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#2", - "pos": { - "x": 90.0, - "y": 30.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#3", - "pos": { - "x": 130.0, - "y": 170.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#4", - "pos": { - "x": 175.0, - "y": 120.0 - } - }, - { - "id": "not4", - "name": "not4#0", - "pos": { - "x": 45.0, - "y": 270.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 40.0, - "y": 190.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "C" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 250.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE4" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 200.0, - "y": 30.0 - }, - { - "x": 305.0, - "y": 30.0 - }, - { - "x": 305.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "mu" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 35.0, - "y": 95.0 - }, - { - "x": 35.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 30.0, - "y": 45.0 - }, - { - "x": 30.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 25.0, - "y": 55.0 - }, - { - "x": 25.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 20.0, - "y": 65.0 - }, - { - "x": 20.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EN" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE3" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 150.0, - "y": 25.0 - }, - { - "x": 310.0, - "y": 25.0 - }, - { - "x": 310.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "MUX" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "I" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 30.0, - "y": 245.0 - }, - { - "x": 30.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 60.0, - "y": 360.0 - }, - { - "x": 60.0, - "y": 335.0 - }, - { - "x": 20.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "Q4" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EC" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 100.0, - "y": 20.0 - }, - { - "x": 190.0, - "y": 20.0 - }, - { - "x": 190.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_1" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_2" - }, - "pin2": { - "compName": "not4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_3" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_4" - }, - "pin2": { - "compName": "not4#0", - "pinName": "Y4" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A1" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 365.0, - "y": 315.0 - }, - { - "x": 25.0, - "y": 315.0 - }, - { - "x": 25.0, - "y": 275.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 370.0, - "y": 320.0 - }, - { - "x": 30.0, - "y": 320.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A3" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 375.0, - "y": 325.0 - }, - { - "x": 35.0, - "y": 325.0 - }, - { - "x": 35.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 380.0, - "y": 330.0 - }, - { - "x": 40.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_4" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 30.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EZ" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE1" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 50.0, - "y": 15.0 - }, - { - "x": 320.0, - "y": 15.0 - }, - { - "x": 320.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_2" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 40.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_3" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 20.0, - "y": 175.0 - }, - { - "x": 40.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "S0" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "I1_1" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 40.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "I1_3" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "I0_4" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "I0_3" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "I0_2" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "I0_1" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 75.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_1" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "I0_1" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 35.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "I0_2" - }, - "pin2": { - "compName": "xor#0", - "pinName": "Y" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "I0_3" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 80.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "I0_4" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 25.0, - "y": 265.0 - }, - { - "x": 25.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "I1_1" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y2" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "I1_3" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y4" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 125.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "S0" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "S0" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 85.0, - "y": 175.0 - }, - { - "x": 85.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "Y4" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "D4" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 235.0, - "y": 155.0 - }, - { - "x": 235.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "D3" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "Y3" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 240.0, - "y": 155.0 - }, - { - "x": 240.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE2" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 235.0, - "y": 55.0 - }, - { - "x": 235.0, - "y": 20.0 - }, - { - "x": 315.0, - "y": 20.0 - }, - { - "x": 315.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "D1" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "Y1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 250.0, - "y": 135.0 - }, - { - "x": 250.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "Y4" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "I1_3" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1_4#3", - "pinName": "Y2" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#3", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "I1_1" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "I0_4" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "Y4" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 140.0, - "y": 165.0 - }, - { - "x": 140.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "I0_3" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 145.0, - "y": 55.0 - }, - { - "x": 145.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "I0_2" - }, - "pin2": { - "compName": "mux1_4#2", - "pinName": "Y2" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 150.0, - "y": 145.0 - }, - { - "x": 150.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "I0_1" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 155.0, - "y": 35.0 - }, - { - "x": 155.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#4", - "pinName": "S0" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 170.0, - "y": 340.0 - }, - { - "x": 170.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#83", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "COVD_EN" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 300.0, - "y": 10.0 - }, - { - "x": 270.0, - "y": 10.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 165.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "COVD_V" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 350.0, - "y": 70.0 - }, - { - "x": 265.0, - "y": 70.0 - }, - { - "x": 265.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#4", - "pinName": "Y2" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 245.0, - "y": 135.0 - }, - { - "x": 245.0, - "y": 145.0 - }, - { - "x": 275.0, - "y": 145.0 - }, - { - "x": 275.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "D2" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 320.0, - "y": 180.0 - }, - { - "x": 320.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 165.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 270.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#93", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "MSR", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "dff4_finewe#0", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json deleted file mode 100644 index 2c007e54..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json +++ /dev/null @@ -1,774 +0,0 @@ -{ - "width": 60.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "I", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 60.0, - "y": 10.0 - }, - "name": "Y000", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 20.0 - }, - "name": "Y001", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 30.0 - }, - "name": "Y010", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 40.0 - }, - "name": "Y011", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 50.0 - }, - "name": "Y100", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 60.0 - }, - "name": "Y101", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 70.0 - }, - "name": "Y110", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 60.0, - "y": 80.0 - }, - "name": "Y111", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 85.0, - "y": 20.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 45.0, - "y": 50.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 120.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 45.0, - "y": 105.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 80.0, - "y": 115.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 80.0, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 110.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 29.0, - "y": 129.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 34.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 39.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 79.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 79.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 19.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 24.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 39.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 74.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 74.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 24.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 40.0, - "y": 20.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "A" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 110.0, - "y": 20.0 - }, - { - "x": 110.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 20.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 40.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 115.0, - "y": 60.0 - }, - { - "x": 115.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y001" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 80.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y000" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 25.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y011" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 35.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y010" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y100" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 70.0, - "y": 115.0 - }, - { - "x": 70.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y101" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y110" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 30.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 75.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 40.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 25.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Y111" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 30.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 20.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 35.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Test\nlogic", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json deleted file mode 100644 index 2949d8da..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json +++ /dev/null @@ -1,1128 +0,0 @@ -{ - "width": 50.0, - "height": 65.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "CINV", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "I", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 30.0 - }, - "name": "M", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "MUX", - "logicWidth": 2, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "OVRRET", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 50.0, - "y": 10.0 - }, - "name": "Q", - "logicWidth": 4, - "usage": "OUTPUT" - }, - { - "location": { - "x": 20.0, - "y": 0.0 - }, - "name": "_EC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 30.0, - "y": 0.0 - }, - "name": "_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 40.0, - "y": 0.0 - }, - "name": "_EOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 0.0 - }, - "name": "_EZ", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 155.0, - "y": 135.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 125.0, - "y": 150.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 125.0, - "y": 130.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 135.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 185.0 - }, - "params": { - "logicWidth": 4, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 5.0, - "y": 95.0 - }, - "params": { - "logicWidth": 2, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 230.0, - "y": 30.0 - }, - "params": { - "logicWidth": 4, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 19.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 59.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 59.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 224.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 114.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 59.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "dff4_finewe", - "name": "dff4_finewe#0", - "pos": { - "x": 185.0, - "y": 25.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 25.0, - "y": 125.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#1", - "pos": { - "x": 65.0, - "y": 75.0 - } - }, - { - "id": "xor", - "name": "xor#0", - "pos": { - "x": 130.0, - "y": 105.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "Q2" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 20.0, - "y": 210.0 - }, - { - "x": 20.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 20.0, - "y": 165.0 - }, - { - "x": 20.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 20.0, - "y": 155.0 - }, - { - "x": 20.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 20.0, - "y": 145.0 - }, - { - "x": 20.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "MUX" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 20.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_4" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I1_3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_2" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "Q3" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I1_1" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_1" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 60.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_2" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "I0_3" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "I0_4" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 20.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "S0" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 20.0, - "y": 95.0 - }, - { - "x": 20.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "B" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 150.0, - "y": 150.0 - }, - { - "x": 150.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "OVRRET" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 115.0, - "y": 300.0 - }, - { - "x": 115.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 225.0, - "y": 175.0 - }, - { - "x": 120.0, - "y": 175.0 - }, - { - "x": 120.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "xor#0", - "pinName": "A" - }, - "name": "unnamedWire#34", - "path": [ - { - "x": 125.0, - "y": 90.0 - }, - { - "x": 125.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "CINV" - }, - "pin2": { - "compName": "xor#0", - "pinName": "B" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 105.0, - "y": 250.0 - }, - { - "x": 105.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "_WE1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EZ" - }, - "name": "unnamedWire#36", - "path": [ - { - "x": 180.0, - "y": 40.0 - }, - { - "x": 180.0, - "y": 5.0 - }, - { - "x": 50.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "C" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 55.0, - "y": 50.0 - }, - { - "x": 55.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE4" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 200.0, - "y": 20.0 - }, - { - "x": 165.0, - "y": 20.0 - }, - { - "x": 165.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "_WE3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EN" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 170.0, - "y": 60.0 - }, - { - "x": 170.0, - "y": 15.0 - }, - { - "x": 150.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 245.0, - "y": 45.0 - }, - { - "x": 245.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EC" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "_WE2" - }, - "name": "unnamedWire#40", - "path": [ - { - "x": 100.0, - "y": 10.0 - }, - { - "x": 175.0, - "y": 10.0 - }, - { - "x": 175.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "D1" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y1" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "xor#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "D2" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 170.0, - "y": 110.0 - }, - { - "x": 170.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "dff4_finewe#0", - "pinName": "D3" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y3" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#1", - "pinName": "Y4" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 115.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff4_finewe#0", - "pinName": "D4" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 180.0, - "y": 145.0 - }, - { - "x": 180.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 115.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 20.0, - "y": 135.0 - }, - { - "x": 20.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "M" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 20.0, - "y": 185.0 - }, - { - "x": 20.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 190.0 - }, - { - "x": 20.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 20.0, - "y": 205.0 - }, - { - "x": 20.0, - "y": 200.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "µSR", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "dff4_finewe#0", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json deleted file mode 100644 index 9a6e0ba7..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json +++ /dev/null @@ -1,1159 +0,0 @@ -{ - "width": 60.0, - "height": 45.0, - "interfacePins": [ - { - "location": { - "x": 40.0, - "y": 0.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 60.0, - "y": 30.0 - }, - "name": "CI", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 30.0, - "y": 0.0 - }, - "name": "D", - "logicWidth": 12, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "Y", - "logicWidth": 12, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "_CC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "_CCEN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 60.0, - "y": 5.0 - }, - "name": "_FULL", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 15.0, - "y": 45.0 - }, - "name": "_MAP", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 40.0, - "y": 45.0 - }, - "name": "_OE", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 45.0 - }, - "name": "_PL", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "_RLD", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 20.0, - "y": 45.0 - }, - "name": "_VECT", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Am2910InstrPLA", - "name": "Am2910InstrPLA#0", - "pos": { - "x": 70.0, - "y": 90.0 - } - }, - { - "id": "Am2910RegCntr", - "name": "Am2910RegCntr#0", - "pos": { - "x": 130.0, - "y": 15.0 - } - }, - { - "id": "Am2910SP", - "name": "Am2910SP#0", - "pos": { - "x": 240.0, - "y": 10.0 - } - }, - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 40.0, - "y": 45.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 10.0, - "y": 60.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 205.0, - "y": 195.0 - }, - "params": 1 - }, - { - "id": "TriStateBuffer", - "name": "TriStateBuffer#0", - "pos": { - "x": 165.0, - "y": 180.0 - }, - "params": { - "logicWidth": 12, - "orientation": "DOWN" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 259.0, - "y": 99.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 224.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 174.0, - "y": 174.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 164.0, - "y": 59.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 149.0, - "y": 9.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 4.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 234.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 199.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 234.0, - "y": 69.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 199.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "dff12", - "name": "dff12#0", - "pos": { - "x": 240.0, - "y": 105.0 - } - }, - { - "id": "inc", - "name": "inc#0", - "pos": { - "x": 240.0, - "y": 140.0 - }, - "params": 12 - }, - { - "id": "nor12", - "name": "nor12#0", - "pos": { - "x": 175.0, - "y": 50.0 - } - }, - { - "id": "ram5_12", - "name": "ram5_12#0", - "pos": { - "x": 240.0, - "y": 55.0 - } - }, - { - "id": "sel4_12", - "name": "sel4_12#0", - "pos": { - "x": 135.0, - "y": 110.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "YD" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "SA" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "YR" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "SB" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "nor12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2910InstrPLA#0", - "pinName": "R\u003d0" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 215.0, - "y": 60.0 - }, - { - "x": 215.0, - "y": 75.0 - }, - { - "x": 85.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "RWE" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "WE" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 105.0, - "y": 95.0 - }, - { - "x": 105.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "RDEC" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "DEC" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 110.0, - "y": 105.0 - }, - { - "x": 110.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "STKI0" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 225.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "STKI1" - }, - "pin2": { - "compName": "Am2910SP#0", - "pinName": "STKI1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 230.0, - "y": 165.0 - }, - { - "x": 230.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "Am2910SP#0", - "pinName": "STKI0" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 225.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "ram5_12#0", - "pinName": "WE" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "sel4_12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "inc#0", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 260.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "ram5_12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "C" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 185.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "YF" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "SC" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "D" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 205.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "B" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "nor12#0", - "pinName": "D" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "D" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "A" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 125.0, - "y": 10.0 - }, - { - "x": 125.0, - "y": 65.0 - }, - { - "x": 145.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_RLD" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "_RLD" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 50.0, - "y": 25.0 - }, - { - "x": 50.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#0", - "pinName": "IN" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Am2910InstrPLA#0", - "pinName": "PASS" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 65.0, - "y": 55.0 - }, - { - "x": 65.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_CC" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "YmuPC" - }, - "pin2": { - "compName": "sel4_12#0", - "pinName": "SD" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_CCEN" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 5.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#33", - "path": [ - { - "x": 35.0, - "y": 70.0 - }, - { - "x": 35.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910SP#0", - "pinName": "_FULL" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_FULL" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff12#0", - "pinName": "C" - }, - "name": "unnamedWire#35", - "path": [ - { - "x": 235.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "Am2910SP#0", - "pinName": "C" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "Am2910RegCntr#0", - "pinName": "C" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff12#0", - "pinName": "D" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "inc#0", - "pinName": "CI" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "CI" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "_PL" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_PL" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 75.0, - "y": 180.0 - }, - { - "x": 50.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "_MAP" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_MAP" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 85.0, - "y": 185.0 - }, - { - "x": 75.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Am2910InstrPLA#0", - "pinName": "_VECT" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_VECT" - }, - "name": "unnamedWire#44", - "path": [ - { - "x": 95.0, - "y": 190.0 - }, - { - "x": 100.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I" - }, - "pin2": { - "compName": "Am2910InstrPLA#0", - "pinName": "I" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 35.0, - "y": 125.0 - }, - { - "x": 35.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "dff12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "ram5_12#0", - "pinName": "C" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "TriStateBuffer#0", - "pinName": "OUT" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_OE" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 200.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "TriStateBuffer#0", - "pinName": "EN" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 230.0, - "y": 190.0 - }, - { - "x": 230.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "ram5_12#0", - "pinName": "D" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Am2910SP#0", - "pinName": "A" - }, - "pin2": { - "compName": "ram5_12#0", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Am2910SP#0", - "pinName": "B" - }, - "pin2": { - "compName": "ram5_12#0", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Am2910RegCntr#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 150.0, - "y": 60.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "Am2910", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "mupc": { - "id": "delegating", - "params": { - "delegateTarget": "dff12#0" - } - }, - "r": { - "id": "delegating", - "params": { - "delegateTarget": "Am2910RegCntr#0" - } - }, - "sp": { - "id": "delegating", - "params": { - "delegateTarget": "Am2910SP#0" - } - }, - "stack": { - "id": "delegating", - "params": { - "delegateTarget": "ram5_12#0" - } - } - }, - "atomicHighLevelStates": {} - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json deleted file mode 100644 index 459bca8d..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 20.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 50.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 44.0, - "y": 24.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#1" - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 45.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 45.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#5" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "and", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json deleted file mode 100644 index b8c98863..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json +++ /dev/null @@ -1,355 +0,0 @@ -{ - "width": 35.0, - "height": 50.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 24.0, - "y": 46.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 71.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 24.0, - "y": 96.5 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 30.0, - "y": 7.5 - } - }, - { - "id": "and", - "name": "and#1", - "pos": { - "x": 30.0, - "y": 32.5 - } - }, - { - "id": "and", - "name": "and#2", - "pos": { - "x": 30.0, - "y": 57.5 - } - }, - { - "id": "and", - "name": "and#3", - "pos": { - "x": 30.0, - "y": 82.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "and#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 25.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "and#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "and#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "and#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "and#2", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "and#3", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 25.0, - "y": 112.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and#3", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "and#2", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and#1", - "pinName": "B" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "and41", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json deleted file mode 100644 index a2b45122..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json +++ /dev/null @@ -1,520 +0,0 @@ -{ - "width": 35.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "C2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "C3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "C4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "and41", - "name": "and41#0", - "pos": { - "x": 15.0, - "y": 137.5 - } - }, - { - "id": "or_4", - "name": "or_4#0", - "pos": { - "x": 35.0, - "y": 37.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A1" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 10.0, - "y": 112.5 - }, - { - "x": 10.0, - "y": 142.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A2" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 137.5 - }, - { - "x": 5.0, - "y": 152.5 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 65.0, - "y": 152.5 - }, - { - "x": 65.0, - "y": 125.0 - }, - { - "x": 25.0, - "y": 125.0 - }, - { - "x": 25.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 60.0, - "y": 162.5 - }, - { - "x": 60.0, - "y": 130.0 - }, - { - "x": 20.0, - "y": 130.0 - }, - { - "x": 20.0, - "y": 102.5 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 55.0, - "y": 172.5 - }, - { - "x": 55.0, - "y": 135.0 - }, - { - "x": 15.0, - "y": 135.0 - }, - { - "x": 15.0, - "y": 112.5 - } - ] - }, - { - "pin1": { - "compName": "or_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 75.0, - "y": 42.5 - }, - { - "x": 75.0, - "y": 12.5 - } - ] - }, - { - "pin1": { - "compName": "or_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 80.0, - "y": 52.5 - }, - { - "x": 80.0, - "y": 37.5 - } - ] - }, - { - "pin1": { - "compName": "or_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "or_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 80.0, - "y": 72.5 - }, - { - "x": 80.0, - "y": 87.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A3" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A4" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 5.0, - "y": 187.5 - }, - { - "x": 5.0, - "y": 172.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "and41#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 10.0, - "y": 212.5 - }, - { - "x": 10.0, - "y": 182.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C1" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 10.0, - "y": 12.5 - }, - { - "x": 10.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C2" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 5.0, - "y": 37.5 - }, - { - "x": 5.0, - "y": 52.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C3" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C4" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 5.0, - "y": 87.5 - }, - { - "x": 5.0, - "y": 72.5 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "or_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 70.0, - "y": 142.5 - }, - { - "x": 70.0, - "y": 120.0 - }, - { - "x": 30.0, - "y": 120.0 - }, - { - "x": 30.0, - "y": 82.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "andor414", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json deleted file mode 100644 index d8d7c36a..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "width": 35.0, - "height": 40.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y00", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y01", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y10", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y11", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 10.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 6.5, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 6.5, - "y": 16.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 36.5, - "y": 61.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 4.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 4.0, - "y": 41.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 31.5, - "y": 66.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 31.5, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 34.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "and", - "name": "and#0", - "pos": { - "x": 40.0, - "y": 2.5 - } - }, - { - "id": "and", - "name": "and#1", - "pos": { - "x": 40.0, - "y": 27.5 - } - }, - { - "id": "and", - "name": "and#2", - "pos": { - "x": 40.0, - "y": 52.5 - } - }, - { - "id": "and", - "name": "and#3", - "pos": { - "x": 40.0, - "y": 77.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "and#0", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 32.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "and#0", - "pinName": "B" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 35.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and#1", - "pinName": "A" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 37.5, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "and#1", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 35.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "and#2", - "pinName": "A" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 32.5, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "and#2", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and#3", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 37.5, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "and#3", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 32.5, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 7.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "and#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y00" - }, - "name": "unnamedWire#20" - }, - { - "pin1": { - "compName": "and#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y01" - }, - "name": "unnamedWire#21" - }, - { - "pin1": { - "compName": "and#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y10" - }, - "name": "unnamedWire#22" - }, - { - "pin1": { - "compName": "and#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y11" - }, - "name": "unnamedWire#23" - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 5.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 7.5, - "y": 62.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 5.0, - "y": 67.5 - }, - { - "x": 32.5, - "y": 67.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "demux2", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json deleted file mode 100644 index 2c771c07..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json +++ /dev/null @@ -1,372 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "_Q", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 120.0, - "y": 20.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 9.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 19.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 94.0, - "y": 64.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 104.0, - "y": 34.0 - }, - "params": 1 - }, - { - "id": "_rsLatch", - "name": "_rsLatch#0", - "pos": { - "x": 40.0, - "y": 70.0 - } - }, - { - "id": "_rsLatch", - "name": "_rsLatch#1", - "pos": { - "x": 120.0, - "y": 45.0 - } - }, - { - "id": "nand3", - "name": "nand3#0", - "pos": { - "x": 40.0, - "y": 30.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#0", - "pinName": "_R" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 10.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "nand3#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#1", - "pinName": "_R" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 105.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "_rsLatch#1", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#13" - }, - { - "pin1": { - "compName": "_rsLatch#1", - "pinName": "_Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_Q" - }, - "name": "unnamedWire#14" - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "B" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 10.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 145.0, - "y": 30.0 - }, - { - "x": 145.0, - "y": 10.0 - }, - { - "x": 20.0, - "y": 10.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#0", - "pinName": "_S" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 20.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "C" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_rsLatch#0", - "pinName": "_Q" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 95.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "nand3#0", - "pinName": "A" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 30.0, - "y": 65.0 - }, - { - "x": 30.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#1", - "pinName": "_S" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 95.0, - "y": 50.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "dff", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "_rsLatch#1", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json deleted file mode 100644 index 188770f4..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json +++ /dev/null @@ -1,1313 +0,0 @@ -{ - "width": 55.0, - "height": 45.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "D", - "logicWidth": 12, - "usage": "INPUT" - }, - { - "location": { - "x": 55.0, - "y": 20.0 - }, - "name": "Q", - "logicWidth": 12, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 70.0, - "y": 45.0 - }, - "params": { - "logicWidth": 12, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 255.0, - "y": 45.0 - }, - "params": { - "logicWidth": 12, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 124.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 124.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 179.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 124.0, - "y": 114.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 124.0, - "y": 144.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 124.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 269.0, - "y": 99.0 - }, - "params": 12 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 179.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 179.0, - "y": 164.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 179.0, - "y": 44.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 179.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#0", - "pos": { - "x": 185.0, - "y": 30.0 - } - }, - { - "id": "dff", - "name": "dff#1", - "pos": { - "x": 185.0, - "y": 60.0 - } - }, - { - "id": "dff", - "name": "dff#10", - "pos": { - "x": 185.0, - "y": 120.0 - } - }, - { - "id": "dff", - "name": "dff#11", - "pos": { - "x": 130.0, - "y": 100.0 - } - }, - { - "id": "dff", - "name": "dff#2", - "pos": { - "x": 130.0, - "y": 10.0 - } - }, - { - "id": "dff", - "name": "dff#3", - "pos": { - "x": 130.0, - "y": 40.0 - } - }, - { - "id": "dff", - "name": "dff#4", - "pos": { - "x": 130.0, - "y": 70.0 - } - }, - { - "id": "dff", - "name": "dff#5", - "pos": { - "x": 185.0, - "y": 150.0 - } - }, - { - "id": "dff", - "name": "dff#6", - "pos": { - "x": 185.0, - "y": 180.0 - } - }, - { - "id": "dff", - "name": "dff#7", - "pos": { - "x": 130.0, - "y": 160.0 - } - }, - { - "id": "dff", - "name": "dff#8", - "pos": { - "x": 130.0, - "y": 130.0 - } - }, - { - "id": "dff", - "name": "dff#9", - "pos": { - "x": 185.0, - "y": 90.0 - } - }, - { - "id": "mux1_12", - "name": "mux1_12#0", - "pos": { - "x": 15.0, - "y": 70.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 125.0, - "y": 5.0 - }, - { - "x": 180.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "dff#11", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#10", - "pinName": "D" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 115.0, - "y": 115.0 - }, - { - "x": 115.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "dff#8", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 110.0, - "y": 135.0 - }, - { - "x": 110.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "dff#5", - "pinName": "D" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 105.0, - "y": 135.0 - }, - { - "x": 105.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "dff#7", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 100.0, - "y": 165.0 - }, - { - "x": 100.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "dff#6", - "pinName": "D" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 95.0, - "y": 155.0 - }, - { - "x": 95.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "mux1_12#0", - "pinName": "S" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 5.0, - "y": 100.0 - }, - { - "x": 5.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "mux1_12#0", - "pinName": "I1" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 5.0, - "y": 175.0 - }, - { - "x": 5.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_12#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#2", - "pinName": "C" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "dff#3", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff#4", - "pinName": "C" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#11", - "pinName": "C" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff#8", - "pinName": "C" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "mux1_12#0", - "pinName": "I0" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 90.0 - }, - { - "x": 10.0, - "y": 205.0 - }, - { - "x": 270.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff#7", - "pinName": "C" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 125.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "dff#6", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 180.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dff#5", - "pinName": "C" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "dff#10", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dff#9", - "pinName": "C" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "C" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "dff#2", - "pinName": "D" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 85.0, - "y": 45.0 - }, - { - "x": 85.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff#0", - "pinName": "C" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "dff#0", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 90.0, - "y": 35.0 - }, - { - "x": 90.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O11" - }, - "pin2": { - "compName": "dff#2", - "pinName": "Q" - }, - "name": "unnamedWire#53", - "path": [ - { - "x": 250.0, - "y": 45.0 - }, - { - "x": 250.0, - "y": 25.0 - }, - { - "x": 170.0, - "y": 25.0 - }, - { - "x": 170.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "dff#0", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O10" - }, - "name": "unnamedWire#54", - "path": [ - { - "x": 240.0, - "y": 35.0 - }, - { - "x": 240.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O9" - }, - "pin2": { - "compName": "dff#3", - "pinName": "Q" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 235.0, - "y": 65.0 - }, - { - "x": 235.0, - "y": 55.0 - }, - { - "x": 170.0, - "y": 55.0 - }, - { - "x": 170.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "dff#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O8" - }, - "name": "unnamedWire#56", - "path": [ - { - "x": 230.0, - "y": 65.0 - }, - { - "x": 230.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "dff#4", - "pinName": "Q" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 170.0, - "y": 85.0 - }, - { - "x": 170.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "dff#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "dff#11", - "pinName": "Q" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 225.0, - "y": 105.0 - }, - { - "x": 225.0, - "y": 115.0 - }, - { - "x": 170.0, - "y": 115.0 - }, - { - "x": 170.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dff#3", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 95.0, - "y": 45.0 - }, - { - "x": 95.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#10", - "pinName": "Q" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 230.0, - "y": 115.0 - }, - { - "x": 230.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "dff#8", - "pinName": "Q" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 235.0, - "y": 125.0 - }, - { - "x": 235.0, - "y": 145.0 - }, - { - "x": 170.0, - "y": 145.0 - }, - { - "x": 170.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "dff#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 240.0, - "y": 155.0 - }, - { - "x": 240.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "dff#7", - "pinName": "Q" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 245.0, - "y": 145.0 - }, - { - "x": 245.0, - "y": 175.0 - }, - { - "x": 170.0, - "y": 175.0 - }, - { - "x": 170.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "dff#6", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 250.0, - "y": 185.0 - }, - { - "x": 250.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "dff#1", - "pinName": "D" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 100.0, - "y": 75.0 - }, - { - "x": 100.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "dff#4", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 105.0, - "y": 75.0 - }, - { - "x": 105.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "dff#9", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n12 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q12", - "q11", - "q10", - "q9", - "q8", - "q7", - "q6", - "q5", - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#6", - "subStateID": "q" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff#3", - "subStateID": "q" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff#0", - "subStateID": "q" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff#2", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#7", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#5", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#8", - "subStateID": "q" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff#10", - "subStateID": "q" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff#11", - "subStateID": "q" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff#9", - "subStateID": "q" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff#4", - "subStateID": "q" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff#1", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json deleted file mode 100644 index 6efc9033..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json +++ /dev/null @@ -1,1601 +0,0 @@ -{ - "width": 45.0, - "height": 55.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 25.0 - }, - "name": "Q", - "logicWidth": 16, - "usage": "TRISTATE" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 50.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 210.0, - "y": 50.0 - }, - "params": { - "logicWidth": 16, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 64.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 64.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 114.0, - "y": 139.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 114.0, - "y": 229.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 114.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 114.0, - "y": 169.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 114.0, - "y": 199.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 64.0, - "y": 89.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 64.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 64.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 64.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 64.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 114.0, - "y": 79.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 114.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#0", - "pos": { - "x": 70.0, - "y": 15.0 - } - }, - { - "id": "dff", - "name": "dff#1", - "pos": { - "x": 120.0, - "y": 35.0 - } - }, - { - "id": "dff", - "name": "dff#10", - "pos": { - "x": 120.0, - "y": 245.0 - } - }, - { - "id": "dff", - "name": "dff#11", - "pos": { - "x": 70.0, - "y": 225.0 - } - }, - { - "id": "dff", - "name": "dff#12", - "pos": { - "x": 70.0, - "y": 195.0 - } - }, - { - "id": "dff", - "name": "dff#13", - "pos": { - "x": 120.0, - "y": 155.0 - } - }, - { - "id": "dff", - "name": "dff#14", - "pos": { - "x": 120.0, - "y": 185.0 - } - }, - { - "id": "dff", - "name": "dff#15", - "pos": { - "x": 70.0, - "y": 165.0 - } - }, - { - "id": "dff", - "name": "dff#2", - "pos": { - "x": 120.0, - "y": 65.0 - } - }, - { - "id": "dff", - "name": "dff#3", - "pos": { - "x": 70.0, - "y": 45.0 - } - }, - { - "id": "dff", - "name": "dff#4", - "pos": { - "x": 120.0, - "y": 95.0 - } - }, - { - "id": "dff", - "name": "dff#5", - "pos": { - "x": 120.0, - "y": 125.0 - } - }, - { - "id": "dff", - "name": "dff#6", - "pos": { - "x": 70.0, - "y": 75.0 - } - }, - { - "id": "dff", - "name": "dff#7", - "pos": { - "x": 70.0, - "y": 105.0 - } - }, - { - "id": "dff", - "name": "dff#8", - "pos": { - "x": 70.0, - "y": 135.0 - } - }, - { - "id": "dff", - "name": "dff#9", - "pos": { - "x": 120.0, - "y": 215.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "dff#0", - "pinName": "D" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 20.0, - "y": 50.0 - }, - { - "x": 20.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "dff#1", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 25.0, - "y": 40.0 - }, - { - "x": 25.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "dff#15", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 45.0, - "y": 170.0 - }, - { - "x": 45.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#14", - "pinName": "D" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 40.0, - "y": 160.0 - }, - { - "x": 40.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "dff#12", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 35.0, - "y": 200.0 - }, - { - "x": 35.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "dff#9", - "pinName": "D" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 30.0, - "y": 180.0 - }, - { - "x": 30.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "dff#11", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 25.0, - "y": 230.0 - }, - { - "x": 25.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "dff#10", - "pinName": "D" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 20.0, - "y": 200.0 - }, - { - "x": 20.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#0", - "pinName": "C" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "C" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "dff#3", - "pinName": "D" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 30.0, - "y": 70.0 - }, - { - "x": 30.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#6", - "pinName": "C" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "dff#7", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff#8", - "pinName": "C" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff#15", - "pinName": "C" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dff#12", - "pinName": "C" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "dff#2", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 35.0, - "y": 70.0 - }, - { - "x": 35.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dff#11", - "pinName": "C" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 65.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "dff#10", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 115.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "dff#9", - "pinName": "C" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "dff#14", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "dff#13", - "pinName": "C" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "dff#5", - "pinName": "C" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "dff#6", - "pinName": "D" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 40.0, - "y": 90.0 - }, - { - "x": 40.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "dff#4", - "pinName": "C" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff#2", - "pinName": "C" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "C" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 65.0, - "y": 10.0 - }, - { - "x": 115.0, - "y": 10.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 10.0, - "y": 30.0 - }, - { - "x": 10.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O15" - }, - "pin2": { - "compName": "dff#0", - "pinName": "Q" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 200.0, - "y": 50.0 - }, - { - "x": 200.0, - "y": 30.0 - }, - { - "x": 110.0, - "y": 30.0 - }, - { - "x": 110.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "dff#4", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "dff#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O14" - }, - "name": "unnamedWire#50", - "path": [ - { - "x": 195.0, - "y": 40.0 - }, - { - "x": 195.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O13" - }, - "pin2": { - "compName": "dff#3", - "pinName": "Q" - }, - "name": "unnamedWire#51", - "path": [ - { - "x": 190.0, - "y": 70.0 - }, - { - "x": 190.0, - "y": 60.0 - }, - { - "x": 110.0, - "y": 60.0 - }, - { - "x": 110.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O12" - }, - "pin2": { - "compName": "dff#2", - "pinName": "Q" - }, - "name": "unnamedWire#52", - "path": [ - { - "x": 185.0, - "y": 80.0 - }, - { - "x": 185.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O11" - }, - "pin2": { - "compName": "dff#6", - "pinName": "Q" - }, - "name": "unnamedWire#53", - "path": [ - { - "x": 110.0, - "y": 90.0 - }, - { - "x": 110.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "dff#4", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O10" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O9" - }, - "pin2": { - "compName": "dff#7", - "pinName": "Q" - }, - "name": "unnamedWire#55", - "path": [ - { - "x": 160.0, - "y": 110.0 - }, - { - "x": 160.0, - "y": 120.0 - }, - { - "x": 110.0, - "y": 120.0 - }, - { - "x": 110.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "dff#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O8" - }, - "name": "unnamedWire#56", - "path": [ - { - "x": 165.0, - "y": 130.0 - }, - { - "x": 165.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "dff#8", - "pinName": "Q" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 170.0, - "y": 130.0 - }, - { - "x": 170.0, - "y": 150.0 - }, - { - "x": 110.0, - "y": 150.0 - }, - { - "x": 110.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "dff#13", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 175.0, - "y": 160.0 - }, - { - "x": 175.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "dff#15", - "pinName": "Q" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 180.0, - "y": 150.0 - }, - { - "x": 180.0, - "y": 180.0 - }, - { - "x": 110.0, - "y": 180.0 - }, - { - "x": 110.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "dff#7", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#14", - "pinName": "Q" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 185.0, - "y": 160.0 - }, - { - "x": 185.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "dff#12", - "pinName": "Q" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 190.0, - "y": 170.0 - }, - { - "x": 190.0, - "y": 210.0 - }, - { - "x": 110.0, - "y": 210.0 - }, - { - "x": 110.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "dff#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 195.0, - "y": 220.0 - }, - { - "x": 195.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "dff#11", - "pinName": "Q" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 200.0, - "y": 190.0 - }, - { - "x": 200.0, - "y": 240.0 - }, - { - "x": 110.0, - "y": 240.0 - }, - { - "x": 110.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "dff#10", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 205.0, - "y": 250.0 - }, - { - "x": 205.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "dff#5", - "pinName": "D" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 60.0, - "y": 120.0 - }, - { - "x": 60.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "dff#8", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 55.0, - "y": 140.0 - }, - { - "x": 55.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "dff#13", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 50.0, - "y": 140.0 - }, - { - "x": 50.0, - "y": 160.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n16 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q16", - "q15", - "q14", - "q13", - "q12", - "q11", - "q10", - "q9", - "q8", - "q7", - "q6", - "q5", - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#10", - "subStateID": "q" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff#7", - "subStateID": "q" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff#4", - "subStateID": "q" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff#6", - "subStateID": "q" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dff#2", - "subStateID": "q" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dff#3", - "subStateID": "q" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dff#1", - "subStateID": "q" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dff#0", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#11", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#9", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#12", - "subStateID": "q" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff#14", - "subStateID": "q" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff#15", - "subStateID": "q" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff#13", - "subStateID": "q" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff#8", - "subStateID": "q" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff#5", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json deleted file mode 100644 index 0d24ad3f..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json +++ /dev/null @@ -1,325 +0,0 @@ -{ - "width": 45.0, - "height": 55.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 25.0 - }, - "name": "Q", - "logicWidth": 16, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "_WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 164.0, - "y": 99.0 - }, - "params": 16 - }, - { - "id": "dff16", - "name": "dff16#0", - "pos": { - "x": 110.0, - "y": 75.0 - } - }, - { - "id": "mux1_16", - "name": "mux1_16#0", - "pos": { - "x": 30.0, - "y": 75.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "mux1_16#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "D" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 95.0, - "y": 125.0 - }, - { - "x": 95.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "dff16#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "C" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 95.0, - "y": 20.0 - }, - { - "x": 95.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_WE" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "S" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I1" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 165.0, - "y": 205.0 - }, - { - "x": 10.0, - "y": 205.0 - }, - { - "x": 10.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I0" - }, - "name": "unnamedWire#68", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n16 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q" - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q1" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q10" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q11" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q12" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q13" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q14" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q15" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q16" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q2" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q3" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q4" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q5" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q6" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q7" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q8" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q9" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json deleted file mode 100644 index 09127e66..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "width": 45.0, - "height": 55.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 45.0, - "y": 25.0 - }, - "name": "Q", - "logicWidth": 16, - "usage": "TRISTATE" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.25, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 164.0, - "y": 99.0 - }, - "params": 16 - }, - { - "id": "dff16", - "name": "dff16#0", - "pos": { - "x": 110.0, - "y": 75.0 - } - }, - { - "id": "mux1_16", - "name": "mux1_16#0", - "pos": { - "x": 30.0, - "y": 75.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "mux1_16#0", - "pinName": "Y" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "D" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 95.0, - "y": 125.0 - }, - { - "x": 95.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "dff16#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "dff16#0", - "pinName": "C" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 95.0, - "y": 20.0 - }, - { - "x": 95.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "S" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I0" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 165.0, - "y": 205.0 - }, - { - "x": 20.0, - "y": 205.0 - }, - { - "x": 20.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "mux1_16#0", - "pinName": "I1" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 10.0, - "y": 100.0 - }, - { - "x": 10.0, - "y": 165.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n16 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q" - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q1" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q10" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q11" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q12" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q13" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q14" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q15" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q16" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q2" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q3" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q4" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q5" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q6" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q7" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q8" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff16#0", - "subStateID": "q9" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json deleted file mode 100644 index cd203617..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json +++ /dev/null @@ -1,742 +0,0 @@ -{ - "width": 35.0, - "height": 60.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Q3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Q4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 104.0, - "y": 184.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 104.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 104.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 169.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 164.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 159.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 154.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#0", - "pos": { - "x": 115.0, - "y": 20.0 - } - }, - { - "id": "dff", - "name": "dff#1", - "pos": { - "x": 115.0, - "y": 70.0 - } - }, - { - "id": "dff", - "name": "dff#2", - "pos": { - "x": 115.0, - "y": 120.0 - } - }, - { - "id": "dff", - "name": "dff#3", - "pos": { - "x": 115.0, - "y": 170.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 55.0, - "y": 60.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#0", - "pinName": "C" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 105.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "dff#0", - "pinName": "D" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 100.0, - "y": 65.0 - }, - { - "x": 100.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 25.0, - "y": 25.0 - }, - { - "x": 25.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 20.0, - "y": 75.0 - }, - { - "x": 20.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 25.0, - "y": 125.0 - }, - { - "x": 25.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "dff#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q1" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "Q" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 25.0, - "y": 175.0 - }, - { - "x": 25.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "dff#2", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q3" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "dff#1", - "pinName": "D" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q4" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "Q" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "dff#2", - "pinName": "D" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 100.0, - "y": 85.0 - }, - { - "x": 100.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "dff#3", - "pinName": "D" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 95.0, - "y": 95.0 - }, - { - "x": 95.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 170.0, - "y": 205.0 - }, - { - "x": 50.0, - "y": 205.0 - }, - { - "x": 50.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 165.0, - "y": 210.0 - }, - { - "x": 45.0, - "y": 210.0 - }, - { - "x": 45.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 160.0, - "y": 215.0 - }, - { - "x": 40.0, - "y": 215.0 - }, - { - "x": 40.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 155.0, - "y": 220.0 - }, - { - "x": 35.0, - "y": 220.0 - }, - { - "x": 35.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "C" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "C" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#2", - "pinName": "C" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 225.0 - }, - { - "x": 20.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 275.0 - }, - { - "x": 10.0, - "y": 65.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n4 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#0", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#1", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#2", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#3", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json deleted file mode 100644 index 005cabe4..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json +++ /dev/null @@ -1,742 +0,0 @@ -{ - "width": 35.0, - "height": 60.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Q3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Q4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "_WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 104.0, - "y": 184.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 104.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 104.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 169.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 164.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 159.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 154.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#0", - "pos": { - "x": 115.0, - "y": 20.0 - } - }, - { - "id": "dff", - "name": "dff#1", - "pos": { - "x": 115.0, - "y": 70.0 - } - }, - { - "id": "dff", - "name": "dff#2", - "pos": { - "x": 115.0, - "y": 120.0 - } - }, - { - "id": "dff", - "name": "dff#3", - "pos": { - "x": 115.0, - "y": 170.0 - } - }, - { - "id": "mux1_4", - "name": "mux1_4#0", - "pos": { - "x": 55.0, - "y": 60.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#0", - "pinName": "C" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 105.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "dff#0", - "pinName": "D" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 100.0, - "y": 65.0 - }, - { - "x": 100.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_1" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 25.0, - "y": 25.0 - }, - { - "x": 25.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_2" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 20.0, - "y": 75.0 - }, - { - "x": 20.0, - "y": 85.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 20.0, - "y": 125.0 - }, - { - "x": 20.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "dff#0", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q1" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "Q" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I0_4" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 25.0, - "y": 175.0 - }, - { - "x": 25.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dff#2", - "pinName": "Q" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q3" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "dff#1", - "pinName": "D" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q4" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "Q" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "dff#2", - "pinName": "D" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 100.0, - "y": 85.0 - }, - { - "x": 100.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "mux1_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "dff#3", - "pinName": "D" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 95.0, - "y": 95.0 - }, - { - "x": 95.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_1" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 170.0, - "y": 205.0 - }, - { - "x": 50.0, - "y": 205.0 - }, - { - "x": 50.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_2" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 165.0, - "y": 210.0 - }, - { - "x": 45.0, - "y": 210.0 - }, - { - "x": 45.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_3" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 160.0, - "y": 215.0 - }, - { - "x": 40.0, - "y": 215.0 - }, - { - "x": 40.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "I1_4" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 155.0, - "y": 220.0 - }, - { - "x": 35.0, - "y": 220.0 - }, - { - "x": 35.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#3", - "pinName": "C" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff#1", - "pinName": "C" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#2", - "pinName": "C" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 225.0 - }, - { - "x": 20.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_WE" - }, - "pin2": { - "compName": "mux1_4#0", - "pinName": "S0" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 275.0 - }, - { - "x": 10.0, - "y": 65.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n4 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#0", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#1", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#2", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#3", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json deleted file mode 100644 index 8c2a5b3b..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json +++ /dev/null @@ -1,859 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D", - "logicWidth": 8, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q", - "logicWidth": 8, - "usage": "TRISTATE" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 160.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 39.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 89.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 39.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 39.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 89.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 89.0, - "y": 44.0 - }, - "params": 1 - }, - { - "id": "dff", - "name": "dff#10", - "pos": { - "x": 95.0, - "y": 60.0 - } - }, - { - "id": "dff", - "name": "dff#11", - "pos": { - "x": 45.0, - "y": 40.0 - } - }, - { - "id": "dff", - "name": "dff#4", - "pos": { - "x": 45.0, - "y": 10.0 - } - }, - { - "id": "dff", - "name": "dff#5", - "pos": { - "x": 95.0, - "y": 90.0 - } - }, - { - "id": "dff", - "name": "dff#6", - "pos": { - "x": 95.0, - "y": 120.0 - } - }, - { - "id": "dff", - "name": "dff#7", - "pos": { - "x": 45.0, - "y": 100.0 - } - }, - { - "id": "dff", - "name": "dff#8", - "pos": { - "x": 45.0, - "y": 70.0 - } - }, - { - "id": "dff", - "name": "dff#9", - "pos": { - "x": 95.0, - "y": 30.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 40.0, - "y": 5.0 - }, - { - "x": 90.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "dff#11", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 30.0, - "y": 45.0 - }, - { - "x": 30.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#10", - "pinName": "D" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 25.0, - "y": 70.0 - }, - { - "x": 25.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "dff#8", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 25.0, - "y": 75.0 - }, - { - "x": 25.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "dff#5", - "pinName": "D" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 25.0, - "y": 90.0 - }, - { - "x": 25.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "dff#7", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 25.0, - "y": 105.0 - }, - { - "x": 25.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "dff#6", - "pinName": "D" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 20.0, - "y": 110.0 - }, - { - "x": 20.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff#11", - "pinName": "C" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff#8", - "pinName": "C" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff#7", - "pinName": "C" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 40.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "dff#6", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 90.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dff#5", - "pinName": "C" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "dff#10", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dff#9", - "pinName": "C" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff#4", - "pinName": "C" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "dff#4", - "pinName": "Q" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 155.0, - "y": 40.0 - }, - { - "x": 155.0, - "y": 25.0 - }, - { - "x": 85.0, - "y": 25.0 - }, - { - "x": 85.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "dff#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 150.0, - "y": 35.0 - }, - { - "x": 150.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "dff#11", - "pinName": "Q" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 145.0, - "y": 60.0 - }, - { - "x": 145.0, - "y": 55.0 - }, - { - "x": 85.0, - "y": 55.0 - }, - { - "x": 85.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "dff#10", - "pinName": "Q" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 140.0, - "y": 70.0 - }, - { - "x": 140.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "dff#8", - "pinName": "Q" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 140.0, - "y": 80.0 - }, - { - "x": 140.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "dff#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 140.0, - "y": 95.0 - }, - { - "x": 140.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "dff#7", - "pinName": "Q" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 140.0, - "y": 100.0 - }, - { - "x": 140.0, - "y": 115.0 - }, - { - "x": 85.0, - "y": 115.0 - }, - { - "x": 85.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dff#6", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 150.0, - "y": 125.0 - }, - { - "x": 150.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "dff#4", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 15.0 - }, - { - "x": 20.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "dff#9", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 25.0, - "y": 50.0 - }, - { - "x": 25.0, - "y": 35.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n8 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q8", - "q7", - "q6", - "q5", - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff#6", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff#7", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff#5", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff#8", - "subStateID": "q" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff#10", - "subStateID": "q" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff#11", - "subStateID": "q" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff#9", - "subStateID": "q" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff#4", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json deleted file mode 100644 index e1f37bc6..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json +++ /dev/null @@ -1,3563 +0,0 @@ -{ - "width": 25.0, - "height": 165.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "D", - "logicWidth": 80, - "usage": "INPUT" - }, - { - "location": { - "x": 25.0, - "y": 85.0 - }, - "name": "Q", - "logicWidth": 80, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 15.0, - "y": 30.0 - }, - "params": { - "logicWidth": 80, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 90.0, - "y": 750.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#10", - "pos": { - "x": 30.0, - "y": 670.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#11", - "pos": { - "x": 30.0, - "y": 750.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#12", - "pos": { - "x": 90.0, - "y": 510.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#13", - "pos": { - "x": 90.0, - "y": 590.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#14", - "pos": { - "x": 90.0, - "y": 110.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#15", - "pos": { - "x": 90.0, - "y": 430.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#16", - "pos": { - "x": 90.0, - "y": 190.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#17", - "pos": { - "x": 90.0, - "y": 350.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#18", - "pos": { - "x": 90.0, - "y": 270.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#19", - "pos": { - "x": 90.0, - "y": 670.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 30.0, - "y": 30.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#20", - "pos": { - "x": 90.0, - "y": 30.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#21", - "pos": { - "x": 105.0, - "y": 30.0 - }, - "params": { - "logicWidth": 80, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 30.0, - "y": 110.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 30.0, - "y": 190.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#5", - "pos": { - "x": 30.0, - "y": 270.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#6", - "pos": { - "x": 30.0, - "y": 350.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#7", - "pos": { - "x": 30.0, - "y": 430.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#8", - "pos": { - "x": 30.0, - "y": 510.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#9", - "pos": { - "x": 30.0, - "y": 590.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 44.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 44.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 44.0, - "y": 214.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 44.0, - "y": 294.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 44.0, - "y": 454.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 44.0, - "y": 374.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 44.0, - "y": 614.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 44.0, - "y": 534.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 44.0, - "y": 694.0 - }, - "params": 1 - }, - { - "id": "dff8", - "name": "dff8#0", - "pos": { - "x": 50.0, - "y": 770.0 - } - }, - { - "id": "dff8", - "name": "dff8#1", - "pos": { - "x": 50.0, - "y": 690.0 - } - }, - { - "id": "dff8", - "name": "dff8#2", - "pos": { - "x": 50.0, - "y": 610.0 - } - }, - { - "id": "dff8", - "name": "dff8#3", - "pos": { - "x": 50.0, - "y": 530.0 - } - }, - { - "id": "dff8", - "name": "dff8#4", - "pos": { - "x": 50.0, - "y": 450.0 - } - }, - { - "id": "dff8", - "name": "dff8#5", - "pos": { - "x": 50.0, - "y": 370.0 - } - }, - { - "id": "dff8", - "name": "dff8#6", - "pos": { - "x": 50.0, - "y": 290.0 - } - }, - { - "id": "dff8", - "name": "dff8#7", - "pos": { - "x": 50.0, - "y": 210.0 - } - }, - { - "id": "dff8", - "name": "dff8#8", - "pos": { - "x": 50.0, - "y": 130.0 - } - }, - { - "id": "dff8", - "name": "dff8#9", - "pos": { - "x": 50.0, - "y": 50.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O79" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O78" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O69" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O59" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O3" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O58" - }, - "name": "unnamedWire#101", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O57" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O1" - }, - "name": "unnamedWire#102", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O56" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O55" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O7" - }, - "name": "unnamedWire#104", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O54" - }, - "name": "unnamedWire#105", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O53" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O5" - }, - "name": "unnamedWire#106", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O52" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O51" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O3" - }, - "name": "unnamedWire#108", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O50" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O68" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O49" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O1" - }, - "name": "unnamedWire#110", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O48" - }, - "name": "unnamedWire#111", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O7" - }, - "name": "unnamedWire#112", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O46" - }, - "name": "unnamedWire#113", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O5" - }, - "name": "unnamedWire#114", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O44" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O3" - }, - "name": "unnamedWire#116", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O42" - }, - "name": "unnamedWire#117", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O1" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O40" - }, - "name": "unnamedWire#119", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O67" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O39" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O7" - }, - "name": "unnamedWire#120", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O38" - }, - "name": "unnamedWire#121", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O37" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O5" - }, - "name": "unnamedWire#122", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O36" - }, - "name": "unnamedWire#123", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O35" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O3" - }, - "name": "unnamedWire#124", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O34" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O33" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O1" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O32" - }, - "name": "unnamedWire#127", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O31" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O7" - }, - "name": "unnamedWire#128", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O30" - }, - "name": "unnamedWire#129", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O66" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O29" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O5" - }, - "name": "unnamedWire#130", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O28" - }, - "name": "unnamedWire#131", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O27" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O3" - }, - "name": "unnamedWire#132", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O26" - }, - "name": "unnamedWire#133", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O25" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O1" - }, - "name": "unnamedWire#134", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O24" - }, - "name": "unnamedWire#135", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O23" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O7" - }, - "name": "unnamedWire#136", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O22" - }, - "name": "unnamedWire#137", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O21" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O5" - }, - "name": "unnamedWire#138", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O20" - }, - "name": "unnamedWire#139", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O65" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O19" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O3" - }, - "name": "unnamedWire#140", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O18" - }, - "name": "unnamedWire#141", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O17" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O1" - }, - "name": "unnamedWire#142", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O16" - }, - "name": "unnamedWire#143", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O7" - }, - "name": "unnamedWire#144", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O14" - }, - "name": "unnamedWire#145", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O5" - }, - "name": "unnamedWire#146", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O12" - }, - "name": "unnamedWire#147", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O3" - }, - "name": "unnamedWire#148", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O10" - }, - "name": "unnamedWire#149", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O64" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O1" - }, - "name": "unnamedWire#150", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O8" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "name": "unnamedWire#152", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O6" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "name": "unnamedWire#154", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O4" - }, - "name": "unnamedWire#155", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "name": "unnamedWire#156", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O2" - }, - "name": "unnamedWire#157", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "name": "unnamedWire#158", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O0" - }, - "name": "unnamedWire#159", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O63" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O7" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#9", - "pinName": "D" - }, - "name": "unnamedWire#160", - "path": [] - }, - { - "pin1": { - "compName": "dff8#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "I" - }, - "name": "unnamedWire#161", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#8", - "pinName": "D" - }, - "name": "unnamedWire#162", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#7", - "pinName": "D" - }, - "name": "unnamedWire#163", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#6", - "pinName": "D" - }, - "name": "unnamedWire#164", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#5", - "pinName": "D" - }, - "name": "unnamedWire#165", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#4", - "pinName": "D" - }, - "name": "unnamedWire#166", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#3", - "pinName": "D" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#2", - "pinName": "D" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#1", - "pinName": "D" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O62" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#0", - "pinName": "D" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#0", - "pinName": "Q" - }, - "name": "unnamedWire#171", - "path": [] - }, - { - "pin1": { - "compName": "dff8#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "I" - }, - "name": "unnamedWire#172", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#2", - "pinName": "Q" - }, - "name": "unnamedWire#173", - "path": [] - }, - { - "pin1": { - "compName": "dff8#3", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "I" - }, - "name": "unnamedWire#174", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#4", - "pinName": "Q" - }, - "name": "unnamedWire#175", - "path": [] - }, - { - "pin1": { - "compName": "dff8#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "I" - }, - "name": "unnamedWire#176", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#6", - "pinName": "Q" - }, - "name": "unnamedWire#177", - "path": [] - }, - { - "pin1": { - "compName": "dff8#7", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "I" - }, - "name": "unnamedWire#178", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "I" - }, - "pin2": { - "compName": "dff8#8", - "pinName": "Q" - }, - "name": "unnamedWire#179", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O61" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O5" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#180", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "I" - }, - "name": "unnamedWire#181", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#182", - "path": [ - { - "x": 45.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dff8#9", - "pinName": "C" - }, - "name": "unnamedWire#183", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dff8#8", - "pinName": "C" - }, - "name": "unnamedWire#184", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#185", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#186", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dff8#7", - "pinName": "C" - }, - "name": "unnamedWire#187", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#188", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dff8#6", - "pinName": "C" - }, - "name": "unnamedWire#189", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O60" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#190", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dff8#5", - "pinName": "C" - }, - "name": "unnamedWire#191", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#192", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dff8#4", - "pinName": "C" - }, - "name": "unnamedWire#193", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#194", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dff8#3", - "pinName": "C" - }, - "name": "unnamedWire#195", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#196", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dff8#2", - "pinName": "C" - }, - "name": "unnamedWire#197", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#198", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff8#1", - "pinName": "C" - }, - "name": "unnamedWire#199", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O77" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O59" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dff8#0", - "pinName": "C" - }, - "name": "unnamedWire#200", - "path": [ - { - "x": 45.0, - "y": 775.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O58" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O57" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O56" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O55" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O7" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O54" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O53" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O5" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O52" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O51" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O3" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O50" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O76" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O49" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O1" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O48" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O7" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O46" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O5" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O44" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O3" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O42" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O1" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O40" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O75" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O39" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O7" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O38" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O37" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O5" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O36" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O35" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O3" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O34" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O33" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O1" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O32" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O31" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O7" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O30" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O74" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O29" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O5" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O28" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O27" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O3" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O26" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O25" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O1" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O24" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O23" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O7" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O22" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O21" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O5" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O20" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O73" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O19" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O3" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O18" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O17" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O1" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O16" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O7" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O5" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O3" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "name": "unnamedWire#69", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O72" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O1" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "name": "unnamedWire#71", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O7" - }, - "name": "unnamedWire#72", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "name": "unnamedWire#73", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O5" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O3" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O1" - }, - "name": "unnamedWire#78", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "name": "unnamedWire#79", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O71" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O79" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O7" - }, - "name": "unnamedWire#80", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O78" - }, - "name": "unnamedWire#81", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O77" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O5" - }, - "name": "unnamedWire#82", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O76" - }, - "name": "unnamedWire#83", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O75" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O3" - }, - "name": "unnamedWire#84", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O74" - }, - "name": "unnamedWire#85", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O73" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O1" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O72" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O71" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O7" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O70" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O70" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O69" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O5" - }, - "name": "unnamedWire#90", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O68" - }, - "name": "unnamedWire#91", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O67" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O3" - }, - "name": "unnamedWire#92", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O66" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O65" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O1" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O64" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O63" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O7" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O62" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O61" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O5" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O60" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D flip flop\n80 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q80-73", - "q72-65", - "q64-57", - "q56-49", - "q48-41", - "q40-33", - "q32-25", - "q24-17", - "q16-9", - "q8-1" - ], - "vectorPartLengthes": [ - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q1" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q2" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q3" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q4" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q5" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q6" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q7" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q8" - } - }, - "q16-9": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q" - } - }, - "q17": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q1" - } - }, - "q18": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q2" - } - }, - "q19": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q3" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q2" - } - }, - "q20": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q4" - } - }, - "q21": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q5" - } - }, - "q22": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q6" - } - }, - "q23": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q7" - } - }, - "q24": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q8" - } - }, - "q24-17": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#2", - "subStateID": "q" - } - }, - "q25": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q1" - } - }, - "q26": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q2" - } - }, - "q27": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q3" - } - }, - "q28": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q4" - } - }, - "q29": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q5" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q3" - } - }, - "q30": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q6" - } - }, - "q31": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q7" - } - }, - "q32": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q8" - } - }, - "q32-25": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#3", - "subStateID": "q" - } - }, - "q33": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q1" - } - }, - "q34": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q2" - } - }, - "q35": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q3" - } - }, - "q36": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q4" - } - }, - "q37": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q5" - } - }, - "q38": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q6" - } - }, - "q39": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q7" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q4" - } - }, - "q40": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q8" - } - }, - "q40-33": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#4", - "subStateID": "q" - } - }, - "q41": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q1" - } - }, - "q42": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q2" - } - }, - "q43": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q3" - } - }, - "q44": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q4" - } - }, - "q45": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q5" - } - }, - "q46": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q6" - } - }, - "q47": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q7" - } - }, - "q48": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q8" - } - }, - "q48-41": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#5", - "subStateID": "q" - } - }, - "q49": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q1" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q5" - } - }, - "q50": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q2" - } - }, - "q51": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q3" - } - }, - "q52": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q4" - } - }, - "q53": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q5" - } - }, - "q54": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q6" - } - }, - "q55": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q7" - } - }, - "q56": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q8" - } - }, - "q56-49": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#6", - "subStateID": "q" - } - }, - "q57": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q1" - } - }, - "q58": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q2" - } - }, - "q59": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q3" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q6" - } - }, - "q60": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q4" - } - }, - "q61": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q5" - } - }, - "q62": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q6" - } - }, - "q63": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q7" - } - }, - "q64": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q8" - } - }, - "q64-57": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#7", - "subStateID": "q" - } - }, - "q65": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q1" - } - }, - "q66": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q2" - } - }, - "q67": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q3" - } - }, - "q68": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q4" - } - }, - "q69": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q5" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q7" - } - }, - "q70": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q6" - } - }, - "q71": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q7" - } - }, - "q72": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q8" - } - }, - "q72-65": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#8", - "subStateID": "q" - } - }, - "q73": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q1" - } - }, - "q74": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q2" - } - }, - "q75": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q3" - } - }, - "q76": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q4" - } - }, - "q77": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q5" - } - }, - "q78": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q6" - } - }, - "q79": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q7" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q8" - } - }, - "q8-1": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#0", - "subStateID": "q" - } - }, - "q80": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q8" - } - }, - "q80-73": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#9", - "subStateID": "q" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dff8#1", - "subStateID": "q1" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json deleted file mode 100644 index 3884fc0b..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json +++ /dev/null @@ -1,267 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "E", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "_Q", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 15.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 34.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "_rsLatch", - "name": "_rsLatch#0", - "pos": { - "x": 45.0, - "y": 7.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "E" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 5.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 35.0, - "y": 25.0 - }, - { - "x": 10.0, - "y": 25.0 - }, - { - "x": 10.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_rsLatch#0", - "pinName": "_S" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_rsLatch#0", - "pinName": "_R" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 40.0, - "y": 37.5 - }, - { - "x": 40.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "_rsLatch#0", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "_rsLatch#0", - "pinName": "_Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_Q" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "dlatch", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "delegating", - "params": { - "delegateTarget": "_rsLatch#0", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json deleted file mode 100644 index 87f53700..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json +++ /dev/null @@ -1,405 +0,0 @@ -{ - "width": 35.0, - "height": 50.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Q1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Q3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Q4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 14.0, - "y": 46.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 14.0, - "y": 71.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 14.0, - "y": 96.5 - }, - "params": 1 - }, - { - "id": "dlatch", - "name": "dlatch#0", - "pos": { - "x": 30.0, - "y": 7.5 - } - }, - { - "id": "dlatch", - "name": "dlatch#1", - "pos": { - "x": 30.0, - "y": 32.5 - } - }, - { - "id": "dlatch", - "name": "dlatch#2", - "pos": { - "x": 30.0, - "y": 57.5 - } - }, - { - "id": "dlatch", - "name": "dlatch#3", - "pos": { - "x": 30.0, - "y": 82.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 15.0, - "y": 112.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#3", - "pinName": "E" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "dlatch#3", - "pinName": "D" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#0", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q1" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#1", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q2" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#2", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q3" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#3", - "pinName": "Q" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q4" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#2", - "pinName": "E" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#1", - "pinName": "E" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#0", - "pinName": "E" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 15.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "dlatch#0", - "pinName": "D" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "dlatch#1", - "pinName": "D" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "dlatch#2", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "dlatch4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#0", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#1", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#2", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#3", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json deleted file mode 100644 index c871a951..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json +++ /dev/null @@ -1,859 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "D", - "logicWidth": 8, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "E", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Q", - "logicWidth": 8, - "usage": "TRISTATE" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 160.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 39.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 89.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 39.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 39.0, - "y": 84.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 89.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 89.0, - "y": 44.0 - }, - "params": 1 - }, - { - "id": "dlatch", - "name": "dlatch#10", - "pos": { - "x": 95.0, - "y": 60.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#11", - "pos": { - "x": 45.0, - "y": 40.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#4", - "pos": { - "x": 45.0, - "y": 10.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#5", - "pos": { - "x": 95.0, - "y": 90.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#6", - "pos": { - "x": 95.0, - "y": 120.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#7", - "pos": { - "x": 45.0, - "y": 100.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#8", - "pos": { - "x": 45.0, - "y": 70.0 - } - }, - { - "id": "dlatch", - "name": "dlatch#9", - "pos": { - "x": 95.0, - "y": 30.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 40.0, - "y": 5.0 - }, - { - "x": 90.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "E" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#11", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 30.0, - "y": 45.0 - }, - { - "x": 30.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "dlatch#10", - "pinName": "D" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 25.0, - "y": 70.0 - }, - { - "x": 25.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#8", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 25.0, - "y": 75.0 - }, - { - "x": 25.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "dlatch#5", - "pinName": "D" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 25.0, - "y": 90.0 - }, - { - "x": 25.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#7", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 25.0, - "y": 105.0 - }, - { - "x": 25.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "dlatch#6", - "pinName": "D" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 20.0, - "y": 110.0 - }, - { - "x": 20.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#11", - "pinName": "E" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#8", - "pinName": "E" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#7", - "pinName": "E" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 40.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#6", - "pinName": "E" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 90.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#5", - "pinName": "E" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "dlatch#10", - "pinName": "E" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#9", - "pinName": "E" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dlatch#4", - "pinName": "E" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "dlatch#4", - "pinName": "Q" - }, - "name": "unnamedWire#57", - "path": [ - { - "x": 155.0, - "y": 40.0 - }, - { - "x": 155.0, - "y": 25.0 - }, - { - "x": 85.0, - "y": 25.0 - }, - { - "x": 85.0, - "y": 15.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 150.0, - "y": 35.0 - }, - { - "x": 150.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "dlatch#11", - "pinName": "Q" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 145.0, - "y": 60.0 - }, - { - "x": 145.0, - "y": 55.0 - }, - { - "x": 85.0, - "y": 55.0 - }, - { - "x": 85.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "dlatch#10", - "pinName": "Q" - }, - "name": "unnamedWire#60", - "path": [ - { - "x": 140.0, - "y": 70.0 - }, - { - "x": 140.0, - "y": 65.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "dlatch#8", - "pinName": "Q" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 140.0, - "y": 80.0 - }, - { - "x": 140.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 85.0 - }, - { - "x": 85.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 140.0, - "y": 95.0 - }, - { - "x": 140.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "dlatch#7", - "pinName": "Q" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 140.0, - "y": 100.0 - }, - { - "x": 140.0, - "y": 115.0 - }, - { - "x": 85.0, - "y": 115.0 - }, - { - "x": 85.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#6", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 150.0, - "y": 125.0 - }, - { - "x": 150.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "dlatch#4", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 15.0 - }, - { - "x": 20.0, - "y": 40.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "dlatch#9", - "pinName": "D" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 25.0, - "y": 50.0 - }, - { - "x": 25.0, - "y": 35.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D latch\n8 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q8", - "q7", - "q6", - "q5", - "q4", - "q3", - "q2", - "q1" - ], - "vectorPartLengthes": [ - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#6", - "subStateID": "q" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#7", - "subStateID": "q" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#5", - "subStateID": "q" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#8", - "subStateID": "q" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#10", - "subStateID": "q" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#11", - "subStateID": "q" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#9", - "subStateID": "q" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch#4", - "subStateID": "q" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json deleted file mode 100644 index d46c7843..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json +++ /dev/null @@ -1,3563 +0,0 @@ -{ - "width": 25.0, - "height": 165.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "D", - "logicWidth": 80, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "E", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 25.0, - "y": 85.0 - }, - "name": "Q", - "logicWidth": 80, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 15.0, - "y": 30.0 - }, - "params": { - "logicWidth": 80, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 90.0, - "y": 750.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#10", - "pos": { - "x": 30.0, - "y": 670.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#11", - "pos": { - "x": 30.0, - "y": 750.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#12", - "pos": { - "x": 90.0, - "y": 510.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#13", - "pos": { - "x": 90.0, - "y": 590.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#14", - "pos": { - "x": 90.0, - "y": 110.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#15", - "pos": { - "x": 90.0, - "y": 430.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#16", - "pos": { - "x": 90.0, - "y": 190.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#17", - "pos": { - "x": 90.0, - "y": 350.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#18", - "pos": { - "x": 90.0, - "y": 270.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#19", - "pos": { - "x": 90.0, - "y": 670.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 30.0, - "y": 30.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#20", - "pos": { - "x": 90.0, - "y": 30.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#21", - "pos": { - "x": 105.0, - "y": 30.0 - }, - "params": { - "logicWidth": 80, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#3", - "pos": { - "x": 30.0, - "y": 110.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#4", - "pos": { - "x": 30.0, - "y": 190.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#5", - "pos": { - "x": 30.0, - "y": 270.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#6", - "pos": { - "x": 30.0, - "y": 350.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#7", - "pos": { - "x": 30.0, - "y": 430.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#8", - "pos": { - "x": 30.0, - "y": 510.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "Splitter", - "name": "Splitter#9", - "pos": { - "x": 30.0, - "y": 590.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 44.0, - "y": 54.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 44.0, - "y": 134.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 44.0, - "y": 214.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 44.0, - "y": 294.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 44.0, - "y": 454.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 44.0, - "y": 374.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 44.0, - "y": 614.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 44.0, - "y": 534.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 44.0, - "y": 694.0 - }, - "params": 1 - }, - { - "id": "dlatch8", - "name": "dlatch8#0", - "pos": { - "x": 50.0, - "y": 770.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#1", - "pos": { - "x": 50.0, - "y": 690.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#2", - "pos": { - "x": 50.0, - "y": 610.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#3", - "pos": { - "x": 50.0, - "y": 530.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#4", - "pos": { - "x": 50.0, - "y": 450.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#5", - "pos": { - "x": 50.0, - "y": 370.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#6", - "pos": { - "x": 50.0, - "y": 290.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#7", - "pos": { - "x": 50.0, - "y": 210.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#8", - "pos": { - "x": 50.0, - "y": 130.0 - } - }, - { - "id": "dlatch8", - "name": "dlatch8#9", - "pos": { - "x": 50.0, - "y": 50.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O79" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O78" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O69" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O5" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O59" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O3" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O58" - }, - "name": "unnamedWire#101", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O57" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O1" - }, - "name": "unnamedWire#102", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O56" - }, - "name": "unnamedWire#103", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O55" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O7" - }, - "name": "unnamedWire#104", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O54" - }, - "name": "unnamedWire#105", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O53" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O5" - }, - "name": "unnamedWire#106", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O52" - }, - "name": "unnamedWire#107", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O51" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O3" - }, - "name": "unnamedWire#108", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O50" - }, - "name": "unnamedWire#109", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O68" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O49" - }, - "pin2": { - "compName": "Splitter#18", - "pinName": "O1" - }, - "name": "unnamedWire#110", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O48" - }, - "name": "unnamedWire#111", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O7" - }, - "name": "unnamedWire#112", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O46" - }, - "name": "unnamedWire#113", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O5" - }, - "name": "unnamedWire#114", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O44" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O3" - }, - "name": "unnamedWire#116", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O42" - }, - "name": "unnamedWire#117", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "O1" - }, - "name": "unnamedWire#118", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#17", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O40" - }, - "name": "unnamedWire#119", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O67" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O3" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O39" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O7" - }, - "name": "unnamedWire#120", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O38" - }, - "name": "unnamedWire#121", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O37" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O5" - }, - "name": "unnamedWire#122", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O36" - }, - "name": "unnamedWire#123", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O35" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O3" - }, - "name": "unnamedWire#124", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O34" - }, - "name": "unnamedWire#125", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O33" - }, - "pin2": { - "compName": "Splitter#15", - "pinName": "O1" - }, - "name": "unnamedWire#126", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O32" - }, - "name": "unnamedWire#127", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O31" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O7" - }, - "name": "unnamedWire#128", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O30" - }, - "name": "unnamedWire#129", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O66" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O29" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O5" - }, - "name": "unnamedWire#130", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O28" - }, - "name": "unnamedWire#131", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O27" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O3" - }, - "name": "unnamedWire#132", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O26" - }, - "name": "unnamedWire#133", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O25" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "O1" - }, - "name": "unnamedWire#134", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#12", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O24" - }, - "name": "unnamedWire#135", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O23" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O7" - }, - "name": "unnamedWire#136", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O22" - }, - "name": "unnamedWire#137", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O21" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O5" - }, - "name": "unnamedWire#138", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O20" - }, - "name": "unnamedWire#139", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O65" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O1" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O19" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O3" - }, - "name": "unnamedWire#140", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O18" - }, - "name": "unnamedWire#141", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O17" - }, - "pin2": { - "compName": "Splitter#13", - "pinName": "O1" - }, - "name": "unnamedWire#142", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O16" - }, - "name": "unnamedWire#143", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O7" - }, - "name": "unnamedWire#144", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O14" - }, - "name": "unnamedWire#145", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O5" - }, - "name": "unnamedWire#146", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O12" - }, - "name": "unnamedWire#147", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O3" - }, - "name": "unnamedWire#148", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O10" - }, - "name": "unnamedWire#149", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O64" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "O1" - }, - "name": "unnamedWire#150", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#19", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O8" - }, - "name": "unnamedWire#151", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "name": "unnamedWire#152", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O6" - }, - "name": "unnamedWire#153", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "name": "unnamedWire#154", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O4" - }, - "name": "unnamedWire#155", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "name": "unnamedWire#156", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O2" - }, - "name": "unnamedWire#157", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "name": "unnamedWire#158", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O0" - }, - "name": "unnamedWire#159", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O63" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O7" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#9", - "pinName": "D" - }, - "name": "unnamedWire#160", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#9", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "I" - }, - "name": "unnamedWire#161", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#8", - "pinName": "D" - }, - "name": "unnamedWire#162", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#7", - "pinName": "D" - }, - "name": "unnamedWire#163", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#6", - "pinName": "D" - }, - "name": "unnamedWire#164", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#5", - "pinName": "D" - }, - "name": "unnamedWire#165", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#4", - "pinName": "D" - }, - "name": "unnamedWire#166", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#3", - "pinName": "D" - }, - "name": "unnamedWire#167", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#2", - "pinName": "D" - }, - "name": "unnamedWire#168", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#1", - "pinName": "D" - }, - "name": "unnamedWire#169", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O62" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#0", - "pinName": "D" - }, - "name": "unnamedWire#170", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#0", - "pinName": "Q" - }, - "name": "unnamedWire#171", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#1", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#19", - "pinName": "I" - }, - "name": "unnamedWire#172", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#13", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#2", - "pinName": "Q" - }, - "name": "unnamedWire#173", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#3", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#12", - "pinName": "I" - }, - "name": "unnamedWire#174", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#15", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#4", - "pinName": "Q" - }, - "name": "unnamedWire#175", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#5", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#17", - "pinName": "I" - }, - "name": "unnamedWire#176", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#18", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#6", - "pinName": "Q" - }, - "name": "unnamedWire#177", - "path": [] - }, - { - "pin1": { - "compName": "dlatch8#7", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "I" - }, - "name": "unnamedWire#178", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "I" - }, - "pin2": { - "compName": "dlatch8#8", - "pinName": "Q" - }, - "name": "unnamedWire#179", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O61" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O5" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#180", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Q" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "I" - }, - "name": "unnamedWire#181", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "E" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#182", - "path": [ - { - "x": 45.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#9", - "pinName": "E" - }, - "name": "unnamedWire#183", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#8", - "pinName": "E" - }, - "name": "unnamedWire#184", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#185", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#186", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#7", - "pinName": "E" - }, - "name": "unnamedWire#187", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#188", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#6", - "pinName": "E" - }, - "name": "unnamedWire#189", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O60" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#190", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#5", - "pinName": "E" - }, - "name": "unnamedWire#191", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#192", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#4", - "pinName": "E" - }, - "name": "unnamedWire#193", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#194", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#3", - "pinName": "E" - }, - "name": "unnamedWire#195", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#196", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#2", - "pinName": "E" - }, - "name": "unnamedWire#197", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#198", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#1", - "pinName": "E" - }, - "name": "unnamedWire#199", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O77" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O59" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O3" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dlatch8#0", - "pinName": "E" - }, - "name": "unnamedWire#200", - "path": [ - { - "x": 45.0, - "y": 775.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O58" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O57" - }, - "pin2": { - "compName": "Splitter#4", - "pinName": "O1" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#4", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O56" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O55" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O7" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O54" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O53" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O5" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O52" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O51" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O3" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O50" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O76" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O49" - }, - "pin2": { - "compName": "Splitter#5", - "pinName": "O1" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#5", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O48" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O47" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O7" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O46" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O45" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O5" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O44" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O43" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O3" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O42" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O41" - }, - "pin2": { - "compName": "Splitter#6", - "pinName": "O1" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#6", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O40" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O75" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O39" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O7" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O38" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O37" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O5" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O36" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O35" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O3" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O34" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O33" - }, - "pin2": { - "compName": "Splitter#7", - "pinName": "O1" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#7", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O32" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O31" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O7" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O30" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O74" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O29" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O5" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O28" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O27" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O3" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O26" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O25" - }, - "pin2": { - "compName": "Splitter#8", - "pinName": "O1" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#8", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O24" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O23" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O7" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O22" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O21" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O5" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O20" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O73" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O19" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O3" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O18" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O17" - }, - "pin2": { - "compName": "Splitter#9", - "pinName": "O1" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#9", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O16" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O7" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O5" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O3" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "name": "unnamedWire#69", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O72" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "pin2": { - "compName": "Splitter#10", - "pinName": "O1" - }, - "name": "unnamedWire#70", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#10", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "name": "unnamedWire#71", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O7" - }, - "name": "unnamedWire#72", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "name": "unnamedWire#73", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O5" - }, - "name": "unnamedWire#74", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "name": "unnamedWire#75", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O3" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Splitter#11", - "pinName": "O1" - }, - "name": "unnamedWire#78", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#11", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "name": "unnamedWire#79", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O71" - }, - "pin2": { - "compName": "Splitter#3", - "pinName": "O7" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O79" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O7" - }, - "name": "unnamedWire#80", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O78" - }, - "name": "unnamedWire#81", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O77" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O5" - }, - "name": "unnamedWire#82", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O76" - }, - "name": "unnamedWire#83", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O75" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O3" - }, - "name": "unnamedWire#84", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O74" - }, - "name": "unnamedWire#85", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O73" - }, - "pin2": { - "compName": "Splitter#20", - "pinName": "O1" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#20", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O72" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O71" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O7" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O70" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#3", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O70" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O69" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O5" - }, - "name": "unnamedWire#90", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O68" - }, - "name": "unnamedWire#91", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O67" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O3" - }, - "name": "unnamedWire#92", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O2" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O66" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O65" - }, - "pin2": { - "compName": "Splitter#14", - "pinName": "O1" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#14", - "pinName": "O0" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O64" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O63" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O7" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O6" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O62" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#21", - "pinName": "O61" - }, - "pin2": { - "compName": "Splitter#16", - "pinName": "O5" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#16", - "pinName": "O4" - }, - "pin2": { - "compName": "Splitter#21", - "pinName": "O60" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "D latch\n80 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 30.0, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": {}, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "q80-73", - "q72-65", - "q64-57", - "q56-49", - "q48-41", - "q40-33", - "q32-25", - "q24-17", - "q16-9", - "q8-1" - ], - "vectorPartLengthes": [ - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8, - 8 - ] - } - }, - "q1": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q1" - } - }, - "q10": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q2" - } - }, - "q11": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q3" - } - }, - "q12": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q4" - } - }, - "q13": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q5" - } - }, - "q14": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q6" - } - }, - "q15": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q7" - } - }, - "q16": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q8" - } - }, - "q16-9": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q" - } - }, - "q17": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q1" - } - }, - "q18": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q2" - } - }, - "q19": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q3" - } - }, - "q2": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q2" - } - }, - "q20": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q4" - } - }, - "q21": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q5" - } - }, - "q22": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q6" - } - }, - "q23": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q7" - } - }, - "q24": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q8" - } - }, - "q24-17": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#2", - "subStateID": "q" - } - }, - "q25": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q1" - } - }, - "q26": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q2" - } - }, - "q27": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q3" - } - }, - "q28": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q4" - } - }, - "q29": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q5" - } - }, - "q3": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q3" - } - }, - "q30": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q6" - } - }, - "q31": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q7" - } - }, - "q32": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q8" - } - }, - "q32-25": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#3", - "subStateID": "q" - } - }, - "q33": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q1" - } - }, - "q34": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q2" - } - }, - "q35": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q3" - } - }, - "q36": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q4" - } - }, - "q37": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q5" - } - }, - "q38": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q6" - } - }, - "q39": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q7" - } - }, - "q4": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q4" - } - }, - "q40": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q8" - } - }, - "q40-33": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#4", - "subStateID": "q" - } - }, - "q41": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q1" - } - }, - "q42": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q2" - } - }, - "q43": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q3" - } - }, - "q44": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q4" - } - }, - "q45": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q5" - } - }, - "q46": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q6" - } - }, - "q47": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q7" - } - }, - "q48": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q8" - } - }, - "q48-41": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#5", - "subStateID": "q" - } - }, - "q49": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q1" - } - }, - "q5": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q5" - } - }, - "q50": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q2" - } - }, - "q51": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q3" - } - }, - "q52": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q4" - } - }, - "q53": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q5" - } - }, - "q54": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q6" - } - }, - "q55": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q7" - } - }, - "q56": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q8" - } - }, - "q56-49": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#6", - "subStateID": "q" - } - }, - "q57": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q1" - } - }, - "q58": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q2" - } - }, - "q59": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q3" - } - }, - "q6": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q6" - } - }, - "q60": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q4" - } - }, - "q61": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q5" - } - }, - "q62": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q6" - } - }, - "q63": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q7" - } - }, - "q64": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q8" - } - }, - "q64-57": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#7", - "subStateID": "q" - } - }, - "q65": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q1" - } - }, - "q66": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q2" - } - }, - "q67": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q3" - } - }, - "q68": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q4" - } - }, - "q69": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q5" - } - }, - "q7": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q7" - } - }, - "q70": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q6" - } - }, - "q71": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q7" - } - }, - "q72": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q8" - } - }, - "q72-65": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#8", - "subStateID": "q" - } - }, - "q73": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q1" - } - }, - "q74": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q2" - } - }, - "q75": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q3" - } - }, - "q76": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q4" - } - }, - "q77": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q5" - } - }, - "q78": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q6" - } - }, - "q79": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q7" - } - }, - "q8": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q8" - } - }, - "q8-1": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#0", - "subStateID": "q" - } - }, - "q80": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q8" - } - }, - "q80-73": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#9", - "subStateID": "q" - } - }, - "q9": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch8#1", - "subStateID": "q1" - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json deleted file mode 100644 index 4ba4b195..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Z", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 57.5, - "y": 40.0 - }, - "params": 1 - }, - { - "id": "halfadder", - "name": "halfadder#0", - "pos": { - "x": 5.0, - "y": 40.0 - } - }, - { - "id": "halfadder", - "name": "halfadder#1", - "pos": { - "x": 45.0, - "y": 7.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "halfadder#1", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "halfadder#0", - "pinName": "A" - }, - "name": "unnamedWire#1" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "halfadder#0", - "pinName": "B" - }, - "name": "unnamedWire#2" - }, - { - "pin1": { - "compName": "halfadder#0", - "pinName": "Y" - }, - "pin2": { - "compName": "halfadder#1", - "pinName": "B" - }, - "name": "unnamedWire#3" - }, - { - "pin1": { - "compName": "halfadder#0", - "pinName": "_Z" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "halfadder#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "halfadder#1", - "pinName": "_Z" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 82.5, - "y": 22.5 - }, - { - "x": 82.5, - "y": 35.0 - }, - { - "x": 52.5, - "y": 35.0 - }, - { - "x": 52.5, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Z" - }, - "name": "unnamedWire#7" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "fulladder", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json deleted file mode 100644 index d56f83e0..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json +++ /dev/null @@ -1,337 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "_Z", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 40.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 40.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 65.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 34.0, - "y": 24.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 5.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 62.5, - "y": 12.5 - }, - { - "x": 62.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 62.5, - "y": 37.5 - }, - { - "x": 62.5, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 5.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 5.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_Z" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 80.0, - "y": 25.0 - }, - { - "x": 80.0, - "y": 37.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 35.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 35.0, - "y": 32.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "halfadder", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json deleted file mode 100644 index 3997209b..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 7.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 35.0, - "y": 22.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 35.0, - "y": 47.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 60.0, - "y": 30.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 21.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#10" - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#4" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 5.0, - "y": 52.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#8" - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "mux1", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json deleted file mode 100644 index 9f1da98e..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json +++ /dev/null @@ -1,1845 +0,0 @@ -{ - "width": 50.0, - "height": 80.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "I0", - "logicWidth": 12, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "I1", - "logicWidth": 12, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 50.0, - "y": 30.0 - }, - "name": "Y", - "logicWidth": 12, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 55.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 45.0 - }, - "params": { - "logicWidth": 12, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 245.0 - }, - "params": { - "logicWidth": 12, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 235.0, - "y": 95.0 - }, - "params": { - "logicWidth": 12, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 139.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 144.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 89.0, - "y": 4.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 84.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 49.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 49.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 84.0, - "y": 269.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 89.0, - "y": 279.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 84.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 89.0, - "y": 219.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 89.0, - "y": 159.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 84.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 144.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 84.0, - "y": 89.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 89.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 84.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 89.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 139.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 139.0, - "y": 169.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 144.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 144.0, - "y": 239.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 139.0, - "y": 229.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 144.0, - "y": 299.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 139.0, - "y": 289.0 - }, - "params": 1 - }, - { - "id": "sel1", - "name": "sel1#0", - "pos": { - "x": 150.0, - "y": 45.0 - } - }, - { - "id": "sel1", - "name": "sel1#1", - "pos": { - "x": 95.0, - "y": 85.0 - } - }, - { - "id": "sel1", - "name": "sel1#10", - "pos": { - "x": 95.0, - "y": 265.0 - } - }, - { - "id": "sel1", - "name": "sel1#11", - "pos": { - "x": 150.0, - "y": 345.0 - } - }, - { - "id": "sel1", - "name": "sel1#2", - "pos": { - "x": 150.0, - "y": 105.0 - } - }, - { - "id": "sel1", - "name": "sel1#3", - "pos": { - "x": 95.0, - "y": 25.0 - } - }, - { - "id": "sel1", - "name": "sel1#4", - "pos": { - "x": 95.0, - "y": 325.0 - } - }, - { - "id": "sel1", - "name": "sel1#5", - "pos": { - "x": 150.0, - "y": 165.0 - } - }, - { - "id": "sel1", - "name": "sel1#6", - "pos": { - "x": 95.0, - "y": 145.0 - } - }, - { - "id": "sel1", - "name": "sel1#7", - "pos": { - "x": 95.0, - "y": 205.0 - } - }, - { - "id": "sel1", - "name": "sel1#8", - "pos": { - "x": 150.0, - "y": 285.0 - } - }, - { - "id": "sel1", - "name": "sel1#9", - "pos": { - "x": 150.0, - "y": 225.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S1" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "sel1#3", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O11" - }, - "name": "unnamedWire#103", - "path": [ - { - "x": 210.0, - "y": 30.0 - }, - { - "x": 210.0, - "y": 95.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O10" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 205.0, - "y": 50.0 - }, - { - "x": 205.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "Y" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 200.0, - "y": 115.0 - }, - { - "x": 200.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#2", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O8" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 195.0, - "y": 110.0 - }, - { - "x": 195.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "Y" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 195.0, - "y": 135.0 - }, - { - "x": 195.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 200.0, - "y": 170.0 - }, - { - "x": 200.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "Y" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 205.0, - "y": 155.0 - }, - { - "x": 205.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 210.0, - "y": 230.0 - }, - { - "x": 210.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "Y" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 215.0, - "y": 175.0 - }, - { - "x": 215.0, - "y": 270.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#8", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 220.0, - "y": 290.0 - }, - { - "x": 220.0, - "y": 185.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "Y" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 225.0, - "y": 195.0 - }, - { - "x": 225.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#11", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 230.0, - "y": 350.0 - }, - { - "x": 230.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 50.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#10", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "S2" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S1" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 140.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#8", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "S1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 140.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "S1" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "S1" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "sel1#2", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "sel1#2", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "S1" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 145.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "S1" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S2" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 145.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S1" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 85.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S2" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 90.0, - "y": 340.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "S2" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "S1" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "I1" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 75.0, - "y": 45.0 - }, - { - "x": 75.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I1" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 70.0, - "y": 55.0 - }, - { - "x": 70.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I1" - }, - "name": "unnamedWire#66", - "path": [ - { - "x": 65.0, - "y": 65.0 - }, - { - "x": 65.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "I1" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 60.0, - "y": 75.0 - }, - { - "x": 60.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I1" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 55.0, - "y": 85.0 - }, - { - "x": 55.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I1" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 50.0, - "y": 95.0 - }, - { - "x": 50.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#1", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I1" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 45.0, - "y": 105.0 - }, - { - "x": 45.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I1" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 40.0, - "y": 115.0 - }, - { - "x": 40.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I1" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 35.0, - "y": 125.0 - }, - { - "x": 35.0, - "y": 290.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 30.0, - "y": 135.0 - }, - { - "x": 30.0, - "y": 310.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I1" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 25.0, - "y": 145.0 - }, - { - "x": 25.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I1" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 20.0, - "y": 155.0 - }, - { - "x": 20.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "S1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O11" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "I2" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 75.0, - "y": 245.0 - }, - { - "x": 75.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O10" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I2" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 70.0, - "y": 255.0 - }, - { - "x": 70.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I2" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 65.0, - "y": 265.0 - }, - { - "x": 65.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O8" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "I2" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 60.0, - "y": 275.0 - }, - { - "x": 60.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I2" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 55.0, - "y": 285.0 - }, - { - "x": 55.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I2" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 50.0, - "y": 295.0 - }, - { - "x": 50.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I2" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 45.0, - "y": 305.0 - }, - { - "x": 45.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I2" - }, - "name": "unnamedWire#89", - "path": [ - { - "x": 40.0, - "y": 315.0 - }, - { - "x": 40.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I2" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 35.0, - "y": 325.0 - }, - { - "x": 35.0, - "y": 300.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I2" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 30.0, - "y": 335.0 - }, - { - "x": 30.0, - "y": 320.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I2" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 45.0, - "y": 345.0 - }, - { - "x": 45.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I2" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 40.0, - "y": 355.0 - }, - { - "x": 40.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "MUX\n12 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 23.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json deleted file mode 100644 index e29bbbf0..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json +++ /dev/null @@ -1,2384 +0,0 @@ -{ - "width": 55.0, - "height": 110.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I0", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 90.0 - }, - "name": "I1", - "logicWidth": 16, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 55.0, - "y": 50.0 - }, - "name": "Y", - "logicWidth": 16, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 70.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 50.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 375.0 - }, - "params": { - "logicWidth": 16, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 260.0, - "y": 175.0 - }, - "params": { - "logicWidth": 16, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 164.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 169.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 169.0, - "y": 359.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 164.0, - "y": 349.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 169.0, - "y": 419.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 164.0, - "y": 409.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 109.0, - "y": 4.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 104.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 64.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 64.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 104.0, - "y": 389.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 109.0, - "y": 399.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 164.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 104.0, - "y": 329.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 109.0, - "y": 339.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 109.0, - "y": 279.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 104.0, - "y": 269.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 104.0, - "y": 209.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 109.0, - "y": 219.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 104.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 109.0, - "y": 159.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 109.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 104.0, - "y": 89.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 169.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 104.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 109.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 164.0, - "y": 169.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 169.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 169.0, - "y": 239.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 164.0, - "y": 229.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 164.0, - "y": 289.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 169.0, - "y": 299.0 - }, - "params": 1 - }, - { - "id": "sel1", - "name": "sel1#0", - "pos": { - "x": 115.0, - "y": 25.0 - } - }, - { - "id": "sel1", - "name": "sel1#1", - "pos": { - "x": 175.0, - "y": 45.0 - } - }, - { - "id": "sel1", - "name": "sel1#10", - "pos": { - "x": 115.0, - "y": 265.0 - } - }, - { - "id": "sel1", - "name": "sel1#11", - "pos": { - "x": 115.0, - "y": 325.0 - } - }, - { - "id": "sel1", - "name": "sel1#12", - "pos": { - "x": 175.0, - "y": 405.0 - } - }, - { - "id": "sel1", - "name": "sel1#13", - "pos": { - "x": 175.0, - "y": 345.0 - } - }, - { - "id": "sel1", - "name": "sel1#14", - "pos": { - "x": 115.0, - "y": 385.0 - } - }, - { - "id": "sel1", - "name": "sel1#15", - "pos": { - "x": 175.0, - "y": 465.0 - } - }, - { - "id": "sel1", - "name": "sel1#2", - "pos": { - "x": 115.0, - "y": 85.0 - } - }, - { - "id": "sel1", - "name": "sel1#3", - "pos": { - "x": 175.0, - "y": 105.0 - } - }, - { - "id": "sel1", - "name": "sel1#4", - "pos": { - "x": 175.0, - "y": 165.0 - } - }, - { - "id": "sel1", - "name": "sel1#5", - "pos": { - "x": 115.0, - "y": 205.0 - } - }, - { - "id": "sel1", - "name": "sel1#6", - "pos": { - "x": 175.0, - "y": 225.0 - } - }, - { - "id": "sel1", - "name": "sel1#7", - "pos": { - "x": 115.0, - "y": 145.0 - } - }, - { - "id": "sel1", - "name": "sel1#8", - "pos": { - "x": 115.0, - "y": 445.0 - } - }, - { - "id": "sel1", - "name": "sel1#9", - "pos": { - "x": 175.0, - "y": 285.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "S1" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "S2" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S1" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O14" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "Y" - }, - "name": "unnamedWire#100", - "path": [ - { - "x": 250.0, - "y": 185.0 - }, - { - "x": 250.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#2", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O13" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 245.0, - "y": 90.0 - }, - { - "x": 245.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O12" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "Y" - }, - "name": "unnamedWire#102", - "path": [ - { - "x": 240.0, - "y": 205.0 - }, - { - "x": 240.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#7", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O11" - }, - "name": "unnamedWire#103", - "path": [ - { - "x": 235.0, - "y": 150.0 - }, - { - "x": 235.0, - "y": 215.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#4", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O10" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 230.0, - "y": 170.0 - }, - { - "x": 230.0, - "y": 225.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "Y" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 225.0, - "y": 235.0 - }, - { - "x": 225.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O8" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 220.0, - "y": 230.0 - }, - { - "x": 220.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "Y" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 220.0, - "y": 255.0 - }, - { - "x": 220.0, - "y": 270.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 225.0, - "y": 290.0 - }, - { - "x": 225.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "Y" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 230.0, - "y": 275.0 - }, - { - "x": 230.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel1#13", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 235.0, - "y": 350.0 - }, - { - "x": 235.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#14", - "pinName": "Y" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 240.0, - "y": 295.0 - }, - { - "x": 240.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#12", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 245.0, - "y": 410.0 - }, - { - "x": 245.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "Y" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 250.0, - "y": 315.0 - }, - { - "x": 250.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#15", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 255.0, - "y": 470.0 - }, - { - "x": 255.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 65.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#14", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "sel1#14", - "pinName": "S2" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "sel1#15", - "pinName": "S1" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 165.0, - "y": 470.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "sel1#12", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "sel1#12", - "pinName": "S1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "S1" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "sel1#13", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "sel1#13", - "pinName": "S1" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "S1" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "sel1#4", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S1" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "sel1#3", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "S1" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "S2" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "sel1#1", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "S1" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S1" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "sel1#15", - "pinName": "S2" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 170.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "S1" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 105.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "S2" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 110.0, - "y": 460.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S2" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#58", - "path": [ - { - "x": 165.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#59", - "path": [ - { - "x": 170.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "S1" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O15" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I1" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O14" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I1" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 90.0, - "y": 60.0 - }, - { - "x": 90.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O13" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "I1" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 85.0, - "y": 70.0 - }, - { - "x": 85.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O12" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "I1" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 80.0, - "y": 80.0 - }, - { - "x": 80.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O11" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I1" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 75.0, - "y": 90.0 - }, - { - "x": 75.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O10" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I1" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 70.0, - "y": 100.0 - }, - { - "x": 70.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I1" - }, - "name": "unnamedWire#66", - "path": [ - { - "x": 65.0, - "y": 110.0 - }, - { - "x": 65.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O8" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I1" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 60.0, - "y": 120.0 - }, - { - "x": 60.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I1" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 55.0, - "y": 130.0 - }, - { - "x": 55.0, - "y": 290.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I1" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 50.0, - "y": 140.0 - }, - { - "x": 50.0, - "y": 310.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I1" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 45.0, - "y": 150.0 - }, - { - "x": 45.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#13", - "pinName": "I1" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 40.0, - "y": 160.0 - }, - { - "x": 40.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#14", - "pinName": "I1" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 35.0, - "y": 170.0 - }, - { - "x": 35.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#12", - "pinName": "I1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 30.0, - "y": 180.0 - }, - { - "x": 30.0, - "y": 430.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I1" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 25.0, - "y": 190.0 - }, - { - "x": 25.0, - "y": 470.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#15", - "pinName": "I1" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 20.0, - "y": 200.0 - }, - { - "x": 20.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O15" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I2" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 95.0, - "y": 375.0 - }, - { - "x": 95.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O14" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I2" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 90.0, - "y": 385.0 - }, - { - "x": 90.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "S1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O13" - }, - "pin2": { - "compName": "sel1#2", - "pinName": "I2" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 85.0, - "y": 395.0 - }, - { - "x": 85.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O12" - }, - "pin2": { - "compName": "sel1#3", - "pinName": "I2" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 80.0, - "y": 405.0 - }, - { - "x": 80.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O11" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I2" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 75.0, - "y": 415.0 - }, - { - "x": 75.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O10" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I2" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 70.0, - "y": 425.0 - }, - { - "x": 70.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O9" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I2" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 65.0, - "y": 435.0 - }, - { - "x": 65.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O8" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I2" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 60.0, - "y": 445.0 - }, - { - "x": 60.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I2" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 55.0, - "y": 455.0 - }, - { - "x": 55.0, - "y": 300.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I2" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 50.0, - "y": 465.0 - }, - { - "x": 50.0, - "y": 320.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I2" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 45.0, - "y": 475.0 - }, - { - "x": 45.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#13", - "pinName": "I2" - }, - "name": "unnamedWire#89", - "path": [ - { - "x": 40.0, - "y": 485.0 - }, - { - "x": 40.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#10", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#14", - "pinName": "I2" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 35.0, - "y": 495.0 - }, - { - "x": 35.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#12", - "pinName": "I2" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 30.0, - "y": 505.0 - }, - { - "x": 30.0, - "y": 440.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I2" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 25.0, - "y": 515.0 - }, - { - "x": 25.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#15", - "pinName": "I2" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 20.0, - "y": 525.0 - }, - { - "x": 20.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O15" - }, - "name": "unnamedWire#99", - "path": [ - { - "x": 255.0, - "y": 30.0 - }, - { - "x": 255.0, - "y": 175.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "MUX\n16 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 23.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json deleted file mode 100644 index b5b16b89..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json +++ /dev/null @@ -1,503 +0,0 @@ -{ - "width": 35.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I0_1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I0_2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "I0_3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "I0_4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "I1_1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "I1_2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "I1_3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "I1_4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 24.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 46.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 24.0, - "y": 81.5 - }, - "params": 1 - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 30.0, - "y": 7.5 - } - }, - { - "id": "mux1", - "name": "mux1#1", - "pos": { - "x": 30.0, - "y": 42.5 - } - }, - { - "id": "mux1", - "name": "mux1#2", - "pos": { - "x": 30.0, - "y": 77.5 - } - }, - { - "id": "mux1", - "name": "mux1#3", - "pos": { - "x": 30.0, - "y": 112.5 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "S0" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0_3" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "I0" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 5.0, - "y": 87.5 - }, - { - "x": 5.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1_3" - }, - "pin2": { - "compName": "mux1#2", - "pinName": "I1" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 20.0, - "y": 187.5 - }, - { - "x": 20.0, - "y": 102.5 - } - ] - }, - { - "pin1": { - "compName": "mux1#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#14" - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "mux1#3", - "pinName": "S0" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 25.0, - "y": 117.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0_4" - }, - "pin2": { - "compName": "mux1#3", - "pinName": "I0" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 5.0, - "y": 112.5 - }, - { - "x": 5.0, - "y": 127.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1_4" - }, - "pin2": { - "compName": "mux1#3", - "pinName": "I1" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 25.0, - "y": 212.5 - }, - { - "x": 25.0, - "y": 137.5 - } - ] - }, - { - "pin1": { - "compName": "mux1#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#18" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0_1" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 37.5 - }, - { - "x": 5.0, - "y": 22.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1_1" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 137.5 - }, - { - "x": 10.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "mux1#1", - "pinName": "S0" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0_2" - }, - "pin2": { - "compName": "mux1#1", - "pinName": "I0" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 5.0, - "y": 62.5 - }, - { - "x": 5.0, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1_2" - }, - "pin2": { - "compName": "mux1#1", - "pinName": "I1" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 15.0, - "y": 162.5 - }, - { - "x": 15.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "mux1#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "mux1_4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json deleted file mode 100644 index 4a34c7c8..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json +++ /dev/null @@ -1,1297 +0,0 @@ -{ - "width": 40.0, - "height": 55.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "I0", - "logicWidth": 8, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "I1", - "logicWidth": 8, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 40.0, - "y": 25.0 - }, - "name": "Y", - "logicWidth": 8, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 15.0, - "y": 10.0 - }, - "params": 1 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": 5.0, - "y": 40.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": 5.0, - "y": 165.0 - }, - "params": { - "logicWidth": 8, - "orientation": "RIGHT" - } - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": 185.0, - "y": 90.0 - }, - "params": { - "logicWidth": 8, - "orientation": "LEFT" - } - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 69.0, - "y": 4.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 64.0, - "y": 19.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 9.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 9.0, - "y": 14.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 64.0, - "y": 149.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 69.0, - "y": 159.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 64.0, - "y": 89.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 69.0, - "y": 99.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 69.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 64.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 114.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 119.0, - "y": 59.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 119.0, - "y": 119.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 114.0, - "y": 109.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 119.0, - "y": 179.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 114.0, - "y": 169.0 - }, - "params": 1 - }, - { - "id": "sel1", - "name": "sel1#10", - "pos": { - "x": 75.0, - "y": 145.0 - } - }, - { - "id": "sel1", - "name": "sel1#11", - "pos": { - "x": 125.0, - "y": 225.0 - } - }, - { - "id": "sel1", - "name": "sel1#4", - "pos": { - "x": 75.0, - "y": 205.0 - } - }, - { - "id": "sel1", - "name": "sel1#5", - "pos": { - "x": 125.0, - "y": 45.0 - } - }, - { - "id": "sel1", - "name": "sel1#6", - "pos": { - "x": 75.0, - "y": 25.0 - } - }, - { - "id": "sel1", - "name": "sel1#7", - "pos": { - "x": 75.0, - "y": 85.0 - } - }, - { - "id": "sel1", - "name": "sel1#8", - "pos": { - "x": 125.0, - "y": 165.0 - } - }, - { - "id": "sel1", - "name": "sel1#9", - "pos": { - "x": 125.0, - "y": 105.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S1" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "Y" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 180.0, - "y": 90.0 - }, - { - "x": 180.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O6" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 175.0, - "y": 50.0 - }, - { - "x": 175.0, - "y": 100.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "Y" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 170.0, - "y": 110.0 - }, - { - "x": 170.0, - "y": 90.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "S2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O4" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 165.0, - "y": 110.0 - }, - { - "x": 165.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "Y" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 165.0, - "y": 130.0 - }, - { - "x": 165.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#8", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O2" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 170.0, - "y": 170.0 - }, - { - "x": 170.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "Y" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 175.0, - "y": 150.0 - }, - { - "x": 175.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#11", - "pinName": "Y" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 180.0, - "y": 230.0 - }, - { - "x": 180.0, - "y": 160.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "I" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#115", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 10.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#10", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "S2" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S1" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 115.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#8", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "S1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "sel1#9", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "S1" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "sel1#5", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "S1" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 120.0, - "y": 5.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 115.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "S2" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 120.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S1" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 65.0, - "y": 210.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "S2" - }, - "name": "unnamedWire#49", - "path": [ - { - "x": 70.0, - "y": 220.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I1" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 55.0, - "y": 40.0 - }, - { - "x": 55.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I1" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 50.0, - "y": 50.0 - }, - { - "x": 50.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I1" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 45.0, - "y": 60.0 - }, - { - "x": 45.0, - "y": 110.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I1" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 40.0, - "y": 70.0 - }, - { - "x": 40.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I1" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 35.0, - "y": 80.0 - }, - { - "x": 35.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 30.0, - "y": 90.0 - }, - { - "x": 30.0, - "y": 190.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I1" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 25.0, - "y": 100.0 - }, - { - "x": 25.0, - "y": 230.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I1" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 20.0, - "y": 110.0 - }, - { - "x": 20.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#76", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#77", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "S1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O7" - }, - "pin2": { - "compName": "sel1#6", - "pinName": "I2" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 55.0, - "y": 165.0 - }, - { - "x": 55.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O6" - }, - "pin2": { - "compName": "sel1#5", - "pinName": "I2" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 50.0, - "y": 175.0 - }, - { - "x": 50.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O5" - }, - "pin2": { - "compName": "sel1#7", - "pinName": "I2" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 45.0, - "y": 185.0 - }, - { - "x": 45.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O4" - }, - "pin2": { - "compName": "sel1#9", - "pinName": "I2" - }, - "name": "unnamedWire#89", - "path": [ - { - "x": 40.0, - "y": 195.0 - }, - { - "x": 40.0, - "y": 140.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#6", - "pinName": "S2" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "pin2": { - "compName": "sel1#10", - "pinName": "I2" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 35.0, - "y": 205.0 - }, - { - "x": 35.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "sel1#8", - "pinName": "I2" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 30.0, - "y": 215.0 - }, - { - "x": 30.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "pin2": { - "compName": "sel1#4", - "pinName": "I2" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 45.0, - "y": 225.0 - }, - { - "x": 45.0, - "y": 240.0 - } - ] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "sel1#11", - "pinName": "I2" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 40.0, - "y": 235.0 - }, - { - "x": 40.0, - "y": 260.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#98", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "MUX\n8 bit", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 23.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json deleted file mode 100644 index 91d1220e..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json +++ /dev/null @@ -1,434 +0,0 @@ -{ - "width": 70.0, - "height": 70.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 30.0 - }, - "name": "I00", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "I01", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "I10", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "I11", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 70.0, - "y": 10.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 30.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 24.0, - "y": 29.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 54.0, - "y": 39.0 - }, - "params": 1 - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 115.0, - "y": 20.0 - } - }, - { - "id": "sel1", - "name": "sel1#0", - "pos": { - "x": 60.0, - "y": 35.0 - } - }, - { - "id": "sel1", - "name": "sel1#1", - "pos": { - "x": 60.0, - "y": 100.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "S2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 55.0, - "y": 25.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "S2" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 25.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "S1" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 55.0, - "y": 105.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 25.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I00" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I1" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 35.0, - "y": 75.0 - }, - { - "x": 35.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I01" - }, - "pin2": { - "compName": "sel1#0", - "pinName": "I2" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 40.0, - "y": 100.0 - }, - { - "x": 40.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I10" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I1" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I11" - }, - "pin2": { - "compName": "sel1#1", - "pinName": "I2" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 20.0, - "y": 150.0 - }, - { - "x": 20.0, - "y": 135.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "sel1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 105.0, - "y": 40.0 - }, - { - "x": 105.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "sel1#1", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 105.0, - "y": 105.0 - }, - { - "x": 105.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "S0" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 15.0, - "y": 25.0 - }, - { - "x": 15.0, - "y": 10.0 - }, - { - "x": 85.0, - "y": 10.0 - }, - { - "x": 85.0, - "y": 25.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "mux2", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json deleted file mode 100644 index ac5aa8ae..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json +++ /dev/null @@ -1,483 +0,0 @@ -{ - "width": 80.0, - "height": 120.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 40.0 - }, - "name": "I000", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 50.0 - }, - "name": "I001", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 60.0 - }, - "name": "I010", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 70.0 - }, - "name": "I011", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 80.0 - }, - "name": "I100", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 90.0 - }, - "name": "I101", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 100.0 - }, - "name": "I110", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 110.0 - }, - "name": "I111", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 30.0 - }, - "name": "S0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 20.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 10.0 - }, - "name": "S2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 80.0, - "y": 10.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 19.0, - "y": 104.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 24.0, - "y": 94.0 - }, - "params": 1 - }, - { - "id": "mux1", - "name": "mux1#0", - "pos": { - "x": 125.0, - "y": 20.0 - } - }, - { - "id": "mux2", - "name": "mux2#0", - "pos": { - "x": 35.0, - "y": 185.0 - } - }, - { - "id": "mux2", - "name": "mux2#1", - "pos": { - "x": 35.0, - "y": 85.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 20.0, - "y": 75.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 25.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "I11" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I011" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 15.0, - "y": 145.0 - }, - { - "x": 15.0, - "y": 175.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "I00" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I100" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 10.0, - "y": 215.0 - }, - { - "x": 10.0, - "y": 200.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I101" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I01" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "I10" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I110" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 10.0, - "y": 235.0 - }, - { - "x": 10.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I111" - }, - "pin2": { - "compName": "mux2#0", - "pinName": "I11" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 15.0, - "y": 275.0 - }, - { - "x": 15.0, - "y": 245.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I1" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 115.0, - "y": 195.0 - }, - { - "x": 115.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "Y" - }, - "pin2": { - "compName": "mux1#0", - "pinName": "I0" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 110.0, - "y": 95.0 - }, - { - "x": 110.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "S0" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "S2" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "S1" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "S1" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 25.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#0", - "pinName": "S0" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 20.0, - "y": 205.0 - } - ] - }, - { - "pin1": { - "compName": "mux1#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I000" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I00" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 10.0, - "y": 100.0 - }, - { - "x": 10.0, - "y": 115.0 - } - ] - }, - { - "pin1": { - "compName": "mux2#1", - "pinName": "I01" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "I001" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I010" - }, - "pin2": { - "compName": "mux2#1", - "pinName": "I10" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 10.0, - "y": 150.0 - }, - { - "x": 10.0, - "y": 135.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "mux3", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json deleted file mode 100644 index ced22619..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json +++ /dev/null @@ -1,219 +0,0 @@ -{ - "width": 35.0, - "height": 30.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 10.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 35.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 62.5, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 31.5, - "y": 24.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#1" - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 32.5, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 32.5, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 57.5, - "y": 25.0 - }, - { - "x": 57.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 60.0, - "y": 62.5 - }, - { - "x": 60.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#7", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "nand3", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json deleted file mode 100644 index 4b4e51f1..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json +++ /dev/null @@ -1,401 +0,0 @@ -{ - "width": 35.0, - "height": 40.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 30.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 30.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 30.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 30.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 14.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 14.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 14.0, - "y": 61.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 14.0, - "y": 86.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 15.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 15.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 15.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 15.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 15.0, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 15.0, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 15.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 15.0, - "y": 42.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "not4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json deleted file mode 100644 index 33e50e58..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json +++ /dev/null @@ -1,558 +0,0 @@ -{ - "width": 35.0, - "height": 40.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 20.0, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 20.0, - "y": 65.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 20.0, - "y": 115.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 20.0, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 50.0, - "y": 40.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 50.0, - "y": 140.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 110.0, - "y": 40.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 110.0, - "y": 140.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 140.0, - "y": 90.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 14.0, - "y": 24.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 14.0, - "y": 74.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 14.0, - "y": 124.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 14.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 104.0, - "y": 49.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 104.0, - "y": 149.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 15.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 15.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#12" - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#13" - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#14" - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#15" - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 105.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 105.0, - "y": 55.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 105.0, - "y": 145.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 105.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#22" - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#23" - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#24" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 15.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 15.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 15.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 15.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 15.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 15.0, - "y": 80.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "or4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json deleted file mode 100644 index 46801b2f..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json +++ /dev/null @@ -1,897 +0,0 @@ -{ - "width": 35.0, - "height": 80.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 15.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 15.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 65.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 65.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 15.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 15.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 15.0, - "y": 102.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 15.0, - "y": 127.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 15.0, - "y": 152.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 15.0, - "y": 177.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 65.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 65.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 6.5, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 6.5, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 6.5, - "y": 61.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 6.5, - "y": 86.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 6.5, - "y": 111.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 6.5, - "y": 136.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 6.5, - "y": 161.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 6.5, - "y": 186.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#10", - "path": [ - { - "x": 7.5, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#11", - "path": [ - { - "x": 7.5, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 7.5, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 7.5, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 7.5, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 7.5, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 7.5, - "y": 107.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [ - { - "x": 7.5, - "y": 117.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 7.5, - "y": 132.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [ - { - "x": 7.5, - "y": 142.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 7.5, - "y": 157.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 7.5, - "y": 167.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 7.5, - "y": 182.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 7.5, - "y": 192.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 40.0, - "y": 12.5 - }, - { - "x": 40.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 45.0, - "y": 112.5 - }, - { - "x": 45.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 40.0, - "y": 37.5 - }, - { - "x": 40.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 50.0, - "y": 137.5 - }, - { - "x": 50.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 40.0, - "y": 62.5 - }, - { - "x": 40.0, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "B" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 55.0, - "y": 162.5 - }, - { - "x": 55.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 40.0, - "y": 87.5 - }, - { - "x": 40.0, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "B" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 60.0, - "y": 187.5 - }, - { - "x": 60.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B4" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 7.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 7.5, - "y": 17.5 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "or_4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json deleted file mode 100644 index 37322570..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json +++ /dev/null @@ -1,3029 +0,0 @@ -{ - "width": 35.0, - "height": 90.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "B0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "QA1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "QA2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "QA3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "QA4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "QB1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "QB2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 65.0 - }, - "name": "QB3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 75.0 - }, - "name": "QB4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.1, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 109.0, - "y": 154.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 104.0, - "y": 164.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 44.0, - "y": 499.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 49.0, - "y": 509.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 34.0, - "y": 629.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 39.0, - "y": 639.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 44.0, - "y": 649.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 49.0, - "y": 659.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 129.0, - "y": 329.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 124.0, - "y": 339.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 119.0, - "y": 349.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 114.0, - "y": 359.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 99.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 129.0, - "y": 479.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 124.0, - "y": 489.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 119.0, - "y": 499.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 114.0, - "y": 509.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 129.0, - "y": 629.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 124.0, - "y": 639.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 119.0, - "y": 649.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 114.0, - "y": 659.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#28", - "pos": { - "x": 129.0, - "y": 779.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#29", - "pos": { - "x": 124.0, - "y": 789.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 94.0, - "y": 184.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#30", - "pos": { - "x": 119.0, - "y": 799.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#31", - "pos": { - "x": 114.0, - "y": 809.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 34.0, - "y": 549.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 39.0, - "y": 649.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 44.0, - "y": 749.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 49.0, - "y": 809.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 34.0, - "y": 479.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 39.0, - "y": 489.0 - }, - "params": 1 - }, - { - "id": "and41", - "name": "and41#0", - "pos": { - "x": 130.0, - "y": 150.0 - } - }, - { - "id": "and41", - "name": "and41#1", - "pos": { - "x": 235.0, - "y": 375.0 - } - }, - { - "id": "and41", - "name": "and41#2", - "pos": { - "x": 135.0, - "y": 325.0 - } - }, - { - "id": "andor414", - "name": "andor414#0", - "pos": { - "x": 235.0, - "y": 485.0 - } - }, - { - "id": "andor414", - "name": "andor414#1", - "pos": { - "x": 235.0, - "y": 635.0 - } - }, - { - "id": "andor414", - "name": "andor414#2", - "pos": { - "x": 235.0, - "y": 785.0 - } - }, - { - "id": "andor414", - "name": "andor414#3", - "pos": { - "x": 135.0, - "y": 435.0 - } - }, - { - "id": "andor414", - "name": "andor414#4", - "pos": { - "x": 135.0, - "y": 585.0 - } - }, - { - "id": "andor414", - "name": "andor414#5", - "pos": { - "x": 135.0, - "y": 735.0 - } - }, - { - "id": "demux2", - "name": "demux2#0", - "pos": { - "x": 55.0, - "y": 45.0 - } - }, - { - "id": "demux2", - "name": "demux2#1", - "pos": { - "x": 55.0, - "y": 150.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#0", - "pos": { - "x": 55.0, - "y": 325.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#1", - "pos": { - "x": 55.0, - "y": 475.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#2", - "pos": { - "x": 55.0, - "y": 625.0 - } - }, - { - "id": "dlatch4", - "name": "dlatch4#3", - "pos": { - "x": 55.0, - "y": 775.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A0" - }, - "pin2": { - "compName": "demux2#0", - "pinName": "S0" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "demux2#0", - "pinName": "S1" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 10.0, - "y": 150.0 - }, - { - "x": 10.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A3" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A4" - }, - "name": "unnamedWire#100", - "path": [] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C1" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 290.0, - "y": 380.0 - }, - { - "x": 290.0, - "y": 445.0 - }, - { - "x": 230.0, - "y": 445.0 - }, - { - "x": 230.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C2" - }, - "name": "unnamedWire#102", - "path": [ - { - "x": 285.0, - "y": 390.0 - }, - { - "x": 285.0, - "y": 440.0 - }, - { - "x": 225.0, - "y": 440.0 - }, - { - "x": 225.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C3" - }, - "name": "unnamedWire#103", - "path": [ - { - "x": 280.0, - "y": 400.0 - }, - { - "x": 280.0, - "y": 435.0 - }, - { - "x": 220.0, - "y": 435.0 - }, - { - "x": 220.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C4" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 275.0, - "y": 410.0 - }, - { - "x": 275.0, - "y": 430.0 - }, - { - "x": 215.0, - "y": 430.0 - }, - { - "x": 215.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C1" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 290.0, - "y": 490.0 - }, - { - "x": 290.0, - "y": 595.0 - }, - { - "x": 230.0, - "y": 595.0 - }, - { - "x": 230.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C2" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 285.0, - "y": 500.0 - }, - { - "x": 285.0, - "y": 590.0 - }, - { - "x": 225.0, - "y": 590.0 - }, - { - "x": 225.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C3" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 280.0, - "y": 510.0 - }, - { - "x": 280.0, - "y": 585.0 - }, - { - "x": 220.0, - "y": 585.0 - }, - { - "x": 220.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C4" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 275.0, - "y": 520.0 - }, - { - "x": 275.0, - "y": 580.0 - }, - { - "x": 215.0, - "y": 580.0 - }, - { - "x": 215.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C1" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 290.0, - "y": 640.0 - }, - { - "x": 290.0, - "y": 745.0 - }, - { - "x": 230.0, - "y": 745.0 - }, - { - "x": 230.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A4" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C2" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 285.0, - "y": 650.0 - }, - { - "x": 285.0, - "y": 740.0 - }, - { - "x": 225.0, - "y": 740.0 - }, - { - "x": 225.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C3" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 280.0, - "y": 660.0 - }, - { - "x": 280.0, - "y": 735.0 - }, - { - "x": 220.0, - "y": 735.0 - }, - { - "x": 220.0, - "y": 810.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C4" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 275.0, - "y": 670.0 - }, - { - "x": 275.0, - "y": 730.0 - }, - { - "x": 215.0, - "y": 730.0 - }, - { - "x": 215.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA1" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 300.0, - "y": 790.0 - }, - { - "x": 300.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA2" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 305.0, - "y": 800.0 - }, - { - "x": 305.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA3" - }, - "name": "unnamedWire#115", - "path": [ - { - "x": 310.0, - "y": 810.0 - }, - { - "x": 310.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA4" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 315.0, - "y": 820.0 - }, - { - "x": 315.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C1" - }, - "name": "unnamedWire#117", - "path": [ - { - "x": 190.0, - "y": 330.0 - }, - { - "x": 190.0, - "y": 430.0 - }, - { - "x": 130.0, - "y": 430.0 - }, - { - "x": 130.0, - "y": 440.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C2" - }, - "name": "unnamedWire#118", - "path": [ - { - "x": 185.0, - "y": 340.0 - }, - { - "x": 185.0, - "y": 425.0 - }, - { - "x": 125.0, - "y": 425.0 - }, - { - "x": 125.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C3" - }, - "name": "unnamedWire#119", - "path": [ - { - "x": 180.0, - "y": 350.0 - }, - { - "x": 180.0, - "y": 420.0 - }, - { - "x": 120.0, - "y": 420.0 - }, - { - "x": 120.0, - "y": 460.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "and41#0", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 5.0, - "y": 450.0 - }, - { - "x": 5.0, - "y": 300.0 - }, - { - "x": 125.0, - "y": 300.0 - }, - { - "x": 125.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C4" - }, - "name": "unnamedWire#120", - "path": [ - { - "x": 175.0, - "y": 360.0 - }, - { - "x": 175.0, - "y": 415.0 - }, - { - "x": 115.0, - "y": 415.0 - }, - { - "x": 115.0, - "y": 470.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C1" - }, - "name": "unnamedWire#121", - "path": [ - { - "x": 190.0, - "y": 440.0 - }, - { - "x": 190.0, - "y": 580.0 - }, - { - "x": 130.0, - "y": 580.0 - }, - { - "x": 130.0, - "y": 590.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C2" - }, - "name": "unnamedWire#122", - "path": [ - { - "x": 185.0, - "y": 450.0 - }, - { - "x": 185.0, - "y": 575.0 - }, - { - "x": 125.0, - "y": 575.0 - }, - { - "x": 125.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C3" - }, - "name": "unnamedWire#123", - "path": [ - { - "x": 180.0, - "y": 460.0 - }, - { - "x": 180.0, - "y": 570.0 - }, - { - "x": 120.0, - "y": 570.0 - }, - { - "x": 120.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C4" - }, - "name": "unnamedWire#124", - "path": [ - { - "x": 175.0, - "y": 470.0 - }, - { - "x": 175.0, - "y": 565.0 - }, - { - "x": 115.0, - "y": 565.0 - }, - { - "x": 115.0, - "y": 620.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C1" - }, - "name": "unnamedWire#125", - "path": [ - { - "x": 190.0, - "y": 590.0 - }, - { - "x": 190.0, - "y": 730.0 - }, - { - "x": 130.0, - "y": 730.0 - }, - { - "x": 130.0, - "y": 740.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C2" - }, - "name": "unnamedWire#126", - "path": [ - { - "x": 185.0, - "y": 600.0 - }, - { - "x": 185.0, - "y": 725.0 - }, - { - "x": 125.0, - "y": 725.0 - }, - { - "x": 125.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C3" - }, - "name": "unnamedWire#127", - "path": [ - { - "x": 180.0, - "y": 610.0 - }, - { - "x": 180.0, - "y": 720.0 - }, - { - "x": 120.0, - "y": 720.0 - }, - { - "x": 120.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C4" - }, - "name": "unnamedWire#128", - "path": [ - { - "x": 175.0, - "y": 620.0 - }, - { - "x": 175.0, - "y": 715.0 - }, - { - "x": 115.0, - "y": 715.0 - }, - { - "x": 115.0, - "y": 770.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB1" - }, - "name": "unnamedWire#129", - "path": [ - { - "x": 190.0, - "y": 740.0 - }, - { - "x": 190.0, - "y": 880.0 - }, - { - "x": 325.0, - "y": 880.0 - }, - { - "x": 325.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "C" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 185.0, - "y": 155.0 - }, - { - "x": 185.0, - "y": 250.0 - }, - { - "x": 30.0, - "y": 250.0 - }, - { - "x": 30.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB2" - }, - "name": "unnamedWire#130", - "path": [ - { - "x": 185.0, - "y": 750.0 - }, - { - "x": 185.0, - "y": 885.0 - }, - { - "x": 330.0, - "y": 885.0 - }, - { - "x": 330.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB3" - }, - "name": "unnamedWire#131", - "path": [ - { - "x": 180.0, - "y": 760.0 - }, - { - "x": 180.0, - "y": 890.0 - }, - { - "x": 335.0, - "y": 890.0 - }, - { - "x": 335.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB4" - }, - "name": "unnamedWire#132", - "path": [ - { - "x": 175.0, - "y": 770.0 - }, - { - "x": 175.0, - "y": 895.0 - }, - { - "x": 340.0, - "y": 895.0 - }, - { - "x": 340.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "C" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 180.0, - "y": 165.0 - }, - { - "x": 180.0, - "y": 245.0 - }, - { - "x": 25.0, - "y": 245.0 - }, - { - "x": 25.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "C" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 175.0, - "y": 175.0 - }, - { - "x": 175.0, - "y": 240.0 - }, - { - "x": 20.0, - "y": 240.0 - }, - { - "x": 20.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "C" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 170.0, - "y": 185.0 - }, - { - "x": 170.0, - "y": 235.0 - }, - { - "x": 15.0, - "y": 235.0 - }, - { - "x": 15.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B0" - }, - "pin2": { - "compName": "demux2#1", - "pinName": "S0" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 250.0 - }, - { - "x": 5.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 50.0, - "y": 850.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D1" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 35.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D2" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 40.0, - "y": 340.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D3" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 45.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#0", - "pinName": "D4" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 50.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D1" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D2" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D3" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#1", - "pinName": "D4" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "demux2#1", - "pinName": "S1" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 350.0 - }, - { - "x": 10.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "D1" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "D2" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "D3" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#2", - "pinName": "D4" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y00" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "D1" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 35.0, - "y": 780.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "D2" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 40.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "D3" - }, - "name": "unnamedWire#43", - "path": [ - { - "x": 45.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "dlatch4#3", - "pinName": "D4" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "name": "unnamedWire#45", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "name": "unnamedWire#46", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "name": "unnamedWire#47", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#0", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "name": "unnamedWire#48", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y01" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#1", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#2", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#2", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#2", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#2", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#3", - "pinName": "Q1" - }, - "pin2": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#3", - "pinName": "Q2" - }, - "pin2": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#3", - "pinName": "Q3" - }, - "pin2": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y10" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "dlatch4#3", - "pinName": "Q4" - }, - "pin2": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y00" - }, - "pin2": { - "compName": "and41#1", - "pinName": "B" - }, - "name": "unnamedWire#61", - "path": [ - { - "x": 210.0, - "y": 50.0 - }, - { - "x": 210.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y01" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "B" - }, - "name": "unnamedWire#62", - "path": [ - { - "x": 205.0, - "y": 60.0 - }, - { - "x": 205.0, - "y": 570.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y10" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "B" - }, - "name": "unnamedWire#63", - "path": [ - { - "x": 200.0, - "y": 70.0 - }, - { - "x": 200.0, - "y": 720.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y11" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "B" - }, - "name": "unnamedWire#64", - "path": [ - { - "x": 195.0, - "y": 80.0 - }, - { - "x": 195.0, - "y": 870.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "B" - }, - "name": "unnamedWire#65", - "path": [ - { - "x": 110.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "B" - }, - "name": "unnamedWire#66", - "path": [ - { - "x": 105.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "B" - }, - "name": "unnamedWire#67", - "path": [ - { - "x": 100.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "B" - }, - "name": "unnamedWire#68", - "path": [ - { - "x": 95.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A1" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 130.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y11" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A2" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 125.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A3" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 120.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A4" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 115.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A1" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 130.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A2" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 125.0, - "y": 540.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A3" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 120.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A4" - }, - "name": "unnamedWire#76", - "path": [ - { - "x": 115.0, - "y": 560.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A1" - }, - "name": "unnamedWire#77", - "path": [ - { - "x": 130.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A2" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 125.0, - "y": 690.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A3" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 120.0, - "y": 700.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A4" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 115.0, - "y": 710.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A1" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 130.0, - "y": 830.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A2" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 125.0, - "y": 840.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A3" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 120.0, - "y": 850.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#31", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A4" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 115.0, - "y": 860.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A1" - }, - "name": "unnamedWire#85", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A2" - }, - "name": "unnamedWire#86", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A3" - }, - "name": "unnamedWire#87", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A4" - }, - "name": "unnamedWire#88", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A1" - }, - "name": "unnamedWire#89", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A2" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A2" - }, - "name": "unnamedWire#90", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A3" - }, - "name": "unnamedWire#91", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A4" - }, - "name": "unnamedWire#92", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A1" - }, - "name": "unnamedWire#93", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A2" - }, - "name": "unnamedWire#94", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A3" - }, - "name": "unnamedWire#95", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A4" - }, - "name": "unnamedWire#96", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#28", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A1" - }, - "name": "unnamedWire#97", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#29", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A2" - }, - "name": "unnamedWire#98", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#30", - "pinName": "" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A3" - }, - "name": "unnamedWire#99", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "ram2", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "c00": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch4#0" - } - }, - "c01": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch4#1" - } - }, - "c10": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch4#2" - } - }, - "c11": { - "id": "delegating", - "params": { - "delegateTarget": "dlatch4#3" - } - } - }, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "c11.q", - "c10.q", - "c01.q", - "c00.q" - ], - "vectorPartLengthes": [ - 4, - 4, - 4, - 4 - ] - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json deleted file mode 100644 index de91b6be..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json +++ /dev/null @@ -1,3525 +0,0 @@ -{ - "width": 35.0, - "height": 130.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "B0", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "D1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 105.0 - }, - "name": "D2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 115.0 - }, - "name": "D3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 125.0 - }, - "name": "D4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "QA1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "QA2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "QA3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "QA4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 45.0 - }, - "name": "QB1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 55.0 - }, - "name": "QB2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 65.0 - }, - "name": "QB3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 75.0 - }, - "name": "QB4", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "WE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 0.1, - "submodel": { - "components": [ - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 229.0, - "y": 154.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 224.0, - "y": 164.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#10", - "pos": { - "x": 69.0, - "y": 704.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#11", - "pos": { - "x": 74.0, - "y": 714.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#12", - "pos": { - "x": 59.0, - "y": 834.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#13", - "pos": { - "x": 64.0, - "y": 844.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#14", - "pos": { - "x": 69.0, - "y": 854.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#15", - "pos": { - "x": 74.0, - "y": 864.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#16", - "pos": { - "x": 39.0, - "y": 484.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#17", - "pos": { - "x": 44.0, - "y": 494.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#18", - "pos": { - "x": 49.0, - "y": 504.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#19", - "pos": { - "x": 54.0, - "y": 514.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 219.0, - "y": 174.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#20", - "pos": { - "x": 39.0, - "y": 634.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#21", - "pos": { - "x": 44.0, - "y": 644.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#22", - "pos": { - "x": 49.0, - "y": 654.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#23", - "pos": { - "x": 54.0, - "y": 664.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#24", - "pos": { - "x": 39.0, - "y": 334.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#25", - "pos": { - "x": 44.0, - "y": 349.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#26", - "pos": { - "x": 49.0, - "y": 649.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#27", - "pos": { - "x": 54.0, - "y": 749.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 214.0, - "y": 184.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 59.0, - "y": 534.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 64.0, - "y": 544.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#6", - "pos": { - "x": 69.0, - "y": 554.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#7", - "pos": { - "x": 74.0, - "y": 564.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#8", - "pos": { - "x": 59.0, - "y": 684.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#9", - "pos": { - "x": 64.0, - "y": 694.0 - }, - "params": 1 - }, - { - "id": "and41", - "name": "and41#0", - "pos": { - "x": 235.0, - "y": 150.0 - } - }, - { - "id": "and41", - "name": "and41#1", - "pos": { - "x": 250.0, - "y": 375.0 - } - }, - { - "id": "and41", - "name": "and41#2", - "pos": { - "x": 155.0, - "y": 325.0 - } - }, - { - "id": "andor414", - "name": "andor414#0", - "pos": { - "x": 250.0, - "y": 485.0 - } - }, - { - "id": "andor414", - "name": "andor414#1", - "pos": { - "x": 250.0, - "y": 635.0 - } - }, - { - "id": "andor414", - "name": "andor414#2", - "pos": { - "x": 250.0, - "y": 785.0 - } - }, - { - "id": "andor414", - "name": "andor414#3", - "pos": { - "x": 155.0, - "y": 435.0 - } - }, - { - "id": "andor414", - "name": "andor414#4", - "pos": { - "x": 155.0, - "y": 585.0 - } - }, - { - "id": "andor414", - "name": "andor414#5", - "pos": { - "x": 155.0, - "y": 735.0 - } - }, - { - "id": "demux2", - "name": "demux2#0", - "pos": { - "x": 55.0, - "y": 45.0 - } - }, - { - "id": "demux2", - "name": "demux2#1", - "pos": { - "x": 55.0, - "y": 150.0 - } - }, - { - "id": "ram2", - "name": "ram2#0", - "pos": { - "x": 80.0, - "y": 330.0 - } - }, - { - "id": "ram2", - "name": "ram2#1", - "pos": { - "x": 80.0, - "y": 480.0 - } - }, - { - "id": "ram2", - "name": "ram2#2", - "pos": { - "x": 80.0, - "y": 630.0 - } - }, - { - "id": "ram2", - "name": "ram2#3", - "pos": { - "x": 80.0, - "y": 780.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A0" - }, - "pin2": { - "compName": "demux2#0", - "pinName": "S0" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "demux2#0", - "pinName": "S1" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 10.0, - "y": 150.0 - }, - { - "x": 10.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A3" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QA4" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A4" - }, - "name": "unnamedWire#100", - "path": [ - { - "x": 140.0, - "y": 365.0 - }, - { - "x": 140.0, - "y": 360.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QA1" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A1" - }, - "name": "unnamedWire#101", - "path": [ - { - "x": 140.0, - "y": 485.0 - }, - { - "x": 140.0, - "y": 480.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QA2" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A2" - }, - "name": "unnamedWire#102", - "path": [ - { - "x": 140.0, - "y": 495.0 - }, - { - "x": 140.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QA3" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A3" - }, - "name": "unnamedWire#103", - "path": [ - { - "x": 140.0, - "y": 505.0 - }, - { - "x": 140.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QA4" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "A4" - }, - "name": "unnamedWire#104", - "path": [ - { - "x": 140.0, - "y": 515.0 - }, - { - "x": 140.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QA1" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A1" - }, - "name": "unnamedWire#105", - "path": [ - { - "x": 140.0, - "y": 635.0 - }, - { - "x": 140.0, - "y": 630.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QA2" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A2" - }, - "name": "unnamedWire#106", - "path": [ - { - "x": 140.0, - "y": 645.0 - }, - { - "x": 140.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QA3" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A3" - }, - "name": "unnamedWire#107", - "path": [ - { - "x": 140.0, - "y": 655.0 - }, - { - "x": 140.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QA4" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "A4" - }, - "name": "unnamedWire#108", - "path": [ - { - "x": 140.0, - "y": 665.0 - }, - { - "x": 140.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QA1" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A1" - }, - "name": "unnamedWire#109", - "path": [ - { - "x": 140.0, - "y": 785.0 - }, - { - "x": 140.0, - "y": 780.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A4" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QA2" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A2" - }, - "name": "unnamedWire#110", - "path": [ - { - "x": 140.0, - "y": 795.0 - }, - { - "x": 140.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QA3" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A3" - }, - "name": "unnamedWire#111", - "path": [ - { - "x": 140.0, - "y": 805.0 - }, - { - "x": 140.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QA4" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "A4" - }, - "name": "unnamedWire#112", - "path": [ - { - "x": 140.0, - "y": 815.0 - }, - { - "x": 140.0, - "y": 810.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C1" - }, - "name": "unnamedWire#113", - "path": [ - { - "x": 305.0, - "y": 380.0 - }, - { - "x": 305.0, - "y": 445.0 - }, - { - "x": 245.0, - "y": 445.0 - }, - { - "x": 245.0, - "y": 490.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C2" - }, - "name": "unnamedWire#114", - "path": [ - { - "x": 300.0, - "y": 390.0 - }, - { - "x": 300.0, - "y": 440.0 - }, - { - "x": 240.0, - "y": 440.0 - }, - { - "x": 240.0, - "y": 500.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C3" - }, - "name": "unnamedWire#115", - "path": [ - { - "x": 295.0, - "y": 400.0 - }, - { - "x": 295.0, - "y": 435.0 - }, - { - "x": 235.0, - "y": 435.0 - }, - { - "x": 235.0, - "y": 510.0 - } - ] - }, - { - "pin1": { - "compName": "and41#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "C4" - }, - "name": "unnamedWire#116", - "path": [ - { - "x": 290.0, - "y": 410.0 - }, - { - "x": 290.0, - "y": 430.0 - }, - { - "x": 230.0, - "y": 430.0 - }, - { - "x": 230.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C1" - }, - "name": "unnamedWire#117", - "path": [ - { - "x": 305.0, - "y": 490.0 - }, - { - "x": 305.0, - "y": 595.0 - }, - { - "x": 245.0, - "y": 595.0 - }, - { - "x": 245.0, - "y": 640.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C2" - }, - "name": "unnamedWire#118", - "path": [ - { - "x": 300.0, - "y": 500.0 - }, - { - "x": 300.0, - "y": 590.0 - }, - { - "x": 240.0, - "y": 590.0 - }, - { - "x": 240.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C3" - }, - "name": "unnamedWire#119", - "path": [ - { - "x": 295.0, - "y": 510.0 - }, - { - "x": 295.0, - "y": 585.0 - }, - { - "x": 235.0, - "y": 585.0 - }, - { - "x": 235.0, - "y": 660.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "WE" - }, - "pin2": { - "compName": "and41#0", - "pinName": "B" - }, - "name": "unnamedWire#12", - "path": [ - { - "x": 15.0, - "y": 850.0 - }, - { - "x": 15.0, - "y": 195.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "C4" - }, - "name": "unnamedWire#120", - "path": [ - { - "x": 290.0, - "y": 520.0 - }, - { - "x": 290.0, - "y": 580.0 - }, - { - "x": 230.0, - "y": 580.0 - }, - { - "x": 230.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C1" - }, - "name": "unnamedWire#121", - "path": [ - { - "x": 305.0, - "y": 640.0 - }, - { - "x": 305.0, - "y": 745.0 - }, - { - "x": 245.0, - "y": 745.0 - }, - { - "x": 245.0, - "y": 790.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C2" - }, - "name": "unnamedWire#122", - "path": [ - { - "x": 300.0, - "y": 650.0 - }, - { - "x": 300.0, - "y": 740.0 - }, - { - "x": 240.0, - "y": 740.0 - }, - { - "x": 240.0, - "y": 800.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C3" - }, - "name": "unnamedWire#123", - "path": [ - { - "x": 295.0, - "y": 660.0 - }, - { - "x": 295.0, - "y": 735.0 - }, - { - "x": 235.0, - "y": 735.0 - }, - { - "x": 235.0, - "y": 810.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#1", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "C4" - }, - "name": "unnamedWire#124", - "path": [ - { - "x": 290.0, - "y": 670.0 - }, - { - "x": 290.0, - "y": 730.0 - }, - { - "x": 230.0, - "y": 730.0 - }, - { - "x": 230.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB1" - }, - "name": "unnamedWire#125", - "path": [ - { - "x": 330.0, - "y": 790.0 - }, - { - "x": 330.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB2" - }, - "name": "unnamedWire#126", - "path": [ - { - "x": 335.0, - "y": 800.0 - }, - { - "x": 335.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB3" - }, - "name": "unnamedWire#127", - "path": [ - { - "x": 340.0, - "y": 810.0 - }, - { - "x": 340.0, - "y": 650.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#2", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QB4" - }, - "name": "unnamedWire#128", - "path": [ - { - "x": 345.0, - "y": 820.0 - }, - { - "x": 345.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C1" - }, - "name": "unnamedWire#129", - "path": [ - { - "x": 210.0, - "y": 330.0 - }, - { - "x": 210.0, - "y": 430.0 - }, - { - "x": 150.0, - "y": 430.0 - }, - { - "x": 150.0, - "y": 440.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "WE" - }, - "name": "unnamedWire#13", - "path": [ - { - "x": 290.0, - "y": 155.0 - }, - { - "x": 290.0, - "y": 230.0 - }, - { - "x": 35.0, - "y": 230.0 - }, - { - "x": 35.0, - "y": 375.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C2" - }, - "name": "unnamedWire#130", - "path": [ - { - "x": 205.0, - "y": 340.0 - }, - { - "x": 205.0, - "y": 425.0 - }, - { - "x": 145.0, - "y": 425.0 - }, - { - "x": 145.0, - "y": 450.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C3" - }, - "name": "unnamedWire#131", - "path": [ - { - "x": 200.0, - "y": 350.0 - }, - { - "x": 200.0, - "y": 420.0 - }, - { - "x": 140.0, - "y": 420.0 - }, - { - "x": 140.0, - "y": 460.0 - } - ] - }, - { - "pin1": { - "compName": "and41#2", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "C4" - }, - "name": "unnamedWire#132", - "path": [ - { - "x": 195.0, - "y": 360.0 - }, - { - "x": 195.0, - "y": 415.0 - }, - { - "x": 135.0, - "y": 415.0 - }, - { - "x": 135.0, - "y": 470.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C1" - }, - "name": "unnamedWire#133", - "path": [ - { - "x": 210.0, - "y": 440.0 - }, - { - "x": 210.0, - "y": 580.0 - }, - { - "x": 150.0, - "y": 580.0 - }, - { - "x": 150.0, - "y": 590.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C2" - }, - "name": "unnamedWire#134", - "path": [ - { - "x": 205.0, - "y": 450.0 - }, - { - "x": 205.0, - "y": 575.0 - }, - { - "x": 145.0, - "y": 575.0 - }, - { - "x": 145.0, - "y": 600.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C3" - }, - "name": "unnamedWire#135", - "path": [ - { - "x": 200.0, - "y": 460.0 - }, - { - "x": 200.0, - "y": 570.0 - }, - { - "x": 140.0, - "y": 570.0 - }, - { - "x": 140.0, - "y": 610.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#3", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "C4" - }, - "name": "unnamedWire#136", - "path": [ - { - "x": 195.0, - "y": 470.0 - }, - { - "x": 195.0, - "y": 565.0 - }, - { - "x": 135.0, - "y": 565.0 - }, - { - "x": 135.0, - "y": 620.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y1" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C1" - }, - "name": "unnamedWire#137", - "path": [ - { - "x": 210.0, - "y": 590.0 - }, - { - "x": 210.0, - "y": 730.0 - }, - { - "x": 150.0, - "y": 730.0 - }, - { - "x": 150.0, - "y": 740.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y2" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C2" - }, - "name": "unnamedWire#138", - "path": [ - { - "x": 205.0, - "y": 600.0 - }, - { - "x": 205.0, - "y": 725.0 - }, - { - "x": 145.0, - "y": 725.0 - }, - { - "x": 145.0, - "y": 750.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y3" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C3" - }, - "name": "unnamedWire#139", - "path": [ - { - "x": 200.0, - "y": 610.0 - }, - { - "x": 200.0, - "y": 720.0 - }, - { - "x": 140.0, - "y": 720.0 - }, - { - "x": 140.0, - "y": 760.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "WE" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 285.0, - "y": 165.0 - }, - { - "x": 285.0, - "y": 225.0 - }, - { - "x": 30.0, - "y": 225.0 - }, - { - "x": 30.0, - "y": 525.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#4", - "pinName": "Y4" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "C4" - }, - "name": "unnamedWire#140", - "path": [ - { - "x": 195.0, - "y": 620.0 - }, - { - "x": 195.0, - "y": 715.0 - }, - { - "x": 135.0, - "y": 715.0 - }, - { - "x": 135.0, - "y": 770.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y1" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA1" - }, - "name": "unnamedWire#141", - "path": [ - { - "x": 210.0, - "y": 740.0 - }, - { - "x": 210.0, - "y": 880.0 - }, - { - "x": 310.0, - "y": 880.0 - }, - { - "x": 310.0, - "y": 50.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y2" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA2" - }, - "name": "unnamedWire#142", - "path": [ - { - "x": 205.0, - "y": 750.0 - }, - { - "x": 205.0, - "y": 885.0 - }, - { - "x": 315.0, - "y": 885.0 - }, - { - "x": 315.0, - "y": 150.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y3" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA3" - }, - "name": "unnamedWire#143", - "path": [ - { - "x": 200.0, - "y": 760.0 - }, - { - "x": 200.0, - "y": 890.0 - }, - { - "x": 320.0, - "y": 890.0 - }, - { - "x": 320.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "andor414#5", - "pinName": "Y4" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "QA4" - }, - "name": "unnamedWire#144", - "path": [ - { - "x": 195.0, - "y": 770.0 - }, - { - "x": 195.0, - "y": 895.0 - }, - { - "x": 325.0, - "y": 895.0 - }, - { - "x": 325.0, - "y": 350.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "WE" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 280.0, - "y": 175.0 - }, - { - "x": 280.0, - "y": 220.0 - }, - { - "x": 25.0, - "y": 220.0 - }, - { - "x": 25.0, - "y": 675.0 - } - ] - }, - { - "pin1": { - "compName": "and41#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "WE" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 275.0, - "y": 185.0 - }, - { - "x": 275.0, - "y": 215.0 - }, - { - "x": 20.0, - "y": 215.0 - }, - { - "x": 20.0, - "y": 825.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "A0" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B0" - }, - "pin2": { - "compName": "demux2#1", - "pinName": "S0" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 450.0 - }, - { - "x": 5.0, - "y": 155.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "A1" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 45.0, - "y": 345.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "B0" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 50.0, - "y": 355.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "B1" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 55.0, - "y": 365.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "A0" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "A1" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "B0" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "B1" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#16", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#17", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#18", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "demux2#1", - "pinName": "S1" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 550.0 - }, - { - "x": 10.0, - "y": 165.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#26", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#19", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "A0" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "A1" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "B0" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "B1" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#20", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "A0" - }, - "name": "unnamedWire#37", - "path": [ - { - "x": 40.0, - "y": 785.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#21", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "A1" - }, - "name": "unnamedWire#38", - "path": [ - { - "x": 45.0, - "y": 795.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#22", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "B0" - }, - "name": "unnamedWire#39", - "path": [ - { - "x": 50.0, - "y": 805.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y00" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#23", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "B1" - }, - "name": "unnamedWire#41", - "path": [ - { - "x": 55.0, - "y": 815.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "WireCrossPoint#24", - "pinName": "" - }, - "name": "unnamedWire#42", - "path": [ - { - "x": 40.0, - "y": 250.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "WireCrossPoint#25", - "pinName": "" - }, - "name": "unnamedWire#43", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "WireCrossPoint#27", - "pinName": "" - }, - "name": "unnamedWire#44", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "D1" - }, - "name": "unnamedWire#45", - "path": [ - { - "x": 60.0, - "y": 385.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "D2" - }, - "name": "unnamedWire#46", - "path": [ - { - "x": 65.0, - "y": 395.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "D3" - }, - "name": "unnamedWire#47", - "path": [ - { - "x": 70.0, - "y": 405.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "ram2#0", - "pinName": "D4" - }, - "name": "unnamedWire#48", - "path": [ - { - "x": 75.0, - "y": 415.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "D1" - }, - "name": "unnamedWire#49", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y01" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "D2" - }, - "name": "unnamedWire#50", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "D3" - }, - "name": "unnamedWire#51", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "ram2#1", - "pinName": "D4" - }, - "name": "unnamedWire#52", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "name": "unnamedWire#53", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "name": "unnamedWire#54", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#6", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "name": "unnamedWire#55", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#7", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "name": "unnamedWire#56", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "D1" - }, - "name": "unnamedWire#57", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "D2" - }, - "name": "unnamedWire#58", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "D3" - }, - "name": "unnamedWire#59", - "path": [] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y10" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "ram2#2", - "pinName": "D4" - }, - "name": "unnamedWire#60", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#8", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#61", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#9", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#62", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#10", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#63", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#11", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#64", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "D1" - }, - "name": "unnamedWire#65", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "D2" - }, - "name": "unnamedWire#66", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "D3" - }, - "name": "unnamedWire#67", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "pin2": { - "compName": "ram2#3", - "pinName": "D4" - }, - "name": "unnamedWire#68", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D1" - }, - "pin2": { - "compName": "WireCrossPoint#12", - "pinName": "" - }, - "name": "unnamedWire#69", - "path": [ - { - "x": 60.0, - "y": 950.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#1", - "pinName": "Y11" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D2" - }, - "pin2": { - "compName": "WireCrossPoint#13", - "pinName": "" - }, - "name": "unnamedWire#70", - "path": [ - { - "x": 65.0, - "y": 1050.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D3" - }, - "pin2": { - "compName": "WireCrossPoint#14", - "pinName": "" - }, - "name": "unnamedWire#71", - "path": [ - { - "x": 70.0, - "y": 1150.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "D4" - }, - "pin2": { - "compName": "WireCrossPoint#15", - "pinName": "" - }, - "name": "unnamedWire#72", - "path": [ - { - "x": 75.0, - "y": 1250.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y00" - }, - "pin2": { - "compName": "and41#2", - "pinName": "B" - }, - "name": "unnamedWire#73", - "path": [ - { - "x": 135.0, - "y": 50.0 - }, - { - "x": 135.0, - "y": 370.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y01" - }, - "pin2": { - "compName": "andor414#3", - "pinName": "B" - }, - "name": "unnamedWire#74", - "path": [ - { - "x": 130.0, - "y": 60.0 - }, - { - "x": 130.0, - "y": 520.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y10" - }, - "pin2": { - "compName": "andor414#4", - "pinName": "B" - }, - "name": "unnamedWire#75", - "path": [ - { - "x": 125.0, - "y": 70.0 - }, - { - "x": 125.0, - "y": 670.0 - } - ] - }, - { - "pin1": { - "compName": "demux2#0", - "pinName": "Y11" - }, - "pin2": { - "compName": "andor414#5", - "pinName": "B" - }, - "name": "unnamedWire#76", - "path": [ - { - "x": 120.0, - "y": 80.0 - }, - { - "x": 120.0, - "y": 820.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and41#1", - "pinName": "B" - }, - "name": "unnamedWire#77", - "path": [ - { - "x": 230.0, - "y": 420.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "B" - }, - "name": "unnamedWire#78", - "path": [ - { - "x": 225.0, - "y": 570.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "B" - }, - "name": "unnamedWire#79", - "path": [ - { - "x": 220.0, - "y": 720.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A1" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "B" - }, - "name": "unnamedWire#80", - "path": [ - { - "x": 215.0, - "y": 870.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QB1" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A1" - }, - "name": "unnamedWire#81", - "path": [ - { - "x": 140.0, - "y": 375.0 - }, - { - "x": 140.0, - "y": 380.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QB2" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A2" - }, - "name": "unnamedWire#82", - "path": [ - { - "x": 140.0, - "y": 385.0 - }, - { - "x": 140.0, - "y": 390.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QB3" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A3" - }, - "name": "unnamedWire#83", - "path": [ - { - "x": 140.0, - "y": 395.0 - }, - { - "x": 140.0, - "y": 400.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QB4" - }, - "pin2": { - "compName": "and41#1", - "pinName": "A4" - }, - "name": "unnamedWire#84", - "path": [ - { - "x": 140.0, - "y": 405.0 - }, - { - "x": 140.0, - "y": 410.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QB1" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A1" - }, - "name": "unnamedWire#85", - "path": [ - { - "x": 140.0, - "y": 525.0 - }, - { - "x": 140.0, - "y": 530.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QB2" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A2" - }, - "name": "unnamedWire#86", - "path": [ - { - "x": 140.0, - "y": 535.0 - }, - { - "x": 140.0, - "y": 540.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QB3" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A3" - }, - "name": "unnamedWire#87", - "path": [ - { - "x": 140.0, - "y": 545.0 - }, - { - "x": 140.0, - "y": 550.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#1", - "pinName": "QB4" - }, - "pin2": { - "compName": "andor414#0", - "pinName": "A4" - }, - "name": "unnamedWire#88", - "path": [ - { - "x": 140.0, - "y": 555.0 - }, - { - "x": 140.0, - "y": 560.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QB1" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A1" - }, - "name": "unnamedWire#89", - "path": [ - { - "x": 140.0, - "y": 675.0 - }, - { - "x": 140.0, - "y": 680.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "and41#0", - "pinName": "A2" - }, - "name": "unnamedWire#9", - "path": [] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QB2" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A2" - }, - "name": "unnamedWire#90", - "path": [ - { - "x": 140.0, - "y": 685.0 - }, - { - "x": 140.0, - "y": 690.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QB3" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A3" - }, - "name": "unnamedWire#91", - "path": [ - { - "x": 140.0, - "y": 695.0 - }, - { - "x": 140.0, - "y": 700.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#2", - "pinName": "QB4" - }, - "pin2": { - "compName": "andor414#1", - "pinName": "A4" - }, - "name": "unnamedWire#92", - "path": [ - { - "x": 140.0, - "y": 705.0 - }, - { - "x": 140.0, - "y": 710.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QB1" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A1" - }, - "name": "unnamedWire#93", - "path": [ - { - "x": 140.0, - "y": 825.0 - }, - { - "x": 140.0, - "y": 830.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QB2" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A2" - }, - "name": "unnamedWire#94", - "path": [ - { - "x": 140.0, - "y": 835.0 - }, - { - "x": 140.0, - "y": 840.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QB3" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A3" - }, - "name": "unnamedWire#95", - "path": [ - { - "x": 140.0, - "y": 845.0 - }, - { - "x": 140.0, - "y": 850.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#3", - "pinName": "QB4" - }, - "pin2": { - "compName": "andor414#2", - "pinName": "A4" - }, - "name": "unnamedWire#96", - "path": [ - { - "x": 140.0, - "y": 855.0 - }, - { - "x": 140.0, - "y": 860.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QA1" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A1" - }, - "name": "unnamedWire#97", - "path": [ - { - "x": 140.0, - "y": 335.0 - }, - { - "x": 140.0, - "y": 330.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QA2" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A2" - }, - "name": "unnamedWire#98", - "path": [ - { - "x": 140.0, - "y": 345.0 - }, - { - "x": 140.0, - "y": 340.0 - } - ] - }, - { - "pin1": { - "compName": "ram2#0", - "pinName": "QA3" - }, - "pin2": { - "compName": "and41#2", - "pinName": "A3" - }, - "name": "unnamedWire#99", - "path": [ - { - "x": 140.0, - "y": 355.0 - }, - { - "x": 140.0, - "y": 350.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "ram4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "c00": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0" - } - }, - "c0000": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0", - "prefix": "c00" - } - }, - "c0001": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1", - "prefix": "c00" - } - }, - "c0010": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2", - "prefix": "c00" - } - }, - "c0011": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3", - "prefix": "c00" - } - }, - "c01": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1" - } - }, - "c0100": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0", - "prefix": "c01" - } - }, - "c0101": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1", - "prefix": "c01" - } - }, - "c0110": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2", - "prefix": "c01" - } - }, - "c0111": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3", - "prefix": "c01" - } - }, - "c10": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2" - } - }, - "c1000": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0", - "prefix": "c10" - } - }, - "c1001": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1", - "prefix": "c10" - } - }, - "c1010": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2", - "prefix": "c10" - } - }, - "c1011": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3", - "prefix": "c10" - } - }, - "c11": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3" - } - }, - "c1100": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#0", - "prefix": "c11" - } - }, - "c1101": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#1", - "prefix": "c11" - } - }, - "c1110": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#2", - "prefix": "c11" - } - }, - "c1111": { - "id": "delegating", - "params": { - "delegateTarget": "ram2#3", - "prefix": "c11" - } - } - }, - "atomicHighLevelStates": { - "q": { - "id": "bitVectorSplitting", - "params": { - "vectorPartTargets": [ - "c11.q", - "c10.q", - "c01.q", - "c00.q" - ], - "vectorPartLengthes": [ - 16, - 16, - 16, - 16 - ] - } - } - } - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json deleted file mode 100644 index afd89f18..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json +++ /dev/null @@ -1,214 +0,0 @@ -{ - "width": 35.0, - "height": 40.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "I1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "I2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "S1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "S2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 35.0, - "y": 30.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 35.0, - "y": 55.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 60.0, - "y": 40.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S1" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 25.0, - "y": 12.5 - }, - { - "x": 25.0, - "y": 35.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "S2" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 15.0, - "y": 37.5 - }, - { - "x": 15.0, - "y": 60.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#10" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I1" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 25.0, - "y": 62.5 - }, - { - "x": 25.0, - "y": 45.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I2" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 15.0, - "y": 87.5 - }, - { - "x": 15.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#8" - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "sel1", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json deleted file mode 100644 index 22f3ce64..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json +++ /dev/null @@ -1,863 +0,0 @@ -{ - "width": 35.0, - "height": 100.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "B4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "SA", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "SB", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 20.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 20.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#10", - "pos": { - "x": 65.0, - "y": 52.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#11", - "pos": { - "x": 65.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 20.0, - "y": 102.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 20.0, - "y": 152.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 20.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 20.0, - "y": 77.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 20.0, - "y": 127.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 20.0, - "y": 177.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#8", - "pos": { - "x": 65.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#9", - "pos": { - "x": 65.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 6.5, - "y": 16.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 6.5, - "y": 66.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 6.5, - "y": 116.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#3", - "pos": { - "x": 4.0, - "y": 41.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#4", - "pos": { - "x": 4.0, - "y": 91.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#5", - "pos": { - "x": 4.0, - "y": 141.5 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 15.0, - "y": 62.5 - }, - { - "x": 15.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 17.5, - "y": 87.5 - }, - { - "x": 17.5, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#10" - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#11" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#12" - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#13" - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#14" - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [ - { - "x": 7.5, - "y": 167.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "name": "unnamedWire#16" - }, - { - "pin1": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#17" - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "name": "unnamedWire#18" - }, - { - "pin1": { - "compName": "WireCrossPoint#4", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#19" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 17.5, - "y": 112.5 - }, - { - "x": 17.5, - "y": 107.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#20" - }, - { - "pin1": { - "compName": "WireCrossPoint#5", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#21", - "path": [ - { - "x": 5.0, - "y": 192.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "A" - }, - "name": "unnamedWire#22", - "path": [ - { - "x": 42.5, - "y": 12.5 - }, - { - "x": 42.5, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#8", - "pinName": "B" - }, - "name": "unnamedWire#23", - "path": [ - { - "x": 45.0, - "y": 37.5 - }, - { - "x": 45.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "A" - }, - "name": "unnamedWire#24", - "path": [ - { - "x": 47.5, - "y": 62.5 - }, - { - "x": 47.5, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#9", - "pinName": "B" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 50.0, - "y": 87.5 - }, - { - "x": 50.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 52.5, - "y": 112.5 - }, - { - "x": 52.5, - "y": 57.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#10", - "pinName": "B" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 55.0, - "y": 137.5 - }, - { - "x": 55.0, - "y": 67.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "A" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 57.5, - "y": 162.5 - }, - { - "x": 57.5, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#11", - "pinName": "B" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 60.0, - "y": 187.5 - }, - { - "x": 60.0, - "y": 92.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 17.5, - "y": 137.5 - }, - { - "x": 17.5, - "y": 157.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#8", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#9", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#10", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#11", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 10.0, - "y": 162.5 - }, - { - "x": 10.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 12.5, - "y": 187.5 - }, - { - "x": 12.5, - "y": 82.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 15.0, - "y": 212.5 - }, - { - "x": 15.0, - "y": 132.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B4" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 10.0, - "y": 237.5 - }, - { - "x": 10.0, - "y": 182.5 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SA" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#8" - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SB" - }, - "pin2": { - "compName": "WireCrossPoint#3", - "pinName": "" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "sel2_4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json deleted file mode 100644 index c16624c8..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json +++ /dev/null @@ -1,937 +0,0 @@ -{ - "width": 35.0, - "height": 150.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 35.0 - }, - "name": "A1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 45.0 - }, - "name": "A2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 55.0 - }, - "name": "A3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 65.0 - }, - "name": "A4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 75.0 - }, - "name": "B1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 85.0 - }, - "name": "B2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 95.0 - }, - "name": "B3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 105.0 - }, - "name": "B4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 115.0 - }, - "name": "C1", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 125.0 - }, - "name": "C2", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 135.0 - }, - "name": "C3", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 145.0 - }, - "name": "C4", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "SA", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "SB", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 25.0 - }, - "name": "SC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y1", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 15.0 - }, - "name": "Y2", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 25.0 - }, - "name": "Y3", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 35.0, - "y": 35.0 - }, - "name": "Y4", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.2, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 50.0, - "y": 570.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 50.0, - "y": 620.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 50.0, - "y": 670.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 50.0, - "y": 720.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#4", - "pos": { - "x": 152.5, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#5", - "pos": { - "x": 152.5, - "y": 65.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#6", - "pos": { - "x": 152.5, - "y": 115.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#7", - "pos": { - "x": 152.5, - "y": 165.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 29.0, - "y": 584.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 29.0, - "y": 634.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 29.0, - "y": 684.0 - }, - "params": 1 - }, - { - "id": "not4", - "name": "not4#0", - "pos": { - "x": 75.0, - "y": 250.0 - } - }, - { - "id": "sel2_4", - "name": "sel2_4#0", - "pos": { - "x": 35.0, - "y": 250.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SA" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "SA" - }, - "name": "unnamedWire#0", - "path": [ - { - "x": 25.0, - "y": 25.0 - }, - { - "x": 25.0, - "y": 255.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SB" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "SB" - }, - "name": "unnamedWire#1", - "path": [ - { - "x": 20.0, - "y": 75.0 - }, - { - "x": 20.0, - "y": 265.0 - } - ] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A1" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A2" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A3" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "sel2_4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "not4#0", - "pinName": "A4" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SC" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#14", - "path": [ - { - "x": 30.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#16", - "path": [ - { - "x": 30.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#18", - "path": [ - { - "x": 30.0, - "y": 125.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A1" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A1" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 15.0, - "y": 175.0 - }, - { - "x": 15.0, - "y": 275.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#20", - "path": [ - { - "x": 30.0, - "y": 735.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C1" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C2" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C3" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C4" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y1" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "A" - }, - "name": "unnamedWire#25", - "path": [ - { - "x": 115.0, - "y": 255.0 - }, - { - "x": 115.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y2" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "A" - }, - "name": "unnamedWire#26", - "path": [ - { - "x": 120.0, - "y": 265.0 - }, - { - "x": 120.0, - "y": 70.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y3" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "A" - }, - "name": "unnamedWire#27", - "path": [ - { - "x": 125.0, - "y": 275.0 - }, - { - "x": 125.0, - "y": 120.0 - } - ] - }, - { - "pin1": { - "compName": "not4#0", - "pinName": "Y4" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "A" - }, - "name": "unnamedWire#28", - "path": [ - { - "x": 130.0, - "y": 285.0 - }, - { - "x": 130.0, - "y": 170.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#4", - "pinName": "B" - }, - "name": "unnamedWire#29", - "path": [ - { - "x": 135.0, - "y": 580.0 - }, - { - "x": 135.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A2" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A2" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 10.0, - "y": 225.0 - }, - { - "x": 10.0, - "y": 285.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#5", - "pinName": "B" - }, - "name": "unnamedWire#30", - "path": [ - { - "x": 140.0, - "y": 630.0 - }, - { - "x": 140.0, - "y": 80.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#6", - "pinName": "B" - }, - "name": "unnamedWire#31", - "path": [ - { - "x": 145.0, - "y": 680.0 - }, - { - "x": 145.0, - "y": 130.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#7", - "pinName": "B" - }, - "name": "unnamedWire#32", - "path": [ - { - "x": 150.0, - "y": 730.0 - }, - { - "x": 150.0, - "y": 180.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#4", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y1" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#5", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y2" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#6", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y3" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#7", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y4" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A3" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A3" - }, - "name": "unnamedWire#4", - "path": [ - { - "x": 5.0, - "y": 275.0 - }, - { - "x": 5.0, - "y": 295.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A4" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "A4" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 5.0, - "y": 325.0 - }, - { - "x": 5.0, - "y": 305.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B1" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B1" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 10.0, - "y": 375.0 - }, - { - "x": 10.0, - "y": 315.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B2" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B2" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 15.0, - "y": 425.0 - }, - { - "x": 15.0, - "y": 325.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B3" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B3" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 20.0, - "y": 475.0 - }, - { - "x": 20.0, - "y": 335.0 - } - ] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B4" - }, - "pin2": { - "compName": "sel2_4#0", - "pinName": "B4" - }, - "name": "unnamedWire#9", - "path": [ - { - "x": 25.0, - "y": 525.0 - }, - { - "x": 25.0, - "y": 345.0 - } - ] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "sel3_4", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json b/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json deleted file mode 100644 index 2eff80ef..00000000 --- a/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json +++ /dev/null @@ -1,285 +0,0 @@ -{ - "width": 35.0, - "height": 20.0, - "interfacePins": [ - { - "location": { - "x": 0.0, - "y": 5.0 - }, - "name": "A", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 0.0, - "y": 15.0 - }, - "name": "B", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 35.0, - "y": 5.0 - }, - "name": "Y", - "logicWidth": 1, - "usage": "OUTPUT" - } - ], - "innerScale": 0.4, - "submodel": { - "components": [ - { - "id": "NandGate", - "name": "NandGate#0", - "pos": { - "x": 7.5, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#1", - "pos": { - "x": 35.0, - "y": 2.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#2", - "pos": { - "x": 35.0, - "y": 27.5 - }, - "params": 1 - }, - { - "id": "NandGate", - "name": "NandGate#3", - "pos": { - "x": 62.5, - "y": 15.0 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#0", - "pos": { - "x": 4.0, - "y": 11.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#1", - "pos": { - "x": 4.0, - "y": 36.5 - }, - "params": 1 - }, - { - "id": "WireCrossPoint", - "name": "WireCrossPoint#2", - "pos": { - "x": 29.0, - "y": 24.0 - }, - "params": 1 - } - ], - "wires": [ - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "A" - }, - "pin2": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "B" - }, - "pin2": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "NandGate#2", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "B" - }, - "name": "unnamedWire#10" - }, - { - "pin1": { - "compName": "NandGate#3", - "pinName": "Y" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "Y" - }, - "name": "unnamedWire#11" - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "A" - }, - "name": "unnamedWire#2", - "path": [ - { - "x": 5.0, - "y": 20.0 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#0", - "pinName": "B" - }, - "name": "unnamedWire#3", - "path": [ - { - "x": 5.0, - "y": 30.0 - } - ] - }, - { - "pin1": { - "compName": "NandGate#0", - "pinName": "Y" - }, - "pin2": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "name": "unnamedWire#4" - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "B" - }, - "name": "unnamedWire#5", - "path": [ - { - "x": 30.0, - "y": 17.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#2", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "A" - }, - "name": "unnamedWire#6", - "path": [ - { - "x": 30.0, - "y": 32.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#0", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#1", - "pinName": "A" - }, - "name": "unnamedWire#7", - "path": [ - { - "x": 5.0, - "y": 7.5 - } - ] - }, - { - "pin1": { - "compName": "WireCrossPoint#1", - "pinName": "" - }, - "pin2": { - "compName": "NandGate#2", - "pinName": "B" - }, - "name": "unnamedWire#8", - "path": [ - { - "x": 5.0, - "y": 42.5 - } - ] - }, - { - "pin1": { - "compName": "NandGate#1", - "pinName": "Y" - }, - "pin2": { - "compName": "NandGate#3", - "pinName": "A" - }, - "name": "unnamedWire#9" - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "simpleRectangularLike", - "symbolRendererParams": { - "centerText": "xor", - "centerTextHeight": 5.0, - "horizontalComponentCenter": 17.5, - "pinLabelHeight": 3.5, - "pinLabelMargin": 0.5 - }, - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "default", - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/plugin.xml b/net.mograsim.logic.model.am2900/plugin.xml deleted file mode 100644 index 7a324ad9..00000000 --- a/net.mograsim.logic.model.am2900/plugin.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java deleted file mode 100644 index 10cf1412..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.mograsim.logic.model.am2900; - -import java.util.concurrent.atomic.AtomicBoolean; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -import net.mograsim.logic.model.serializing.ClassLoaderBasedResourceLoader; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.machine.MachineLoader; - -public class Am2900Loader implements BundleActivator -{ - // TODO use dff16 in dff16_we & dff16_invwe - private static AtomicBoolean activated = new AtomicBoolean(false); - - @Override - public void start(BundleContext context) throws Exception - { - setup(); - } - - @Override - public void stop(BundleContext context) throws Exception - { - // nothing - } - - public static void setup() - { - if (activated.getAndSet(true)) - return; - ClassLoaderBasedResourceLoader resourceLoader = ClassLoaderBasedResourceLoader.create(Am2900Loader.class.getClassLoader()); - IndirectModelComponentCreator.registerResourceLoader(resourceLoader, "Am2900Loader"); - IndirectModelComponentCreator.loadStandardComponentIDs(Am2900Loader.class.getResourceAsStream("standardComponentIDMapping.json")); - MachineLoader.setup(); -// System.out.println("SETUP DONE"); // TODO: Debug - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java deleted file mode 100644 index 4450e07b..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import net.mograsim.logic.model.am2900.machine.Am2900Machine; -import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.machine.standard.memory.ModelWordAddressableMemory; - -public class ModelAm2900MainMemory extends ModelWordAddressableMemory -{ - public ModelAm2900MainMemory(LogicModelModifiable model, String name) - { - super(model, Am2900MachineDefinition.getInstance().getMainMemoryDefinition(), name); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Am2900MainMemory"; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new ModelAm2900MainMemoryAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MainMemory.class.getCanonicalName(), (m, p, n) -> - { - return new ModelAm2900MainMemory(m, n); - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java deleted file mode 100644 index e5e34ebb..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; -import net.mograsim.machine.standard.memory.CoreWordAddressableMemory; - -public class ModelAm2900MainMemoryAdapter implements ComponentAdapter -{ - - @Override - public Class getSupportedClass() - { - return ModelAm2900MainMemory.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MainMemory modelComponent, - Map logicWiresPerPin) - { - ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd(); - ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd(); - ReadEnd mode = logicWiresPerPin.get(modelComponent.getReadWritePin()).createReadOnlyEnd(); - CoreWordAddressableMemory mem = new CoreWordAddressableMemory(timeline, 2, modelComponent.getMachine().getMainMemory(), data, mode, - address); - modelComponent.setCoreModelBinding(mem); - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java deleted file mode 100644 index cfd54c52..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import net.mograsim.logic.model.am2900.machine.Am2900Machine; -import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.machine.mi.components.ModelMicroInstructionMemory; - -public class ModelAm2900MicroInstructionMemory extends ModelMicroInstructionMemory -{ - public ModelAm2900MicroInstructionMemory(LogicModelModifiable model, String name) - { - super(model, Am2900MachineDefinition.getInstance().getMicroInstructionMemoryDefinition(), name); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new ModelAm2900MicroInstructionMemoryAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MicroInstructionMemory.class.getCanonicalName(), (m, p, n) -> - { - return new ModelAm2900MicroInstructionMemory(m, n); - }); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Am2900MicroInstructionMemory"; - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java deleted file mode 100644 index 895c58a5..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; -import net.mograsim.machine.mi.components.CoreMicroInstructionMemory; - -public class ModelAm2900MicroInstructionMemoryAdapter implements ComponentAdapter -{ - - @Override - public Class getSupportedClass() - { - return ModelAm2900MicroInstructionMemory.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MicroInstructionMemory modelComponent, - Map logicWiresPerPin) - { - ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd(); - ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd(); - CoreMicroInstructionMemory mem = new CoreMicroInstructionMemory(timeline, 2, - modelComponent.getMachine().getMicroInstructionMemory(), data, address); - modelComponent.setCoreModelBinding(mem); - } - -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java deleted file mode 100644 index 14500d5c..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modeldff12 extends SimpleRectangularHardcodedModelComponent -{ - public Modeldff12(LogicModelModifiable model, String name) - { - super(model, "dff12", name, "D flip flop\n12 bits", false); - setSize(40, 20); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 20), Position.TOP); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 10), Position.RIGHT); - addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] QC = (Bit[]) lastState; - if (QC == null) - { - QC = new Bit[13]; - Arrays.fill(QC, U); - } - - Bit CVal = readEnds.get("C").getValue(); - - if (QC[12] == ZERO && CVal == ONE) - System.arraycopy(readEnds.get("D").getValues().getBits(), 0, QC, 0, 12); - - readWriteEnds.get("Y").feedSignals(Arrays.copyOfRange(QC, 0, 12)); - QC[12] = CVal; - - return QC; - } - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - switch (stateID) - { - case "q": - return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12)); - default: - return super.getHighLevelState(state, stateID); - } - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - switch (stateID) - { - case "q": - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 12) - throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); - System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12); - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modeldff12.class.getCanonicalName(), (m, p, n) -> new Modeldff12(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java deleted file mode 100644 index a3e7047e..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java +++ /dev/null @@ -1,110 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modeldff4_finewe extends SimpleRectangularHardcodedModelComponent -{ - public Modeldff4_finewe(LogicModelModifiable model, String name) - { - super(model, "dff4_finewe", name, "D flip flop\n4 bits", false); - setSize(35, 90); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "_WE1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); - addPin(new Pin(model, this, "_WE2", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); - addPin(new Pin(model, this, "_WE3", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); - addPin(new Pin(model, this, "_WE4", 1, PinUsage.INPUT, 0, 45), Position.RIGHT); - addPin(new Pin(model, this, "D1", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); - addPin(new Pin(model, this, "D2", 1, PinUsage.INPUT, 0, 65), Position.RIGHT); - addPin(new Pin(model, this, "D3", 1, PinUsage.INPUT, 0, 75), Position.RIGHT); - addPin(new Pin(model, this, "D4", 1, PinUsage.INPUT, 0, 85), Position.RIGHT); - addPin(new Pin(model, this, "Q1", 1, PinUsage.OUTPUT, 35, 5), Position.LEFT); - addPin(new Pin(model, this, "Q2", 1, PinUsage.OUTPUT, 35, 15), Position.LEFT); - addPin(new Pin(model, this, "Q3", 1, PinUsage.OUTPUT, 35, 25), Position.LEFT); - addPin(new Pin(model, this, "Q4", 1, PinUsage.OUTPUT, 35, 35), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] QC = (Bit[]) lastState; - if (QC == null) - QC = new Bit[] { U, U, U, U, U }; - - Bit CVal = readEnds.get("C").getValue(); - - if (QC[0] == ZERO && CVal == ONE) - for (int i = 1; i < 5; i++) - { - Bit WEiVal = readEnds.get("_WE" + i).getValue(); - if (WEiVal == X || WEiVal == Z) - QC[i] = X; - else if (WEiVal == U) - QC[i] = U; - else if (WEiVal == ZERO) - QC[i] = readEnds.get("D" + i).getValue(); - } - - QC[0] = CVal; - - readWriteEnds.get("Q1").feedSignals(QC[1]); - readWriteEnds.get("Q2").feedSignals(QC[2]); - readWriteEnds.get("Q3").feedSignals(QC[3]); - readWriteEnds.get("Q4").feedSignals(QC[4]); - - return QC; - } - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - switch (stateID) - { - case "q": - return BitVector.of(Arrays.copyOfRange((Bit[]) state, 1, 5)); - default: - return super.getHighLevelState(state, stateID); - } - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - switch (stateID) - { - case "q": - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 4) - throw new IllegalArgumentException("Expected BitVector of length 4, not " + newHighLevelStateCasted.length()); - System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 1, 4); - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modeldff4_finewe.class.getCanonicalName(), - (m, p, n) -> new Modeldff4_finewe(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java deleted file mode 100644 index 981c8488..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modelinc extends SimpleRectangularHardcodedModelComponent -{ - private final int logicWidth; - - public Modelinc(LogicModelModifiable model, String name, int logicWidth) - { - super(model, "inc", name, "Incrementer", false); - this.logicWidth = logicWidth; - setSize(40, 20); - addPin(new Pin(model, this, "A", logicWidth, PinUsage.INPUT, 20, 20), Position.TOP); - addPin(new Pin(model, this, "CI", 1, PinUsage.INPUT, 40, 10), Position.LEFT); - addPin(new Pin(model, this, "Y", logicWidth, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] ABits = readEnds.get("A").getValues().getBits(); - Bit CIVal = readEnds.get("CI").getValue(); - Bit[] YBits = new Bit[logicWidth]; - if (CIVal == X) - Arrays.fill(YBits, X); - else if (CIVal == U) - Arrays.fill(YBits, U); - else if (CIVal == Z) - Arrays.fill(YBits, X); - else if (CIVal == ZERO) - YBits = ABits; - else - { - Bit carry = Bit.ONE; - // TODO extract to helper. This code almost also exists in ModelAm2910RegCntr. - for (int i = logicWidth - 1; i >= 0; i--) - { - Bit a = ABits[i]; - YBits[i] = a.xor(carry); - carry = a.and(carry); - } - } - readWriteEnds.get("Y").feedSignals(YBits); - return null; - } - - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modelinc.class.getCanonicalName(), - (m, p, n) -> new Modelinc(m, n, p.getAsInt())); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java deleted file mode 100644 index 4304d4a2..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modelnor12 extends SimpleRectangularHardcodedModelComponent -{ - public Modelnor12(LogicModelModifiable model, String name) - { - super(model, "nor12", name, "=0", false); - setSize(35, 20); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 0, 10), Position.RIGHT); - addPin(new Pin(model, this, "Y", 1, PinUsage.OUTPUT, 35, 10), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - readWriteEnds.get("Y").feedSignals(getResult(readEnds.get("D").getValues().getBits())); - return null; - } - - private static Bit getResult(Bit[] DValArr) - { - for (int i = 0; i < 12; i++) - if (DValArr[i] == X) - return X; - for (int i = 0; i < 12; i++) - if (DValArr[i] == U) - return U; - for (int i = 0; i < 12; i++) - if (DValArr[i] == ONE) - return ZERO; - for (int i = 0; i < 12; i++) - if (DValArr[i] == Z) - return X; - return ONE; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modelnor12.class.getCanonicalName(), (m, p, n) -> new Modelnor12(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java deleted file mode 100644 index 53c9960d..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modelram5_12 extends SimpleRectangularHardcodedModelComponent -{ - public Modelram5_12(LogicModelModifiable model, String name) - { - super(model, "ram5_12", name, "RAM\n5 x 12 Bit", false); - setSize(40, 40); - addPin(new Pin(model, this, "A", 3, PinUsage.INPUT, 10, 0), Position.BOTTOM); - addPin(new Pin(model, this, "B", 3, PinUsage.INPUT, 30, 0), Position.BOTTOM); - addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); - addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 0, 30), Position.RIGHT); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 40), Position.TOP); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - BitVector[] memC = (BitVector[]) lastState; - if (memC == null) - { - memC = new BitVector[6]; - Arrays.fill(memC, 0, 5, BitVector.of(U, 12)); - memC[5] = BitVector.of(U); - } - BitVector CVal = readEnds.get("C").getValues(); - BitVector oldC = memC[5]; - // TODO is the timing right? - if (oldC.getLSBit(0) == ZERO && CVal.getLSBit(0) == ONE && readEnds.get("WE").getValue() == ONE) - { - int BInt = getAsInt(readEnds.get("B").getValues()); - if (BInt == -1 || BInt > 4) - Arrays.fill(memC, BitVector.of(X, 12)); - else if (BInt == -2) - Arrays.fill(memC, BitVector.of(U, 12)); - else - memC[BInt] = readEnds.get("D").getValues(); - } - int AInt = getAsInt(readEnds.get("A").getValues()); - BitVector YVal = AInt == -1 || AInt > 4 ? BitVector.of(X, 12) : AInt == -2 ? BitVector.of(U, 12) : memC[AInt]; - readWriteEnds.get("Y").feedSignals(YVal); - memC[5] = CVal; - return memC; - } - - /** - * -1 means X, -2 means U - */ - private static int getAsInt(BitVector vect) - { - Bit[] bits = vect.getBits(); - for (int i = 0; i < 3; i++) - if (bits[i] == X) - return -1; - for (int i = 0; i < 3; i++) - if (bits[i] == U) - return -2; - for (int i = 0; i < 3; i++) - if (bits[i] == Z) - return -1; - return (bits[0] == ONE ? 4 : 0) + (bits[1] == ONE ? 2 : 0) + (bits[2] == ONE ? 1 : 0); - } - - Pattern stateIDPattern = Pattern.compile("c(0[10][10]|100)"); - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - Matcher m = stateIDPattern.matcher(stateID); - if (m.matches()) - return ((BitVector[]) state)[Integer.parseInt(m.group(1), 2)]; - return super.getHighLevelState(state, stateID); - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - Matcher m = stateIDPattern.matcher(stateID); - if (m.matches()) - { - int addr = Integer.parseInt(m.group(1), 2); - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 12) - throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); - BitVector[] memC = (BitVector[]) lastState; - memC[addr] = newHighLevelStateCasted; - return memC; - } - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modelram5_12.class.getCanonicalName(), (m, p, n) -> new Modelram5_12(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java deleted file mode 100644 index 7cce14a3..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.mograsim.logic.model.am2900.components; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class Modelsel4_12 extends SimpleRectangularHardcodedModelComponent -{ - public Modelsel4_12(LogicModelModifiable model, String name) - { - super(model, "sel4_12", name, "4-way SEL\n12 bit", false); - setSize(80, 40); - addPin(new Pin(model, this, "SA", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "SB", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); - addPin(new Pin(model, this, "SC", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); - addPin(new Pin(model, this, "SD", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); - addPin(new Pin(model, this, "A", 12, PinUsage.INPUT, 10, 0), Position.BOTTOM); - addPin(new Pin(model, this, "B", 12, PinUsage.INPUT, 30, 0), Position.BOTTOM); - addPin(new Pin(model, this, "C", 12, PinUsage.INPUT, 50, 0), Position.BOTTOM); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 70, 0), Position.BOTTOM); - addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 40, 40), Position.TOP); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit SAVal = readEnds.get("SA").getValue(); - Bit SBVal = readEnds.get("SB").getValue(); - Bit SCVal = readEnds.get("SC").getValue(); - Bit SDVal = readEnds.get("SD").getValue(); - BitVector YVal; - if (SAVal == X || SBVal == X || SCVal == X || SDVal == X) - YVal = BitVector.of(X, 12); - else if (SAVal == U || SBVal == U || SCVal == U || SDVal == U) - YVal = BitVector.of(U, 12); - else if (SAVal == Z || SBVal == Z || SCVal == Z || SDVal == Z) - YVal = BitVector.of(X, 12); - else - { - YVal = null; - if (SAVal == ONE) - YVal = readEnds.get("A").getValues(); - if (SBVal == ONE) - if (YVal != null) - YVal = BitVector.of(X, 12); - else - YVal = readEnds.get("B").getValues(); - if (SCVal == ONE) - if (YVal != null) - YVal = BitVector.of(X, 12); - else - YVal = readEnds.get("C").getValues(); - if (SDVal == ONE) - if (YVal != null) - YVal = BitVector.of(X, 12); - else - YVal = readEnds.get("D").getValues(); - if (YVal == null) - YVal = BitVector.of(ZERO, 12); - } - - readWriteEnds.get("Y").feedSignals(YVal); - return null; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(Modelsel4_12.class.getCanonicalName(), (m, p, n) -> new Modelsel4_12(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java deleted file mode 100644 index 880d17c9..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java +++ /dev/null @@ -1,286 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2904; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2904RegCTInstrDecode extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2904RegCTInstrDecode(LogicModelModifiable model, String name) - { - super(model, "Am2904RegCTInstrDecode", name, "Instruction\ndecode", false); - setSize(80, 80); - addPin(new Pin(model, this, "I12-11", 2, PinUsage.INPUT, 0, 30), Position.RIGHT); - addPin(new Pin(model, this, "I5-0", 6, PinUsage.INPUT, 0, 50), Position.RIGHT); - // muSR MUX: - // 00: 0 - // 01: 1 - // 10: M - // 11: I - addPin(new Pin(model, this, "muSR_MUX", 2, PinUsage.OUTPUT, 80, 10), Position.LEFT); - addPin(new Pin(model, this, "muSR_OVRRET", 1, PinUsage.OUTPUT, 80, 20), Position.LEFT); - addPin(new Pin(model, this, "muSR_CINV", 1, PinUsage.OUTPUT, 80, 30), Position.LEFT); - addPin(new Pin(model, this, "muSR_WEZ", 1, PinUsage.OUTPUT, 80, 40), Position.LEFT); - addPin(new Pin(model, this, "muSR_WEC", 1, PinUsage.OUTPUT, 80, 50), Position.LEFT); - addPin(new Pin(model, this, "muSR_WEN", 1, PinUsage.OUTPUT, 80, 60), Position.LEFT); - addPin(new Pin(model, this, "muSR_WEOVR", 1, PinUsage.OUTPUT, 80, 70), Position.LEFT); - // MSR MUX: - // 000: 0 - // 001: 1 - // 010: mu - // 011: Y - // 100: I - // 101: I, invert C - // 110: Swap OVR and C - // 111: _M - addPin(new Pin(model, this, "MSR_MUX", 3, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); - addPin(new Pin(model, this, "OEN", 1, PinUsage.OUTPUT, 60, 0), Position.BOTTOM); - // Y MUX: - // 00: mu - // 01: mu - // 10: M - // 11: I - addPin(new Pin(model, this, "Y_MUX", 2, PinUsage.OUTPUT, 10, 80), Position.TOP); - // CT MUX: - // see Am2900 Family Data Book, Am2904, Table 4 (CT_MUX2-0 = I3-1) - addPin(new Pin(model, this, "CT_MUX", 3, PinUsage.OUTPUT, 30, 80), Position.TOP); - addPin(new Pin(model, this, "CT_INV", 1, PinUsage.OUTPUT, 40, 80), Position.TOP); - addPin(new Pin(model, this, "CT_EXP", 1, PinUsage.OUTPUT, 50, 80), Position.TOP); - // C0 MUX: - // 00xx: 0 - // 01xx: 1 - // 10xx: CX - // 1100: muC - // 1101: _muC - // 1110: MC - // 1111: _MC - addPin(new Pin(model, this, "C0_MUX", 4, PinUsage.OUTPUT, 70, 80), Position.TOP); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] I5_0Bits = readEnds.get("I5-0").getValues().getBits(); - Bit[] I12_11Bits = readEnds.get("I12-11").getValues().getBits(); - int IAsInt = 0; - for (int i = 0; i < 6; i++) - switch (I5_0Bits[5 - i]) - { - case ONE: - IAsInt |= 1 << i; - break; - case U: - for (ReadWriteEnd e : readWriteEnds.values()) - e.feedSignals(BitVector.of(U, e.width())); - return null; - case X: - case Z: - for (ReadWriteEnd e : readWriteEnds.values()) - e.feedSignals(BitVector.of(X, e.width())); - return null; - case ZERO: - break; - default: - throw new IllegalArgumentException("Unknown enum constant: " + I5_0Bits[i]); - } - switch (IAsInt) - { - case 0: - case 2: - readWriteEnds.get("muSR_MUX").feedSignals(ONE, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 1: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 3: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 6: - case 7: - readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ONE); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 8: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 9: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 10: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 11: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 12: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 13: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); - break; - case 14: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 15: - readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); - readWriteEnds.get("muSR_WEC").feedSignals(ZERO); - readWriteEnds.get("muSR_WEN").feedSignals(ZERO); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - case 24: - case 25: - case 40: - case 41: - case 56: - case 57: - readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ONE); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - break; - default: - readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); - readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); - readWriteEnds.get("muSR_CINV").feedSignals(ZERO); - readWriteEnds.get("muSR_WEZ").feedSignals(ONE); - readWriteEnds.get("muSR_WEC").feedSignals(ONE); - readWriteEnds.get("muSR_WEN").feedSignals(ONE); - readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); - } - switch (IAsInt) - { - case 0: - readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ONE, ONE); - break; - case 1: - readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 2: - readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ONE, ZERO); - break; - case 3: - readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 4: - readWriteEnds.get("MSR_MUX").feedSignals(ONE, ONE, ZERO); - break; - case 5: - readWriteEnds.get("MSR_MUX").feedSignals(ONE, ONE, ONE); - break; - case 8: - case 9: - case 24: - case 25: - case 40: - case 41: - case 56: - case 57: - readWriteEnds.get("MSR_MUX").feedSignals(ONE, ZERO, ONE); - break; - default: - readWriteEnds.get("MSR_MUX").feedSignals(ONE, ZERO, ZERO); - break; - } - readWriteEnds.get("OEN").feedSignals(I5_0Bits[0].or(I5_0Bits[1]).or(I5_0Bits[2]).or(I5_0Bits[3]).or(I5_0Bits[4]).or(I5_0Bits[5])); - readWriteEnds.get("Y_MUX").feedSignals(I5_0Bits[0], I5_0Bits[1]); - readWriteEnds.get("CT_INV").feedSignals(I5_0Bits[5]); - readWriteEnds.get("CT_MUX").feedSignals(I5_0Bits[2], I5_0Bits[3], I5_0Bits[4]); - readWriteEnds.get("CT_EXP").feedSignals((IAsInt & 0b111110) == 0b001110 ? ONE : ZERO); - readWriteEnds.get("C0_MUX").feedSignals(I12_11Bits[0], I12_11Bits[1], I5_0Bits[0], - I5_0Bits[2].and(I5_0Bits[3].not()).and(I5_0Bits[4].not())); - return null; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2904RegCTInstrDecode.class.getCanonicalName(), - (m, p, n) -> new ModelAm2904RegCTInstrDecode(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java deleted file mode 100644 index 3e97cc6c..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java +++ /dev/null @@ -1,323 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2904; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.Z; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2904ShiftInstrDecode extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2904ShiftInstrDecode(LogicModelModifiable model, String name) - { - super(model, "Am2904ShiftInstrDecode", name, "Shift \ninstruction\ndecode", false); - setSize(60, 80); - addPin(new Pin(model, this, "I", 5, PinUsage.INPUT, 0, 25), Position.RIGHT); - addPin(new Pin(model, this, "_SE", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); - // SIO0 MUX: - // 000: 0 - // 001: 1 - // 01x: SIOn - // 10x: QIOn - // 11x: MC - addPin(new Pin(model, this, "SIO0_MUX", 3, PinUsage.OUTPUT, 60, 5), Position.LEFT); - // SIOn MUX: - // 000: 0 - // 001: 1 - // 010: SIO0 - // 011: QIO0 - // 100: MC - // 101: MN - // 110: IC - // 111: IN xor IVOR - addPin(new Pin(model, this, "SIOn_MUX", 3, PinUsage.OUTPUT, 60, 15), Position.LEFT); - // QIO0 MUX: - // 000: 0 - // 001: 1 - // 01x: SIOn - // 10x: QIOn - // 11x: MC - addPin(new Pin(model, this, "QIO0_MUX", 3, PinUsage.OUTPUT, 60, 25), Position.LEFT); - // QIOn MUX: - // 000: 0 - // 001: 1 - // 01x: SIO0 - // 10x: QIO0 - // 11x: MN - addPin(new Pin(model, this, "QIOn_MUX", 3, PinUsage.OUTPUT, 60, 35), Position.LEFT); - addPin(new Pin(model, this, "OEn", 1, PinUsage.OUTPUT, 60, 45), Position.LEFT); - addPin(new Pin(model, this, "OE0", 1, PinUsage.OUTPUT, 60, 55), Position.LEFT); - // 00: SIO0 - // 01: QIO0 - // 1x: SIOn - addPin(new Pin(model, this, "MC_MUX", 2, PinUsage.OUTPUT, 60, 65), Position.LEFT); - addPin(new Pin(model, this, "MC_EN", 1, PinUsage.OUTPUT, 60, 75), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit _SE = readEnds.get("_SE").getValue(); - BitVector I = readEnds.get("I").getValues(); - readWriteEnds.get("OEn").feedSignals(I.getMSBit(0).not().and(_SE.not())); - readWriteEnds.get("OE0").feedSignals(I.getMSBit(0).and(_SE.not())); - if (_SE == Z || _SE == X) - { - readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("MC_MUX").feedSignals(X, X); - readWriteEnds.get("MC_EN").feedSignals(X); - return null; - } else if (_SE == U) - { - - readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U); - readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U); - readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U); - readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U); - readWriteEnds.get("MC_MUX").feedSignals(U, U); - readWriteEnds.get("MC_EN").feedSignals(U); - return null; - } else if (_SE == ONE) - { - readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("MC_MUX").feedSignals(X, X); - readWriteEnds.get("MC_EN").feedSignals(ZERO); - return null; - } - if (!I.isBinary()) - { - Bit val = null; - for (Bit b : I.getBits()) - if (!b.isBinary()) - { - val = b; - break; - } - readWriteEnds.get("SIO0_MUX").feedSignals(val, val, val); - readWriteEnds.get("SIOn_MUX").feedSignals(val, val, val); - readWriteEnds.get("QIO0_MUX").feedSignals(val, val, val); - readWriteEnds.get("QIOn_MUX").feedSignals(val, val, val); - readWriteEnds.get("MC_MUX").feedSignals(val, val); - readWriteEnds.get("MC_EN").feedSignals(val); - return null; - } - int IAsInt = I.getUnsignedValue().intValue(); - if (IAsInt < 16) - { - readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); - switch (IAsInt) - { - case 0: - case 2: - case 6: - case 7: - readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 1: - case 3: - readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 4: - case 9: - case 12: - readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ZERO); - break; - case 5: - readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ONE); - break; - case 8: - case 10: - readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ZERO); - break; - case 11: - readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ZERO); - break; - case 13: - case 15: - readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ONE); - break; - case 14: - readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ONE); - break; - default: - throw new IllegalStateException("can't happen"); - } - switch (IAsInt) - { - case 0: - readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 1: - readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 2: - readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ONE, X); - break; - case 3: - case 4: - case 5: - case 6: - case 7: - case 11: - case 12: - case 13: - case 14: - case 15: - readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ONE, X); - break; - case 8: - case 9: - case 10: - readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ZERO, X); - break; - default: - throw new IllegalStateException("can't happen"); - } - } else - { - readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); - readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); - switch (IAsInt) - { - case 16: - case 18: - readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 17: - case 19: - readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 20: - case 21: - case 22: - case 23: - case 28: - case 29: - case 30: - case 31: - readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X); - break; - case 24: - case 26: - readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X); - break; - case 25: - case 27: - readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ONE, X); - break; - default: - throw new IllegalStateException("can't happen"); - } - switch (IAsInt) - { - case 16: - case 18: - case 20: - case 22: - case 27: - readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ZERO); - break; - case 17: - case 19: - case 21: - case 23: - readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ONE); - break; - case 24: - case 25: - case 26: - readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X); - break; - case 28: - case 30: - readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X); - break; - case 29: - case 31: - readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ONE, X); - break; - default: - throw new IllegalStateException("can't happen"); - } - } - // MC - switch (IAsInt) - { - case 0: - case 1: - case 3: - case 4: - case 5: - case 6: - case 10: - case 11: - case 14: - case 15: - case 18: - case 19: - case 22: - case 23: - case 26: - case 27: - case 30: - case 31: - readWriteEnds.get("MC_EN").feedSignals(ZERO); - readWriteEnds.get("MC_MUX").feedSignals(X, X); - break; - case 2: - case 8: - case 9: - readWriteEnds.get("MC_EN").feedSignals(ONE); - readWriteEnds.get("MC_MUX").feedSignals(ZERO, ZERO); - break; - case 7: - case 12: - case 13: - readWriteEnds.get("MC_EN").feedSignals(ONE); - readWriteEnds.get("MC_MUX").feedSignals(ZERO, ONE); - break; - case 16: - case 17: - case 20: - case 21: - case 24: - case 25: - case 28: - case 29: - readWriteEnds.get("MC_EN").feedSignals(ONE); - readWriteEnds.get("MC_MUX").feedSignals(ONE, X); - break; - default: - throw new IllegalStateException("can't happen"); - } - return null; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2904ShiftInstrDecode.class.getCanonicalName(), - (m, p, n) -> new ModelAm2904ShiftInstrDecode(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java deleted file mode 100644 index a96b6795..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java +++ /dev/null @@ -1,267 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2910; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2910InstrPLA extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2910InstrPLA(LogicModelModifiable model, String name) - { - super(model, "Am2910InstrPLA", name, "Instr.\nPLA", false); - setSize(30, 85); - addPin(new Pin(model, this, "PASS", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "I", 4, PinUsage.INPUT, 0, 20), Position.RIGHT); - addPin(new Pin(model, this, "R=0", 1, PinUsage.INPUT, 15, 0), Position.BOTTOM); - addPin(new Pin(model, this, "_PL", 1, PinUsage.OUTPUT, 5, 85), Position.TOP); - addPin(new Pin(model, this, "_MAP", 1, PinUsage.OUTPUT, 15, 85), Position.TOP); - addPin(new Pin(model, this, "_VECT", 1, PinUsage.OUTPUT, 25, 85), Position.TOP); - addPin(new Pin(model, this, "RWE", 1, PinUsage.OUTPUT, 30, 5), Position.LEFT); - addPin(new Pin(model, this, "RDEC", 1, PinUsage.OUTPUT, 30, 15), Position.LEFT); - addPin(new Pin(model, this, "YD", 1, PinUsage.OUTPUT, 30, 25), Position.LEFT); - addPin(new Pin(model, this, "YR", 1, PinUsage.OUTPUT, 30, 35), Position.LEFT); - addPin(new Pin(model, this, "YF", 1, PinUsage.OUTPUT, 30, 45), Position.LEFT); - addPin(new Pin(model, this, "YmuPC", 1, PinUsage.OUTPUT, 30, 55), Position.LEFT); - addPin(new Pin(model, this, "STKI0", 1, PinUsage.OUTPUT, 30, 65), Position.LEFT); - addPin(new Pin(model, this, "STKI1", 1, PinUsage.OUTPUT, 30, 75), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - ReadEnd PASS = readEnds.get("PASS"); - ReadEnd I = readEnds.get("I"); - ReadEnd Req0 = readEnds.get("R=0"); - ReadWriteEnd _PL = readWriteEnds.get("_PL"); - ReadWriteEnd _MAP = readWriteEnds.get("_MAP"); - ReadWriteEnd _VECT = readWriteEnds.get("_VECT"); - ReadWriteEnd RWE = readWriteEnds.get("RWE"); - ReadWriteEnd RDEC = readWriteEnds.get("RDEC"); - ReadWriteEnd YD = readWriteEnds.get("YD"); - ReadWriteEnd YR = readWriteEnds.get("YR"); - ReadWriteEnd YF = readWriteEnds.get("YF"); - ReadWriteEnd YmuPC = readWriteEnds.get("YmuPC"); - ReadWriteEnd STKI0 = readWriteEnds.get("STKI0"); - ReadWriteEnd STKI1 = readWriteEnds.get("STKI1"); - - Bit PASSVal = PASS.getValue(); - Bit I3Val = I.getValue(3); - Bit I2Val = I.getValue(2); - Bit I1Val = I.getValue(1); - Bit I0Val = I.getValue(0); - Bit Req0Val = Req0.getValue(); - - if (!I3Val.isBinary() || !I2Val.isBinary() || !I1Val.isBinary() || !I0Val.isBinary()) - if ((I3Val == U || I3Val.isBinary()) || (I2Val == U || I2Val.isBinary()) || (I1Val == U || I1Val.isBinary()) - || (I0Val == U || I0Val.isBinary())) - { - _PL.feedSignals(U); - _MAP.feedSignals(U); - _VECT.feedSignals(U); - RWE.feedSignals(U); - RDEC.feedSignals(U); - YD.feedSignals(U); - YR.feedSignals(U); - YF.feedSignals(U); - YmuPC.feedSignals(U); - STKI0.feedSignals(U); - STKI1.feedSignals(U); - } else - { - _PL.feedSignals(X); - _MAP.feedSignals(X); - _VECT.feedSignals(X); - RWE.feedSignals(X); - RDEC.feedSignals(X); - YD.feedSignals(X); - YR.feedSignals(X); - YF.feedSignals(X); - YmuPC.feedSignals(X); - STKI0.feedSignals(X); - STKI1.feedSignals(X); - } - else - { - int IAsInt = (I3Val == ONE ? 8 : 0) + (I2Val == ONE ? 4 : 0) + (I1Val == ONE ? 2 : 0) + (I0Val == ONE ? 1 : 0); - Bit _PLVal = ONE; - Bit _MAPVal = ONE; - Bit _VECTVal = ONE; - if (IAsInt == 2) - _MAPVal = ZERO; - else if (IAsInt == 6) - _VECTVal = ZERO; - else - _PLVal = ZERO; - _PL.feedSignals(_PLVal); - _MAP.feedSignals(_MAPVal); - _VECT.feedSignals(_VECTVal); - if (IAsInt == 8 || IAsInt == 9 || IAsInt == 15) - { - RWE.feedSignals(Req0Val); - RDEC.feedSignals(Req0Val);// "forward" X/U/Z - } else if (IAsInt == 4) - { - RWE.feedSignals(PASSVal); - RDEC.feedSignals(PASSVal == ONE ? ZERO : PASSVal);// "forward" X/U/Z - } else - { - RWE.feedSignals(ZERO); - RDEC.feedSignals(ZERO); - } - if (!PASSVal.isBinary()) - { - YD.feedSignals(PASSVal);// "forward" X/U/Z - YR.feedSignals(PASSVal);// "forward" X/U/Z - YF.feedSignals(PASSVal);// "forward" X/U/Z - YmuPC.feedSignals(PASSVal);// "forward" X/U/Z - } else - { - Bit YDVal = ZERO; - Bit YRVal = ZERO; - Bit YFVal = ZERO; - Bit YmuPCVal = ZERO; - switch (IAsInt + (PASSVal == ONE ? 16 : 0)) - { - case 0: - case 0 + 16: - break; - case 2: - case 1 + 16: - case 2 + 16: - case 3 + 16: - case 5 + 16: - case 6 + 16: - case 7 + 16: - case 11 + 16: - YDVal = ONE; - break; - case 5: - case 7: - YRVal = ONE; - break; - case 13: - case 10 + 16: - YFVal = ONE; - break; - case 1: - case 3: - case 4: - case 6: - case 10: - case 11: - case 12: - case 14: - case 4 + 16: - case 12 + 16: - case 13 + 16: - case 14 + 16: - case 15 + 16: - YmuPCVal = ONE; - break; - case 8: - case 8 + 16: - YFVal = Req0Val.not();// "forward" X/U/Z - YmuPCVal = Req0Val;// "forward" X/U/Z - break; - case 9: - case 9 + 16: - YDVal = Req0Val.not();// "forward" X/U/Z - YmuPCVal = Req0Val;// "forward" X/U/Z - break; - case 15: - YFVal = Req0Val.not();// "forward" X/U/Z - YDVal = Req0Val;// "forward" X/U/Z - break; - default: - throw new IllegalStateException("shouldn't happen"); - } - YD.feedSignals(YDVal); - YR.feedSignals(YRVal); - YF.feedSignals(YFVal); - YmuPC.feedSignals(YmuPCVal); - Bit STKI0Val; - Bit STKI1Val; - switch (IAsInt + (PASSVal == ONE ? 16 : 0)) - { - case 1: - case 2: - case 3: - case 6: - case 7: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 2 + 16: - case 3 + 16: - case 6 + 16: - case 7 + 16: - case 9 + 16: - case 12 + 16: - case 14 + 16: - // HOLD - STKI1Val = ZERO; - STKI0Val = ZERO; - break; - case 4: - case 5: - case 1 + 16: - case 4 + 16: - case 5 + 16: - // PUSH - STKI1Val = ZERO; - STKI0Val = ONE; - break; - case 0: - case 0 + 16: - // CLEAR - STKI1Val = ONE; - STKI0Val = ZERO; - break; - case 10 + 16: - case 11 + 16: - case 13 + 16: - case 15 + 16: - // POP - STKI1Val = ONE; - STKI0Val = ONE; - break; - case 8: - case 15: - case 8 + 16: - STKI1Val = Req0Val;// "forward" X/U/Z - STKI0Val = Req0Val;// "forward" X/U/Z - break; - default: - throw new IllegalStateException("shouldn't happen"); - } - STKI0.feedSignals(STKI0Val); - STKI1.feedSignals(STKI1Val); - } - } - return null; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2910InstrPLA.class.getCanonicalName(), - (m, p, n) -> new ModelAm2910InstrPLA(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java deleted file mode 100644 index 0c101bb4..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2910; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Arrays; -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2910RegCntr extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2910RegCntr(LogicModelModifiable model, String name) - { - super(model, "Am2910RegCntr", name, "Register/\nCounter", false); - setSize(40, 40); - addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 0), Position.BOTTOM); - addPin(new Pin(model, this, "_RLD", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 20), Position.RIGHT); - addPin(new Pin(model, this, "DEC", 1, PinUsage.INPUT, 0, 30), Position.RIGHT); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 40, 20), Position.LEFT); - addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 40), Position.TOP); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - Bit[] QC = (Bit[]) lastState; - if (QC == null) - { - QC = new Bit[13]; - Arrays.fill(QC, U); - } - - ReadEnd D = readEnds.get("D"); - ReadEnd _RLD = readEnds.get("_RLD"); - ReadEnd WE = readEnds.get("WE"); - ReadEnd DEC = readEnds.get("DEC"); - ReadEnd C = readEnds.get("C"); - ReadWriteEnd Y = readWriteEnds.get("Y"); - - Bit oldCVal = QC[12]; - Bit CVal = C.getValue(); - - // TODO handle U/X/Z - if (oldCVal == ZERO && CVal == ONE) - { - if ((DEC.getValue() == ZERO && WE.getValue() == ONE) || _RLD.getValue() == ZERO) - System.arraycopy(D.getValues().getBits(), 0, QC, 0, 12); - else if (WE.getValue() == ONE) - { - Bit carry = Bit.ZERO; - // TODO extract to helper. This code almost also exists in Modelinc. - for (int i = 11; i >= 0; i--) - { - Bit a = QC[i]; - QC[i] = a.xnor(carry); - carry = a.or(carry); - } - } - } - QC[12] = CVal; - Y.feedSignals(Arrays.copyOfRange(QC, 0, 12)); - - return QC; - } - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - switch (stateID) - { - case "q": - return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12)); - default: - return super.getHighLevelState(state, stateID); - } - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - switch (stateID) - { - case "q": - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 12) - throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); - System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12); - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2910RegCntr.class.getCanonicalName(), - (m, p, n) -> new ModelAm2910RegCntr(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java deleted file mode 100644 index a99fe0d5..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java +++ /dev/null @@ -1,134 +0,0 @@ -package net.mograsim.logic.model.am2900.components.am2910; - -import static net.mograsim.logic.core.types.Bit.ONE; -import static net.mograsim.logic.core.types.Bit.U; -import static net.mograsim.logic.core.types.Bit.X; -import static net.mograsim.logic.core.types.Bit.ZERO; - -import java.util.Map; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class ModelAm2910SP extends SimpleRectangularHardcodedModelComponent -{ - public ModelAm2910SP(LogicModelModifiable model, String name) - { - super(model, "Am2910SP", name, "Stack\npointer", false); - setSize(40, 30); - addPin(new Pin(model, this, "STKI0", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); - addPin(new Pin(model, this, "STKI1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); - addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); - addPin(new Pin(model, this, "A", 3, PinUsage.OUTPUT, 10, 30), Position.TOP); - addPin(new Pin(model, this, "B", 3, PinUsage.OUTPUT, 30, 30), Position.TOP); - addPin(new Pin(model, this, "_FULL", 1, PinUsage.OUTPUT, 40, 15), Position.LEFT); - - init(); - } - - @Override - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) - { - BitAndInt SPC = (BitAndInt) lastState; - if (SPC == null) - { - SPC = new BitAndInt(); - SPC.bit = U; - SPC.i = -2; - } - int SP = SPC.i; - - Bit STKI0Val = readEnds.get("STKI0").getValue(); - Bit STKI1Val = readEnds.get("STKI1").getValue(); - Bit CVal = readEnds.get("C").getValue(); - if (SPC.bit == ZERO && CVal == ONE) - if (STKI0Val == U && STKI1Val == U) - SP = -2; - else if (!STKI0Val.isBinary() || !STKI1Val.isBinary()) - SP = -1; - else if (STKI0Val == ONE && STKI1Val == ZERO) - { - // PUSH - if (SP >= 0) - SP = SP == 5 ? 5 : SP + 1; - } else if (STKI0Val == ZERO && STKI1Val == ONE) - // CLEAR - SP = 0; - else if (STKI0Val == ONE && STKI1Val == ONE) - // POP - SP = SP <= 0 ? SP : SP - 1; - readWriteEnds.get("A").feedSignals(getAsBitVector(SP == 0 ? 7 : SP < 0 ? SP : SP - 1)); - readWriteEnds.get("B").feedSignals(getAsBitVector(SP == 5 ? 4 : SP)); - readWriteEnds.get("_FULL").feedSignals(SP == -2 ? U : SP == -1 ? X : SP == 5 ? ZERO : ONE); - - SPC.i = SP; - SPC.bit = CVal; - return SPC; - } - - @Override - protected Object getHighLevelState(Object state, String stateID) - { - switch (stateID) - { - case "q": - return getAsBitVector(((BitAndInt) state).i); - default: - return super.getHighLevelState(state, stateID); - } - } - - @Override - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - switch (stateID) - { - case "q": - int i; - BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; - if (newHighLevelStateCasted.length() != 3) - throw new IllegalArgumentException("Expected BitVector of length 3, not " + newHighLevelStateCasted.length()); - if (newHighLevelStateCasted.isBinary()) - i = newHighLevelStateCasted.getUnsignedValue().intValue(); - else - i = -1;// this makes setting to U impossible - if (i > 5) - throw new IllegalArgumentException("Given value not in range (0-5 incl.): " + i); - ((BitAndInt) lastState).i = i; - return lastState; - default: - return super.setHighLevelState(lastState, stateID, newHighLevelState); - } - } - - private static class BitAndInt - { - Bit bit; - int i; - } - - /** - * -1 means X, -2 means U - */ - private static BitVector getAsBitVector(int i) - { - if (i == -1) - return BitVector.of(X, 3); - if (i == -2) - return BitVector.of(U, 3); - return BitVector.of((i & 0b100) > 0 ? ONE : ZERO, (i & 0b10) > 0 ? ONE : ZERO, (i & 0b1) > 0 ? ONE : ZERO); - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelAm2910SP.class.getCanonicalName(), (m, p, n) -> new ModelAm2910SP(m, n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java deleted file mode 100644 index 0a0787cc..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java +++ /dev/null @@ -1,104 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import net.mograsim.logic.core.components.CoreClock; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory; -import net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.machine.Machine; -import net.mograsim.machine.MachineDefinition; -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.Register; -import net.mograsim.machine.mi.MicroInstructionMemory; -import net.mograsim.machine.mi.StandardMicroInstructionMemory; -import net.mograsim.machine.standard.memory.WordAddressableMemory; - -public class Am2900Machine implements Machine -{ - private Am2900MachineDefinition machineDefinition; - private LogicModelModifiable logicModel; - private Timeline timeline; - private MainMemory mainMemory; - private MicroInstructionMemory instMemory; - private CoreClock clock; - - public Am2900Machine(Am2900MachineDefinition am2900MachineDefinition) - { - this.machineDefinition = am2900MachineDefinition; - logicModel = new LogicModelModifiable(); - IndirectModelComponentCreator.createComponent(logicModel, - "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", "Am2900"); - CoreModelParameters params = new CoreModelParameters(); - params.gateProcessTime = 50; - params.wireTravelTime = 10; - mainMemory = new WordAddressableMemory(am2900MachineDefinition.getMainMemoryDefinition()); - instMemory = new StandardMicroInstructionMemory(am2900MachineDefinition.getMicroInstructionMemoryDefinition()); - logicModel.getComponentBySubmodelPath("Am2900.Am2900MainMemory#0", ModelAm2900MainMemory.class).setMachine(this); - logicModel.getComponentBySubmodelPath("Am2900.Am2900MicroInstructionMemory#0", ModelAm2900MicroInstructionMemory.class) - .setMachine(this); - timeline = LogicCoreAdapter.convert(logicModel, params); - } - - @Override - public MachineDefinition getDefinition() - { - return machineDefinition; - } - - @Override - public void reset() - { - // TODO Auto-generated method stub - - } - - @Override - public LogicModel getModel() - { - return logicModel; - } - - @Override - public Timeline getTimeline() - { - return timeline; - } - - @Override - public CoreClock getClock() - { - return clock; - } - - @Override - public BitVector getRegister(Register r) - { - // TODO Auto-generated method stub - return null; - } - - @Override - public void setRegister(Register r, BitVector value) - { - // TODO Auto-generated method stub - - } - - @Override - public MainMemory getMainMemory() - { - return mainMemory; - } - - @Override - public MicroInstructionMemory getMicroInstructionMemory() - { - return instMemory; - } - -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java deleted file mode 100644 index 0ac06ea7..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import java.util.Objects; -import java.util.Set; - -import net.mograsim.machine.ISASchema; -import net.mograsim.machine.Machine; -import net.mograsim.machine.MachineDefinition; -import net.mograsim.machine.MachineRegistry; -import net.mograsim.machine.MainMemoryDefinition; -import net.mograsim.machine.Register; -import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; - -public class Am2900MachineDefinition implements MachineDefinition -{ - private MainMemoryDefinition memoryDefinition = new Am2900MainMemoryDefinition(); - private MicroInstructionMemoryDefinition microInstMemoryDefinition = new Am2900MicroInstructionMemoryDefinition(); - private final static Am2900MachineDefinition instance = new Am2900MachineDefinition(); - - public static Am2900MachineDefinition getInstance() - { - return Objects.requireNonNullElseGet((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"), - () -> instance); - } - - @Override - public Machine createNew() - { - return new Am2900Machine(this); - } - - @Override - public ISASchema getISASchema() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public Set getRegisters() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public int getAddressBits() - { - return 16; - } - - @Override - public MainMemoryDefinition getMainMemoryDefinition() - { - return memoryDefinition; - } - - @Override - public MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition() - { - return microInstMemoryDefinition; - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java deleted file mode 100644 index 478ec242..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import net.mograsim.machine.MainMemoryDefinition; - -public class Am2900MainMemoryDefinition implements MainMemoryDefinition -{ - - @Override - public int getMemoryAddressBits() - { - return 16; - } - - @Override - public long getMinimalAddress() - { - return 0; - } - - @Override - public long getMaximalAddress() - { - return 0xFFFF; - } - - @Override - public int getCellWidth() - { - return 16; - } - -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java deleted file mode 100644 index 3657bed9..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java +++ /dev/null @@ -1,112 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import java.util.Arrays; -import java.util.Optional; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.parameters.BooleanClassification; -import net.mograsim.machine.mi.parameters.IntegerClassification; -import net.mograsim.machine.mi.parameters.MnemonicFamily; -import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair; -import net.mograsim.machine.mi.parameters.ParameterClassification; - -public class Am2900MicroInstructionDefinition implements MicroInstructionDefinition -{ - private static final BooleanClassification interruptEnable = new BooleanClassification(false, "IE", "Dis"); - // not implemented, because not documented. - private static final MnemonicFamily interruptInstructions = new MnemonicFamily("X", new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))); - private static final BooleanClassification kmux = new BooleanClassification(false, "D", "K"); - private static final MnemonicFamily am2901SrcInstructions = new MnemonicFamily("AB", "AQ", "AB", "ZQ", "ZB", "ZA", "DA", "DQ", "DZ"); - private static final MnemonicFamily am2901FuncInstructions = new MnemonicFamily("ADD", "ADD", "SUBR", "SUBS", "OR", "AND", "NOTRS", - "EXOR", "EXNOR"); - private static final MnemonicFamily am2901DestInstructions = new MnemonicFamily("NOP", "QREG", "NOP", "RAMA", "RAMF", "RAMQD", "RAMD", - "RAMQU", "RAMU"); - private static final IntegerClassification register = new IntegerClassification(0, 4); - private static final BooleanClassification registerSelect = new BooleanClassification(false, "MR", "IR"); - private static final BooleanClassification abus = new BooleanClassification(true, "H", "AB"); - private static final BooleanClassification dbus = new BooleanClassification(true, "H", "DB"); - private static final MnemonicFamily am2904CarryInstructions = new MnemonicFamily("CI0", "CI0", "CI1", "CIX", "CIC"); - private static final MnemonicFamily am2904ShiftInstructions = new MnemonicFamily("RSL / LSLCO", "RSL / LSLCO", "RSH / LSHCO", - "RSCONI / LSL", "RSDH / LSH", "RSDC / LSDLCO", "RSDN / LSDHCO", "RSDL / LSDL", "RSDCO / LSDH", "RSRCO / LSCRO", - "RSRCIO / LSCRIO", "RSR / LSR", "RSDIC / LSLICI", "RSDRCI / LSDCIO", "RSDRCO / LSDRCO", "RSDXOR / LSDCI", "RSDR / LDSR"); -// private static final MnemonicFamily am2904StatusInstructions = new MnemonicFamily( -// new String[] { "MI_Zero", "MI_NotZero", "MI_UGTEQ", "MI_ULT", "MI_UGT", "MI_ULTEQ", "MI_SGTEQ", "MI_SLT", "MI_SGT", "MI_SLTEQ", -// "MA_Zero", "MA_NotZero", "MA_UGTEQ", "MA_ULT", "MA_UGT", "MA_ULTEQ", "MA_SGTEQ", "MA_SLT", "MA_SGT", "MA_SLTEQ" }, -// new long[] { 0b01_0101, 0b01_0100, 0b01_1101, 0b01_1100, 0b01_1110, 0b01_1111, 0b01_0010, 0b01_0011, 0b01_0000, 0b01_0001, -// 0b10_0101, 0b10_0100, 0b10_1101, 0b10_1100, 0b10_1110, 0b10_1111, 0b10_0010, 0b10_0011, 0b10_0000, 0b10_0001 }, -// 6); - // TODO: Maybe "X" and "notX" are swapped. - private static final MnemonicFamily am2904StatusInstructions = new MnemonicFamily("Load_Load_I_Z", "LoadM_LoadY_µ_NxorOVRorZ", - "Set_Set_µ_NxnorOVRornotZ", "Swap_Swap_µ_NxorOVR", "Reset_Reset_µ_NxnorOVR", "Load_LoadForShiftThroughOvr_µ_Z", - "Load_Invert_µ_notZ", "LoadOvrRetain_Load_µ_OVR", "LoadOvrRetain_Load_µ_notOVR", "ResetZ_LoadCarryInvert_µ_CorZ", - "SetZ_LoadCarryInvert_µ_notCandnotZ", "ResetC_Load_µ_C", "SetC_Load_µ_notC", "ResetN_Load_µ_notCorZ", "SetN_Load_µ_CandnotZ", - "ResetOvr_Load_IM_NxorN", "SetOvr_Load_IM_NxnorN", "Load_Load_µ_NxorOVRorZ", "Load_Load_µ_NxnorOVRornotZ", - "Load_Load_µ_NxorOVR", "Load_Load_µ_NxnorOVR", "Load_Load_µ_Z", "Load_Load_µ_notZ", "Load_Load_µ_OVR", "Load_Load_µ_notOVR", - "LoadCarryInvert_LoadCarryInvert_µ_CorZ", "LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ", "Load_Load_µ_C", "Load_Load_µ_notC", - "Load_Load_µ_notCorZ", "Load_Load_µ_CandnotZ", "Load_Load_µ_N", "Load_Load_µ_notN", "Load_Load_M_NxorOVRorZ", - "Load_Load_M_NxnorOVRornotZ", "Load_Load_M_NxorOVR", "Load_Load_M_NxnorOVR", "Load_Load_M_Z", "Load_Load_M_notZ", - "Load_Load_M_OVR", "Load_Load_M_notOVR", "LoadCarryInvert_LoadCarryInvert_M_CorZ", - "LoadCarryInvert_LoadCarryInvert_M_notCandnotZ", "Load_Load_M_C", "Load_Load_M_notC", "Load_Load_M_notCorZ", - "Load_Load_M_CandnotZ", "Load_Load_M_N", "Load_Load_M_notN", "Load_Load_I_NxorOVRorZ", "Load_Load_I_NxnorOVRornotZ", - "Load_Load_I_NxorOVR", "Load_Load_I_NxnorOVR", "Load_Load_I_Z", "Load_Load_I_notZ", "Load_Load_I_OVR", "Load_Load_I_notOVR", - "LoadCarryInvert_LoadCarryInvert_I_notCorZ", "LoadCarryInvert_LoadCarryInvert_I_CandnotZ", "Load_Load_I_C", "Load_Load_I_notC", - "Load_Load_I_notCorZ", "Load_Load_I_CandnotZ", "Load_Load_I_N", "Load_Load_I_notN"); - private static final BooleanClassification ccen = new BooleanClassification(true, "PS", "C"); - private static final MnemonicFamily am2910Instructions = new MnemonicFamily("CONT", "JZ", "CJS", "JMAP", "CJP", "PUSH", "JSRP", "CJV", - "JRP", "RFCT", "RPCT", "CRTN", "CJPP", "LDCT", "LOOP", "CONT", "TWB"); - - private static final IntegerClassification constant_12bit = new IntegerClassification(0, 12); - private static final IntegerClassification constant_16bit = new IntegerClassification(0, 16); - private static final BooleanClassification hE = new BooleanClassification(true, "H", "E"); - private static final BooleanClassification hI = new BooleanClassification(true, "H", "I"); - private static final BooleanClassification hL = new BooleanClassification(true, "H", "L"); - private static final BooleanClassification rW = new BooleanClassification(true, "R", "W"); - - private static final ParameterClassification[] classes = { interruptEnable, interruptInstructions, kmux, constant_16bit, - am2901SrcInstructions, am2901FuncInstructions, am2901DestInstructions, register, registerSelect, register, registerSelect, abus, - dbus, am2904CarryInstructions, am2904ShiftInstructions, hL, hL, am2904StatusInstructions, ccen, am2910Instructions, - constant_12bit, hL, hE, hI, hE, hL, rW }; - - private static final String[] paramDesc = { "Allow interrupts?", "Interrupt instructions; omitted for simplicity", - "Get D-input from data bus/constant value", "Constant value", "Operand sources for ALU operation", "ALU operation", - "Destination of ALU calculation", "Register for A-operand", "Get A-operand from instruction register/micro instruction?", - "Register for B-operand", "Get B-operand from instruction register/micro instruction?", - "Put data from Y-output on address bus?", "Put data from Y-output on data bus?", "Source for carry-in", "Shift instructions", - "Modify micro status register?", "Modify macro status register?", "Operations on the status register", - "Is conditional jump enabled?", "Instructions for the micro instruction pointer", "Absolute address of a micro instruction", - "Load instruction pointer from data bus?", "Put instruction pointer on data bus?", "Increment instruction pointer?", - "Put instruction pointer on address bus?", "Load instruction register from data bus?", "Read from/Write to main memory?" }; - - @Override - public ParameterClassification[] getParameterClassifications() - { - return classes; - } - - @Override - public ParameterClassification getParameterClassification(int index) - { - return classes[index]; - } - - @Override - public Optional getParameterDescription(int index) - { - return Optional.of(paramDesc[index]); - } - - public static void main(String[] args) - { - String s = "new BooleanClassification(\"R\", \"W\"), hL, new BooleanClassification(\"H\", \"E\"),\r\n" - + " new BooleanClassification(\"H\", \"I\"), new BooleanClassification(\"H\", \"E\"), hL, new IntegerClassification(12), am2910Instructions,\r\n" - + " new BooleanClassification(\"PS\", \"C\"), am2904StatusInstructions, hL, hL, am2904ShiftInstructions, am2904CarryInstructions,\r\n" - + " new BooleanClassification(\"H\", \"DB\"), new BooleanClassification(\"H\", \"AB\"), registerSelect, register, registerSelect, register,\r\n" - + " am2901DestInstructions, am2901FuncInstructions, am2901SrcInstructions, new IntegerClassification(16),\r\n" - + " new BooleanClassification(\"D\", \"K\"), interruptInstructions, new BooleanClassification(\"Dis\", \"IE\")"; - s = s.replaceAll("[\r\n\t]", ""); - System.out.print(Arrays.stream(s.split(", new")).reduce((a, b) -> b + ", new" + a)); -// System.out.println(Arrays.stream(paramDesc).reduce("", (a, b) -> String.format("\"%s\", %s", b, a))); - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java deleted file mode 100644 index 01b83212..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.am2900.machine; - -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; - -public class Am2900MicroInstructionMemoryDefinition implements MicroInstructionMemoryDefinition -{ - - @Override - public int getMemoryAddressBits() - { - return 12; - } - - @Override - public long getMinimalAddress() - { - return 0; - } - - @Override - public long getMaximalAddress() - { - return 4096; - } - - @Override - public MicroInstructionDefinition getMicroInstructionDefinition() - { - return new Am2900MicroInstructionDefinition(); - } -} diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json deleted file mode 100644 index b753895c..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "version": "0.1.0", - "map": { - "Am2900MainMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory", - "Am2900MicroInstructionMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory", - "Am2904RegCTInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904RegCTInstrDecode", - "Am2904ShiftInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904ShiftInstrDecode", - "Am2910InstrPLA": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910InstrPLA", - "Am2910RegCntr": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910RegCntr", - "Am2910SP": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910SP", - "dff12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff12", - "dff4_finewe": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff4_finewe", - "inc": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelinc", - "nor12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelnor12", - "ram5_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelram5_12", - "sel4_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelsel4_12", - "Am2900": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", - "Am2901": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901.json", - "Am2901ALUFuncDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json", - "Am2901ALUInclDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json", - "Am2901ALUInclSourceDecodeInclFunctionDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json", - "Am2901ALUOneBit": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json", - "Am2904": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904.json", - "Am2910": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2910/Am2910.json", - "Am2904MSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json", - "Am2904muSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json", - "Am2904TestLogic": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json", - "Am2901DestDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json", - "Am2901SourceDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json", - "_rsLatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/_rsLatch.json", - "and": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and.json", - "and41": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and41.json", - "andor414": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/andor414.json", - "demux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/demux2.json", - "dff": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff.json", - "dff4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4.json", - "dff4_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4_invwe.json", - "dff8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff8.json", - "dff12_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff12_we.json", - "dff16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16.json", - "dff16_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_we.json", - "dff16_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_invwe.json", - "dff80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff80.json", - "dlatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch.json", - "dlatch4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch4.json", - "dlatch8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch8.json", - "dlatch80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch80.json", - "fulladder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/fulladder.json", - "halfadder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/halfadder.json", - "mux1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1.json", - "mux1_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_4.json", - "mux1_8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_8.json", - "mux1_12": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_12.json", - "mux1_16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_16.json", - "mux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux2.json", - "mux3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux3.json", - "nand3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/nand3.json", - "not4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/not4.json", - "or4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or4.json", - "or_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or_4.json", - "ram2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram2.json", - "ram4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram4.json", - "sel1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel1.json", - "sel2_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel2_4.json", - "sel3_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel3_4.json", - "xor": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/xor.json" - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java deleted file mode 100644 index 7a161348..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.mograsim.logic.model.examples; - -import java.util.ArrayList; - -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler.BitVectorSplittingAtomicHighLevelStateHandlerParams; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler.DelegatingAtomicHighLevelStateHandlerParams; - -public class GenerateDff80HighLevelStateHandler -{ - public static void main(String[] args) - { - Am2900Loader.setup(); - LogicModelModifiable model = new LogicModelModifiable(); - DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, null, null, null); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#0");// LSB - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#1"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#2"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#3"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#4"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#5"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#6"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#7"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#8"); - IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#9");// MSB - - StandardHighLevelStateHandler hlsh = new StandardHighLevelStateHandler(comp); - comp.setHighLevelStateHandler(hlsh); - BitVectorSplittingAtomicHighLevelStateHandlerParams p = new BitVectorSplittingAtomicHighLevelStateHandlerParams(); - p.vectorPartLengthes = new ArrayList<>(); - p.vectorPartTargets = new ArrayList<>(); - for (int i = 0; i < 10; i++) - { - addHandlersForByte(comp, hlsh, i, p); - } - hlsh.addAtomicHighLevelState("q", new BitVectorSplittingAtomicHighLevelStateHandler(comp, p)); - - System.out.println(comp.getHighLevelStateHandler().getParamsForSerializingJSON(new IdentifyParams())); - } - - private static void addHandlersForByte(SubmodelComponent comp, StandardHighLevelStateHandler hlsh, int LSByteIndex, - BitVectorSplittingAtomicHighLevelStateHandlerParams p2) - { - // TODO remove the "+ 1" as soon as HighLevelStates count from 0 - // Also replace the 1 in "bitIndexInByte = 1" below with a 0 - int LSBitIndex = LSByteIndex * 8 + 1; - int MSBitIndex = LSBitIndex + 7; - String dffThisByte = "dff8#" + LSByteIndex; - String thisByteHLSID = "q" + MSBitIndex + "-" + LSBitIndex; - - p2.vectorPartLengthes.add(0, 8); - p2.vectorPartTargets.add(0, thisByteHLSID); - - DelegatingAtomicHighLevelStateHandlerParams p = new DelegatingAtomicHighLevelStateHandlerParams(); - p.delegateTarget = dffThisByte; - p.subStateID = "q"; - hlsh.addAtomicHighLevelState(thisByteHLSID, new DelegatingAtomicHighLevelStateHandler(comp, p)); - for (int bitIndexOuter = LSBitIndex, bitIndexInByte = 1; bitIndexOuter <= MSBitIndex; bitIndexOuter++, bitIndexInByte++) - { - p = new DelegatingAtomicHighLevelStateHandlerParams(); - p.delegateTarget = dffThisByte; - p.subStateID = "q" + bitIndexInByte; - hlsh.addAtomicHighLevelState("q" + bitIndexOuter, new DelegatingAtomicHighLevelStateHandler(comp, p)); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java deleted file mode 100644 index 1e654c80..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.mograsim.logic.model.examples; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelComponentTestbench -{ - public static void main(String[] args) - { - SimpleLogicUIStandalone.executeVisualisation(ModelComponentTestbench::createTestbench); - } - - @SuppressWarnings("unused") // for ModelWires being created - public static void createTestbench(LogicModelModifiable model) - { - Am2900Loader.setup(); - ModelComponent comp = IndirectModelComponentCreator.createComponent(model, "Am2900"); - - List inputPinNames = new ArrayList<>(); - List outputPinNames = new ArrayList<>(); - for (Pin p : comp.getPins().values()) - if (p.usage == PinUsage.INPUT) - inputPinNames.add(p.name); - else - outputPinNames.add(p.name); - - inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); - outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); - - comp.moveTo(100, 0); - for (int i = 0; i < inputPinNames.size(); i++) - { - String pinName = inputPinNames.get(i); - ModelManualSwitch sw = new ModelManualSwitch(model, comp.getPin(pinName).logicWidth); - sw.moveTo(0, 20 * i); - new ModelWire(model, comp.getPin(pinName), sw.getOutputPin()); - } - for (int i = 0; i < outputPinNames.size(); i++) - { - String pinName = outputPinNames.get(i); - ModelBitDisplay bd = new ModelBitDisplay(model, comp.getPin(pinName).logicWidth); - bd.moveTo(200, 20 * i); - new ModelWire(model, comp.getPin(pinName), bd.getInputPin()); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java deleted file mode 100644 index f34bf342..00000000 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java +++ /dev/null @@ -1,363 +0,0 @@ -package net.mograsim.logic.model.examples; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; -import java.util.Scanner; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; - -public class ReserializeAndVerifyJSONs -{ - public static double GRIDSIZE = 2.5; - public static boolean changePinUsages = false; - public static boolean changeComponentNames = false; - public static boolean snapWCPs = true; - public static boolean warnNonSnappedPoints = true; - public static boolean warnNonVertHorizLines = true; - public static boolean warnRedundantWires = true; - - public static void main(String[] args) throws IOException - { - Am2900Loader.setup(); - try (Scanner sysin = new Scanner(System.in)) - { - System.out.print("Directory to search for JSONs in / JSON file to reserialize >"); - Path root = Paths.get(sysin.nextLine()); - if (!Files.exists(root)) - throw new IllegalArgumentException("Path doesn't exist"); - if (Files.isRegularFile(root)) - reserializeJSON(root, sysin); - else - { - System.out.print("Recursive? >"); - boolean recursive = Boolean.valueOf(sysin.nextLine()); - try (Stream jsons = recursive ? Files.walk(root) : Files.list(root)) - { - jsons.filter(Files::isRegularFile).filter(p -> p.getFileName().toString().endsWith(".json")) - .forEach(j -> reserializeJSON(j, sysin)); - } - } - } - } - - public static void reserializeJSON(Path componentPath, Scanner sysin) - { - try - { - DeserializedSubmodelComponent comp = (DeserializedSubmodelComponent) IndirectModelComponentCreator - .createComponent(new LogicModelModifiable(), "jsonfile:" + componentPath.toString()); - System.out.println("Reserializing " + componentPath); - LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); - Map componentNameRemapping = new HashMap<>(); - - if (changePinUsages) - changePinUsages(sysin, comp); - if (changeComponentNames) - changeComponentNames(sysin, submodelModifiable, componentNameRemapping); - if (snapWCPs) - snapWCPs(submodelModifiable); - if (warnNonSnappedPoints) - warnNonSnappedPoints(comp, submodelModifiable); - if (warnNonVertHorizLines) - warnNonVertHorizLines(submodelModifiable); - if (warnRedundantWires) - warnRedundantWires(submodelModifiable); - - SubmodelComponentSerializer.serialize(comp, componentPath.toString()); - - if (changeComponentNames) - changeComponentNames_AfterSerialization(sysin, comp, componentNameRemapping); - } - catch (Exception e) - { - System.err.println("An error occurred visiting " + componentPath + ":"); - e.printStackTrace(); - } - } - - private static void warnRedundantWires(LogicModelModifiable submodelModifiable) - { - Map> connectedPinGroups = new HashMap<>(); - submodelModifiable.getComponentsByName().values().stream().map(ModelComponent::getPins).map(Map::values).flatMap(Collection::stream) - .forEach(p -> connectedPinGroups.put(p, new HashSet<>(Arrays.asList(p)))); - submodelModifiable.getWiresByName().values().forEach(w -> - { - Pin pin1 = w.getPin1(); - Pin pin2 = w.getPin2(); - Set pin1Group = connectedPinGroups.get(pin1); - Set pin2Group = connectedPinGroups.get(pin2); - if (pin1Group == pin2Group) - System.out.println(" Wire " + w.name + " connecting " + pin1 + " and " + pin2 + " is redundant"); - else - { - pin1Group.addAll(pin2Group); - pin2Group.forEach(p -> connectedPinGroups.put(p, pin1Group)); - } - }); - } - - private static void changePinUsages(Scanner sysin, DeserializedSubmodelComponent comp) - { - comp.getSupermodelPins().entrySet().stream().sorted(Comparator.comparing(Entry::getKey)).map(Entry::getValue).forEach(pin -> - { - PinUsage usage = null; - while (usage == null) - try - { - System.out.print(" Usage for interface pin " + pin.name + " (empty: " + pin.usage + ") >"); - String usageStr = sysin.nextLine().toUpperCase(); - usage = usageStr.equals("") ? pin.usage - : usageStr.equals("I") ? PinUsage.INPUT - : usageStr.equals("O") ? PinUsage.OUTPUT - : usageStr.equals("T") ? PinUsage.TRISTATE : PinUsage.valueOf(usageStr); - } - catch (@SuppressWarnings("unused") IllegalArgumentException e) - { - System.err.println(" Illegal usage"); - } - setInterfacePinUsage(comp, pin, usage); - }); - } - - private static void changeComponentNames(Scanner sysin, LogicModelModifiable submodelModifiable, - Map componentNameRemapping) - { - componentNameRemapping.put(SubmodelComponent.SUBMODEL_INTERFACE_NAME, SubmodelComponent.SUBMODEL_INTERFACE_NAME); - LogicModelModifiable tempModel = new LogicModelModifiable(); - IdentifyParams iP = new IdentifyParams(); - submodelModifiable.getComponentsByName().entrySet().stream() - .filter(e -> !e.getKey().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)) - .sorted(Comparator.comparing(Entry::getKey, ReserializeAndVerifyJSONs::compareStringsWithIntegers)).forEach(e -> - { - String oldName = e.getKey(); - ModelComponent subcomp = e.getValue(); - String defaultName = tempModel.getDefaultComponentName(subcomp); - String newName = null; - while (newName == null) - { - System.out.print(" New name for component " + oldName + " of type " + subcomp.getIDForSerializing(iP) + " (empty: " - + defaultName + ") >"); - newName = sysin.nextLine(); - if (newName.equals("")) - newName = defaultName; - if (tempModel.getComponentsByName().containsKey(newName)) - { - System.err.println(" There already is a component with that name"); - newName = null; - } - } - componentNameRemapping.put(oldName, newName); - IndirectModelComponentCreator - .createComponent(tempModel, subcomp.getIDForSerializing(iP), subcomp.getParamsForSerializingJSON(iP), newName) - .moveTo(subcomp.getPosX(), subcomp.getPosY()); - }); - SubmodelInterface tempSubmodelInterface = new SubmodelInterface(tempModel); - for (Pin p : submodelModifiable.getComponentsByName().get(SubmodelComponent.SUBMODEL_INTERFACE_NAME).getPins().values()) - tempSubmodelInterface - .addPin(new Pin(tempModel, tempSubmodelInterface, p.name, p.logicWidth, p.usage, p.getRelX(), p.getRelY())); - for (ModelWire w : submodelModifiable.getWiresByName().values()) - createWire(componentNameRemapping::get, tempModel, w); - - Optional o; - while ((o = submodelModifiable.getComponentsByName().values().stream() - .filter(c -> !c.getName().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)).findAny()).isPresent()) - submodelModifiable.destroyComponent(o.get()); - - tempModel.getComponentsByName().values().stream().filter(c -> !c.getName().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)) - .forEach(c -> IndirectModelComponentCreator - .createComponent(submodelModifiable, c.getIDForSerializing(iP), c.getParamsForSerializingJSON(iP), c.getName()) - .moveTo(c.getPosX(), c.getPosY())); - for (ModelWire w : tempModel.getWiresByName().values()) - createWire(Function.identity(), submodelModifiable, w); - } - - private static void changeComponentNames_AfterSerialization(Scanner sysin, DeserializedSubmodelComponent comp, - Map componentNameRemapping) - { - if (comp.getHighLevelStateHandler() == null || !(comp.getHighLevelStateHandler() instanceof DefaultHighLevelStateHandler)) - { - System.out.println(" A non-default HighLevelStateHandler was detected. Check for changes there manually."); - System.out.print(" Empty line to continue to next component, old component name to get new component name >"); - for (String line = sysin.nextLine(); !line.equals(""); line = sysin.nextLine()) - System.out.println(" " + line + "->" + componentNameRemapping.get(line) + " >"); - } - } - - private static void snapWCPs(LogicModelModifiable submodelModifiable) - { - submodelModifiable.getComponentsByName().values().stream().filter(c -> c instanceof ModelWireCrossPoint).forEach(c -> - { - double x = c.getPosX(); - double y = c.getPosY(); - double newX = x % GRIDSIZE == 0 ? x - 1 : x; - double newY = y % GRIDSIZE == 0 ? y - 1 : y; - if (x != newX || y != newY) - { - c.moveTo(newX, newY); - System.out.println(" Snapping WCP " + c.getName()); - } - }); - } - - private static void warnNonSnappedPoints(DeserializedSubmodelComponent comp, LogicModelModifiable submodelModifiable) - { - if (comp.getWidth() % GRIDSIZE != 0 || comp.getHeight() % GRIDSIZE != 0) - System.out.println(" Size is not snapped to grid: " + comp.getWidth() + "," + comp.getHeight()); - submodelModifiable.getComponentsByName().values().forEach(c -> - { - double x = c.getPosX(); - double y = c.getPosY(); - if (c instanceof ModelWireCrossPoint) - { - x++; - y++; - } - if (x % GRIDSIZE != 0 || y % GRIDSIZE != 0) - System.out.println(" Component " + c.getName() + " (type " + c.getIDForSerializing(new IdentifyParams()) - + ") is not snapped to grid: " + x + "," + y); - }); - submodelModifiable.getWiresByName().values().forEach(w -> - { - Point[] p = w.getPath(); - if (p != null) - for (int i = 0; i < p.length; i++) - if (p[i].x % GRIDSIZE != 0 || p[i].y % GRIDSIZE != 0) - System.out.println(" Wire " + w.name + " path point #" + i + " is not snapped to grid: " + p[i].x + "," + p[i].y); - }); - comp.getPins().values().forEach(p -> - { - if (p.getRelX() % GRIDSIZE != 0 || p.getRelY() % GRIDSIZE != 0) - System.out.println(" Interface point " + p.name + " is not snapped to grid: " + p.getRelX() + "," + p.getRelY()); - }); - } - - private static void warnNonVertHorizLines(LogicModelModifiable submodelModifiable) - { - submodelModifiable.getWiresByName().values().forEach(w -> - { - double[] p = w.getEffectivePath(); - for (int i = 1; i < p.length / 2; i++) - { - double x1 = p[2 * i - 2]; - double y1 = p[2 * i - 1]; - double x2 = p[2 * i + 0]; - double y2 = p[2 * i + 1]; - if (x1 != x2 && y1 != y2) - System.out.println(" Wire " + w.name + " part #" + (i - 1) + " is neither vertical nor horizontal"); - } - }); - } - - private static ModelWire createWire(Function componentNameRemapping, LogicModelModifiable tempModelForDefaultNames, - ModelWire w) - { - return new ModelWire(tempModelForDefaultNames, w.name, - getRemappedPin(componentNameRemapping, tempModelForDefaultNames, w.getPin1()), - getRemappedPin(componentNameRemapping, tempModelForDefaultNames, w.getPin2()), w.getPath()); - } - - private static Pin getRemappedPin(Function componentNameRemapping, LogicModelModifiable tempModelForDefaultNames, - Pin pin) - { - return tempModelForDefaultNames.getComponentsByName().get(componentNameRemapping.apply(pin.component.getName())).getPin(pin.name); - } - - private static int compareStringsWithIntegers(String a, String b) - { - int aLoc = 0; - int bLoc = 0; - for (;;) - { - if (aLoc == a.length()) - { - if (bLoc == b.length()) - return 0; - return -1; - } - if (bLoc == b.length()) - return 1; - int aInt = 0; - int aIntLen = 0; - char nextCharA; - for (;;) - { - nextCharA = a.charAt(aLoc++); - if (nextCharA < '0' || nextCharA > '9') - break; - aIntLen++; - aInt = aInt * 10 + nextCharA - '0'; - if (aLoc == a.length()) - break; - } - int bInt = 0; - int bIntLen = 0; - char nextCharB; - for (;;) - { - nextCharB = b.charAt(bLoc++); - if (nextCharB < '0' || nextCharB > '9') - break; - bIntLen++; - bInt = bInt * 10 + nextCharB - '0'; - if (bLoc == b.length()) - break; - } - if (aIntLen != 0) - { - if (bIntLen == 0) - return -1; - int comp = Integer.compare(aInt, bInt); - if (comp != 0) - return comp; - } else - { - if (bIntLen != 0) - return 1; - int comp = Character.compare(nextCharA, nextCharB); - if (comp != 0) - return comp; - } - } - } - - private static void setInterfacePinUsage(DeserializedSubmodelComponent comp, Pin interfacePin, PinUsage usage) - { - Set wiresConnectedToPin = comp.submodel.getWiresByName().values().stream() - .filter(w -> w.getPin1() == interfacePin || w.getPin2() == interfacePin).collect(Collectors.toSet()); - LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); - wiresConnectedToPin.forEach(submodelModifiable::destroyWire); - comp.removeSubmodelInterface(interfacePin.name); - comp.addSubmodelInterface(new MovablePin(submodelModifiable, comp, interfacePin.name, interfacePin.logicWidth, usage, - interfacePin.getRelX(), interfacePin.getRelY())); - wiresConnectedToPin.forEach(w -> new ModelWire(submodelModifiable, w.getPin1(), w.getPin2())); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/JavaJsonLineCounter.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/JavaJsonLineCounter.java deleted file mode 100644 index 2f6cd4e3..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/JavaJsonLineCounter.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.mograsim.logic.model; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.function.Function; -import java.util.stream.Stream; - -public class JavaJsonLineCounter -{ - public static void main(String[] args) throws IOException - { - printLineCount("..", "java"); - printLineCount("..", "json"); - } - - private static void printLineCount(String path, String filetype) throws IOException - { - long lineCount = Files.walk(Paths.get(path)).filter(Files::isRegularFile).filter(p -> p.toString().endsWith('.' + filetype)) - .flatMap((Function>) p -> - { - try - { - return Files.lines(p); - } - catch (IOException e) - { - throw new UncheckedIOException(e); - } - }).count(); - System.out.println("Total lines in " + filetype + " files: " + lineCount); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableCircuit.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableCircuit.java deleted file mode 100644 index d36d80ff..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/TestableCircuit.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.mograsim.logic.model.am2900; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; - -public interface TestableCircuit -{ - void setup(); - - Result run(); - - void clockOn(boolean isClockOn); - - TestEnvironmentHelper getTestEnvironmentHelper(); - - default void assertRunSuccess() - { - assertEquals(Result.SUCCESS, run()); - } - - default void assertFullCycleSuccess() - { - assertRunSuccess(); - clockOn(false); - assertRunSuccess(); - clockOn(true); - assertRunSuccess(); - } - - default void displayState() - { - getTestEnvironmentHelper().displayState(); - } - - public enum Result - { - SUCCESS, OUT_OF_TIME, ERROR; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Test.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Test.java deleted file mode 100644 index 0d55c750..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Test.java +++ /dev/null @@ -1,302 +0,0 @@ -package net.mograsim.logic.model.am2900.am2901; - -import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Dest.*; -import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Func.*; -import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Src.*; -import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Register.*; -import static net.mograsim.logic.model.am2900.util.TestUtil.*; -import static org.junit.jupiter.api.Assertions.*; - -import java.awt.Point; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; - -import net.mograsim.logic.model.am2900.am2901.TestableAm2901.Register; -import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; - -@DisplayName("Am2901 Tests") -@TestMethodOrder(OrderAnnotation.class) -public class Am2901Test -{ - private TestableAm2901 am2901 = new TestableAm2901Impl(); - - @RegisterExtension - DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2901); - - @BeforeEach - void initialize() - { - createAndSetup(); - setInputsToZero(); - } - - void createAndSetup() - { - am2901.setup(); - } - - void setRegistersToZero() - { - setInputsToZero(); - for (Register r : Register.values()) - { - setRegisterToZero(r); - } - } - - void setRegisterToZero(Register r) - { - am2901.setD("0000"); - am2901.setSrc(DZ); - am2901.setFunc(AND); - setRegOutput(r); - - am2901.assertFullCycleSuccess(); - } - - void setRegOutput(Register r) - { - if (r == Q) - { - am2901.setDest(QREG); - } else - { - am2901.setReg_B(r.toBitString()); - am2901.setDest(RAMF); - } - } - - void setInputsToZero() - { - am2901.setCarryIn("0"); - am2901.setQ_0("0"); - am2901.setQ_3("0"); - am2901.setRAM_0("0"); - am2901.setRAM_3("0"); - am2901.setReg_A("0000"); - am2901.setReg_B("0000"); - am2901.setD("0000"); - am2901.setSrc(AB); - am2901.setFunc(ADD); - am2901.setDest(QREG); -// am2901.setNotOutEnable("0"); TODO - am2901.clockOn(true); - am2901.assertRunSuccess(); - } - - @ParameterizedTest(name = "{0}") - @Order(1) - @DisplayName("Direct / high level access") - @EnumSource(Register.class) - void testDirectAccess(Register r) - { - assertEquals("UUUU", am2901.getDirectly(r)); - - am2901.setDirectly(r, "1011"); - - assertEquals("1011", am2901.getDirectly(r)); - } - - @ParameterizedTest(name = "{0}") - @Order(2) - @DisplayName("Setting each register to 0") - @EnumSource(Register.class) - void testSetToZero(Register r) - { - assertEquals("UUUU", am2901.getDirectly(r)); - - setRegisterToZero(r); - - assertEquals("0000", am2901.getDirectly(r)); - assertEquals("0000", am2901.getY()); - assertEquals("0", am2901.getCarryOut()); - assertEquals("0", am2901.getOverflow()); - assertEquals("0", am2901.getSign()); - assertEquals("1", am2901.getZero()); - } - - @Test - @Order(3) - @DisplayName("Setting all registers to 0") - void testSetAllToZero() - { - setRegistersToZero(); - - assertEquals("0000", am2901.getY()); - assertEquals("0", am2901.getCarryOut()); - assertEquals("0", am2901.getOverflow()); - assertEquals("0", am2901.getSign()); - assertEquals("1", am2901.getZero()); - assertEquals("0", am2901.getQ_0()); - assertEquals("0", am2901.getQ_3()); - assertEquals("0", am2901.getRAM_0()); - assertEquals("0", am2901.getRAM_3()); - - assertAll("register values", Register.stream().map(r -> () -> - { - assertEquals("0000", am2901.getDirectly(r), r.name()); - })); - } - - @Test - @Order(4) - @DisplayName("ADD operation") - void testADD() - { - am2901.setSrc(DA); - am2901.setFunc(ADD); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x + xy.y; - int res4Bit = res32Bit & 0b1111; - int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y); - int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn); - - assertAll("Result of " + xy.x + " + " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"), - () -> assertEquals(to1bitBin(res32Bit > 15), am2901.getCarryOut(), " Cn+4"), - () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR")); - })); - } - - @Test - @Order(4) - @DisplayName("AND operation") - void testAND() - { - am2901.setSrc(DA); - am2901.setFunc(AND); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x & xy.y; - - assertAll("Result of " + xy.x + " & " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3") -// () -> assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), " Cn+4"), // TODO -// () -> assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), " OVR") // TODO - ); - })); - } - - @Test - @Order(4) - @DisplayName("OR operation") - void testOR() - { - am2901.setSrc(DA); - am2901.setFunc(OR); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x | xy.y; - - assertAll("Result of " + xy.x + " | " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3") -// () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), " Cn+4"), // TODO -// () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), " OVR") // TODO - ); - })); - } - - @Test - @Order(4) - @DisplayName("XOR operation") - void testXOR() - { - am2901.setSrc(DA); - am2901.setFunc(EXOR); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x ^ xy.y; - - assertAll("Result of " + xy.x + " ^ " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3")); - })); - } - - @Test - @Order(4) - @DisplayName("SUB operation") - void testSUB() - { - am2901.setSrc(DA); - am2901.setCarryIn("1"); - am2901.setFunc(SUBR); - am2901.setDest(NOP); - am2901.setReg_A(r0.toBitString()); - - assertAll(getAll4BitPairs().map(xy -> () -> - { - am2901.setDirectly(r0, to4bitBin(xy.x)); - am2901.setD(to4bitBin(xy.y)); - - am2901.assertFullCycleSuccess(); - - int res32Bit = xy.x - xy.y; - int res4Bit = res32Bit & 0b1111; - int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y); - int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn); - - assertAll("Result of " + xy.x + " - " + xy.y + " = " + res32Bit, - () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), - () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"), - () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"), - () -> assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), " Cn+4"), - () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR")); - })); - } - - static Stream getAll4BitPairs() - { - return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y))); - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java deleted file mode 100644 index 414054e9..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.mograsim.logic.model.am2900.am2901; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.atomic.ModelAndGate; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.atomic.ModelNotGate; -import net.mograsim.logic.model.model.components.atomic.ModelTextComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.ModellingTool; - -@Deprecated -public class Am2901Testbench -{ - public static void main(String[] args) - { - Am2900Loader.setup(); - SimpleLogicUIStandalone.executeVisualisation(Am2901Testbench::createTestbench, Am2901Testbench::beforeRun); - } - - public static void createTestbench(LogicModelModifiable model) - { - ModelComponent comp = IndirectModelComponentCreator.createComponent(model, "Am2901"); - ModellingTool tool = ModellingTool.createFor(model); - - comp.moveTo(240, 0); - - ModelManualSwitch enable = new ModelManualSwitch(model, 1); - ModelWireCrossPoint wcp0 = new ModelWireCrossPoint(model, 1); - ModelNotGate not1 = new ModelNotGate(model, 1); - ModelNotGate not2 = new ModelNotGate(model, 1); - ModelNotGate not3 = new ModelNotGate(model, 1); - ModelAndGate and = new ModelAndGate(model, 1); - tool.connect(wcp0, enable, ""); - tool.connect(wcp0, and, "A"); - tool.connect(wcp0, not1, "A"); - tool.connect(not1, not2, "Y", "A"); - tool.connect(not2, not3, "Y", "A"); - tool.connect(not3, and, "Y", "B"); - enable.moveTo(20, -32.5); - wcp0.moveTo(35, -26); - not1.moveTo(50, -20); - not2.moveTo(80, -20); - not3.moveTo(110, -20); - and.moveTo(135, -30); - Pin last = and.getPin("Y"); - - List inputPinNames = new ArrayList<>(); - List outputPinNames = new ArrayList<>(); - for (Pin p : comp.getPins().values()) - if (p.usage == PinUsage.INPUT) - inputPinNames.add(p.name); - else - outputPinNames.add(p.name); - - inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); - outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); - - for (int i = 0; i < inputPinNames.size(); i++) - { - double x = 55 + 70 * (i % 2); - double y = 10 * i; - - ModelWireCrossPoint wcp = new ModelWireCrossPoint(model, 1); - ModelComponent d_ff = IndirectModelComponentCreator.createComponent(model, "dff"); - ModelManualSwitch sw = new ModelManualSwitch(model, 1); - - tool.connect(last, wcp); - tool.connect(wcp, d_ff, "C"); - tool.connect(sw, d_ff, "", "D"); - tool.connect(d_ff, comp, "Q", inputPinNames.get(i)); - last = wcp.getPin(); - - ModelTextComponent label = new ModelTextComponent(model, inputPinNames.get(i)); - - sw.moveTo(x, y + 7.5); - wcp.moveTo(160, y); - d_ff.moveTo(170, y); - label.moveTo(x - 48, y + 8); - } - - for (int i = 0; i < outputPinNames.size(); i++) - { - double x = 300 + 75 * (i % 2); - double y = 10 * i - 2.5; - ModelBitDisplay bd = new ModelBitDisplay(model, 1); - bd.moveTo(x, y); - tool.connect(bd.getInputPin(), comp, outputPinNames.get(i)); - - ModelTextComponent label = new ModelTextComponent(model, outputPinNames.get(i)); - label.moveTo(x + 25, y); - } - } - - public static void beforeRun(VisualisationObjects vis) - { - vis.model.getComponentsByName().values().forEach(c -> - { - if (c instanceof ModelManualSwitch) - { - ModelManualSwitch cCasted = (ModelManualSwitch) c; - cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); - } - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java deleted file mode 100644 index d8899089..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java +++ /dev/null @@ -1,108 +0,0 @@ -package net.mograsim.logic.model.am2900.am2901; - -import java.util.Arrays; -import java.util.stream.Stream; - -import net.mograsim.logic.model.am2900.TestableCircuit; -import net.mograsim.logic.model.am2900.util.TestUtil; - -public interface TestableAm2901 extends TestableCircuit -{ - - void setDest(Am2901_Dest dest); - - void setFunc(Am2901_Func func); - - void setSrc(Am2901_Src src); - - void setReg_A(String val_4_bit); - - void setReg_B(String val_4_bit); - - void setCarryIn(String val_1_bit); - - void setNotOutEnable(String val_1_bit); - - void setD(String val_4_bit); - - void setQ_0(String val_1_bit); - - void setQ_3(String val_1_bit); - - void setRAM_0(String val_1_bit); - - void setRAM_3(String val_1_bit); - - void setDirectly(Register r, String val_4_bit); - - String getQ_0(); - - String getQ_3(); - - String getRAM_0(); - - String getRAM_3(); - - String getNotP(); - - String getNotG(); - - String getCarryOut(); - - String getSign(); - - String getZero(); - - String getOverflow(); - - String getY(); - - String getDirectly(Register r); - - enum Am2901_Dest - { - QREG, NOP, RAMA, RAMF, RAMQD, RAMD, RAMQU, RAMU; - - public boolean doesShift() - { - return ordinal() >= 4; - } - - public int getShiftDir() - { - return doesShift() ? (ordinal() < 6 ? -1 : 1) : 0; - } - - public int getI7() - { - return this.ordinal() >> 1 & 1; - } - } - - enum Am2901_Func - { - ADD, SUBR, SUBS, OR, AND, NOTRS, EXOR, EXNOR; - } - - enum Am2901_Src - { - AQ, AB, ZQ, ZB, ZA, DA, DQ, DZ; - } - - enum Register - { - r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF, Q; - - public String toBitString() - { - if (this.ordinal() > 0xF) - throw new UnsupportedOperationException(); - return TestUtil.to4bitBin(this.ordinal()); - } - - public static Stream stream() - { - return Arrays.stream(values()); - } - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java deleted file mode 100644 index bddddea5..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.mograsim.logic.model.am2900.am2901; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.util.SwitchWithDisplay; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; -import net.mograsim.logic.model.am2900.util.TestUtil; -import net.mograsim.logic.model.model.components.ModelComponent; - -public class TestableAm2901Impl implements TestableAm2901 -{ - private ModelComponent am2901; - private CoreManualSwitch I; - private CoreManualSwitch C; - private CoreManualSwitch Cn; - private CoreManualSwitch D; - private CoreManualSwitch A; - private CoreManualSwitch B; - private CoreBitDisplay Y; - private CoreBitDisplay F_0, Cn_4, OVR, F3; - private SwitchWithDisplay RAMn, RAMn_3, Qn, Qn_3; - - private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "Am2901"); - - @Override - public Result run() - { - return testHelper.run(); - } - - @Override - public void setup() - { - testHelper.setup(DebugState.NO_DEBUG); - } - - @Override - public void setDest(Am2901_Dest dest) - { - BitVector oldI = I.getValues(); - I.setState(TestUtil.of(dest.ordinal(), 3).concat(oldI.subVector(3))); - } - - @Override - public void setFunc(Am2901_Func func) - { - BitVector oldI = I.getValues(); - I.setState(oldI.subVector(0, 3).concat(TestUtil.of(func.ordinal(), 3)).concat(oldI.subVector(6))); - } - - @Override - public void setSrc(Am2901_Src src) - { - BitVector oldI = I.getValues(); - I.setState(oldI.subVector(0, 6).concat(TestUtil.of(src.ordinal(), 3))); - } - - @Override - public void setReg_A(String val_4_bit) - { - A.setState(BitVector.parse(val_4_bit)); - } - - @Override - public void setReg_B(String val_4_bit) - { - B.setState(BitVector.parse(val_4_bit)); - } - - @Override - public void setCarryIn(String val_1_bit) - { - Cn.setState(Bit.parse(val_1_bit)); - } - - @Override - public void setNotOutEnable(String val_1_bit) - { - throw new UnsupportedOperationException(); // TODO - } - - @Override - public void setD(String val_4_bit) - { - D.setState(BitVector.parse(val_4_bit)); - } - - @Override - public void setQ_0(String val_1_bit) - { - Qn.setState(Bit.parse(val_1_bit).toVector()); - } - - @Override - public void setQ_3(String val_1_bit) - { - Qn_3.setState(Bit.parse(val_1_bit).toVector()); - } - - @Override - public void setRAM_0(String val_1_bit) - { - RAMn.setState(Bit.parse(val_1_bit).toVector()); - } - - @Override - public void setRAM_3(String val_1_bit) - { - RAMn_3.setState(Bit.parse(val_1_bit).toVector()); - } - - @Override - public void clockOn(boolean isClockOn) - { - C.setState(isClockOn ? Bit.ONE : Bit.ZERO); - } - - @Override - public String getQ_0() - { - return Qn.getDisplayedValue().toString(); - } - - @Override - public String getQ_3() - { - return Qn_3.getDisplayedValue().toString(); - } - - @Override - public String getRAM_0() - { - return RAMn.getDisplayedValue().toString(); - } - - @Override - public String getRAM_3() - { - return RAMn_3.getDisplayedValue().toString(); - } - - @Override - public String getNotP() - { - throw new UnsupportedOperationException(); // TODO - } - - @Override - public String getNotG() - { - throw new UnsupportedOperationException(); // TODO - } - - @Override - public String getCarryOut() - { - return Cn_4.getDisplayedValue().toString(); - } - - @Override - public String getSign() - { - return F3.getDisplayedValue().toString(); - } - - @Override - public String getZero() - { - return F_0.getDisplayedValue().toString(); - } - - @Override - public String getOverflow() - { - return OVR.getDisplayedValue().toString(); - } - - @Override - public String getY() - { - return Y.getDisplayedValue().toString(); - } - - @Override - public void setDirectly(Register r, String val_4_bit) - { - am2901.setHighLevelState(regToStateID(r), BitVector.parse(val_4_bit)); - } - - @Override - public String getDirectly(Register r) - { - return ((BitVector) am2901.getHighLevelState(regToStateID(r))).toString(); - } - - private static String regToStateID(Register r) - { - if (r == Register.Q) - return "qreg.q"; - return "regs.c" + r.toBitString() + ".q"; - } - - @Override - public TestEnvironmentHelper getTestEnvironmentHelper() - { - return testHelper; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Test.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Test.java deleted file mode 100644 index 332f4f64..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Test.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.mograsim.logic.model.am2900.am2904; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; - -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_Carry; -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_Inst; -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_ShiftDir; -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.CompleteStatus; -import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Register; -import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; - -@DisplayName("Am2904 Tests") -@TestMethodOrder(OrderAnnotation.class) -public class Am2904Test -{ - private TestableAm2904 am2904 = new TestableAm2904Impl(); - - @RegisterExtension - DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2904); - - @BeforeEach - void initialize() - { - createAndSetup(); - setStandardInputs(); - } - - void createAndSetup() - { - am2904.setup(); - } - - void setStandardInputs() - { - am2904.set_CEµ("0"); - am2904.set_CEM("0"); - am2904.setI("0000"); - am2904.set_E("0000"); - am2904.set_OEY("1"); - am2904.set_OECT("0"); - am2904.setCarry(Am2904_Carry.CI0); - am2904.setCX("0"); - am2904.setI10(Am2904_ShiftDir.RIGHT); - am2904.setShiftCode("0000"); - am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); - am2904.setSIO0("Z"); - am2904.setSIO3("Z"); - am2904.setQIO0("Z"); - am2904.setQIO3("Z"); - am2904.set_SE("1"); - am2904.setY("ZZZZ"); - am2904.clockOn(true); - am2904.assertRunSuccess(); - } - - @ParameterizedTest(name = "{0}") - @Order(1) - @DisplayName("Direct / high level access") - @EnumSource(Register.class) - void testDirectAccess(Register r) - { - assertEquals("U", am2904.getDirectly(r)); - - am2904.setDirectly(r, "1"); - - assertEquals("1", am2904.getDirectly(r)); - } - - @Test - @Order(2) - void testBasicStateAndOutputs() - { - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getC0()); - assertEquals("0", am2904.getCT()); - assertEquals("Z", am2904.getQIO0()); - assertEquals("Z", am2904.getQIO3()); - assertEquals("Z", am2904.getSIO0()); - assertEquals("Z", am2904.getSIO3()); - assertEquals("ZZZZ", am2904.getY()); - } - - @Test - @Order(3) - void testSimpleLoadTestIZ() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("1000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - - am2904.setInstruction(Am2904_Inst.Load_Load_I_notZ); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - } - - @Test - @Order(3) - void testSimpleLoadTestIC() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_C); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0100"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - - am2904.setInstruction(Am2904_Inst.Load_Load_I_notC); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - } - - @Test - @Order(3) - void testSimpleLoadTestIN() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_N); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0010"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - - am2904.setInstruction(Am2904_Inst.Load_Load_I_notN); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - } - - @Test - @Order(3) - void testSimpleLoadTestIOVR() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_OVR); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0001"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - - am2904.setInstruction(Am2904_Inst.Load_Load_I_notOVR); - am2904.assertFullCycleSuccess(); - - assertEquals("0", am2904.getCT()); - - am2904.setI("0000"); - am2904.assertFullCycleSuccess(); - - assertEquals("1", am2904.getCT()); - } - - @Test - @Order(3) - void testRegisterContentAfterLoadLoad() - { - am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); - am2904.assertFullCycleSuccess(); - - String[] statusValues = { "0001", "0010", "0100", "1000", "0000", "1111" }; - - for (String status : statusValues) - { - am2904.setI(status); - am2904.assertFullCycleSuccess(); - assertEquals(status, am2904.getDirectly(CompleteStatus.micro)); - assertEquals(status, am2904.getDirectly(CompleteStatus.MAKRO)); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java deleted file mode 100644 index e46561d5..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.mograsim.logic.model.am2900.am2904; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.Renderer; - -public class Am2904Testbench -{ - public static void main(String[] args) - { - Am2900Loader.setup(); - SimpleLogicUIStandalone.executeVisualisation(Am2904Testbench::create, Am2904Testbench::beforeRun); - } - - public static void create(LogicModelModifiable model) - { - // TODO replace with proper LogicModel deserialization - DeserializedSubmodelComponent testbench = (DeserializedSubmodelComponent) IndirectModelComponentCreator.createComponent(model, - "jsonfile:Am2904Testbench.json", "testbench"); - testbench.setSize(1000, 1000); - testbench.setOutlineRenderer(new Renderer() - { - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return null; - } - - @Override - public Void getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - // do nothing - } - }); - } - - public static void beforeRun(VisualisationObjects vis) - { - ((SubmodelComponent) vis.model.getComponentsByName().get("testbench")).submodel.getComponentsByName().values().forEach(c -> - { - if (c instanceof ModelManualSwitch) - { - ModelManualSwitch cCasted = (ModelManualSwitch) c; - cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); - } - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java deleted file mode 100644 index e41e3fef..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java +++ /dev/null @@ -1,236 +0,0 @@ -package net.mograsim.logic.model.am2900.am2904; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import net.mograsim.logic.model.am2900.TestableCircuit; - -public interface TestableAm2904 extends TestableCircuit -{ - - void setInstruction(Am2904_Inst inst); - - void setCarry(Am2904_Carry carry); - - void setShiftCode(String val_4_bit); - - void setI10(Am2904_ShiftDir dir); - - void setCX(String val_1_bit); - - void setY(String z_c_n_ovr); - - void setIZ(String val_1_bit); - - void setIC(String val_1_bit); - - void setIOVR(String val_1_bit); - - void setIN(String val_1_bit); - - default void setI(String z_c_n_ovr) - { - setIZ(z_c_n_ovr.substring(0, 1)); - setIC(z_c_n_ovr.substring(1, 2)); - setIN(z_c_n_ovr.substring(2, 3)); - setIOVR(z_c_n_ovr.substring(3, 4)); - } - - void set_CEM(String val_1_bit); - - void set_CEµ(String val_1_bit); - - void set_OEY(String val_1_bit); - - void set_OECT(String val_1_bit); - - void set_SE(String val_1_bit); - - void set_EZ(String val_1_bit); - - void set_EC(String val_1_bit); - - void set_EOVR(String val_1_bit); - - void set_EN(String val_1_bit); - - default void set_E(String z_c_n_ovr) - { - set_EZ(z_c_n_ovr.substring(0, 1)); - set_EC(z_c_n_ovr.substring(1, 2)); - set_EN(z_c_n_ovr.substring(2, 3)); - set_EOVR(z_c_n_ovr.substring(3, 4)); - } - - void setSIO0(String val_1_bit); - - void setSIO3(String val_1_bit); - - void setQIO0(String val_1_bit); - - void setQIO3(String val_1_bit); - - void setDirectly(Register r, String val_1_bit); - - void setDirectly(CompleteStatus r, String z_c_n_ovr); - - String getC0(); - - String getCT(); - - String getY(); - - String getSIO0(); - - String getSIO3(); - - String getQIO0(); - - String getQIO3(); - - String getDirectly(Register r); - - String getDirectly(CompleteStatus r); - - enum Am2904_ShiftDir - { - RIGHT, LEFT; - } - - enum Am2904_Carry - { - CI0, CI1, CX, USE_SR; - } - - /** - * Pattern:
- * [microSR]_[machineSR]_[condCodeSource]_[condCode]
- *
    - *
  • Load = load from I inputs (Am2904s)
  • - *
  • condCodeSource = µ, M, I (and a special case: I and M)
  • - *
  • condCode = the boolean term defining the CT output
  • - *
- */ - enum Am2904_Inst - { - // @formatter:off - LoadM_LoadY_µ_NxorOVRorZ(0_00), - Set_Set_µ_NxnorOVRornotZ(0_01), - Swap_Swap_µ_NxorOVR(0_02), - Reset_Reset_µ_NxnorOVR(0_03), - Load_LoadForShiftThroughOvr_µ_Z(0_04), - Load_Invert_µ_notZ(0_05), - LoadOvrRetain_Load_µ_OVR(0_06), - LoadOvrRetain_Load_µ_notOVR(0_07), - ResetZ_LoadCarryInvert_µ_CorZ(0_10), - SetZ_LoadCarryInvert_µ_notCandnotZ(0_11), - ResetC_Load_µ_C(0_12), - SetC_Load_µ_notC(0_13), - ResetN_Load_µ_notCorZ(0_14), - SetN_Load_µ_CandnotZ(0_15), - ResetOvr_Load_IM_NxorN(0_16), - SetOvr_Load_IM_NxnorN(0_17), - Load_Load_µ_NxorOVRorZ(0_20), - Load_Load_µ_NxnorOVRornotZ(0_21), - Load_Load_µ_NxorOVR(0_22), - Load_Load_µ_NxnorOVR(0_23), - Load_Load_µ_Z(0_24), - Load_Load_µ_notZ(0_25), - Load_Load_µ_OVR(0_26), - Load_Load_µ_notOVR(0_27), - LoadCarryInvert_LoadCarryInvert_µ_CorZ(0_30), - LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ(0_31), - Load_Load_µ_C(0_32), - Load_Load_µ_notC(0_33), - Load_Load_µ_notCorZ(0_34), - Load_Load_µ_CandnotZ(0_35), - Load_Load_µ_N(0_36), - Load_Load_µ_notN(0_37), - Load_Load_M_NxorOVRorZ(0_40), - Load_Load_M_NxnorOVRornotZ(0_41), - Load_Load_M_NxorOVR(0_42), - Load_Load_M_NxnorOVR(0_43), - Load_Load_M_Z(0_44), - Load_Load_M_notZ(0_45), - Load_Load_M_OVR(0_46), - Load_Load_M_notOVR(0_47), - LoadCarryInvert_LoadCarryInvert_M_CorZ(0_50), - LoadCarryInvert_LoadCarryInvert_M_notCandnotZ(0_51), - Load_Load_M_C(0_52), - Load_Load_M_notC(0_53), - Load_Load_M_notCorZ(0_54), - Load_Load_M_CandnotZ(0_55), - Load_Load_M_N(0_56), - Load_Load_M_notN(0_57), - Load_Load_I_NxorOVRorZ(0_60), - Load_Load_I_NxnorOVRornotZ(0_61), - Load_Load_I_NxorOVR(0_62), - Load_Load_I_NxnorOVR(0_63), - Load_Load_I_Z(0_64), - Load_Load_I_notZ(0_65), - Load_Load_I_OVR(0_66), - Load_Load_I_notOVR(0_67), - LoadCarryInvert_LoadCarryInvert_I_notCorZ(0_70), - LoadCarryInvert_LoadCarryInvert_I_CandnotZ(0_71), - Load_Load_I_C(0_72), - Load_Load_I_notC(0_73), - Load_Load_I_notCorZ(0_74), - Load_Load_I_CandnotZ(0_75), - Load_Load_I_N(0_76), - Load_Load_I_notN(0_77); - // @formatter:on - - public final int code; - - private Am2904_Inst(int code) - { - this.code = code; - } - - private static final Map instCodes; - - static - { - Map instCodesMod = new HashMap<>(); - Am2904_Inst[] vals = values(); - for (Am2904_Inst inst : vals) - { - assert inst.code == inst.ordinal(); - instCodesMod.put(inst.code, inst); - } - if (instCodesMod.size() != 64) - throw new IllegalStateException("There must be exactly 64 Am2904 instruction codes, but was " + instCodesMod.size()); - instCodes = Collections.unmodifiableMap(instCodesMod); - } - - public static Am2904_Inst getInstFor(int I_543210) - { - Am2904_Inst inst = instCodes.get(I_543210); - if (inst != null) - return inst; - throw new IllegalArgumentException("Invaild Am2904 instruction code: " + I_543210); - } - - public int getBlock() - { - return code >> 4; - } - - public boolean isLoadCarryInvert() - { - return (code & 0b001_110) == 0b001_000; - } - } - - enum Register - { - µZ, µC, µN, µOVR, MZ, MC, MN, MOVR; - } - - enum CompleteStatus - { - micro, MAKRO; - } - -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json deleted file mode 100644 index 964d7d3d..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json +++ /dev/null @@ -1,846 +0,0 @@ -{ - "width": 0.0, - "height": 0.0, - "interfacePins": [ - { - "location": { - "x": 10.0, - "y": 20.0 - }, - "name": "C", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 145.0, - "y": 125.0 - }, - "name": "C0", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 145.0, - "y": 75.0 - }, - "name": "CT", - "logicWidth": 1, - "usage": "OUTPUT" - }, - { - "location": { - "x": 10.0, - "y": 125.0 - }, - "name": "Cx", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 30.0 - }, - "name": "IC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 35.0 - }, - "name": "IN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 40.0 - }, - "name": "IOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 25.0 - }, - "name": "IZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": -87.66482568016058, - "y": 58.834004835619645 - }, - "name": "I_10", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": -80.0, - "y": 40.0 - }, - "name": "I_11_12", - "logicWidth": 2, - "usage": "INPUT" - }, - { - "location": { - "x": -85.0, - "y": 100.0 - }, - "name": "I_5_0", - "logicWidth": 6, - "usage": "INPUT" - }, - { - "location": { - "x": -84.26853373181032, - "y": 78.72500503091884 - }, - "name": "I_6_9", - "logicWidth": 4, - "usage": "INPUT" - }, - { - "location": { - "x": 145.0, - "y": 145.0 - }, - "name": "QIO0", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 10.0, - "y": 145.0 - }, - "name": "QIOn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 135.0 - }, - "name": "SIO0", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 10.0, - "y": 135.0 - }, - "name": "SIOn", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 30.0 - }, - "name": "YC", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 35.0 - }, - "name": "YN", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 40.0 - }, - "name": "YOVR", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 145.0, - "y": 25.0 - }, - "name": "YZ", - "logicWidth": 1, - "usage": "TRISTATE" - }, - { - "location": { - "x": 10.0, - "y": 45.0 - }, - "name": "_CEM", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 50.0 - }, - "name": "_CEmu", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 60.0 - }, - "name": "_EC", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 65.0 - }, - "name": "_EN", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 70.0 - }, - "name": "_EOVR", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 55.0 - }, - "name": "_EZ", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 145.0, - "y": 65.0 - }, - "name": "_OECT", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 80.0, - "y": 10.0 - }, - "name": "_OEY", - "logicWidth": 1, - "usage": "INPUT" - }, - { - "location": { - "x": 10.0, - "y": 100.0 - }, - "name": "_SE", - "logicWidth": 1, - "usage": "INPUT" - } - ], - "innerScale": 1.0, - "submodel": { - "components": [ - { - "id": "Merger", - "name": "Merger#0", - "pos": { - "x": -30.0, - "y": 70.0 - }, - "params": 13 - }, - { - "id": "Splitter", - "name": "Splitter#0", - "pos": { - "x": -45.0, - "y": 140.0 - }, - "params": 6 - }, - { - "id": "Splitter", - "name": "Splitter#1", - "pos": { - "x": -45.0, - "y": 100.0 - }, - "params": 4 - }, - { - "id": "Splitter", - "name": "Splitter#2", - "pos": { - "x": -45.0, - "y": 70.0 - }, - "params": 2 - }, - { - "id": "Am2904", - "name": "Am2904#0", - "pos": { - "x": 20.0, - "y": 15.0 - } - } - ], - "wires": [ - { - "pin1": { - "compName": "Am2904#0", - "pinName": "C" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "C" - }, - "name": "unnamedWire#0", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IZ" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IZ" - }, - "name": "unnamedWire#1", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EZ" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EZ" - }, - "name": "unnamedWire#10", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I_5_0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "I" - }, - "name": "unnamedWire#11", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I0" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O0" - }, - "name": "unnamedWire#12", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O1" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I1" - }, - "name": "unnamedWire#13", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I2" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O2" - }, - "name": "unnamedWire#14", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O3" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I3" - }, - "name": "unnamedWire#15", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I4" - }, - "pin2": { - "compName": "Splitter#0", - "pinName": "O4" - }, - "name": "unnamedWire#16", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#0", - "pinName": "O5" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I5" - }, - "name": "unnamedWire#17", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O0" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I6" - }, - "name": "unnamedWire#18", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I7" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O1" - }, - "name": "unnamedWire#19", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IC" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "IC" - }, - "name": "unnamedWire#2", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#1", - "pinName": "O2" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I8" - }, - "name": "unnamedWire#20", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I9" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "O3" - }, - "name": "unnamedWire#21", - "path": [] - }, - { - "pin1": { - "compName": "Splitter#2", - "pinName": "O0" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I11" - }, - "name": "unnamedWire#22", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "I12" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "O1" - }, - "name": "unnamedWire#23", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I_6_9" - }, - "pin2": { - "compName": "Splitter#1", - "pinName": "I" - }, - "name": "unnamedWire#24", - "path": [] - }, - { - "pin1": { - "compName": "Merger#0", - "pinName": "O" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "I" - }, - "name": "unnamedWire#25", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I_10" - }, - "pin2": { - "compName": "Merger#0", - "pinName": "I10" - }, - "name": "unnamedWire#26", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "I_11_12" - }, - "pin2": { - "compName": "Splitter#2", - "pinName": "I" - }, - "name": "unnamedWire#27", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_SE" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_SE" - }, - "name": "unnamedWire#28", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "Cx" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "Cx" - }, - "name": "unnamedWire#29", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "IN" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "IN" - }, - "name": "unnamedWire#3", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SIOn" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "SIOn" - }, - "name": "unnamedWire#30", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "QIOn" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "QIOn" - }, - "name": "unnamedWire#31", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "QIO0" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "QIO0" - }, - "name": "unnamedWire#32", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "SIO0" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "SIO0" - }, - "name": "unnamedWire#33", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "C0" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "C0" - }, - "name": "unnamedWire#34", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "CT" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "CT" - }, - "name": "unnamedWire#35", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_OECT" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OECT" - }, - "name": "unnamedWire#36", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YOVR" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YOVR" - }, - "name": "unnamedWire#37", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YN" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YN" - }, - "name": "unnamedWire#38", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YC" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YC" - }, - "name": "unnamedWire#39", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "IOVR" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "IOVR" - }, - "name": "unnamedWire#4", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "YZ" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "YZ" - }, - "name": "unnamedWire#40", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_OEY" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_OEY" - }, - "name": "unnamedWire#41", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_CEM" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_CEM" - }, - "name": "unnamedWire#5", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_CEmu" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_CEmu" - }, - "name": "unnamedWire#6", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EC" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EC" - }, - "name": "unnamedWire#7", - "path": [] - }, - { - "pin1": { - "compName": "Am2904#0", - "pinName": "_EN" - }, - "pin2": { - "compName": "_submodelinterface", - "pinName": "_EN" - }, - "name": "unnamedWire#8", - "path": [] - }, - { - "pin1": { - "compName": "_submodelinterface", - "pinName": "_EOVR" - }, - "pin2": { - "compName": "Am2904#0", - "pinName": "_EOVR" - }, - "name": "unnamedWire#9", - "path": [] - } - ], - "version": "0.1.1" - }, - "symbolRendererSnippetID": "default", - "outlineRendererSnippetID": "default", - "highLevelStateHandlerSnippetID": "standard", - "highLevelStateHandlerParams": { - "subcomponentHighLevelStates": { - "musr": { - "id": "delegating", - "params": { - "delegateTarget": "Am2904#0", - "prefix": "musr" - } - }, - "msr": { - "id": "delegating", - "params": { - "delegateTarget": "Am2904#0", - "prefix": "msr" - } - } - }, - "atomicHighLevelStates": {} - }, - "version": "0.1.5" -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java deleted file mode 100644 index b43f130e..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java +++ /dev/null @@ -1,293 +0,0 @@ -package net.mograsim.logic.model.am2900.am2904; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.util.SwitchWithDisplay; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; -import net.mograsim.logic.model.model.components.ModelComponent; - -public class TestableAm2904Impl implements TestableAm2904 -{ - - private ModelComponent am2904; - private CoreManualSwitch I_5_0; - private CoreManualSwitch I_6_9; - private CoreManualSwitch I_10; - private CoreManualSwitch I_11_12; - private CoreManualSwitch C; - private CoreManualSwitch Cx; - private CoreManualSwitch IC, IN, IOVR, IZ; - private CoreManualSwitch _CEM, _CEmu; - private CoreManualSwitch _EC, _EN, _EOVR, _EZ; - private CoreManualSwitch _OECT, _OEY; - private CoreManualSwitch _SE; - private CoreBitDisplay C0; - private CoreBitDisplay CT; - private SwitchWithDisplay SIO0, SIOn, QIO0, QIOn; - private SwitchWithDisplay YC, YN, YOVR, YZ; - - private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, - "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/am2904/TestableAm2904.json"); - - @Override - public void setup() - { - testHelper.setup(DebugState.NO_DEBUG); - } - - @Override - public Result run() - { - return testHelper.run(); - } - - @Override - public void clockOn(boolean isClockOn) - { - if (isClockOn) - C.switchFullOn(); - else - C.switchFullOff(); - } - - @Override - public void setInstruction(Am2904_Inst inst) - { - I_5_0.setState(BitVector.from(inst.ordinal(), 6)); - } - - @Override - public void setShiftCode(String val_4_bit) - { - I_6_9.setState(BitVector.parse(val_4_bit)); - } - - @Override - public void setI10(Am2904_ShiftDir dir) - { - I_10.setState(BitVector.from(dir.ordinal(), 1)); - } - - @Override - public void setCarry(Am2904_Carry carry) - { - I_11_12.setState(BitVector.from(carry.ordinal(), 2)); - } - - @Override - public void setCX(String val_1_bit) - { - Cx.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setY(String z_c_n_ovr) - { - var bv = BitVector.parse(z_c_n_ovr); - // correct order apparently unknown, most likely Z-C-N-OVR - YZ.setState(bv.getLSBit(3).toVector()); - YC.setState(bv.getLSBit(2).toVector()); - YN.setState(bv.getLSBit(1).toVector()); - YOVR.setState(bv.getLSBit(0).toVector()); - } - - @Override - public void setIZ(String val_1_bit) - { - IZ.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setIC(String val_1_bit) - { - IC.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setIOVR(String val_1_bit) - { - IOVR.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setIN(String val_1_bit) - { - IN.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_CEM(String val_1_bit) - { - _CEM.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_CEµ(String val_1_bit) - { - _CEmu.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_OEY(String val_1_bit) - { - _OEY.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_OECT(String val_1_bit) - { - _OECT.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_SE(String val_1_bit) - { - _SE.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_EZ(String val_1_bit) - { - _EZ.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_EC(String val_1_bit) - { - _EC.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_EOVR(String val_1_bit) - { - _EOVR.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_EN(String val_1_bit) - { - _EN.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setSIO0(String val_1_bit) - { - SIO0.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setSIO3(String val_1_bit) - { - SIOn.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setQIO0(String val_1_bit) - { - QIO0.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setQIO3(String val_1_bit) - { - QIOn.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setDirectly(Register r, String val_1_bit) - { - var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); - bv = bv.withBitChanged(r.ordinal() % 4, b -> Bit.parse(val_1_bit)); - am2904.setHighLevelState(regToStateID(r), bv); - } - - @Override - public void setDirectly(CompleteStatus r, String z_c_n_ovr) - { - am2904.setHighLevelState(regToStateID(r), BitVector.parse(z_c_n_ovr)); - } - - @Override - public String getC0() - { - return C0.getDisplayedValue().toString(); - } - - @Override - public String getCT() - { - return CT.getDisplayedValue().toString(); - } - - @Override - public String getY() - { - // correct order apparently unknown, most likely Z-C-N-OVR - var y3 = YZ.getDisplayedValue(); - var y2 = YC.getDisplayedValue(); - var y1 = YN.getDisplayedValue(); - var y0 = YOVR.getDisplayedValue(); - return y3.concat(y2).concat(y1).concat(y0).toString(); - } - - @Override - public String getSIO0() - { - return SIO0.getDisplayedValue().toString(); - } - - @Override - public String getSIO3() - { - return SIOn.getDisplayedValue().toString(); - } - - @Override - public String getQIO0() - { - return QIO0.getDisplayedValue().toString(); - } - - @Override - public String getQIO3() - { - return QIOn.getDisplayedValue().toString(); - } - - @Override - public String getDirectly(Register r) - { - var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); - return bv.getMSBit(r.ordinal() % 4).getSymbol(); - } - - @Override - public String getDirectly(CompleteStatus r) - { - var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); - return bv.toString(); - } - - private static String regToStateID(Register r) - { - if (r.ordinal() < 4) - return "musr.q"; - return "msr.q"; - } - - private static String regToStateID(CompleteStatus r) - { - if (r == CompleteStatus.micro) - return "musr.q"; - return "msr.q"; - } - - @Override - public TestEnvironmentHelper getTestEnvironmentHelper() - { - return testHelper; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Test.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Test.java deleted file mode 100644 index 18b2578d..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Test.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.mograsim.logic.model.am2900.am2910; - -import static net.mograsim.logic.model.am2900.am2910.TestableAm2910.Am2910_Inst.*; -import static net.mograsim.logic.core.types.Bit.*; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.TestMethodOrder; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.am2910.TestableAm2910.Register; -import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; - -@DisplayName("Am2910 Tests") -@TestMethodOrder(OrderAnnotation.class) -public class Am2910Test -{ - private TestableAm2910 am2910 = new TestableAm2910Impl(); - - @RegisterExtension - DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2910); - - @BeforeEach - void initialize() - { - createAndSetup(); - setStandardInputs(); - } - - void createAndSetup() - { - am2910.setup(); - } - - void setStandardInputs() - { - am2910.set_CC("0"); - am2910.set_CCEN("0"); - am2910.set_OE("0"); - am2910.set_RLD("1"); - am2910.setCI("1"); - am2910.setD("000000000000"); - am2910.setInstruction(JZ); - am2910.clockOn(true); - am2910.assertRunSuccess(); - } - - @ParameterizedTest(name = "{0}") - @Order(1) - @DisplayName("Direct / high level access") - @EnumSource(Register.class) - void testDirectAccess(Register r) - { - String us = U.toVector(r.size()).toString(); - String three = BitVector.from(3, r.size()).toString(); - - assertEquals(us, am2910.getDirectly(r)); - - am2910.setDirectly(r, three); - - assertEquals(three, am2910.getDirectly(r)); - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java deleted file mode 100644 index 59ac5b14..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.mograsim.logic.model.am2900.am2910; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelClock; -import net.mograsim.logic.model.model.components.atomic.ModelClock.ModelClockParams; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class Am2910Testbench -{ - public static void main(String[] args) - { - Am2900Loader.setup(); - SimpleLogicUIStandalone.executeVisualisation(Am2910Testbench::create, Am2910Testbench::beforeRun); - } - - @SuppressWarnings("unused") // for ModelWires being created - public static void create(LogicModelModifiable model) - { - ModelComponent am2910 = IndirectModelComponentCreator.createComponent(model, "Am2910", "Am2910"); - ModelClock C = new ModelClock(model, new ModelClockParams(1000, Orientation.RIGHT)); - ModelManualSwitch D = new ModelManualSwitch(model, 12, "D"); - ModelManualSwitch _RLD = new ModelManualSwitch(model, 1, "_RLD"); - ModelManualSwitch _CC = new ModelManualSwitch(model, 1, "_CC"); - ModelManualSwitch _CCEN = new ModelManualSwitch(model, 1, "_CCEN"); - ModelManualSwitch I = new ModelManualSwitch(model, 4, "I"); - ModelManualSwitch CI = new ModelManualSwitch(model, 1, "CI"); - ModelManualSwitch _OE = new ModelManualSwitch(model, 1, "_OE"); - ModelBitDisplay _FULL = new ModelBitDisplay(model, 1, "_FULL"); - ModelBitDisplay _PL = new ModelBitDisplay(model, 1, "_PL"); - ModelBitDisplay _MAP = new ModelBitDisplay(model, 1, "_MAP"); - ModelBitDisplay _VECT = new ModelBitDisplay(model, 1, "_VECT"); - ModelBitDisplay Y = new ModelBitDisplay(model, 12, "Y"); - - C.moveTo(35, -35); - D.moveTo(10, -20); - _RLD.moveTo(-30, -1.5); - _CC.moveTo(-30, 20); - _CCEN.moveTo(-30, 40); - I.moveTo(-30, 60); - CI.moveTo(75, 45); - _FULL.moveTo(80, 6.5); - _PL.moveTo(30, 85); - _MAP.moveTo(30, 105); - _VECT.moveTo(30, 125); - Y.moveTo(40, 65); - _OE.moveTo(60, 85); - - new ModelWire(model, C.getOutputPin(), am2910.getPin("C"), new Point(60, -27.5)); - new ModelWire(model, D.getOutputPin(), am2910.getPin("D"), new Point(36, -12.5)); - new ModelWire(model, _RLD.getOutputPin(), am2910.getPin("_RLD"), new Point[0]); - new ModelWire(model, _CC.getOutputPin(), am2910.getPin("_CC")); - new ModelWire(model, _CCEN.getOutputPin(), am2910.getPin("_CCEN")); - new ModelWire(model, I.getOutputPin(), am2910.getPin("I")); - new ModelWire(model, CI.getOutputPin(), am2910.getPin("CI"), new Point(100, 52.5), new Point(100, 40)); - new ModelWire(model, am2910.getPin("_FULL"), _FULL.getInputPin(), new Point[0]); - new ModelWire(model, am2910.getPin("_PL"), _PL.getInputPin(), new Point(13, 92.5)); - new ModelWire(model, am2910.getPin("_MAP"), _MAP.getInputPin(), new Point(19, 112.5)); - new ModelWire(model, am2910.getPin("_VECT"), _VECT.getInputPin(), new Point(25, 132.5)); - new ModelWire(model, am2910.getPin("Y"), Y.getInputPin(), new Point(38, 72.5)); - new ModelWire(model, am2910.getPin("_OE"), _OE.getOutputPin()); - } - - public static void beforeRun(VisualisationObjects vis) - { - vis.model.getComponentsByName().values().forEach(c -> - { - if (c instanceof ModelManualSwitch) - { - ModelManualSwitch cCasted = (ModelManualSwitch) c; - cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); - } - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java deleted file mode 100644 index 5290c5a6..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.mograsim.logic.model.am2900.am2910; - -import java.util.Arrays; -import java.util.stream.Stream; - -import net.mograsim.logic.model.am2900.TestableCircuit; - -public interface TestableAm2910 extends TestableCircuit -{ - - void setInstruction(Am2910_Inst inst); - - void set_CCEN(String val_1_bit); - - void setD(String val_12_bit); - - void set_CC(String val_1_bit); - - void setCI(String val_1_bit); - - void set_RLD(String val_1_bit); - - void set_OE(String val_1_bit); - - void setDirectly(Register r, String val_X_bit); - - String getY(); - - String get_FULL(); - - String get_PL(); - - String get_MAP(); - - String get_VECT(); - - String getDirectly(Register r); - - enum Am2910_Inst - { - JZ, CJS, JMAP, CJP, PUSH, JSRP, CJV, JRP, RFCT, RPCT, CRTN, CJPP, LDCT, LOOP, CONT, TWB; - } - - enum Register - { - S_0, S_1, S_2, S_3, S_4, SP, PC, REG_COUNT; - - public static Stream stream() - { - return Arrays.stream(values()); - } - - public int size() - { - if (this == SP) - return 3; - return 12; - } - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java deleted file mode 100644 index 48b85698..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java +++ /dev/null @@ -1,159 +0,0 @@ -package net.mograsim.logic.model.am2900.am2910; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; -import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; -import net.mograsim.logic.model.model.components.ModelComponent; - -public class TestableAm2910Impl implements TestableAm2910 -{ - - private ModelComponent am2901; - private CoreManualSwitch I; - private CoreManualSwitch C; - private CoreManualSwitch CI; - private CoreManualSwitch D; - private CoreManualSwitch _CC; - private CoreManualSwitch _CCEN; - private CoreManualSwitch _RLD; - private CoreManualSwitch _OE; - private CoreBitDisplay _FULL; - private CoreBitDisplay Y; - private CoreBitDisplay _PL, _MAP, _VECT; - - private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "Am2910"); - - @Override - public void setup() - { - testHelper.setup(DebugState.NO_DEBUG); - } - - @Override - public Result run() - { - return testHelper.run(); - } - - @Override - public void clockOn(boolean isClockOn) - { - if (isClockOn) - C.switchFullOn(); - else - C.switchFullOff(); - } - - @Override - public void setInstruction(Am2910_Inst inst) - { - I.setState(BitVector.from(inst.ordinal(), 4)); - } - - @Override - public void set_CCEN(String val_1_bit) - { - _CCEN.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setD(String val_12_bit) - { - D.setState(BitVector.parse(val_12_bit)); - } - - @Override - public void set_CC(String val_1_bit) - { - _CC.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setCI(String val_1_bit) - { - CI.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_RLD(String val_1_bit) - { - _RLD.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void set_OE(String val_1_bit) - { - _OE.setState(BitVector.parse(val_1_bit)); - } - - @Override - public void setDirectly(Register r, String val_X_bit) - { - am2901.setHighLevelState(regToStateID(r), BitVector.parse(val_X_bit)); - } - - @Override - public String getY() - { - return Y.getDisplayedValue().toString(); - } - - @Override - public String get_FULL() - { - return _FULL.getDisplayedValue().toString(); - } - - @Override - public String get_PL() - { - return _PL.getDisplayedValue().toString(); - } - - @Override - public String get_MAP() - { - return _MAP.getDisplayedValue().toString(); - } - - @Override - public String get_VECT() - { - return _VECT.getDisplayedValue().toString(); - } - - @Override - public String getDirectly(Register r) - { - return am2901.getHighLevelState(regToStateID(r)).toString(); - } - - private static String regToStateID(Register r) - { - switch (r) - { - case S_0: - case S_1: - case S_2: - case S_3: - case S_4: - return "stack.c" + BitVector.from(r.ordinal(), 3); - case SP: - return "sp.q"; - case PC: - return "mupc.q"; - case REG_COUNT: - return "r.q"; - default: - throw new IllegalArgumentException("unknown: " + r); - } - } - - @Override - public TestEnvironmentHelper getTestEnvironmentHelper() - { - return testHelper; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java deleted file mode 100644 index 3f68c67e..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.mograsim.logic.model.am2900.util; - -import java.util.Objects; - -import org.junit.jupiter.api.extension.AfterTestExecutionCallback; -import org.junit.jupiter.api.extension.ExtensionContext; - -import net.mograsim.logic.model.am2900.TestableCircuit; - -public class DisplayStateOnFailure implements AfterTestExecutionCallback -{ - public static final boolean ACTIVE = true; - - private final TestableCircuit circuitUnderTest; - - public DisplayStateOnFailure(TestableCircuit circuitUnderTest) - { - this.circuitUnderTest = Objects.requireNonNull(circuitUnderTest); - } - - @Override - public void afterTestExecution(ExtensionContext context) throws Exception - { - if (ACTIVE && context.getExecutionException().isPresent()) - { - context.getExecutionException().get().printStackTrace(); - circuitUnderTest.displayState(); - } - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java deleted file mode 100644 index c085c52e..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.mograsim.logic.model.am2900.util; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.util.ModellingTool; - -public class SwitchWithDisplay -{ - private final Pin pin; - private final ModelBitDisplay modelBitDisplay; - private final ModelManualSwitch modelManualSwitch; - - public SwitchWithDisplay(LogicModelModifiable model, Pin target) - { - pin = target; - modelBitDisplay = new ModelBitDisplay(model, pin.logicWidth); - modelManualSwitch = new ModelManualSwitch(model, pin.logicWidth); - - ModellingTool tool = ModellingTool.createFor(model); - ModelWireCrossPoint crossPoint = new ModelWireCrossPoint(model, pin.logicWidth); - tool.connect(modelBitDisplay.getInputPin(), crossPoint); - tool.connect(modelManualSwitch.getOutputPin(), crossPoint); - } - - public final BitVector getDisplayedValue() - { - return modelBitDisplay.getBitDisplay().getDisplayedValue(); - } - - public final void setState(BitVector bits) - { - modelManualSwitch.getManualSwitch().setState(bits); - } - - public final Pin getPin() - { - return pin; - } - - public final CoreBitDisplay getBitDisplay() - { - return modelBitDisplay.getBitDisplay(); - } - - public final CoreManualSwitch getManualSwitch() - { - return modelManualSwitch.getManualSwitch(); - } - - final ModelBitDisplay getModelBitDisplay() - { - return modelBitDisplay; - } - - final ModelManualSwitch getModelManualSwitch() - { - return modelManualSwitch; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java deleted file mode 100644 index 4bae8ec5..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java +++ /dev/null @@ -1,276 +0,0 @@ -package net.mograsim.logic.model.am2900.util; - -import static org.junit.jupiter.api.Assertions.fail; - -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.Objects; -import java.util.Optional; -import java.util.Queue; -import java.util.Set; -import java.util.TreeSet; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.model.LogicUIStandaloneGUI; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.am2900.TestableCircuit; -import net.mograsim.logic.model.am2900.TestableCircuit.Result; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.ModellingTool; - -public class TestEnvironmentHelper -{ - private final TestableCircuit testEnvInstance; - private final Class testEnvClass; - private final String modelId; - private Field componentField; - private Optional timelineField = Optional.empty(); - - private ModelComponent component; - private Timeline timeline; - private LogicModelModifiable logicModel; - private ModellingTool modellingTool; - private HashMap idSwitchMap = new HashMap<>(); - private HashMap idDisplayMap = new HashMap<>(); - - private DebugState debug = DebugState.NO_DEBUG; - private Set wireDebugChangeSet; - private boolean debugWires = false; - public int debugEventThreshold = 10_000; - public int debugEventCount = 500; - private int eventCounter; - - public TestEnvironmentHelper(TestableCircuit testEnv, String modelId) - { - this.testEnvInstance = testEnv; - this.modelId = modelId; - this.testEnvClass = testEnvInstance.getClass(); - for (Field f : testEnvClass.getDeclaredFields()) - { - if (ModelComponent.class.isAssignableFrom(f.getType())) - { - componentField = f; - componentField.setAccessible(true); - } else if (Timeline.class.isAssignableFrom(f.getType())) - { - f.setAccessible(true); - timelineField = Optional.of(f); - } - } - if (componentField == null) - throw new IllegalStateException("No component or timeline field found!"); - } - - public void setup(DebugState debug) - { - this.debug = debug; - // Create logic model - logicModel = new LogicModelModifiable(); - modellingTool = ModellingTool.createFor(logicModel); - Am2900Loader.setup(); - component = IndirectModelComponentCreator.createComponent(logicModel, modelId); - setField(componentField, component); - - component.getPins().values().forEach(this::extendModelPin); - - // Create core model - CoreModelParameters params = new CoreModelParameters(); - params.gateProcessTime = 50; - params.wireTravelTime = 10; - timeline = LogicCoreAdapter.convert(logicModel, params); - timelineField.ifPresent(f -> setField(f, timeline)); - - // Bind switches/displays to this test class - component.getPins().values().forEach(this::bindModelPin); - - if (debug == DebugState.DEBUG_AT_PERFORMANCE_COST) - { - setupDebugging(); - } - timeline.addEventAddedListener(te -> eventCounter++); - } - - private void extendModelPin(Pin p) - { - String javaIdentId = idToJavaIdentifier(p.name); - try - { - Field f = testEnvClass.getDeclaredField(javaIdentId); - Class type = f.getType(); - if (CoreManualSwitch.class.isAssignableFrom(type)) - { - ModelManualSwitch gms = new ModelManualSwitch(logicModel, p.logicWidth); - modellingTool.connect(p, gms.getOutputPin()); - idSwitchMap.put(p.name, gms); - } else if (CoreBitDisplay.class.isAssignableFrom(type)) - { - ModelBitDisplay gbd = new ModelBitDisplay(logicModel, p.logicWidth); - modellingTool.connect(p, gbd.getInputPin()); - idDisplayMap.put(p.name, gbd); - } else if (SwitchWithDisplay.class.isAssignableFrom(type)) - { - SwitchWithDisplay swd = new SwitchWithDisplay(logicModel, p); - setField(f, swd); - } else - { - fail("unkown field type " + type); - } - } - catch (NoSuchFieldException | SecurityException e) - { - fail(e); - } - } - - private void bindModelPin(Pin p) - { - String javaIdentId = idToJavaIdentifier(p.name); - if (idDisplayMap.containsKey(p.name)) - setField(javaIdentId, idDisplayMap.get(p.name).getBitDisplay()); - if (idSwitchMap.containsKey(p.name)) - setField(javaIdentId, idSwitchMap.get(p.name).getManualSwitch()); - } - - private void setupDebugging() - { - // Debug code - HashSet wiresIncludingSubmodels = new HashSet<>(); - Queue modelsToIterate = new LinkedList<>(); - modelsToIterate.add(logicModel); - while (modelsToIterate.size() > 0) - { - LogicModel model = modelsToIterate.poll(); - wiresIncludingSubmodels.addAll(model.getWiresByName().values()); - for (ModelComponent comp : model.getComponentsByName().values()) - if (comp instanceof SubmodelComponent) - modelsToIterate.offer(((SubmodelComponent) comp).submodel); - } - System.out.println(wiresIncludingSubmodels.size()); - logicModel.setRedrawHandler(() -> wiresIncludingSubmodels.forEach(w -> - { - if (debugWires) - { - wireDebugChangeSet.add(w.toString()); - } - })); - } - - public Result run() - { - // Normal execution until completion or eventLimit - int eventLimit = debugEventThreshold; - eventCounter = 0; - debugWires = false; - while (eventCounter < eventLimit) - { - timeline.executeNext(); - if (!timeline.hasNext()) - return Result.SUCCESS; - } - - // Start debugging if event limit is reached (if debug is active) - if (debug == DebugState.DEBUG_AT_PERFORMANCE_COST) - return debugThisRun(); - - return Result.OUT_OF_TIME; - } - - private Result debugThisRun() - { - int eventLimit = debugEventThreshold; - debugWires = true; - wireDebugChangeSet = new TreeSet<>(); - Set oldChangeSet; - // observe wire changes to detect, if we are really stuck in an endless loop - do - { - eventLimit += debugEventCount; - oldChangeSet = wireDebugChangeSet; - wireDebugChangeSet = new TreeSet<>(); - while (eventCounter < eventLimit) - { - timeline.executeNext(); - if (!timeline.hasNext()) - { - // no endless loop, but more events needed than expected - System.out.println("run() took longer than expected: " + eventCounter); - return Result.SUCCESS; - } - } - } while (!oldChangeSet.equals(wireDebugChangeSet)); - // if stuck, abort execution and print wires - System.err.print("Problematic Wire updates:"); - wireDebugChangeSet.forEach(System.out::println); - System.err.println("run() failed: " + eventCounter); - return Result.OUT_OF_TIME; - } - - private static String idToJavaIdentifier(String s) - { - StringBuilder sb = new StringBuilder(s.length()); - char c = s.charAt(0); - sb.append(Character.isJavaIdentifierStart(c) ? c : '_'); - for (int i = 1; i < s.length(); i++) - sb.append(Character.isJavaIdentifierPart(c = s.charAt(i)) ? c : '_'); - return sb.toString(); - } - - private void setField(Field f, S value) - { - try - { - f.setAccessible(true); - f.set(testEnvInstance, Objects.requireNonNull(value)); - } - catch (Exception e) - { - fail(e); - } - } - - private void setField(String name, S value) - { - try - { - Field f = testEnvClass.getDeclaredField(name); - f.setAccessible(true); - f.set(testEnvInstance, Objects.requireNonNull(value)); - } - catch (Exception e) - { - fail(e); - } - } - - public void displayState() - { - try - { - new LogicUIStandaloneGUI(logicModel).run(); - logicModel.setRedrawHandler(null); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - public enum DebugState - { - NO_DEBUG, DEBUG_AT_PERFORMANCE_COST; - } -} diff --git a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestUtil.java b/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestUtil.java deleted file mode 100644 index 5989dfbe..00000000 --- a/net.mograsim.logic.model.am2900/test/net/mograsim/logic/model/am2900/util/TestUtil.java +++ /dev/null @@ -1,100 +0,0 @@ -package net.mograsim.logic.model.am2900.util; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; - -public final class TestUtil -{ - private TestUtil() - { - - } - - /** - * Transforms the last four bits of an int to a string that contains the binary ('1' and '0') representation of the 4 bits - * - * @author Christian Femers - */ - public static String to4bitBin(int x) - { - StringBuilder sb = new StringBuilder(4); - sb.append((x & 0b1000) == 0 ? '0' : '1'); - sb.append((x & 0b0100) == 0 ? '0' : '1'); - sb.append((x & 0b0010) == 0 ? '0' : '1'); - sb.append((x & 0b0001) == 0 ? '0' : '1'); - return sb.toString(); - } - - /** - * Transforms the given boolean to a string that contains the binary ('1' and '0') representation of the bit - * - * @author Christian Femers - */ - public static String to1bitBin(boolean bitIsSet) - { - return bitIsSet ? "1" : "0"; - } - - /** - * Transforms the given int to a string that contains the binary ('1' and '0') representation of the int. "0" is only returned when the - * int is equal to zero. - * - * @author Christian Femers - */ - public static String to1bitBin(int someInt) - { - return someInt != 0 ? "1" : "0"; - } - - /** - * Transforms a 4 bit signed integer (-8 to 7) to a int representing the same number. (Adding leading 1-bits if the 4 bit int is - * negative) - * - * @author Christian Femers - */ - public static int signed4ToSigned32(int signed4bit) - { - if ((signed4bit & 0b1000) > 0) - return signed4bit | 0xFF_FF_FF_F0; - return signed4bit & 0x00_00_00_0F; - } - - /** - * Transforms a 16 bit signed integer (-32768 to 32767 - a short) to a int representing the same number. (Adding leading 1-bits if the - * 16 bit int is negative) - * - * @author Christian Femers - */ - public static int signed16ToSigned32(int signed16bit) - { - return (short) signed16bit; - } - - /** - * Transforms the last n bits of an int to a string that contains the binary ('1' and '0') representation of the n bits - * - * @author Christian Femers - */ - public static String toNbitString(int x, int n) - { - StringBuilder sb = new StringBuilder(n); - for (int i = 0; i < n; i++) - { - sb.append((x >> i) & 1); - } - return sb.reverse().toString(); - } - - public static BitVector of(int value, int length) - { - BitVectorMutator mutator = BitVectorMutator.ofLength(length); - int val = value; - for (int i = length - 1; i >= 0; i--) - { - mutator.setMSBit(i, Bit.lastBitOf(val)); - val >>>= 1; - } - return mutator.toBitVector(); - } -} diff --git a/net.mograsim.logic.model.editor/.classpath b/net.mograsim.logic.model.editor/.classpath deleted file mode 100644 index c4b0fff7..00000000 --- a/net.mograsim.logic.model.editor/.classpath +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.logic.model.editor/.gitignore b/net.mograsim.logic.model.editor/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.logic.model.editor/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.logic.model.editor/.project b/net.mograsim.logic.model.editor/.project deleted file mode 100644 index 4f792a69..00000000 --- a/net.mograsim.logic.model.editor/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.logic.model.editor - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs b/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF b/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF deleted file mode 100644 index 283c286d..00000000 --- a/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF +++ /dev/null @@ -1,16 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Editor -Bundle-SymbolicName: net.mograsim.logic.model.editor -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.logic.model.editor, - net.mograsim.logic.model.editor.handles, - net.mograsim.logic.model.editor.states, - net.mograsim.logic.model.editor.ui, - net.mograsim.logic.model.editor.util -Require-Bundle: net.mograsim.logic.model;bundle-version="0.1.0", - net.mograsim.preferences;bundle-version="0.1.0", - net.mograsim.logic.model.am2900;bundle-version="0.1.0" -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Automatic-Module-Name: net.mograsim.logic.model.editor -Bundle-Vendor: Mograsim Team diff --git a/net.mograsim.logic.model.editor/build.properties b/net.mograsim.logic.model.editor/build.properties deleted file mode 100644 index d1763276..00000000 --- a/net.mograsim.logic.model.editor/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - .,\ \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java deleted file mode 100644 index 90baafb5..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java +++ /dev/null @@ -1,253 +0,0 @@ -package net.mograsim.logic.model.editor; - -import java.util.HashSet; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonParser; -import com.google.gson.JsonSyntaxException; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.am2900.Am2900Loader; -import net.mograsim.logic.model.editor.handles.ComponentHandle; -import net.mograsim.logic.model.editor.handles.Handle; -import net.mograsim.logic.model.editor.handles.HandleManager; -import net.mograsim.logic.model.editor.handles.PinHandle; -import net.mograsim.logic.model.editor.states.StateManager; -import net.mograsim.logic.model.editor.ui.DialogManager; -import net.mograsim.logic.model.editor.ui.EditorGUI; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer; - -public final class Editor -{ - final Selection selection = new Selection(); - final Set copyBuffer = new HashSet<>(); - public final DeserializedSubmodelComponent toBeEdited; - public final HandleManager handleManager; - public final EditorGUI gui; - public final StateManager stateManager; - private final SaveLoadManager saveManager; - private Snapping snapping = Snapping.ABSOLUTE; - private double snapX = 5, snapY = 5; - public final DialogManager dialogManager; - public final EditorUserInput userInput; - - public Editor(DeserializedSubmodelComponent toBeEdited) - { - this.toBeEdited = toBeEdited; - handleManager = new HandleManager(this); - gui = new EditorGUI(this); - userInput = new EditorUserInput(this); - stateManager = new StateManager(this); - handleManager.init(); - saveManager = new SaveLoadManager(this); - dialogManager = new DialogManager(gui.shell); - - gui.open(); - } - - public LogicModelModifiable getSubmodel() - { - return toBeEdited.getSubmodelModifiable(); - } - - public Selection getSelection() - { - return selection; - } - - // TODO: Remove this error prone method: Relative offset may change between multiple moves, - // because Handles have different ways of responding to reqMove(...), causing strange behaviour - @Deprecated - public void moveSelection(double x, double y) - { - Point ref = selection.getTopLeft(); - Point snapped = new Point(x, y); - applySnapping(snapped); - - for (Handle c : selection) - { - double newX, newY; - newX = snapped.x + c.getPosX() - ref.x; - newY = snapped.y + c.getPosY() - ref.y; - c.reqMove(newX, newY); - } - } - - public void moveHandles(double x, double y, Map handleOffsetMap) - { - Point snapped = new Point(x, y); - applySnapping(snapped); - - for (Handle c : handleOffsetMap.keySet()) - { - Point offset = handleOffsetMap.get(c); - double newX, newY; - newX = snapped.x + offset.x; - newY = snapped.y + offset.y; - c.reqMove(newX, newY); - } - } - - public void deleteSelection() - { - selection.forEach(h -> h.reqDelete()); - selection.clear(); - } - - public void copy() - { - copyBuffer.clear(); - Point refPoint = selection.getTopLeft(); - for (Handle h : selection) - { - Optional cInfo = h.reqCopy(refPoint); - if (cInfo.isPresent()) - copyBuffer.add(cInfo.get()); - } - } - - public void paste(double x, double y) - { - selection.clear(); - for (ComponentInfo info : copyBuffer) - { - ModelComponent comp = addComponent(info.identifier, info.params); - ComponentHandle h = handleManager.getHandle(comp); - h.reqMove(info.relX, info.relY); - selection.add(h); - } - moveSelection(x, y); - } - - public void save() - { - saveManager.save(); - } - - public void saveAs() - { - saveManager.openSaveAsDialog(); - } - - public void addComponent(double x, double y) - { - boolean successful = false; - JsonElement params = JsonNull.INSTANCE; - outer: while (!successful) - { - String selected = gui.getAddListSelected(); - try - { - ModelComponent c = addComponent(selected, params); - selection.clear(); - selection.add(handleManager.getHandle(c)); - moveSelection(x, y); - successful = true; - } - catch (@SuppressWarnings("unused") UnsupportedOperationException | JsonSyntaxException | NumberFormatException - | NullPointerException e) - { - String result = DialogManager.openMultiLineTextDialog("Add component", "Create", "Cancel", "Parameters:"); - if (result == null) - break outer; - params = new JsonParser().parse(result); - } - } - } - - private ModelComponent addComponent(String identifier, JsonElement params) - { - return IndirectModelComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier, params); - } - - public void duplicate() - { - copy(); - Point origin = selection.getTopLeft(); - paste(origin.x + 20, origin.y + 20); - } - - private void applySnapping(Point newP) - { - switch (snapping) - { - case OFF: - break; - case ABSOLUTE: - newP.x = (int) (newP.x / snapX + .5) * snapX; - newP.y = (int) (newP.y / snapY + .5) * snapY; - break; - default: - break; - } - } - - public static class ComponentInfo - { - public final double relX, relY; - public final String identifier; - public final JsonElement params; - - public ComponentInfo(double relX, double relY, String identifier, JsonElement params) - { - this.relX = relX; - this.relY = relY; - this.identifier = identifier; - this.params = params; - } - } - - @SuppressWarnings("unused") - public void addWire(PinHandle a, PinHandle b) - { - new ModelWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]); - } - - public static enum Snapping - { - OFF, ABSOLUTE; - - @Override - public String toString() - { - return super.toString().toLowerCase(); - } - } - - public static void main(String[] args) - { - Am2900Loader.setup(); - openNewEditor(); -// SaveLoadManager.openLoadDialog(); - } - - public static void openNewEditor() - { - DeserializedSubmodelComponent toBeEdited = new DeserializedSubmodelComponent(new LogicModelModifiable(), null, null, null); - toBeEdited.setOutlineRenderer(new DefaultOutlineRenderer(toBeEdited)); - toBeEdited.setSymbolRenderer(new DefaultSymbolRenderer(toBeEdited)); - toBeEdited.setHighLevelStateHandler(new DefaultHighLevelStateHandler()); - new Editor(toBeEdited); - } - - public Snapping getSnapping() - { - return snapping; - } - - public void setSnapping(Snapping snapping) - { - this.snapping = snapping; - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java deleted file mode 100644 index feae04f3..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java +++ /dev/null @@ -1,111 +0,0 @@ -package net.mograsim.logic.model.editor; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.ui.EditorGUI; - -public class EditorUserInput -{ - private final EditorGUI gui; - - public EditorUserInput(Editor editor) - { - this.gui = editor.gui; - gui.logicCanvas.addMouseListener(new MouseListener() - { - @Override - public void mouseDoubleClick(MouseEvent e) - { - // TODO Auto-generated method stub - } - - @Override - public void mouseDown(MouseEvent e) - { - Point clicked = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y); - switch (e.button) - { - case 1: - editor.handleManager.click(clicked, e.stateMask); - break; - } - - } - - @Override - public void mouseUp(MouseEvent e) - { - } - }); - - gui.logicCanvas.addMouseMoveListener((e) -> - { - Point dest = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y); - editor.stateManager.mouseMoved(dest.x, dest.y); - }); - - gui.logicCanvas.addKeyListener(new KeyListener() - { - - @Override - public void keyReleased(KeyEvent e) - { - // TODO Auto-generated method stub - - } - - @Override - public void keyPressed(KeyEvent e) - { - switch (e.keyCode) - { - case 'c': - if ((e.stateMask & SWT.CTRL) == SWT.CTRL) - editor.stateManager.copy(); - break; - case 'v': - if ((e.stateMask & SWT.CTRL) == SWT.CTRL) - editor.stateManager.paste(); - break; - case 'd': - if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) - editor.stateManager.duplicate(); - break; - case 'g': - editor.stateManager.grab(); - break; - case 'r': - editor.stateManager.delete(); - break; - case 's': - if ((e.stateMask & SWT.CTRL) == SWT.CTRL) - editor.save(); - break; - case 'a': - if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) - editor.stateManager.add(); - break; - case 'h': - editor.stateManager.boxSelect(); - break; - } - - } - }); - } - - public Point getCanvasMousePosition() - { - return new Point(gui.logicCanvas.toControl(gui.display.getCursorLocation())); - } - - public Point getWorldMousePosition() - { - return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition()); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java deleted file mode 100644 index bbe202b1..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.mograsim.logic.model.editor; - -import java.io.IOException; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Shell; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; - -public class SaveLoadManager -{ - private String savePath = null; - private Editor editor; - - public SaveLoadManager(Editor editor) - { - this.editor = editor; - } - - public void save() - { - if (savePath == null) - openSaveAsDialog(); - else - innerSave(); - } - - public void openSaveAsDialog() - { - Shell fdShell = new Shell(); - FileDialog fd = new FileDialog(fdShell, SWT.SAVE); - fd.setText("Save as..."); - fd.setFilterExtensions(new String[] { "*.json" }); - String result = fd.open(); - fdShell.dispose(); - if (result != null) - { - savePath = result; - innerSave(); - } - } - - private void innerSave() - { - try - { - SubmodelComponentSerializer.serialize(editor.toBeEdited, savePath); - } - catch (IOException e) - { - savePath = null; - System.err.println("Failed to save component!"); - e.printStackTrace(); - } - } - - public static void openLoadDialog() throws IOException - { - Shell fdShell = new Shell(); - FileDialog fd = new FileDialog(fdShell, SWT.OPEN); - fd.setText("Load component..."); - fd.setFilterExtensions(new String[] { "*.json" }); - String result = fd.open(); - fdShell.dispose(); - if (result != null) - { - new Editor((DeserializedSubmodelComponent) IndirectModelComponentCreator.createComponent(new LogicModelModifiable(), - "jsonfile:" + result)); - } - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java deleted file mode 100644 index bc225eb7..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java +++ /dev/null @@ -1,132 +0,0 @@ -package net.mograsim.logic.model.editor; - -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.function.DoubleBinaryOperator; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.editor.handles.Handle; - -public class Selection implements Iterable -{ - private Set selection = new HashSet<>(); - - public Map calculateOffsets() - { - Map offsets = new HashMap<>(); - Point ref = getTopLeft(); - selection.forEach(h -> offsets.put(h, new Point(h.getPosX() - ref.x, h.getPosY() - ref.y))); - return offsets; - } - - public Rectangle getBounds() - { - Point pos1 = getTopLeft(); - Point pos2 = getBottomRight(); - return new Rectangle(pos1.x, pos1.y, pos2.x - pos1.x, pos2.y - pos1.y); - } - - public double getWidth() - {// TODO: Compute this more efficiently - return getTopRight().x - getTopLeft().x; - } - - public double getHeight() - { - return getBottomLeft().y - getTopLeft().y; - } - - public Point getTopLeft() - { - return getCorner(Double.MAX_VALUE, Double::min, r -> 0, Double.MAX_VALUE, Double::min, r -> 0); - } - - public Point getTopRight() - { - return getCorner(-Double.MAX_VALUE, Double::max, r -> r.width, Double.MAX_VALUE, Double::min, r -> 0); - } - - public Point getBottomLeft() - { - return getCorner(Double.MAX_VALUE, Double::min, r -> 0, -Double.MAX_VALUE, Double::max, r -> r.height); - } - - public Point getBottomRight() - { - return getCorner(-Double.MAX_VALUE, Double::max, r -> r.width, -Double.MAX_VALUE, Double::max, r -> r.height); - } - - public Point getCorner(double xIdentity, DoubleBinaryOperator xOp, Offset xOffset, double yIdentity, DoubleBinaryOperator yOp, - Offset yOffset) - { - double x = xIdentity, y = yIdentity; - for (Handle c : selection) - { - Rectangle bounds = c.getBounds(); - x = xOp.applyAsDouble(x, bounds.x + xOffset.computeOffset(bounds)); - y = yOp.applyAsDouble(y, bounds.y + yOffset.computeOffset(bounds)); - } - return new Point(x, y); - } - - private static interface Offset - { - public double computeOffset(Rectangle bounds); - } - - public void add(Handle h) - { - selection.add(h); - h.onSelect(); - } - - public void remove(Handle h) - { - selection.remove(h); - h.onDeselect(); - } - - public void clear() - { - selection.forEach(h -> h.onDeselect()); - selection.clear(); - } - - public int size() - { - return selection.size(); - } - - public boolean contains(Handle h) - { - return selection.contains(h); - } - - public void addAll(Collection handles) - { - handles.forEach(h -> h.onSelect()); - selection.addAll(handles); - } - - @Override - public Iterator iterator() - { - return selection.iterator(); - } - - @Override - public String toString() - { - return selection.toString(); - } - - public boolean isEmpty() - { - return selection.isEmpty(); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java deleted file mode 100644 index 14868e94..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java +++ /dev/null @@ -1,107 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import java.util.Optional; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.editor.Editor.ComponentInfo; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; - -public class ComponentHandle extends Handle -{ - private final LogicModelModifiable model; - public final ModelComponent parent; - private final static double POS_OFFSET = 2.0d; - private final static double LENGTH_OFFSET = POS_OFFSET * 2; - boolean selected = false; - - public ComponentHandle(LogicModelModifiable model, ModelComponent parent) - { - super(4); - this.model = model; - this.parent = parent; - Rectangle bounds = parent.getBounds(); - setSize(bounds.width, bounds.height); - parent.addComponentResizedListener((c) -> - { - Rectangle pBounds = c.getBounds(); - setSize(pBounds.width, pBounds.height); - }); - moveTo(parent.getPosX(), parent.getPosY()); - } - - @Override - protected void moveTo(double x, double y) - { - super.moveTo(x, y); - parent.moveTo(x, y); - } - - @Override - protected void render(GeneralGC gc) - { - if (selected) - { - gc.setLineWidth(2); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); - Rectangle bounds = getBounds(); - bounds.x -= POS_OFFSET; - bounds.y -= POS_OFFSET; - bounds.width += LENGTH_OFFSET; - bounds.height += LENGTH_OFFSET; - gc.drawRectangle(bounds); - Font oldFont = gc.getFont(); - gc.setFont(new Font(oldFont.getName(), 5, oldFont.getStyle())); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)); - gc.drawText(parent.getName(), bounds.x, bounds.y, true); - gc.setFont(oldFont); - } - } - - @Override - public void reqMove(double x, double y) - { - moveTo(x, y); - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - public void reqDelete() - { - model.destroyComponent(parent); - } - - @Override - public Optional reqCopy(Point refPoint) - { - IdentifyParams idParams = new IdentifyParams(); - return Optional.of(new ComponentInfo(parent.getPosX() - refPoint.x, parent.getPosY() - refPoint.y, - parent.getIDForSerializing(idParams), parent.getParamsForSerializingJSON(idParams))); - } - - @Override - public HandleType getType() - { - return HandleType.COMPONENT; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java deleted file mode 100644 index 959fb896..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; - -public class CornerHandle extends Handle -{ - private final static int LENGTH = 5; - private final DeserializedSubmodelComponent toBeEdited; - private boolean selected; - - public CornerHandle(DeserializedSubmodelComponent toBeEdited) - { - super(0); - this.toBeEdited = toBeEdited; - setSize(LENGTH, LENGTH); - initPos(); - } - - @Override - protected void render(GeneralGC gc) - { - gc.setBackground(Display.getCurrent().getSystemColor(selected ? SWT.COLOR_YELLOW : SWT.COLOR_DARK_GREEN)); - gc.fillRectangle(getPosX(), getPosY(), LENGTH, LENGTH); - } - - private void initPos() - { - Rectangle bounds = toBeEdited.getBounds(); - double subScale = toBeEdited.getSubmodelScale(); - moveTo(bounds.width / subScale, bounds.height / subScale); - } - - @Override - public void reqMove(double x, double y) - { - moveTo(x, y); - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - protected void moveTo(double x, double y) - { - super.moveTo(x, y); - double subScale = toBeEdited.getSubmodelScale(); - toBeEdited.setSize(x * subScale, y * subScale); - } - - @Override - public HandleType getType() - { - return HandleType.CORNER; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java deleted file mode 100644 index cbfe2a2a..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java +++ /dev/null @@ -1,150 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Optional; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.editor.Editor.ComponentInfo; -import net.mograsim.logic.model.editor.states.EditorState; - -public abstract class Handle -{ - private final Rectangle bounds; - private final Collection redrawListeners, destroyListeners; - private final int priority; - - public Handle(int priority) - { - this.priority = priority; - redrawListeners = new ArrayList<>(); - destroyListeners = new ArrayList<>(); - bounds = new Rectangle(0, 0, 0, 0); - callRedrawListeners(); - } - - final public void render(GeneralGC gc, Rectangle visibleRegion) - { - if (bounds.intersects(visibleRegion)) - render(gc); - } - - protected abstract void render(GeneralGC gc); - - protected void setSize(double width, double height) - { - bounds.width = width; - bounds.height = height; - callRedrawListeners(); - } - - protected void moveTo(double x, double y) - { - bounds.x = x; - bounds.y = y; - callRedrawListeners(); - } - - public Rectangle getBounds() - { - return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); - } - - public void addRedrawListener(Runnable listener) - { - redrawListeners.add(listener); - } - - public void removeRedrawListener(Runnable listener) - { - redrawListeners.remove(listener); - } - - protected void callRedrawListeners() - { - redrawListeners.forEach(l -> l.run()); - } - - public double getPosX() - { - return bounds.x; - } - - public double getPosY() - { - return bounds.y; - } - - void destroy() - { - destroyListeners.forEach(l -> l.run()); - } - - public void addDestroyListener(Runnable listener) - { - redrawListeners.add(listener); - } - - public void removeDestroyListener(Runnable listener) - { - redrawListeners.remove(listener); - } - - public boolean contains(double x, double y) - { - return bounds.contains(x, y); - } - - public boolean contains(Point p) - { - return contains(p.x, p.y); - } - - /** - * Register a mouse click - * - * @param x Coordinate of the click in the world, not the display context - * @param y Coordinate of the click in the world, not the display context - * @return true if the click was consumed, false otherwise - */ - public boolean click(double x, double y, int stateMask, EditorState state) - { - if (contains(x, y)) - return state.clickedHandle(new HandleClickInfo(this, stateMask)); - return false; - } - - //@formatter:off - public void reqMove(double x, double y) {} - public void reqDelete() {} - public Optional reqCopy(Point refPoint) { return Optional.empty(); } - public void onSelect() {} - public void onDeselect() {} - //@formatter:on - - public final int getPriority() - { - return priority; - } - - public abstract HandleType getType(); - - public static enum HandleType - { - COMPONENT, STATIC_PIN, INTERFACE_PIN, WIRE_POINT, WIRE, CORNER; - } - - public static class HandleClickInfo - { - public final int stateMask; - public final Handle clicked; - - HandleClickInfo(Handle clicked, int stateMask) - { - this.clicked = clicked; - this.stateMask = stateMask; - } - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java deleted file mode 100644 index 0a33509c..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java +++ /dev/null @@ -1,390 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.states.EditorState; -import net.mograsim.logic.model.editor.util.PrioritySet; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; - -public class HandleManager -{ - private final Map handlePerPin; - private final Map handlePerInterfacePin; - private final Map> pointHandlesPerWire; - private final Map handlePerWire; - private final Set handles; - private final Set wirePointHandles; - private final Map handlePerComp; - - private final Collection> handleAddedListeners; - private final Collection> handleRemovedListeners; - private final Editor editor; - private boolean initialized = false; - - public HandleManager(Editor editor) - { - this.editor = editor; - handlePerPin = new HashMap<>(); - handlePerInterfacePin = new HashMap<>(); - pointHandlesPerWire = new HashMap<>(); - handlePerComp = new HashMap<>(); - handles = new PrioritySet<>((a, b) -> Integer.compare(a.getPriority(), b.getPriority())); - wirePointHandles = new HashSet<>(); - handlePerWire = new HashMap<>(); - - handleAddedListeners = new ArrayList<>(); - handleRemovedListeners = new ArrayList<>(); - - LogicModelModifiable model = editor.getSubmodel(); - - model.addComponentAddedListener(c -> registerComponent(c)); - - model.addComponentRemovedListener(c -> - { - removeComponentHandle(c); - }); - - model.addWireAddedListener(w -> - { - registerWire(w); - }); - - model.addWireRemovedListener(w -> - { - removeWireHandle(w); - removeWirePointHandles(w); - }); - } - - //////////////////////////////////////// - // -- Setting up initial handles -- /// - ////////////////////////////////////// - - public void init() - { - if (initialized) - System.err.println("Warning! HandleManager was already initialized."); - else - { - LogicModelModifiable model = editor.getSubmodel(); - Map compsByName = model.getComponentsByName(); - Set comps = new HashSet<>(compsByName.values()); - ModelComponent interfaceComp = compsByName.get(SubmodelComponent.SUBMODEL_INTERFACE_NAME); - comps.remove(interfaceComp); - registerInterfaceComponent(interfaceComp); - comps.forEach(c -> registerComponent(c)); - - model.getWiresByName().values().forEach(w -> registerWire(w)); - addHandle(new CornerHandle(editor.toBeEdited)); - } - } - - private void registerInterfaceComponent(ModelComponent c) - { - c.getPins().values().forEach(p -> addInterfacePinHandle(p)); - c.addPinAddedListener(p -> addInterfacePinHandle(p)); - c.addPinRemovedListener(p -> removeInterfacePinHandle(p)); - } - - private void registerComponent(ModelComponent c) - { - addComponentHandle(c); - - c.getPins().values().forEach(p -> addPinHandle(p)); - - c.addPinAddedListener(p -> addPinHandle(p)); - c.addPinRemovedListener(p -> removePinHandle(p)); - } - - private void registerWire(ModelWire wire) - { - Point[] path = wire.getPath(); - AtomicInteger oldLength = new AtomicInteger(path == null ? 0 : path.length); - wire.addPathChangedListener(w -> - { - Point[] newPath = w.getPath(); - int newLength = newPath == null ? 0 : newPath.length; - int diff = newLength - oldLength.getAndSet(newLength); - if (diff != 0) - { - if (diff > 0) - { - for (int i = 0; i < diff; i++) - addWirePointHandle(w); - } - - List wpHandles = pointHandlesPerWire.get(w); - int size = wpHandles.size(); - for (int i = 0; i < size; i++) - { - wpHandles.get(i).setIndex(i); - } - } - pointHandlesPerWire.get(w).forEach(h -> h.updatePos()); - }); - addWireHandle(wire); - if (path == null) - return; - for (int i = 0; i < path.length; i++) - { - addWirePointHandle(wire); - } - } - - ///////////////////////////////////// - // -- Adding/Removing handles -- /// - /////////////////////////////////// - - private void addComponentHandle(ModelComponent c) - { - ComponentHandle h = new ComponentHandle(editor.getSubmodel(), c); - handlePerComp.put(c, h); - addHandle(h); - } - - private void removeComponentHandle(ModelComponent c) - { - ComponentHandle h = handlePerComp.get(c); - handlePerComp.remove(c); - removeHandle(h); - } - - private void addPinHandle(Pin owner) - { - StaticPinHandle h = new StaticPinHandle(owner); - handlePerPin.put(owner, h); - addHandle(h); - } - - private void removePinHandle(Pin owner) - { - StaticPinHandle h = handlePerPin.get(owner); - handlePerPin.remove(owner); - removeHandle(h); - } - - private void addInterfacePinHandle(Pin p) - { - // The following is not an alternative to the cast, because the new pin is not yet in the map, when the listener is called - // editor.toBeEdited.getSubmodelMovablePins().get(p.name); - MovablePin pM = (MovablePin) p; - InterfacePinHandle h = new InterfacePinHandle(pM, editor.toBeEdited); - handlePerInterfacePin.put(pM, h); - addHandle(h); - } - - private void removeInterfacePinHandle(Pin p) - { - InterfacePinHandle h = handlePerInterfacePin.get(p); - handlePerInterfacePin.remove(p); - removeHandle(h); - } - - private void addWirePointHandle(ModelWire w) - { - List wireHandles = pointHandlesPerWire.get(w); - WirePointHandle h; - if (wireHandles != null) - wireHandles.add(h = new WirePointHandle(this, w, wireHandles.size())); - else - { - wireHandles = new ArrayList<>(); - h = new WirePointHandle(this, w, 0); - wireHandles.add(h); - pointHandlesPerWire.put(h.parent, wireHandles); - } - this.wirePointHandles.add(h); - addHandle(h); - } - - void destroyWirePointHandle(ModelWire owner, WirePointHandle h) - { - if (pointHandlesPerWire.containsKey(owner)) - { - List handles = pointHandlesPerWire.get(owner); - int pointIndex = handles.indexOf(h); - handles.remove(pointIndex); - removeHandle(h); - owner.removePathPoint(pointIndex); - } - } - - private void removeWirePointHandles(ModelWire owner) - { - if (!pointHandlesPerWire.containsKey(owner)) - return; - pointHandlesPerWire.get(owner).forEach(h -> - { - wirePointHandles.remove(h); - removeHandle(h); - }); - pointHandlesPerWire.remove(owner); - } - - private void addWireHandle(ModelWire w) - { - WireHandle h = new WireHandle(editor.getSubmodel(), w); - handlePerWire.put(w, h); - addHandle(h); - } - - private void removeWireHandle(ModelWire w) - { - WireHandle h = handlePerWire.get(w); - handlePerWire.remove(w); - removeHandle(h); - } - - private void addHandle(Handle h) - { - handles.add(h); - callHandleAddedListeners(h); - } - - private void removeHandle(Handle h) - { - handles.remove(h); - callHandleRemovedListeners(h); - h.destroy(); - } - - public StaticPinHandle getHandle(Pin parent) - { - return handlePerPin.get(parent); - } - - public ComponentHandle getHandle(ModelComponent parent) - { - return handlePerComp.get(parent); - } - - public WireHandle getHandle(ModelWire parent) - { - return handlePerWire.get(parent); - } - - public Handle getInterfacePinHandle(Pin p) - { - return handlePerInterfacePin.get(p); - } - - /** - * @return A Collection of the registered {@link WirePointHandle}s of the specified wire - */ - public Collection getWirePointHandles(ModelWire parent) - { - return pointHandlesPerWire.get(parent).stream().collect(Collectors.toSet()); - } - - /** - * @return An unmodifiable view of all registered {@link Handle}s - */ - public Collection getHandles() - { - return Collections.unmodifiableCollection(handles); - } - - /** - * @return An unmodifiable view of all registered {@link StaticPinHandle}s - */ - public Collection getPinHandles() - { - return Collections.unmodifiableCollection(handlePerPin.values()); - } - - /** - * @return An unmodifiable view of all registered {@link InterfacePinHandle}s - */ - public Collection getInterfacePinHandles() - { - return Collections.unmodifiableCollection(handlePerInterfacePin.values()); - } - - /** - * @return An unmodifiable view of all registered {@link ComponentHandle}s - */ - public Collection getComponentHandles() - { - return Collections.unmodifiableCollection(handlePerComp.values()); - } - - /** - * @return An unmodifiable view of all registered {@link WireHandle}s - */ - public Collection getWireHandles() - { - return Collections.unmodifiableCollection(handlePerWire.values()); - } - - /** - * @return An unmodifiable view of all registered {@link WirePointHandle}s - */ - public Collection getWirePointHandles() - { - return Collections.unmodifiableSet(wirePointHandles); - } - - public void click(Point clicked, int stateMask) - { - EditorState entryState = editor.stateManager.getState(); - // TODO: As soon as wires connected to a component being removed also are removed, change priority) - if (!click(handles, clicked, entryState, stateMask)) - entryState.clickedEmpty(clicked, stateMask); - entryState.clicked(clicked, stateMask); - } - - private static boolean click(Collection handles, Point clicked, EditorState state, int stateMask) - { - for (Handle h : handles) - if (h.click(clicked.x, clicked.y, stateMask, state)) - return true; - return false; - } - - public void addHandleAddedListener(Consumer c) - { - handleAddedListeners.add(c); - } - - private void callHandleAddedListeners(Handle added) - { - handleAddedListeners.forEach(l -> l.accept(added)); - } - - public void removeHandleAddedListener(Consumer c) - { - handleAddedListeners.remove(c); - } - - public void addHandleRemovedListener(Consumer c) - { - handleRemovedListeners.add(c); - } - - private void callHandleRemovedListeners(Handle removed) - { - handleRemovedListeners.forEach(l -> l.accept(removed)); - } - - public void removeHandleRemovedListener(Consumer c) - { - handleRemovedListeners.remove(c); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java deleted file mode 100644 index 189d3d17..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java +++ /dev/null @@ -1,108 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; - -public class InterfacePinHandle extends PinHandle -{ - private final static int CIRCLE_DIAM = 4, CIRCLE_RADIUS = CIRCLE_DIAM / 2, SELECTED_CIRCLE_OFFSET = 1, - SELECTED_CIRCLE_DIAM = SELECTED_CIRCLE_OFFSET * 2 + CIRCLE_DIAM; - private final MovablePin parent; - private final DeserializedSubmodelComponent owner; - private boolean selected = false; - - public InterfacePinHandle(MovablePin parent, DeserializedSubmodelComponent pinOwner) - { - super(2); - this.parent = parent; - this.owner = pinOwner; - setSize(CIRCLE_DIAM, CIRCLE_DIAM); - initPos(); - } - - private void initPos() - { - Point pos = parent.getPos(); - moveTo(pos.x, pos.y); - } - - @Override - protected void render(GeneralGC gc) - { - double x = getPosX(), y = getPosY(); - - gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); - gc.drawText(parent.name, x + CIRCLE_DIAM, y + CIRCLE_DIAM, true); - if (selected) - { - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); - gc.drawOval(x - SELECTED_CIRCLE_OFFSET, y - SELECTED_CIRCLE_OFFSET, SELECTED_CIRCLE_DIAM, SELECTED_CIRCLE_DIAM); - } - gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); - gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); - } - - @Override - public void reqMove(double x, double y) - { - moveTo(x, y); - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - public void reqDelete() - { - owner.removeSubmodelInterface(parent.name); - } - - @Override - protected void moveTo(double x, double y) - { - super.moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS); - parent.setRelPos(getCenterX(), getCenterY()); - } - - @Override - public double getCenterX() - { - return getPosX() + CIRCLE_RADIUS; - } - - @Override - public double getCenterY() - { - return getPosY() + CIRCLE_RADIUS; - } - - @Override - public HandleType getType() - { - return HandleType.INTERFACE_PIN; - } - - @Override - public Pin getPin() - { - return parent; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java deleted file mode 100644 index 2e4a9dc6..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import net.mograsim.logic.model.model.wires.Pin; - -public abstract class PinHandle extends Handle -{ - public PinHandle(int priority) - { - super(priority); - } - - public abstract Pin getPin(); - - public abstract double getCenterX(); - - public abstract double getCenterY(); -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java deleted file mode 100644 index 0f4a1524..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.wires.Pin; - -public class StaticPinHandle extends PinHandle -{ - private final static int CIRCLE_DIAM = 2; - private final static int CIRCLE_RADIUS = 1; - private final Pin parent; - - public StaticPinHandle(Pin parent) - { - super(1); - this.parent = parent; - setSize(CIRCLE_DIAM, CIRCLE_DIAM); - parent.addPinMovedListener((p) -> updatePos()); - updatePos(); - } - - @Override - protected void render(GeneralGC gc) - { - gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN)); - gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); - } - - private void updatePos() - { - Point pos = parent.getPos(); - moveTo(pos.x - CIRCLE_RADIUS, pos.y - CIRCLE_RADIUS); - } - - @Override - public double getCenterX() - { - return getPosX() + CIRCLE_RADIUS; - } - - @Override - public double getCenterY() - { - return getPosY() + CIRCLE_RADIUS; - } - - @Override - public HandleType getType() - { - return HandleType.STATIC_PIN; - } - - @Override - public Pin getPin() - { - return parent; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java deleted file mode 100644 index 839c2b5b..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java +++ /dev/null @@ -1,161 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import java.util.Optional; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.editor.states.EditorState; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.ModelWire; - -public class WireHandle extends Handle -{ - private boolean selected = false; - private final static double WIDTH = 2.0; - private final static double WIDTH_SQUARED = WIDTH * WIDTH; - private final LogicModelModifiable model; - public final ModelWire parent; - - public WireHandle(LogicModelModifiable model, ModelWire parent) - { - super(5); - this.model = model; - this.parent = parent; - parent.addPathChangedListener(c -> updateBounds()); - updateBounds(); - } - - @Override - void destroy() - { - super.destroy(); - parent.removePathChangedListener(c -> updateBounds()); - } - - public void updateBounds() - { - Rectangle r = parent.getBounds(); - moveTo(r.x, r.y); - setSize(r.width, r.height); - } - - @Override - public void render(GeneralGC gc) - { - if (selected) - { - gc.setLineWidth(WIDTH); - gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW)); - gc.drawPolyline(parent.getEffectivePath()); - } - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - public void reqDelete() - { - // this wire could already be removed implicitly when removing a selection containing both wires and components - if (model.getWireByName(parent.name) != null) - model.destroyWire(parent); - } - - @Override - public boolean contains(double x, double y) - { - return click(parent, x, y).isPresent(); - } - - @Override - public boolean click(double x, double y, int stateMask, EditorState state) - { - Optional op = click(parent, x, y); - if (op.isEmpty()) - return false; - WireClickData data = op.get(); - return state.clickedHandle(new WireHandleClickInfo(this, data.segment, data.pos, stateMask)); - } - - public static class WireHandleClickInfo extends HandleClickInfo - { - public final int segment; - public final Point posOnWire; - - WireHandleClickInfo(WireHandle clicked, int segment, Point posOnWire, int stateMask) - { - super(clicked, stateMask); - this.segment = segment; - this.posOnWire = posOnWire; - } - - } - - private static Optional click(ModelWire w, double x, double y) - { - Rectangle modifiedBounds = w.getBounds(); - modifiedBounds.x -= WIDTH; - modifiedBounds.y -= WIDTH; - modifiedBounds.width += WIDTH * 2; - modifiedBounds.height += WIDTH * 2; - if (modifiedBounds.contains(x, y)) - { - double[] effectivePath = w.getEffectivePath(); - for (int i = 3; i < effectivePath.length; i += 2) - { - double a1 = effectivePath[i - 3], a2 = effectivePath[i - 2], b1 = effectivePath[i - 1], b2 = effectivePath[i], r1 = b2 - a2, - r2 = a1 - b1; - - double f = ((x - a1) * r2 + (a2 - y) * r1) / (-r2 * r2 - r1 * r1); - if (f >= 0 && f <= 1) - { - double e1 = a1 + f * (b1 - a1), e2 = a2 + f * (b2 - a2); - r1 = e1 - x; - r2 = e2 - y; - if (r1 * r1 + r2 * r2 <= WIDTH_SQUARED) - return Optional.of(new WireClickData(new Point(e1, e2), (i / 2) - 1)); - } - } - } - return Optional.empty(); - } - - private final static class WireClickData - { - WireClickData(Point pos, int segment) - { - this.pos = pos; - this.segment = segment; - } - - /** - * Position on the wire that is closest to the click - */ - public final Point pos; - /** - * Segment of the wire that the {@link Point} pos is on - */ - public final int segment; - } - - @Override - public HandleType getType() - { - return HandleType.WIRE; - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java deleted file mode 100644 index 2947535f..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.mograsim.logic.model.editor.handles; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.model.model.wires.ModelWire; - -public class WirePointHandle extends Handle -{ - private final static int END_OFFSET = 4; - private final HandleManager manager; - private boolean selected = false; - public final ModelWire parent; - - private int pointIndex; - - public WirePointHandle(HandleManager manager, ModelWire parent, int pointIndex) - { - super(3); - this.manager = manager; - this.parent = parent; - this.pointIndex = pointIndex; - setSize(END_OFFSET, END_OFFSET); - Point pathPoint = parent.getPathPoint(pointIndex); - moveTo(pathPoint.x, pathPoint.y); - } - - void updatePos() - { - Point p = parent.getPathPoint(pointIndex); - moveTo(p.x, p.y); - callRedrawListeners(); - } - - @Override - public void render(GeneralGC gc) - { - gc.setLineWidth(1.0); - gc.setForeground(Display.getDefault().getSystemColor(selected ? SWT.COLOR_YELLOW : SWT.COLOR_BLUE)); - gc.drawLine(getPosX(), getPosY(), getPosX() + END_OFFSET, getPosY() + END_OFFSET); - } - - @Override - public void reqMove(double x, double y) - { - parent.setPathPoint(new Point(x, y), pointIndex); - } - - @Override - public void onSelect() - { - selected = true; - callRedrawListeners(); - } - - @Override - public void onDeselect() - { - selected = false; - callRedrawListeners(); - } - - @Override - public void reqDelete() - { - manager.destroyWirePointHandle(parent, this); - } - - @Override - public HandleType getType() - { - return HandleType.WIRE_POINT; - } - - /** - * Sets the index of the {@link Point} within the parent {@link CoreWire}s path that is controlled by this handle - * - * @param index Index of the Point in the Wires path. - * @throws IndexOutOfBoundsException - */ - public void setIndex(int index) - { - this.pointIndex = index; - updatePos(); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java deleted file mode 100644 index ef109cdb..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.Selection; -import net.mograsim.logic.model.editor.handles.Handle; - -public class BoxSelectionState extends EditorState -{ - private Point origin; - private double mX, mY; - - private final ZoomedRenderer boxRenderer = gc -> - { - if (origin != null) - { - gc.setLineWidth(0.5); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); - gc.drawRectangle(origin.x, origin.y, mX - origin.x, mY - origin.y); - } - }; - - public BoxSelectionState(Editor editor, StateManager manager) - { - super(editor, manager); - } - - @Override - public void onEntry() - { - editor.gui.logicCanvas.addZoomedRenderer(boxRenderer); - editor.gui.logicCanvas.redrawThreadsafe(); - } - - @Override - public void onExit() - { - editor.gui.logicCanvas.removeZoomedRenderer(boxRenderer); - editor.gui.logicCanvas.redrawThreadsafe(); - } - - @Override - public void boxSelect() - { - manager.setState(new SelectionState(editor, manager)); - } - - @Override - public void clicked(Point clicked, int stateMask) - { - if (origin == null) - { - origin = new Point(clicked.x, clicked.y); - mX = clicked.x; - mY = clicked.y; - } else - { - Selection s = editor.getSelection(); - s.clear(); - boolean leftToRight = mX > origin.x, topToBottom = mY > origin.y; - double x = leftToRight ? origin.x : mX, y = topToBottom ? origin.y : mY, width = leftToRight ? mX - origin.x : origin.x - mX, - height = topToBottom ? mY - origin.y : origin.y - mY; - - Rectangle selected = new Rectangle(x, y, width, height); - for (Handle h : editor.handleManager.getHandles()) - { - Rectangle hBounds = h.getBounds(); - if (selected.contains(hBounds.x, hBounds.y) && selected.contains(hBounds.x + hBounds.width, hBounds.y + hBounds.height)) - { - s.add(h); - } - } - manager.setState(new SelectionState(editor, manager)); - } - } - - @Override - public void mouseMoved(double x, double y) - { - mX = x; - mY = y; - editor.gui.logicCanvas.redrawThreadsafe(); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java deleted file mode 100644 index 1c06c52e..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.PinHandle; -import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; - -public class CreateWireState extends EditorState -{ - private final PinHandle origin; - private double mX, mY; - private ZoomedRenderer drawLine; - - public CreateWireState(Editor session, StateManager manager, PinHandle origin) - { - super(session, manager); - this.origin = origin; - mX = origin.getCenterX(); - mY = origin.getCenterY(); - } - - @Override - public void mouseMoved(double x, double y) - { - this.mX = x; - this.mY = y; - editor.gui.logicCanvas.redraw(); - } - - @Override - public void onEntry() - { - editor.getSelection().clear(); - drawLine = gc -> - { - gc.setLineWidth(1); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)); - gc.drawLine((int) origin.getCenterX(), (int) origin.getCenterY(), (int) mX, (int) mY); - }; - editor.gui.logicCanvas.addZoomedRenderer(drawLine); - editor.gui.logicCanvas.redraw(); - } - - @Override - public void onExit() - { - editor.gui.logicCanvas.removeZoomedRenderer(drawLine); - editor.gui.logicCanvas.redraw(); - } - - @Override - public boolean clickedHandle(HandleClickInfo handleClickInfo) - { - switch (handleClickInfo.clicked.getType()) - { - case INTERFACE_PIN: - case STATIC_PIN: - try - { - editor.addWire(origin, (PinHandle) handleClickInfo.clicked); - } - catch (IllegalArgumentException e) - { - Shell tmp = new Shell(Display.getCurrent()); - editor.dialogManager.openWarningDialog("Warning!", e.getMessage()); - tmp.dispose(); - } - break; - default: - return false; - } - return true; - } - - @Override - public void clicked(Point clicked, int stateMask) - { - manager.setState(new SelectionState(editor, manager)); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java deleted file mode 100644 index 05e05d85..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.InterfacePinHandle; -import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; - -public abstract class EditorState -{ - protected final Editor editor; - protected final StateManager manager; - - public EditorState(Editor session, StateManager manager) - { - this.editor = session; - this.manager = manager; - } - - //@formatter:off - public void add() {} - public void delete() {} - public void copy() {} - public void paste() {} - public void duplicate() {} - public void grab() {} - public void mouseMoved(double x, double y) {} - public void select(Point pos, boolean additive) {} - public void boxSelect() {} - public void onEntry() {} - public void onExit() {} - public void clicked(InterfacePinHandle interfacePinHandle, int stateMask) {} - public void clickedEmpty(Point clicked, int stateMask) {} - public void clicked(Point clicked, int stateMask) {} - public boolean clickedHandle(HandleClickInfo handleClickInfo) { return false; } - //@formatter:on -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java deleted file mode 100644 index 1b8447e0..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import java.util.Map; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.Handle; - -public class GrabState extends EditorState -{ - private Map offsets; - - public GrabState(Editor editor, StateManager manager) - { - super(editor, manager); - } - - @Override - public void onEntry() - { - offsets = editor.getSelection().calculateOffsets(); - } - - @Override - public void grab() - { - manager.setState(new SelectionState(editor, manager)); - } - - @Override - public void mouseMoved(double x, double y) - { - editor.moveHandles(x, y, offsets); - } - - @Override - public void clicked(Point clicked, int stateMask) - { - manager.setState(new SelectionState(editor, manager)); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java deleted file mode 100644 index baa2eff9..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java +++ /dev/null @@ -1,186 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.Selection; -import net.mograsim.logic.model.editor.handles.Handle; -import net.mograsim.logic.model.editor.handles.PinHandle; -import net.mograsim.logic.model.editor.handles.WireHandle; -import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; -import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo; -import net.mograsim.logic.model.editor.ui.DialogManager; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; - -public class SelectionState extends EditorState -{ - private final ZoomedRenderer outlineRenderer = gc -> - { - if (editor.getSelection().size() > 1) - { - gc.setLineWidth(1); - gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); - gc.drawRectangle(editor.getSelection().getBounds()); - } - }; - - public SelectionState(Editor editor, StateManager manager) - { - super(editor, manager); - } - - @Override - public void add() - { - Point curserPos = editor.userInput.getWorldMousePosition(); - editor.addComponent(curserPos.x, curserPos.y); - } - - @Override - public void delete() - { - editor.deleteSelection(); - } - - @Override - public void copy() - { - editor.copy(); - } - - @Override - public void paste() - { - Point curserPos = editor.userInput.getWorldMousePosition(); - editor.paste(curserPos.x, curserPos.y); - } - - @Override - public void duplicate() - { - editor.duplicate(); - } - - @Override - public void grab() - { - if (!editor.getSelection().isEmpty()) - manager.setState(new GrabState(editor, manager)); - } - - @Override - public void boxSelect() - { - manager.setState(new BoxSelectionState(editor, manager)); - } - - @Override - public void onEntry() - { - editor.gui.logicCanvas.addZoomedRenderer(outlineRenderer); - editor.gui.logicCanvas.redrawThreadsafe(); - } - - @Override - public void onExit() - { - editor.gui.logicCanvas.removeZoomedRenderer(outlineRenderer); - editor.gui.logicCanvas.redrawThreadsafe(); - } - - @Override - public void clickedEmpty(Point clicked, int stateMask) - { - editor.getSelection().clear(); - if ((stateMask & SWT.ALT) == SWT.ALT) - { - String[] result = DialogManager.openMultiTextDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width", "Usage"); - if (result != null) - { - try - { - Pin p = editor.toBeEdited.addSubmodelInterface(new MovablePin(editor.getSubmodel(), editor.toBeEdited, result[0], - Integer.parseInt(result[1]), PinUsage.valueOf(result[2]), clicked.x, clicked.y)); - editor.handleManager.getInterfacePinHandle(p).reqMove(clicked.x, clicked.y); - } - catch (NumberFormatException e) - { - editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!"); - } - catch (IllegalArgumentException e) - { - editor.dialogManager.openWarningDialog("Failed to create Pin!", "Usage must be one of INPUT, OUTPUT, TRISTATE!"); - } - } - } - } - - @Override - public boolean clickedHandle(HandleClickInfo handleClickInfo) - { - switch (handleClickInfo.clicked.getType()) - { - case INTERFACE_PIN: - if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) - { - manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked)); - break; - } - case CORNER: - case COMPONENT: - case WIRE_POINT: - boolean additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT; - select(handleClickInfo.clicked, additive); - break; - case STATIC_PIN: - if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) - manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked)); - else - return false; - break; - case WIRE: - if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) - { - WireHandleClickInfo info = (WireHandleClickInfo) handleClickInfo; - WireHandle clicked = (WireHandle) info.clicked; - clicked.parent.insertPathPoint(info.posOnWire, info.segment); - } else - { - additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT; - select(handleClickInfo.clicked, additive); - } - break; - default: - return false; - } - return true; - } - - private void select(Handle h, boolean additive) - { - Selection sel = editor.getSelection(); - if (sel.contains(h)) - if (additive) - sel.remove(h); - else - { - if (editor.getSelection().size() > 1) - { - sel.clear(); - sel.add(h); - } else - sel.clear(); - } - else - { - if (!additive) - sel.clear(); - sel.add(h); - } - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java deleted file mode 100644 index d4b3fc4d..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.mograsim.logic.model.editor.states; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; - -public class StateManager -{ - private EditorState state; - - public StateManager(Editor session) - { - state = new SelectionState(session, this); - state.onEntry(); - } - - public EditorState getState() - { - return state; - } - - public void setState(EditorState state) - { - this.state.onExit(); - this.state = state; - state.onEntry(); - } - - public void add() - { - state.add(); - } - - public void delete() - { - state.delete(); - } - - public void copy() - { - state.copy(); - } - - public void paste() - { - state.paste(); - } - - public void duplicate() - { - state.duplicate(); - } - - public void grab() - { - state.grab(); - } - - public void mouseMoved(double x, double y) - { - state.mouseMoved(x, y); - } - - public void select(Point pos, boolean additive) - { - state.select(pos, additive); - } - - public boolean clickedHandle(HandleClickInfo handleClickInfo) - { - return state.clickedHandle(handleClickInfo); - } - - public void boxSelect() - { - state.boxSelect(); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java deleted file mode 100644 index df7455e6..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java +++ /dev/null @@ -1,199 +0,0 @@ -package net.mograsim.logic.model.editor.ui; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Dialog; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -public class DialogManager -{ - private Shell parent; - - public DialogManager(Shell parent) - { - this.parent = parent; - } - - public void openWarningDialog(String title, String message) - { - MessageBox b = new MessageBox(parent, SWT.ICON_WARNING | SWT.OK); - b.setText(title); - b.setMessage(message); - b.open(); - } - - private static abstract class FlexibleInputsDialog extends Dialog - { - private final String title, acceptLabel, cancelLabel; - - protected String[] result; - - public FlexibleInputsDialog(String title, String acceptLabel, String cancelLabel, String... inputs) - { - this(false, title, acceptLabel, cancelLabel, inputs); - } - - public FlexibleInputsDialog(boolean resizable, String title, String acceptLabel, String cancelLabel, String... inputs) - { - super(new Shell(SWT.CLOSE | (resizable ? SWT.RESIZE | SWT.MAX : 0) | SWT.TITLE | SWT.MIN | SWT.ON_TOP | SWT.APPLICATION_MODAL)); - this.title = title; - this.acceptLabel = acceptLabel; - this.cancelLabel = cancelLabel; - } - - protected abstract void setupWidgets(Composite parent); - - protected abstract void buildResult(); - - /** - * @return May be null (if {@link Dialog} was cancelled) - */ - public String[] open() - { - Shell shell = getParent(); - Display display = shell.getDisplay(); - shell.setMinimumSize(500, 150); - shell.setText(title); - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - shell.setLayout(layout); - - Composite inputContainer = new Composite(shell, SWT.BORDER); - GridData gd = new GridData(); - gd.horizontalSpan = 2; - gd.horizontalAlignment = SWT.FILL; - gd.grabExcessHorizontalSpace = true; - gd.verticalAlignment = SWT.FILL; - gd.grabExcessVerticalSpace = true; - inputContainer.setLayoutData(gd); - setupWidgets(inputContainer); - - Button b1 = new Button(shell, SWT.PUSH); - b1.addListener(SWT.Selection, e -> - { - buildResult(); - shell.dispose(); - }); - - b1.setText(acceptLabel); - Button b2 = new Button(shell, SWT.PUSH); - b2.addListener(SWT.Selection, e -> - { - shell.dispose(); - }); - b2.setText(cancelLabel); - - shell.pack(); - - shell.open(); - while (!shell.isDisposed()) - if (!display.readAndDispatch()) - display.sleep(); - return result; - } - } - - private static class MultiTextFieldsDialog extends FlexibleInputsDialog - { - private final String[] inputs; - private Text[] textFields; - - public MultiTextFieldsDialog(String title, String acceptLabel, String cancelLabel, String... inputs) - { - super(title, acceptLabel, cancelLabel); - this.inputs = inputs; - } - - @Override - protected void setupWidgets(Composite parent) - { - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - parent.setLayout(layout); - this.textFields = new Text[inputs.length]; - for (int i = 0; i < inputs.length; i++) - { - Label textFieldName = new Label(parent, SWT.NONE); - textFieldName.setText(inputs[i].concat(":")); - GridData g = new GridData(); - g.grabExcessHorizontalSpace = true; - g.horizontalAlignment = SWT.FILL; - Text newTextField = new Text(parent, SWT.BORDER); - newTextField.setLayoutData(g); - textFields[i] = newTextField; - } - } - - @Override - protected void buildResult() - { - result = new String[textFields.length]; - for (int i = 0; i < textFields.length; i++) - result[i] = textFields[i].getText(); - } - - } - - /** - * @return The Strings entered, in order of the input labels the dialog was opened with, if the dialog was accepted, null if the dialog - * was cancelled. - */ - public static String[] openMultiTextDialog(String title, String acceptLabel, String cancelLabel, String... inputs) - { - return new MultiTextFieldsDialog(title, acceptLabel, cancelLabel, inputs).open(); - } - - public static class MultiLineTextFieldDialog extends FlexibleInputsDialog - { - private final String input; - private Text textField; - - public MultiLineTextFieldDialog(String title, String acceptLabel, String cancelLabel, String input) - { - super(true, title, acceptLabel, cancelLabel); - this.input = input; - } - - @Override - protected void setupWidgets(Composite parent) - { - GridLayout layout = new GridLayout(); - layout.numColumns = 2; - parent.setLayout(layout); - GridData gd = new GridData(); - Label l = new Label(parent, SWT.NONE); - l.setText(input); - gd.verticalAlignment = SWT.TOP; - l.setLayoutData(gd); - gd = new GridData(); - textField = new Text(parent, SWT.V_SCROLL); - textField.setLayoutData(gd); - gd.grabExcessHorizontalSpace = true; - gd.grabExcessVerticalSpace = true; - gd.horizontalAlignment = SWT.FILL; - gd.verticalAlignment = SWT.FILL; - } - - @Override - protected void buildResult() - { - result = new String[] { textField.getText() }; - } - } - - /** - * @return The String entered if the dialog was accepted, null if the dialog was cancelled. - */ - public static String openMultiLineTextDialog(String title, String acceptLabel, String cancelLabel, String input) - { - String[] result = new MultiLineTextFieldDialog(title, acceptLabel, cancelLabel, input).open(); - return result == null ? null : result[0]; - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java deleted file mode 100644 index aedaa481..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.mograsim.logic.model.editor.ui; - -import java.util.Collection; - -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.widgets.Composite; - -import net.haspamelodica.swt.helper.gcs.TranslatedGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.LogicUICanvas; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.handles.Handle; -import net.mograsim.preferences.Preferences; - -//TODO: Remove Inheritance -public class EditorCanvas extends LogicUICanvas -{ - private Collection handles; - - public EditorCanvas(Composite parent, int style, Editor editor) - { - super(parent, style, editor.toBeEdited.submodel); - - handles = editor.handleManager.getHandles(); - editor.handleManager.addHandleAddedListener(h -> - { - redrawThreadsafe(); - h.addRedrawListener(this::redrawThreadsafe); - }); - // TODO: Is this even necessary? The Handle should be finalized by the gc - editor.handleManager.addHandleRemovedListener(h -> - { - redrawThreadsafe(); - h.removeRedrawListener(this::redrawThreadsafe); - }); - - addZoomedRenderer(gc -> - { - Rectangle visibleRegion = new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom); - Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background"); - if (background != null) - setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the - // canvas - - TranslatedGC tgc = new TranslatedGC(gc, 0.0d, 0.0d, 1 / editor.toBeEdited.getSubmodelScale(), false); - editor.toBeEdited.getOutlineRenderer().render(tgc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); - - handles.forEach(h -> h.render(gc, visibleRegion)); - }); - } -} diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java deleted file mode 100644 index 17e12ebb..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java +++ /dev/null @@ -1,232 +0,0 @@ -package net.mograsim.logic.model.editor.ui; - -import java.io.IOException; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.List; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.ToolBar; -import org.eclipse.swt.widgets.ToolItem; - -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; -import net.mograsim.logic.model.editor.Editor; -import net.mograsim.logic.model.editor.SaveLoadManager; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class EditorGUI -{ - public final Display display; - public final Shell shell; - public final EditorCanvas logicCanvas; - private final List addList; - private final Editor editor; - - public EditorGUI(Editor editor) - { - this.editor = editor; - display = Display.getDefault(); - shell = new Shell(display); - - GridLayout layout = new GridLayout(); - layout.numColumns = 1; - shell.setLayout(layout); - - setupTopToolBar(shell); - Composite innerComp = new Composite(shell, SWT.NONE); - GridData innerCompData = new GridData(); - innerCompData.grabExcessHorizontalSpace = true; - innerCompData.grabExcessVerticalSpace = true; - innerCompData.horizontalAlignment = SWT.FILL; - innerCompData.verticalAlignment = SWT.FILL; - innerComp.setLayoutData(innerCompData); - - GridLayout innerLayout = new GridLayout(); - innerComp.setLayout(innerLayout); - innerLayout.numColumns = 2; - - GridData d = new GridData(); - d.grabExcessHorizontalSpace = true; - d.horizontalAlignment = SWT.FILL; - d.grabExcessVerticalSpace = true; - d.verticalAlignment = SWT.FILL; - - logicCanvas = new EditorCanvas(innerComp, SWT.TRAIL, editor); - logicCanvas.setLayoutData(d); - - d = new GridData(); - d.grabExcessVerticalSpace = true; - d.verticalAlignment = SWT.FILL; - d.verticalSpan = 2; - addList = new List(innerComp, SWT.V_SCROLL); - addList.setLayoutData(d); - refreshAddList(); - - setupBottomToolBar(innerComp); - - ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas); - userInput.buttonDrag = 3; - userInput.buttonZoom = 2; - userInput.enableUserInput(); - new ZoomableCanvasOverlay(logicCanvas, null).enableScale(); - } - - private ToolBar setupTopToolBar(Composite parent) - { - GridData d = new GridData(); - d.grabExcessHorizontalSpace = true; - d.horizontalAlignment = SWT.FILL; - - ToolBar toolBar = new ToolBar(parent, SWT.BORDER); - toolBar.setLayoutData(d); - - ToolItem file = new ToolItem(toolBar, SWT.DROP_DOWN); - - // TODO - DropDownEntry newEntry = new DropDownEntry("New", e -> Editor.openNewEditor()); - DropDownEntry loadEntry = new DropDownEntry("Load", e -> - { - try - { - SaveLoadManager.openLoadDialog(); - } - catch (IOException e1) - { - editor.dialogManager.openWarningDialog("Failed to load Component!", e1.getMessage()); - } - }); - DropDownEntry saveEntry = new DropDownEntry("Save", e -> editor.save()); - DropDownEntry saveAsEntry = new DropDownEntry("Save as...", e -> editor.saveAs()); - - DropDownEntry[] entries = new DropDownEntry[] { newEntry, loadEntry, saveEntry, saveAsEntry }; - - setupDrowpDownMenu(file, entries); - - file.setText("File"); - return toolBar; - } - - private ToolBar setupBottomToolBar(Composite parent) - { - GridData d = new GridData(); - d.grabExcessHorizontalSpace = true; - d.horizontalAlignment = SWT.FILL; - - ToolBar toolBar = new ToolBar(parent, SWT.BORDER); - toolBar.setLayoutData(d); - - ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE); - snappingLabel.setText("Snapping:"); - - ToolItem snappSelect = new ToolItem(toolBar, SWT.DROP_DOWN); - DropDownEntry[] entries = new DropDownEntry[Editor.Snapping.values().length]; - int index = 0; - for (Editor.Snapping sn : Editor.Snapping.values()) - { - entries[index++] = new DropDownEntry(sn.toString(), e -> - { - editor.setSnapping(sn); - snappSelect.setText(sn.toString()); - }); - } - snappSelect.setText(editor.getSnapping().toString()); - setupDrowpDownMenu(snappSelect, entries); - - new ToolItem(toolBar, SWT.SEPARATOR); - - toolBar.pack(); - - return toolBar; - } - - private void setupDrowpDownMenu(ToolItem parent, DropDownEntry[] entries) - { - Menu menu = new Menu(shell, SWT.POP_UP); - for (DropDownEntry entry : entries) - { - MenuItem item = new MenuItem(menu, SWT.PUSH); - item.addSelectionListener(new SelectionListener() - { - @Override - public void widgetSelected(SelectionEvent e) - { - entry.listener.widgetSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) - { - widgetSelected(e); - } - }); - item.setText(entry.title); - } - - parent.addListener(SWT.Selection, new Listener() - { - public void handleEvent(Event event) - { - if (event.detail == SWT.ARROW) - { - Rectangle rect = parent.getBounds(); - Point pt = new Point(rect.x, rect.y + rect.height); - pt = parent.getParent().toDisplay(pt); - menu.setLocation(pt.x, pt.y); - menu.setVisible(true); - } - } - }); - } - - private static class DropDownEntry - { - public final String title; - public final EntrySelectedListener listener; - - public DropDownEntry(String title, EntrySelectedListener listener) - { - super(); - this.title = title; - this.listener = listener; - } - } - - private static interface EntrySelectedListener - { - public void widgetSelected(SelectionEvent e); - } - - public void refreshAddList() - { - addList.setItems(IndirectModelComponentCreator.getStandardComponentIDs().keySet().stream().sorted().toArray(String[]::new)); - addList.select(0); - } - - public String getAddListSelected() - { - String[] selection = addList.getSelection(); - if (selection.length == 0) - throw new IllegalStateException("Selection in the Add Component List may never be empty!"); - return selection[0]; - } - - public void open() - { - shell.open(); - while (!shell.isDisposed()) - if (!display.readAndDispatch()) - display.sleep(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java b/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java deleted file mode 100644 index 253dfdd3..00000000 --- a/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.mograsim.logic.model.editor.util; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.Set; - -/** - * Similar to a SortedSet, except it is allowed for multiple elements to have the same priority (c.compare(e1, e2) == 0 is - * allowed to be true for two different elements e1 and e2). However, to elements are not allowed to be equal according to - * Object.equals(Object o). - * - * @author Fabian Stemmler - * - * @param the type of elements in this list - */ -public class PrioritySet implements Set -{ - private ArrayList list; - private Comparator c; - - public PrioritySet(Comparator c) - { - setComparator(c); - list = new ArrayList<>(); - } - - @SuppressWarnings("unchecked") - public PrioritySet() - { - this((e1, e2) -> ((Comparable) e1).compareTo(e2)); - } - - public void setComparator(Comparator c) - { - this.c = c; - } - - //@formatter:off - @Override - public int size() { return list.size(); } - @Override - public boolean isEmpty() { return list.isEmpty(); } - @Override - public boolean contains(Object o) { return list.isEmpty(); } - @Override - public Iterator iterator() { return list.iterator(); } - @Override - public Object[] toArray() { return list.toArray(); } - @Override - public E[] toArray(E[] a) { return list.toArray(a); } - @Override - public boolean remove(Object o) { return list.remove(o); } - @Override - public boolean containsAll(Collection c) { return list.containsAll(c); } - @Override - public boolean removeAll(Collection c) { return list.removeAll(c); } - @Override - public boolean retainAll(Collection c) { return list.retainAll(c); } - @Override - public void clear() { list.clear(); } - //@formatter:on - - @Override - public boolean add(T e) - { - if (isEmpty()) - { - list.add(e); - return true; - } - int index = Collections.binarySearch(list, e, c); - if (index < 0) - index = -index - 1; - if (index < size()) - { - if (list.get(index).equals(e)) - return false; - list.add(index, e); - } else - list.add(e); - return true; - } - - @Override - public boolean addAll(Collection c) - { - return c.stream().map(e -> add(e)).reduce(false, (a, b) -> a || b); - } - - @Override - public String toString() - { - return list.toString(); - } -} diff --git a/net.mograsim.logic.model/.classpath b/net.mograsim.logic.model/.classpath deleted file mode 100644 index 4a00becd..00000000 --- a/net.mograsim.logic.model/.classpath +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.logic.model/.gitignore b/net.mograsim.logic.model/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.logic.model/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.logic.model/.project b/net.mograsim.logic.model/.project deleted file mode 100644 index c6d10606..00000000 --- a/net.mograsim.logic.model/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - net.mograsim.logic.model - - - net.mograsim.logic.core - SWTZoomableCanvas - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs b/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.logic.model/META-INF/MANIFEST.MF b/net.mograsim.logic.model/META-INF/MANIFEST.MF deleted file mode 100644 index e6b077ab..00000000 --- a/net.mograsim.logic.model/META-INF/MANIFEST.MF +++ /dev/null @@ -1,31 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %Bundle-Name -Bundle-SymbolicName: net.mograsim.logic.model;singleton:=true -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.logic.model, - net.mograsim.logic.model.examples, - net.mograsim.logic.model.model, - net.mograsim.logic.model.model.components, - net.mograsim.logic.model.model.components.atomic, - net.mograsim.logic.model.model.components.submodels, - net.mograsim.logic.model.model.wires, - net.mograsim.logic.model.modeladapter, - net.mograsim.logic.model.modeladapter.componentadapters, - net.mograsim.logic.model.serializing, - net.mograsim.logic.model.snippets, - net.mograsim.logic.model.snippets.highlevelstatehandlers, - net.mograsim.logic.model.snippets.highlevelstatehandlers.standard, - net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic, - net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent, - net.mograsim.logic.model.snippets.outlinerenderers, - net.mograsim.logic.model.snippets.symbolrenderers, - net.mograsim.logic.model.util -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.eclipse.swt;bundle-version="3.0.0";visibility:=reexport, - SWTZoomableCanvas;bundle-version="1.0.0";visibility:=reexport, - net.mograsim.logic.core;bundle-version="0.1.0";visibility:=reexport, - com.google.gson;bundle-version="2.8.2";visibility:=reexport, - net.mograsim.preferences;bundle-version="0.1.0" -Automatic-Module-Name: net.mograsim.logic.model -Bundle-Vendor: Mograsim Team diff --git a/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties b/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties deleted file mode 100644 index fad36e3e..00000000 --- a/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties +++ /dev/null @@ -1,3 +0,0 @@ -#Properties file for net.mograsim.logic.model -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim logic model and user interface \ No newline at end of file diff --git a/net.mograsim.logic.model/build.properties b/net.mograsim.logic.model/build.properties deleted file mode 100644 index d6642e65..00000000 --- a/net.mograsim.logic.model/build.properties +++ /dev/null @@ -1,4 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - .,\ - OSGI-INF/ diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java deleted file mode 100644 index a9fde7a1..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java +++ /dev/null @@ -1,111 +0,0 @@ -package net.mograsim.logic.model; - -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicLong; - -import net.mograsim.logic.core.timeline.Timeline; - -//TODO maybe move to logic core? -public class LogicExecuter -{ - // TODO replace with CoreModel when it exists - private final Timeline timeline; - - private final AtomicBoolean shouldBeRunningLive; - private final AtomicBoolean isRunningLive; - private final AtomicLong nextExecSimulTime; - private final Thread simulationThread; - - public LogicExecuter(Timeline timeline) - { - this.timeline = timeline; - - timeline.setTimeFunction(System::currentTimeMillis); - shouldBeRunningLive = new AtomicBoolean(); - isRunningLive = new AtomicBoolean(); - nextExecSimulTime = new AtomicLong(); - simulationThread = new Thread(() -> - { - isRunningLive.set(true); - synchronized (isRunningLive) - { - isRunningLive.notify(); - } - try - { - while (shouldBeRunningLive.get()) - { - // always execute to keep timeline from "hanging behind" for too long - long current = System.currentTimeMillis(); - timeline.executeUntil(timeline.laterThan(current), current + 10); - long sleepTime; - if (timeline.hasNext()) - sleepTime = timeline.nextEventTime() - current; - else - sleepTime = 10000; - try - { - nextExecSimulTime.set(current + sleepTime); - if (sleepTime > 0) - Thread.sleep(sleepTime); - } - catch (@SuppressWarnings("unused") InterruptedException e) - {// do nothing; it is normal execution flow to be interrupted - } - } - } - finally - { - isRunningLive.set(false); - synchronized (isRunningLive) - { - isRunningLive.notify(); - } - } - }); - timeline.addEventAddedListener(event -> - { - if (isRunningLive.get()) - if (Timeline.timeCmp(event.getTiming(), nextExecSimulTime.get()) < 0) - simulationThread.interrupt(); - }); - } - - public void executeNextStep() - { - timeline.executeNext(); - } - - public synchronized void startLiveExecution() - { - if (shouldBeRunningLive.get()) - return; - shouldBeRunningLive.set(true); - simulationThread.start(); - waitForIsRunning(true); - } - - public synchronized void stopLiveExecution() - { - if (!shouldBeRunningLive.get()) - return; - shouldBeRunningLive.set(false); - simulationThread.interrupt(); - waitForIsRunning(false); - } - - private void waitForIsRunning(boolean expectedState) - { - while (isRunningLive.get() ^ expectedState) - try - { - synchronized (isRunningLive) - { - isRunningLive.wait(); - } - } - catch (@SuppressWarnings("unused") InterruptedException e) - {// no need to do anything - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java deleted file mode 100644 index 15346c63..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java +++ /dev/null @@ -1,239 +0,0 @@ -package net.mograsim.logic.model; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.preferences.Preferences; - -/** - * Simulation visualizer canvas. - * - * @author Daniel Kirschten - */ -public class LogicUICanvas extends ZoomableCanvas -{ - private static final boolean OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL = false; - - private final LogicModel model; - - public LogicUICanvas(Composite parent, int style, LogicModel model) - { - super(parent, style, Preferences.current().getBoolean("net.mograsim.logic.model.improvetext")); - - this.model = model; - - LogicUIRenderer renderer = new LogicUIRenderer(model); - addZoomedRenderer(gc -> - { - Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background"); - if (background != null) - setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the canvas - renderer.render(gc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); - }); - model.setRedrawHandler(this::redrawThreadsafe); - - addListener(SWT.MouseDown, this::mouseDown); - - if (OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL) - openDebugSetHighLevelStateShell(model); - } - - private void mouseDown(Event e) - { - if (e.button == 1) - { - Point click = canvasToWorldCoords(e.x, e.y); - for (ModelComponent component : model.getComponentsByName().values()) - if (component.getBounds().contains(click) && component.clicked(click.x, click.y)) - { - redraw(); - break; - } - } - } - - private void openDebugSetHighLevelStateShell(LogicModel model) - { - Shell debugShell = new Shell(); - debugShell.setLayout(new GridLayout(2, false)); - new Label(debugShell, SWT.NONE).setText("Target component: "); - Combo componentSelector = new Combo(debugShell, SWT.DROP_DOWN | SWT.READ_ONLY); - componentSelector.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - List componentsByItemIndex = new ArrayList<>(); - List models = new ArrayList<>(); - AtomicBoolean recalculateQueued = new AtomicBoolean(); - AtomicReference> compAdded = new AtomicReference<>(); - AtomicReference> compRemoved = new AtomicReference<>(); - compAdded.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, - recalculateQueued, true)); - compRemoved.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, - recalculateQueued, false)); - iterateModelTree(compAdded.get(), compRemoved.get(), model, models, true); - debugShell.addListener(SWT.Dispose, e -> models.forEach(m -> - { - m.removeComponentAddedListener(compAdded.get()); - m.removeComponentRemovedListener(compRemoved.get()); - })); - queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); - new Label(debugShell, SWT.NONE).setText("Target state ID: "); - Text stateIDText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); - stateIDText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - new Label(debugShell, SWT.NONE).setText("Value type: "); - Composite radioGroup = new Composite(debugShell, SWT.NONE); - radioGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - GridLayout radioGroupLayout = new GridLayout(2, false); - radioGroupLayout.marginHeight = 0; - radioGroupLayout.marginWidth = 0; - radioGroup.setLayout(radioGroupLayout); - Button radioBit = new Button(radioGroup, SWT.RADIO); - radioBit.setText("Single bit"); - Button radioBitVector = new Button(radioGroup, SWT.RADIO); - radioBitVector.setText("Bitvector"); - new Label(debugShell, SWT.NONE).setText("Value string representation: \n(Bit vectors: MSBit...LSBit)"); - Text valueText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); - valueText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - Button send = new Button(debugShell, SWT.PUSH); - send.setText("Send!"); - Button get = new Button(debugShell, SWT.PUSH); - get.setText("Get!"); - Text output = new Text(debugShell, SWT.READ_ONLY); - output.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); - Listener sendAction = e -> - { - try - { - int componentIndex = componentSelector.getSelectionIndex(); - if (componentIndex < 0 || componentIndex >= componentsByItemIndex.size()) - throw new RuntimeException("No component selected"); - ModelComponent target = componentsByItemIndex.get(componentIndex); - String valueString = valueText.getText(); - Object value; - if (radioBit.getSelection()) - value = Bit.parse(valueString); - else if (radioBitVector.getSelection()) - value = BitVector.parse(valueString); - else - throw new RuntimeException("No value type selected"); - target.setHighLevelState(stateIDText.getText(), value); - output.setText("Success!"); - } - catch (Exception x) - { - output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); - } - }; - Listener getAction = e -> - { - try - { - if (componentSelector.getSelectionIndex() >= componentsByItemIndex.size()) - throw new RuntimeException("No valid component selected"); - output.setText("Success! Value: \r\n" - + componentsByItemIndex.get(componentSelector.getSelectionIndex()).getHighLevelState(stateIDText.getText())); - } - catch (Exception x) - { - output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); - } - }; - send.addListener(SWT.Selection, sendAction); - valueText.addListener(SWT.DefaultSelection, sendAction); - get.addListener(SWT.Selection, getAction); - stateIDText.addListener(SWT.DefaultSelection, getAction); - debugShell.open(); - } - - private void compsChanged(Consumer compAdded, Consumer compRemoved, ModelComponent c, - List models, List componentsByItemIndex, Combo componentSelector, LogicModel model, - AtomicBoolean recalculateQueued, boolean add) - { - iterateSubmodelTree(compAdded, compRemoved, c, models, add); - queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); - } - - private void iterateSubmodelTree(Consumer compAdded, Consumer compRemoved, - ModelComponent c, List models, boolean add) - { - if (c instanceof SubmodelComponent) - iterateModelTree(compAdded, compRemoved, ((SubmodelComponent) c).submodel, models, add); - } - - private void iterateModelTree(Consumer compAdded, Consumer compRemoved, - LogicModel model, List models, boolean add) - { - if (add ^ models.contains(model)) - { - if (add) - { - models.add(model); - model.addComponentAddedListener(compAdded); - model.addComponentRemovedListener(compRemoved); - } else - { - models.remove(model); - model.removeComponentAddedListener(compAdded); - model.removeComponentRemovedListener(compRemoved); - } - for (ModelComponent c : model.getComponentsByName().values()) - iterateSubmodelTree(compAdded, compRemoved, c, models, add); - } - } - - private void queueRecalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, - Combo componentSelector, LogicModel model) - { - if (recalculateQueued.compareAndSet(false, true)) - getDisplay().asyncExec(() -> recalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model)); - } - - private void recalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, - Combo componentSelector, LogicModel model) - { - recalculateQueued.set(false); - componentsByItemIndex.clear(); - componentSelector.setItems(); - addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model); - } - - private void addComponentSelectorItems(List componentsByItemIndex, String base, Combo componentSelector, - LogicModel model) - { - model.getComponentsByName().values().stream().sorted((c1, c2) -> c1.getName().compareTo(c2.getName())).forEach(c -> - { - if (!(c instanceof ModelWireCrossPoint || c instanceof SubmodelInterface)) - { - String item = base + c.getName(); - componentsByItemIndex.add(c); - componentSelector.add(item); - if (c instanceof SubmodelComponent) - addComponentSelectorItems(componentsByItemIndex, item + " -> ", componentSelector, ((SubmodelComponent) c).submodel); - } - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java deleted file mode 100644 index 1df2f7b7..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.mograsim.logic.model; - -import org.eclipse.swt.SWT; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.preferences.Preferences; - -public class LogicUIRenderer -{ - private static final boolean DRAW_PINS = false; - - private final LogicModel model; - - public LogicUIRenderer(LogicModel model) - { - this.model = model; - } - - public void render(GeneralGC gc, Rectangle visibleRegion) - { - gc.setAntialias(SWT.ON); - gc.setClipping(visibleRegion); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - model.getWiresByName().values().forEach(w -> - { - Rectangle bounds = w.getBounds(); - double lw = gc.getLineWidth(); - if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw)) - w.render(gc); - }); - model.getComponentsByName().values().forEach(c -> renderComponent(gc, c, visibleRegion)); - } - - private static void renderComponent(GeneralGC gc, ModelComponent component, Rectangle visibleRegion) - { - Rectangle bounds = component.getBounds(); - double lw = gc.getLineWidth(); - if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw)) - { - component.render(gc, visibleRegion); - if (DRAW_PINS) - { - gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_DARK_CYAN)); - for (Pin p : component.getPins().values()) - { - Point pos = p.getPos(); - gc.fillOval(pos.x - 1, pos.y - 1, 2, 2); - } - } - } - } - -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java deleted file mode 100644 index 49182d66..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.logic.model; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; -import net.mograsim.logic.model.model.LogicModel; - -/** - * Standalone simulation visualizer graphical user interface. - * - * @author Daniel Kirschten - */ -public class LogicUIStandaloneGUI implements Runnable -{ - private final Display display; - private final Shell shell; - private final LogicUICanvas ui; - - public LogicUIStandaloneGUI(LogicModel model) - { - display = new Display(); - shell = new Shell(display); - shell.setLayout(new FillLayout()); - ui = new LogicUICanvas(shell, SWT.NONE, model); - - ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui); - userInput.buttonDrag = 3; - userInput.buttonZoom = 2; - userInput.enableUserInput(); - new ZoomableCanvasOverlay(ui, null).enableScale(); - } - - public LogicUICanvas getLogicUICanvas() - { - return ui; - } - - /** - * Opens the UI shell. Returns when the shell is closed. - */ - @Override - public void run() - { - shell.open(); - while (!shell.isDisposed()) - if (!display.readAndDispatch()) - display.sleep(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java deleted file mode 100644 index 03d0335c..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.mograsim.logic.model; - -import java.util.function.Consumer; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; - -public class SimpleLogicUIStandalone -{ - public static void executeVisualisation(Consumer setupLogicModel) - { - executeVisualisation(setupLogicModel, (Consumer) null); - } - - public static void executeVisualisation(Consumer setupLogicModel, Consumer beforeRun) - { - CoreModelParameters params = new CoreModelParameters(); - params.gateProcessTime = 50; - params.wireTravelTime = 10; - executeVisualisation(setupLogicModel, params, beforeRun); - } - - public static void executeVisualisation(Consumer setupLogicModel, CoreModelParameters params) - { - executeVisualisation(setupLogicModel, params, null); - } - - public static void executeVisualisation(Consumer setupLogicModel, CoreModelParameters params, - Consumer beforeRun) - { - // setup logic model - LogicModelModifiable logicModel = new LogicModelModifiable(); - setupLogicModel.accept(logicModel); - - // convert to core model - Timeline timeline = LogicCoreAdapter.convert(logicModel, params); - - // initialize UI and executer - LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(logicModel); - LogicExecuter exec = new LogicExecuter(timeline); - - if (beforeRun != null) - beforeRun.accept(new VisualisationObjects(logicModel, timeline, ui, exec)); - - // run it - exec.startLiveExecution(); - ui.run(); - exec.stopLiveExecution(); - } - - public static class VisualisationObjects - { - public final LogicModelModifiable model; - public final Timeline timeline; - public final LogicUIStandaloneGUI gui; - public final LogicExecuter executer; - - public VisualisationObjects(LogicModelModifiable model, Timeline timeline, LogicUIStandaloneGUI gui, LogicExecuter executer) - { - this.model = model; - this.timeline = timeline; - this.gui = gui; - this.executer = executer; - } - } - - private SimpleLogicUIStandalone() - { - throw new UnsupportedOperationException("No SimpleLogicUIStandalone instances"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java deleted file mode 100644 index 14073bd1..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.mograsim.logic.model.examples; - -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.submodels.SimpleRectangularSubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; - -public class ClickableSubmodelComponentsTest -{ - public static void main(String[] args) - { - SimpleLogicUIStandalone.executeVisualisation(ClickableSubmodelComponentsTest::createExample); - } - - public static void createExample(LogicModelModifiable model) - { - @SuppressWarnings("unused") // Wire - SimpleRectangularSubmodelComponent comp = new SimpleRectangularSubmodelComponent(model, 1, "") - { - { - setSubmodelScale(.4); - setOutputPins("O0"); - - ModelManualSwitch sw = new ModelManualSwitch(submodelModifiable, 1); - ModelBitDisplay bd = new ModelBitDisplay(submodelModifiable, 1); - - sw.moveTo(10, 5); - bd.moveTo(50, 5); - - new ModelWire(submodelModifiable, sw.getOutputPin(), bd.getInputPin()); - - } - }; - comp.moveTo(10, 10); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java deleted file mode 100644 index 5f68c9cc..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.mograsim.logic.model.examples; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.atomic.ModelNotGate; -import net.mograsim.logic.model.model.components.atomic.ModelOrGate; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; - -public class RSLatchExample -{ - public static void main(String[] args) - { - SimpleLogicUIStandalone.executeVisualisation(RSLatchExample::createRSLatchExample); - } - - @SuppressWarnings("unused") // for Wires being created - public static void createRSLatchExample(LogicModelModifiable model) - { - ModelManualSwitch rIn = new ModelManualSwitch(model, 1); - rIn.moveTo(100, 100); - ModelManualSwitch sIn = new ModelManualSwitch(model, 1); - sIn.moveTo(100, 200); - - ModelOrGate or1 = new ModelOrGate(model, 1); - or1.moveTo(160, 102.5); - new ModelWire(model, rIn.getOutputPin(), or1.getPin("A")); - - ModelOrGate or2 = new ModelOrGate(model, 1); - or2.moveTo(160, 192.5); - new ModelWire(model, sIn.getOutputPin(), or2.getPin("B")); - - ModelNotGate not1 = new ModelNotGate(model, 1); - not1.moveTo(200, 107.5); - new ModelWire(model, or1.getPin("Y"), not1.getPin("A")); - - ModelNotGate not2 = new ModelNotGate(model, 1); - not2.moveTo(200, 197.5); - new ModelWire(model, or2.getPin("Y"), not2.getPin("A")); - - ModelWireCrossPoint p1 = new ModelWireCrossPoint(model, 1); - p1.moveCenterTo(250, 112.5); - new ModelWire(model, not1.getPin("Y"), p1); - new ModelWire(model, p1, or2.getPin("A"), new Point(250, 130), new Point(140, 185), new Point(140, 197.5)); - - ModelWireCrossPoint p2 = new ModelWireCrossPoint(model, 1); - p2.moveCenterTo(250, 202.5); - new ModelWire(model, not2.getPin("Y"), p2); - new ModelWire(model, p2, or1.getPin("B"), new Point(250, 185), new Point(140, 130), new Point(140, 117.5)); - - ModelWireCrossPoint o1 = new ModelWireCrossPoint(model, 1); - o1.moveCenterTo(270, 112.5); - new ModelWire(model, p1, o1); - - ModelWireCrossPoint o2 = new ModelWireCrossPoint(model, 1); - o2.moveCenterTo(270, 202.5); - new ModelWire(model, p2, o2); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java deleted file mode 100644 index 17d0a44e..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java +++ /dev/null @@ -1,196 +0,0 @@ -package net.mograsim.logic.model.model; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Consumer; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; - -public class LogicModel -{ - private final Map components; - private final Map componentDestroyFunctions; - private final Map componentsUnmodifiable; - private final Map wires; - private final Map wireDestroyFunctions; - private final Map wiresUnmodifiable; - - private final List> componentAddedListeners; - private final List> componentRemovedListeners; - private final List> wireAddedListeners; - private final List> wireRemovedListeners; - private final List> redrawHandlerChangedListeners; - - private Runnable redrawHandler; - - protected LogicModel() - { - components = new HashMap<>(); - componentDestroyFunctions = new HashMap<>(); - componentsUnmodifiable = Collections.unmodifiableMap(components); - wires = new HashMap<>(); - wireDestroyFunctions = new HashMap<>(); - wiresUnmodifiable = Collections.unmodifiableMap(wires); - - componentAddedListeners = new ArrayList<>(); - componentRemovedListeners = new ArrayList<>(); - wireAddedListeners = new ArrayList<>(); - wireRemovedListeners = new ArrayList<>(); - redrawHandlerChangedListeners = new ArrayList<>(); - } - - /** - * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application - * code as it is automatically called in {@link ModelComponent}'s constructor. - * - * @author Daniel Kirschten - */ - protected void componentCreated(ModelComponent component, Runnable destroyed) - { - if (components.containsKey(component.getName())) - throw new IllegalStateException("Don't add the same component twice!"); - components.put(component.getName(), component); - componentDestroyFunctions.put(component.getName(), destroyed); - callComponentAddedListeners(component); - requestRedraw(); - } - - /** - * Destroyes the given component, removes it from the list of components and calls all componentRemovedListeners. - * - * @author Daniel Kirschten - */ - protected void destroyComponent(ModelComponent component) - { - componentDestroyFunctions.get(component.getName()).run(); - if (!components.containsKey(component.getName())) - throw new IllegalStateException("Don't remove the same component twice!"); - components.remove(component.getName()); - callComponentRemovedListeners(component); - requestRedraw(); - } - - /** - * Adds the given wire to the list of wires and calls all wireAddedListeners. Don't call this method from application code as it is - * automatically called in {@link ModelWire}'s constructor. - * - * @author Daniel Kirschten - */ - protected void wireCreated(ModelWire wire, Runnable destroyed) - { - if (wires.containsKey(wire.name)) - throw new IllegalStateException("Don't add the same wire twice!"); - wires.put(wire.name, wire); - wireDestroyFunctions.put(wire.name, destroyed); - callWireAddedListeners(wire); - requestRedraw(); - } - - /** - * Destroys the given wire, removes it from the list of wires and calls all wireRemovedListeners. - * - * @author Daniel Kirschten - */ - protected void destroyWire(ModelWire wire) - { - wireDestroyFunctions.get(wire.name).run(); - if (!wires.containsKey(wire.name)) - throw new IllegalStateException("Don't remove the same wire twice!"); - wires.remove(wire.name); - callWireRemovedListeners(wire); - requestRedraw(); - } - - public Map getComponentsByName() - { - return componentsUnmodifiable; - } - - public Map getWiresByName() - { - return wiresUnmodifiable; - } - - public ModelComponent getComponentByName(String name) - { - return components.get(name); - } - - @SuppressWarnings("unchecked") - public T getComponentByName(String name, Class expectedComponentClass) - { - ModelComponent comp = components.get(name); - Objects.requireNonNull(comp, "Invaild path, component " + name + " not found"); - if (expectedComponentClass.isInstance(comp)) - return (T) comp; - throw new IllegalArgumentException("The component " + name + " is not an instance of " + expectedComponentClass); - } - - public ModelWire getWireByName(String name) - { - return wires.get(name); - } - - public T getComponentBySubmodelPath(String path, Class modelClass) - { - int firstDot = path.indexOf('.'); - if (firstDot == -1) - return getComponentByName(path, modelClass); - String first = path.substring(0, firstDot); - String rest = path.substring(firstDot + 1); - return getComponentByName(first, SubmodelComponent.class).submodel.getComponentBySubmodelPath(rest, modelClass); - } - - public ModelWire getWireBySubmodelPath(String path) - { - int firstDot = path.indexOf('.'); - if (firstDot == -1) - return getWireByName(path); - String first = path.substring(0, firstDot); - String rest = path.substring(firstDot + 1); - return getComponentByName(first, SubmodelComponent.class).submodel.getWireBySubmodelPath(rest); - } - - // @formatter:off - public void addComponentAddedListener (Consumer listener) {componentAddedListeners .add (listener);} - public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners .add (listener);} - public void addWireAddedListener (Consumer listener) {wireAddedListeners .add (listener);} - public void addWireRemovedListener (Consumer listener) {wireRemovedListeners .add (listener);} - public void addRedrawHandlerChangedListener (Consumer listener) {redrawHandlerChangedListeners.add (listener);} - - public void removeComponentAddedListener (Consumer listener) {componentAddedListeners .remove(listener);} - public void removeComponentRemovedListener (Consumer listener) {componentRemovedListeners .remove(listener);} - public void removeWireAddedListener (Consumer listener) {wireAddedListeners .remove(listener);} - public void removeWireRemovedListener (Consumer listener) {wireRemovedListeners .remove(listener);} - public void removeRedrawHandlerChangedListener(Consumer listener) {redrawHandlerChangedListeners.remove(listener);} - - private void callComponentAddedListeners (ModelComponent c) {componentAddedListeners .forEach(l -> l.accept(c));} - private void callComponentRemovedListeners (ModelComponent c) {componentRemovedListeners .forEach(l -> l.accept(c));} - private void callWireAddedListeners (ModelWire w) {wireAddedListeners .forEach(l -> l.accept(w));} - private void callWireRemovedListeners (ModelWire w) {wireRemovedListeners .forEach(l -> l.accept(w));} - private void callRedrawHandlerChangedListener(Runnable r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));} - // @formatter:on - - public void setRedrawHandler(Runnable handler) - { - this.redrawHandler = handler; - callRedrawHandlerChangedListener(handler); - } - - public Runnable getRedrawHandler() - { - return redrawHandler; - } - - public void requestRedraw() - { - if (redrawHandler != null) - redrawHandler.run(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java deleted file mode 100644 index e903257f..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.mograsim.logic.model.model; - -import java.util.Set; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.IdentifyParams; - -public class LogicModelModifiable extends LogicModel -{ - public String getDefaultComponentName(ModelComponent component) - { - Set componentNames = getComponentsByName().keySet(); - String componentID = component.getIDForSerializing(new IdentifyParams()); - String nameBase = componentID + '#'; - for (int i = 0;; i++) - { - String nameCandidate = nameBase + i; - if (!componentNames.contains(nameCandidate)) - return nameCandidate; - } - } - - public String getDefaultWireName() - { - Set wireNames = getWiresByName().keySet(); - for (int i = 0;; i++) - { - String nameCandidate = "unnamedWire#" + i; - if (!wireNames.contains(nameCandidate)) - return nameCandidate; - } - } - - @Override - public void componentCreated(ModelComponent component, Runnable destroyed) - { - super.componentCreated(component, destroyed); - } - - @Override - public void destroyComponent(ModelComponent component) - { - super.destroyComponent(component); - } - - @Override - public void wireCreated(ModelWire wire, Runnable destroyed) - { - super.wireCreated(wire, destroyed); - } - - @Override - public void destroyWire(ModelWire wire) - { - super.destroyWire(wire); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java deleted file mode 100644 index d543c543..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java +++ /dev/null @@ -1,362 +0,0 @@ -package net.mograsim.logic.model.model.components; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Consumer; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.JSONSerializable; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; - -/** - * The base class for all model components.
- * A ModelComponent has a reference to the LogicModel it belongs to.
- * A ModelComponent has a name. This name is unique in the model the ModelComponent belongs to.
- * A ModelComponent has a position and size. The size can only be modified by subclasses. - * - * @author Daniel Kirschten - */ -public abstract class ModelComponent implements JSONSerializable -{ - /** - * The model this component is a part of. - */ - protected final LogicModelModifiable model; - /** - * The name of this component. Is unique for all components in its model.
- * Does never change, but can't be final since it is set in {@link #init()}. - */ - private String name; - private final Rectangle bounds; - /** - * The list of all pins of this component by name. - */ - private final Map pinsByName; - /** - * An unmodifiable view of {@link #pinsByName}. - */ - protected final Map pinsUnmodifiable; - - private final List> componentMovedListeners; - private final List> componentResizedListeners; - private final List> pinAddedListeners; - private final List> pinRemovedListeners; - - private HighLevelStateHandler highLevelStateHandler; - - // creation and destruction - - public ModelComponent(LogicModelModifiable model, String name) - { - this(model, name, true); - } - - /** - * Creates a new {@link ModelComponent} and, if callInit, initializes the component (See {@link #init()}).
- * If callInit==false, make sure to call {@link #init()}! - * - * @author Daniel Kirschten - */ - protected ModelComponent(LogicModelModifiable model, String name, boolean callInit) - { - this.model = model; - this.name = name; - this.bounds = new Rectangle(0, 0, 0, 0); - this.pinsByName = new HashMap<>(); - this.pinsUnmodifiable = Collections.unmodifiableMap(pinsByName); - - this.componentMovedListeners = new ArrayList<>(); - this.componentResizedListeners = new ArrayList<>(); - this.pinAddedListeners = new ArrayList<>(); - this.pinRemovedListeners = new ArrayList<>(); - - if (callInit) - init(); - } - - /** - * Initializes this component. This method should be called exactly once in this component's constructor.
- *
    - *
  • If {@link #name}==null, sets {@link #name} to {@link LogicModelModifiable#getDefaultComponentName(ModelComponent)}. - *
  • Registers this component in the model. - *
- */ - protected void init() - { - if (name == null) - name = model.getDefaultComponentName(this); - model.componentCreated(this, this::destroyed); - } - - // basic getters - - public String getName() - { - return name; - } - - /** - * Destroys this component. This method is called from {@link LogicModelModifiable#componentDestroyed(ModelComponent) - * destroyComponent()} of the model this component is a part of.
- * When overriding, make sure to also call the original implementation. - * - * @author Daniel Kirschten - */ - protected void destroyed() - { - pinsByName.values().forEach(this::removePinWithoutRedraw); - } - - // pins - - /** - * Adds the given pin to this component and calls pinAddedListeners and redrawListeners. - * - * @throws IllegalArgumentException if the pin doesn't belong to this component - * @throws IllegalArgumentException if there already is a pin with the given name - * - * @author Daniel Kirschten - */ - protected void addPin(Pin pin) - { - if (pin.component != this) - throw new IllegalArgumentException("Can't add a pin not belonging to this component!"); - if (pinsByName.containsKey(pin.name)) - throw new IllegalArgumentException("Duplicate pin name: " + pin.name); - pinsByName.put(pin.name, pin); - callPinAddedListeners(pin); - model.requestRedraw(); - } - - /** - * Removes the given pin from this component and calls pinAddedListeners and redrawListeners. - * - * @throws NullPointerException if there was no pin with this name - * - * @author Daniel Kirschten - */ - protected void removePin(String name) - { - removePinWithoutRedraw(pinsByName.remove(name)); - model.requestRedraw(); - } - - private void removePinWithoutRedraw(Pin pin) - { - pin.destroyed(); - callPinRemovedListeners(pin); - } - - /** - * Returns a collection of pins of this component. - * - * @author Daniel Kirschten - */ - public Map getPins() - { - return pinsUnmodifiable; - } - - /** - * Returns the pin with the given name of this component. - * - * @throws IllegalArgumentException if there is no pin with the given name - * @see #getPinOrNull(String) - * - * @author Daniel Kirschten - */ - public Pin getPin(String name) - { - Pin pin = getPinOrNull(name); - if (pin == null) - throw new IllegalArgumentException("No pin with the name " + name); - return pin; - } - - /** - * Returns the pin with the given name of this component, or null if there is no such pin. - * - * @see #getPin(String) - * - * @author Daniel Kirschten - */ - public Pin getPinOrNull(String name) - { - return pinsByName.get(name); - } - - // high-level access - - /** - * @author Daniel Kirschten - */ - protected void setHighLevelStateHandler(HighLevelStateHandler highLevelStateHandler) - { - this.highLevelStateHandler = highLevelStateHandler; - } - - public HighLevelStateHandler getHighLevelStateHandler() - { - return highLevelStateHandler; - } - - /** - * Gets the current value of the given high-level state.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #setHighLevelState(String, Object) - * @see HighLevelStateHandler#getHighLevelState(String) - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(String stateID) - { - return highLevelStateHandler.getHighLevelState(stateID); - } - - /** - * Sets the given high-level state to the given value.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #getHighLevelState(String) - * @see HighLevelStateHandler#setHighLevelState(String, Object) - * - * @author Daniel Kirschten - */ - public void setHighLevelState(String stateID, Object newState) - { - highLevelStateHandler.setHighLevelState(stateID, newState); - } - - // "graphical" operations - - /** - * Sets the position of this component and calls componentMovedListeners and redrawListeners. - * - * @author Daniel Kirschten - */ - public void moveTo(double x, double y) - { - bounds.x = x; - bounds.y = y; - callComponentMovedListeners(); - model.requestRedraw(); - } - - /** - * Sets the size of this component and calls redrawListeners. - * - * @author Daniel Kirschten - */ - protected void setSize(double width, double height) - { - bounds.width = width; - bounds.height = height; - callComponentResizedListener(); - model.requestRedraw(); - } - - /** - * Returns the bounds of this component. Is a bit slower than {@link #getPosX()}, {@link #getPosY()}, {@link #getWidth}, - * {@link #getHeight}, because new objects are created. - * - * @author Daniel Kirschten - */ - public final Rectangle getBounds() - { - return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); - } - - /** - * Returns the x coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getPosX() - { - return bounds.x; - } - - /** - * Returns the y coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getPosY() - { - return bounds.y; - } - - /** - * Returns the (graphical) width of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getWidth() - { - return bounds.width; - } - - /** - * Returns the height of this component. Is a bit faster than {@link #getBounds()} because no objects are created. - * - * @author Daniel Kirschten - */ - public double getHeight() - { - return bounds.height; - } - - /** - * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this - * click. - * - * @author Daniel Kirschten - */ - @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden - public boolean clicked(double x, double y) - { - return false; - } - - /** - * Render this component to the given gc, in absoulute coordinates. - * - * @author Daniel Kirschten - */ - public abstract void render(GeneralGC gc, Rectangle visibleRegion); - - // serializing - - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - // listeners - - // @formatter:off - public void addComponentMovedListener (Consumer listener) {componentMovedListeners .add (listener);} - public void addComponentResizedListener (Consumer listener) {componentResizedListeners.add (listener);} - public void addPinAddedListener (Consumer listener) {pinAddedListeners .add (listener);} - public void addPinRemovedListener (Consumer listener) {pinRemovedListeners .add (listener);} - - public void removeComponentMovedListener (Consumer listener) {componentMovedListeners .remove(listener);} - public void removeComponentResizedListener (Consumer listener) {componentResizedListeners.remove(listener);} - public void removePinAddedListener (Consumer listener) {pinAddedListeners .remove(listener);} - public void removePinRemovedListener (Consumer listener) {pinRemovedListeners .remove(listener);} - - private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));} - private void callComponentResizedListener( ) {componentResizedListeners.forEach(l -> l.accept(this));} - private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));} - private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));} - // @formatter:on -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java deleted file mode 100644 index 9fba366f..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.mograsim.logic.model.model.components; - -/** - * For components that can have different orientations. The meaning is not clearly defined, however it is common that the orientation - * denotes the direction the output is facing or the general flow of signals. _ALT represents an alternative, which is normally - * a mirrored version. A component can choose to not support some variants. - *

- * In terms of calculation, {@link #RIGHT} is considered the default. - *

- * Note that this needs to be interpreted using the GUI coordinate system, meaning that UP and DOWN are swapped. - * - * @author Christian Femers - */ -public enum Orientation -{ - /** - * The orientation RIGHT is the default orientation, all others are defined relative to it. - */ - RIGHT(1, 0, 0, 1), LEFT(-1, 0, 0, -1), UP(0, 1, -1, 0), DOWN(0, -1, 1, 0), RIGHT_ALT(1, 0, 0, -1), LEFT_ALT(-1, 0, 0, 1), - UP_ALT(0, -1, -1, 0), DOWN_ALT(0, 1, 1, 0); - - // simple 2D transformation matrix - final double trans11; - final double trans12; - final double trans21; - final double trans22; - - private Orientation(double trans11, double trans12, double trans21, double trans22) - { - this.trans11 = trans11; - this.trans12 = trans12; - this.trans21 = trans21; - this.trans22 = trans22; - } - - /** - * Performs a simple rotation around the origin. This does not work for the display coordinate system. - * - * @return the point's new X coordinate - */ - public double getNewX(double rightX, double rightY) - { - return rightX * trans11 + rightY * trans12; - } - - /** - * Performs a simple rotation around the origin. This does not work for the display coordinate system. - * - * @return the point's new Y coordinate - */ - public double getNewY(double rightX, double rightY) - { - return rightX * trans21 + rightY * trans22; - } - - public boolean doesMirror() - { - return ordinal() > 3; - } - - public boolean swapsWidthAndHeight() - { - return trans11 == 0; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java deleted file mode 100644 index 06621baf..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java +++ /dev/null @@ -1,76 +0,0 @@ -package net.mograsim.logic.model.model.components; - -/** - * This class simplifies the calculation of coordinates, especially for model components. - *

- * Supply it with the original width and height and an orientation, and use the methods {@link #newX(double, double)} and - * {@link #newY(double, double)} to retrieve the new coordinates, relative to the upper left corner of {@link Orientation#RIGHT}. The - * {@link #height()} and {@link #width()} methods return the width and height in the new orientation. - *

- * This is meant to be used in the context of a a classic display coordinate system, as done in the {@link ModelComponent}s. - * - * @see Orientation - * @author Christian Femers - */ -public class OrientationCalculator -{ - final Orientation o; - final double oldWHalf; - final double oldHHalf; - final double w; - final double h; - final double wHalf; - final double hHalf; - - public OrientationCalculator(Orientation o, double width, double height) - { - this.o = o; - this.oldWHalf = width / 2; - this.oldHHalf = height / 2; - - if (o.swapsWidthAndHeight()) - { - w = height; - h = width; - wHalf = oldHHalf; - hHalf = oldWHalf; - } else - { - w = width; - h = height; - wHalf = oldWHalf; - hHalf = oldHHalf; - } - } - - /** - * Returns the new height (that equals the old width if {@link Orientation#swapsWidthAndHeight()} is true) - */ - public double height() - { - return h; - } - - /** - * Returns the new width (that equals the old height if {@link Orientation#swapsWidthAndHeight()} is true) - */ - public double width() - { - return w; - } - - public double newX(double x, double y) - { - return (x - oldWHalf) * o.trans11 + (y - oldHHalf) * o.trans12 + wHalf; - } - - public double newY(double x, double y) - { - return (x - oldWHalf) * o.trans21 + (y - oldHHalf) * o.trans22 + hHalf; - } - - public final Orientation getOrientation() - { - return o; - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java deleted file mode 100644 index 3e836937..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import net.mograsim.logic.core.components.gates.CoreAndGate; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelAndGate extends SimpleRectangularModelGate -{ - public ModelAndGate(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelAndGate(LogicModelModifiable model, int logicWidth, String name) - { - super(model, "AndGate", "&", false, logicWidth, name, false); - setInputCount(2);// TODO make variable - init(); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelAndGate.class, CoreAndGate::new)); - IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), - (m, p, n) -> new ModelAndGate(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java deleted file mode 100644 index 1a01e141..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java +++ /dev/null @@ -1,113 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.BitDisplayAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.Preferences; - -public class ModelBitDisplay extends ModelComponent -{ - private static final double width = 20; - private static final double height = 15; - private static final double fontHeight = 5; - - public final int logicWidth; - private final Pin inputPin; - - private final LogicObserver logicObs; - private CoreBitDisplay bitDisplay; - - public ModelBitDisplay(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelBitDisplay(LogicModelModifiable model, int logicWidth, String name) - { - super(model, name, false); - this.logicWidth = logicWidth; - logicObs = (i) -> model.requestRedraw(); - - setSize(width, height); - addPin(this.inputPin = new Pin(model, this, "", logicWidth, PinUsage.INPUT, 0, height / 2)); - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - gc.drawRectangle(getBounds()); - String label = bitDisplay == null ? BitVectorFormatter.formatAsString(null) - : BitVectorFormatter.formatAsString(bitDisplay.getDisplayedValue()); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); - gc.setFont(oldFont); - } - - public void setCoreModelBinding(CoreBitDisplay bitDisplay) - { - if (this.bitDisplay != null) - this.bitDisplay.deregisterObserver(logicObs); - this.bitDisplay = bitDisplay; - if (bitDisplay != null) - bitDisplay.registerObserver(logicObs); - } - - public boolean hasCoreModelBinding() - { - return bitDisplay != null; - } - - public CoreBitDisplay getBitDisplay() - { - return bitDisplay; - } - - public Pin getInputPin() - { - return inputPin; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "BitDisplay"; - } - - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new BitDisplayAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelBitDisplay.class.getCanonicalName(), - (m, p, n) -> new ModelBitDisplay(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java deleted file mode 100644 index 38963536..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java +++ /dev/null @@ -1,168 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import com.google.gson.JsonSyntaxException; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.components.CoreClock; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.OrientationCalculator; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.ClockAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; - -public class ModelClock extends ModelComponent -{ - private static final double width = 20; - private static final double height = 20; - private static final double fontHeight = 5; - - private final Pin outputPin; - - private final LogicObserver logicObs; - private ModelClockParams params; - private OrientationCalculator oc; - private CoreClock clock; - - public ModelClock(LogicModelModifiable model, ModelClockParams params) - { - this(model, params, null); - } - - public ModelClock(LogicModelModifiable model, ModelClockParams params, String name) - { - super(model, name, false); - this.params = params; - logicObs = (i) -> model.requestRedraw(); - - oc = new OrientationCalculator(params.orientation, width, height); - setSize(oc.width(), oc.height()); - - this.outputPin = new Pin(model, this, "", 1, PinUsage.OUTPUT, oc.newX(width, height / 2), oc.newY(width, height / 2)); - addPin(outputPin); - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - gc.drawRectangle(getBounds()); - String label = clock == null ? "null" : (clock.isOn() ? "|" : "\u2015"); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (oc.width() - textExtent.x) / 2, getPosY() + (oc.height() - textExtent.y) / 2, true); - gc.setFont(oldFont); - } - - public void setCoreModelBinding(CoreClock clock) - { - if (this.clock != null) - this.clock.deregisterObserver(logicObs); - this.clock = clock; - if (clock != null) - clock.registerObserver(logicObs); - } - - public boolean hasCoreModelBinding() - { - return clock != null; - } - - @Override - public Object getHighLevelState(String stateID) - { - switch (stateID) - { - case "out": - if (clock != null) - return clock.getOut().getInputValues(); - return null; - default: - return super.getHighLevelState(stateID); - } - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - switch (stateID) - { - case "out": - throw new UnsupportedOperationException("cannot set state of clock"); - default: - super.setHighLevelState(stateID, newState); - } - } - - public CoreClock getClock() - { - return clock; - } - - public Pin getOutputPin() - { - return outputPin; - } - - public int getDelta() - { - return params.delta; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Clock"; - } - - @Override - public ModelClockParams getParamsForSerializing(IdentifyParams idParams) - { - return params; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new ClockAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelClock.class.getName(), (m, p, n) -> - { - ModelClockParams params = JsonHandler.fromJsonTree(p, ModelClockParams.class); - if (params == null) - throw new JsonSyntaxException("Invalid!!!"); - return new ModelClock(m, params, n); - }); - } - - public static class ModelClockParams - { - int delta; - Orientation orientation; - - public ModelClockParams(int delta, Orientation orientation) - { - this.delta = delta; - this.orientation = orientation; - } - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java deleted file mode 100644 index 1d3bb1ee..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java +++ /dev/null @@ -1,79 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import java.util.Objects; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.FixedOutputAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; - -public class ModelFixedOutput extends ModelComponent -{ - private static final double width = 20; - private static final double height = 20; - private static final double fontHeight = 5; - - public final BitVector bits; - - public ModelFixedOutput(LogicModelModifiable model, BitVector bits, String name) - { - super(model, name, false); - this.bits = bits; - setSize(width, height); - addPin(new Pin(model, this, "out", bits.length(), PinUsage.OUTPUT, width, height / 2)); - - init(); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "FixedOutput"; - } - - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return bits; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - gc.drawRectangle(getBounds()); - String label = BitVectorFormatter.formatAsString(bits); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); - gc.setFont(oldFont); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new FixedOutputAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelFixedOutput.class.getCanonicalName(), - (m, p, n) -> new ModelFixedOutput(m, Objects.requireNonNull(JsonHandler.fromJsonTree(p, BitVector.class)), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java deleted file mode 100644 index 7a995041..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java +++ /dev/null @@ -1,185 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.ManualSwitchAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.Preferences; - -public class ModelManualSwitch extends ModelComponent -{ - private static final double width = 20; - private static final double height = 15; - private static final double fontHeight = 5; - private static final double heightMiniButtons = 4; // 0 is disabled - - public final int logicWidth; - private final Pin outputPin; - - private final LogicObserver logicObs; - private CoreManualSwitch manualSwitch; - - public ModelManualSwitch(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelManualSwitch(LogicModelModifiable model, int logicWidth, String name) - { - super(model, name, false); - this.logicWidth = logicWidth; - logicObs = (i) -> model.requestRedraw(); - - setSize(width, height); - addPin(this.outputPin = new Pin(model, this, "", logicWidth, PinUsage.OUTPUT, width, height / 2)); - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - gc.drawRectangle(getBounds()); - String label = BitVectorFormatter.formatAsString(manualSwitch == null ? null : manualSwitch.getValues()); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); - gc.setFont(oldFont); - - if (manualSwitch != null && logicWidth > 1 && heightMiniButtons > 0 && visibleRegion.y < getPosY() + heightMiniButtons) - { - double x = getPosX(); - double y = getPosY(); - gc.drawLine(x, y + heightMiniButtons, x + width, y + heightMiniButtons); - Color c = gc.getBackground(); - gc.setBackground(gc.getForeground()); - BitVector bv = manualSwitch.getValues(); - double part = width / bv.length(); - for (int i = 0; i < bv.length(); i++) - { - double start = x + part * i; - if (i != 0) - gc.drawLine(start, y, start, y + heightMiniButtons); - if (bv.getMSBit(i) == Bit.ONE) - { -// gc.fillRectangle(start, y, part, heightMiniButtons); // alternative, but not always visible what Bit is where - gc.drawLine(start, y, start + part, y + heightMiniButtons); - gc.drawLine(start + part, y, start, y + heightMiniButtons); - } - } - gc.setBackground(c); - } - } - - public void setCoreModelBinding(CoreManualSwitch logicSwitch) - { - if (this.manualSwitch != null) - this.manualSwitch.deregisterObserver(logicObs); - this.manualSwitch = logicSwitch; - if (logicSwitch != null) - logicSwitch.registerObserver(logicObs); - } - - public boolean hasCoreModelBinding() - { - return manualSwitch != null; - } - - @Override - public Object getHighLevelState(String stateID) - { - switch (stateID) - { - case "out": - if (manualSwitch != null) - return manualSwitch.getValues(); - return null; - default: - return super.getHighLevelState(stateID); - } - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - switch (stateID) - { - case "out": - if (manualSwitch != null) - manualSwitch.setState((BitVector) newState); - break; - default: - super.setHighLevelState(stateID, newState); - break; - } - } - - @Override - public boolean clicked(double x, double y) - { - if (manualSwitch != null) - { - if (heightMiniButtons > 0 && y - getPosY() < heightMiniButtons) - { - int part = (int) ((x - getPosX()) * logicWidth / width); - manualSwitch.setState(manualSwitch.getValues().withBitChanged(part, Bit::not)); - } else - { - manualSwitch.toggle(); - } - } - return true; - } - - public CoreManualSwitch getManualSwitch() - { - return manualSwitch; - } - - public Pin getOutputPin() - { - return outputPin; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "ManualSwitch"; - } - - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new ManualSwitchAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelManualSwitch.class.getName(), - (m, p, n) -> new ModelManualSwitch(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java deleted file mode 100644 index 6efc9ad3..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.SWT; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.atomic.ModelSplitter.SplitterParams; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.MergerAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -//TODO delete this legacy class -public class ModelMerger extends ModelComponent -{ - private static final double width = 10; - private static final double heightPerPin = 10; - - public final int logicWidth; - private final Pin outputPin; - - private final ReadEnd[] inputEnds; - private ReadEnd outputEnd; - - public ModelMerger(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelMerger(LogicModelModifiable model, int logicWidth, String name) - { - super(model, name, false); - this.logicWidth = logicWidth; - setSize(width, (logicWidth - 1) * heightPerPin); - double inputHeight = (logicWidth - 1) * heightPerPin; - for (int i = 0; i < logicWidth; i++, inputHeight -= 10) - addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, 0, inputHeight)); - addPin(this.outputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, width, (logicWidth - 1) * heightPerPin / 2)); - inputEnds = new ReadEnd[logicWidth]; - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - double posX = getPosX(); - double posY = getPosY(); - - ColorDefinition c = BitVectorFormatter.formatAsColor(outputEnd); - if (c != null) - gc.setForeground(ColorManager.current().toColor(c)); - gc.setLineWidth( - Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); - double outLineY = posY + (logicWidth - 1) * heightPerPin / 2; - gc.drawLine(posX + width / 2, outLineY, posX + width, outLineY); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit")); - double inputHeight = posY; - for (int i = 0; i < logicWidth; i++, inputHeight += 10) - { - c = BitVectorFormatter.formatAsColor(inputEnds[i]); - if (c != null) - gc.setForeground(ColorManager.current().toColor(c)); - gc.drawLine(posX, inputHeight, posX + width / 2, inputHeight); - } - gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground")); - int oldLineCap = gc.getLineCap(); - int lineJoin = gc.getLineJoin(); - // TODO find better "replacement" for JOIN_BEVEL - // TODO it looks weird that the vertical line is thinner than the single multibit wire. - gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE); - gc.drawLine(posX + width / 2, posY, posX + width / 2, posY + heightPerPin * (logicWidth - 1)); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - gc.setLineCap(oldLineCap); - } - - @Override - public Pin getPin(String name) - { - Pin pin = getPinOrNull(name); - return pin == null ? getPin(name.replace('O', 'i').replace('I', 'O').replace('i', 'I')) : pin; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Splitter"; - } - - @Override - public SplitterParams getParamsForSerializing(IdentifyParams idParams) - { - SplitterParams splitterParams = new SplitterParams(); - splitterParams.logicWidth = logicWidth; - splitterParams.orientation = Orientation.LEFT; - return splitterParams; - } - - public void setCoreModelBinding(ReadEnd[] inputEnds, ReadEnd outputEnd) - { - System.arraycopy(inputEnds, 0, this.inputEnds, 0, logicWidth); - this.outputEnd = outputEnd; - } - - public Pin getOutputPin() - { - return outputPin; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new MergerAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelMerger.class.getCanonicalName(), - (m, p, n) -> new ModelMerger(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java deleted file mode 100644 index b4e91d87..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import net.mograsim.logic.core.components.gates.CoreNandGate; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelNandGate extends SimpleRectangularModelGate -{ - public ModelNandGate(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelNandGate(LogicModelModifiable model, int logicWidth, String name) - { - super(model, "NandGate", "&", true, logicWidth, name, false); - setInputCount(2);// TODO make variable - init(); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNandGate.class, CoreNandGate::new)); - IndirectModelComponentCreator.setComponentSupplier(ModelNandGate.class.getCanonicalName(), - (m, p, n) -> new ModelNandGate(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java deleted file mode 100644 index 8f3849f9..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import net.mograsim.logic.core.components.gates.CoreNotGate; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelNotGate extends SimpleRectangularModelGate -{ - public ModelNotGate(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelNotGate(LogicModelModifiable model, int logicWidth, String name) - { - super(model, "NotGate", "1", true, logicWidth, name, false); - setInputCount(1); - init(); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNotGate.class, (t, p, o, i) -> new CoreNotGate(t, p, i[0], o))); - IndirectModelComponentCreator.setComponentSupplier(ModelNotGate.class.getCanonicalName(), - (m, p, n) -> new ModelNotGate(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java deleted file mode 100644 index c09569ed..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import net.mograsim.logic.core.components.gates.CoreOrGate; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class ModelOrGate extends SimpleRectangularModelGate -{ - public ModelOrGate(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelOrGate(LogicModelModifiable model, int logicWidth, String name) - { - super(model, "OrGate", "\u22651", false, logicWidth, name, false);// ">=1" - setInputCount(2); - init(); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelOrGate.class, CoreOrGate::new)); - IndirectModelComponentCreator.setComponentSupplier(ModelOrGate.class.getCanonicalName(), - (m, p, n) -> new ModelOrGate(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java deleted file mode 100644 index 962f2acc..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java +++ /dev/null @@ -1,165 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.SWT; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.OrientationCalculator; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SplitterAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -public class ModelSplitter extends ModelComponent -{ - private static final double width = 10; - private static final double heightPerPin = 10; - - private final double heightWithoutOC; - public final int logicWidth; - private final OrientationCalculator oc; - private final Pin inputPin; - - private ReadEnd inputEnd; - private final ReadEnd[] outputEnds; - - public ModelSplitter(LogicModelModifiable model, SplitterParams params) - { - this(model, params, null); - } - - public ModelSplitter(LogicModelModifiable model, SplitterParams params, String name) - { - super(model, name, false); - this.logicWidth = params.logicWidth; - this.oc = new OrientationCalculator(toggleLeftDownAlt(params.orientation), width, - this.heightWithoutOC = (logicWidth - 1) * heightPerPin); - setSize(oc.width(), oc.height()); - double inLineY = (logicWidth - 1) * heightPerPin / 2; - addPin(this.inputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, oc.newX(0, inLineY), oc.newY(0, inLineY))); - double outputHeight = (logicWidth - 1) * heightPerPin; - for (int i = 0; i < logicWidth; i++, outputHeight -= 10) - addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, oc.newX(width, outputHeight), oc.newY(width, outputHeight))); - outputEnds = new ReadEnd[logicWidth]; - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - double posX = getPosX(); - double posY = getPosY(); - - ColorDefinition c = BitVectorFormatter.formatAsColor(inputEnd); - if (c != null) - gc.setForeground(ColorManager.current().toColor(c)); - gc.setLineWidth( - Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); - double inLineY = heightWithoutOC / 2; - gc.drawLine(posX + oc.newX(0, inLineY), posY + oc.newY(0, inLineY), posX + oc.newX(width / 2, inLineY), - posY + oc.newY(width / 2, inLineY)); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit")); - double outputHeight = 0; - for (int i = 0; i < logicWidth; i++, outputHeight += 10) - { - c = BitVectorFormatter.formatAsColor(outputEnds[i]); - if (c != null) - gc.setForeground(ColorManager.current().toColor(c)); - gc.drawLine(posX + oc.newX(width / 2, outputHeight), posY + oc.newY(width / 2, outputHeight), - posX + oc.newX(width, outputHeight), posY + oc.newY(width, outputHeight)); - } - gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground")); - int oldLineCap = gc.getLineCap(); - int lineJoin = gc.getLineJoin(); - // TODO find better "replacement" for JOIN_BEVEL - // TODO it looks weird that the vertical line is thinner than the single multibit wire. - gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE); - gc.drawLine(posX + oc.newX(width / 2, 0), posY + oc.newY(width / 2, 0), posX + oc.newX(width / 2, heightWithoutOC), - posY + oc.newY(width / 2, heightWithoutOC)); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - gc.setLineCap(oldLineCap); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "Splitter"; - } - - @Override - public SplitterParams getParamsForSerializing(IdentifyParams idParams) - { - SplitterParams splitterParams = new SplitterParams(); - splitterParams.logicWidth = logicWidth; - splitterParams.orientation = toggleLeftDownAlt(oc.getOrientation()); - return splitterParams; - } - - public void setCoreModelBinding(ReadEnd inputEnd, ReadEnd[] outputEnds) - { - this.inputEnd = inputEnd; - System.arraycopy(outputEnds, 0, this.outputEnds, 0, logicWidth); - } - - public Pin getInputPin() - { - return inputPin; - } - - /** - * Used to leave bit order intuitive (MSB left or on top) - */ - private static Orientation toggleLeftDownAlt(Orientation orientation) - { - // TODO if we upgrade to Java 12, replace with switch-expression - switch (orientation) - { - case LEFT: - return Orientation.LEFT_ALT; - case LEFT_ALT: - return Orientation.LEFT; - case DOWN: - return Orientation.DOWN_ALT; - case DOWN_ALT: - return Orientation.DOWN; - default: - return orientation; - } - } - - public static class SplitterParams - { - public int logicWidth; - public Orientation orientation; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SplitterAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelSplitter.class.getCanonicalName(), (m, p, n) -> - { - // TODO remove legacy params parsing - SplitterParams params; - if (p.isJsonPrimitive()) - { - params = new SplitterParams(); - params.logicWidth = p.getAsInt(); - params.orientation = Orientation.RIGHT; - } else - params = JsonHandler.fromJsonTree(p, SplitterParams.class); - return new ModelSplitter(m, params, n); - }); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java deleted file mode 100644 index ac0f64d7..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.NoLogicAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.Preferences; - -//TODO clean size calculation mess -public class ModelTextComponent extends ModelComponent -{ - private final String text; - private boolean calculatedSize; - - public ModelTextComponent(LogicModelModifiable model, String text) - { - this(model, text, null); - } - - public ModelTextComponent(LogicModelModifiable model, String text, String name) - { - super(model, name, false); - this.text = text; - // If size is unset, it defaults to 0, which could prohibit this component from being rendered, which would prohibit the size being - // set to a better guess - setSize(1, 1); - - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - if (!calculatedSize) - { - calculatedSize = true; - Point textExtent = gc.textExtent(text); - setSize(textExtent.x, textExtent.y); - } - - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(text, getPosX(), getPosY(), true); - } - - // serializing - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "TextComponent"; - } - - @Override - public String getParamsForSerializing(IdentifyParams idParams) - { - return text; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new NoLogicAdapter<>(ModelTextComponent.class)); - IndirectModelComponentCreator.setComponentSupplier(ModelTextComponent.class.getName(), - (m, p, n) -> new ModelTextComponent(m, p.getAsString(), n)); - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java deleted file mode 100644 index 93bff320..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import org.eclipse.swt.graphics.Color; - -import com.google.gson.JsonSyntaxException; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.Orientation; -import net.mograsim.logic.model.model.components.OrientationCalculator; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.TriStateBufferAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; - -public class ModelTriStateBuffer extends ModelComponent -{ - - private static final double width = 20; - private static final double height = 20; - private Pin input; - private Pin output; - private Pin enable; - private double[] path; - - private ModelTriStateBufferParams params; - private OrientationCalculator oc; - - public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params) - { - this(model, params, null); - } - - public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params, String name) - { - super(model, name, false); - this.params = params; - - oc = new OrientationCalculator(params.orientation, width, height); - - double wHalf = width / 2; - double hHalf = height / 2; - double hQuar = height / 4; - - this.input = new Pin(model, this, "IN", params.logicWidth, PinUsage.INPUT, oc.newX(0, hHalf), oc.newY(0, hHalf)); - this.output = new Pin(model, this, "OUT", params.logicWidth, PinUsage.OUTPUT, oc.newX(width, hHalf), oc.newY(width, hHalf)); - this.enable = new Pin(model, this, "EN", 1, PinUsage.INPUT, oc.newX(wHalf, hQuar), oc.newY(wHalf, hQuar)); - this.path = new double[] { oc.newX(0, 0), oc.newY(0, 0), oc.newX(width, hHalf), oc.newY(width, hHalf), oc.newX(0, height), - oc.newY(0, height) }; - - setSize(oc.width(), oc.height()); - addPin(input); - addPin(output); - addPin(enable); - - init(); - } - - public final Pin getInputPin() - { - return input; - } - - public final Pin getOutputPin() - { - return output; - } - - public final Pin getEnablePin() - { - return enable; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - double x = getPosX(); - double y = getPosY(); - gc.drawPolygon(new double[] { x + path[0], y + path[1], x + path[2], y + path[3], x + path[4], y + path[5] }); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "TriStateBuffer"; - } - - @Override - public ModelTriStateBufferParams getParamsForSerializing(IdentifyParams idParams) - { - return params; - } - - static - { - LogicCoreAdapter.addComponentAdapter(new TriStateBufferAdapter()); - IndirectModelComponentCreator.setComponentSupplier(ModelTriStateBuffer.class.getName(), (m, p, n) -> - { - ModelTriStateBufferParams params = JsonHandler.fromJsonTree(p, ModelTriStateBufferParams.class); - if (params == null) - throw new JsonSyntaxException("Invalid!!!"); - return new ModelTriStateBuffer(m, params, n); - }); - } - - public static class ModelTriStateBufferParams - { - int logicWidth; - Orientation orientation; - - public ModelTriStateBufferParams(int logicWidth, Orientation orientation) - { - this.logicWidth = logicWidth; - this.orientation = orientation; - } - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java deleted file mode 100644 index 8971285a..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java +++ /dev/null @@ -1,161 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.logic.model.modeladapter.componentadapters.SimpleRectangularHardcodedModelComponentAdapter; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public abstract class SimpleRectangularHardcodedModelComponent extends ModelComponent -{ - private static final double centerTextHeight = 5; - private static final double pinNamesHeight = 3.5; - private static final double pinNamesMargin = .5; - - private final String id; - - private final DefaultOutlineRenderer outlineRenderer; - private final CenteredTextSymbolRenderer centerTextRenderer; - private final PinNamesSymbolRenderer pinNamesRenderer; - - private AtomicReference state; - private Runnable recalculate; - - // creation and destruction - - public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText) - { - this(model, id, name, centerText, true); - } - - public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText, boolean callInit) - { - super(model, name, false); - this.id = id; - this.outlineRenderer = new DefaultOutlineRenderer(this); - CenteredTextParams centeredTextParams = new CenteredTextParams(); - centeredTextParams.text = centerText; - centeredTextParams.fontHeight = centerTextHeight; - this.centerTextRenderer = new CenteredTextSymbolRenderer(this, centeredTextParams); - PinNamesParams pinNamesParams = new PinNamesParams(); - pinNamesParams.pinLabelHeight = pinNamesHeight; - pinNamesParams.pinLabelMargin = pinNamesMargin; - this.pinNamesRenderer = new PinNamesSymbolRenderer(this, pinNamesParams); - addPinRemovedListener(this::pinRemoved); - setHighLevelStateHandler(new HighLevelStateHandler() - { - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return null;// we don't need to serialize this; it's implicit since we are a SimpleRectangularHardcodedModelComponent - } - - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - @Override - public Object getHighLevelState(String stateID) - { - return SimpleRectangularHardcodedModelComponent.this.getHighLevelState(state.get(), stateID); - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - state.updateAndGet(s -> SimpleRectangularHardcodedModelComponent.this.setHighLevelState(s, stateID, newState)); - recalculate.run(); - } - }); - - if (callInit) - init(); - } - - // pins - - protected void addPin(Pin pin, Position namePosition) - { - super.addPin(pin); // do this first to catch errors - pinNamesRenderer.setPinPosition(pin, namePosition); - } - - private void pinRemoved(Pin pin) - { - pinNamesRenderer.setPinPosition(pin, null); - } - - // high-level access - - @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden - protected Object getHighLevelState(Object state, String stateID) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden - protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - // logic - - public abstract Object recalculate(Object lastState, Map readEnds, Map readWriteEnds); - - // core model binding - - public void setCoreModelBindingAndResetState(AtomicReference state, Runnable recalculate) - { - this.state = state; - this.recalculate = recalculate; - } - - // "graphical" operations - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - outlineRenderer.render(gc, visibleRegion); - centerTextRenderer.render(gc, visibleRegion); - pinNamesRenderer.render(gc, visibleRegion); - } - - // serializing - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return id; - } - - // operations no longer supported - - @Override - protected void addPin(Pin pin) - { - throw new UnsupportedOperationException("Can't add pins without setting usage, call addPin(Pin [, Position]) instead"); - } - - static - { - LogicCoreAdapter.addComponentAdapter(new SimpleRectangularHardcodedModelComponentAdapter()); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java deleted file mode 100644 index 89366013..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java +++ /dev/null @@ -1,122 +0,0 @@ -package net.mograsim.logic.model.model.components.atomic; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.swt.graphics.Color; - -import com.google.gson.JsonPrimitive; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.preferences.Preferences; - -public class SimpleRectangularModelGate extends ModelComponent -{ - private static final double width = 20; - private static final double pinDistance = 10; - private static final double fontHeight = 5; - private static final double invertedCircleDiam = 3.5; - - private final String id; - - private final String label; - private final boolean isInverted; - protected final int logicWidth; - private final double rectWidth; - - private MovablePin outputPin; - private final List inputPins; - - protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, - String name) - { - this(model, id, label, isInverted, logicWidth, name, true); - } - - protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, - String name, boolean callInit) - { - super(model, name, false); - this.id = id; - this.label = label; - this.logicWidth = logicWidth; - this.isInverted = isInverted; - this.rectWidth = width - (isInverted ? invertedCircleDiam : 0); - this.outputPin = new MovablePin(model, this, "Y", logicWidth, PinUsage.OUTPUT, width, 0); - addPin(outputPin); - this.inputPins = new ArrayList<>(); - setInputCount(1); - - if (callInit) - init(); - } - - protected void setInputCount(int inputCount) - { - int oldInputCount = inputPins.size(); - setSize(width, inputCount * pinDistance); - if (oldInputCount > inputCount) - while (inputPins.size() > inputCount) - removePin(inputPins.remove(inputCount).name); - else if (oldInputCount < inputCount) - for (int i = oldInputCount; i < inputCount; i++) - { - // TODO what for more than 24 input pins? - Pin pin = new Pin(model, this, String.valueOf((char) ('A' + i)), logicWidth, PinUsage.INPUT, 0, - pinDistance / 2 + i * pinDistance); - inputPins.add(pin); - addPin(pin); - } - outputPin.setRelPos(width, inputCount * pinDistance / 2); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); - if (foreground != null) - gc.setForeground(foreground); - double height = (getPins().size() - 1) * pinDistance; - gc.drawRectangle(getPosX(), getPosY(), rectWidth, height); - if (isInverted) - gc.drawOval(getPosX() + rectWidth, getPosY() + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam); - Font oldFont = gc.getFont(); - Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); - gc.setFont(labelFont); - Point textExtent = gc.textExtent(label); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(label, getPosX() + (rectWidth - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); - gc.setFont(oldFont); - } - - // serializing - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return id; - } - - /** - * {@link SimpleRectangularModelGate}s implementation returns a {@link JsonPrimitive} of type int containing the {@link #logicWidth} of - * this component. - * - * @see ModelComponent#getParamsForSerializing() - */ - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java deleted file mode 100644 index ef567e92..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java +++ /dev/null @@ -1,134 +0,0 @@ -package net.mograsim.logic.model.model.components.submodels; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; - -public class SimpleRectangularSubmodelComponent extends SubmodelComponent -{ - public static final double width = 35; - public static final double pinDistance = 10; - public static final double pinNameMargin = .5; - public static final double labelFontHeight = 5; - public static final double pinNameFontHeight = 3.5; - - public final String label; - protected final int logicWidth; - - private final List inputPinNames; - private final List inputPinNamesUnmodifiable; - private final List outputPinNames; - private final List outputPinNamesUnmodifiable; - - public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label) - { - this(model, logicWidth, label, null); - } - - public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name) - { - this(model, logicWidth, label, name, true); - } - - protected SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name, boolean callInit) - { - super(model, name, false); - this.label = label; - this.logicWidth = logicWidth; - this.inputPinNames = new ArrayList<>(); - this.inputPinNamesUnmodifiable = Collections.unmodifiableList(inputPinNames); - this.outputPinNames = new ArrayList<>(); - this.outputPinNamesUnmodifiable = Collections.unmodifiableList(outputPinNames); - - SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams(); - rendererParams.centerText = label; - rendererParams.centerTextHeight = labelFontHeight; - rendererParams.horizontalComponentCenter = width / 2; - rendererParams.pinLabelHeight = pinNameFontHeight; - rendererParams.pinLabelMargin = pinNameMargin; - setSymbolRenderer(new SimpleRectangularLikeSymbolRenderer(this, rendererParams)); - setOutlineRenderer(new DefaultOutlineRenderer(this)); - - if (callInit) - init(); - } - - protected void setInputPins(String... pinNames) - { - setIOPins(0, inputPinNames, outputPinNames, PinUsage.INPUT, pinNames); - } - - protected void setOutputPins(String... pinNames) - { - setIOPins(width, outputPinNames, inputPinNames, PinUsage.OUTPUT, pinNames); - } - - private void setIOPins(double relX, List pinNamesListThisSide, List pinNamesListOtherSide, PinUsage usage, - String... newPinNames) - { - int inputCount = newPinNames.length; - List newPinNamesList = Arrays.asList(newPinNames); - if (new HashSet<>(newPinNamesList).size() != inputCount) - throw new IllegalArgumentException("Pin names contain duplicates"); - for (String pinName : newPinNamesList) - if (pinNamesListOtherSide.contains(pinName)) - throw new IllegalArgumentException("Can't add pin. There is a pin on the other side with the same name: " + pinName); - super.setSize(width, Math.max(inputCount, pinNamesListOtherSide.size()) * pinDistance); - for (int i = 0; i < inputCount; i++) - { - String pinName = newPinNames[i]; - int oldPinIndex = pinNamesListThisSide.indexOf(pinName); - if (oldPinIndex == -1) - super.addSubmodelInterface( - new MovablePin(model, this, pinName, logicWidth, usage, relX, pinDistance / 2 + i * pinDistance)); - else - getSupermodelMovablePin(pinName).setRelPos(relX, pinDistance / 2 + i * pinDistance); - } - for (String pinName : pinNamesListThisSide) - if (!newPinNamesList.contains(pinName)) - super.removeSubmodelInterface(pinName); - pinNamesListThisSide.clear(); - pinNamesListThisSide.addAll(newPinNamesList); - } - - public List getInputPinNames() - { - return inputPinNamesUnmodifiable; - } - - public List getOutputPinNames() - { - return outputPinNamesUnmodifiable; - } - - @Override - protected Pin addSubmodelInterface(MovablePin supermodelPin) - { - throw new UnsupportedOperationException( - "Can't add submodel interfaces to a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); - } - - @Override - protected void removeSubmodelInterface(String name) - { - throw new UnsupportedOperationException( - "Can't remove submodel interfaces of a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); - } - - @Override - protected void setSize(double width, double height) - { - throw new UnsupportedOperationException( - "Can't set the size of a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java deleted file mode 100644 index 9388e2fb..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java +++ /dev/null @@ -1,477 +0,0 @@ -package net.mograsim.logic.model.model.components.submodels; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Consumer; - -import net.haspamelodica.swt.helper.gcs.GCConfig; -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.gcs.TranslatedGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.LogicUIRenderer; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.logic.model.serializing.SubmodelComponentParams; -import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.preferences.Preferences; - -/** - * A {@link ModelComponent} consisting of another model. A SubmodelComponent can have so-called "interface pins" connecting the - * inner and outer models. - */ -public abstract class SubmodelComponent extends ModelComponent -{ - public static final String SUBMODEL_INTERFACE_NAME = "_submodelinterface"; - /** - * A modifiable view of {@link #submodel}. - */ - protected final LogicModelModifiable submodelModifiable; - /** - * The model this {@link SubmodelComponent} consists of. - */ - public final LogicModel submodel; - /** - * The list of all submodel interface pins of this {@link SubmodelComponent} on the submodel side. - */ - private final Map submodelPins; - /** - * An unmodifiable view of {@link #submodelPins}. - */ - private final Map submodelMovablePinsUnmodifiable; - /** - * An unmodifiable view of {@link #submodelPins} where pins are not movable. - */ - private final Map submodelUnmovablePinsUnmodifiable; - /** - * The list of all submodel interface pins of this {@link SubmodelComponent} on the supermodel side. - */ - private final Map supermodelPins; - /** - * An unmodifiable view of {@link #supermodelPins}. - */ - private final Map supermodelMovablePinsUnmodifiable; - /** - * An unmodifiable view of {@link #supermodelPins} where pins are not movable. - */ - private final Map supermodelUnmovablePinsUnmodifiable; - /** - * A pseudo-component containing all submodel interface pins on the submodel side. - */ - private final SubmodelInterface submodelInterface; - - /** - * The factor by which the submodel is scaled when rendering. - */ - private double submodelScale; - /** - * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel starts to - * be visible. - */ - private double maxVisibleRegionFillRatioForAlpha0; - /** - * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is fully - * visible. - */ - private double minVisibleRegionFillRatioForAlpha1; - /** - * The renderer used for rendering the submodel. - */ - private final LogicUIRenderer renderer; - - /** - * The {@link Renderer} used to render the symbol of this SubmodelCoponent. - */ - private Renderer symbolRenderer; - /** - * The {@link Renderer} used to render the outline of this SubmodelCoponent. - */ - private Renderer outlineRenderer; - - // creation and destruction - - public SubmodelComponent(LogicModelModifiable model, String name) - { - this(model, name, true); - } - - protected SubmodelComponent(LogicModelModifiable model, String name, boolean callInit) - { - super(model, name, false); - this.submodelModifiable = new LogicModelModifiable(); - this.submodel = submodelModifiable; - this.submodelPins = new HashMap<>(); - this.submodelMovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); - this.submodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); - this.supermodelPins = new HashMap<>(); - this.supermodelMovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); - this.supermodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); - this.submodelInterface = new SubmodelInterface(submodelModifiable); - - this.submodelScale = 1; - this.maxVisibleRegionFillRatioForAlpha0 = 0.8; - this.minVisibleRegionFillRatioForAlpha1 = 0.9; - this.renderer = new LogicUIRenderer(submodelModifiable); - - Consumer redrawHandlerChangedListener = submodelModifiable::setRedrawHandler; - model.addRedrawHandlerChangedListener(redrawHandlerChangedListener); - model.addComponentRemovedListener(c -> - { - if (c == this) - model.removeRedrawHandlerChangedListener(redrawHandlerChangedListener); - }); - submodelModifiable.setRedrawHandler(model.getRedrawHandler()); - - if (callInit) - init(); - } - - // pins - - /** - * Adds a new submodel interface pin. - * - * @param supermodelPin the submodel interface pin on the supermodel side - * - * @return the submodel interface pin on the submodel side - * - * @author Daniel Kirschten - */ - protected Pin addSubmodelInterface(MovablePin supermodelPin) - { - super.addPin(supermodelPin);// do this first to be fail-fast if the supermodel does not belong to this component - - String name = supermodelPin.name; - // TODO if we upgrade to Java 12, replace with switch-expression - PinUsage submodelPinUsage; - switch (supermodelPin.usage) - { - case INPUT: - submodelPinUsage = PinUsage.OUTPUT; - break; - case OUTPUT: - submodelPinUsage = PinUsage.INPUT; - break; - case TRISTATE: - submodelPinUsage = PinUsage.TRISTATE; - break; - default: - throw new IllegalArgumentException("Unknown enum constant: " + supermodelPin.usage); - } - MovablePin submodelPin = new MovablePin(submodelModifiable, submodelInterface, name, supermodelPin.logicWidth, submodelPinUsage, - supermodelPin.getRelX() / submodelScale, supermodelPin.getRelY() / submodelScale); - - submodelPin.addPinMovedListener(p -> - { - double newRelX = p.getRelX() * submodelScale; - double newRelY = p.getRelY() * submodelScale; - if (supermodelPin.getRelX() != newRelX || supermodelPin.getRelY() != newRelY) - supermodelPin.setRelPos(newRelX, newRelY); - }); - supermodelPin.addPinMovedListener(p -> - { - double newRelX = p.getRelX() / submodelScale; - double newRelY = p.getRelY() / submodelScale; - if (submodelPin.getRelX() != newRelX || submodelPin.getRelY() != newRelY) - submodelPin.setRelPos(newRelX, newRelY); - }); - - submodelInterface.addPin(submodelPin); - - submodelPins.put(name, submodelPin); - supermodelPins.put(name, supermodelPin); - - // no need to call requestRedraw() because addPin() will request a redraw - return submodelPin; - } - - /** - * Removes a submodel interface pin. - * - * @author Daniel Kirschten - */ - protected void removeSubmodelInterface(String name) - { - super.removePin(name);// do this first to be fail-fast if this component doesn't have a pin with the given name - Pin submodelPin = submodelPins.remove(name); - submodelInterface.removePin(submodelPin.name); - supermodelPins.remove(name); - - // no need to call requestRedraw() because removePin() will request a redraw - } - - /** - * Returns a collection of submodel interface pins on the submodel side of this component. - * - * @author Daniel Kirschten - */ - public Map getSubmodelPins() - { - return submodelUnmovablePinsUnmodifiable; - } - - /** - * Returns the submodel interface pin with the given name on the submodel side of this component. - * - * @author Daniel Kirschten - */ - public Pin getSubmodelPin(String name) - { - return getSubmodelMovablePin(name); - } - - /** - * Returns a collection of movable submodel interface pins on the submodel side of this component. - * - * @author Daniel Kirschten - */ - protected Map getSubmodelMovablePins() - { - return submodelMovablePinsUnmodifiable; - } - - /** - * Returns the movable submodel interface pin with the given name on the submodel side of this component. - * - * @author Daniel Kirschten - */ - protected MovablePin getSubmodelMovablePin(String name) - { - return submodelPins.get(name); - } - - /** - * Returns a collection of submodel interface pins on the supermodel side of this component. - * - * @author Daniel Kirschten - */ - public Map getSupermodelPins() - { - return supermodelUnmovablePinsUnmodifiable; - } - - /** - * Returns the submodel interface pin with the given name on the supermodel side of this component. - * - * @author Daniel Kirschten - */ - public Pin getSupermodelPin(String name) - { - return getSupermodelMovablePin(name); - } - - /** - * Returns a collection of movable submodel interface pins on the supermodel side of this component. - * - * @author Daniel Kirschten - */ - protected Map getSupermodelMovablePins() - { - return supermodelMovablePinsUnmodifiable; - } - - /** - * Returns the movable submodel interface pin with the given name on the supermodel side of this component. - * - * @author Daniel Kirschten - */ - protected MovablePin getSupermodelMovablePin(String name) - { - return supermodelPins.get(name); - } - - // "graphical" operations - - /** - * Sets the factor by which the submodel is scaled when rendering and calls redrawListeners. Note that the submodel interface pins will - * stay at their position relative to the supermodel, which means they will move relative to the submodel. - * - * @author Daniel Kirschten - */ - protected void setSubmodelScale(double submodelScale) - { - this.submodelScale = submodelScale; - - for (Entry e : supermodelPins.entrySet()) - getSubmodelMovablePin(e.getKey()).setRelPos(e.getValue().getRelX() * submodelScale, e.getValue().getRelY() * submodelScale); - - model.requestRedraw();// needed if there is no submodel interface pin - } - - /** - * Returns the current factor by which the submodel is scaled when rendering. - * - * @author Daniel Kirschten - */ - public double getSubmodelScale() - { - return submodelScale; - } - - /** - * @see #renderSymbol(GeneralGC, Rectangle) - * - * @author Daniel Kirschten - */ - protected void setSymbolRenderer(Renderer symbolRenderer) - { - this.symbolRenderer = symbolRenderer; - model.requestRedraw(); - } - - /** - * @see #renderSymbol(GeneralGC, Rectangle) - * - * @author Daniel Kirschten - */ - public Renderer getSymbolRenderer() - { - return symbolRenderer; - } - - /** - * @see #renderOutline(GeneralGC, Rectangle) - * - * @author Daniel Kirschten - */ - protected void setOutlineRenderer(Renderer outlineRenderer) - { - this.outlineRenderer = outlineRenderer; - model.requestRedraw(); - } - - /** - * @see #renderOutline(GeneralGC, Rectangle) - * - * @author Daniel Kirschten - */ - public Renderer getOutlineRenderer() - { - return outlineRenderer; - } - - @Override - public boolean clicked(double x, double y) - { - double scaledX = (x - getPosX()) / submodelScale; - double scaledY = (y - getPosY()) / submodelScale; - for (ModelComponent component : submodel.getComponentsByName().values()) - if (component.getBounds().contains(scaledX, scaledY) && component.clicked(scaledX, scaledY)) - return true; - return false; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - GCConfig conf = new GCConfig(gc); - GeneralGC tgc = new TranslatedGC(gc, getPosX(), getPosY(), submodelScale, true); - conf.reset(tgc); - double visibleRegionFillRatio = Math.max(getWidth() / visibleRegion.width, getHeight() / visibleRegion.height); - double alphaFactor = map(visibleRegionFillRatio, maxVisibleRegionFillRatioForAlpha0, minVisibleRegionFillRatioForAlpha1, 0, 1); - alphaFactor = Math.max(0, Math.min(1, alphaFactor)); - // we need to take the old alpha into account to support nested submodules better. - int oldAlpha = gc.getAlpha(); - int submodelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * alphaFactor))); - int labelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * (1 - alphaFactor)))); - if (submodelAlpha != 0) - { - gc.setAlpha(submodelAlpha); - renderer.render(tgc, visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale)); - } - if (labelAlpha != 0) - { - gc.setAlpha(labelAlpha); - renderSymbol(gc, visibleRegion); - } - conf.reset(gc); - // reset line width explicitly to avoid rounding errors causing weird glitches - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - // draw the outline after all other operations to make interface pins look better - renderOutline(gc, visibleRegion); - } - - /** - * Render the symbol of this {@link SubmodelComponent}, e.g. the things that should be hidden if the submodel is drawn. - * - * @author Daniel Kirschten - */ - protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion) - { - if (symbolRenderer != null) - symbolRenderer.render(gc, visibleRegion); - } - - /** - * Render the outline of this {@link SubmodelComponent}, e.g. the graphical elements that should stay visible if the submodel is drawn. - * - * @author Daniel Kirschten - */ - protected void renderOutline(GeneralGC gc, Rectangle visibleRegion) - { - if (outlineRenderer != null) - outlineRenderer.render(gc, visibleRegion); - } - - private static double map(double val, double valMin, double valMax, double mapMin, double mapMax) - { - return mapMin + (val - valMin) * (mapMax - mapMin) / (valMax - valMin); - } - - // serializing - - /** - * {@link SubmodelComponent}'s implementation of {@link ModelComponent#getIDForSerializing(IdentifyParams)} returns "submodel". It is - * recommended to override this behaviour. - * - * @see ModelComponent#getIDForSerializing(IdentifyParams) - * @see ModelComponent#getParamsForSerializing(IdentifyParams) - */ - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "submodel";// TODO what ID? - } - - /** - * {@link SubmodelComponent}'s implementation of {@link ModelComponent#getParamsForSerializing(IdentifyParams)} returns an instance of - * {@link SubmodelComponentParams}. It is recommended to override this behaviour. - * - * @see ModelComponent#getIDForSerializing(IdentifyParams) - * @see ModelComponent#getParamsForSerializing(IdentifyParams) - */ - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return SubmodelComponentSerializer.serialize(this, idParams); - } - - // operations no longer supported - - @Override - protected void addPin(Pin pin) - { - throw new UnsupportedOperationException("Can't add pins to a SubmodelComponent directly, call addSubmodelInterface instead"); - } - - @Override - protected void removePin(String name) - { - throw new UnsupportedOperationException("Can't remove pins of a SubmodelComponent directly, call removeSubmodelInterface instead"); - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(SubmodelComponent.class.getCanonicalName(), - (m, p, n) -> SubmodelComponentSerializer.deserialize(m, JsonHandler.fromJsonTree(p, SubmodelComponentParams.class), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java deleted file mode 100644 index 331db123..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.mograsim.logic.model.model.components.submodels; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; - -public class SubmodelInterface extends ModelComponent -{ - public SubmodelInterface(LogicModelModifiable model) - { - super(model, SubmodelComponent.SUBMODEL_INTERFACE_NAME, true); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - {// nothing to do here - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - throw new UnsupportedOperationException("A SubmodelInterface can't be serialized. Use SubmodelComponent.addSubmodelInterface"); - } - - /** - * {@inheritDoc}
- * This method is only marked public in {@link SubmodelInterface} for {@link SubmodelComponent} to be able to add / remove pins to / - * from a SubmodelInterface.
- * - * @see ModelComponent#removePin(Pin) - * - * @author Daniel Kirschten - */ - @Override - public void addPin(Pin pin) - { - super.addPin(pin); - } - - /** - * {@inheritDoc}
- * This method is only marked public in {@link SubmodelInterface} for {@link SubmodelComponent} to be able to add / remove pins to / - * from a SubmodelInterface.
- * - * @see ModelComponent#removePin(Pin) - * - * @author Daniel Kirschten - */ - @Override - protected void removePin(String name) - { - super.removePin(name); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java deleted file mode 100644 index 1f44f570..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java +++ /dev/null @@ -1,531 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; - -import org.eclipse.swt.SWT; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -/** - * A wire connecting exactly two {@link Pin}s. - * - * @author Daniel Kirschten - */ -public class ModelWire -{ - /** - * The model this wire is a part of. - */ - private final LogicModelModifiable model; - /** - * The name of this wire. Is unique for all wires in its model. - */ - public final String name; - /** - * The logical width of this wire. Is equal to the logical width of {@link #pin1} and {@link #pin2}. - */ - public final int logicWidth; - /** - * The {@link Pin} on one side of this wire, usually the signal source. - */ - private Pin pin1; - /** - * The {@link Pin} on one side of this wire, usually the signal target. - */ - private Pin pin2; - /** - * The user-defined path between {@link #pin1} and {@link #pin2}.
- * Special cases: null means "choose an interpolation as fits", and an empty array means "direct connection without any - * interpolation". - */ - private Point[] path; - /** - * The bounds of this wire, excluding line width (and line joins, if the line join is {@link SWT#JOIN_MITER}) - */ - private final Rectangle bounds; - /** - * The effective path of this wire, including automatic interpolation and the position of both {@link Pin}s. Is never null. - */ - private double[] effectivePath; - - private final List> pathChangedListeners; - - /** - * A LogicObserver calling redrawListeners. Used for core model bindings. - */ - private final LogicObserver logicObs; - /** - * A ReadEnd of the core wire this model wire currently is bound to. - */ - private ReadEnd end; - - // creation and destruction - - /** - * Creates a new {@link ModelWire} with automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2) - { - this(model, null, pin1, pin2); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, Pin pin2) - { - this(model, null, pin1, pin2); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, Pin pin1, ModelWireCrossPoint pin2) - { - this(model, null, pin1, pin2); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, Pin pin1, Pin pin2) - { - this(model, null, pin1, pin2); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2, Point... path) - { - this(model, null, pin1, pin2, path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, Pin pin2, Point... path) - { - this(model, null, pin1, pin2, path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, Pin pin1, ModelWireCrossPoint pin2, Point... path) - { - this(model, null, pin1, pin2, path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation and using the default name. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, Pin pin1, Pin pin2, Point... path) - { - this(model, null, pin1, pin2, path); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2) - { - this(model, name, pin1, pin2, (Point[]) null); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, Pin pin2) - { - this(model, name, pin1, pin2, (Point[]) null); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, Pin pin1, ModelWireCrossPoint pin2) - { - this(model, name, pin1, pin2, (Point[]) null); - } - - /** - * Creates a new {@link ModelWire} with automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, Pin pin1, Pin pin2) - { - this(model, name, pin1, pin2, (Point[]) null); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2, Point... path) - { - this(model, name, pin1.getPin(), pin2.getPin(), path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, Pin pin2, Point... path) - { - this(model, name, pin1.getPin(), pin2, path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, Pin pin1, ModelWireCrossPoint pin2, Point... path) - { - this(model, name, pin1, pin2.getPin(), path); - } - - /** - * Creates a new {@link ModelWire} without automatic interpolation. - * - * @author Daniel Kirschten - */ - public ModelWire(LogicModelModifiable model, String name, Pin pin1, Pin pin2, Point... path) - { - this.model = model; - this.name = name == null ? model.getDefaultWireName() : name; - this.logicWidth = pin1.logicWidth; - if (pin2.logicWidth != pin1.logicWidth) - throw new IllegalArgumentException("Can't connect pins of different logic width"); - - this.pin1 = pin1; - this.pin2 = pin2; - - this.path = path == null ? null : Arrays.copyOf(path, path.length); - this.bounds = new Rectangle(0, 0, -1, -1); - - pathChangedListeners = new ArrayList<>(); - - logicObs = (i) -> model.requestRedraw(); - - pin1.addPinMovedListener(p -> pinMoved()); - pin2.addPinMovedListener(p -> pinMoved()); - - recalculateEffectivePath(); - - model.wireCreated(this, this::destroyed); - } - - /** - * Destroys this wire. This method is called from {@link LogicModelModifiable#wireDestroyed(ModelWire) wireDestroyed()} of the model - * this wire is a part of. - * - * @author Daniel Kirschten - */ - private void destroyed() - { - // nothing to do - } - - // pins - - /** - * Returns the {@link Pin} on one side of this wire, usually the signal source. - * - * @author Daniel Kirschten - */ - public Pin getPin1() - { - return pin1; - } - - /** - * Returns the {@link Pin} on one side of this wire, usually the signal target. - * - * @author Daniel Kirschten - */ - public Pin getPin2() - { - return pin2; - } - - /** - * Called when {@link #pin1} or {@link #pin2} were moved. - * - * @author Daniel Kirschten - */ - private void pinMoved() - { - recalculateEffectivePath(); - model.requestRedraw(); - } - - // "graphical" operations - - /** - * Recalculates {@link #effectivePath} "from scratch". Also updates {@link #bounds}. - * - * @author Daniel Kirschten - */ - private void recalculateEffectivePath() - { - Point pos1 = pin1.getPos(), pos2 = pin2.getPos(); - - double boundsX1 = Math.min(pos1.x, pos2.x); - double boundsY1 = Math.min(pos1.y, pos2.y); - double boundsX2 = Math.max(pos1.x, pos2.x); - double boundsY2 = Math.max(pos1.y, pos2.y); - - if (path == null) - effectivePath = new double[] { pos1.x, pos1.y, (pos1.x + pos2.x) / 2, pos1.y, (pos1.x + pos2.x) / 2, pos2.y, pos2.x, pos2.y }; - else - { - effectivePath = new double[path.length * 2 + 4]; - effectivePath[0] = pos1.x; - effectivePath[1] = pos1.y; - for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2) - { - double pathX = path[srcI].x; - double pathY = path[srcI].y; - effectivePath[dstI + 0] = pathX; - effectivePath[dstI + 1] = pathY; - if (pathX < boundsX1) - boundsX1 = pathX; - if (pathX > boundsX2) - boundsX2 = pathX; - if (pathY < boundsY1) - boundsY1 = pathY; - if (pathY > boundsY2) - boundsY2 = pathY; - } - effectivePath[effectivePath.length - 2] = pos2.x; - effectivePath[effectivePath.length - 1] = pos2.y; - } - - bounds.x = boundsX1; - bounds.y = boundsY1; - bounds.width = boundsX2 - boundsX1; - bounds.height = boundsY2 - boundsY1; - } - - /** - * Returns the bounds of this wire, excluding line width (and line joins, if the line join is {@link SWT#JOIN_MITER}) - * - * @author Daniel Kirschten - */ - public Rectangle getBounds() - { - return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); - } - - /** - * Render this wire to the given gc, in absoulute coordinates. - * - * @author Daniel Kirschten - */ - public void render(GeneralGC gc) - { - ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end); - if (wireColor != null) - gc.setForeground(ColorManager.current().toColor(wireColor)); - gc.setLineWidth( - Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); - gc.drawPolyline(effectivePath); - gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); - } - - // operations concerning the path - - /** - * The user-defined path between {@link #pin1} and {@link #pin2}. Note that this is not neccessarily equal to the effective path drawn - * in {@link #render(GeneralGC)}.
- * Special cases: null means "choose an interpolation as fits", and an empty array means "direct connection without any - * interpolation". - * - * @author Daniel Kirschten - */ - public Point[] getPath() - { - return deepPathCopy(path); - } - - public void setPath(Point... path) - { - this.path = deepPathCopy(path); - recalculateEffectivePath(); - callPathChangedListeners(); - model.requestRedraw(); - } - - public Point getPathPoint(int index) - { - return pointCopy(path[index]); - } - - public void setPathPoint(Point p, int index) - { - path[index] = pointCopy(p); - recalculateEffectivePath(); - callPathChangedListeners(); - model.requestRedraw(); - } - - public void insertPathPoint(Point p, int index) - { - if (path == null) - path = new Point[] { pointCopy(p) }; - else - { - Point[] oldPath = path; - path = new Point[oldPath.length + 1]; - System.arraycopy(oldPath, 0, path, 0, index); - if (index < oldPath.length) - System.arraycopy(oldPath, index, path, index + 1, oldPath.length - index); - path[index] = pointCopy(p); - } - recalculateEffectivePath(); - callPathChangedListeners(); - } - - public void removePathPoint(int index) - { - if (path.length == 0) - path = null; - else - { - Point[] oldPath = path; - path = new Point[oldPath.length - 1]; - System.arraycopy(oldPath, 0, path, 0, index); - if (index < oldPath.length - 1) - System.arraycopy(oldPath, index + 1, path, index, oldPath.length - index - 1); - } - recalculateEffectivePath(); - callPathChangedListeners(); - } - - public double[] getEffectivePath() - { - return Arrays.copyOf(effectivePath, effectivePath.length); - } - - private static Point[] deepPathCopy(Point[] path) - { - if (path == null) - return null; - Point[] copy = new Point[path.length]; - for (int i = 0; i < path.length; i++) - copy[i] = pointCopy(path[i]); - return copy; - } - - private static Point pointCopy(Point p) - { - return new Point(p.x, p.y); - } - - // core model binding - - /** - * Binds this {@link ModelWire} to the given {@link ReadEnd}: The color of this {@link ModelWire} will now depend on the state of the - * given {@link ReadEnd}, and further changes of the given {@link ReadEnd} will result in readrawListeners being called.
- * The argument can be null, in which case the old binding is stopped. - * - * @author Daniel Kirschten - */ - public void setCoreModelBinding(ReadEnd end) - { - if (this.end != null) - this.end.deregisterObserver(logicObs); - this.end = end; - if (end != null) - end.registerObserver(logicObs); - } - - /** - * Returns whether this {@link ModelWire} has a core model binding or not. - * - * @author Daniel Kirschten - */ - public boolean hasCoreModelBinding() - { - return end != null; - } - - /** - * If this {@link ModelWire} has a core model binding, delegates to {@link CoreWire#forceValues(BitVector)} for the {@link CoreWire} - * corresponding to this {@link ModelWire}. - * - * @author Daniel Kirschten - */ - public void forceWireValues(BitVector values) - { - end.getWire().forceValues(values); - } - - /** - * If this {@link ModelWire} has a core model binding, delegates to {@link ReadEnd#getValues()} for the {@link ReadEnd} corresponding to - * this {@link ModelWire}. - * - * @author Daniel Kirschten - */ - public BitVector getWireValues() - { - return end.getValues(); - } - - // listeners - - // @formatter:off - public void addPathChangedListener (Consumer listener) {pathChangedListeners.add (listener);} - - public void removePathChangedListener(Consumer listener) {pathChangedListeners.remove(listener);} - - private void callPathChangedListeners() {pathChangedListeners.forEach(l -> l.accept(this));} - // @formatter:on - - @Override - public String toString() - { - return "ModelWire [" + pin1 + "---" + pin2 + ", value=" + (end == null ? "null" : end.getValues()) + "]"; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java deleted file mode 100644 index b9a5ccc6..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java +++ /dev/null @@ -1,140 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.types.BitVectorFormatter; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; - -/** - * A {@link ModelComponent} with only one pin. Is used to create wires connecting more than two pins.
- * Example: There are three pins P1, P2, P3 that need to be connected. Solution: Create a - * ModelWireCrossPoint (WCP) and create the ModelWires P1-WCP, P2-WCP, - * P3-WCP.
- * Cross points are drawn as circles. The pin of cross points is in the center of this circle. - * - * @author Daniel Kirschten - */ -public class ModelWireCrossPoint extends ModelComponent -{ - private static final int CIRCLE_RADIUS = 1; - private static final int CIRCLE_DIAM = CIRCLE_RADIUS * 2; - - /** - * The logical width of this cross point. - */ - public final int logicWidth; - /** - * The (single) pin of this cross point. - */ - private final Pin pin; - - /** - * A {@link LogicObserver} calling {@link #requestRedraw()}. - */ - private final LogicObserver logicObs; - /** - * The {@link ReadEnd} currently bound to this cross point. - */ - private ReadEnd end; - - // creation and destruction - - public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth) - { - this(model, logicWidth, null); - } - - public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth, String name) - { - super(model, name, false); - this.logicWidth = logicWidth; - logicObs = (i) -> model.requestRedraw(); - - setSize(CIRCLE_DIAM, CIRCLE_DIAM); - addPin(this.pin = new Pin(model, this, "", logicWidth, PinUsage.TRISTATE, CIRCLE_RADIUS, CIRCLE_RADIUS)); - - init(); - } - - // pins - - public Pin getPin() - { - return pin; - } - - // "graphical" operations - - /** - * Moves the center (and therefore the pin) of this {@link ModelWireCrossPoint} to the given location. - * - * @author Daniel Kirschten - */ - public void moveCenterTo(double x, double y) - { - moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end); - if (wireColor != null) - gc.setBackground(ColorManager.current().toColor(wireColor)); - gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); - } - - // core model binding - - /** - * Binds this {@link ModelWireCrossPoint} to the given {@link ReadEnd}: The color of this {@link ModelWireCrossPoint} will now depend on - * the state of the given {@link ReadEnd}, and further changes of the given {@link ReadEnd} will result in readrawListeners being - * called.
- * The argument can be null, in which case the old binding is stopped. - * - * @author Daniel Kirschten - */ - public void setCoreModelBinding(ReadEnd end) - { - if (this.end != null) - this.end.deregisterObserver(logicObs); - this.end = end; - if (end != null) - end.registerObserver(logicObs); - } - - /** - * Returns whether this {@link ModelWireCrossPoint} has a core model binding or not. - */ - public boolean hasCoreModelBinding() - { - return end != null; - } - - // serializing - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "WireCrossPoint"; - } - - @Override - public Integer getParamsForSerializing(IdentifyParams idParams) - { - return logicWidth; - } - - static - { - IndirectModelComponentCreator.setComponentSupplier(ModelWireCrossPoint.class.getCanonicalName(), - (m, p, n) -> new ModelWireCrossPoint(m, p.getAsInt(), n)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java deleted file mode 100644 index c2291f81..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; - -/** - * Exactly like {@link Pin}, but {@link #setRelPos(double, double) setRelPos(...)} is public. - * - * @author Daniel Kirschten - */ -public class MovablePin extends Pin -{ - public MovablePin(LogicModelModifiable model, ModelComponent component, String name, int logicWidth, PinUsage usage, double relX, - double relY) - { - super(model, component, name, logicWidth, usage, relX, relY); - } - - @Override - public void setRelPos(double relX, double relY) - { - super.setRelPos(relX, relY); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java deleted file mode 100644 index e9136416..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java +++ /dev/null @@ -1,168 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.function.Consumer; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; - -/** - * A connection interface between a ModelComponent and the rest of a LogicModel. Pins usually are created by {@link ModelComponent}s - * themselves.
- * A pin has a name identifying it. Pin names are unique for a {@link ModelComponent}: Every pin of a {@link ModelComponent} has a different - * name, but different {@link ModelComponent}s can have pins with the same name. - * - * @author Daniel Kirschten - */ -public class Pin -{ - /** - * The {@link LogicModel} the component this pin belongs to is a part of. - */ - private final LogicModelModifiable model; - /** - * The {@link ModelComponent} this pin belongs to. - */ - public final ModelComponent component; - /** - * The name identifying this pin. Is unique for a {@link ModelComponent}. - */ - public final String name; - /** - * The logical width of this pin. Denotes how many bits this pin consists of. - */ - public final int logicWidth; - /** - * How this pin is used by the component it belongs to.
- * Note that this is only a hint. - */ - public final PinUsage usage; - - /** - * The X position of this pin, relative to its component's location. - */ - protected double relX; - /** - * The Y position of this pin, relative to its component's location. - */ - protected double relY; - - private final List> pinMovedListeners; - private final List redrawListeners; - - // creation and destruction - - /** - * Creates a new pin. Usually it is not needed to call this constructor manually, as {@link ModelComponent}s create their pins - * themselves. - * - * @author Daniel Kirschten - */ - public Pin(LogicModelModifiable model, ModelComponent component, String name, int logicWidth, PinUsage usage, double relX, double relY) - { - this.model = model; - this.component = component; - this.name = name; - this.logicWidth = logicWidth; - this.usage = Objects.requireNonNull(usage); - this.relX = relX; - this.relY = relY; - - this.pinMovedListeners = new ArrayList<>(); - this.redrawListeners = new ArrayList<>(); - - component.addComponentMovedListener(c -> callPinMovedListeners()); - } - - /** - * Destroys this pin by removing all wires connected to it from the model the component is a part of.
- * Don't call this method from application code as it is automatically called in {@link ModelComponent#removePin(String)}. - */ - public void destroyed() - { - Set connectedWires = new HashSet<>(); - for (ModelWire w : model.getWiresByName().values()) - if (w.getPin1() == this || w.getPin2() == this) - connectedWires.add(w); - connectedWires.forEach(model::destroyWire); - } - - // "graphical" operations - - /** - * Returns the X position of this pin relative to the position of its component. - * - * @author Daniel Kirschten - */ - public double getRelX() - { - return relX; - } - - /** - * Returns the Y position of this pin relative to the position of its component. - * - * @author Daniel Kirschten - */ - public double getRelY() - { - return relY; - } - - /** - * Returns the position of this pin relative to the position of its component. - * - * @author Daniel Kirschten - */ - public Point getRelPos() - { - return new Point(relX, relY); - } - - /** - * Returns the absolute position of this pin. - * - * @author Daniel Kirschten - */ - public Point getPos() - { - return new Point(relX + component.getPosX(), relY + component.getPosY()); - } - - /** - * Sets the position of this pin relative to the position of its component. - * - * @author Daniel Kirschten - */ - protected void setRelPos(double relX, double relY) - { - this.relX = relX; - this.relY = relY; - callPinMovedListeners(); - callRedrawListeners(); - } - - // listeners - - // @formatter:off - public void addPinMovedListener (Consumer listener){pinMovedListeners.add (listener);} - public void addRedrawListener (Runnable listener){redrawListeners .add (listener);} - - public void removePinMovedListener(Consumer listener){pinMovedListeners.remove(listener);} - public void removeRedrawListener (Runnable listener){redrawListeners .remove(listener);} - - private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));} - private void callRedrawListeners () {redrawListeners .forEach(l -> l.run ( ));} - // @formatter:on - - @Override - public String toString() - { - return "Pin " + name + " of " + component.getName(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java deleted file mode 100644 index f229d023..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.mograsim.logic.model.model.wires; - -public enum PinUsage -{ - /** - * The component never affects the value of the wire connected to the pin. - */ - INPUT, - /** - * The component is never affected by the value of the wire connected to this pin. This includes the look of the component. - */ - OUTPUT, - /** - * The component (sometimes) affects the value of the wire connected to the pin, but is also (sometimes) affected by the value of this - * wire. - */ - TRISTATE; -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java deleted file mode 100644 index db3b5ac6..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.mograsim.logic.model.modeladapter; - -public class CoreModelParameters -{ - public int wireTravelTime; - public int gateProcessTime; -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java deleted file mode 100644 index 70f256ab..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java +++ /dev/null @@ -1,165 +0,0 @@ -package net.mograsim.logic.model.modeladapter; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; - -public class LogicCoreAdapter -{ - private final static Map, ComponentAdapter> componentAdapters = new HashMap<>(); - - public static void addComponentAdapter(ComponentAdapter componentAdapter) - { - componentAdapters.put(componentAdapter.getSupportedClass(), componentAdapter); - } - - public static Timeline convert(LogicModel logicModel, CoreModelParameters params) - { - // TODO replace Timeline with CoreModel as soon as it exists - Timeline timeline = new Timeline(10); - - convert(logicModel, params, timeline, Map.of()); - - return timeline; - } - - private static void convert(LogicModel logicModel, CoreModelParameters params, Timeline timeline, Map externalWires) - { - Map logicWiresPerPin = convertWires(getAllPins(logicModel), logicModel.getWiresByName().values(), externalWires, - params, timeline); - Map logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin); - - for (ModelComponent modelComp : logicModel.getComponentsByName().values()) - { - if (modelComp instanceof SubmodelComponent) - { - SubmodelComponent modelCompCasted = (SubmodelComponent) modelComp; - Map supermodelPins = modelCompCasted.getSupermodelPins(); - Map externalWiresForSubmodel = supermodelPins.entrySet().stream().collect( - Collectors.toMap(e -> modelCompCasted.getSubmodelPin(e.getKey()), e -> logicWiresPerPin.get(e.getValue()))); - convert(modelCompCasted.submodel, params, timeline, externalWiresForSubmodel); - } else if (modelComp instanceof ModelWireCrossPoint) - { - ModelWireCrossPoint modelCompCasted = (ModelWireCrossPoint) modelComp; - modelCompCasted.setCoreModelBinding(logicWiresPerPin.get(modelCompCasted.getPin()).createReadOnlyEnd()); - } else if (!(modelComp instanceof SubmodelInterface))// nothing to do for SubmodelInterfaces - createAndLinkComponent(timeline, params, modelComp, logicWiresPerPinUnmodifiable); - } - } - - private static Set getAllPins(LogicModel logicModel) - { - return logicModel.getComponentsByName().values().stream().flatMap(component -> component.getPins().values().stream()) - .collect(Collectors.toSet()); - } - - private static Map convertWires(Set allPins, Collection wires, Map externalWires, - CoreModelParameters params, Timeline timeline) - { - Map> connectedPinGroups = getConnectedPinGroups(allPins, wires); - Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups, externalWires); - setModelWiresCoreModelBinding(wires, logicWiresPerPin); - return logicWiresPerPin; - } - - private static Map createLogicWires(CoreModelParameters params, Timeline timeline, Map> connectedPinGroups, - Map externalWires) - { - Map logicWiresPerPin = new HashMap<>(); - Map, CoreWire> logicWiresPerPinGroup = new HashMap<>(); - for (Entry> e : connectedPinGroups.entrySet()) - logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(), set -> - { - CoreWire externalWire = null; - for (Pin p : set) - { - CoreWire externalWireCandidate = externalWires.get(p); - if (externalWireCandidate != null) - if (externalWire == null) - externalWire = externalWireCandidate; - else if (externalWire.width == externalWireCandidate.width) - CoreWire.fuse(externalWire, externalWireCandidate); - else - throw new IllegalArgumentException( - "Two pins to external wires with different logicWidths can't be connected directly"); - } - return externalWire == null ? new CoreWire(timeline, e.getKey().logicWidth, params.wireTravelTime) : externalWire; - })); - return logicWiresPerPin; - } - - private static void setModelWiresCoreModelBinding(Collection wires, Map logicWiresPerPin) - { - Map modelWireSharedReadEnd = logicWiresPerPin.values().stream().distinct() - .collect(Collectors.toMap(Function.identity(), CoreWire::createReadOnlyEnd)); - for (ModelWire modelWire : wires) - modelWire.setCoreModelBinding(modelWireSharedReadEnd.get(logicWiresPerPin.get(modelWire.getPin1()))); - } - - private static Map> getConnectedPinGroups(Set allPins, Collection wires) - { - Map> connectedPinsPerPin = new HashMap<>(); - - for (Pin p : allPins) - { - HashSet connectedPins = new HashSet<>(); - connectedPins.add(p); - connectedPinsPerPin.put(p, connectedPins); - } - - wires.forEach(wire -> - { - Pin pin1 = wire.getPin1(); - Pin pin2 = wire.getPin2(); - - Set pin1ConnectedPins = connectedPinsPerPin.get(pin1); - Set pin2ConnectedPins = connectedPinsPerPin.get(pin2); - - pin1ConnectedPins.addAll(pin2ConnectedPins); - pin1ConnectedPins.add(pin1); - pin1ConnectedPins.add(pin2); - - pin2ConnectedPins.forEach(pin -> connectedPinsPerPin.put(pin, pin1ConnectedPins)); - }); - return connectedPinsPerPin; - } - - @SuppressWarnings("unchecked") - private static void createAndLinkComponent(Timeline timeline, CoreModelParameters params, - ModelComponent modelComponent, Map logicWiresPerPin) - { - Class cls = modelComponent.getClass(); - ComponentAdapter adapter = null; - while (cls != ModelComponent.class && adapter == null) - { - adapter = (ComponentAdapter) componentAdapters.get(cls); - cls = cls.getSuperclass(); - } - if (adapter == null) - throw new IllegalArgumentException("Unknown component class: " + modelComponent.getClass()); - adapter.createAndLinkComponent(timeline, params, (G) modelComponent, logicWiresPerPin); - } - - private LogicCoreAdapter() - { - throw new UnsupportedOperationException("No LogicCoreAdapter instances"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java deleted file mode 100644 index 517e9464..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreBitDisplay; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class BitDisplayAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelBitDisplay.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelBitDisplay modelComponent, - Map logicWiresPerPin) - { - ReadEnd end = logicWiresPerPin.get(modelComponent.getInputPin()).createReadOnlyEnd(); - CoreBitDisplay bitDisplay = new CoreBitDisplay(timeline, end); - modelComponent.setCoreModelBinding(bitDisplay); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java deleted file mode 100644 index adcda831..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreClock; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.ModelClock; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class ClockAdapter implements ComponentAdapter -{ - - @Override - public Class getSupportedClass() - { - return ModelClock.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelClock modelClock, - Map logicWiresPerPin) - { - ReadWriteEnd out = logicWiresPerPin.get(modelClock.getOutputPin()).createReadWriteEnd(); - CoreClock c = new CoreClock(timeline, out, modelClock.getDelta()); - modelClock.setCoreModelBinding(c); - } - -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java deleted file mode 100644 index d7f2d2cf..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public interface ComponentAdapter -{ - public Class getSupportedClass(); - - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, G modelComponent, - Map logicWiresPerPin); -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java deleted file mode 100644 index f8236652..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.model.model.components.atomic.ModelFixedOutput; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class FixedOutputAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelFixedOutput.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelFixedOutput modelComponent, - Map logicWiresPerPin) - { - logicWiresPerPin.get(modelComponent.getPin("out")).createReadWriteEnd().feedSignals(modelComponent.bits); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java deleted file mode 100644 index 75305f61..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreManualSwitch; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class ManualSwitchAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelManualSwitch.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelManualSwitch modelComponent, - Map logicWiresPerPin) - { - ReadWriteEnd end = logicWiresPerPin.get(modelComponent.getOutputPin()).createReadWriteEnd(); - CoreManualSwitch manualSwitch = new CoreManualSwitch(timeline, end); - modelComponent.setCoreModelBinding(manualSwitch); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java deleted file mode 100644 index 22d61122..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.components.atomic.ModelMerger; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class MergerAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelMerger.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelMerger modelComponent, - Map logicWiresPerPin) - { - CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O")); - ReadEnd[] inputEnds = new ReadEnd[modelComponent.logicWidth]; - for (int i = 0; i < modelComponent.logicWidth; i++) - { - CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I" + (modelComponent.logicWidth - 1 - i))); - CoreWire.fuse(input, output, 0, i); - inputEnds[i] = input.createReadOnlyEnd(); - } - modelComponent.setCoreModelBinding(inputEnds, output.createReadOnlyEnd()); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java deleted file mode 100644 index ea87e78e..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -/** - * For ModelComponents that do not have any simulation logic behaviour - * - * @author Christian Femers - */ -public class NoLogicAdapter implements ComponentAdapter -{ - private final Class modelComponentClass; - - public NoLogicAdapter(Class modelComponentClass) - { - this.modelComponentClass = modelComponentClass; - } - - @Override - public Class getSupportedClass() - { - return modelComponentClass; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, T modelComponent, Map logicWiresPerPin) - { - // do nothing - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java deleted file mode 100644 index c38883e6..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularModelGate; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class SimpleGateAdapter implements ComponentAdapter -{ - private final Class supportedClass; - private final ComponentConstructor constructor; - - public SimpleGateAdapter(Class supportedClass, ComponentConstructor constructor) - { - this.supportedClass = supportedClass; - this.constructor = constructor; - } - - @Override - public Class getSupportedClass() - { - return supportedClass; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, G modelComponent, Map logicWiresPerPin) - { - ReadWriteEnd out = logicWiresPerPin.get(modelComponent.getPin("Y")).createReadWriteEnd(); - - // TODO can we do this prettier? - int inputPinCount = modelComponent.getPins().size() - 1; - ReadEnd[] ins = new ReadEnd[inputPinCount]; - for (int i = 0; i < inputPinCount; i++) - ins[i] = logicWiresPerPin.get(modelComponent.getPin(String.valueOf((char) ('A' + i)))).createReadOnlyEnd(); - - constructor.newComponent(timeline, params.gateProcessTime, out, ins); - } - - public static interface ComponentConstructor - { - public CoreComponent newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins); - } - -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java deleted file mode 100644 index dbebc0ff..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java +++ /dev/null @@ -1,55 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicReference; - -import net.mograsim.logic.core.LogicObserver; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class SimpleRectangularHardcodedModelComponentAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return SimpleRectangularHardcodedModelComponent.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, - SimpleRectangularHardcodedModelComponent modelComponent, Map logicWiresPerPin) - { - Map readEnds = new HashMap<>(); - Map readWriteEnds = new HashMap<>(); - - AtomicReference state = new AtomicReference<>(); - - Runnable recalculate = () -> state.updateAndGet(s -> modelComponent.recalculate(s, readEnds, readWriteEnds)); - LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime); - - modelComponent.setCoreModelBindingAndResetState(state, recalculate); - - for (Pin pin : modelComponent.getPins().values()) - { - CoreWire wire = logicWiresPerPin.get(pin); - ReadEnd end; - if (pin.usage != PinUsage.INPUT) - { - ReadWriteEnd rwEnd = wire.createReadWriteEnd(); - readWriteEnds.put(pin.name, rwEnd); - end = rwEnd; - } else - end = wire.createReadOnlyEnd(); - readEnds.put(pin.name, end); - if (pin.usage != PinUsage.OUTPUT) - end.registerObserver(logicObs); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java deleted file mode 100644 index 3cfa5f28..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.model.model.components.atomic.ModelSplitter; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class SplitterAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelSplitter.class; - } - - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelSplitter modelComponent, - Map logicWiresPerPin) - { - CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I")); - ReadEnd[] outputEnds = new ReadEnd[modelComponent.logicWidth]; - for (int i = 0; i < modelComponent.logicWidth; i++) - { - CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O" + (modelComponent.logicWidth - 1 - i))); - CoreWire.fuse(input, output, i, 0); - outputEnds[i] = output.createReadOnlyEnd(); - } - modelComponent.setCoreModelBinding(input.createReadOnlyEnd(), outputEnds); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java deleted file mode 100644 index 56a838b7..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.logic.model.modeladapter.componentadapters; - -import java.util.Map; - -import net.mograsim.logic.core.components.CoreTriStateBuffer; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; - -public class TriStateBufferAdapter implements ComponentAdapter -{ - @Override - public Class getSupportedClass() - { - return ModelTriStateBuffer.class; - } - - @SuppressWarnings("unused") - @Override - public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelTriStateBuffer modelTsb, - Map logicWiresPerPin) - { - ReadEnd in = logicWiresPerPin.get(modelTsb.getPin("IN")).createReadOnlyEnd(); - ReadEnd enable = logicWiresPerPin.get(modelTsb.getPin("EN")).createReadOnlyEnd(); - ReadWriteEnd out = logicWiresPerPin.get(modelTsb.getPin("OUT")).createReadWriteEnd(); - new CoreTriStateBuffer(timeline, params.gateProcessTime, in, out, enable); - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java deleted file mode 100644 index 3a2623ed..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.io.InputStream; - -public abstract class ClassLoaderBasedResourceLoader implements ResourceLoader -{ - @Override - public InputStream loadResource(String path) throws IOException - { - return getClassLoader().getResourceAsStream(path); - } - - @Override - public Class loadClass(String name) throws ClassNotFoundException - { - return ReflectionHelper.tryInvokeStaticInitializer(name, getClassLoader()); - } - - public abstract ClassLoader getClassLoader(); - - public static ClassLoaderBasedResourceLoader create(ClassLoader loader) - { - return new ClassLoaderBasedResourceLoader() - { - @Override - public ClassLoader getClassLoader() - { - return loader; - } - }; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java deleted file mode 100644 index 8e4d459c..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.Renderer; - -public class DeserializedSubmodelComponent extends SubmodelComponent -{ - /** - * If a DeserializedSubmodelComponent is part of another SubmodelComponent, when it it serialized, it should not return its internal - * structure, but rather the component ID used to create it. - * - * @see SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) - * SubmodelComponentSerializer.deserialize(...) - * @see SubmodelComponentSerializer#serialize(SubmodelComponent, java.util.function.Function) SubmodelComponentSerializer.serialize(...) - */ - public final String idForSerializingOverride; - /** - * See {@link #idForSerializingOverride} - */ - public final Object paramsForSerializingOverride; - - public DeserializedSubmodelComponent(LogicModelModifiable model, String name, String idForSerializingOverride, - Object paramsForSerializingOverride) - { - super(model, name, false); - this.idForSerializingOverride = idForSerializingOverride; - this.paramsForSerializingOverride = paramsForSerializingOverride; - init(); - } - - /** - * If this component has an {@link #idForSerializingOverride} set (e.g. non-null) (see - * {@link SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) - * SubmodelComponentSerializer.deserialize(...)}), this ID is returned
- * If this case doesn't apply (this component has no {@link #idForSerializingOverride} set), - * {@link SubmodelComponent#getIDForSerializing(IdentifyParams)} is invoced. - */ - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return idForSerializingOverride == null ? super.getIDForSerializing(idParams) : idForSerializingOverride; - } - - /** - * If this component has an {@link #idForSerializingOverride} set (e.g. non-null) (see - * {@link SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) - * SubmodelComponentSerializer.deserialize(...)}), {@link #paramsForSerializingOverride} is returned
- * If this case doesn't apply (this component has no {@link #idForSerializingOverride} set), - * {@link SubmodelComponent#getParamsForSerializing(IdentifyParams)} is invoced. - */ - @Override - public Object getParamsForSerializing(IdentifyParams idParams) - { - return idForSerializingOverride == null ? super.getParamsForSerializing(idParams) : paramsForSerializingOverride; - } - - @Override - public void setSymbolRenderer(Renderer symbolRenderer) - { - super.setSymbolRenderer(symbolRenderer); - } - - @Override - public void setOutlineRenderer(Renderer outlineRenderer) - { - super.setOutlineRenderer(outlineRenderer); - } - - @Override - public void setHighLevelStateHandler(HighLevelStateHandler handler) - { - super.setHighLevelStateHandler(handler); - } - - public LogicModelModifiable getSubmodelModifiable() - { - return submodelModifiable; - } - - @Override - public void setSubmodelScale(double submodelScale) - { - super.setSubmodelScale(submodelScale); - } - - @Override - public void setSize(double width, double height) - { - super.setSize(width, height); - } - - @Override - public Pin addSubmodelInterface(MovablePin supermodelPin) - { - return super.addSubmodelInterface(supermodelPin); - } - - @Override - public void removeSubmodelInterface(String name) - { - super.removeSubmodelInterface(name); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java deleted file mode 100644 index bf6cf617..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.logic.model.serializing; - -public class IdentifyParams -{ - // maybe we find something to put here... -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java deleted file mode 100644 index c149848a..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java +++ /dev/null @@ -1,226 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.io.InputStream; -import java.io.UncheckedIOException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonObject; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.logic.model.util.Version; - -public class IndirectModelComponentCreator -{ - public static final Version CURRENT_STD_ID_MAPPING_VERSION = Version.parseSemver("0.1.0"); - - private static final Map standardComponentIDs = new HashMap<>(); - private static final Map standardComponentIDsUnmodifiable = Collections.unmodifiableMap(standardComponentIDs); - - private static final Map componentSuppliers = new HashMap<>(); - private static final Map resourceLoaders = new HashMap<>(); - private static final Map componentCache = new HashMap<>(); - - private static final ResourceLoader defaultResourceLoader; - static - { - defaultResourceLoader = ClassLoaderBasedResourceLoader.create(IndirectModelComponentCreator.class.getClassLoader()); - loadStandardComponentIDs(IndirectModelComponentCreator.class.getResourceAsStream("standardComponentIDMapping.json")); - } - - public static void loadStandardComponentIDs(InputStream standardComponentIdMappingStream) - { - try (InputStream s = standardComponentIdMappingStream) - { - if (s == null) - throw new IOException("Resource not found"); - Map tmp = JsonHandler.readJson(s, StandardComponentIdMappingContainer.class).getMap(); - // don't use putAll to apply sanity checks - tmp.forEach((st, id) -> - { - try - { - addStandardComponentID(st, id); - } - catch (IllegalArgumentException e) - { - System.err.println("Component ID mapping contained illegal entry: " + e.getMessage()); - } - }); - } - catch (IOException e) - { - System.err.println("Failed to initialize standard snippet ID mapping: " + e.getMessage()); - } - } - - public static void addStandardComponentID(String standardComponentID, String associatedComponentID) - { - if (!checkIDIsValidResolvedID(associatedComponentID)) - throw new IllegalArgumentException("Unrecognized component ID format: " + associatedComponentID); - standardComponentIDs.put(standardComponentID, associatedComponentID); - } - - public static Map getStandardComponentIDs() - { - return standardComponentIDsUnmodifiable; - } - - public static void setComponentSupplier(String id, ComponentSupplier componentSupplier) - { - componentSuppliers.put(id, componentSupplier); - } - - public static ModelComponent createComponent(LogicModelModifiable model, String id) - { - return createComponent(model, id, (String) null); - } - - public static ModelComponent createComponent(LogicModelModifiable model, String id, String name) - { - return createComponent(model, id, JsonNull.INSTANCE, name); - } - - public static ModelComponent createComponent(LogicModelModifiable model, String id, JsonElement params) - { - return createComponent(model, id, params, null); - } - - public static ModelComponent createComponent(LogicModelModifiable model, String id, JsonElement params, String name) - { - if (id == null) - throw new NullPointerException("Component ID is null"); - if (componentCache.containsKey(id)) - return loadComponentFromJsonObject(model, id, name, componentCache.get(id)); - String resolvedID = resolveID(id); - if (resolvedID == null) - throw new IllegalArgumentException("Unknown standard ID or illegal resolved ID: " + id); - String[] parts = resolvedID.split(":"); - String firstPart = parts[0]; - if (firstPart.equals("jsonfile")) - { - JsonObject jsonContents; - try - { - // don't use parts[1], because the path could contain ':' - jsonContents = JsonHandler.readJson(resolvedID.substring("jsonfile:".length()), JsonObject.class); - } - catch (IOException e) - { - throw new UncheckedIOException("Error loading JSON file", e); - } - return loadComponentFromJsonObject(model, id, name, jsonContents); - } - ResourceLoader loader; - String resTypeID; - String resID; - if (firstPart.equals("resloader")) - { - String loaderID = parts[1]; - loader = resourceLoaders.get(loaderID); - if (loader == null) - tryLoadResourceLoader(loaderID); - loader = resourceLoaders.get(loaderID); - if (loader == null) - throw new IllegalArgumentException( - "Unknown resource loader: " + loaderID + " (but class was found. Probably the static initializer is missing)"); - resTypeID = parts[2]; - resID = parts[3]; - } else - { - loader = defaultResourceLoader; - resTypeID = parts[0]; - resID = parts[1]; - } - if (resTypeID.equals("jsonres")) - { - JsonObject jsonContents; - try - { - @SuppressWarnings("resource") // jsonStream is closed in JsonHandler - InputStream jsonStream = Objects.requireNonNull(loader.loadResource(resID), "Error loading JSON resource: Not found"); - jsonContents = JsonHandler.readJson(jsonStream, JsonObject.class); - } - catch (IOException e) - { - throw new UncheckedIOException("Error loading JSON resource", e); - } - return loadComponentFromJsonObject(model, id, name, jsonContents); - } else if (resTypeID.equals("class")) - { - ComponentSupplier componentSupplier = componentSuppliers.get(resID); - if (componentSupplier == null) - try - { - loader.loadClass(resID); - } - catch (@SuppressWarnings("unused") ClassNotFoundException e) - { - throw new IllegalArgumentException("Unknown component supplier: " + resID); - } - componentSupplier = componentSuppliers.get(resID); - if (componentSupplier == null) - throw new IllegalArgumentException( - "Unknown component supplier: " + resID + " (but class was found. Probably the static initializer is missing)"); - return componentSupplier.create(model, params, name); - } else - throw new IllegalStateException("Unknown resource type ID: " + resTypeID); - } - - public static String resolveID(String id) - { - if (checkIDIsValidResolvedID(id)) - return id; - return standardComponentIDs.get(id); - } - - private static boolean checkIDIsValidResolvedID(String id) - { - return id.matches("jsonfile:(.+)|(resloader:([^:]+):)?(jsonres|class):[^:]+"); - } - - private static SubmodelComponent loadComponentFromJsonObject(LogicModelModifiable model, String id, String name, - JsonObject jsonContents) - { - componentCache.putIfAbsent(id, jsonContents); - SerializablePojo jsonContentsAsSerializablePojo = JsonHandler.parser.fromJson(jsonContents, SerializablePojo.class); - if (jsonContentsAsSerializablePojo.version == null) - return LegacySubmodelComponentSerializer.deserialize(model, - JsonHandler.parser.fromJson(jsonContents, LegacySubmodelComponentParams.class), name, id, null); - return SubmodelComponentSerializer.deserialize(model, JsonHandler.parser.fromJson(jsonContents, SubmodelComponentParams.class), - name, id, null); - } - - public static void registerResourceLoader(ResourceLoader resourceLoader) - { - registerResourceLoader(resourceLoader, resourceLoader.getClass()); - } - - public static void registerResourceLoader(ResourceLoader resourceLoader, Class reference) - { - resourceLoaders.put(reference.getName(), Objects.requireNonNull(resourceLoader)); - } - - public static void registerResourceLoader(ResourceLoader resourceLoader, String reference) - { - resourceLoaders.put(reference, Objects.requireNonNull(resourceLoader)); - } - - private static void tryLoadResourceLoader(String loaderClassName) - { - ReflectionHelper.tryInvokeStaticInitializer(loaderClassName, "Error loading resoruce loader %s: %s\n"); - } - - public static interface ComponentSupplier - { - public ModelComponent create(LogicModelModifiable model, JsonElement params, String name); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java deleted file mode 100644 index 32d9f941..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.util.JsonHandler; - -public interface JSONSerializable -{ - public String getIDForSerializing(IdentifyParams idParams); - - public Object getParamsForSerializing(IdentifyParams idParams); - - public default JsonElement getParamsForSerializingJSON(IdentifyParams idParams) - { - return JsonHandler.toJsonTree(getParamsForSerializing(idParams)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java deleted file mode 100644 index c21fa866..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; - -import com.google.gson.JsonElement; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.util.JsonHandler; - -/** - * This class contains all the information necessary to create a new {@link SubmodelComponent} - */ -public class LegacySubmodelComponentParams -{ - // basic stuff - public double width, height; - public LegacyInterfacePinParams[] interfacePins; - public LegacySubmodelParameters submodel; - - // functionality that needs to be expressed in Java code - public String symbolRendererSnippetID; - public JsonElement symbolRendererParams; - - public String outlineRendererSnippetID; - public JsonElement outlineRendererParams; - - public String highLevelStateHandlerSnippetID; - public JsonElement highLevelStateHandlerParams; - - public static class LegacyInterfacePinParams - { - public Point location; - public String name; - public int logicWidth; - } - - public static class LegacySubmodelParameters - { - public double innerScale; - public LegacyInnerComponentParams[] subComps; - public LegacyInnerWireParams[] innerWires; - - public static class LegacyInnerComponentParams - { - public String id; - public String name; - public Point pos; - public JsonElement params; - } - - public static class LegacyInnerWireParams - { - public LegacyInnerPinParams pin1, pin2; - public String name; - public Point[] path; - - public static class LegacyInnerPinParams - { - public String compName; - public String pinName; - } - } - } - - public static LegacySubmodelComponentParams readJson(String path) throws IOException - { - return JsonHandler.readJson(path, LegacySubmodelComponentParams.class); - } - - /** - * Writes this {@link LegacySubmodelComponentParams} object into a file in json format. The correct file extension is important! Check - * {@link LegacySubmodelComponentParams}.fileExtension - */ - public void writeJson(String path) - { - try - { - JsonHandler.writeJson(this, path); - } - catch (IOException e) - { - System.err.println("Failed to write SubComponentParams to file"); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java deleted file mode 100644 index 93fc945e..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java +++ /dev/null @@ -1,305 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; - -import com.google.gson.JsonElement; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacyInterfacePinParams; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerComponentParams; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams; -import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams.LegacyInnerPinParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.logic.model.util.JsonHandler; - -/** - * Creates {@link SubmodelComponent}s from {@link LegacySubmodelComponentParams} - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ -public final class LegacySubmodelComponentSerializer -{ - // convenience methods - - /** - * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams)}, but first reading the - * {@link LegacySubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class)); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, JsonElement)}, but first reading the - * {@link LegacySubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), idForSerializingOverride, - paramsForSerializingOverride); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String)}, but first reading the - * {@link LegacySubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)}, but first reading the - * {@link LegacySubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name, idForSerializingOverride, - paramsForSerializingOverride); - } - - /** - * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no - * idForSerializingOverride set and using the default name. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params) - { - return deserialize(model, params, null, null, null); - } - - /** - * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} using the default name. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, - String idForSerializingOverride, JsonElement paramsForSerializingOverride) - { - return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride); - } - - /** - * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no - * idForSerializingOverride set. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name) - { - return deserialize(model, params, name, null, null); - } - - /** - * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link LegacySubmodelComponentParams} they are - * written to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(SubmodelComponent comp, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(comp), targetPath); - } - - /** - * Like {@link #serialize(SubmodelComponent, Function)}, but instead of returning the generated {@link LegacySubmodelComponentParams} - * they are written to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(comp, idParams), targetPath); - } - - /** - * {@link #serialize(SubmodelComponent, Function)} using the default {@link IdentifyParams} (see IdentifyParams's - * {@link IdentifyParams#IdentifyParams() default constructor}) - * - * @author Daniel Kirschten - */ - public static LegacySubmodelComponentParams serialize(SubmodelComponent comp) - { - return serialize(comp, new IdentifyParams()); - } - - // "core" methods - /** - * Creates a {@link SubmodelComponent} from the specified {@link LegacySubmodelComponentParams} with the given name. - *

- * When serializing a SubmodelComponent, it is undesired for every subcomponent to be serialized with its complete inner - * structure. Instead, these sub-SubmodelComponents should be serialized with the ID and params which were used to - * determine the SubmodelComponentParams defining the sub-SubmodelComponent. Because of this, it is possible - * to override the ID and params used in {@link #serialize(SubmodelComponent, Function) serialize(...)} to describe this subcomponent. - * See there for details. - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - @SuppressWarnings("unused") // for ModelWire being created - public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name, - String idForSerializingOverride, JsonElement paramsForSerializingOverride) - { - DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, - paramsForSerializingOverride); - comp.setSubmodelScale(params.submodel.innerScale); - comp.setSize(params.width, params.height); - for (LegacyInterfacePinParams iPinParams : params.interfacePins) - // TRISTATE because we don't have a better choice - comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, PinUsage.TRISTATE, - iPinParams.location.x, iPinParams.location.y)); - LegacySubmodelParameters submodelParams = params.submodel; - LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); - Map componentsByName = submodelModifiable.getComponentsByName(); - ModelComponent[] components = new ModelComponent[submodelParams.subComps.length]; - for (int i = 0; i < components.length; i++) - { - LegacyInnerComponentParams cParams = submodelParams.subComps[i]; - components[i] = IndirectModelComponentCreator.createComponent(submodelModifiable, cParams.id, cParams.params, cParams.name); - components[i].moveTo(cParams.pos.x, cParams.pos.y); - } - - for (int i = 0; i < submodelParams.innerWires.length; i++) - { - LegacyInnerWireParams innerWire = submodelParams.innerWires[i]; - new ModelWire(submodelModifiable, innerWire.name, componentsByName.get(innerWire.pin1.compName).getPin(innerWire.pin1.pinName), - componentsByName.get(innerWire.pin2.compName).getPin(innerWire.pin2.pinName), innerWire.path); - } - comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) - .create(comp, params.symbolRendererParams)); - comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier - .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams)); - comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier - .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams)); - return comp; - } - - /** - * Returns {@link LegacySubmodelComponentParams}, which describe this {@link SubmodelComponent}.
- * Subcomponents are serialized in the following way:
- * If a subcomponent is a SubmodelComponent which has been deserialized, and it has an - * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set (e.g. non-null; see - * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement) deserialize(...)}), this ID and - * the component's {@link DeserializedSubmodelComponent#paramsForSerializingOverride paramsForSerializingOverride} are written.
- * If this case doesn't apply (e.g. if the subcomponent is not a SubmodelComponent; or it is a - * SubmodelComponent, but hasn't been deserialized; or it has no - * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set), the ID defined by idGetter - * and the params obtained by {@link ModelComponent#getParamsForSerializing() getParams()} are written.
- * CodeSnippets are serialized using the ID defined by idGetter and the params obtained by the respective - * getParamsForSerializing methods ({@link Renderer#getParamsForSerializing()}). - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - public static LegacySubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams) - { - LegacySubmodelParameters submodelParams = new LegacySubmodelParameters(); - submodelParams.innerScale = comp.getSubmodelScale(); - - Map components = new HashMap<>(comp.submodel.getComponentsByName()); - components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME); - LegacyInnerComponentParams[] componentParams = new LegacyInnerComponentParams[components.size()]; - int i1 = 0; - for (ModelComponent innerComponent : components.values()) - { - LegacyInnerComponentParams innerComponentParams = new LegacyInnerComponentParams(); - componentParams[i1] = innerComponentParams; - innerComponentParams.pos = new Point(innerComponent.getPosX(), innerComponent.getPosY()); - innerComponentParams.id = innerComponent.getIDForSerializing(idParams); - innerComponentParams.params = innerComponent.getParamsForSerializingJSON(idParams); - innerComponentParams.name = innerComponent.getName(); - i1++; - } - submodelParams.subComps = componentParams; - - Collection wires = comp.submodel.getWiresByName().values(); - LegacyInnerWireParams wireParams[] = new LegacyInnerWireParams[wires.size()]; - i1 = 0; - for (ModelWire innerWire : wires) - { - LegacyInnerWireParams innerWireParams = new LegacyInnerWireParams(); - wireParams[i1] = innerWireParams; - LegacyInnerPinParams pin1Params = new LegacyInnerPinParams(), pin2Params = new LegacyInnerPinParams(); - - pin1Params.pinName = innerWire.getPin1().name; - pin1Params.compName = innerWire.getPin1().component.getName(); - pin2Params.pinName = innerWire.getPin2().name; - pin2Params.compName = innerWire.getPin2().component.getName(); - innerWireParams.name = innerWire.name; - innerWireParams.pin1 = pin1Params; - innerWireParams.pin2 = pin2Params; - innerWireParams.path = innerWire.getPath(); - i1++; - } - submodelParams.innerWires = wireParams; - - LegacySubmodelComponentParams params = new LegacySubmodelComponentParams(); - params.submodel = submodelParams; - - params.width = comp.getWidth(); - params.height = comp.getHeight(); - - LegacyInterfacePinParams[] iPins = new LegacyInterfacePinParams[comp.getPins().size()]; - int i = 0; - for (Pin p : comp.getPins().values()) - { - LegacyInterfacePinParams iPinParams = new LegacyInterfacePinParams(); - iPins[i] = iPinParams; - iPinParams.location = p.getRelPos(); - iPinParams.name = p.name; - iPinParams.logicWidth = p.logicWidth; - i++; - } - params.interfacePins = iPins; - - Renderer symbolRenderer = comp.getSymbolRenderer(); - if (symbolRenderer != null) - { - params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams); - params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams); - } - - Renderer outlineRenderer = comp.getOutlineRenderer(); - if (outlineRenderer != null) - { - params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams); - params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams); - } - - HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler(); - if (highLevelStateHandler != null) - { - params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams); - params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams); - } - - return params; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java deleted file mode 100644 index 187d82c5..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import com.google.gson.JsonElement; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.util.Version; - -public class LogicModelParams extends SerializablePojo -{ - public ComponentParams[] components; - public WireParams[] wires; - - public LogicModelParams(Version version) - { - super(version); - } - - public static class ComponentParams - { - public String id; - public String name; - public Point pos; - public JsonElement params; - } - - public static class WireParams - { - public PinParams pin1, pin2; - public String name; - public Point[] path; - - public static class PinParams - { - public String compName; - public String pinName; - } - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java deleted file mode 100644 index 97b84ce3..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java +++ /dev/null @@ -1,172 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.LogicModel; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.LogicModelParams.ComponentParams; -import net.mograsim.logic.model.serializing.LogicModelParams.WireParams; -import net.mograsim.logic.model.serializing.LogicModelParams.WireParams.PinParams; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.logic.model.util.Version; - -public class LogicModelSerializer -{ - public static final Version CURRENT_JSON_VERSION = Version.parseSemver("0.1.1"); - - // convenience methods - /** - * Like {@link #deserialize(LogicModelParams)}, but first reading the {@link LogicModelParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static LogicModelModifiable deserialize(String sourcePath) throws IOException - { - return deserialize(JsonHandler.readJson(sourcePath, LogicModelParams.class)); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LogicModelParams)}, but first reading the {@link LogicModelParams} from the given file - * path. - * - * @author Daniel Kirschten - */ - public static void deserialize(LogicModelModifiable model, String sourcePath) throws IOException - { - deserialize(model, JsonHandler.readJson(sourcePath, LogicModelParams.class)); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, LogicModelParams)}, but using a newly created {@link LogicModelModifiable}. - * - * @author Daniel Kirschten - */ - public static LogicModelModifiable deserialize(LogicModelParams params) - { - LogicModelModifiable model = new LogicModelModifiable(); - deserialize(model, params); - return model; - } - - /** - * Like {@link #serialize(LogicModel)}, but instead of returning the generated {@link LogicModelParams} they are written to a file at - * the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(LogicModel model, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(model), targetPath); - } - - /** - * Like {@link #serialize(LogicModel, IdentifyParams)}, but instead of returning the generated {@link LogicModelParams} they are written - * to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(LogicModel model, IdentifyParams idParams, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(model, idParams), targetPath); - } - - /** - * {@link #serialize(LogicModel, IdentifyParams)} using the default {@link IdentifyParams} (see IdentifyParams's - * {@link IdentifyParams#IdentifyParams() default constructor}) - * - * @author Daniel Kirschten - */ - public static LogicModelParams serialize(LogicModel model) - { - return serialize(model, new IdentifyParams()); - } - - // "core" methods - /** - * Deserializes components and wires from the specified {@link LogicModelParams} and adds them to the given - * {@link LogicModelModifiable}. - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - @SuppressWarnings("unused") // for ModelWire being created - public static void deserialize(LogicModelModifiable model, LogicModelParams params) - { - Map componentsByName = model.getComponentsByName(); - ModelComponent[] components = new ModelComponent[params.components.length]; - for (int i = 0; i < components.length; i++) - { - ComponentParams compParams = params.components[i]; - components[i] = IndirectModelComponentCreator.createComponent(model, compParams.id, compParams.params, compParams.name); - components[i].moveTo(compParams.pos.x, compParams.pos.y); - } - - for (int i = 0; i < params.wires.length; i++) - { - WireParams wire = params.wires[i]; - new ModelWire(model, wire.name, componentsByName.get(wire.pin1.compName).getPin(wire.pin1.pinName), - componentsByName.get(wire.pin2.compName).getPin(wire.pin2.pinName), wire.path); - } - } - - /** - * Returns {@link LogicModelModifiable}, which describe the components and wires in the given {@link LogicModel}.
- * Components are serialized using {@link ModelComponent#getIDForSerializing(IdentifyParams)} and - * {@link ModelComponent#getParamsForSerializingJSON(IdentifyParams)}
- * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - public static LogicModelParams serialize(LogicModel model, IdentifyParams idParams) - { - LogicModelParams modelParams = new LogicModelParams(CURRENT_JSON_VERSION); - - Map components = new HashMap<>(model.getComponentsByName()); - components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME); - Set componentsParams = new HashSet<>(); - for (ModelComponent component : components.values()) - { - ComponentParams compParams = new ComponentParams(); - componentsParams.add(compParams); - compParams.pos = new Point(component.getPosX(), component.getPosY()); - compParams.id = component.getIDForSerializing(idParams); - compParams.params = component.getParamsForSerializingJSON(idParams); - compParams.name = component.getName(); - } - modelParams.components = componentsParams.toArray(ComponentParams[]::new); - Arrays.sort(modelParams.components, Comparator.comparing(c -> c.name)); - - Collection wires = model.getWiresByName().values(); - Set wiresParams = new HashSet<>(); - for (ModelWire innerWire : wires) - { - WireParams innerWireParams = new WireParams(); - wiresParams.add(innerWireParams); - PinParams pin1Params = new PinParams(), pin2Params = new PinParams(); - - pin1Params.pinName = innerWire.getPin1().name; - pin1Params.compName = innerWire.getPin1().component.getName(); - pin2Params.pinName = innerWire.getPin2().name; - pin2Params.compName = innerWire.getPin2().component.getName(); - innerWireParams.name = innerWire.name; - innerWireParams.pin1 = pin1Params; - innerWireParams.pin2 = pin2Params; - innerWireParams.path = innerWire.getPath(); - } - modelParams.wires = wiresParams.toArray(WireParams[]::new); - Arrays.sort(modelParams.wires, Comparator.comparing(c -> c.name)); - - return modelParams; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java deleted file mode 100644 index 1a6a66a4..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.logic.model.serializing; - -public class ReflectionHelper -{ - private ReflectionHelper() - { - } - - public static Class tryInvokeStaticInitializer(String className, String errorMessageFormat) - { - return tryInvokeStaticInitializer(className, errorMessageFormat, ReflectionHelper.class.getClassLoader()); - } - - public static Class tryInvokeStaticInitializer(String className, String errorMessageFormat, ClassLoader classLoader) - { - try - { - return tryInvokeStaticInitializer(className, classLoader); - } - catch (ClassNotFoundException e) - { - System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage()); - return null; - } - } - - public static Class tryInvokeStaticInitializer(String className) throws ClassNotFoundException - { - return tryInvokeStaticInitializer(className, ReflectionHelper.class.getClassLoader()); - } - - public static Class tryInvokeStaticInitializer(String className, ClassLoader classLoader) throws ClassNotFoundException - { - return Class.forName(className, true, classLoader); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java deleted file mode 100644 index f15b475e..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.io.InputStream; - -import net.mograsim.logic.model.model.components.ModelComponent; - -/** - * For loading JSON {@link ModelComponent}s from other OSGI-Modules or jar-Files. - */ -public interface ResourceLoader -{ - InputStream loadResource(String path) throws IOException; - - Class loadClass(String name) throws ClassNotFoundException; -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java deleted file mode 100644 index 4cc94d76..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import net.mograsim.logic.model.util.Version; - -/** - * This class is the superclass of all POJOs that can be serialized to JSON. - * - * @author Daniel Kirschten - * - */ -public class SerializablePojo -{ - public Version version; - - public SerializablePojo(Version version) - { - this.version = version; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java deleted file mode 100644 index 9467200f..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.util.Map; - -import net.mograsim.logic.model.util.Version; - -public class StandardComponentIdMappingContainer extends SerializablePojo -{ - public Map map; - - public StandardComponentIdMappingContainer(Version version) - { - super(version); - } - - public Map getMap() - { - return map; - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java deleted file mode 100644 index 97b3c7c1..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import com.google.gson.JsonElement; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.util.Version; - -/** - * This class contains all the information necessary to create a new {@link SubmodelComponent} - */ -public class SubmodelComponentParams extends SerializablePojo -{ - // basic stuff - public double width, height; - public InterfacePinParams[] interfacePins; - public double innerScale; - public LogicModelParams submodel; - - // functionality that needs to be expressed in Java code - public String symbolRendererSnippetID; - public JsonElement symbolRendererParams; - - public String outlineRendererSnippetID; - public JsonElement outlineRendererParams; - - public String highLevelStateHandlerSnippetID; - public JsonElement highLevelStateHandlerParams; - - public SubmodelComponentParams(Version version) - { - super(version); - } - - public static class InterfacePinParams - { - public Point location; - public String name; - public int logicWidth; - public PinUsage usage; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java deleted file mode 100644 index cf139885..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java +++ /dev/null @@ -1,245 +0,0 @@ -package net.mograsim.logic.model.serializing; - -import java.io.IOException; -import java.util.Arrays; -import java.util.Comparator; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.MovablePin; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.logic.model.serializing.SubmodelComponentParams.InterfacePinParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.logic.model.util.JsonHandler; -import net.mograsim.logic.model.util.Version; - -/** - * Creates {@link SubmodelComponent}s from {@link SubmodelComponentParams} - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ -public final class SubmodelComponentSerializer -{ - public static final Version JSON_VERSION_CURRENT_SERIALIZING = Version.parseSemver("0.1.5"); - public static final Version JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING = Version.parseSemver("0.1.5"); - public static final Version JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED = Version.parseSemver("0.1.5"); - // convenience methods - - /** - * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams)}, but first reading the {@link SubmodelComponentParams} from - * the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class)); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, JsonElement)}, but first reading the - * {@link SubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), idForSerializingOverride, - paramsForSerializingOverride); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String)}, but first reading the - * {@link SubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), name); - } - - /** - * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)}, but first reading the - * {@link SubmodelComponentParams} from the given file path. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) throws IOException - { - return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), name, idForSerializingOverride, - paramsForSerializingOverride); - } - - /** - * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} with no - * idForSerializingOverride set and using the default name. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params) - { - return deserialize(model, params, null, null, null); - } - - /** - * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} using the default name. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String idForSerializingOverride, - JsonElement paramsForSerializingOverride) - { - return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride); - } - - /** - * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} with no - * idForSerializingOverride set. - * - * @author Daniel Kirschten - */ - public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String name) - { - return deserialize(model, params, name, null, null); - } - - /** - * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link SubmodelComponentParams} they are written - * to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(SubmodelComponent comp, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(comp), targetPath); - } - - /** - * Like {@link #serialize(SubmodelComponent, IdentifyParams)}, but instead of returning the generated {@link SubmodelComponentParams} - * they are written to a file at the given path. - * - * @author Daniel Kirschten - */ - public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException - { - JsonHandler.writeJson(serialize(comp, idParams), targetPath); - } - - /** - * {@link #serialize(SubmodelComponent, IdentifyParams)} using the default {@link IdentifyParams} (see IdentifyParams's - * {@link IdentifyParams#IdentifyParams() default constructor}) - * - * @author Daniel Kirschten - */ - public static SubmodelComponentParams serialize(SubmodelComponent comp) - { - return serialize(comp, new IdentifyParams()); - } - - // "core" methods - /** - * Creates a {@link SubmodelComponent} from the specified {@link SubmodelComponentParams} with the given name. - *

- * When serializing a SubmodelComponent, it is undesired for every subcomponent to be serialized with its complete inner - * structure. Instead, these sub-SubmodelComponents should be serialized with the ID and params which were used to - * determine the SubmodelComponentParams defining the sub-SubmodelComponent. Because of this, it is possible - * to override the ID and params used in {@link #serialize(SubmodelComponent, IdentifyParams) serialize(...)} to describe this - * subcomponent. See there for details. - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - @SuppressWarnings("unused") // for ModelWire being created - public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String name, - String idForSerializingOverride, JsonElement paramsForSerializingOverride) - { - Version version = params.version; - if (version.compareTo(JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING) > 0) - throw new IllegalArgumentException("JSON version " + version + " not supported yet"); - boolean hasUsageSerialized = version.compareTo(JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED) >= 0; - DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, - paramsForSerializingOverride); - comp.setSubmodelScale(params.innerScale); - comp.setSize(params.width, params.height); - for (InterfacePinParams iPinParams : params.interfacePins) - // TRISTATE because we don't have a better choice - comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, - hasUsageSerialized ? iPinParams.usage : PinUsage.TRISTATE, iPinParams.location.x, iPinParams.location.y)); - LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); - LogicModelSerializer.deserialize(comp.getSubmodelModifiable(), params.submodel); - comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) - .create(comp, params.symbolRendererParams)); - comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier - .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams)); - comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier - .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams)); - return comp; - } - - /** - * Returns {@link SubmodelComponentParams}, which describe this {@link SubmodelComponent}.
- * See {@link LogicModelSerializer#serialize(net.mograsim.logic.model.model.LogicModel, IdentifierGetter) - * LogicModelSerializer.serialize(...)} for how subcomponents are serialized.
- * CodeSnippets are serialized using the ID defined by idGetter and the params obtained by the respective - * getParamsForSerializing methods ({@link Renderer#getParamsForSerializing()}). - * - * @author Fabian Stemmler - * @author Daniel Kirschten - */ - public static SubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams) - { - SubmodelComponentParams params = new SubmodelComponentParams(JSON_VERSION_CURRENT_SERIALIZING); - params.innerScale = comp.getSubmodelScale(); - params.submodel = LogicModelSerializer.serialize(comp.submodel, idParams); - - params.width = comp.getWidth(); - params.height = comp.getHeight(); - - InterfacePinParams[] iPins = new InterfacePinParams[comp.getPins().size()]; - int i = 0; - for (Pin p : comp.getPins().values()) - { - InterfacePinParams iPinParams = new InterfacePinParams(); - iPins[i] = iPinParams; - iPinParams.location = p.getRelPos(); - iPinParams.name = p.name; - iPinParams.logicWidth = p.logicWidth; - iPinParams.usage = p.usage; - i++; - } - params.interfacePins = iPins; - Arrays.sort(params.interfacePins, Comparator.comparing(p -> p.name)); - - Renderer symbolRenderer = comp.getSymbolRenderer(); - if (symbolRenderer != null) - { - params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams); - params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams); - } - - Renderer outlineRenderer = comp.getOutlineRenderer(); - if (outlineRenderer != null) - { - params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams); - params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams); - } - - HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler(); - if (highLevelStateHandler != null) - { - params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams); - params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams); - } - - return params; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json b/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json deleted file mode 100644 index b0b8bedd..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "0.1.0", - "map": { - "AndGate": "class:net.mograsim.logic.model.model.components.atomic.ModelAndGate", - "BitDisplay": "class:net.mograsim.logic.model.model.components.atomic.ModelBitDisplay", - "Clock": "class:net.mograsim.logic.model.model.components.atomic.ModelClock", - "FixedOutput": "class:net.mograsim.logic.model.model.components.atomic.ModelFixedOutput", - "ManualSwitch": "class:net.mograsim.logic.model.model.components.atomic.ModelManualSwitch", - "Merger": "class:net.mograsim.logic.model.model.components.atomic.ModelMerger", - "NandGate": "class:net.mograsim.logic.model.model.components.atomic.ModelNandGate", - "OrGate": "class:net.mograsim.logic.model.model.components.atomic.ModelOrGate", - "Splitter": "class:net.mograsim.logic.model.model.components.atomic.ModelSplitter", - "TriStateBuffer": "class:net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer", - "TextComponent": "class:net.mograsim.logic.model.model.components.atomic.ModelTextComponent", - "WireCrossPoint": "class:net.mograsim.logic.model.model.wires.ModelWireCrossPoint" - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java deleted file mode 100644 index 22ebc090..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import net.mograsim.logic.model.serializing.ReflectionHelper; - -public class CodeSnippetSupplier -{ - private final Map standardSnippetIDClassNames = new HashMap<>(); - private final Map standardSnippetIDClassNamesUnmodifiable = Collections.unmodifiableMap(standardSnippetIDClassNames); - private final Map> snippetSuppliersForClassNames = new HashMap<>(); - private final SnippetDefinintion defaultSnippetSupplier; - - public CodeSnippetSupplier(SnippetDefinintion defaultSnippetSupplier) - { - this.defaultSnippetSupplier = defaultSnippetSupplier; - } - - public void addStandardSnippetID(String standardSnippetID, String associatedSnippetID) - { - if (!associatedSnippetID.startsWith("class:")) - throw new IllegalArgumentException("Unrecognized snippet ID format: " + associatedSnippetID); - standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetID); - } - - public Map getStandardSnippetIDs() - { - return standardSnippetIDClassNamesUnmodifiable; - } - - public void setSnippetSupplier(String id, SnippetDefinintion snippetSupplier) - { - snippetSuppliersForClassNames.put(id, snippetSupplier); - } - - // TODO report errors - public SnippetDefinintion getSnippetSupplier(String id) - { - if (id != null) - { - String resolvedID = resolveID(id); - if (resolvedID != null) - { - String snippetClassName = resolvedID.substring(6); - tryLoadSnippetClass(snippetClassName); - SnippetDefinintion snippetSupplier = snippetSuppliersForClassNames.get(snippetClassName); - if (snippetSupplier != null) - return snippetSupplier; - } - System.err.println("Couldn't load snippet " + id + "; using default"); - } - if (defaultSnippetSupplier == null) - throw new IllegalArgumentException("No default snippet set"); - return defaultSnippetSupplier; - } - - public String resolveID(String id) - { - if (id.startsWith("class:")) - return id; - return standardSnippetIDClassNames.get(id); - } - - // static helpers - - private static void tryLoadSnippetClass(String snippetClassName) - { - ReflectionHelper.tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n"); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java deleted file mode 100644 index 622df00b..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.JSONSerializable; - -/** - * A high level state ID consists of parts separated by dots ('.').
- * The last part (the part after the last dot) is called "atomic high level state ID". The parts before that part are called "subcomponent - * ID"s.
- * If there is no dot in a high level state ID, the whole high level state ID is called atomic.
- * Note that subcomponent IDs don't have to correspond to actual subcomponents. For example, a RAM component may supply subcomponent IDs - * "c0000", "c0001" ... "cFFFF" without actually having a subcomponent for each cell. It also is allowed to delegate an atomic high level - * state ID to a subcomponent. - * - * @author Daniel Kirschten - */ -public interface HighLevelStateHandler extends JSONSerializable -{ - /** - * Gets the current value of the given high-level state.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #setHighLevelState(String, Object) - * @see ModelComponent#getHighLevelState(String) - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(String stateID); - - /** - * Sets the given high-level state to the given value.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @see #getHighLevelState(String) - * @see ModelComponent#setHighLevelState(String, Object) - * - * @author Daniel Kirschten - */ - public void setHighLevelState(String stateID, Object newState); - -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java deleted file mode 100644 index 5ed33bdc..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.serializing.JSONSerializable; - -public interface Renderer extends JSONSerializable -{ - public void render(GeneralGC gc, Rectangle visibleRegion); -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java deleted file mode 100644 index c5fecf25..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import java.util.function.BiFunction; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; - -public interface SnippetDefinintion -{ - public Class

getParamClass(); - - public S create(C context, P params); - - public default S create(C context, JsonElement params) - { - Class

paramClass = getParamClass(); - if (paramClass.equals(Void.class)) - { - if (params != null) - throw new IllegalArgumentException("Params given where none were expected"); - return create(context, (P) null); - } - return create(context, new Gson().fromJson(params, getParamClass())); - } - - public static SnippetDefinintion create(Class

paramClass, BiFunction supplier) - { - return new SnippetDefinintion<>() - { - @Override - public Class

getParamClass() - { - return paramClass; - } - - @Override - public S create(C context, P params) - { - return supplier.apply(context, params); - } - }; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java deleted file mode 100644 index 860557fd..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java +++ /dev/null @@ -1,56 +0,0 @@ -package net.mograsim.logic.model.snippets; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer; -import net.mograsim.logic.model.util.JsonHandler; - -public class SubmodelComponentSnippetSuppliers -{ - public static final CodeSnippetSupplier symbolRendererSupplier; - public static final CodeSnippetSupplier outlineRendererSupplier; - public static final CodeSnippetSupplier highLevelStateHandlerSupplier; - - static - { - symbolRendererSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultSymbolRenderer::new)); - outlineRendererSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultOutlineRenderer::new)); - highLevelStateHandlerSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultHighLevelStateHandler::new)); - } - - static - { - try (InputStream s = SubmodelComponentSnippetSuppliers.class.getResourceAsStream("standardSnippetIDMapping.json")) - { - if (s == null) - throw new IOException("Resource not found"); - SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class); - tmp.standardSymbolRendererSuppliers.forEach(symbolRendererSupplier::addStandardSnippetID); - tmp.standardOutlineRendererSuppliers.forEach(outlineRendererSupplier::addStandardSnippetID); - tmp.standardHighLevelStateHandlerSuppliers.forEach(highLevelStateHandlerSupplier::addStandardSnippetID); - } - catch (Exception e) - { - System.err.println("Failed to initialize standard snippet ID mapping:"); - e.printStackTrace(); - } - } - - private static class SnippetIDClassNames - { - public Map standardSymbolRendererSuppliers; - public Map standardOutlineRendererSuppliers; - public Map standardHighLevelStateHandlerSuppliers; - } - - private SubmodelComponentSnippetSuppliers() - { - throw new UnsupportedOperationException(); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java deleted file mode 100644 index 7fd1fc96..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers; - -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; - -public class DefaultHighLevelStateHandler implements HighLevelStateHandler -{ - public DefaultHighLevelStateHandler() - { - this(null); - } - - public DefaultHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - @SuppressWarnings("unused") // we don't need the component; and params are always null - public DefaultHighLevelStateHandler(SubmodelComponent component, Void params) - { - // nothing to do here - } - - @Override - public Object getHighLevelState(String stateID) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "default"; - } - - @Override - public Void getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - static - { - SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier( - DefaultHighLevelStateHandler.class.getCanonicalName(), - SnippetDefinintion.create(Void.class, DefaultHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java deleted file mode 100644 index 58e8e64c..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java +++ /dev/null @@ -1,215 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; -import java.util.TreeMap; -import java.util.function.BiFunction; -import java.util.function.Function; - -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams; - -public class StandardHighLevelStateHandler implements HighLevelStateHandler -{ - private final SubmodelComponent component; - private final Map subcomponentHighLevelStateHandlers; - private final Map subcomponentHighLevelStateHandlersUnmodifiable; - private final Map atomicHighLevelStateHandlers; - private final Map atomicHighLevelStateHandlersUnmodifiable; - - public StandardHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params) - { - this.component = component; - this.subcomponentHighLevelStateHandlers = new HashMap<>(); - this.subcomponentHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(subcomponentHighLevelStateHandlers); - this.atomicHighLevelStateHandlers = new HashMap<>(); - this.atomicHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(atomicHighLevelStateHandlers); - if (params != null) - { - params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState); - params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState); - } - } - - public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID, - SubcomponentHighLevelStateHandlerParams handlerParams) - { - return addSubcomponentHighLevelState(subcomponentStateID, - StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create, - handlerParams.params); - } - - public H addSubcomponentHighLevelState(String subcomponentStateID, - BiFunction handlerConstructor, P handlerParams) - { - return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams)); - } - - public H addSubcomponentHighLevelState(String subcomponentStateID, - Function handlerConstructor) - { - H handler = handlerConstructor.apply(component); - addSubcomponentHighLevelState(subcomponentStateID, handler); - return handler; - } - - public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler) - { - checkHighLevelStateIDPart(subcomponentStateID); - subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler); - } - - public void removeSubcomponentHighLevelState(String subcomponentStateID) - { - checkHighLevelStateIDPart(subcomponentStateID); - subcomponentHighLevelStateHandlers.remove(subcomponentStateID); - } - - public Map getSubcomponentHighLevelStates() - { - return subcomponentHighLevelStateHandlersUnmodifiable; - } - - public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams) - { - return addAtomicHighLevelState(atomicStateID, - StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create, - handlerParams.params); - } - - public H addAtomicHighLevelState(String subcomponentStateID, - BiFunction handlerConstructor, P handlerParams) - { - return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams)); - } - - public H addAtomicHighLevelState(String subcomponentStateID, - Function handlerConstructor) - { - H handler = handlerConstructor.apply(component); - addAtomicHighLevelState(subcomponentStateID, handler); - return handler; - } - - public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler) - { - checkHighLevelStateIDPart(atomicStateID); - atomicHighLevelStateHandlers.put(atomicStateID, handler); - } - - public void removeAtomicHighLevelState(String atomicStateID) - { - checkHighLevelStateIDPart(atomicStateID); - atomicHighLevelStateHandlers.remove(atomicStateID); - } - - public Map getAtomicHighLevelStates() - { - return atomicHighLevelStateHandlersUnmodifiable; - } - - private static void checkHighLevelStateIDPart(String stateIDPart) - { - if (stateIDPart.indexOf('.') != -1) - throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart); - } - - @Override - public Object getHighLevelState(String stateID) - { - int indexOfDot = stateID.indexOf('.'); - if (indexOfDot == -1) - { - AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID); - if (handler != null) - return handler.getHighLevelState(); - } else - { - SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot)); - if (handler != null) - return handler.getHighLevelState(stateID.substring(indexOfDot + 1)); - } - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - - @Override - public void setHighLevelState(String stateID, Object newState) - { - int indexOfDot = stateID.indexOf('.'); - if (indexOfDot == -1) - { - AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID); - if (handler != null) - handler.setHighLevelState(newState); - else - throw new IllegalArgumentException("No high level state with ID " + stateID); - } else - { - SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot)); - if (handler != null) - handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState); - else - throw new IllegalArgumentException("No high level state with ID " + stateID); - } - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "standard"; - } - - @Override - public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams(); - params.subcomponentHighLevelStates = new TreeMap<>(); - params.atomicHighLevelStates = new TreeMap<>(); - for (Entry e : subcomponentHighLevelStateHandlers.entrySet()) - { - String stateID = e.getKey(); - SubcomponentHighLevelStateHandler handler = e.getValue(); - SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams(); - handlerParams.id = handler.getIDForSerializing(idParams); - handlerParams.params = handler.getParamsForSerializingJSON(idParams); - params.subcomponentHighLevelStates.put(stateID, handlerParams); - } - for (Entry e : atomicHighLevelStateHandlers.entrySet()) - { - String stateID = e.getKey(); - AtomicHighLevelStateHandler handler = e.getValue(); - AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams(); - handlerParams.id = handler.getIDForSerializing(idParams); - handlerParams.params = handler.getParamsForSerializingJSON(idParams); - params.atomicHighLevelStates.put(stateID, handlerParams); - } - return params; - } - - public static class StandardHighLevelStateHandlerParams - { - public Map subcomponentHighLevelStates; - public Map atomicHighLevelStates; - } - - static - { - SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier( - StandardHighLevelStateHandler.class.getCanonicalName(), - SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java deleted file mode 100644 index 158adda2..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; - -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.snippets.CodeSnippetSupplier; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler; -import net.mograsim.logic.model.util.JsonHandler; - -public class StandardHighLevelStateHandlerSnippetSuppliers -{ - public static final CodeSnippetSupplier atomicHandlerSupplier; - public static final CodeSnippetSupplier subcomponentHandlerSupplier; - - static - { - atomicHandlerSupplier = new CodeSnippetSupplier<>(null); - subcomponentHandlerSupplier = new CodeSnippetSupplier<>(null); - } - - static - { - try (InputStream s = StandardHighLevelStateHandlerSnippetSuppliers.class.getResourceAsStream("standardSnippetIDMapping.json")) - { - if (s == null) - throw new IOException("Resource not found"); - SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class); - tmp.standardSubcomponentHandlerSuppliers.forEach(subcomponentHandlerSupplier::addStandardSnippetID); - tmp.standardAtomicHandlerSuppliers.forEach(atomicHandlerSupplier::addStandardSnippetID); - } - catch (Exception e) - { - System.err.println("Failed to initialize standard snippet ID mapping: "); - e.printStackTrace(); - } - } - - private static class SnippetIDClassNames - { - public Map standardSubcomponentHandlerSuppliers; - public Map standardAtomicHandlerSuppliers; - } - - private StandardHighLevelStateHandlerSnippetSuppliers() - { - throw new UnsupportedOperationException(); - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java deleted file mode 100644 index 97ace092..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.serializing.JSONSerializable; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; - -public interface AtomicHighLevelStateHandler extends JSONSerializable -{ - /** - * Gets the current value of the atomic high level state represented by this AtomicHighLevelStateHandler.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(); - - /** - * Sets the atomic high level state represented by this AtomicHighLevelStateHandler to the given value.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @author Daniel Kirschten - */ - public void setHighLevelState(Object newState); - - public static class AtomicHighLevelStateHandlerParams - { - public String id; - public JsonElement params; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java deleted file mode 100644 index 7ae29128..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java +++ /dev/null @@ -1,141 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; - -public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler -{ - private final SubmodelComponent component; - private final List vectorPartTargets; - private final List vectorPartTargetsUnmodifiable; - private final List vectorPartLengthes; - private final List vectorPartLengthesUnmodifiable; - private int length; - - public BitVectorSplittingAtomicHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public BitVectorSplittingAtomicHighLevelStateHandler(SubmodelComponent component, - BitVectorSplittingAtomicHighLevelStateHandlerParams params) - { - this.component = component; - this.vectorPartTargets = new ArrayList<>(); - this.vectorPartTargetsUnmodifiable = Collections.unmodifiableList(vectorPartTargets); - this.vectorPartLengthes = new ArrayList<>(); - this.vectorPartLengthesUnmodifiable = Collections.unmodifiableList(vectorPartLengthes); - if (params != null) - setVectorParts(params.vectorPartTargets, params.vectorPartLengthes); - } - - public void set(List targets, List lengthes) - { - setVectorParts(targets, lengthes); - } - - public void addVectorPart(String target, int length) - { - vectorPartTargets.add(target); - vectorPartLengthes.add(length); - this.length += length; - } - - public void clearVectorParts() - { - vectorPartTargets.clear(); - vectorPartLengthes.clear(); - length = 0; - } - - private void setVectorParts(List targets, List lengthes) - { - clearVectorParts(); - if (targets.size() != lengthes.size()) - throw new IllegalArgumentException("Targets list and lengthes list have different sizes"); - vectorPartTargets.addAll(targets); - vectorPartLengthes.addAll(lengthes); - length += lengthes.stream().mapToInt(Integer::intValue).sum(); - } - - public List getVectorPartTargets() - { - return vectorPartTargetsUnmodifiable; - } - - public List getVectorPartLenghtes() - { - return vectorPartLengthesUnmodifiable; - } - - @Override - public Object getHighLevelState() - { - BitVector result = BitVector.of(); - for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++) - { - Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex)); - BitVector vectorPart; - if (subStateUncasted instanceof Bit) - vectorPart = BitVector.of((Bit) subStateUncasted); - else - vectorPart = (BitVector) subStateUncasted; - if (vectorPart.length() != vectorPartLengthes.get(partIndex)) - throw new IllegalArgumentException( - "Incorrect vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.get(partIndex)); - result = result.concat(vectorPart); - } - return result; - } - - @Override - public void setHighLevelState(Object newState) - { - BitVector newStateCasted = (BitVector) newState; - if (newStateCasted.length() != length) - throw new IllegalArgumentException("Incorrect vector length: " + newStateCasted.length() + "; expected " + length); - for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++) - { - int vectorPartLength = vectorPartLengthes.get(partIndex); - BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartLength); - component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart); - bitIndex += vectorPartLength; - } - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "bitVectorSplitting"; - } - - @Override - public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams(); - params.vectorPartTargets = new ArrayList<>(vectorPartTargets); - params.vectorPartLengthes = new ArrayList<>(vectorPartLengthes); - return params; - } - - public static class BitVectorSplittingAtomicHighLevelStateHandlerParams - { - public List vectorPartTargets; - public List vectorPartLengthes; - } - - static - { - StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier - .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create( - BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java deleted file mode 100644 index 9d2645d7..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; - -public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler -{ - private final SubmodelComponent parentComponent; - private ModelComponent delegateTarget; - private String subStateID; - - public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component, DelegatingAtomicHighLevelStateHandlerParams params) - { - this.parentComponent = component; - if (params != null) - { - // TODO document this - if (params.delegateTarget == null) - setDelegateTarget(parentComponent); - else - { - ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget); - if (delegateTarget == null) - throw new NullPointerException("No subcomponent with name " + params.delegateTarget); - setDelegateTarget(delegateTarget); - } - setSubStateID(params.subStateID); - } - parentComponent.submodel.addComponentRemovedListener(c -> - { - if (delegateTarget == c) - delegateTarget = null; - }); - } - - public void set(ModelComponent delegateTarget, String subStateID) - { - setDelegateTarget(delegateTarget); - setSubStateID(subStateID); - } - - public void setDelegateTarget(ModelComponent delegateTarget) - { - if (delegateTarget == null) - this.delegateTarget = parentComponent; - else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget) - throw new IllegalArgumentException( - "Can only set components belonging to the submodel of the parent component of this handler as the delegate target"); - this.delegateTarget = delegateTarget; - } - - public ModelComponent getDelegateTarget() - { - return delegateTarget; - } - - public void setSubStateID(String subStateID) - { - this.subStateID = subStateID; - } - - public String getSubStateID() - { - return subStateID; - } - - @Override - public Object getHighLevelState() - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - return delegateTarget.getHighLevelState(subStateID); - } - - @Override - public void setHighLevelState(Object newState) - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - delegateTarget.setHighLevelState(subStateID, newState); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "delegating"; - } - - @Override - public DelegatingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - DelegatingAtomicHighLevelStateHandlerParams params = new DelegatingAtomicHighLevelStateHandlerParams(); - params.delegateTarget = delegateTarget.getName(); - params.subStateID = subStateID; - return params; - } - - public static class DelegatingAtomicHighLevelStateHandlerParams - { - public String delegateTarget; - public String subStateID; - } - - static - { - StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier( - DelegatingAtomicHighLevelStateHandler.class.getCanonicalName(), - SnippetDefinintion.create(DelegatingAtomicHighLevelStateHandlerParams.class, DelegatingAtomicHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java deleted file mode 100644 index 276f5415..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java +++ /dev/null @@ -1,157 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; - -public class WireForcingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler -{ - private final SubmodelComponent component; - private int logicWidth; - private final List wiresToForce; - private final List wiresToForceUnmodifiable; - private final List wiresToForceInverted; - private final List wiresToForceInvertedUnmodifiable; - - public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component, WireForcingAtomicHighLevelStateHandlerParams params) - { - this.component = component; - this.wiresToForce = new ArrayList<>(); - this.wiresToForceUnmodifiable = Collections.unmodifiableList(wiresToForce); - this.wiresToForceInverted = new ArrayList<>(); - this.wiresToForceInvertedUnmodifiable = Collections.unmodifiableList(wiresToForceInverted); - if (params != null) - { - Map wiresByName = component.submodel.getWiresByName(); - setWiresToForce(params.wiresToForce.stream().map((Function) wiresByName::get).collect(Collectors.toList()), - params.wiresToForceInverted.stream().map((Function) wiresByName::get).collect(Collectors.toList())); - } - component.submodel.addWireRemovedListener(w -> - { - wiresToForce.removeIf(w::equals); - wiresToForceInverted.removeIf(w::equals); - }); - } - - public void set(List wiresToForce, List wiresToForceInverted) - { - setWiresToForce(wiresToForce, wiresToForceInverted); - } - - public void setWiresToForce(List wiresToForce, List wiresToForceInverted) - { - clearWiresToForce(); - for (ModelWire wire : wiresToForce) - addWireToForce(wire, false); - for (ModelWire wire : wiresToForceInverted) - addWireToForce(wire, true); - } - - public void addWireToForce(ModelWire wire, boolean inverted) - { - if (component.submodel.getWiresByName().get(wire.name) != wire) - throw new IllegalArgumentException("Can only force wires belonging to the parent component of this handler"); - if (logicWidth < 1) - logicWidth = wire.logicWidth; - else if (wire.logicWidth != logicWidth) - throw new IllegalArgumentException("Can only force wires of the same logic width"); - // this can add the same wire multiple times, but maybe there is a weird configuration where it is neccessary, due to race - // conditions, to force the same wire twice. - if (inverted) - wiresToForceInverted.add(wire); - else - wiresToForce.add(wire); - } - - public void clearWiresToForce() - { - wiresToForce.clear(); - wiresToForceInverted.clear(); - logicWidth = 0; - } - - public List getWiresToForce() - { - return wiresToForceUnmodifiable; - } - - public List getWiresToForceInverted() - { - return wiresToForceInvertedUnmodifiable; - } - - @Override - public Object getHighLevelState() - { - BitVector result = BitVector.of(Bit.ZERO, logicWidth); - for (ModelWire wire : wiresToForceInverted) - if (wire.hasCoreModelBinding()) - result = result.or(wire.getWireValues()); - result = result.not(); - for (ModelWire wire : wiresToForce) - if (wire.hasCoreModelBinding()) - result = result.and(wire.getWireValues()); - return result; - } - - @Override - public void setHighLevelState(Object newState) - { - BitVector vector; - if (newState instanceof Bit) - vector = BitVector.of((Bit) newState); - else - vector = (BitVector) newState; - for (ModelWire wire : wiresToForce) - if (wire.hasCoreModelBinding()) - wire.forceWireValues(vector); - vector = vector.not(); - for (ModelWire wire : wiresToForceInverted) - if (wire.hasCoreModelBinding()) - wire.forceWireValues(vector); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "wireForcing"; - } - - @Override - public WireForcingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - WireForcingAtomicHighLevelStateHandlerParams params = new WireForcingAtomicHighLevelStateHandlerParams(); - params.wiresToForce = wiresToForce.stream().map(w -> w.name).collect(Collectors.toList()); - params.wiresToForceInverted = wiresToForceInverted.stream().map(w -> w.name).collect(Collectors.toList()); - return params; - } - - public static class WireForcingAtomicHighLevelStateHandlerParams - { - public List wiresToForce; - public List wiresToForceInverted; - } - - static - { - StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier( - WireForcingAtomicHighLevelStateHandler.class.getCanonicalName(), - SnippetDefinintion.create(WireForcingAtomicHighLevelStateHandlerParams.class, WireForcingAtomicHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json deleted file mode 100644 index ef9d686f..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json +++ /dev/null @@ -1,11 +0,0 @@ -mograsim version: 0.1.3 -{ - "standardSubcomponentHandlerSuppliers": { - "delegating": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.DelegatingSubcomponentHighLevelStateHandler" - }, - "standardAtomicHandlerSuppliers": { - "delegating": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler", - "wireForcing": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.WireForcingAtomicHighLevelStateHandler", - "bitVectorSplitting": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler" - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java deleted file mode 100644 index 12a98887..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent; - -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; - -public class DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler -{ - private final SubmodelComponent parentComponent; - private ModelComponent delegateTarget; - private String prefix; - - public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component) - { - this(component, null); - } - - public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component, - DelegatingSubcomponentHighLevelStateHandlerParams params) - { - this.parentComponent = component; - if (params != null) - { - // TODO document this - if (params.delegateTarget == null) - setDelegateTarget(parentComponent); - else - { - ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget); - if (delegateTarget == null) - throw new NullPointerException("No subcomponent with name " + params.delegateTarget); - setDelegateTarget(delegateTarget); - } - setPrefix(params.prefix); - } - parentComponent.submodel.addComponentRemovedListener(c -> - { - if (delegateTarget == c) - delegateTarget = null; - }); - } - - public void set(ModelComponent delegateTarget, String prefix) - { - setDelegateTarget(delegateTarget); - setPrefix(prefix); - } - - public void setDelegateTarget(ModelComponent delegateTarget) - { - if (delegateTarget == null) - this.delegateTarget = parentComponent; - else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget) - throw new IllegalArgumentException( - "Can only set components belonging to the submodel of the parent component of this handler as the delegate target"); - this.delegateTarget = delegateTarget; - } - - public ModelComponent getDelegateTarget() - { - return delegateTarget; - } - - public void setPrefix(String prefix) - { - this.prefix = prefix; - } - - public String getPrefix() - { - return prefix; - } - - @Override - public Object getHighLevelState(String subStateID) - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID)); - } - - @Override - public void setHighLevelState(String subStateID, Object newState) - { - if (delegateTarget == null) - throw new IllegalStateException("Delegating to a component that was destroyed"); - delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState); - } - - private String getDelegateTargetHighLevelStateID(String subStateID) - { - return prefix == null ? subStateID : prefix + '.' + subStateID; - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "delegating"; - } - - @Override - public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) - { - DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams(); - params.delegateTarget = delegateTarget.getName(); - params.prefix = prefix; - return params; - } - - public static class DelegatingSubcomponentHighLevelStateHandlerParams - { - public String delegateTarget; - public String prefix; - } - - static - { - StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier - .setSnippetSupplier(DelegatingSubcomponentHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion - .create(DelegatingSubcomponentHighLevelStateHandlerParams.class, DelegatingSubcomponentHighLevelStateHandler::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java deleted file mode 100644 index 4c82bdcf..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent; - -import com.google.gson.JsonElement; - -import net.mograsim.logic.model.serializing.JSONSerializable; -import net.mograsim.logic.model.snippets.HighLevelStateHandler; - -public interface SubcomponentHighLevelStateHandler extends JSONSerializable -{ - /** - * Gets the current value of the given high level state of the subcomponent represented by this SubcomponentHighLevelStateHandler.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @author Daniel Kirschten - */ - public Object getHighLevelState(String subStateID); - - /** - * Sets the given high level state of the subcomponent represented by this SubcomponentHighLevelStateHandler to the given value.
- * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. - * - * @author Daniel Kirschten - */ - public void setHighLevelState(String subStateID, Object newState); - - public static class SubcomponentHighLevelStateHandlerParams - { - public String id; - public JsonElement params; - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java deleted file mode 100644 index 90f25a41..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.mograsim.logic.model.snippets.outlinerenderers; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -public class DefaultOutlineRenderer implements Renderer -{ - private final ModelComponent component; - - public DefaultOutlineRenderer(ModelComponent component) - { - this(component, null); - } - - public DefaultOutlineRenderer(ModelComponent component, @SuppressWarnings("unused") Void params) - { - this.component = component; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.foreground"); - if (fg != null) - gc.setForeground(ColorManager.current().toColor(fg)); - gc.drawRectangle(component.getBounds()); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "default"; - } - - @Override - public Void getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - static - { - SubmodelComponentSnippetSuppliers.outlineRendererSupplier.setSnippetSupplier(DefaultOutlineRenderer.class.getCanonicalName(), - SnippetDefinintion.create(Void.class, DefaultOutlineRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json deleted file mode 100644 index 05007698..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json +++ /dev/null @@ -1,16 +0,0 @@ -mograsim version: 0.1.3 -{ - "standardOutlineRendererSuppliers": { - "default": "class:net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer" - }, - "standardSymbolRendererSuppliers": { - "default": "class:net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer", - "centeredText": "class:net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer", - "simpleRectangularLike": "class:net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer", - "pinNames": "class:net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer" - }, - "standardHighLevelStateHandlerSuppliers": { - "default": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler", - "standard": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler" - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java deleted file mode 100644 index 9a6599a6..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.mograsim.logic.model.snippets.symbolrenderers; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -/** - * Renders a text ("text") with a given font height ("height") in the center of the component. - * - * @author Daniel Kirschten - */ -public class CenteredTextSymbolRenderer implements Renderer -{ - private final ModelComponent component; - private final String text; - private final double fontHeight; - - public CenteredTextSymbolRenderer(ModelComponent component, CenteredTextParams params) - { - this.component = component; - this.text = params.text; - this.fontHeight = params.fontHeight; - - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Font oldFont = gc.getFont(); - gc.setFont(new Font(oldFont.getName(), fontHeight, oldFont.getStyle())); - ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text"); - if (fg != null) - gc.setForeground(ColorManager.current().toColor(fg)); - Point idSize = gc.textExtent(text); - Rectangle bounds = component.getBounds(); - gc.drawText(text, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true); - gc.setFont(oldFont); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "centeredText"; - } - - @Override - public CenteredTextParams getParamsForSerializing(IdentifyParams idParams) - { - CenteredTextParams params = new CenteredTextParams(); - params.text = text; - params.fontHeight = fontHeight; - return params; - } - - public static class CenteredTextParams - { - public String text; - public double fontHeight; - } - - static - { - SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(CenteredTextSymbolRenderer.class.getCanonicalName(), - SnippetDefinintion.create(CenteredTextParams.class, CenteredTextSymbolRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java deleted file mode 100644 index 28ad8a86..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.mograsim.logic.model.snippets.symbolrenderers; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.ColorManager; -import net.mograsim.preferences.Preferences; - -public class DefaultSymbolRenderer implements Renderer -{ - private static final String id = ""; - - private final ModelComponent component; - - public DefaultSymbolRenderer(ModelComponent component) - { - this(component, null); - } - - public DefaultSymbolRenderer(ModelComponent component, @SuppressWarnings("unused") Void params) - { - this.component = component; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text"); - if (fg != null) - gc.setForeground(ColorManager.current().toColor(fg)); - Point idSize = gc.textExtent(id); - Rectangle bounds = component.getBounds(); - gc.drawText(id, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "default"; - } - - @Override - public Void getParamsForSerializing(IdentifyParams idParams) - { - return null; - } - - static - { - SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(DefaultSymbolRenderer.class.getCanonicalName(), - SnippetDefinintion.create(Void.class, DefaultSymbolRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java deleted file mode 100644 index ede87105..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java +++ /dev/null @@ -1,116 +0,0 @@ -package net.mograsim.logic.model.snippets.symbolrenderers; - -import java.util.HashMap; -import java.util.Map; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; - -public class PinNamesSymbolRenderer implements Renderer -{ - private final ModelComponent component; - private final Map pinPositions; - private final double pinLabelHeight; - private final double pinLabelMargin; - - public PinNamesSymbolRenderer(ModelComponent component, PinNamesParams params) - { - this.component = component; - this.pinPositions = new HashMap<>(); - this.pinLabelHeight = params.pinLabelHeight; - this.pinLabelMargin = params.pinLabelMargin; - if (params.pinNamePositions != null) - params.pinNamePositions.forEach(this::setPinPosition); - component.addPinRemovedListener(p -> setPinPosition(p, null)); - } - - public void setPinPosition(String pinName, Position position) - { - setPinPosition(component.getPin(pinName), position); - } - - public void setPinPosition(Pin pin, Position position) - { - if (position == null) - pinPositions.remove(pin); - else - pinPositions.put(pin, position); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - Font oldFont = gc.getFont(); - gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle())); - for (Pin pin : component.getPins().values()) - { - Position pos = pinPositions.get(pin); - if (pos == null) - pos = Position.RIGHT; - - Point topleft = pin.getPos(); - Point textExtent = gc.textExtent(pin.name); - - double x2 = topleft.x - textExtent.x - pinLabelMargin; - double y2 = topleft.y - textExtent.y - pinLabelMargin; - double x1 = topleft.x + pinLabelMargin; - double y1 = topleft.y + pinLabelMargin; - - double x = pos.posX * x1 + (1 - pos.posX) * x2; - double y = pos.posY * y1 + (1 - pos.posY) * y2; - - gc.drawText(pin.name, x, y, true); - } - gc.setFont(oldFont); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "pinNames"; - } - - @Override - public PinNamesParams getParamsForSerializing(IdentifyParams idParams) - { - PinNamesParams params = new PinNamesParams(); - params.pinNamePositions = new HashMap<>(); - pinPositions.forEach((pin, pos) -> params.pinNamePositions.put(pin.name, pos)); - return params; - } - - public static class PinNamesParams - { - public Map pinNamePositions; - public double pinLabelHeight; - public double pinLabelMargin; - - public static enum Position - { - TOP(.5, 0), TOP_LEFT(0, 0), LEFT(0, .5), BOTTOM_LEFT(0, 1), BOTTOM(.5, 1), BOTTOM_RIGHT(1, 1), RIGHT(1, .5), TOP_RIGHT(1, 0); - - private final double posX, posY; - - private Position(double posX, double posY) - { - this.posX = posX; - this.posY = posY; - } - } - } - - static - { - SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(PinNamesSymbolRenderer.class.getCanonicalName(), - SnippetDefinintion.create(PinNamesParams.class, PinNamesSymbolRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java deleted file mode 100644 index d57203ab..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java +++ /dev/null @@ -1,108 +0,0 @@ -package net.mograsim.logic.model.snippets.symbolrenderers; - -import java.util.Map.Entry; - -import org.eclipse.swt.graphics.Color; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Font; -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.serializing.IdentifyParams; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; -import net.mograsim.preferences.Preferences; - -/** - * Renders a text ("centerText") with a given font height ("centerTextHeight") in the center of the component and - * draws a label for each pin with a given font height ("pinLabelHeight"). The labels of pins to the left of a given x - * coordinate ("horizontalComponentCenter") are drawn to the right of the respective pin; labels of pins to the right are drawn - * left. A margin ("pinLabelMargin") is applied for pin label drawing. - * - * @author Daniel Kirschten - */ -public class SimpleRectangularLikeSymbolRenderer implements Renderer -{ - private final ModelComponent component; - private final String centerText; - private final double centerTextHeight; - private final double horizontalComponentCenter; - private final double pinLabelHeight; - private final double pinLabelMargin; - - public SimpleRectangularLikeSymbolRenderer(ModelComponent component, SimpleRectangularLikeParams params) - { - this.component = component; - this.centerText = params.centerText; - this.centerTextHeight = params.centerTextHeight; - this.horizontalComponentCenter = params.horizontalComponentCenter; - this.pinLabelHeight = params.pinLabelHeight; - this.pinLabelMargin = params.pinLabelMargin; - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - double posX = component.getPosX(); - double posY = component.getPosY(); - double width = component.getWidth(); - double height = component.getHeight(); - - Font oldFont = gc.getFont(); - gc.setFont(new Font(oldFont.getName(), centerTextHeight, oldFont.getStyle())); - Point textExtent = gc.textExtent(centerText); - Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); - if (textColor != null) - gc.setForeground(textColor); - gc.drawText(centerText, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true); - gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle())); - for (Entry pinEntry : component.getPins().entrySet()) - { - String pinName = pinEntry.getKey(); - Pin pin = pinEntry.getValue(); - double pinX = pin.getRelX(); - double pinY = posY + pin.getRelY(); - textExtent = gc.textExtent(pinName); - gc.drawText(pinName, posX + pinX + (pinX > horizontalComponentCenter ? -textExtent.x - pinLabelMargin : pinLabelMargin), - pinY - textExtent.y / 2, true); - } - gc.setFont(oldFont); - } - - @Override - public String getIDForSerializing(IdentifyParams idParams) - { - return "simpleRectangularLike"; - } - - @Override - public SimpleRectangularLikeParams getParamsForSerializing(IdentifyParams idParams) - { - SimpleRectangularLikeParams params = new SimpleRectangularLikeParams(); - params.centerText = centerText; - params.centerTextHeight = centerTextHeight; - params.horizontalComponentCenter = horizontalComponentCenter; - params.pinLabelHeight = pinLabelHeight; - params.pinLabelMargin = pinLabelMargin; - return params; - } - - public static class SimpleRectangularLikeParams - { - public String centerText; - public double centerTextHeight; - public double horizontalComponentCenter; - public double pinLabelHeight; - public double pinLabelMargin; - } - - static - { - SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier( - SimpleRectangularLikeSymbolRenderer.class.getCanonicalName(), - SnippetDefinintion.create(SimpleRectangularLikeParams.class, SimpleRectangularLikeSymbolRenderer::new)); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java deleted file mode 100644 index 20491ce5..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.mograsim.logic.model.util; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.stream.Collectors; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; - -public class JsonHandler -{ - public final static Gson parser = new GsonBuilder().setPrettyPrinting().create(); - - public static T readJson(String path, Class type) throws IOException - { - try (FileInputStream jsonStream = new FileInputStream(path)) - { - return readJson(jsonStream, type); - } - } - - /** - * @param input The Stream is closed after being read - */ - public static T readJson(InputStream input, Class type) throws IOException - { - try (InputStreamReader reader = new InputStreamReader(input, StandardCharsets.UTF_8); - BufferedReader bf = new BufferedReader(reader)) - { - return fromJson(bf.lines().collect(Collectors.joining("\n")), type); - } - } - - public static T fromJson(String src, Class type) - { - // throw away legacy version line - String rawJson = src.lines().dropWhile(s -> s.length() == 0 || s.charAt(0) != '{').collect(Collectors.joining()); - return parser.fromJson(rawJson, type); - } - - public static T fromJsonTree(JsonElement src, Class type) - { - return parser.fromJson(src, type); - } - - public static void writeJson(Object o, String path) throws IOException - { - try (FileWriter writer = new FileWriter(path)) - { - writer.write(toJson(o)); - } - } - - public static String toJson(Object o) - { - return parser.toJson(o); - } - - public static JsonElement toJsonTree(Object o) - { - return parser.toJsonTree(o); - } -} \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java deleted file mode 100644 index 58a86ea0..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java +++ /dev/null @@ -1,112 +0,0 @@ -package net.mograsim.logic.model.util; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; - -public class ModellingTool -{ - private LogicModelModifiable model; - - ModellingTool(LogicModelModifiable model) - { - this.model = model; - } - - public ModelWire connect(ModelComponent a, ModelComponent b, String pinA, String pinB) - { - return connect(null, a, b, pinA, pinB); - } - - public ModelWire connect(ModelWireCrossPoint a, ModelComponent b, String pinB) - { - return connect(null, a, b, pinB); - } - - public ModelWire connect(Pin a, ModelComponent b, String pinB) - { - return connect(null, a, b, pinB); - } - - public ModelWire connect(ModelComponent a, ModelWireCrossPoint b, String pinA) - { - return connect(null, a, b, pinA); - } - - public ModelWire connect(ModelWireCrossPoint a, ModelWireCrossPoint b) - { - return connect(null, a, b); - } - - public ModelWire connect(Pin a, ModelWireCrossPoint b) - { - return connect(null, a, b); - } - - public ModelWire connect(ModelComponent a, Pin b, String pinA) - { - return connect(null, a, b, pinA); - } - - public ModelWire connect(ModelWireCrossPoint a, Pin b) - { - return connect(null, a, b); - } - - public ModelWire connect(Pin a, Pin b) - { - return connect(null, a, b); - } - - public ModelWire connect(String name, ModelComponent a, ModelComponent b, String pinA, String pinB) - { - return connect(name, a.getPin(pinA), b.getPin(pinB)); - } - - public ModelWire connect(String name, ModelWireCrossPoint a, ModelComponent b, String pinB) - { - return connect(name, a.getPin(), b.getPin(pinB)); - } - - public ModelWire connect(String name, Pin a, ModelComponent b, String pinB) - { - return connect(name, a, b.getPin(pinB)); - } - - public ModelWire connect(String name, ModelComponent a, ModelWireCrossPoint b, String pinA) - { - return connect(name, a.getPin(pinA), b.getPin()); - } - - public ModelWire connect(String name, ModelWireCrossPoint a, ModelWireCrossPoint b) - { - return connect(name, a.getPin(), b.getPin()); - } - - public ModelWire connect(String name, Pin a, ModelWireCrossPoint b) - { - return connect(name, a, b.getPin()); - } - - public ModelWire connect(String name, ModelComponent a, Pin b, String pinA) - { - return connect(name, a.getPin(pinA), b); - } - - public ModelWire connect(String name, ModelWireCrossPoint a, Pin b) - { - return connect(name, a.getPin(), b); - } - - public ModelWire connect(String name, Pin a, Pin b) - { - return new ModelWire(model, name, a, b); - } - - public static ModellingTool createFor(LogicModelModifiable model) - { - return new ModellingTool(model); - } -} diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java deleted file mode 100644 index 00aeed89..00000000 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java +++ /dev/null @@ -1,139 +0,0 @@ -package net.mograsim.logic.model.util; - -import java.io.IOException; - -import com.google.gson.TypeAdapter; -import com.google.gson.annotations.JsonAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -import net.mograsim.logic.model.util.Version.VersionJSONAdapter; - -@JsonAdapter(VersionJSONAdapter.class) -public final class Version implements Comparable -{ - public final int major, minor, patch; - - public Version(int major, int minor, int patch) - { - super(); - this.major = major; - this.minor = minor; - this.patch = patch; - } - - public int[] getVersionNumbers() - { - return new int[] { major, minor, patch }; - } - - @Override - public String toString() - { - return toSemverString(); - } - - public String toSemverString() - { - return major + "." + minor + "." + patch; - } - - public static Version parseSemver(String semver) - { - String[] semverParts = semver.split("\\."); - return new Version(Integer.parseInt(semverParts[0]), semverParts.length > 1 ? Integer.parseInt(semverParts[1]) : 0, - semverParts.length > 2 ? Integer.parseInt(semverParts[2]) : 0); - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + major; - result = prime * result + minor; - result = prime * result + patch; - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof Version)) - return false; - Version other = (Version) obj; - if (major != other.major) - return false; - if (minor != other.minor) - return false; - if (patch != other.patch) - return false; - return true; - } - - public boolean is(int major) - { - return major == this.major; - } - - public boolean is(int major, int minor) - { - return is(major) && this.minor == minor; - } - - public boolean is(int major, int minor, int patch) - { - return is(major, minor) && this.patch == patch; - } - - /** - * Compares this {@link Version} with the specified version.
- * As required by {@link Comparable#compareTo(Object)}, returns a negative integer, zero, or a positive integer as this version is less - * (earlier) than, equal to, or greater (later) than the specified version. - *

- * If the versions are equal ({@link #major}, {@link #minor}, {@link #patch} are the same), returns 0.
- * If they differ in {@link #patch}, but neither {@link #major} or {@link #minor} , returns +-1.
- * If they differ in {@link #minor}, but not {@link #major}, returns +-2.
- * If they differ in {@link #major}, returns +-3. - */ - @Override - public int compareTo(Version o) - { - if (major != o.major) - { - if (major > o.major) - return 3; - return -3; - } - if (minor != o.minor) - { - if (minor > o.minor) - return 2; - return -2; - } - if (patch != o.patch) - { - if (patch > o.patch) - return 1; - return -1; - } - return 0; - } - - static class VersionJSONAdapter extends TypeAdapter - { - @Override - public void write(JsonWriter out, Version value) throws IOException - { - out.value(value.toSemverString()); - } - - @Override - public Version read(JsonReader in) throws IOException - { - return parseSemver(in.nextString()); - } - } -} \ No newline at end of file diff --git a/net.mograsim.machine/.classpath b/net.mograsim.machine/.classpath deleted file mode 100644 index c9d880bb..00000000 --- a/net.mograsim.machine/.classpath +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.machine/.gitignore b/net.mograsim.machine/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.machine/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.machine/.project b/net.mograsim.machine/.project deleted file mode 100644 index d179b4ce..00000000 --- a/net.mograsim.machine/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.machine - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs b/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.machine/META-INF/MANIFEST.MF b/net.mograsim.machine/META-INF/MANIFEST.MF deleted file mode 100644 index afbfc4c4..00000000 --- a/net.mograsim.machine/META-INF/MANIFEST.MF +++ /dev/null @@ -1,22 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Mograsim Machine Definition -Bundle-SymbolicName: net.mograsim.machine;singleton:=true -Bundle-Version: 0.1.0.qualifier -Bundle-Vendor: Mograsim Team -Automatic-Module-Name: net.mograsim.machine -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: net.mograsim.logic.core;bundle-version="0.1.0";visibility:=reexport, - net.mograsim.logic.model;bundle-version="0.1.0";visibility:=reexport, - net.mograsim.preferences;visibility:=reexport, - org.eclipse.e4.core.di.annotations, - org.eclipse.core.runtime -Export-Package: net.mograsim.machine, - net.mograsim.machine.isa, - net.mograsim.machine.isa.types, - net.mograsim.machine.mi, - net.mograsim.machine.mi.components, - net.mograsim.machine.mi.parameters, - net.mograsim.machine.standard.memory -Bundle-Activator: net.mograsim.machine.MachineLoader -Bundle-ActivationPolicy: lazy diff --git a/net.mograsim.machine/build.properties b/net.mograsim.machine/build.properties deleted file mode 100644 index 3090e4c0..00000000 --- a/net.mograsim.machine/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - .,\ - plugin.xml,\ - schema/ diff --git a/net.mograsim.machine/plugin.xml b/net.mograsim.machine/plugin.xml deleted file mode 100644 index 8c71c6db..00000000 --- a/net.mograsim.machine/plugin.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - > - diff --git a/net.mograsim.machine/schema/machine_definition.exsd b/net.mograsim.machine/schema/machine_definition.exsd deleted file mode 100644 index e5e147bf..00000000 --- a/net.mograsim.machine/schema/machine_definition.exsd +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - Mograsim extension for defining a machine - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The machines id, this should be unique, but still readable - - - - - - - A Class that implements the Mograsim Machine Definition - - - - - - - - - - - - - - - 0.1.0 - - - - - - - - - [Enter extension point usage example here.] - - - - - - - - - [Enter API information here.] - - - - - - - - - [Enter information about supplied implementation of this extension point.] - - - - - diff --git a/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java b/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java deleted file mode 100644 index eab88b97..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.machine; - -public interface AddressingScema -{ - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java b/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java deleted file mode 100644 index 80520140..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java +++ /dev/null @@ -1,119 +0,0 @@ -package net.mograsim.machine; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - -public abstract class GenericMemory implements Memory -{ - private final long minimalAddress, maximalAddress; - private final MemoryDefinition definition; - private final int pageSize = 64; - private Set observers = new HashSet<>(); - - private HashMap pages; - - public GenericMemory(MemoryDefinition definition) - { - super(); - this.definition = definition; - this.minimalAddress = definition.getMinimalAddress(); - this.maximalAddress = definition.getMaximalAddress(); - this.pages = new HashMap<>(); - } - - private void inBoundsCheck(long address) - { - if (address < minimalAddress || address > maximalAddress) - throw new IndexOutOfBoundsException(String.format("Memory address out of bounds! Minimum: %d Maximum: %d Actual: %d", - minimalAddress, maximalAddress, address)); - } - - private long page(long address) - { - return address / pageSize; - } - - private int offset(long address) - { - return (int) (address % pageSize); - } - - @Override - public void setCell(long address, T data) - { - inBoundsCheck(address); - long page = page(address); - int offset = offset(address); - Page p = pages.get(Long.valueOf(page)); - if (p == null) - pages.put(page, p = new Page()); - p.setCell(offset, data); - notifyObservers(address); - } - - @Override - public T getCell(long address) - { - inBoundsCheck(address); - long page = page(address); - int offset = offset(address); - Page p = pages.get(Long.valueOf(page)); - if (p == null) - return null; - return p.getCell(offset); - } - - private class Page - { - private Object[] memory; - - public Page() - { - memory = new Object[pageSize]; - } - - public T getCell(int index) - { - @SuppressWarnings("unchecked") - T data = (T) memory[index]; - return data; - } - - public void setCell(int index, T data) - { - memory[index] = data; - } - - @Override - public String toString() - { - return Arrays.deepToString(memory); - } - } - - @Override - public void registerObserver(MemoryObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(MemoryObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers(long address) - { - observers.forEach(ob -> ob.update(address)); - } - - @Override - public MemoryDefinition getDefinition() - { - return definition; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/ISA.java b/net.mograsim.machine/src/net/mograsim/machine/ISA.java deleted file mode 100644 index eaec0d94..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/ISA.java +++ /dev/null @@ -1,5 +0,0 @@ -package net.mograsim.machine; - -public interface ISA -{ -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java b/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java deleted file mode 100644 index 72e66855..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.mograsim.machine; - -import java.util.Set; - -import net.mograsim.machine.isa.AsmOperand; - -public interface ISASchema -{ - Set getSupportedOperands(); - - AddressingScema getAddressingSchema(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/Machine.java b/net.mograsim.machine/src/net/mograsim/machine/Machine.java deleted file mode 100644 index 6ff074d0..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/Machine.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.machine; - -import net.mograsim.logic.core.components.CoreClock; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.MicroInstructionMemory; -import net.mograsim.logic.model.model.LogicModel; - -public interface Machine -{ - MachineDefinition getDefinition(); - - void reset(); - - LogicModel getModel(); - - CoreClock getClock(); - - BitVector getRegister(Register r); - - void setRegister(Register r, BitVector value); - - Timeline getTimeline(); - - MainMemory getMainMemory(); - - MicroInstructionMemory getMicroInstructionMemory(); - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java deleted file mode 100644 index 02cf3757..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.mograsim.machine; - -import java.util.Set; - -import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; - -public interface MachineDefinition -{ - - /** - * Creates a new instance of the machine - * - * @return a new object of an {@link Machine} implementation. - * @author Christian Femers - */ - Machine createNew(); - - /** - * Returns the schema that all possible ISAs (Instruction Set Architecture) must be based on. - * - * @return an {@link ISASchema} implementation fitting the machine - * @author Christian Femers - */ - ISASchema getISASchema(); - - /** - * Returns a set of all {@link Register}s present in the machine. - * - * @return all registers present in the machine. - * @author Christian Femers - */ - Set getRegisters(); - - /** - * The number of bits used by the machine to address main memory. Note that this should be the number of bits used in the CPU, not a - * possibly different one used by the bus system. - * - * @return the number of bits used by the CPU - * @see MainMemoryDefinition#getMemoryAddressBits() - * @author Christian Femers - */ - int getAddressBits(); - - /** - * Returns the definition of the machines main memory. - * - * @return the {@link MainMemoryDefinition} that defines the main memory. - * @author Christian Femers - */ - MainMemoryDefinition getMainMemoryDefinition(); - - /** - * Returns the definition of the machines instruction memory. - * - * @return the {@link InstructionMemoryDefinition} that defines the instruction memory. - */ - MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition(); - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineException.java b/net.mograsim.machine/src/net/mograsim/machine/MachineException.java deleted file mode 100644 index ee9026a7..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineException.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.machine; - -public class MachineException extends RuntimeException -{ - - /** - * - */ - private static final long serialVersionUID = 6224307211078376836L; - - public MachineException() - { - super(); - } - - public MachineException(String message) - { - super(message); - } - - public MachineException(Throwable cause) - { - super(cause); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java b/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java deleted file mode 100644 index 9a88575b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.machine; - -import java.util.concurrent.atomic.AtomicBoolean; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; - -import net.mograsim.logic.model.serializing.ClassLoaderBasedResourceLoader; -import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; - -public class MachineLoader implements BundleActivator -{ - private static AtomicBoolean activated = new AtomicBoolean(false); - - @Override - public void start(BundleContext context) throws Exception - { - setup(); - } - - @Override - public void stop(BundleContext context) throws Exception - { - // nothing - } - - public static void setup() - { - if (activated.getAndSet(true)) - return; - ClassLoaderBasedResourceLoader resourceLoader = ClassLoaderBasedResourceLoader.create(MachineLoader.class.getClassLoader()); - IndirectModelComponentCreator.registerResourceLoader(resourceLoader, "MachineLoader"); - IndirectModelComponentCreator.loadStandardComponentIDs(MachineLoader.class.getResourceAsStream("standardComponentIDMapping.json")); -// System.out.println("SETUP DONE"); // TODO: Debug - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java b/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java deleted file mode 100644 index a2706462..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.mograsim.machine; - -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IConfigurationElement; -import org.eclipse.core.runtime.IExtensionRegistry; -import org.eclipse.core.runtime.Platform; - -public class MachineRegistry -{ - private static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition"; - - private static Map installedMachines = new HashMap<>(); - - public static void reload() - { - IExtensionRegistry registry = Platform.getExtensionRegistry(); - System.out.println(Arrays.toString(registry.getExtensionPoints("net.mograsim.machine"))); - IConfigurationElement[] config = registry.getConfigurationElementsFor(MACHINE_EXT_ID); - try - { - for (IConfigurationElement e : config) - { - System.out.println(e.getNamespaceIdentifier()); - System.out.println(Arrays.toString(e.getAttributeNames())); - final Object o = e.createExecutableExtension("class"); - final String id = e.getAttribute("unique_id"); - if (o instanceof MachineDefinition) - { - System.out.println("Found " + id); - installedMachines.put(id, (MachineDefinition) o); - } else - { - System.err.println("Invalid machine definition: " + o + "(id=" + id + ""); - } - } - } - catch (CoreException ex) - { - System.out.println(ex.getMessage()); - } - } - - public static Map getinstalledMachines() - { - return Collections.unmodifiableMap(installedMachines); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java b/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java deleted file mode 100644 index 94140b73..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.machine; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.BitVector; - -public interface MainMemory extends Memory -{ - public BigInteger getCellAsBigInteger(long address); - - public void setCellAsBigInteger(long address, BigInteger word); - - public MainMemoryDefinition getDefinition(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java deleted file mode 100644 index 72153d6d..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.mograsim.machine; - -/** - * This interface provides a means to get information about the machines memory architecture. It is not bound to any actual memory. - * - * @author Christian Femers - * - */ -public interface MainMemoryDefinition extends MemoryDefinition -{ - /** - * The width in bits of an addressable memory cell/unit. This is often 8 (= one byte). The actual cells/lines of the memory may be a lot - * larger. - * - * @return the addressable unit width in bits - * @author Christian Femers - */ - int getCellWidth(); - - public static MainMemoryDefinition create(int memoryAddressBits, int cellWidth, long minimalAddress, long maximalAddress) - { - return new StandardMainMemoryDefinition(memoryAddressBits, cellWidth, minimalAddress, maximalAddress); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/Memory.java b/net.mograsim.machine/src/net/mograsim/machine/Memory.java deleted file mode 100644 index 0ff9bb41..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/Memory.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.mograsim.machine; - -public interface Memory -{ - /** - * @param address The address of the desired data. Must be non-negative - * @return The data at the requested address - * - * @throws IndexOutOfBoundsException - */ - public T getCell(long address); - - /** - * Sets the data at the supplied address - * - * @throws IndexOutOfBoundsException - */ - public void setCell(long address, T data); - - public default long size() - { - MemoryDefinition def = getDefinition(); - return Long.max(0, def.getMaximalAddress() - def.getMinimalAddress() + 1); - } - - /** - * Registers an observer to be notified when a memory cell is modified - */ - public void registerObserver(MemoryObserver ob); - - public void deregisterObserver(MemoryObserver ob); - - public void notifyObservers(long address); - - public MemoryDefinition getDefinition(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java deleted file mode 100644 index 39d12c44..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.mograsim.machine; - -public interface MemoryDefinition -{ - - /** - * The number of bits that the main memory uses to address cells. Note that this does not need to equal - * {@link MachineDefinition#getAddressBits()}. - * - * @return the number of bits used to address a memory cell - * @author Christian Femers - */ - int getMemoryAddressBits(); - - /** - * The minimal address possible to address/use. This is usually 0. - * - * @return the minimal possible address. - * @author Christian Femers - */ - long getMinimalAddress(); - - /** - * The maximal address possible to address/use. - * - * @return the maximal possible address as unsigned long - * @author Christian Femers - */ - long getMaximalAddress(); - - /** - * The size of the MainMemory as the amount of addressable memory cells. - * - * @return the amount of addressable memory cells - */ - default long size() - { - return getMaximalAddress() - getMinimalAddress() + 1; - } - - public static MemoryDefinition create(int memoryAddressBits, long minimalAddress, long maximalAddress) - { - return new StandardMemoryDefinition(memoryAddressBits, minimalAddress, maximalAddress); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java b/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java deleted file mode 100644 index 1d7fc4dd..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.machine; - -public interface MemoryObserver -{ - public void update(long address); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java b/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java deleted file mode 100644 index d0459dc1..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.machine; - -import net.haspamelodica.swt.helper.gcs.GeneralGC; -import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.ModelComponent; -import net.mograsim.logic.model.snippets.Renderer; -import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; -import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; - -public abstract class ModelMemory extends ModelComponent -{ - private Renderer symbolRenderer; - private Renderer outlineRenderer; - private M machine; - - protected ModelMemory(LogicModelModifiable model, int width, int height, String name, String centerText, boolean callInit) - { - super(model, name, false); - - SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams(); - rendererParams.centerText = centerText; - rendererParams.centerTextHeight = 5; - rendererParams.horizontalComponentCenter = width / 2; - rendererParams.pinLabelHeight = 2.5; - rendererParams.pinLabelMargin = 0.5; - this.symbolRenderer = new SimpleRectangularLikeSymbolRenderer(this, rendererParams); - this.outlineRenderer = new DefaultOutlineRenderer(this); - - setSize(width, height); - - if (callInit) - init(); - } - - @Override - public void render(GeneralGC gc, Rectangle visibleRegion) - { - symbolRenderer.render(gc, visibleRegion); - outlineRenderer.render(gc, visibleRegion); - } - - public void setMachine(M machine) - { - this.machine = machine; - } - - public M getMachine() - { - return machine; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/Register.java b/net.mograsim.machine/src/net/mograsim/machine/Register.java deleted file mode 100644 index 4bcb7f25..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/Register.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.machine; - -import java.util.Set; - -/** - * A register in a machine is defined by this interface. A hardware register may have {@link Register#names() named sub-registers}. - * - * - * @author Christian Femers - * - */ -public interface Register -{ - /** - * The unique identifier of the register. This does not have to be the display name or name in the assembly language. - * - * @return the registers id as case sensitive String - * @author Christian Femers - */ - String id(); - - /** - * The name(s) of this register. This is the displayed name and the name used in the assembly language. All names of all registers must - * be case-insensitive unique. A register can have multiple names if these names address different regions (but still have a common - * hardware structure), e.g. EAX, AX, AL, AH. - * - * @return all the names of regions addressing this register, must be case-insensitive. - * @author Christian Femers - */ - Set names(); - - /** - * Returns the complete width in bits of the underlying hardware structure the register and possible sub-registers are part of. - * - * @param name the name of the register - * @return the width of the (sub-)register in bits. - * - * @see #names() - * @author Christian Femers - */ - int getWidth(); - - /** - * Returns the width in bits of the register or a named part of it. - * - * @param name the name of the register - * @return the width of the (sub-)register in bits. - * - * @see #names() - * @author Christian Femers - */ - int getWidth(String name); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java deleted file mode 100644 index 22be93ee..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.mograsim.machine; - -class StandardMainMemoryDefinition extends StandardMemoryDefinition implements MainMemoryDefinition -{ - private final int cellWidth; - - StandardMainMemoryDefinition(int memoryAddressBits, int cellWidth, long minimalAddress, long maximalAddress) - { - super(memoryAddressBits, minimalAddress, maximalAddress); - this.cellWidth = cellWidth; - } - - @Override - public int getCellWidth() - { - return cellWidth; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java deleted file mode 100644 index f0d755f5..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.machine; - -class StandardMemoryDefinition implements MemoryDefinition -{ - private final int memoryAddressBits; - private final long minimalAddress, maximalAddress; - - StandardMemoryDefinition(int memoryAddressBits, long minimalAddress, long maximalAddress) - { - super(); - this.memoryAddressBits = memoryAddressBits; - this.minimalAddress = minimalAddress; - this.maximalAddress = maximalAddress; - } - - public StandardMemoryDefinition(MainMemoryDefinition definition) - { - this(definition.getMemoryAddressBits(), definition.getMinimalAddress(), definition.getMaximalAddress()); - } - - @Override - public int getMemoryAddressBits() - { - return memoryAddressBits; - } - - @Override - public long getMinimalAddress() - { - return minimalAddress; - } - - @Override - public long getMaximalAddress() - { - return maximalAddress; - } - - public static MemoryDefinition create(int memoryAddressBits, long minimalAddress, long maximalAddress) - { - return new StandardMemoryDefinition(memoryAddressBits, minimalAddress, maximalAddress); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java deleted file mode 100644 index 07b56c29..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.machine.isa; - -public interface AsmElement -{ - // only marker at the moment -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java deleted file mode 100644 index 7a1a6ebf..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.mograsim.machine.isa; - -import java.math.BigDecimal; -import java.math.BigInteger; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.machine.isa.types.AsmNumberFormatException; - -public class AsmFloatOperand implements AsmOperand -{ - private final int size; - private final int mantissa; - private final int exponent; - - public AsmFloatOperand(int size) - { - this.size = size; - switch (size) - { - case 8: - exponent = 4; - mantissa = 3; - break; - case 16: - exponent = 5; - mantissa = 10; - break; - case 32: - exponent = 8; - mantissa = 23; - break; - case 64: - exponent = 11; - mantissa = 52; - break; - case 128: - exponent = 15; - mantissa = 112; - break; - default: - if (size > 128 && size % 32 == 0) - { - exponent = (int) Math.round(Math.log(size) / Math.log(2)) - 13; - mantissa = size - exponent - 1; - } else - { - throw new IllegalArgumentException("Illegal floating point size: " + size); - } - } - } - - public AsmFloatOperand(int exponent, int mantissa) - { - if (exponent < 1 || mantissa < 1) - throw new IllegalArgumentException("illegal floating point specification: e=" + exponent + ", m=" + mantissa); - this.exponent = exponent; - this.mantissa = mantissa; - this.size = exponent + mantissa + 1; - } - - @Override - public int getSize() - { - return size; - } - - @Override - public BitVector parse(String s) throws AsmNumberFormatException - { - String cleaned = s.replace("_", "").toLowerCase(); - int len = cleaned.length(); - BigInteger res; - try - { - return bigDecToBitVector(new BigDecimal(cleaned)); - } - catch (NumberFormatException e) - { - throw new AsmNumberFormatException(e, "Error parsing %s: no valid float format", s); - } - } - - BitVector bigDecToBitVector(BigDecimal bi) throws AsmNumberFormatException - { - BigInteger raw = bi.unscaledValue(); - int mantLen = raw.bitLength(); -// bi. - int bitLength = raw.bitLength() - (bi.signum() - 1) / 2; - if (bitLength > size) - throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size); - BitVectorMutator bvm = BitVectorMutator.ofLength(size); - for (int i = 0; i < size; i++) - bvm.setLSBit(i, Bit.of(raw.testBit(i))); - return bvm.toBitVector(); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java deleted file mode 100644 index 29bbf73b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.mograsim.machine.isa; - -import java.util.Objects; - -public final class AsmInstruction implements AsmElement -{ - private final AsmOperation operation; - private final AsmOperands operands; - - public AsmInstruction(AsmOperation operation, AsmOperands operands) - { - this.operation = Objects.requireNonNull(operation); - this.operands = Objects.requireNonNull(operands); - } - - @Override - public int hashCode() - { - return Objects.hash(operands, operation); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof AsmInstruction)) - return false; - AsmInstruction other = (AsmInstruction) obj; - return Objects.equals(operands, other.operands) && Objects.equals(operation, other.operation); - } - - @Override - public String toString() - { - return String.format("%s %s", operation, operands).trim(); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java deleted file mode 100644 index d3ac80f9..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java +++ /dev/null @@ -1,95 +0,0 @@ -package net.mograsim.machine.isa; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.types.BitVector.BitVectorMutator; -import net.mograsim.machine.isa.types.AsmNumberFormatException; - -public class AsmIntegerOperand implements AsmOperand -{ - private final int size; - - public AsmIntegerOperand(int size) - { - this.size = size; - } - - @Override - public int getSize() - { - return size; - } - - @Override - public BitVector parse(String s) throws AsmNumberFormatException - { - String cleaned = s.replace("_", "").toLowerCase(); - int len = cleaned.length(); - BigInteger res; - try - { - if (cleaned.startsWith("0x")) - res = new BigInteger(cleaned.substring(2), 16); - else if (cleaned.endsWith("h")) - res = new BigInteger(cleaned.substring(0, len - 1), 16); - else if (cleaned.startsWith("0b")) - res = new BigInteger(cleaned.substring(2), 2); - else if (cleaned.endsWith("b")) - res = new BigInteger(cleaned.substring(2), 2); - else if (cleaned.endsWith("q")) - res = new BigInteger(cleaned.substring(0, len - 1), 8); - else - res = new BigInteger(cleaned); - } - catch (NumberFormatException e) - { - throw new AsmNumberFormatException(e, "Error parsing %s: no valid integer format", s); - } - return bigIntToBitVector(res); - } - - BitVector bigIntToBitVector(BigInteger bi) throws AsmNumberFormatException - { - int bitLength = bi.bitLength() - (bi.signum() - 1) / 2; - if (bitLength > size) - throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size); - BitVectorMutator bvm = BitVectorMutator.ofLength(size); - for (int i = 0; i < size; i++) - bvm.setLSBit(i, Bit.of(bi.testBit(i))); - return bvm.toBitVector(); - } - - public static void main(String[] args) throws AsmNumberFormatException - { - AsmIntegerOperand aio = new AsmIntegerOperand(4); - System.out.println(aio.parse("0")); - System.out.println(aio.parse("1")); - System.out.println(aio.parse("2")); - System.out.println(aio.parse("3")); - System.out.println(aio.parse("4")); - System.out.println(aio.parse("5")); - System.out.println(aio.parse("6")); - System.out.println(aio.parse("7")); - System.out.println(aio.parse("8")); - System.out.println(aio.parse("9")); - System.out.println(aio.parse("10")); - System.out.println(aio.parse("11")); - System.out.println(aio.parse("12")); - System.out.println(aio.parse("13")); - System.out.println(aio.parse("14")); - System.out.println(aio.parse("15")); -// System.out.println(aio.parse("16")); - System.out.println(aio.parse("-0")); - System.out.println(aio.parse("-1")); - System.out.println(aio.parse("-2")); - System.out.println(aio.parse("-3")); - System.out.println(aio.parse("-4")); - System.out.println(aio.parse("-5")); - System.out.println(aio.parse("-6")); - System.out.println(aio.parse("-7")); - System.out.println(aio.parse("-8")); -// System.out.println(aio.parse("-9")); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java deleted file mode 100644 index ddb56582..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.mograsim.machine.isa; - -import java.util.Objects; - -public final class AsmLabel implements AsmElement -{ - private final String name; - private AsmInstruction inst; - - public AsmLabel(String name) - { - this.name = Objects.requireNonNull(name); - } - - public String getName() - { - return name; - } - - public void setInst(AsmInstruction inst) - { - if (inst != null) - throw new IllegalStateException("Instrution already set for " + name); - this.inst = inst; - } - - @Override - public String toString() - { - return name + ":"; - } - - @Override - public int hashCode() - { - return Objects.hash(inst, name); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof AsmLabel)) - return false; - AsmLabel other = (AsmLabel) obj; - return Objects.equals(inst, other.inst) && Objects.equals(name, other.name); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java deleted file mode 100644 index ad641d6b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java +++ /dev/null @@ -1,11 +0,0 @@ -package net.mograsim.machine.isa; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.isa.types.AsmException; - -public interface AsmOperand -{ - int getSize(); - - BitVector parse(String s) throws AsmException; -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java deleted file mode 100644 index f286c315..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.machine.isa; - -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -public final class AsmOperands -{ - private final List operands; - - public AsmOperands(List operands) - { - this.operands = List.copyOf(Objects.requireNonNull(operands)); - } - - public List getOperands() - { - return operands; - } - - @Override - public int hashCode() - { - return operands.hashCode(); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof AsmOperands)) - return false; - AsmOperands other = (AsmOperands) obj; - return operands.equals(other.operands); - } - - @Override - public String toString() - { - return operands.stream().map(AsmOperand::toString).collect(Collectors.joining(", ")); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java b/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java deleted file mode 100644 index abafc45f..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.mograsim.machine.isa; - -import java.util.Objects; - -public final class AsmOperation -{ - private final String mnemonic; - - public AsmOperation(String mnemonic) - { - this.mnemonic = Objects.requireNonNull(mnemonic.toLowerCase()); - } - - public String getMnemonic() - { - return mnemonic; - } - - @Override - public String toString() - { - return getMnemonic(); - } - - @Override - public int hashCode() - { - return mnemonic.hashCode(); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (!(obj instanceof AsmOperation)) - return false; - AsmOperation other = (AsmOperation) obj; - return mnemonic.equals(other.mnemonic); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java b/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java deleted file mode 100644 index 8de66267..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.mograsim.machine.isa; - -public class NumericOperand -{ - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java b/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java deleted file mode 100644 index 8a9d2d02..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.machine.isa.types; - -public class AsmException extends Exception -{ - private static final long serialVersionUID = 1L; - - public AsmException() - { - super(); - } - - public AsmException(Throwable cause, String message, boolean enableSuppression, boolean writableStackTrace) - { - super(message, cause, enableSuppression, writableStackTrace); - } - - public AsmException(Throwable cause, String formatString, Object... formatArgs) - { - super(String.format(formatString, formatArgs), cause); - } - - public AsmException(String formatString, Object... formatArgs) - { - super(String.format(formatString, formatArgs)); - } - - public AsmException(Throwable cause) - { - super(cause); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java b/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java deleted file mode 100644 index 4fb4af6d..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java +++ /dev/null @@ -1,16 +0,0 @@ -package net.mograsim.machine.isa.types; - -public class AsmNumberFormatException extends AsmException -{ - private static final long serialVersionUID = 1L; - - public AsmNumberFormatException(Exception cause, String message, Object... formatArgs) - { - super(cause, message, formatArgs); - } - - public AsmNumberFormatException(String message, Object... formatArgs) - { - super(message, formatArgs); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java deleted file mode 100644 index d45c2772..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; -import net.mograsim.machine.mi.parameters.Mnemonic; - -public interface MicroInstruction -{ - - public MicroInstructionParameter getParameter(int index); - - public void setParameter(int index, MicroInstructionParameter param); - - /** - * @return The amount of {@link Mnemonic}s, the instruction is composed of - */ - public int getSize(); - - public static MicroInstruction create(Runnable updateCallback, MicroInstructionParameter... parameters) - { - return new StandardMicroInstruction(updateCallback, parameters); - } - - default BitVector toBitVector() - { - BitVector vector = BitVector.of(); - int size = getSize(); - for (int i = 0; i < size; i++) - vector = vector.concat(getParameter(i).getValue()); - return vector; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java deleted file mode 100644 index 6625fa66..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.mograsim.machine.mi; - -import java.util.Arrays; -import java.util.Optional; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; -import net.mograsim.machine.mi.parameters.ParameterClassification; - -public interface MicroInstructionDefinition -{ - /** - * @return The {@link ParameterClassification}s of which a MicroInstruction is composed. - */ - public ParameterClassification[] getParameterClassifications(); - - /** - * @throws IndexOutOfBoundsException - */ - public ParameterClassification getParameterClassification(int index); - - /** - * @return The amount of {@link MicroInstructionParameter}s in a {@link MicroInstruction} that follows this definition. - */ - public default int size() - { - return getParameterClassifications().length; - } - - /** - * @return The amount of {@link Bit}s in a {@link MicroInstruction} that follows this definition. - */ - public default int sizeInBits() - { - return Arrays.stream(getParameterClassifications()).mapToInt(e -> e.getExpectedBits()).reduce(0, (a, b) -> a + b); - } - - public default MicroInstruction createDefaultInstruction(Runnable updateCallback) - { - int size = size(); - MicroInstructionParameter[] params = new MicroInstructionParameter[size]; - ParameterClassification[] classes = getParameterClassifications(); - for (int i = 0; i < size; i++) - { - ParameterClassification classification = classes[i]; - params[i] = classification.getDefault(); - } - return new StandardMicroInstruction(updateCallback, params); - } - - public Optional getParameterDescription(int index); -} \ No newline at end of file diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java deleted file mode 100644 index 5d4fac6b..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.Memory; - -public interface MicroInstructionMemory extends Memory -{ - public MicroInstructionMemoryDefinition getDefinition(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java deleted file mode 100644 index 409d2816..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.MemoryDefinition; - -public interface MicroInstructionMemoryDefinition extends MemoryDefinition -{ - MicroInstructionDefinition getMicroInstructionDefinition(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java deleted file mode 100644 index 66aa229c..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.MachineException; - -public class MicroInstructionMemoryParseException extends MachineException -{ - - /** - * - */ - private static final long serialVersionUID = 6820101808901789906L; - - public MicroInstructionMemoryParseException() - { - super(); - } - - public MicroInstructionMemoryParseException(String message) - { - super(message); - } - - public MicroInstructionMemoryParseException(Throwable cause) - { - super(cause); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java deleted file mode 100644 index d049e377..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java +++ /dev/null @@ -1,106 +0,0 @@ -package net.mograsim.machine.mi; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; - -import net.mograsim.machine.MemoryDefinition; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; -import net.mograsim.machine.mi.parameters.ParameterClassification; - -public class MicroInstructionMemoryParser -{ - public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException - { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath)))) - { - parseMemory(memory, reader); - } - } - - public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input) - { - MicroInstructionMemoryDefinition def = memory.getDefinition(); - MicroInstructionDefinition miDef = def.getMicroInstructionDefinition(); - - long minAddr = def.getMinimalAddress(); - long maxAddr = def.getMaximalAddress(); - - String line; - long i = minAddr; - try - { - for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++) - { - long iFinal = i; - memory.setCell(i, parse(() -> memory.notifyObservers(iFinal), miDef, line)); - } - } - catch (IOException e) - { - e.printStackTrace(); - } - - for (; i <= maxAddr; i++) - { - long iFinal = i; - memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal))); - } - } - - public static MicroInstruction parse(Runnable updateCallback, MicroInstructionDefinition definition, String toParse) - { - int size = definition.size(); - String[] strings = toParse.split(","); - if (size != strings.length) - throw new MicroInstructionMemoryParseException("String does not match definition! The number of parameters does not match."); - MicroInstructionParameter[] params = new MicroInstructionParameter[size]; - ParameterClassification[] classes = definition.getParameterClassifications(); - try - { - for (int i = 0; i < size; i++) - { - params[i] = classes[i].parse(strings[i]); - } - return new StandardMicroInstruction(updateCallback, params); - } - catch (Exception e) - { - throw new MicroInstructionMemoryParseException(e.getCause()); - } - } - - public static void write(MicroInstructionMemory memory, String outputPath) throws IOException - { - try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath))) - { - write(memory, writer); - } - } - - public static void write(MicroInstructionMemory memory, OutputStreamWriter output) throws IOException - { - MemoryDefinition def = memory.getDefinition(); - long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1; - for (long i = min; i < max; i++) - { - output.write(toCSV(memory.getCell(i)) + "\n"); - } - } - - private static String toCSV(MicroInstruction inst) - { - int max = inst.getSize() - 1; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < max; i++) - { - sb.append(inst.getParameter(i).toString()); - sb.append(","); - } - sb.append(inst.getParameter(max).toString()); - return sb.toString(); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java deleted file mode 100644 index c565432f..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.mograsim.machine.mi; - -import net.mograsim.machine.mi.parameters.MicroInstructionParameter; - -class StandardMicroInstruction implements MicroInstruction -{ - private final Runnable updateCallback; - private MicroInstructionParameter[] parameters; - - StandardMicroInstruction(Runnable updateCallback, MicroInstructionParameter... parameters) - { - this.updateCallback = updateCallback; - this.parameters = parameters; - } - - /** - * @throws IndexOutOfBoundsException - */ - @Override - public MicroInstructionParameter getParameter(int index) - { - return parameters[index]; - } - - @Override - public int getSize() - { - return parameters.length; - } - - /** - * @throws IndexOutOfBoundsException - */ - @Override - public void setParameter(int index, MicroInstructionParameter param) - { - parameters[index] = param; - updateCallback.run(); - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java deleted file mode 100644 index 519c9b3a..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.mograsim.machine.mi; - -import java.util.HashSet; - -import net.mograsim.machine.MemoryObserver; -import net.mograsim.machine.standard.memory.MemoryException; - -public class StandardMicroInstructionMemory implements MicroInstructionMemory -{ - private MicroInstruction[] data; - private MicroInstructionMemoryDefinition definition; - private HashSet observers = new HashSet<>(); - - public StandardMicroInstructionMemory(MicroInstructionMemoryDefinition definition) - { - if (definition.size() > Integer.MAX_VALUE) - throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long"); - this.definition = definition; - data = new MicroInstruction[(int) definition.size()]; - } - - private int translate(long address) - { - return (int) (address - definition.getMinimalAddress()); - } - - @Override - public MicroInstruction getCell(long address) - { - int translatedAddress = translate(address); - MicroInstruction actual = data[translatedAddress]; - if (actual == null) - actual = data[translatedAddress] = definition.getMicroInstructionDefinition() - .createDefaultInstruction(() -> notifyObservers(address)); - return actual; - } - - @Override - public void setCell(long address, MicroInstruction data) - { - this.data[translate(address)] = data; - notifyObservers(address); - } - - @Override - public void registerObserver(MemoryObserver ob) - { - observers.add(ob); - } - - @Override - public void deregisterObserver(MemoryObserver ob) - { - observers.remove(ob); - } - - @Override - public void notifyObservers(long address) - { - observers.forEach(ob -> ob.update(address)); - } - - @Override - public MicroInstructionMemoryDefinition getDefinition() - { - return definition; - } - -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java deleted file mode 100644 index 73940280..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.mograsim.machine.mi.components; - -import java.util.List; - -import net.mograsim.logic.core.components.BasicCoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.machine.mi.MicroInstructionMemory; - -public class CoreMicroInstructionMemory extends BasicCoreComponent -{ - private final ReadWriteEnd data; - private final ReadEnd address; - private final MicroInstructionMemory memory; - - public CoreMicroInstructionMemory(Timeline timeline, int processTime, MicroInstructionMemory memory, ReadWriteEnd data, ReadEnd address) - { - super(timeline, processTime); - this.memory = memory; - this.data = data; - this.address = address; - memory.registerObserver(a -> update()); - address.registerObserver(this); - } - - public MicroInstructionMemory getMemory() - { - return memory; - } - - @Override - public List getAllInputs() - { - return List.of(address); - } - - @Override - public List getAllOutputs() - { - return List.of(data); - } - - @Override - protected TimelineEventHandler compute() - { - if (!address.getValues().isBinary()) - { - return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. - } - long addressed = address.getValues().getUnsignedValueLong(); - BitVector storedData = memory.getCell(addressed).toBitVector(); - return e -> data.feedSignals(storedData); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java b/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java deleted file mode 100644 index b3c41749..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.mograsim.machine.mi.components; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.machine.Machine; -import net.mograsim.machine.ModelMemory; -import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; - -public abstract class ModelMicroInstructionMemory extends ModelMemory -{ - private final Pin addrPin, dataPin; - private CoreMicroInstructionMemory memory; - private final MicroInstructionMemoryDefinition definition; - - public ModelMicroInstructionMemory(LogicModelModifiable model, MicroInstructionMemoryDefinition definition, String name) - { - super(model, 120, 150, name, "MPM", false); - this.definition = definition; - addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); - addPin(dataPin = new Pin(model, this, "D", definition.getMicroInstructionDefinition().sizeInBits(), PinUsage.OUTPUT, getWidth(), - 50)); - - init(); - } - - public MicroInstructionMemoryDefinition getDefinition() - { - return definition; - } - - public Pin getAddressPin() - { - return addrPin; - } - - public Pin getDataPin() - { - return dataPin; - } - - public CoreMicroInstructionMemory getCoreMemory() - { - return memory; - } - - public void setCoreModelBinding(CoreMicroInstructionMemory memory) - { - this.memory = memory; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java deleted file mode 100644 index 73acc661..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public class BooleanClassification extends MnemonicFamily -{ - String trueName, falseName; - - public BooleanClassification(boolean defaultValue, String trueName, String falseName) - { - super(defaultValue ? trueName : falseName, new MnemonicPair(trueName, BitVector.SINGLE_1), - new MnemonicPair(falseName, BitVector.SINGLE_0)); - this.trueName = trueName; - this.falseName = falseName; - } - - public Mnemonic get(boolean value) - { - return get(value ? trueName : falseName); - } - - @Override - public ParameterType getExpectedType() - { - return ParameterType.BOOLEAN_IMMEDIATE; - } - - @Override - public int getExpectedBits() - { - return 1; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java deleted file mode 100644 index c24cabeb..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java +++ /dev/null @@ -1,42 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public class IntegerClassification implements ParameterClassification -{ - private final int bits; - private final IntegerImmediate defaultValue; - - public IntegerClassification(int defaultValue, int bits) - { - this.bits = bits; - this.defaultValue = new IntegerImmediate(BitVector.from(defaultValue, bits)); - } - - @Override - public ParameterType getExpectedType() - { - return ParameterType.INTEGER_IMMEDIATE; - } - - @Override - public int getExpectedBits() - { - return bits; - } - - @Override - public IntegerImmediate parse(String toParse) - { - return new IntegerImmediate(new BigInteger(toParse), bits); - } - - @Override - public MicroInstructionParameter getDefault() - { - return defaultValue; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java deleted file mode 100644 index 419602c6..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.BitVector; - -public final class IntegerImmediate implements MicroInstructionParameter -{ - private BitVector value; - - public IntegerImmediate(BigInteger value, int bits) - { - this.value = BitVector.from(value, bits); - } - - public IntegerImmediate(BitVector value) - { - this.value = value; - } - - @Override - public BitVector getValue() - { - return value; - } - - @Override - public ParameterType getType() - { - return ParameterType.INTEGER_IMMEDIATE; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null) - return false; - if (!(obj instanceof IntegerImmediate)) - return false; - IntegerImmediate other = (IntegerImmediate) obj; - if (value == null) - { - if (other.value != null) - return false; - } else if (!value.equals(other.value)) - return false; - return true; - } - - /** - * @return The value of this IntegerImmediate as an unsigned BigInteger - */ - public BigInteger getValueAsBigInteger() - { - return value.getUnsignedValue(); - } - - @Override - public String toString() - { - return getValueAsBigInteger().toString(); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java deleted file mode 100644 index 2f135d29..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.logic.core.types.BitVector; - -public interface MicroInstructionParameter -{ - public BitVector getValue(); - - public ParameterType getType(); - - public static enum ParameterType - { - INTEGER_IMMEDIATE, BOOLEAN_IMMEDIATE, MNEMONIC - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java deleted file mode 100644 index 5ea2be05..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.logic.core.types.BitVector; - -public final class Mnemonic implements MicroInstructionParameter -{ - private final String text; - private final BitVector vector; - final MnemonicFamily owner; - private final int ordinal; - - Mnemonic(String text, BitVector vector, MnemonicFamily owner, int ordinal) - { - super(); - this.text = text; - this.vector = vector; - this.owner = owner; - this.ordinal = ordinal; - } - - public String getText() - { - return text; - } - - @Override - public BitVector getValue() - { - return vector; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + ((text == null) ? 0 : text.hashCode()); - result = prime * result + ((vector == null) ? 0 : vector.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - return this == obj; - } - - @Override - public ParameterType getType() - { - return owner.getExpectedType(); - } - - public int ordinal() - { - return ordinal; - } - - @Override - public String toString() - { - return text; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java deleted file mode 100644 index d6906fb3..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java +++ /dev/null @@ -1,262 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import java.util.Arrays; -import java.util.Map; -import java.util.stream.Collectors; - -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public class MnemonicFamily implements ParameterClassification -{ - private final Mnemonic[] values; - private final Mnemonic defaultValue; - private final String[] stringValues; - private Map byText; - private int vectorLength; - - public MnemonicFamily(String defaultValueName, String... names) - { - this(false, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String... names) - { - this(reverse, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); - } - - public MnemonicFamily(String defaultValueName, int bits, String... names) - { - this(false, defaultValueName, bits, names); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, int bits, String... names) - { - this.values = new Mnemonic[names.length]; - this.stringValues = new String[names.length]; - BitVector[] values = new BitVector[names.length]; - for (int i = 0; i < names.length; i++) - { - values[i] = BitVector.from(i, bits); - } - - setup(names, values, reverse); - - int defaultValueIndex = -1; - for (int i = 0; i < names.length; i++) - if (names[i].equals(defaultValueName)) - { - defaultValueIndex = i; - break; - } - this.defaultValue = this.values[defaultValueIndex]; - } - - public MnemonicFamily(String defaultValueName, String[] names, long[] values, int bits) - { - this(false, defaultValueName, names, values, bits); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, long[] values, int bits) - { - if (names.length != values.length) - throw new IllegalArgumentException(); - this.values = new Mnemonic[values.length]; - this.stringValues = new String[values.length]; - BitVector[] vectors = new BitVector[values.length]; - - for (int i = 0; i < vectors.length; i++) - { - vectors[i] = BitVector.from(values[i], bits); - } - - setup(names, vectors, reverse); - - int defaultValueIndex = -1; - for (int i = 0; i < names.length; i++) - if (names[i].equals(defaultValueName)) - { - defaultValueIndex = i; - break; - } - this.defaultValue = this.values[defaultValueIndex]; - } - - public MnemonicFamily(String defaultValueName, String[] names, BitVector[] values) - { - this(false, defaultValueName, names, values); - } - - public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, BitVector[] values) - { - if (names.length != values.length) - throw new IllegalArgumentException(); - this.values = new Mnemonic[values.length]; - this.stringValues = new String[values.length]; - - setup(names, values, reverse); - - int defaultValueIndex = -1; - for (int i = 0; i < names.length; i++) - if (names[i].equals(defaultValueName)) - { - defaultValueIndex = i; - break; - } - this.defaultValue = this.values[defaultValueIndex]; - } - - public MnemonicFamily(String defaultValueName, MnemonicPair... values) - { - this.values = new Mnemonic[values.length]; - this.stringValues = new String[values.length]; - - setup(values); - - int defaultValueIndex = -1; - for (int i = 0; i < values.length; i++) - if (stringValues[i].equals(defaultValueName)) - { - defaultValueIndex = i; - break; - } - this.defaultValue = this.values[defaultValueIndex]; - } - - private void setup(String[] names, BitVector[] values, boolean reverse) - { - MnemonicPair[] mnemonics = new MnemonicPair[values.length]; - for (int i = 0; i < values.length; i++) - mnemonics[i] = new MnemonicPair(names[i], reverse ? values[i].reverse() : values[i]); - setup(mnemonics); - } - - private void setup(MnemonicPair[] values) - { - for (int i = 0; i < values.length; i++) - { - this.values[i] = createMnemonic(values[i], i); - this.stringValues[i] = values[i].name; - } - if (values.length == 0) - vectorLength = 0; - else - { - vectorLength = values[0].value.length(); - for (int i = 1; i < values.length; i++) - if (values[i].value.length() != vectorLength) - throw new IllegalArgumentException("MnemonicFamily is not of uniform vector length!"); - } - byText = Arrays.stream(this.values).collect(Collectors.toMap(m -> m.getText(), m -> m)); - if (values.length != byText.keySet().size()) - throw new IllegalArgumentException("MnemonicFamily contains multiple Mnemonics with the same name!"); - } - - private Mnemonic createMnemonic(MnemonicPair mnemonicPair, int ordinal) - { - return new Mnemonic(mnemonicPair.name, mnemonicPair.value, this, ordinal); - } - - public Mnemonic[] values() - { - return values.clone(); - } - - public Mnemonic get(int ordinal) - { - return values[ordinal]; - } - - public Mnemonic get(String text) - { - return byText.get(text); - } - - @Override - public MicroInstructionParameter getDefault() - { - return defaultValue; - } - - public boolean contains(Mnemonic m) - { - if (m != null) - return m.owner == this; - else - return false; - } - - public boolean contains(String value) - { - return byText.keySet().contains(value); - } - - public int size() - { - return values.length; - } - - public int getVectorLength() - { - return vectorLength; - } - - @Override - public boolean conforms(MicroInstructionParameter param) - { - return ParameterClassification.super.conforms(param) && (param instanceof Mnemonic ? contains((Mnemonic) param) : false); - } - - @Override - public ParameterType getExpectedType() - { - return ParameterType.MNEMONIC; - } - - @Override - public int getExpectedBits() - { - return vectorLength; - } - - public String[] getStringValues() - { - return stringValues.clone(); - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + Arrays.hashCode(values); - return result; - } - - @Override - public boolean equals(Object obj) - { - return this == obj; - } - - @Override - public Mnemonic parse(String toParse) - { - Mnemonic parsed = get(toParse); - if (parsed == null) - throw new UnknownMnemonicException(toParse); - return parsed; - } - - public static class MnemonicPair - { - public final String name; - public final BitVector value; - - public MnemonicPair(String name, BitVector value) - { - this.name = name; - this.value = value; - } - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java deleted file mode 100644 index c81f6e55..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; - -public interface ParameterClassification -{ - /** - * Determines whether a {@link MicroInstructionParameter} is part of this class of parameters. - * - * @return true if the classification contains the Parameter, false otherwise - */ - public default boolean conforms(MicroInstructionParameter param) - { - return param.getType().equals(getExpectedType()) && param.getValue().length() == getExpectedBits(); - } - - /** - * @return The type of the parameters in this classification. - */ - public ParameterType getExpectedType(); - - /** - * @return The number of bits of the parameters in this classification. - */ - public int getExpectedBits(); - - public MicroInstructionParameter parse(String toParse); - - public MicroInstructionParameter getDefault(); -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java b/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java deleted file mode 100644 index 3af062e3..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.mograsim.machine.mi.parameters; - -import net.mograsim.machine.MachineException; - -public class UnknownMnemonicException extends MachineException -{ - /** - * - */ - private static final long serialVersionUID = 701558899889830975L; - - public UnknownMnemonicException() - { - super(); - } - - public UnknownMnemonicException(String message) - { - super(message); - } - - public UnknownMnemonicException(Throwable cause) - { - super(cause); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java deleted file mode 100644 index 40abba9f..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java +++ /dev/null @@ -1,94 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import java.util.List; - -import net.mograsim.logic.core.components.BasicCoreComponent; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.timeline.TimelineEventHandler; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire.ReadEnd; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.MainMemoryDefinition; - -/** - * A memory component that only allows access to words of a specific width - */ -public class CoreWordAddressableMemory extends BasicCoreComponent -{ - private final MainMemory memory; - private final static Bit read = Bit.ONE; - - private ReadWriteEnd data; - private ReadEnd rWBit, address; - - /** - * @param data The bits of this ReadEnd are the value that is written to/read from memory; The bit width of this wire is the width of - * a memory word - * @param rWBit The value of the 0th bit dictates the mode: 0: Write, 1: Read - * @param address The bits of this ReadEnd address the memory cell to read/write - */ - public CoreWordAddressableMemory(Timeline timeline, int processTime, MainMemory memory, ReadWriteEnd data, ReadEnd rWBit, - ReadEnd address) - { - super(timeline, processTime); - MainMemoryDefinition definition = memory.getDefinition(); - if (data.width() != definition.getCellWidth()) - throw new IllegalArgumentException( - String.format("Bit width of data wire does not match main memory definition. Expected: %d Actual: %d", - definition.getCellWidth(), data.width())); - if (rWBit.width() != 1) - throw new IllegalArgumentException( - String.format("Bit width of read/write mode select wire is unexpected. Expected: 1 Actual: %d", rWBit.width())); - if (address.width() != definition.getMemoryAddressBits()) - throw new IllegalArgumentException( - String.format("Bit width of address wire does not match main memory definition. Expected: %d Actual: %d", - definition.getMemoryAddressBits(), address.width())); - this.memory = memory; - this.data = data; - this.rWBit = rWBit; - this.address = address; - memory.registerObserver(a -> update()); - data.registerObserver(this); - rWBit.registerObserver(this); - address.registerObserver(this); - } - - @Override - protected TimelineEventHandler compute() - { - if (!address.getValues().isBinary()) - { - if (read.equals(rWBit.getValue())) - return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. - return e -> data.clearSignals(); - } - long addressed = address.getValues().getUnsignedValueLong(); - if (read.equals(rWBit.getValue())) - { - BitVector storedData = memory.getCell(addressed); - return e -> data.feedSignals(storedData); - } - BitVector transData = data.getValues(); - boolean isNewData = !transData.equals(memory.getCell(addressed)); - return e -> - { - data.clearSignals(); - if (isNewData) - memory.setCell(addressed, transData); - }; - } - - @Override - public List getAllInputs() - { - return List.of(data, rWBit, address); - } - - @Override - public List getAllOutputs() - { - return List.of(data); - } -} \ No newline at end of file diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java deleted file mode 100644 index 5183e323..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import net.mograsim.machine.MachineException; - -public class MemoryException extends MachineException -{ - - /** - * - */ - private static final long serialVersionUID = 6416796315595721079L; - - public MemoryException() - { - super(); - } - - public MemoryException(String message) - { - super(message); - } - - public MemoryException(Throwable cause) - { - super(cause); - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java deleted file mode 100644 index 986dbe50..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.PinUsage; -import net.mograsim.machine.Machine; -import net.mograsim.machine.MainMemoryDefinition; -import net.mograsim.machine.ModelMemory; - -public abstract class ModelWordAddressableMemory extends ModelMemory -{ - private final Pin addrPin, dataPin, rWPin; - private CoreWordAddressableMemory memory; - private MainMemoryDefinition definition; - - public ModelWordAddressableMemory(LogicModelModifiable model, MainMemoryDefinition definition, String name) - { - super(model, 120, 150, name, "RAM", false); - this.definition = definition; - - addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); - addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, getWidth(), 50)); - addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, getWidth(), 70)); - - init(); - } - - public MainMemoryDefinition getDefinition() - { - return definition; - } - - public Pin getAddressPin() - { - return addrPin; - } - - public Pin getDataPin() - { - return dataPin; - } - - public Pin getReadWritePin() - { - return rWPin; - } - - public void setCoreModelBinding(CoreWordAddressableMemory memory) - { - this.memory = memory; - } - - public CoreWordAddressableMemory getCoreMemory() - { - return memory; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java b/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java deleted file mode 100644 index 4a54ad9f..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import java.math.BigInteger; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.machine.GenericMemory; -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.MainMemoryDefinition; - -public class WordAddressableMemory extends GenericMemory implements MainMemory -{ - private final int cellWidth; - private final MainMemoryDefinition definition; - - public WordAddressableMemory(MainMemoryDefinition definition) - { - super(definition); - this.cellWidth = definition.getCellWidth(); - this.definition = definition; - } - - @Override - public BitVector getCell(long address) - { - BitVector data = super.getCell(address); - return data == null ? BitVector.of(Bit.ZERO, cellWidth) : data; - } - - @Override - public BigInteger getCellAsBigInteger(long address) - { - BitVector data = getCell(address); - return data == null ? BigInteger.valueOf(0) : data.getUnsignedValue(); - } - - @Override - public void setCellAsBigInteger(long address, BigInteger data) - { - setCell(address, BitVector.from(data, cellWidth)); - } - - @Override - public MainMemoryDefinition getDefinition() - { - return definition; - } -} diff --git a/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json b/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json deleted file mode 100644 index 8202b0c4..00000000 --- a/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "version": "0.1.0", - "map": { - } -} \ No newline at end of file diff --git a/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java b/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java deleted file mode 100644 index ae8e8153..00000000 --- a/net.mograsim.machine/test/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.mograsim.machine.standard.memory; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.math.BigInteger; -import java.util.Random; -import java.util.stream.LongStream; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.types.Bit; -import net.mograsim.logic.core.types.BitVector; -import net.mograsim.logic.core.wires.CoreWire; -import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; -import net.mograsim.machine.MainMemoryDefinition; - -class WordAddressableMemoryTest -{ - - private Timeline t = new Timeline(10); - - @ParameterizedTest(name = "seed = {0}") - @MethodSource("seedsForRandom") - public void wordAddressableMemoryLargeTest(long seed) - { - CoreWire rW = new CoreWire(t, 1, 2); - CoreWire data = new CoreWire(t, 16, 2); - CoreWire address = new CoreWire(t, 64, 2); - ReadWriteEnd rWI = rW.createReadWriteEnd(); - ReadWriteEnd dataI = data.createReadWriteEnd(); - ReadWriteEnd addressI = address.createReadWriteEnd(); - - @SuppressWarnings("unused") - CoreWordAddressableMemory memory = new CoreWordAddressableMemory(t, 4, - new WordAddressableMemory(MainMemoryDefinition.create(64, 16, 4096L, Long.MAX_VALUE)), data.createReadWriteEnd(), - rW.createReadOnlyEnd(), address.createReadOnlyEnd()); - - Random r = new Random(seed); - for (long j = 1; j > 0; j *= 2) - { - for (int i = 0; i < 100; i++) - { - BitVector bAddress = BitVector.from(4096 + i + j, 64); - addressI.feedSignals(bAddress); - t.executeAll(); - String random = BigInteger.valueOf(Math.abs(r.nextInt())).toString(5); - random = random.substring(Integer.max(0, random.length() - 16)); - random = String.format("%16s", random).replace(' ', '0'); - random = random.replace('2', 'X').replace('3', 'Z').replace('4', 'U'); - BitVector vector = BitVector.parse(random); - dataI.feedSignals(vector); - rWI.feedSignals(Bit.ZERO); - t.executeAll(); - rWI.feedSignals(Bit.ONE); - t.executeAll(); - dataI.clearSignals(); - t.executeAll(); - - assertEquals(vector, dataI.getValues(), "seed=" + seed + ", j=" + j + ", i=" + i); - } - } - } - - public static LongStream seedsForRandom() - { - return LongStream.range(0, 20); - } -} diff --git a/net.mograsim.plugin.branding/.classpath b/net.mograsim.plugin.branding/.classpath deleted file mode 100644 index bc3587db..00000000 --- a/net.mograsim.plugin.branding/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/net.mograsim.plugin.branding/.gitignore b/net.mograsim.plugin.branding/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.plugin.branding/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.plugin.branding/.project b/net.mograsim.plugin.branding/.project deleted file mode 100644 index b0c2a7a1..00000000 --- a/net.mograsim.plugin.branding/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.plugin.branding - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 5db31272..00000000 --- a/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,8 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 diff --git a/net.mograsim.plugin.branding/META-INF/MANIFEST.MF b/net.mograsim.plugin.branding/META-INF/MANIFEST.MF deleted file mode 100644 index a85a3578..00000000 --- a/net.mograsim.plugin.branding/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Mograsim branding -Bundle-SymbolicName: net.mograsim.plugin.branding;singleton:=true -Bundle-Version: 0.1.0.qualifier -Bundle-Vendor: Mograsim Team -Automatic-Module-Name: net.mograsim.plugin.branding -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.eclipse.ui.intro;bundle-version="3.5.500", - org.eclipse.ui.intro.universal;bundle-version="3.3.400" diff --git a/net.mograsim.plugin.branding/about.ini b/net.mograsim.plugin.branding/about.ini deleted file mode 100644 index 4f49cd29..00000000 --- a/net.mograsim.plugin.branding/about.ini +++ /dev/null @@ -1,2 +0,0 @@ -aboutText=Mograsim - Modular Graphical Simulator by Christian Femers, Daniel Kirschten and Fabian Stemmler -featureImage=icon_blue-orange_32.png \ No newline at end of file diff --git a/net.mograsim.plugin.branding/build.properties b/net.mograsim.plugin.branding/build.properties deleted file mode 100644 index 37fc21c9..00000000 --- a/net.mograsim.plugin.branding/build.properties +++ /dev/null @@ -1,6 +0,0 @@ -bin.includes = META-INF/,\ - .,\ - eclipse_with_icon_32.png,\ - about.ini,\ - icons/,\ - icon_blue-orange_32.png diff --git a/net.mograsim.plugin.branding/eclipse_with_icon_32.png b/net.mograsim.plugin.branding/eclipse_with_icon_32.png deleted file mode 100644 index c180b842..00000000 Binary files a/net.mograsim.plugin.branding/eclipse_with_icon_32.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/icon_blue-orange_32.png b/net.mograsim.plugin.branding/icon_blue-orange_32.png deleted file mode 100644 index a0dc941a..00000000 Binary files a/net.mograsim.plugin.branding/icon_blue-orange_32.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/icons/.gitkeep b/net.mograsim.plugin.branding/icons/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai b/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai deleted file mode 100644 index d082a8e1..00000000 --- a/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai +++ /dev/null @@ -1,760 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[5 0 R 25 0 R 44 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - uuid:fa56d82b-e056-4a05-9c36-ef2b93c3828f - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - proof:pdf - - - - - saved - xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T03:03:20+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - - EmbedByReference - - K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai - - - - - - - application/pdf - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T03:03:20+02:00 - 2019-06-22T03:20:05+02:00 - 2019-06-22T03:20:05+02:00 - - - - 256 - 240 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqp3FzbW0RluJUhiHV5GCj7zkMmSMBciAPNlCEpGoiyxzUfzC0G1JWAveSD/fYolf9ZqfgDmm1 HtBp4bRuZ8uXzLtMPY2afOojzY7efmXq0hItbeK3U9C1ZGH0/Cv/AAuafN7SZpfRER+38fJ2eLsP GPqJP2LLWf8AMDWqNDLOkLdJRSBKexAWv0VyGKfaGp3BlXf9I/R9jLJHRYOYF931FOLXyBfS0fVd VlkPVo4mY/8ADvX/AIjmyxdg5Jb5ckj7v1n9Tg5O14DbHAD3/qH60fJ5d8kaLCJ7/wBCFO899KAp p/xkIT8M2WHsTTR5Q4j57/scLJ2pnn/FXu2Sa6/OP8ntFqg12yUDalkjTjb/AJhkkGbTFouH6YiP wpwp5JS+ok+9JLr/AJye/KyH+7mvLnp/dWzD/k4Y8yBpZsEHJ/zlZ+WyuqraarID1dYIKD58p1P3 DD+Un5Krxf8AOUn5YO3FhqEQp9p7dSP+FkY4Pys1Tmw/5yD/ACkvCFGuC3c/s3EFxH/wxj4f8NkT p5jorLtI83+VNZIXSdZsr9z+xb3EUj/SqsWGVGBHMKm+RV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KobUNSsdPgM95MsMfYsdyfBR1J+WUZ9Tjwx4pmg24cE8hqIssH1n8yZ3LRaVF6S9P rEoBf5qn2R9Nc5fWe0cjthFeZ5/L+13+m7EA3yG/IfrYfeX97ey+rdzvPJ4uSafLw+jOdzZ55Tcy ZHzd3iwwxiogAJxofkrV9U4ysv1W0O/rSDcj/ITqf1ZsdD2Nmz7n0w7z+gOFq+1MWLb6pdwZedI8 l+U7I6hqtxDCkf2ry+dVFadEDUWvgAK51ui7Fw4uQ4pd53ed1PaebLtfCO4PNvN3/OVflewL2/lq xl1eYbC6mrb2/wAwCDK/yKr8830NITz2de8f8y/85BfmhrjOo1T9F2zdINOX0KfKWrTf8PmTHTwH RLz68vr29na4vbiS5uG+1NM7SOfmzEnLwKVQxV2KuxV2KuxVsEg1HXFWWeXvzX/MTy+UGma7dJCn S3mf6xDTwEc3NR9AyuWGMuYV6z5T/wCcs72MpD5q0hZ4+jXmnnhIB4mGQlWPydflmNPR9xV7d5P/ ADL8k+bowdD1OKa4pyayc+lcrTrWJ6MQPFaj3zFnilHmEMnytXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYqxHzJ5+tbIva6bxubobNL1jQ/R9o/hnPdo9uwxXHF6p9/Qfrd1ouyJZPVk9MftP6nnl9qF7 f3BuLyZppW/aY9B4AdAPYZx+fUTyy4pmy9Liwwxx4Yigu07TL3UblbaziMsp3NOgHix6AYdPpp5p cMBZRmzwxR4pGg9C0jyhouhWrajq8sTvApklnmIWCELuT8VBt/M34Z2nZ3YePFRn65/YPc8vrO1p 5do+mP2l5Z+Yv/OUdjaGXT/JUK3k4qratcKRAp6VhjNGenZmoPZhnUY9Le8nUvnjzD5o8w+Y783+ uX81/dGtHmaoUHfiiCiovsoAzNjARFBKV5JXYq7FXYq7FXYq7FXYq7FXYq7FVSCeaCZJoJGimjIa OVCVZWG4KsNwRir2T8v/APnJrzVojRWfmVTrmmCi+uSFvYx4iQ0Evyfc/wAwzFyaUHlsr6X8o+d/ LPm7Tvr+g3qXUQoJovsyxMf2ZYz8Sn8D2zBnjMTRQnmQV2KuxV2KuxV2KuxV2KuxV2KrJpooYmlm cRxIOTuxoAB3JORnMRBJNAMoxMjQ3LzbzV54n1AvZ6eWhstw8nR5R/Bfbv38M4rtTtuWW4Y9od/U /sep7P7KGP1T3n937WJZz7uU48u+Wr3WrjjF+7tkP764IqF9h4t7Zsez+zZ6mVDaI5n8dXB1uuhg jvvLoGW+Z/Nnkv8ALPy/696/Bnr9XtUo11dSAdht07saKv3DPQND2fDFHgxj3n9byOo1M80uKRfK P5k/m95q89XbC8lNppCNW20mFj6S06NIdjK/+U30AZvMWEQ97QwbLVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVTLy/wCY9c8u6nHqei3kljexfZliPUVqVdTVXU03VgQcjKIkKKvq38o/z+0fzf6O ka0E03zGQFRa0t7o/wDFJJ+F/wDis/QT21+bTmO45IeuZjK7FXYq7FXYq7FXYq7FVk00UETzTOEi jBZ3bYADck5GcxEGRNAMoxMjQ5l5b5t82zaxMbe3Jj06M/CvQyEftN/AZwnavap1B4Y7Yx9vmXru zuzhhHFLeZ+xjeaV2id+WPLNxrd0RUx2cRHrzf8AGq/5R/DNp2Z2bLUz7oDmf0DzcDX66OCPfI8g n35lfmV5d/LTy7HFFGkupyoV0zTFO7Hp6stNxGD1PVjsPb0TR6OMYiEBUQ8dkySySMpGyXx15o80 655n1ibV9aumuryY9TsqIPsxxr0VF7AfrzcQgIigwSnJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq2rMrBlJDA1BGxBGKvpf8j/+cgTevb+V/OE/+ltSPT9YkNPVPRYpz/P2V/2uh33ODn09 bxQ+g8wldirsVdirsVdirsVeZ+d/NR1Cc6fZv/oMLfvHH+7XH/Go7ff4ZxHbXanjS8OB9A+0/qer 7K7P8MccvrP2ftYlnPu5THQtFudY1BLSH4V+1NKeiIOp/pmZodHLUZBCPxPcHF1eqjhhxH4ebL/P /nnQPyz8oibgslywMWmWFaPPN1LMevFa8nb6OpAz0nRaOMIiEBUQ8VmzSySMpcy+MPMXmLWPMesX GsaxcNc31y3KSRugHZVHRVUbADpm7jERFBrSzJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FX1D/zj3+dTarHD5P8AMc9dTiXhpV7Id50Uf3MjE7yqPsn9of5XXA1GCvUEPesw1dir sVdirsVYh5+8yGytv0bbNS6uVrM46pGdqfNv1Zz3b3aPhx8KP1S5+Q/a7rsjRccvEl9MeXmf2PNc 4l6pdFHJLIsUal5HIVFG5JJoAMlGJkQBzLGUgBZ5PULVNI8keVbrU9UlWKK2jNxqFx1JI6IvjueK juT756L2V2cMGMRH1y5/juDxWv1hz5L/AIRyfGf5i+fdV87+ZrjWb4lIj+7sbStVggBPBB4nux7n 7s6fHjEBThsXyxXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVSCea3mjngka KaJg8UqEqyspqrKRuCDir7Q/JH80ovPPlvheMq+YNNCx6jGKD1ARRLhQOz0+KnRvamavPi4D5Iej 5QrsVdiqF1TUINOsJr2f+7hXlTuT0VR8ztlGp1EcOMzlyDdgwnLMQHMvGL++uL68mu7g8pZmLN4D wA9gNhnmufPLLMzlzL3OHFHHERjyCHyltZv+XOgiWV9XnWqREpag93/af/YjYf2Z1Hs9oeInNLkN o+/vdB21q6HhDrzeN/8AOTn5lHVNYXydp0v+4/S3D6kynaS7ptGfFYgf+CJ/lGd/pcVDiLzbwrMt XYq7FXYq9A/I7yjofmvz5FpGtwtPYtbTStGrtGeSAFTyQg5TnmYxsK+jP+hbfyk/6tc3/SVcf815 hfmZ96Hf9C2/lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm/wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/p KuP+a8fzM+9Xf9C2/lJ/1a5v+kq4/wCa8fzM+9Xf9C2/lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm /wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/pKuP+a8fzM+9Xf9C2/lJ/1a5v+kq4/wCa8fzM+9Xf9C2/ lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm/wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/pKuP+a8fzM+9X f9C2/lJ/1a5v+kq4/wCa8fzM+9XnP58fk/5D8o+SI9V0Kykt71r2KAyPPLIODpISOLsw6qMu0+aU pUUvnnM1XYq7FXYqyT8vfO2oeTPNVnrlmSyRNwvLcGgmt2I9SM9txuvgwByGSAkKV926Tqljq2mW up2Eomsr2JJ7eUd0cch8j4jNQRRooRWBXYq89/MnWS88WlRN8EVJbindyPgX6F3+nOQ9o9ZchhHT c+/o9L2JpqByHrsGEZy7v1exs5r28htIRWWZwi/Sev0ZbgwnJMQjzkWvLkEImR5Bn35h+abX8vvy 8ur+34+vbxrbabG37dzJshI703kYdwDnqOi0sYiOOP0h4PNlOSZkeZfDk88080k8zmSaVi8sjGrM zGrMSepJzeMFPFXYq7FXYq9Z/wCcYv8AyakH/MHc/wDERmPqvoV9hZrEIO61nR7SX0bq+t7eUAEx yyojUPQ0Yg4REqpf4l8uf9XWz/6SIv8AmrDwnuV3+JfLn/V1s/8ApIi/5qx4T3K7/Evlz/q62f8A 0kRf81Y8J7ld/iXy5/1dbP8A6SIv+aseE9yu/wAS+XP+rrZ/9JEX/NWPCe5Xf4l8uf8AV1s/+kiL /mrHhPcrv8S+XP8Aq62f/SRF/wA1Y8J7ld/iXy5/1dbP/pIi/wCaseE9yu/xL5c/6utn/wBJEX/N WPCe5Xf4l8uf9XWz/wCkiL/mrHhPcqYgggEGoO4IyKvHv+cp/wDyWcX/AG0rf/k3LmTpPr+CvkXN kl2KuxV2KuxV9L/84q+fTPaXfky9lrJbcrvSuR6xMf30Q/1WIcD3bwzB1eP+JD6EzCVSurmK1tpb mU0jhRpHPsoqcry5BCJkeQFs8cDOQiOZeJX15LeXk13MayTuXb2qen0Z5jnzHJMzPORt73FjEIiI 5BQypsZp+WulCW8n1KRarbj04Sf53HxEfJf1503s5peKZyn+HYe8/s+90PbmoqIxjrufd+PueM/8 5T+cjqPmu18tW71tdGjElyAdjc3Cht/9SPjT5nPQdJChfe808PzLV2KuxV2KuxV6z/zjF/5NSD/m Duf+IjMfVfQr7CzWIfHv/OTv/k1J/wDmDtv+InNnpfoS8mzIV2KuxV2KuxV2KuxV2KuxV2Kv0T03 /jnWv/GGP/iIzSnmh5N/zlP/AOSzi/7aVv8A8m5cyNJ9fwV8i5skuxV2KuxV2Kp15M8zXXlfzTpm vWtTJYTrI6DbnEfhlj/2cbMv05GceIEK++7K8tr2zgvbVxLbXUaTQSDoySKGVh8wc05FIY7+YmoG 20L6upo944T34L8TfqA+nND7QajgwcI5zNfDm7fsbDxZuL+aHl2cK9a7FXrvla0GmeWICY2ZzGbm REFXYuOVAO7caDPReyNP4WniOp3PxeJ7SzeJnkeg2+T5F1/8r/ze1vXL/WLvy3eG41C4kuZdloDI xag+LoK0GdPHLACrcJAf8qW/NT/qWrz/AIFf+asPjw71d/ypb81P+pavP+BX/mrHx4d6u/5Ut+an /UtXn/Ar/wA1Y+PDvV3/ACpb81P+pavP+BX/AJqx8eHerv8AlS35qf8AUtXn/Ar/AM1Y+PDvV6P+ QH5b+etA/MSHUdZ0a4sbJbWdDPKAFDMo4jYnrlGoyxMaBV9PZgIfHv8Azk7/AOTUn/5g7b/iJzZ6 X6EoP/nH7yzo/mbzlfaNrEAnsrrS7gMOjKwki4ujfssp3Bw6iRjGx3qx38yPy81jyL5ik0q+Bltn rJp96BRJ4a0DAVNGHRl7H2ocniyCYtWKZYrsVdirsVdiqrbW1xc3EdtbRtNcTMI4YYwWd3Y0VVUb kk4kq9s82/k9beSfyWn1HUkWXzPfXNr9Yk2YW8ZYn0Iz4/zsOp26DMSGbjyUOSvDsy1fonpv/HOt f+MMf/ERmlPNDzj/AJyI8t675h8gx2Gi2Ul9eC+hlMEQBbgqSAtuR05DL9NIRlZV80/8qW/NT/qW rz/gV/5qzO8eHel3/KlvzU/6lq8/4Ff+asfHh3q7/lS35qf9S1ef8Cv/ADVj48O9Xf8AKlvzU/6l q8/4Ff8AmrHx4d6u/wCVLfmp/wBS1ef8Cv8AzVj48O9Xf8qW/NT/AKlq8/4Ff+asfHh3q+pfyOXz Ha+QbPSPMdpLZalpbNbrFNs7W9eUL7E7AEoP9XNfnrisIQv5l3nq6vBag1W3iqR4NIan/hQucJ7S ZuLMIfzY/f8AgPU9h4qxGX84/cxDOdd2idNtDeahbWo/3fKkZ9gzAE/dl+mxeJkjD+cQGrPk4IGX cHtUyikMQU8C4FV24hAXH0VWmeoAU8ASrYq7FXYq7FXYq7FXYq7FXx7/AM5O/wDk1J/+YO2/4ic2 el+hKJ/5xY/8mZL/ANs24/5ORYNX9HxV9KfmF5C0bzv5dm0fUl4P/eWV2BV4JgCFkXcVG9GXuMwc eQwNhD4h82+VNZ8q69c6Jq8PpXdsdmG6SId0kjb9pWHT7juDm1hMSFhKT5JXYq7FWwCTQdcVfVH/ ADj7+S36Ct4vNfmG3prU61060kG9rGw+26kbTMP+BHuTTX6jPfpHJCdf85O/+Srn/wCYy2/4kchp frV8eZs0v0T03/jnWv8Axhj/AOIjNKeaERgV2KuxV2KuxV2KuxVQkPC8haoCyhoiKbswHNN/BVV/ vwq8k823P1jzJfvWvGUx/wDIsBP+Nc847VycepmfOvls9v2dDhwQHlfz3SjNc5rIfIVsJvM1uSKr CryEfJSB+LDNx2Fj4tVHys/Y6ztefDpz50Ff85vzfk/L290f0NPXUZb6O55xvKYgio0XE7K9amue j4MPHbxzzr/ob3Uf+pZh/wCktv8Aqll35Md6Xf8AQ3uo/wDUsw/9Jbf9UsfyY71d/wBDe6j/ANSz D/0lt/1Sx/JjvV3/AEN7qP8A1LMP/SW3/VLH8mO9Xf8AQ3mpf9SzD/0lt/1Sw/kx3q7/AKG81L/q WYf+ktv+qWP5Md6u/wChvNS/6lmH/pLb/qlj+THerv8AobzUv+pZh/6S2/6pY/kx3q8k/Mrz1N54 8zvr0tmti7wxw/V1cyAemKV5FV6/LMjFj4BSs4/5xY/8mZL/ANs24/5ORZVq/o+KvrnNahgX5vfl Xp/n3QDEOMGuWas2mXp6BjuYpKf7rem/8p3HgbsOUwPkr4t1XSdR0nUrnTNRga2vrRzFcQOKMrL+ sdwRsRm0BBFhKEphV1MVep/kF5XhufzQ0uLW7HlF9VfUbSGdfhai1hl4nqP2lr7HMfUS9BpX2Pms Q8n/AOcnf/JVz/8AMZbf8SOZOl+tXx7TNkl9AW3/ADltqMNvFCPLULCJFTl9aYV4ilf7rMM6Md6q n/Q3mpf9SzD/ANJbf9UsfyY71d/0N5qX/Usw/wDSW3/VLH8mO9Xf9Deal/1LMP8A0lt/1Sx/JjvV 3/Q3mo/9SzD/ANJbf9UsfyY71d/0N7qP/Usw/wDSW3/VLB+THerv+hvdR/6lmH/pLb/qlj+THerv +hvdR/6lmH/pLb/qlj+THeqa+U/+cnbnzD5p0jRrjQorNL+7itxcrcGQo0rcBRTGoNeXHr3yM9Lw gm0I+/lMt9cSnrJK7H6WJzyLPLiySPeS+gYY1ADuAUMpbGY/llEDq11L/JBxH+ydT/xrnSezUf30 j3R/SHR9uy/dxH9L9Dxn/nLG99Xz7ptoDVbfTEYjfZ5J5a/8Kq56JpB6T73mHiWZSuxV2Kt4quph V1MVdTFXUxV1MVew/wDOLI/5CZL/ANs24/5ORZjav6Pir63zWIdiryf89Pyci85aadY0iNU8zWSf CBQC6iXf0mP84/YP0HbcZOnz8Jo8lfIU0EsMrwzI0c0bFJI3BVlZTQqwO4IObNL138h/yZfzZfLr 2txFfLVm/wC7ibb65Kp+wP8AitSPjPf7I70xtRn4dhzV6ckaR/8AOUSpGoRE0YKiKKAAR0AAGY/+ R+KHtWYivKP+cm//ACVk/wDzGW3/ABI5k6T61fH1M2aXUxV1MVdTFXUxVphiVW4FdirsVTLy1eNZ eY9KvFrytry3mFOtY5Vbbp4YJCwVfSGeHPobsVZz+VwPr6ie3GLf6WzqfZj6p/D9Lz/b3KHx/Qnm o+R/KGvaldXmtaPaajdRssKTXEKSOsYjRggJFacmJ+nOyGSQGxebQ/8Ayqb8s/8AqWNN/wCkaP8A pj40+8q7/lU35Z/9Sxpv/SNH/THxp95V3/Kpvyz/AOpY03/pGj/pj40+8q7/AJVN+Wf/AFLGm/8A SNH/AEx8afeVb/5VP+Wn/Usad/0jx/0w+NPvKu/5VP8Alp/1LGnf9I8f9MfGn3lXf8qn/LT/AKlj Tv8ApHj/AKY+NPvKu/5VP+Wn/Usad/0jx/0x8afeVfL3/OQWh6Pov5izWOk2cVjZi1gcW8CBEDMp qeI8c2OmkTCylN/+cWx/yEuX/tnT/wDJyLI6z6Pir61zVoecWf5tWtv+bOseRdXKwrztzot10DNL awyNbv8A5TO7MhPX7PhmQcHoEgr0fMdXzv8A85N/lppcNp/jaw42908qQanABRZi9QswoNn2o3j1 69c/SZT9JV7n5Ttre28raRBbxrDDHZwBI0AVQPTXoBmFM+oq8s/9ek/7dH/MvMn/ACPxV7RmIryn /nJr/wAlbP8A8xlt/wASOZOk+tXyBTNql9x2H5Vfls9jbO/lrTmZokLMbeOpJUVPTNMc075lCv8A 8qn/AC0/6ljTv+keP+mPjT7yrv8AlU/5af8AUsad/wBI8f8ATHxp95V3/Kp/y0/6ljTv+keP+mPj T7yrv+VT/lmf+mY03/pHj/pg8afeVa/5VN+Wf/Usab/0jR/0x8afeVd/yqb8s/8AqWNN/wCkaP8A pj40+8q7/lU35Z/9Sxpv/SNH/THxp95Vw/Kb8swajyxptf8AmHj/AKY+NPvKvMs8lfQ3YEs5/K4/ v9QFeqxGnyLZ1PsyfVP3D9Lz/b3KHx/QmOufmX5G8r6tcafr2qx2N5KUuI4XSViYmjVA1URh9pGG dnHFKQsB5tAf8r4/KT/qYof+RVx/1Tw/l59yu/5Xx+Un/UxQ/wDIq4/6p4/l59yu/wCV8flJ/wBT FD/yKuP+qeP5efcrY/Pj8pSaf4ih/wCRVx/1Tx/Lz7lXf8r0/Kf/AKmGH/kVP/1Tw/lsncrv+V6f lP8A9TDD/wAip/8Aqnj+Wydyu/5Xp+U//Uww/wDIqf8A6p4/lsncrv8Alen5T/8AUww/8ip/+qeP 5bJ3K+a/z38yaJ5j8/zalot0t5YtbQRrOoZRyQEMKOFO3yzY6aBjCilO/wDnF0f8hKl/7Z0//JyL K9Z9HxV9aZq0PjL/AJyCLL+cOvMpowNmQRsQRZQZt9L/AHY/HVL2v8hvzjXzPZp5d1yYf4itU/cT vt9bhTv/AMZUH2h3HxeNMPU6fh3HJCN/5yY/8ldP/wAxdt/xI4NH9avRPLf/ACjul/8AMJB/yaXM efMq8p/9ei/7dH/MvMr/ACHxV7PmGryr/nJj/wAldP8A8xdt/wASOZWj+tXyFTNql9oWP54/lVHZ W8b+YIQ6RorD0p9iFAP+681B02S+SFf/AJXp+U//AFMMP/Iqf/qng/LZO5Xf8r0/Kf8A6mGH/kVP /wBU8fy2TuV3/K9Pyn/6mGH/AJFT/wDVPH8tk7lWn89vymHXzFCP+eVx/wBU8H5efcrX/K+Pyk/6 mKH/AJFXH/VPH8vPuV3/ACvj8pP+pih/5FXH/VPH8vPuV3/K+Pyk/wCpih/5FXH/AFTx/Lz7lbH5 8flKTQeYoa/8Yrj/AKp4/l59ysL1CIw39zEescrof9ixGeUaiPDkkO4l7/DLigD3gIfKW1mP5ZSg avdRfzwch/sXUf8AG2dH7NTrNId8f0h0fbsf3UT/AEv0PGv+csrL0/PmmXYFFuNNRCfFop5a/wDC uuei6Q+k+95h4jmUrsVdirYNCDhVF0yxXUxV1MVdTFXUxV67/wA4vD/kJMv/AGzp/wDk5FmJrfo+ KvrLNUh8af8AOQY/5C9r/wD0af8AUFBm40v92Px1SwGxvLuwvIL2zlaC7tnWWCZDRkdDVWB8QcyC LFFXuHnT817Tzz+S08N0Vh8w2Vzai/thsJF5ECeIfyt+0P2Tt0Irg48Bhk8lfRHlz/lHtL/5hIP+ TS5r58yh5X/69D/26P8AmXmV/kPir2XMNXlX/OS//kr5/wDmLtv+JHMrR/Wr5Fpm2S6mKupirqYq 6mKqE/2gPbISVSyKuxV2Kpn5Zs2vvMmk2Sglrq8t4QB1rJKq+/jkZGgVfU/m62+r+ZL9Kfak9Qf8 9AH/AONs8g7Wx8GpmPO/nu9r2dPiwRPlXy2SfNc5zIPIlz6Hma2BNFmDxt9Kkj/hgM2/YeTh1UfO x9jre1ocWnl5UUd+cH5PR/mJdaSRqZ0uTT0uOUvofWBIshiotPVh48eJz0fDm4L2eNee/wDQn/8A 39v/AHL/APs6y/8AOeSu/wChP/8Av7f+5f8A9nWP5zyV3/Qn/wD39v8A3L/+zrH855K7/oT/AP7+ 3/uX/wDZ1j+c8lVh/wA4j0AH+K/+5f8A9nOS/P8A9H7U23/0KR/39f8A3L/+znD+f/o/b+xbd/0K R/39f/cv/wCznH8//R+39i27/oUj/v6/+5f/ANnOP5/+j9v7Ft5F+ZXkX/BPmh9C+u/pDhDHN9Y9 L0a+oK04c5On+tmXhyccbpWZ/wDOMA/5CTL/ANs6f/k5FlOt+j4q+sM1KHxt/wA5Aj/kLuvf9Gn/ AFBQ5udJ/dj8dUvPKZkq6mKvvzy5/wAo9pf/ADCQf8mlzn58yh5X/wCvP/8Abp/5l5l/5D4q9kzC V5X/AM5K/wDkr5/+Yu3/AOJHMvR/3ivkembdL6Btv+cTfWt4pv8AFXH1EV+P1CtOQrT/AHpzXHX/ ANH7VVf+hSP+/r/7l/8A2c4/n/6P2/sW3f8AQpH/AH9f/cv/AOznH8//AEft/Ytu/wChSP8Av6/+ 5f8A9nOP5/8Ao/b+xbUn/wCcQeTFv8W0r/2r/wDs5yB1t9PtVb/0J/8A9/b/ANy//s6x/OeSHf8A Qn//AH9v/cv/AOzrH855K7/oT/8A7+3/ALl//Z1j+c8lTbyn/wA4uJ5f8zaXrb+YhfDTbmK5FqbL 0uZiYMvx+vJxoRX7JyM9VYIpWX/mZZmPVbe7A+G4i4k/5UZ3/Bhnn/tJhrLGf84fc9R2HlvGY9x+ 9h2c47xEafdG0v7e6HWCRJP+BYHLtPl8PJGf80gtWbHxwMe8PbWdWWORWPCoI478gw4j6PirnqAI IsPAkUqYUOxV2KuxV2KuxV2KuxV8k/8AOSY/5CfP/wAwlv8A8RObjRf3aUR/zjEP+QkS/wDbOn/5 ORYNd9HxUvq7NQh8cf8AOQA/5C5r3/Rp/wBQUObrSf3Y/HVLzymZKupir768u/8AKP6Z/wAwkH/J tc56f1FDyz/153/t0/8AMvMv/IfFXseYSvLP+ck//JYT/wDMXb/8SOZei/vFfJFM3CX6Bad/xz7X /jFH/wARGc6eaERgV2KuxV2KuxV2KuxVawrIlRULVg3gaU/UTirG/wAwtP8ArWgmdRWS0cSbdeJ+ Fv11+jNH2/p+PT8Q5wN/oLtux83BmrpLZ5ZnCPXOxV615TuxqnleKNndXVGtZXRirqVHEFWG4biQ a56J2NqPE08T1jt8v2U8V2nh8PPLuO/zfG/mLzf+Z+h69qGjXXmnWPrGn3ElvIfr91QmNivIfvOj UqM6mMIEXQcFL/8AlZX5i/8AU1ax/wBJ91/1UyXhR7grv+VlfmL/ANTVrH/Sfdf9VMfCj3BXf8rK /MX/AKmrWP8ApPuv+qmPhR7grafmX+YisCfNOrkDqDf3P/VTCMcO4KmA/MX8wCAR5n1ah6f6dc/8 15f4MO4fJXpH/OP/AJu82ap+YkNpqet399am1nY29zdTTRllUUPB2ZajMXWYoiFgBX09mpQ+Sv8A nJIf8hOn/wCYS3/4ic3Oi/u0sK8necdb8o6sdV0Zo0u2iaAmVBIvByCdj/qjL8mITFFWbf8AQyP5 nf7/ALT/AKR1/rlH5HGtMB80eY9T8za7c63qhRr674es0a8F/dxrEtFHT4UGZOPGIigqVUySupir 060/5yI/Mm1tYbWKa1EUCLFGDbqTxQBRU18BmKdFjJVJf+Vtecf8Y/4u9SD9M+h9W5+kPT9OlPsV 65P8tHh4eip//wBDI/md/v8AtP8ApHX+uV/kca0kvm785PO3mvR20jV5Ld7N3SUiKEI3JDVfiByz HpYQNhWDUy9X3/p3/HPtf+MSf8RGc5Lmh5x/zkRq+raV5BjutLvbiwuTfQoZ7WV4ZOJSQleUZU0N OmZWiiJToi9lfNH/ACsT8wf+pn1b/pOuf+a82vgQ/mj5JQl1+ZX5hB+CeaNXFOpF/c9f+RmVTxw7 h8lUf+VlfmL/ANTVrH/Sfdf9VMh4Ue4K7/lZX5i/9TVrH/Sfdf8AVTHwo9wV3/KyvzF/6mrWP+k+ 6/6qY+FHuCu/5WV+Yv8A1NWsf9J91/1Ux8KPcFfWf5C22vr+XVlqGvX91qGoaq73gkvJpJ5Egaiw orSFjxKLzA/ys12oI4qHRD0C4giuLeSCUcopVZHHirChzFyQE4mJ5EUyhMxkCOYeJ6jYy2N9PZy/ 3kDlCfGnQ/SN88x1GE4shgecS97hyjJASHVDZS2sy/LbVRDqE2nufgul5xf8ZEG4+lf1Z0ns5quH IcZ/i5e8fs+50fben4oCY/h+4vHv+cqfJrWHme080W6f6Lq8YhumHa6gUKCf9eILT/VOeh6Sdiu5 5h4ZmWrsVdirsVRdnN/upj/q/wBMtxy6K9d/5xvH/ITYP+YS4/4iMp1392pfWeaVDB/Nv5OeSvNe sNq+rxTteMiRExTFF4oKDYDMjHqZwFBUm/6Fu/LL/fF3/wBJDf0yz89kW3f9C3fll/vi7/6SG/pj +eyLbv8AoW78sv8AfF3/ANJDf0x/PZFt3/Qt35Zf74u/+khv6Y/nsi27/oW78sv98Xf/AEkN/TH8 9kW3f9C3fll/vi7/AOkhv6Y/nsi27/oW78sv98Xf/SQ39Mfz2Rbd/wBC3fll/vi7/wCkhv6Y/nsi 27/oW78sv98Xf/SQ39Mfz2Rbd/0Ld+WX++Lv/pIb+mP57ItvT4o1iiSJPsooVa+AFBmGryj/AJya /wDJcxf9tCD/AIhLmboP7z4KHyfcSiJK/tHZRm2kaCUuJJNT1OY6tYq7FXYqnvkjyvc+afNmmaDb 1DX06pK4FSkQ+KWT/YRqzZHJPhiSr75s7S3s7SC0tkEVtbxrFDGuwVEAVVHyAzTk2hVwKwD8ytGK yw6tEvwvSK5p/MPsMfmNvuzkvaPR0RmHXY/o/U9H2JqdjjPvH6WC5yr0KtaXU1pdRXMJpLC4dD7q a5ZiynHMSjzBtryYxOJieRegee/LNp+Yf5eXNhEVWa6iE9hIx2juot0BPhyqjexOeoaHVicY5I8i 8JnwnHMxPR8OXNtPa3MttcRmK4gdo5omFGV0PFlI8QRm+Ba1LFXYq7FWwSDUdcVeu/8AON+p2kX5 jQyXc0cCra3ALyMEU1UU3YgZDVHix11V9W/4h0D/AKudp/yPj/5qzU8Eu5Dv8Q6B/wBXO0/5Hx/8 1Y8Eu5Xf4h0D/q52n/I+P/mrHgl3K7/EOgf9XO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P8A5qx4Jdyu /wAQ6B/1c7T/AJHx/wDNWPBLuV3+IdA/6udp/wAj4/8AmrHgl3K7/EOgf9XO0/5Hx/8ANWPBLuV3 +IdA/wCrnaf8j4/+aseCXcrv8Q6B/wBXO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P/mrHgl3K7/EOgf9 XO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P8A5qx4JdyvKv8AnJPWtIn/AC7RLe9gnkF/A3pxSI7UCSdl JOZmiBjOz3K+TZpWlcs30DwGZ8pWlTyKuxV2KuxV9N/84reQWtdPu/Od7HSW9DWmmBhuIUb97KP9 d14j/VPjmBq8m/Ch9AZhq7FUPqFjBf2U1nOKxTKVbxHgR7g75TqMEcsDCXKTbhynHMSHMPGNT0+4 06+ms5xSSFqE9iOoYexG+ea6nTyw5DCXMPc4M0csBKPIoXKG5mn5da8ILltKnakVweVuT0ElN1/2 Q/H5503s9ruCXgy5S5e/9v45ui7a0nFHxBzHP3fseR/85O/lo2n6ovnPTYf9B1BhHqqoNo7nospp 2lGxP83u2eg6XLY4S8y8FzLV2KuxV2KtqzKQymhHQ4QVTK1vEkoj7SfgcyIZLVFUyxLqYq6mKupi rqYq6mKupirqYq6mKupirqYqpzTRwrVzv2Hc5GUgEJXPO8zVbYDovhmNKVqpZFXYq7FXYqyj8uPI 1/51812miWtUhc+pfXIFfRtkI9R9++9F8WIyvLkERavurTNNstM06206xiEFnZxJDbxL0VIwFUfc M1JNm0InArsVdirFfPfls6jZ/XrZK3lsvxKOrx9SPmvUZoe3OzvGh4kR64/aP2O47J1vhS4JfTL7 C8wzhnrFyO6OroSrqQVYbEEbgjCCQbCCARRen6bcaX5z8r3Ol6rEsyzRG31CA7VDDZ18K9QR0Ye2 eidkdo+PjB/jjz/X8Xi+0NGcGTb6Ty/U+N/zL/L7U/I3mefSLuslq1ZNOvKUWaAn4W/1h0cdj7Uz qcWQTFuCxTLFdirsVdirsVRlvqDpRZPjXx7jLY5a5qmEU0UoqjA+I7/dmRGQPJV9MKXUxV1MVdTF XUxV1MVdTFXMVUVY0A6k4lUFPqKD4YRyP8x6ZTLL3IS93d2LOase5ygm1W4FdirsVdiqra21xdXM VrbRtNcTuscMSAszuxoqqB1JJxJV9qfkr+WEPkXywEuVVte1ALLqcwoeJH2IFP8ALHX6WqfDNVny 8Z8kPQspV2KuxV2KuxV5v568qG0lfVLJP9EkNbiMf7rcn7Q/yWP3HOM7c7L8MnLAeg8/I/qL1HZP aHGPDn9Q5ef7WHZzbvEdo2r3Wk38d5bnddpEPR0PVTmXo9XPT5BOP9ocfU6aOaBjJmfnbyd5e/M7 yf8AV3YRzislheUBktrim4YeB6OvcfQc9I0GujkiMkOR/FPE6jBLFMxlzfGPmfyxrPljW7nRtYgM F7bGjDqrqfsujftKw3BzewkJCw1JVkldirsVdirsVbBKmoNCOhGFUVFqVwmzUce/X78sGUhUSmqw n7alT7bjLBmCqy39o3+7KfMEZMZIqvF1bH/dq/fh4496VpvbQdZB9FT+rB4ke9Cm+p2y/Zq3yFP1 5E5oqhpNVkO0aBfc7nIHMeioSSaWQ1di3zykyJ5qswK7FXYq7FXYq2ASaDrir6m/5x9/JU6HFF5t 8xQU1iZK6bZSChtY2BBkcH/drqdh+yPc7a/UZ79I5Ie6ZiK7FXYq7FXYq7FWpI0kRo5FDo4KsrCo IOxBBwSiCKPJIJBsPL/N/lCbS5Wu7RS+nOa7bmIk/Zb/ACfA/wCZ4btbsg4Dxw3xn/Y/set7O7SG UcMvr+9i+aJ2yb+XPMd3ot36kfx270E8BOzDxHgw7HNj2f2hPTTsbxPMfjq4Wt0Uc8aP1dCyL8wP y68r/md5ejmDiHUYkb9H6ko+OJuvpSr+0leq9uoz0XRa6M4icDcT+Pm8bmwyxSMZDd8e+bPKOv8A lTWJdI1u2NtdR7qesciHpJE/RlPj9B3zdQmJCw1pNkldirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVXIjyOscal3chURRUknYAAYq+nfyO/ID9FPb+Z/NsIbUhSTT9KcVFueqyzDvJ3Vf2ep+L7 OBn1F7RQ98zDV2KuxV2KuxV2KuxV2KtSRpIjRyKHRwVZWFQQdiCDglEEUeSQSDYedeavIktqXvdL UyW27SWw3dP9X+ZfxGcd2p2GYXPELj3dR7vJ6bs/tYTqGTaXf3sMzmneppoPmG+0a69W3PKFqetb sfhcfwPgcz9D2hk007jy6jvcPV6OGeNS59CzLXvL3kv8zPL5tNQiDsm8ci0W6tZGH2kbfrT/AFW7 53/Z/aUM0eLGfeHkNVpJ4ZVL5975V/Mz8mvNPkW4aadDfaI7Ug1WFTw3OyzLuYn+ex7E5vsWYT97 jsBy5XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FU28teVtf8zarHpeiWb3l5JvxQUVF7vI5oqKP FjkZTERZV9YflJ+Q2i+S1j1TUympeZSKielYbavUQKw+12Mh38OO9ddm1BlsOSHquY6uxV2KuxV2 KuxV2KuxV2KuxV2KsX8x+RrLUi9zZ0tb01JNP3bn/KA6H3GaPtHsSGa5Q9M/sPv/AFu20Xas8Xpl 6ofaHnOpaTqGmzmC9haJ/wBkndWHirDY5xmp0uTDLhmKL0+DUQyi4G1OyvruxuFubSVoZk6Ov6iO hHscjhzzxS4oGpM8uKOSPDIWHoGi+d9L1W3bT9ajjjaZTHIJAGt5VbYhg1QK9w22dj2f2/DJUcno n39D+p5nWdkTh6sfqj9v7XnH5i/84v6RqXq6l5NmTTbt6u2mykm0cnf9045NF8t18OIzq8WrPXd0 z528z+TvM3le++pa9p01jMa8DIKxyAdTHItUce6k5nRmJclSbJK7FXYq7FXYq7FXYq7FXYq7FXYq q21rc3VxHb2sLz3Ep4xQxKXdmPZVWpJxJV7V+Xv/ADjF5j1cx33mqQ6Np5oRZrRryQe43WKv+VVv 8nMXJqgOW6vpTyt5Q8ueVdMXTdCso7O2G7ld3kb+aRzVnb5nMCczI2UJxkVdirsVdirsVdirsVdi rsVdirsVdirsVUbuytLyAwXUSzRN1RxUfMeByrLhhkjwzAIbMeWUDcTRYVrP5aqeUukzce/1aY7f JX/r9+c1rPZzrhPwP6/1/N3um7b6ZB8R+phuoaRqWnScL23eE9AzD4T8mHwn6DnN6jSZcJqcSPx3 u8w6jHlFwIKP0Tzdq+klUjk9a1HW3k3Wn+Seq/RmVou1s2n2BuPcfxs4+q7OxZtyKl3hmMfmXyj5 ks20/WLeIxy7PaXqLJEx6bMw49+9DnWaPt3Dk5ngl5/r/sed1PZOXHuPUPL9TAPNv/OLXk3VOdz5 du5dGuH+JYf96LU132ViJFr7PT2zoserPXd1rx/zJ/zjp+Z+il3hsU1e2U7S2DiRqdv3T8Ja/JTm VHUwPkrzrUdK1PTZzb6jZz2VwOsNxG8T/wDAuFOXAg8lQuFXYq7FXYq7FVyI8jqiKXdjRVUVJJ7A DFWZeXvyc/MrX+DWOg3KQPuLi6Ato6fzBpinIf6tcqlmgOqvWvKn/OJdGSbzVrAIFC1lpw69955R 94Ef05jz1ncEPbPKf5f+TvKcPp6DpcNo5HGS5pzncf5cz8nI9q0zEnklLmVZDkFdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVWyRxyoUkQOjfaVgCD8wcjKIkKIsJjIg2Eg1DyH5eu6skLWsh/ agPEf8Car9wzU6jsLTZOQ4T5fq5Oyw9rZ4czxDzY7efljeLU2d5HIOyyqUP3rzzT5vZqY+iYPv2/ W7LF27E/XEj3b/qQ1tovn3Rj/oYk9MfsxukiH/nmSf1ZTj0faGn+i68iCPl+xtnqtHn+qr8wQfmn Fr5y8x24C6noszAdZY0dNh3oQwP35sMXbGphtlxS94BDhZOzcEv7vIPiQmJ80eWtRh+r6hAyo/WC 8tyyntvs6/fmxxds4Tz4oHzB/Q4U+zMseVS9xSq5/Kz8o9b5N+gdOkJ3Y2qiBt+59AxnNrh1vH9E r+LhzxTh9QISa5/5xr/KaY1j06e2Fa0iupz9H7xpMyBqptaBf/nFr8sWcsH1FAeircJQffGTh/Nz VEQf84yflVGV5213NxFCHuXFdup4cPwwfmpqnWn/AJEflNYkGLy9DIw73Ek09Tt2ld17eGROomeq ss0ry55e0gU0rTLTTxSn+iwRw7f7BVysyJ5lUxyKuxV2KuxV2KuxV2KuxV2KuxV2Kv8A/9k= - - - - - - 1 - False - False - - 119.000000 - 118.999512 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Standard-Farbfeldgruppe - 0 - - - - - - Document - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/Shading<>>>/Thumb 50 0 R/TrimBox[0.0 0.0 119.0 119.0]/Type/Page>> endobj 46 0 obj <>stream -H‰tVËn1 Ýç+òãÚygۂX!„XÀþ -èâ‚Tø‰c'™;s[ZuÆ'3±íL>=ù‡Oìß=y÷â؋tûÛôòç»ûê;&©ÑãõqýóÓ=|øÂþç_÷âÅ3~Û ³øÜ)ùåt]¯[¨Äqêœý–u·P¼¸­fê©íÏ{¥–ãmûĬ¯NÛ¿vžï~g܁ymbóôÃ}ÆB©)ùÜA{âÄpÕ}*T²ˆÂ͗ EÒBwÆW×"•^¤åh¢æâÎøºp­Ô»ŸŽz_Ya'ÚÃN|uƒã„“þðsÎíbU}ÙK¸1±þ€]©(aÈ2ÌÃs Z–2³ EKýøÍ?|yfÿ÷Ù¿ÿ懢ÿë¦^:\æ¦-%í?Í)EJ9[ Q[ˆ^:Ŏ‚V -(z¢ŠÏBœñ²KÉ슈«(F)Õغ8ôk -y᭑öS£°F3k³õìmKò›íIËã‚­ãíy‚rÁ ×nDÇCÎU Œ,6KCûq³ôò¡3EµP‰nҠ̝Ñ"%Pˆ-ÞÔÙ"T-êçjv  ¹ÁWQjý†5%½ãHÊ]QY¹i””1OëꞍލüf¦VúaòÇ»FǬ­S±Í„côåë{zäÒîI‰…ŠWãÀbX¨Zf“ё›ŽB¦ªw„ov,ocáà^²5ãNõM\€ùl/G!’9ac0nGcÅ(eY)˜ª+›{YW±f¥Åƒ¶΁T‰¦¹ „I ¥ ¯Òy‹–_½â¢SÙ(b`€tV¶B¹íáYŠ¯ ó0…Ëќݠi#À= -%ï -žÑî]'«H>.t(™;…YÿÉ]qSñfr¦Þžè½|úMbnííaIµíâ¶QS7¨FØ; Œi€Õç” sÐ6[ãeºóç}6$æêcBU˺̓qõקaU±»'UðåÚ³(TÓ(Í°pÐg‰¬9¼¡‰Î„~Э—㸢I±Ž[­ÖùDoy´ûnß{ÍðÛk†PÑ´ë´Œ¡ÊŠò¢œ¥–úñµŠb‘sYoôßÄ?(ŸÝ?uô­· -endstream endobj 50 0 obj <>stream -8;UT3d0Te-#Xc.2r%d*YWt%"+'N:(9\^ -endstream endobj 51 0 obj [/Indexed/DeviceRGB 255 52 0 R] endobj 52 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 49 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 44 0 obj <> endobj 56 0 obj [/View/Design] endobj 57 0 obj <>>> endobj 48 0 obj <> endobj 47 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (Eclipse_with_icon.ai) -%%CreationDate: 6/22/2019 3:20 AM -%%Canvassize: 16383 -%%BoundingBox: 404 366 514 469 -%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%%DocumentFiles:K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 399.6704 358.1719 518.6704 477.1714 -%AI3_TemplateBox: 639.5 400.5 639.5 400.5 -%AI3_TileBox: 43.1904 129.791 843.8301 705.7915 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI9_OpenToView: 251.75 551.25 4 1528 954 26 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 60 0 obj <>stream -%%BoundingBox: 404 366 514 469 -%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 -%AI7_Thumbnail: 128 120 8 -%%BeginData: 22957 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FD31FFCFCFC9C9C2FD04C1C8C8CFCAFD6EFFCACFC8C89FC1BAC098 -%C1C1C9C9FD70FFCAC9C2C1C0C1C0C0BAC1C2C9CAFD0BFFA8A87EA87D7E7D -%A87DA8A8A9A8FD58FFCAC9C1C198C09EC198C0C1C9CAFD07FFA8A8535328 -%2821280028002100220021002821282853537E7EFD51FFCFC2C1C0C1C0C1 -%C0C1C0C8CAFD07FF7D772828212800282828212828282128282821282828 -%21282128002828537DA9FD4BFFC9C2BAC098C1C0C198C1C2CFFD05FFA977 -%4C0028002800282128002821280028212800282128002821280028212800 -%280021002853A8A9FD45FFC9C1C0C0C1C1C1C0C1C0C8CAFD05FF7D532128 -%212821282828212828282128282821282828212828282128282821282828 -%212828280028214C53FD42FFC9C198C19EC198C198C09FCFFD04FFA87721 -%220028002821280028212800282128002821280028212800282128002821 -%2800282128002821280028002100537EFD3EFFC2C1C0C1C1C1C0C1C0C1C9 -%FD05FF532800282828272828282728282827282828272828282728282827 -%28282827282828272828282728282827282828272821284CA8FD3AFFC998 -%C0C0C19EC1C0C098C8CFFFFFFFA853002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%2821280028212200537EFD36FFCAC8C0C1C0C1C1C1C0C1C1CFFD04FF7728 -%002821282828212828282128282821282828212828282128282821282828 -%212828282128282821282828212828282128282821282828002853FD34FF -%C9C098C19EC198C198C09FFD04FFA8282100282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%280028212800282128002821280022217DFD31FFC2C1C0C1C1C1C0C1C0C1 -%C9FD04FF7D21282728282827282828272828282728282827282828272828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828280053A8FD2DFFCF9FC0C0C19EC1C0C198C1C9FFFFFFA828 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%0028212800287DFD2BFFCFC1C1C0C1C1C1C0C1C0C1CAFFFFFF7D28212821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%282828002853FD29FFC998C19EC198C19EC198C1CAFFFFFF522100282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%00282128002128A9FD26FFC9C0C1C1C1C0C1C1C1C0C8FD04FF4C28212828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827FD0428A9FD24FFC9BAC19EC1C0C19EC1BAC2FFFFFFA92828 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800A8FD22FFC9C0C1C1C1C0C1C1C1BAC8 -%FD04FF282821282828212828282128282821282828212828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%28212828282128282821282828212828282128282800A2FD20FFC998C198 -%C19EC198C198C1CAFFFFA921282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%28007EFD1EFFCFC0C1C0C1C1C1C0C1C0C1CFFFFFFFFD0428272828282728 -%282827282828272828282728282827282828272828282728282827282828 -%272828282728282827282828272828282728282827282828272828282728 -%28282728282827FD052800A8FD1CFFCF9EC1C0C19EC1C0C198C1CAFFFFFF -%282100282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%21280028212800282128002821280028212800282128002800A8FD1BFFC1 -%C1C0C1C1C1C0C1C0C1C9FFFFFFFD04282128282821282828212828282128 -%282821282828212828282128282821282828212828282128282821282828 -%212828282128282821282828212828282128282821282828212828282128 -%282821282828212828A9FD19FF9FC09EC198C19EC198C0C8FFFFFF520000 -%282128002821280028212800282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%2821280028212800282128002821280028212800282128002827FD18FFC9 -%C1C1C1C0C1C1C1C0C1C2FFFFFF7D28212828282728282827282828272828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%28272828282728282827FD0428FD16FFCAC198C1C0C19EC1C0C09EFFFFFF -%7E2821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212153FD15FFC8C0C1C0C1C1C1C0C1C0CFFFFFA928002828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%28282821282828212828282128282821282828212828287EFD13FFC998C1 -%9EC198C19EC198C8FFFFFF53002800282128002821280028212800282128 -%002800280028002800280028002800280028002800280028002800280028 -%002800280028002800280028002800280028002800280028002800282128 -%00282128002821280028212800280028A8FD11FFCFC0C1C1C1C0C1C1C1C0 -%C1CFFFFFA800282728282827282828272828282728282827FD3B28272828 -%282728282827282828272828280077FD11FFC1C09EC1C0C19EC1C0C0C9FF -%FFFF212821280028212800282128002821280028212828FFA8A9A8FFA8A9 -%A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FF -%A8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8FF772821280028212800282128 -%002821280028212800A8FD0FFFC9C1C0C1C0C1C1C1C0C1C1FFFFFF532821 -%28282821282828212828282128282821282153FD37FFA800282828212828 -%28212828282128282821FD0428FD0FFFC198C19EC198C19EC198CAFFFF7E -%2800280028212800282128002821280028212800284CFD37FF7D21002821 -%280028212800282128002821280028210053FD0DFFC9C0C1C1C1C0C1C1C1 -%C0C8FFFFFF5321282728282827282828272828282728282827282153FD37 -%FFA800282828272828282728282827282828272828282128A8FD0CFFC1C0 -%9EC1C0C19EC1C0C0C9FFFFA8002821280028212800282128002821280028 -%2128002852FD37FF7D220028212800282128002821280028212800282128 -%007DFD0BFFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828212828282128282821 -%28282821282828212828280053FD37FFA821282128282821282828212828 -%28212828282128282821FD0BFFC198C19EC198C19EC198CAFFFF7D280028 -%00282128002821280028212800282128002821214CFD06FFA87EA87EA87E -%A87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87E -%A87EA87EA87EA8A8FD05FF7D280028002821280028212800282128002821 -%280028212152FD09FFCFC0C1C1C1C0C1C1C1C0C8FFFFFF53212827282828 -%272828282728282827282828272828280053FD06FF522828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%28212828FD06FFA821282728282827282828272828282728282827282828 -%2128A9FD08FFC1C09EC1C0C19EC1C0C0C9FFFFA800282128002821280028 -%21280028212800282128002821224CFD06FF530028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%28A8FD05FF7D282128002821280028212800282128002821280028212800 -%7DFD07FFCAC1C0C1C0C1C1C1C0C1C1FFFFFF532821282828212828282128 -%2828212828282128282821282153FD06FF53282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%FD06FFA8002828282128282821282828212828282128282821FD0428FD07 -%FFC998C19EC198C19EC198C8FFFFA8280028002821280028212800282128 -%002821280028212800284CFD06FF53002800280028002821280028212800 -%282128002821280028212800282128002821280028002800280028A8FD05 -%FF7D210028212800282128002821280028212800282128002800217DFD06 -%FFFD04C1C0C1C1C1C0C1CAFFFFA800282728282827282828272828282728 -%28282728282827282153FD06FF532827282153FD04282728282827282828 -%2728282827282828272828282728282827282853FD0528FD06FFA8002828 -%2827282828272828282728282827282828272828280077FD05FFCAC198C1 -%C0C19EC1C0C19FFFFFFF4C28212800282128002821280028212800282128 -%00282128002852FD06FF530028002877FF21282128002821280028212800 -%282128002821280028212800282128007EA82800282128A8FD05FF7D2100 -%282128002821280028212800282128002821280028212821FD05FFC9C0C1 -%C0C1C1C1C0C1C0C8FFFFA828002821282128212821282128212821282128 -%2128212821280053FD06FF52282828007DFFA80028282821282828212828 -%2821282828212828282128282821280077FFA92128212828FD06FFA80028 -%2128212821282128212821282128212821282128212821227DFD04FF9FC0 -%9EC198C19EC198C0C9FFFFFF7EA87EA87EA87EA87EA87EA87EA87EA87EA8 -%7EA87EA87EA87EA8A8FD06FF530028212152FFFF7E002821280028212800 -%2821280028212800282128002821280053FFFF7E2800280028A8FD05FFA8 -%A87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA8FFFFFF -%CFC1C0C1C0C1C1C1C0C1C1FD25FF52282828007DFFFFFF7E002827282828 -%272828282728282827282828272828280053FFFFFFA92828272828FD25FF -%CA98C1C0C19EC1C0C198C8FD25FF530028212153FD04FF7D002800282128 -%00282128002821280028212800280028A8FFFFFF7E2821280028A8FD21FF -%A8FFFFC8C0C0C1C1C1C0C1C1C0C8FD25FF53282128007DFD05FF53002821 -%2828282128282821282828212828280028A8FD04FFA82128282821FD25FF -%C898C198C19EC198C198C9FFFFA8FD22FF530028002253FD05FFA8520028 -%002821280028212800282128002800227DFD05FF7E2800280028A8FD21FF -%A8FFFFC1C1C0C1C1C1C0C1C0C1CAFD25FF53282728007DFD07FF4C002828 -%282728282827282828272828287DFD06FFA821FD0428FD24FFCAC1C0C19E -%C1C0C19EC1C1FFFFFFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8 -%A9A8FFA8A9A8FFA8A9A8FFA8A9A8530028002853FD07FFA8280028212800 -%2821280028212800284CFD07FFA828002821287EFFA8A9A8FFA8A9A8FFA8 -%A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8FFCFC0C1C1C1 -%C0C1C1C1C0C8FFFFFF4C2828212828282128282821282828212828282128 -%282821282828212828282128282821282828007DFD08FFA8280028282821 -%282828212828280053FD07FFA82128212828282128282821282828212828 -%2821282828212828282128282821282828212828282128A8C8C098C19EC1 -%98C19EC0A0FFFFA800280028002800280028002800280028002800280028 -%00280028002800280028002800280028212153FD09FF7D21002821280028 -%212800284C4C28FD07FF7E28002800280028002800280028002800280028 -%0028002800280028002800280028002800280028007EC9C0C1C1C1C0C1C1 -%C1C0C9FFFFA228282827282828272828282728282827FD1728007DFD0AFF -%7DFD0A28FF5253FD07FFA9FD1A28272828282728282827282828272853C1 -%C09EC1C0C19EC1C0C0C9FFFF7E0028212800282128002821280028212800 -%282128212821282128212821282128212821282128212253FD0BFF522821 -%282128212821FFFF5228FD07FF7E28212821282128212821282128212821 -%28212821282128002821280028212800282128002821280053C8C0C1C0C1 -%C1C1C0C1C0CFFFFF7D222128282821282828212828282128282821282828 -%222828282228282822282828222828282228007DFD0CFF4C282828222828 -%A8FFFF5253FD07FFA8212828282228282822282828222828282228282821 -%28282821282828212828282128282821FD04289FC19EC198C19EC198C1C9 -%FFFF53002100220021002200210022002100220021002800220028002200 -%2800220028002200282128002853FD0DFF2828212800A8FFFFFF5328FD07 -%FFA228002821280022002200280022002800220028002200220021002200 -%21002200210022002100220028C1C1C1C0C1C1C1C0C1C1FFFFFF7E7D537D -%537D537D537D537D537D537D537D537E537D537D537D537D537D537D537D -%537EFD0428217DFD0EFF2828217EFD04FF5253FD07FFA822FD04287D777D -%537D537D537D537D537D537D537D537D537D537D537D537D537D537D537D -%537D539EC1C0C19EC1C0C198C1CAFFA8FD24FF530028212853FD05FFA87E -%FD07FFA92228A8FD04FF534CFD07FFA82800282128A8FD23FFC1C0C1C1C1 -%C0C1C1C1C0FFFFFFA8FD23FF52282828007DFD06FF22A8FD07FFA822A8FD -%04FF4C53FD07FFA9FD0528FD24FF9EC198C19EC198C19EC1CAFFA9FD24FF -%530028212253FD05FFA82800A8FD06FF7E287EFD04FF5328FD07FF7E2821 -%280028A8FD23FFC1C0C1C1C1C0FD04C1FFFFFFA8FD23FF53282828007EFD -%06FF282828FD06FFA928A8FD04FF4C53FD07FFA9FD0528FD24FFC0C19EC1 -%C0C19EC1C0C1CAFD26FF530028222253FD06FF28002828FD05FF7E28A2FD -%04FF5328FD07FF7E2822282128A8FD23FFC1C1C1C0C1C1C1C0C1C1FFFFFF -%A9FD23FF53282828227DFD06FFFD04284CFD04FFA822A9FD04FF5253FD07 -%FFA822FD0428FD24FF98C19EC198C19EC198C1CAFFFF7D284C2852284C28 -%52284C2852284C2852284C2853284C2853284C2853284C28532852282822 -%28212853FD05FFA8282128212852FFFFFF7E287EFD04FF5328FD07FFA228 -%002822282853284C2853284C2853284C2853284C2853284C2852284C2852 -%284C2852284C2852284CC8C0C1C0C1C1C1C0C1C0CFFFFF53222128212821 -%28212821282128212821282128282822282828222828282228282822FD05 -%28227DFD06FFFD062853FFFFA822A9FD04FF5353FD07FFA9FD0828222828 -%282228282822282828222828282128212821282128212821282128212828 -%9FC1C0C19EC1C0C198C1C9FFFF7E00280028212800282128002821280028 -%21282228282822282828222828282228282822282828222853FD05FFA828 -%2228222822287DFFA8287EFD04FF534CFD07FFA828222828282228282822 -%282828222828282228282822282128002821280028212800282128002800 -%52C8C0C1C1C1C0C1C1C1BAC9FFFF7D282828212828282128282821282828 -%21FD1728007EFD06FFFD0828A8FF28A8FD04FF4C53FD07FFA9FD1A282128 -%28282128282821282828212853C2C098C19EC198C19EC0A0FFFFA8002821 -%280028212800282128002821280028222822282228222822282228222822 -%2822282228222853FD05FFA828002822282228222853287EFD04FF5328FD -%07FF7E282228222822282228222822282228222822282228222800282128 -%002821280028212800282128007DC9C0C1C1C1C0C1C1C1C0C9FFFFA82821 -%2821282828212828282128282821FD14284D2828227EFD06FFFD05284DFD -%0528A9FD04FF5353FD07FFA92828284DFD12282128282821282828212828 -%282128282821287DC9C098C1C0C19EC1C0C09FFFFFFFFD04282728282827 -%2828282728282827FD13282228282853FD06FF2822282828222828282228 -%A8FD04FF5328FD07FFA228222822FD132821282828272828282728282827 -%28282821A8FFC1C1C0C1C1C1C0C1C0C1CFFD25FF53282828227DFD06FFFD -%0B28A9FD04FF5353FD07FFA8FD0528FD24FFCAC198C198C19EC198C19ECF -%FFFFCBFD22FF530128222853FD05FFA828222822282228222822287EFD04 -%FF534CFD07FFA22822282228A8FD24FFC2C1C0C1C1C1C0C1C1C1C9FD25FF -%5328284D227EFD06FF2828284D2828284D282828A9FD04FF5353FD07FFA9 -%2829282828FD25FFC9BAC19EC1C0C19EC1BAC8FFFFA8FD22FF5322282228 -%53FD05FFA84D22282228282822282828A2FD04FF534CFD07FFA828222828 -%28A8FD24FFC9C1C0C1C0C1C1C1C0C1C1FD25FF53282828227EFD06FFFD05 -%284D2828282928A8FD04FF4D53FD07FFA92828282928FD26FF9EC19EC198 -%C19EC198C1CAFFA8FD22FF530128282853FD05FFA9282228282822282828 -%2228A8FD04FF5328FD07FF7E2822282228A8FD21FFA8FFFFFFC8C0C1C0C1 -%C1C1C0C1C0C9FFFFA87E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7E7E -%7DA27E7E7DA8FD06FF53282829227EFD06FF28292829284D2829284D28A9 -%FD04FF5353FD07FFA92829284D28FD07FF7D7E7DA27E7E7D7E7D7E7D7E7D -%7E7D7E7D7E7D7E7D7E7D7E7D7EA2FD04FFC9C0C0C19EC1C0C19EC0C2FFFF -%FF00000022002100220021002200210022002100282228012801224CFD06 -%FF5322FD042877FD05532822FD072822284DFD04532828FD07534C282828 -%2228A8FD05FF7D2201280128012800220021002200210022002100220021 -%0022007EFD05FFC0C1C1C1C0C1C1C1C0C1CFFFFF53002821282828212828 -%282128282821282828224D2829284D2877FD06FF5328284D282822282828 -%22282829284D2829284D282928292828222828282228282822FD04284D28 -%2828FD06FFA8224D2829284D282821282828212828282128282821282828 -%2128FD06FFC298C19EC198C19EC198C9FFFF7D2200280028212800282128 -%002821280028212822282828222853FD06FF532228222828282228282822 -%282828222828282228282822282828222828282228282822282828222822 -%28A8FD05FF7E282228282822282128002821280028212800282128002821 -%2152FD06FFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828272828282728282827 -%282828272828282128284D284D2877FD06FF5328284D2829284D2829284D -%2829284D2829284D2829284D2829284D2829284D2829284D2829284D2829 -%28FD06FFA8284D284DFD04282728282827282828272828282728282800A8 -%FD07FF9EC1C0C19EC1C0C198C1CAFFFF7D00280028212800282128002821 -%280028212800FD052853FD06FFA9A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8 -%A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2FD04A8FD05FF7E -%28282928280028212800282128002821280028212800280028FD08FFC8BA -%C1C1C1C0C1C1C1BAC9FFFFA8282828212828282128282821282828212828 -%28212828292277FD37FFA82829284D282821282828212828282128282821 -%28282821287DFD08FFCAC098C19EC198C19EC09FFFFFFF4C222128002821 -%280028212800282128002821280028282853FD37FF7D2828280028212800 -%28212800282128002821280028212821FD0AFFFD04C1C0C1C1C1C0C1C9FF -%FFA82128272828282728282827282828272828282728284D287EFD37FFA8 -%284DFD042827282828272828282728282827282828007EFD0AFFCA98C1C0 -%C19EC1C0C198C2FFFFFF5300280028212800282128002821280028212800 -%28282853FD37FF7E29282800282128002821280028212800282128002800 -%28A8FD0BFFC2C0C1C1C1C0C1C1C1BACFFFFFA22828282128282821282828 -%212828282128282821282277FD37FFA82228282821282828212828282128 -%282821282828212877FD0CFFC9C098C19EC198C19EC09FFFFFFF28222128 -%00282128002821280028212800282128002828A8A2A8A8A87EA8A8A87EA8 -%A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A8 -%7EA8A8A87EA8A8A87EA8A8A87EA953280028212800282128002821280028 -%21280028212821FD0EFFFD04C1C0C1C1C1C0C1C9FFFFFF28282728282827 -%282828272828282728282827FD04284D284D284D284D284D284D284D284D -%284D284D284D284D284D284D284D284D284D284D284D284D284D284D284D -%284D284D284D284D28282128282827282828272828282728282827282828 -%007EFD0EFFCF98C1C0C19EC1C0C198C1CFFFFF7D00280028212800282128 -%002821280028212800282128222928292829282928292829282928292829 -%282928292829282928292829282928292829282928292829282928292829 -%28292829222821280028212800282128002821280028212800280028FD10 -%FFC8BAC1C1C1C0C1C1C1BAC9FFFFFF4C2128212828282128282821282828 -%2128282821FD04284D284D284D284D284D284D284D284D284D284D284D28 -%4D284D284D284D284D284D284D284D284D284D284D284D284D284D282821 -%282828212828282128282821282828212828282128A8FD10FFCAC198C19E -%C198C19EC198CFFFFF7D2800280028212800282128002821280028212800 -%282128002828292829282928292829282928292829282928292829282928 -%292829282928292829282928292829282928292829212800280028212800 -%28212800282128002821280028212152FD12FFC9C1C1C1C0C1C1C1C0C1C1 -%FFFFFF53FD05282728282827282828272828282728282827FD04284D284D -%284D284D284D284D284D284D284D284D284D284D284D284D284D284D284D -%284D284D284D284D294DFD04282728282827282828272828282728282827 -%FD0428FD14FF9FC0C0C19EC1C0C19EC0C9FFFFFF28220028212800282128 -%00282128002821280028212800282128284D2829284D2829284D2829284D -%2829284D2829284D2829284D2829284D2829284D2829284D282928282128 -%0028212800282128002821280028212800282128002800A8FD15FFC0C1C1 -%C1C0C1C1C1C0C1CAFFFFA921282128282821282828212828282128282821 -%28282821FD04284D294D284D284D284D284D284D284D284D284D284D284D -%284D284D284D284D284D284D284D28282128282821282828212828282128 -%28282128282821282828007EFD16FFC998C19EC198C19EC198C1FFFFFF7E -%002800282128002821280028212800282128002821280028212800282829 -%28292829282928292829282928292829282928292829282928292829284D -%282800280028002821280028212800282128002821280028212800280053 -%FD18FFC9C0C1C0C1C1C1C0C1C0C8FFFFFF7D002828282728282827282828 -%27282828272828282728282827FD04284D294D2953294D2853294D285329 -%4D2853294D2853294D2853294D284D282821282828272828282728282827 -%282828272828282728282827282152FD1AFFC8BAC19EC1C0C19EC1BAC9FF -%FFFF53002821280028212800282128002821280028212800282128002821 -%2800FD04284D2829284D2829284D2829284D2829284D2829282928280028 -%21280028212800282128002821280028212800282128002821280028A8FD -%1AFFCFC1C0C1C0C1C1C1C0C1C0CFFFFFFF52002828282128282821282828 -%2128282821282828212828282128282821FD042829284D284D294D284D29 -%4D284D294D284D2828212828282128282821282828212828282128282821 -%2828282128282821282128A8FD1CFFCAC198C198C19EC198C19ECFFFFFA8 -%280028212800282128002821280028212800282128002821280028212800 -%280028002821280028222822282228002821280028002800282128002821 -%28002821280028212800282128002821280028212800287EFD1EFFCAC1C0 -%C1C1C1C0FD04C1FFFFFFA84C002827282828272828282728282827282828 -%272828282728282827282828272828282128282821282828212828282728 -%282827282828272828282728282827282828272828282728282827282828 -%2128A2FD20FFC9C098C1C0C19EC1C0C09EFFFFFFA8520028002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002800287DFD22FFC9C1C0C1C1C1C0FD04C1FFFFFFA95300 -%282128282821282828212828282128282821282828212828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828280028A8FD24FFC9C198C19EC198C19EC09E -%FFFFFFA85300280028212800282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%28212800282128002821280028212800280028A8FD26FFCAC1C0C1C0C1C1 -%C1C0C1C1CFFFFFFF7D002828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827282828272828282728282827280053FD29FFCAC1BAC19EC1 -%C0C19EC1C0CAFFFFFF7E2128212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128007DFD2CFFC8C0C1C0C1C1C1 -%C0C1C0C9FD04FF2828212821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%2828282128282821282828212828A8FD2EFFC998C098C19EC198C198C8CA -%FFFFFF532800280028212800282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%2821280028002128FD31FFCFFD04C1C0C1C1C1C0C8CFFFFFFFA853002828 -%282728282827282828272828282728282827282828272828282728282827 -%2828282728282827282828272828282728282827282828272800287EFD34 -%FFA0C0C0C19EC1C0C198C1C9FD04FF7E2722002800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282121007DA8FD36FFC9C1C0C1C0C1C1C1C0C1C1CF -%FD04FF532800282128282821282828212828282128282821282828212828 -%28212828282128282821282828212828282128282821282828002853A9FD -%39FFCAC99EC098C19EC198C098C9CAFFFFFFA87D21210028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002100537EFD3EFFC2C1C0C1C0C1C1C1C0C7C9FD05FF7D53 -%002821282828272828282728282827282828272828282728282827282828 -%272828282728282827282828002853A9FD41FFC9C8C0C098C1C0C198C0C1 -%CAFD04FFA8A8522800280028002821280028212800282128002821280028 -%21280028212800282128002821280028287EA8FD45FFCFC8C1BAC1C0C1C0 -%C1C0C8C9FD05FFA87E522821280028282821282828212828282128282821 -%28282821282828212821280028287EA8FD4AFFCAC99FC198C098C198C09F -%C9CAFD05FFA8A8534C002800210028002800280028002800280028002800 -%220022004C527EA8FD50FFCAC9C1C1C0C1C0C1C0C1C2CFFD08FFA87E5353 -%FD06280028212821FD042853537E7EFD58FFC9C9C1C198C0BAC098C1C2CA -%CAFD09FFA8A9A8A87E7E7DA27EA8A2CBA8FD60FFCFCFC8C8C1C1C0C0BAC1 -%C1C9CAFD78FFCACAA7C9C2C29FC1C1C8A0CACFFD40FFFF -%%EndData - -endstream endobj 61 0 obj <>stream -%AI12_CompressedDataxœì½×vúȳ0z®g-¿8ƒDNÆD 6Ø`œˆ`‚°$&]|Osžá»:wûÅNw+ %Âoïùï5ãõó`Ԫꮮ®ÔUÝÎv'XÑ* aŽ“ß..Ê Er4“q ¯׋ņåø•çÁëÀ! ¶*^§úBËÅ°3z•AÏBQø”€ï{ÊSfÆr3rå ¨%häux¼ðiwÆ-(ð¼:\ÌÖ,ÕÿcÆMû³!½ -‘3¯Ô²Br ]"‰„#žvD3ÌQ¼EMÈÕï$ËÎþ¦ Þh -¡-ћÕh¶š”è?3ŽsD G9b‰4|^Ÿ=P¬¶Q(žÄ¢°e(žHÅ@óh(™Äâàø‹Á+ôp³¤V\›¡‡˖éÍ°Gù/0¶[ržŽj± ÿp”äp®|‡ WhKl¸ C–ºÁ:Eþþ—²ÁE¨‘e3b¶ ØL#ó.í‰fæìšRï+Š -é C²³eh½ØLf«Ð€!Ñ(ßòþ¾ú)Üÿc:ã(@g¹xïC `²–$çÀ#hf‹×x¤_ÚÌ£»Ír@yL¤qô}´ÆýȂƒ±ÃÏèûdÿz ¾êP‚1 y¨•”ÔߢÏ[L02sjõá!3ô~ގ¦Ó¡DN^<“`ÚãxŠÿ&–LÂobÂK]j¹^A3™ˆ¦C`Ò0 üV|›‚qò ái -¤CÉ4îH/RQ w€)‡_ˆ/È3Ný>£þÈ8îè%­Èpžñbÿ[xô°YPÌãj§2¾KóT»¥GÔ¼!ƒ $"úÁåßB‹.ÉL(ð+½Øphy¥$,`fšä_dA\@ÒZS«.ÝC]ÄñP2ÿEx<’r¤ã1G$ÐÄ&H‡_F3Š#fa$<€ðŒ…‡†¡VÿÀ‰ð€¡Áʐ`qã‰TXlÒ뿘ÌhL-g«Ù -¼žŒ„ýgCr±¢¹ðô¯õ”Z…0,5 -/É!ì +˜¤0N,xsƹ?hvˆ6£™07e(Jú‹n8*¼Ü8ðT4Œ¾ Áü#hCj4[,H ,Gé С%É7 Ô£T ->üِ x~œ’‹1Cø’uàéH¸ˆø€*ò‹ŠÙ,òô-J£/„‹ÕpYèB¸Š^WÑËJUñzUzïšouÍ£¸V´¹–ÚT¹iø!`Zü -þ…–â…ߧ–ôÞr³àfëÅ_Ề<ñ(è‘ùQñò£ôÖ ÿ°;¥À-P¯«±a’GLŠã!o“4ÕՐ† -6ãè«uö– - kZ„5/ð‚¸ûz‚ ™&Âvt™ Õýk-*„¸zÒäçЊº[£g©~éýCoÖ׫1}ò›‡·ßzÔØh@]­Á7øXawäp:¡þ¦fÃ)°(ÖQ¤ßKm°öZœ¡üSð.úü ÿoçý -5†‡ €ÿ¶þMƀ¼[_,åþ^Ò£Í<­®~§ôšrnu<‘ÌÚŠö‚\‘Œ=1(á:®¡X!çÜìwǒHA£æ èˆ6 èk &k@5ôj£ÆfÖ@ñÈ*’›ë¨V‚^„ª Ìâf5Ù¢ßÞøÎ_˽˜±K ¸òé³Íž²®Z+¾Ë̆:º4½ ßn rXÏV,µÐôFü{ÿ(DRc=$pñüG (“À”bq= õ°4„ç㥋Ìà}[Ü5DS¥‡µ³¦þž‘ ]ŒÛ¯ý㐠<è*ÈN!`Ú¦óÉ §Žæ øľ²X­p²Ç³Õt´³¾œ„ÊŠ¥¸¿9  x…b¼@(^ÁÇ¡®Qª“`Ø|ŽÒJ©nj Ôú+ø돫¹zd"| H÷k Ï"ŽÒ⹓ߪÑj üÄÁO¢š¬¦À¿4ø?Åj ý+UË观~àÁÂŽþáDü—ˆ‚ÿGù¿ä'¿å>Ô:‚ZD‰úIq" ~D -üNƒßiéwQø”BŸŠèw üÿŸEx"¶Þñái¼„—ñ*è‰Db‘D$IGŠ‘r¤ -:G#ÑX4…qŠt´-E+€ x,‹Åâ±D,KÅÒ±ø©€ŸjxWq,ܶx4‹Çã‰x2žŠ§ãEÃ@,~’X -KcEðSÂÊX Ã#xã è<ãEЯ -^`‘h$Žú%÷* -zûàFË GêQô¦+óýàñ&ÀèL þ^-#`x ƒ$Ž‚ cª(e0ºcŒ4~’à'~ÀPàk'èÀºÅ¢œ$Лj¤~Ê"¾­·à{èMð£|S~¼ ~Jৈ~Òà'~’ðçä70ò?ü]‡€À"¾T*•L%RñT t9’ÂS`•j²’,'KÉb2L%“ÉD2žŒŽE’xK‰J¢œ(%Š‰t"•H&‰8 Q ÁpþÀì•x9^ŠÁÌ¥À &âq„/æ¸è—´4€;K&ãQèƒÉ$øG"ô”á@“ÀM+ƒßàˆ -ðÿ!üìtçQ³Ömÿˆ K,ì!¤M:ÁÅà”‚X:Çá7žHFbàC$™ŠEqøj€q 8LÑÁcA„ý+UdQ&Š*sk9j_ÀéI·EÛ¿¢í_Ñöß'ÚRÉPäè =¦x‹BGq0Çè<|€ÁÿG>5vd€,RiG xc´™qöh -Ž}'Š›Ó‚;e$HêõòÈRÕß©Uk42¦—ùˆÑžæ‡Œàí1fÅXe¦ƒ‚Y"RC”ÏÅ?D ôe½ê$\)ñ;³åz!K|ÌÑâ /¦qáŽg~³Ã¬áü¬¡ýn{=Šü«ƒ~Âÿ‡uP(`ýÿBEÔNW3ŽC{”ŽÌÞùWý«ŽþUG–ê(òOQGÑ_.üÿÇV1ö¿Š­—ö·ôŽ(ªþÇWñ?ƨŒý»Šÿ“Wñžýß´Šÿ§uñXH«Ɍ>öq áԆ’q,cœ‰d:‘Š¢X$‚"£žˆ‰†¿¸¿Ö”ðØãZ±ýßI†Í*<[eÛßÉÅFj ° á.§ÐNè «þó?žTÀ¡ìPiAç0ÈbƒLbÓÀ?b€ƒ*ÁÅí ðL‡âîÐhl TÙü˜Lq8Qps¢Ø#ŌúÙÖÊ°3Óÿ㌰»PÈün_,À¶ÿ †‡ã¢Xã?@üýRÍ°$4¸ ëÐ>§þw¬СZþw-evüÇ?€¿ÿ$9»˜ ÿ÷ˆqK‡"w% ‡ýÇlÄMmÍ»Ðò!½q,†—À-‡7¥à)¶Æ'6ýG P:âÅj€ÙÛ_ÿaIGØX ëO{¢è2,i£Òp<š–F“sü±$¶†·ýÒ?ƨ@Ò²Co˜!…Î(úgX@Ùý#ú±¤8rÌ­#t&}pgÎFBÌÄÏ)Zó¯c! ýç?(Àtzµ><{§Dÿùü"¼ ¥§1ôºÈP$³×³ ´Ë4™ŽãüÙI)…R‘”°Á6þÑh=èÌ"Õjñ [ò·$3»~=DYˆ«ÙŒSì´Â•ôG»ø |%ß$è$wáZté;ߝ6ÍÎàÐãˆ(»ÅC¡Ä# ìƒÀåAñåš-2܀&™Q…“›…ڍ'Mlƒ¨+’ZKÞ¨”.±&G#-¢%ÉÎeªðß±kšÓ¶#3QÖ$E©8ZÏB¢€¾Ò Ffªâµ£¸áhÇ 8˜ýMi¡¯qÜ!ržc¾¢‡szÃ9&|Õ¹YÛKÃcµº“1T­ÓŽ5¹¦;[nè¨6Í:‡MH‚Ž!<K#õaŽ!Wìšäš0³‘ƒ•ÇS§S†Ðлí¶†’V¿ecFŠ %âñhܸ)®ìƒe[e,Ë}@‡ÛIMÅX-ü]G&®šÊ6C±ó;åèRrèØr0[Ì8‘‘=o·3Ž˞L4^ü×ÿe7«ÉÇöºFÀ¤ø0:[Ë!ÜfaáÊÅ—Yá°n)v*1(b‡| ™¸²1Õ+­ ·\jñ&d»Mr5ِÊÑ¦× -NÆED -ѧ8‚ždÖ¢„„ šfzäjÆNÐ  ˜Š;RQHªB¾º [kr(«€XÜ´1A)tº”es8µ[­S†]¶- &0-9ÅüìƖpYˆæ Ú£© ©e[;$E Õ$ÀìʾE$Ác&ë_É!ñT:…›´UŒHiÈ%ìM®¸™˜—¤ÄÔÉtú±TJãs@ßøueÄƓk<‚9¢ßúI¿‚ –7$Vbžžªà}ؙ&äé«fÉbFÇc–’„“!ÓC­SN:'͕ùÚSi¨¨a[Vaԙ@…ãRÓ Ïô£Wª©ÅSI#FD„ÐÈ*]é ü tä&‹2X›­9`“Š FCÀ0‹Äb@±%„ú¼&yÒ,ò¸M2Àú„Gz¶+Ì:‚AeéŠ\¦j[](xp,<¹Aýe -eàñ©[>ŽªÙÓt6œnƒ”[UëÎf¸ ùüE™üF¶—34>çV†’<@@©J·¢‘DàKñ,I3 ž ¼¥lR¼ ÄÛà"ÏÊՕ2=À#8¢&=Tz„"Ô&€&úÔ×b?5~È{4‘=… qg×ÌíP‹?èC¹W„rO¹Ò@ËP÷—Ýÿ Òý[m[ïv 9]Õ¬+³xRöóø6xWˆ¨ñ"ºÍ™QXïð‚ð§¶åhç)Íü-.ƒfka{Ĕ1âIȜ…FbšÂÜÕ6c¡ç'A³lø»ÅHÙáz1üËDŒñ†«­h¶¼å‡Á(Á”-ȵ r Í°ž,ç!js£LÅ5lÆJ•–¼ŒÚóò]±Xì¼Vk ÅÎ(ªŽ·Ú‰5 Òï< õ‡ ½¶jíª°¬Úñ÷N0Vk…Ç ·Z$ÚM©< #•JÉFkN9.«ÆJ¥¤¯`stEŽ¦'6ZË=±ÑXÙ½•5^q¡ÑÂB"òÖ̘^™ŠC؎ΰћ- ÷wÊÌXM3h=šM:ZQR±snÐj¸åñ6ziemQXBŠýè3b§ä^?aèiQ‘ÎPl¸kZjš%õ´ÁŸë:NÅôð‚f £ÝƒC{}zM'[M  -*Sқ[¹!f²hº˜™IÐÆDIµŸkВ^Í$jÁšM?j1Úèû®æ ðÌXÊ5oVC3®á a‰s,4z‰\­¤¼}÷5³ô>†K¥­å)ÓÀW9ˆVí¡M;Þ=ם–$bÉ`$Á°Ø»×Â\«Pi;ꙣ tèT›RzÄ=©áò/3\ђ榖9o®ê­+¡rLlHvU{]1ª¿a© -=,Á?õù¢ø¦Ò•W†wâòÞ|{ö'µhS̘rJ"îüóñ.ñ5tË Ÿ=`š/À¿Õ„Á£"ÿ…2¶ÞRãâƒD;#ã_³môh[&+Һ͔þ£>m…ö:½::FBÐ]_úñZ>Íéäù€p|ü#Ú@„¾áèÅhG-ÀUD–•Ÿ·cʓ±.vþ‚?ÛQ"Åe•ÁcGŒÀdÆÚ¢/® “e 6…çÖ¬­Zâ°%º#°$£@m¥à¦¶¨§€cÍä•Ø– Yî‰À Z)Ø1£XP”#X)‘¢@R²H or ¨ÙÞ«2Ná'à!Å(o Â[<á.$ëX‚zŽ–CÈÑ£˜?¨Õ€èàK9ªJÐx.=uðpØõý¿°”{¶R"qÐ#þ;ˆ~ Ù_ô†’˥ãðöß!G)ä¸^UP„ôšd@ρ¢s,ÿëÿ§ð‚ÿ^Mþëÿ[p³ %ötˆýûj8G ø®lVj4̘ãBæl&²@?dfk+A¯š¿ ‹\f"Þp-2fN¯ØúšÀÄNS÷GՍ’R}X7ubSx«äµ¹g'6í2³¥²Ç¤@dYÕvo›²C¥k)ï–kbØ/>½ <æ/“ g’µéÅL -gèÛàbooé=œ2ô(ç?V|Ú¶º3£¸`›(VL[&×|šàŒ²Cc¡ÿ׫!„Ò1ƒ0xÑz÷X׎‘D -T`ô€Çÿ ™yÉʤßÊþ/ÅVîý†Tl8eöóõ}!•pßs¶ô¦»1“òÖÌæ¡åO€ÛšžÝ¨¬X1ӑÂÞÊýD×´äp+¬0-í¤Šîã@Iʍg;˜}†6CÊ>a5u -¾Q’Þ”ßvŸr»©iöt Ï»ð¬î½ª–›g’G²Ø×Bj’©—Z$b ]u¨¶Å?1[ Å`ºlˆÄ␡$Ç_{¼‘d¥g>PHØéN3¼¥NÄ.Ä-YދÝQؕڊ¨^ÐNi“hsr¬ä´¾¤3ՊrB ʧ±EˆÊÞø­Y -¹½]͆±=ÍÓ¬«¨r°CHe`^v§›å`Eά 1¥Ñn -²tÐ4IÐÔ^ã÷¾¡¦pðl²ëžÿëÎöιÂl -iÏMÓ¾¡Ò|ûÉN‹­‰úDí",uù= ý -Á+«²ä£Šžpi&zÁÅNùú:¯PpDèiìªåzóçž.ÝYò9puµ‚¥S[N3“•ó†p<îòŒ ±ç‰Çz5q–)<Öò·±«LóÝ}[`6Ã$QÜ¦.ðXì ÃØÊweÀÎ Ùϐ¯ ¬Ùۈ„šB¶édÄV7\iR¿or1ªSž]懕PÈ=ÙÂÕ½„É -q‘I¾Ö¸Ê÷G)ö —t“-^w¸©?Ÿ8Û•ØùSé{á~h*cìf  í<™'{÷oïÅn9Ô3ƪl—ù(äæÄG!ƖþJàbCxj£1@ƒèE|y¯Œ?ž’¥Eañœ—¦\yš|ÅUùrU†x󧐻r?ñ€@§Ùòçä“Ÿ\?•ëѵ³L}Ÿ;Á³߉gr´hÒßÿ°:Œß{ÊÓX?›+^D]þÒ]àË_(»‰2µñå{7gÓìpHÎ᧙¿:nNyÔ8&“Ììü+3û¼•Wî ãß›×€·½™FšD¶÷Q(®†î¥ÿò6N.ß/gÉd˜G‹Ìð÷Ï3¸rX¹a{€rI7•|Šb£Ì¬&Á$㷗ž`€*-’í%?†—æE¡|;{ªÒqxˆWåú-q–O–éO®7zËDgn~u†”OøÎà´¼%ž÷+Hª|iîM퍚þqv[ “9áô¿2M>øDPP€œ^ÇÐþ<‘>垪 ¾}9Pýâ¡E^"׀ƒŸ1>_ D*W“KÐÓe.;ú¾ûD³)õÀk•â"Ъt#uáCîî¹|€­¨ú.î,UúˆÜ@Æ\ů‰ïa±[ùöWÆáÆO•$Ýç¥Äàñ>ݾx~,¶Ê¥veܙý~>2€¦{éöy‚¾&F¯Õ>îï•bÏÅQù~ê—g߉pv¼¼˜å±4Ì%“#ZF˜êü,ÅVÓ× *ÞQƒ§ŽHk~ @àÖ¡{ÿUüᇔO¤ÈB¶Ë»7Üf{pâ*(!NÆ3ãAuÀ -j•a’wõut1‰|å®*ñ^ˆ">È}åˆ -à_À_¢ÓŸÚùRW9¹âdðìs5e7ˆNp4JRÝ4kÅþ Žø&ç_g¿ϸ*b¹îkÄ{þ™ã{¢¦Hb󐦏kí-Oóª¿"d~ëà…F¦SAF-€ÕµtÁy˓i•Mf‡ÅäkäI;íú¢§~Z«ƒ´Þ´¤çT£ л·#?6ùt¥Ô|™ëõ5U´«½$Ç`ñÀ«uj±Ûmöáڄ·½È•økğ¯}Á#ß䡁q ÇDµO–ÁVɞ^ïÖJøkí+}s£ei±êÑÅîôùÀhø%ëj€¾‹®`ò­ø0žºÁk®RÂߜ -¢Ó[»ë Ð_zʋÄjï¹.Jt€¡ñэ…Éå3”÷_•AlúT|¼²êv®âC÷m‘ú^sHºÉz¢‘Ð7X®4÷¬gD®†{¢þõÁG*Ét‹BtãØ`Sõ\þ<ɚGó2´‡KN@©ÎVƒÔ—?{͎üžÅKøfñVì|ݔ…§éâW!W/‡@“¯MW Ýô‹M7&?E¡Lß, Ì0ãâ§L¹P­ÜU«¼J&äv3¼Âž5~JX±›—Ë4ÿ‰à½zŸHñü@4è%ôõ ÷ áÃóœW¼Äÿ‰“ñOˆF†‹Ðð¯ÁÞt[ø…—QÍwEl^úñv¥‚–»Wõä-¯|êù„ø—Uq˜°; -P£F®ØŠ9U¶ú&÷œ&üÓ[ê゙ߊžJDC¸ìˆ^®Hý®•ãß¼™¿•€po¢%ŒZ& Âó꾃h@dI9f|]U¶—gD"O>‰#Ôs®à‘hž ;Íê֔¾:›"ã©»(°€Ý¾ ÝQÒ|‹à|ïƒ4ßÆm¹ šiÎåÑÄúS¤µ)íòàé ±ö"x' ‰8k"Ôԉ7q¥yÑ­T‘å¾!n‘  ”VS3’n!GݺTý‰ˆ;ËSX$+BÝ5*KõºUp‰ôìbsÄtäuË£Ñkª$­Š®zßit¶IU¾Ä)(¤€Äž¶—‘†µM 5ÑhÀâ•Z¯—VÌ+£‘‰ä,vEQ @ƒ(-r+˜Ðwµ­é+v{QpS]à_Œ#J½”.®€Vž4‰¯Û— áô…¦5ȤD³"xÐ;©2/<=NʳÏ~¡:œÿ¸x©°]â\Û؍RÚ8þ'7ÊW™½W¼­Ù¾ö¾ËÊTåçag…žÛ“.O7¯•F㧤R©OV•V¡óÉ €3¶Ä·Ðø‘Ë’¹Ãý\ð‹ åüÓð©÷ 8À½uuè†K‰@$¨pYñÒ`R¡|պ”ëÞlÒ2aÁê{OµÃUZ,À/†ŽuzAÐc=Às ¼¤Ã·ïEر p⯲G=‚¢Ý="d@íêíìA«ŽwØUž÷ç\öŒR‹Sæáñb.˜cÏ7%d9«I%€R{3¼9x|‡FãÍ Nû râE7®þF)ἃÒ}áÍWº¿øà ŽÝÔ𤩔.âþ|¢ª\'I åúWuÈнE³[l=6ۃeªíŒ‘/Ó4ŸHø¤uP+-“7Ï!·Š®R­Jm~AuvŸƒa•!øàjëÓA:íÏÆîÔp›¾Q΍°;‹‚¼;ùhðáÃU+Rxt¦7¹ë£½æ1‹ Cäu~Vž¾;3 Óý¾È!0àP£4¿õï§=Ž‰£Í@ä³4\:ågÛc™ÑrÁ©ºQy艑«¾‡¤å–$>?|gDuµùŠ\¤—)ž¹çá7€&•6oJ÷íB;â}YÞ ]ݼ\ïï:=èê‹ž¾£GÐ.,9ß ÚXsZÔØŘ£hô°ŽZdK¢À0ÓG„ÌÜ>]! Yì*ûË26N—¯À[ëR½۔0<ðÈ:UóðöYLgAéA7öšÁÓj ÀœÞÔ Ÿ7h€èzŽU`´êê ú^ç7ZÈ >W…§{¿+3õwf@!¦¿»+dõV¥¬Ü0¾/ ÓRtÚYÍóM¥•¬‚V·³Œ#‰¢KP‰ªe •ôöJŽÊñOy%ë-cEOà2^(=.ÏØY¢2¾[¬úSFðT!UQÜ{'Pæâ2Žâµrcšdð”óŽð¾´¹bãIú²q7ªŒ–é€È…žÓÊØ}…UÊõ3ž¤Aڙñ^g=]Æ3ԗ‹HUo‡K‹ÐàvV²-’¹{L}TûŸo|0eâ,ü”>=’ -›JÜdpâü#} uФ:¿ÎԖ ’ßo(t ¨ðæpÕíº#+s€FnšÌE«Tõ³5è‹% eÏØ[ú±÷b̓¾Òð)ÅÛþèY!wõèª\/go¥xï9T¼÷µ'Ň®Ÿ¨]Ô>’¥9>bõ—'oÀð -æ2\¹~kú ò€ZYëèu?Õuwˆþ™ë¥2$+-RçÊÇë‘MÁ¶˜\Ìẙ±éÓìø¼3UšMÖP«lÕïKŒ•úÎ׺_ú,ôÎ9NBÝÓ½Á©ÚÅýÙúí]n"*iU«ž/y7̶4€²Ô§wŽây™»IvV Я8“q¼Ø‰µ%çsÃvß¼°Q3orœ±@·ÜNy›ä*ñ\+ߕ{W’Á'ð¿§Â8߀Iýófºð£0¶ÀB€ÂOk´)£1n…y…ÚH$.‰Ÿz®²hÆeY˜ËÏ3geÜù¢Ë³Óó8àïX«¸Ê_Ó:Sæ¯E×éÛq‡ë¦•©6 -ÙÒZi– }Ëy -L0½ºPL~Œî*ãôW¸úJq. IÓߌ» lÏ—"=mù4üm1,Œ¾y—»ºuu­`£üe"ªÇ%éy±Ú-&ÓȞìWÆ÷lƒBgëH­•‹¢\˜<ÔÏ/ñëb:4e€—ÚSÍp ÇÊÛrO ”\mq»ô瓵záç5û"M’Уe•…[÷€G¾]…Þ¸»QÏ'n6•ÐÃ(XÈÜ}Ï–;øÕMœ«²°%$­ÛŸb¤YZe¨ÚXè܋ð”úüÉ-ôEê­M¥þɲ•À€¨æ¼ç€#_~JËV>¾Í4÷§@£Í_Kó,î/v ¸né›.üAl¼T,Åköã«vA8æ쓫Œi&¤Ã·i G'^¸éôL”ÇWÑíeô‘„1ሚ^Äùó÷ ‹ÄçÓJ-A»#à#ÂÃÞ++ÁÍžëÑt@ß¡´x®P¹OèHlüZõy¼©8“}–Rí­¼ÞøÕ¼Ë¯Ï”‹R´ŽÀ§QXc¯‰üc¬ZŒ÷PdàZ4¨ êç'éBNÓSR§DsUÆWu0äÕ¡—»˜ìÜ`^ÚEº8Þÿ }#…@؆áF6ÉÜú£oÅn×å´µd͸ Q-i?ãÀrX䊸¬õ…U‡/L¼R¨¯ÄÆÚz ž¡j/…ÚÖD&‡ÿòæUöêÞЦW“ø(-’…säi­ ¸ã‘ôm èxÈÇ9F«2Vq[÷b¥Åbý¥õóÕzí{.gƒê˹•F¶2Á?(.H -ÁM$¬ø@7¹J õ3 ¨ùF깬oWuxšø€œÖY8¢šz¨kLò§þÐDîtv¼t¹€ƒÿP›H«àÈïjHiÿF24²OUËí4ü êé±]þ¬ÇÆ9@M„LQ?r ÂË3´d k¡uL XË?å»jú‹W0yö5-ËJ4¤KϽ÷º/0ªžer‚¹+¶"ú‹pÌÄ¢|žT‹©ËÁ ú á¹ öÊøã’ÍR׌úÁ«DÿY -æåՐڝ›bj°ž(”¿¯÷d4–o(F+ˆi_%¬xCŠÔ ÎIüàé°Ä;Q˜ˆ6ݑ5'sŒˆ½„[ÀFO`¤än‹@ÌÍÄ·Ò0hu¸9íSÁÐ)dh`*&4Lôӊ*Åæ£Q¢÷øÑK%¯Êõòômt -½°ÓBî>úYi4r§Ò~¶öµ,Aºª…ìÇ#0G“÷~h D?C ô_ç@ ×ŇEüI%’Éçë}>­4n¢ÅÎYi­']Åä‚ök²Û߬@»òeeOœæ›÷”ù_¸I¾"G ¦”d•$¦D %È4Vð9Ú.ÿe!yZAI 'ådgDçjëóÏ ì‚4™ÑhØÍDH_»´âÝÚóëó -Ì W’ã|“»ÏÁ†øúØLafˆ9OÁU ۚsŒ#ь>ø¦þÑY`5˜°’¨SüŒ,‘VT䃨àö€]û¹4|¹"î~£~úTì>&»ˆ| ÓóÂw ~ù¤ -sBJ=µÆØ"–»[+©ˆ^%w®[ñÍÂÃ\à¥Q*¦×pF\3M¨45Ô'H0ýªÀÆ* ‹­FîçN^ 1"ª>ݟ]A½eÉ'ú»®~Ó,MϪŸÏ(üÄOðE§ýWâ±õö-›&ñnœðrYº:Lxã¥[¯w–\]ßû51lÞ#¸¶À-á\}þZ ¾¤&¥ØS4¨`Ùg`RìVX_â§A^]Ú¼¯®F(Añ]f™ùeåcör†ØMð=€ûtÐÒFô¾<-Œ‚•ëEùIc`‘û÷3ÂÓ(¥Ší×-_c (ÅÄ º©ñê [ËbR…úÚõŠt‹Á”×4 -¿ œ"Yö‹ñ´*ùõ(®®œmâËó‹â½rãcŠ -ÀûŸÙëVý!‘y~€ÑP„`;†äÆ 6ÆŸ`xçƒüRöC"söa+*žîû«·þ4X€þXK]¶:Ì×´G×ú<ýX};OOžб: è‡>‹Ý鐃]ü?ù©227r´Py «„H±¦$“qÖ4S䟊wÝWˆ`f&䀂g3Ð|Cí¡hJúG{uÈß©Û͂›­TqëL¦í:Å]š[a¾"} ¬ÂëcÁåWú)‰þ|ü+é¿ê ÂXØô_M¹(ü‰åî3QéÁ½ô =ÈF¯º\ ˜.µyýìᒄÎG^zñ_>$¦NO8ƒÅè@㠆Ý7NÏùëÀyAáE§ºt;WãP´™vúó5§+ÆFÏïþØUë+Õ¿n®`ïR¼]J1¥MÕÛ|ª4®ñie -³ñzú«[ƒ¢²úT¢ -av’Ë|´oӕ×ÊÕ4{…§B%ïÒÕ)\/*Õ·/?‰Ófw–½÷Ö‡‚'p|îu÷ǘ~×áh.œþè͈8ðüóEÜåúb÷Áñs#Œ/»™ôb•3*p]eޙT±ž ;`\½Tål´©V®|xöµq»È]„Ê`pZ1¸rÐ÷c#̈́Þl€°4e°¿çÛ­š,ÃdÙ.óþ¸Æ±ŽG9>UfS׋|Òs6rሮ-(ó±9€Om„™Ž°·âàRµXê'û þ¬-Àë/5Öwæãöý^k-ùÏ\†d¬ªÑ0ŸçwMC¬‰Y£v¡5çô0,~Áècmãp[(vÉøô†Ëº·A¬ñ©‡t¿Tõ±Æ^ž1óÝÊXùŒañ)1Jœñ~§‡#ºO¬‰³‹v§X4 -—'V;{}Ôîi-Xp_BϺSûþM&¬m·[Cáh–[ŒVÀ‘h—©§ö…ùˆÜÜA¬Þí© ½Å.oË~€5Fo1ÔgŽ0Ä -ÐÄ­SNF¬ÆJ2Ÿ®‹žVb˜X¹Q]¬lñ#*c…s£B\Ño/´>ÖÜ©‡u']ŒVfó…_x=WozX‘]–®æ †›8;ïô˜¬>ÖØËF|ÔtÇzJ°Ù‹y¸×AX!Ñ4 U lî ±º©I¡e0Vg˜a×ísˆÕ§Á -а©{Âw•,8oâäZ‹µ™,½X_‚ ÖD§9ïñX«ïsB5Ö×Ö|«ÆVÄišáÖØäüì>¡‹õÖÇÌ ±æýrQ+@¿y±N†bõ†Ëž6‚ïàt±vúWYC¬wïõ› -·S·†ûVÆzîç”>ÖæÙ¦3ŒRºX{MœÖà -%4DüX ×D~k`½u´`€õÊÛû|ú*êb}ºøV¤Ö¶‡Ûï¹'¬ï1ì£Õõêc½kM¾Ÿ+9Ÿ«¨¤±.toHäeÛïz6ÂJ`ýûŸœ>ÖVÁ˼YÈкí~XSuçÓÖ䱒§\M½x®˜ÍÓ[ bõËX!^BµÎ²ÞÏͲ°^2Z¬_¾‡së<íÓhv{GX#®ÆbØÉ ÊˆƒÛ²¢r¾Ÿ%€µÀnÉÅw:Íc½òT -;‹DËÍcýà27+BÃÙûèÏÖ/o Öð¶\|ăɦë`%6Z¬ÌìÊ+`Í܇Ôc­?–.\9ހª-¢WÍ¦j¸gol|ðֆX±-p—v>s÷×kdKV3ÅÁêÑÍÉOUJšaJ)÷ËcóýF÷õ éÌa×ï~Îà©;“lûLï)§p^”Î+°Á6SÖ«D’8ÇáSÿöÓéZÔmzOWL²õQó ­×€ãRxþ5©ÿôÚå,´žª÷O¹lãú挕Ÿj,›öÑôûãý׉þ]!¿q•¡axh#WZûµÖ óm@øu…] sã‘$Ô}Œ”˹í²ÒýV:A>”Pð)¿öŒºZð—ÂSªr! *oMÀ .JУ· -î+}°U”‡!‡¦òùê…â“eÉ×õîa?aVªØJ³Üiì&~q~AŽPù!BÇZÒ*þü ZWÐPAúÚc™ê_.h¯o|ÖÝbÍû·LèOR)NªqqyÂ77քG¿”®»Î¯ðFSô=õ)Œý"Ÿ+²¤7‡Ñ«^÷Ö|‘„Ü -|ûLšx)?¬ï9”¢ƒü4Ö:«Ýèe̵ž‚ç%mÁö†ôÂÆîŸgCþ’™KÁÐÆüEãä¹»nµ‚ÌHZ ~øX+¨6`5¤W΍%½4Rè%°ÒJ¡ê{y­Ä ŽmÇù¬âÕ¶&ÁˆêÓ°Öp ƚþò¬¾·8½IÝA¢>½)Cµ[ä«B?»¡^žJ9®»<½†ƒ‹žgMóÁ¡å©ßöàÞÏL‡híâגQO §QdÿÑ@?ÉãòºÐ¸ôyþ%°Vk íN~ӝ²í!UB*v—Ö£ŠÝ1ªr© ù–’ÓªÍûÏÁ´ÁÆÏ«a -t÷½Ä<‰¡ý&ÐÊ¡7#3@”FIkà Bk yÚ´1jíêâÐêþ’„ÔʀGÕÿK˜/\ooï*îSԄ·¡ÍfþD"Š~ë0yz‹2HxJû/yµ¦é[æÇ o‘ŸHé5}£?Ì@É£±Îä–‰¦™–yj­™ðú#cªôŒ¥z´¯AÚšj˚Ü2%3<ªÉ"VRûNò<µ±aT ùhZ»J3É û§9½àÆ}’v`xŸvK6óìõizf¢= òúµV&5ÙÖÓ·6ú·¹G šF+[ÏÞ¢u3O1’ö:jä&«PòÜì -ÍÊ-Qâ…4•yq(Ѭ ¾†©»‡M-Ýv'š Ø-Rz~ ª½Û:\2U–³l6Ë¢SÓ_.o!D¶®þb˜Ôå™0”i²õ½m@CR;ì‡,ÏI=ò±)5vp§c´!§qWöÝi£î˜K ÙN3'P­½´o0MžÕ“;N•Ê ÔôêëОXɳžVg}Ëêܕ,¨'z@&šžÿ8ˆzuuVé¹ÛÍy„[£J«s­ÊžÊ  ÷e®’§Âí†A -lY6×Юí Iô -tÔJ_Ìè²Û­­>ٍ¥Áõ}}°(·"¨Ý^5рæêB Û\7ÖQZ ;‚„.ª6†ñÑÌ)u `ÙìHílšA1ÞaG€öYŠÛPÞ$Ëæ0@VŠPð¤­u!‚¦ÞhÜA­"a£ ¨×:+­% -¿;d{B#l ´ã¨ÔYi×ÈþN¡!5»6¨©Œr¸œÏ¼–w£ö(çS'@W"­µ»¾s¬4øŒëÀ -æ¹mg‚-`£[ŒU®øåÀch¹+ÒÞ*Vù3vRm—6õtÿ1 UÛvþºùNaÛmœ¿nƒT2N¶Ë|¶SÙ|6ëý†}2Ü)4Ø}„º+ÖE|öG²\7v ¯­!ÒéӉíBL‹°™IŸ€ØQÛлÔïí$vÐh^Ì¡ ªy~‰°e3Å䳺çŸìIËí_‚§‡NmצóX–Ýí”_bØ=Ò¬?_bXËʍ²,»³—_ÂÇ:Mhc²E¼ƒ—"0ôÚf¡˜>4u‚plk~µYAðYª¦Af›ò‹<}6Nš}O›Î1!×½ÚÜÊöKh’0¬¨Ü9ÐF çÑ$@\°hSÇýÛ•Q U(¨SFö/î1>x@Ug¯í3·1vª)4;]a9;ªÉkΰþp°ã2®‘ËsW7}RšÙv2ïA·Œ3ï¥é3Cyÿfž>·RöçPõÔ«È·»PkÖ59 -Pb¸Û šÅA v:&lEÔÌ«tvæV&ÿAD³¨ØّhÆ;)ûmëÀ†] ©ãÅIF“Du"”`ÿ˜Ô ˧ä|iÙ°*¢4Àï­Mê–þ`çYÈjîJw‘ëäÜZûƒ[aÐè$‹HéåÔµŒíNôC–.®<Ýd±.Ù۞%mñ¤®ÝX1vԌËþlHkŠïT’Cî6+ØÓÓwFöL]³ÜOtϳ9³kaF>ØAHma^ëUê*‚):¦qmÖj—}é¨c‹Z=kd\–µ•œ´·údQe«ŠrX‘ŠóØ]·Ú'5§n¹C*M É4óHÉþ5zrŸ„¹1+¬Û)zcÐ'TJÂN£G"•QôæD*ö³O*‹ò<½>œ2r…ß°šèMô<½6ϕ7ŽÞh8 oà¸Ñ‹Þl ›^Åòf§è L1*Âîã7Æ)#öëálDoN¬Î‚õp¶ó‘ ‡t¢S$»Gô–™EoN¤“ú,ic•àoV¤²l $ª¨ éÂF6¤O”•^Vi:v éuã(’W¸y -‚®ç ŸÑÕØ3¤78”¥kžAlgp—^\*ºŒuÝ8üØ38ëpCÒôä3›%~yY’ÉaUâwXÂ<¯Ö`‰ŸqœÎ²˜UM ½°©CÛK¨Ïܚ YðG7ßK™ ioÇt¯Ê¼mo ç»2Ï:íú(•y¶8íðÊïØô87^¦™´áýšüÎÒÌV¹ÝJw»êð"Ù÷ŸcÉhG,’}ÿ9N‘,~?4ڄªÄ(F —–€v¢úQÈ⸛ÝÁŽR$k}еdC[‘ƒŠÉQ°–ùK‚©®ZO`k=f<“a;µW¨Ë3X‡åm©5;¹BêaÚ)Ê;±uÚõÁEyšå™ñØYž»åæ{Ú.Ê}O!v¬¢BÙbgâdëøõ„†meðš$CÀŠÃ>¦¦˜¨ [º–ø±¯ol¦» -á¢{þ*=]®V](Ÿ¿“•W¢×h -a®Ô¬2Ÿ—ýËneŽ—KᛧÊuÓ©\ù;ÝKú˟ŸjmÐÎ]&žß‰Qĝ?­ðÊ E‰qèÞvZêîJ:£K茺ìî¬÷ÒVF»T¥hùLùíŨìîÙ¬ØÞXˆbE—‘`MœÁ›È?Œ®Ð³*ö[G±Â›È ±Â›È'rE؉öžB¯IÙ];Q`Uס¡Û¹%¬Ú+ôxƒè ÎkRìwJ!C¬ÑÈÉóºUì—8»ˆÝU¾ŒÊîúfewç C¬PtÖîÏ^ †›ª_´f·¤Ö -ß5z2֓­b?¬Z}$ÔS{Ψ ~Š7¾Ë°­vÑ2¦)%1hŠ}ù2Eíüš«ÊÊŒú%&…í¶±['*S6Kõ·ÊïÝ6niã^õ.SÅêžK.*iüÒÆYÔöî@Û>1Ý<£Ë¸¸¨l‘¹ªÙ?3Œî½ÞvŸšM‚ÿ1®×ӛ¾Âv[§¶íPœ© ·]4fq^º:wÐän7e¶¶~îà¾7ëŽPar˜Ý…guъÕ…à}ÅF®¶ÍòSÚÎ+v o•£mÝÐV×è%@Üʧr -SاWÕ·OÌÆ¢°OÏK0Ûí]اWÕgfCïYاç´ðâ£ödB»°O}N§ó©°Ï<Ü}´Â>½ª>„>FaŸžï¿Ÿ’6-ìÓÛçáÍÁ£ömÏ+‰n•?raŸÉ.î1 û,*VŽUØ·Ã]‡ö© ÉWõo¯î]ا§œÄ8ô ûôú¤Í³9BaŸ^UŸ¸<÷´\õ -ûôæð„?Ì䘅}z ”›ÅG*ìÓ«ê3¨X9¤°ï ¢Ù/ì³C´#öéUõíC4‹Â>½ª¾m;íàÂ>=›ôD¯êû°Â>½ª>’>FaŸÞf‹ä{¯°o ÀË©ËÊÅÝ£°Oo®Í7Vö*ìÓ«ê³Ò7{ö™øžÇ,ìӐÃNAÙ>…}zC:ќœdd¯Ânà#J2íÊSa´—° »Ã°PM¤óTZ7jïê+s¹±mr|‹Ÿ“ã·øI¤rÙ09ì‘Êò`Nâò4!•¥µaƒ„öT8Ë;{mNŸP0Nð7¹r϶6’ú¤Ÿ2rmÃ*°Û'ä…î"lLHEY,c¥°y0r™tN—]Þ¨5„Nb“²‹|øÁêþ¿ý‹ç„ËÿÌòlìÚë6.ÿ;Ù¾cÅ` -ºüOŠr˜Þÿg¿Ó çb·|è½/ÿÓìßÜÿ·[©”Îåû!÷¸üÏ8©¼ÿoz)u  ±qÿߞ$Ñ«GÿÙágt­Ç«ñ¸ÊÜÛ*È5-n÷ÖÀø2ž«nÖ ÃüuÂ¥eMŸqŸýìîÆÁ×}ۙÆz 0–õŽ& C¶Ëã m)ÈUW< -ƵC$©iKšÚË풦öRÖ|ÂÜX(?#ÍëæBvfÓ*%¾sÔT«ÎñR­:vS­,2©ÛK[YV6 -1½ï¤ (²)kÈ6Ùԁf..h票åDQì·G¥½šá!‰Ñi³ÚWçøeðÝ¥±â>ÙíxC­l^;£k÷$‘h[Ùè -efHÍo -–+˜œ:©ëlš•P+ΫMÙßù-÷=í a –™]o»0¦GÛ5/ŒÒy4Ўu¹c–K(‘ìÜÖuK6 -1³¾C½%`É6Yì6ŸØ*.—O`Þ³;‚ƒ©‹:v¼ŒH³P4%nC›Ì·UBáþ±.Œ±¹w»÷Ï03E¼úï%M¨ -ïhëÑäÞ¿LõCîý;Ñbn]ý·Ç2ÒIÚØÇÅÝãÞ?µ&_ýw踶j£v»¬o·{ÿDac³vc¯{ÿlßs_¢¡$ÓvÎ14~¨¾¶>÷D{Š¢ýj_òtpf×Q5¦š¡Ú÷ý•úªw£ödü²‘ÑPí+Ë4èðj_Åôl»ÝªïŸÌ«ïõ -©`€Øl=uÖãóîa0ƒ<8zã“pv-¤ê3h4;ÔRYUËx÷'Šsm¦îh;{÷&ËóÙV|ÛN!"ÚNµT¦%™!C?_Ï÷4ª¥r_öŒÅ´¹Å¨~€Ý²Éö,Ær(ˆ´§Æh,‡,¯J·e1¾È£drRw[zžêÈ" …3ïM*Ó,ü&ý¹)‡l²Û8U €JØ«ú¶Sw«=êÙp7ÊÖ‚û]†©É¹Ewë2ÌMr։i9¶™í&/c,LôƒzÅr7 -Î Ã\á|Á`÷*ùRy%^º•×*S(Öݛr)4,—KáÌí¬EEt±P÷NˆE©Ë·Î׋7U »ºFî͸2/uŸi+JU™çÏ[ºõ€ 5ÝEÎI•j U5r£°!VŒè–îÕþ¦FNY­¦Åúevù_0­À*•ªA¢ñWÓeü¬4\m\ìyÚÌ\Mwê1¬‘c6_xHÌOÓ+Îóç²KãkøL®Œ½¼éa=A§Z!"/Ë1‚îv ±ºšÔtd„•BX•;ê’Àûgc¬Õ»·š!…U÷: -XÑòßoM-X£~ôI`÷ŒÍvY¹ l šÆޛ¶@Ƽm¾ 8› ý”q›…V™šÅ— zêO/;SvØ¿üۇäµ]ô.R¦×ºY¥Øhƒ)ÆeQ?†}RzÒvºµ[Š´Wv¢½˜¦rH▦OrÐINƒÛ3îÔv;mLŸrcŘTv· ·Oäò¸·LÊãô2AO~Û>²ÕWÑ;候d Uìæ†ÚèӖ·v@å¥I˜l§Ù¬K4>¢g×uc’V໳í©ð­‘['ÂEhÇð4>«†Û ;Dn9ùn‹hÕ£m‚V±M÷~„xÚgõ‡ÞYGËXiªï7$[iˆÆª$ñàÓu?ѵn6ëÖ,½XÝhf7ž¦IEDhíäiÓxÔ; ›Ads4OZ/Œ¼_ ™Å©~:ÏnuÁCԌêBÁ>xoæSG`øó+T 5ë“!ÜBݝ:;uië$ EûyŠ;ÎQ zç§ReeÔñ1\¹þƸ[”áQ 6LuÍ}kñ¿K]¢fÕ»’úç Ø®K´,¦PÍ!¿G`H¯^ð8Á3tϲðÈ6õt÷éżΝ¡Yޔ¼Ñ,/9ډh–µIö‡©{ÍÑÞD‹vl«ŠY³Y¼GI¢]³Q[³cIâöòÔ¯GÔ.ÏK·;¡_(ïF)hc¿$Ñn=¢RìQ’h·Ñ`oÍnI¢ÝzDC‡Ý^I¢ Uc’ý`»$Ñn=¢ ޝ";]4¸µ½º[I¢ÝzÄ­tµÅÂ÷hk\£Êú²Â“C.©³Yá‰éÕaG»¬p+çö×\V(eÛٕû]V¨#Ó~Åe…Šê¯¼¬P97¿ð²BQIÿâË -5™÷¿ê²BãðìV3öndW?Ú9ÕJºíP•wȅ‡JVݾípŸl;Ý ÍCÕÆDÛñÂC‘…7ÜGHí½9Ê©V6/<´<Õê8éT+« m×{vá¡jYlÝvhÀл_x(ׁéÑ_ãxìááeû\x¨ÃŠÛu`ö¹ðÐ|p'–÷{Ú¼ðмðä—Ÿ @ÓÛåàýÚJ†=üÂüém‡r¶Ýš/c•uȅ‡æšOÏ÷ÜëÂíÒÕm‡êœÛò…‡Ö{6R³¬/<´—v}ð…‡yÓÛOv¿§pŸª`m0eï Ío;ÜÊèÚ÷ÂCótµ‹ûl_xh¾#ç@x᡹/Ç+‚#\x(wÌî…N{]xh¾Ï#Jƒ/<4Oñæ÷¤pá¡ùm‡'¿Ǽ(›ßv¨´:ºðpG)°ï…‡*vÛºíðä·½ï)Ü弑Ó{ -,¹ðK·^J"\xhä -ß+7<üÂCóZh‡_xh~òˆÚñ8àÂCUá×VÎlj¶hiß mÊ´C/<4Ձ=äßãÂCsƒÿd‡{ -÷;ÿG›D~؅‡J(Û·®ZÛõÂCÓ+ -‘Õo,lv¼ðÐ<Íe¦ãÂC#&ão;<\¦ š?R’…Uu°Õ…‡æƏ&ûaÿ Õ׉ìÔ½ðЊþnÔA±{«¼Í ËèÒ¹ðpŸR})u腇[…WªÛe4^x(­GÝÛ2í° ͓¨ä<›/<4÷î•D;èÂCuÇl.ÏÝ/<<Ì÷´}á¡ùm‡hÝ«ðÊø¶Ã£õ÷ºðP¬ïÒ·OÕ«]xh^¤k¬¤w¼ðмŒ -ÏcœÂ•7½íP„ÜÿÂÃ}-›/<4¿Y—G¸ðÐv^çašë -)¤ªUÍXhËvkÆL:Í« ƒcY•–;zžž‡5aÓ½P‹|ù;$ӈ¾6¦y¹TÀ³T¦,#1-݅‚êÄ:¬”:Ð¥qXaešÓóæÝ8ƒa÷m(ÚLŸ‹Mš,ÃDØ¢Ó7aîÃÁ‹Œ+út/Æ~vz¦7¤»N¥Ò¾«·ó×Sç5çu‰‡ðéËg"Мwztñb¾ê4ÝÔtLtš?ýä|Ԝæ_wÓÕI§ïÞë?½¾nŒ;ÓûÙâ±¾Ýôú5¯§ß/û½ß/ñïÖ²íώ×þ×Ç\tžÿ0…UâÎùt×ð£áêŽuó:÷¹.žÛç©ì¢tÑîÔnÜ_ëËXÚu›ðKW:‚©z¯“M×÷ *óñì)qt2³0¬(}ª¦Å¨°²r}],”ì†l !J[’§º~WIŒ«¤;ã¢#±êSé§Ws¾J±ž¶üéø>U«…ñ#VBµÀÅáýWSlWj¢±FJ/þ*¿¾Ñ¹tùړnÏ üJàbCxê××xõ3“+ÏÈ0'hUÎÒXøyŒôë£&‚PïŸÃ$‹ |¨ÐKz½z< ¡ÍQΟ¹‘«„…ã1/ú“'Zßdüè°°~ÀŸ… ÿçKЧèy.÷Eô½o lüY˜²M'zÞð(úÀV_ÒŸüE ÊéY@ùÒ#>’„”&—cé¦x<¿žŠî¼h¬x­yJ4Ò×~EûÚgh(=*¬3ü.,hˆø‹¦–x=ÑLÀý€†Î n|Å%Ýd‹§§¾˜Ñ¾&m|€†T M#º)$œã&­0 -æçüùˆ£7€t]ràÏ·hø¶3‚w»~þ,wŸÝZ"ÑùÒ Jˆ¿D4_)>ñ¬„Éœ+3Y¹‰\5ö-‹sÁ€ª=ß+¼¨åÅ¥ÝLƒ.®Ê¼Gp,â’Að¼7©ûtªFÜŒªW®G—N$]À¸žq¢¹MÁGä‰xý3¿_Ș4t áÒ´o]“€—aä‚OÏðQ|мö‚?ÞpÞT>#ùôuÌ׀ŒŠŸF1C˜ßùDjüùޝ¿aâ§O\ê΀Ïèjæ…ÍGQùYäÓí£…ùºý¹F3_&Üˆ–RÑT–úôŽËÓÑ*-Rg)…Ö’ª‡Å“úø¡¡_¼ó"OÀ=‡$¬CÄ2à»O ¯áøDââ§QDn'¬oî;&w zçz„Ï›Ï&{ÁÓ[âëö"aÔÕg“ØMÍóõ‘ðW{Ïõbã;Sè}µÑ¨Ù.Kš:£ÉLÑÑÔ¾bã L¿ŸÞgÕ¸}®;ƒ©@ßé^wið)Øp‹QÊé_ĚP£÷œÀPn:}?g …I|@ðË3ìBrT\Ø·+a[”—•îˎ±¢9p¡b‚è|ª’¼°£È>ôHê$ çOõªógt¦è®H%øæRó2 ru=ˆ¬#ð]9½ªg>*~‰§µÆ‰°¾¿Æĕæu©r °p>æ’äX‚OFà¾| ÄÔÄè u4ýð¬£FŽ@’†+79 ™i> Ý·(-NW° -O+Vá,¡Ù‡²5$Œ°VðC¾¹E÷o ª£Faº-&°V­ÆâƒÆ• N!~ Nyȼ°¹ã' -|^m†<Ïçãï¬lܪ¡J«7êòáþMx'*Ø ËÅÀ=d –I`Ôü:ƒ“º:ü­,ü‹^lØJÔõõ•¯'*È[ºœ¹ZxÖ&0>¡×&ŽíÒ4ö³<ЬF¼W…$ÖȐ—‘¯»¯Žÿ*âÅpÿ¼P½sG5 PZÂK2-~u› © ,Åx¦ùʎr5(¤ðz!݄Qlì!.#Þ·`m $ ‹‚&:¯A™¶ß›Òk1Ð1~‚²§YŒT -ΈL"Éñ€æ›lîÃۙ;ÂòPÇPóg÷0„"Þ:}ºÌ#®Ö$ZÆ05-?Euü›|¼Ï°Œp=|¹Â"À&{¹+ÖX˜hwDåÊ¿)肝èl·¯»Ò×íS9]M Uæ3ó™}m®òµEï^^¬Çß°B˜]OýðŒ• ÖL󡐩R³ÒÜ㹯ÖÛ3P?Åp±r½œ±De—o)V™•ùÀA¿é:§þüÆåÜ5Ô7óÊ{¥V»œ»•èÞ˜  A†å’lÈ£hˆxjIø)éËv n•arÆVý³×i±Û{bvFF;~­ Bnc7@ý©„B¹'¢Ï}à…ìÍüÞÕžðWÙ¼kï9ߛÓ|vk󩿑+âæςÎ}¹]A=ä…8æ=Oa[Y•ZíÂQ‰Ç¿ŠÝì·™ƒo‰€ÝsZÈ]!iQþ ‰Ž–gþ±ï«Ún=‚#)°/Í9w(V/.œëÄ̇ŽÐì0ú]†®`7E¹Â¯d7PŒþ=­2óz?òÖ÷®2õ«lÈé’©P،»ël•ù´â‹Áç9xÖn w^úº‹tˆôYÔàe˜€3àürÃ`BOဢT/ª}é‡^Ê¿ö«ïďtÈ«µ -åáb -=÷3Üô*Ðuæ…èêgÅÖ$×´‰WÆ÷ì -³ÎwE˜‡Ë×3d3D‹Œ³¢µj!?Ç^%¿ªóÂê'üºððb×ÆO/è€9VäIëù¾2v­Ï €üÃþXWŒÚ¬PäCïoRÚ@ ÷=ðvu@cfR–Ü;Í´!Á¡Z;Àšü¥ÔîjUâ´#YQ…(l~¥! P4»ËÛ#:ìÎ¥tÞP”tžçݨݨ¯ÅocÔÒfñZÆéû\¬¥åæÙ¢z,ð€Ð?a­O§ÜæNïÝk*“üU‚ZãŽÿÓç>ËA‚âÐM¨SðAªŸü“pzswp³Ʋ±_¡o¢:ìûˆ_+ŸV#{¥öį ÔBÌÆTò÷¨B¯qy –b×YýJ´¦¶Uíÿ€¾ÑÓv»¢¶0 ¦HcFY¿$pc¥o€”ïW¶£';]Íi‘aßWȾOû•ÐÃS_®DZ¬ø½µUî“sû+xNL»>d‰Ûà9È»¬³=Œ ¨=ËAœ¶‹`Ùi‘Ù‘i¶gÚx‘Ài»,2€Æb¡xMƒIÑÕ$™ùhߦ‹õD•Ÿ+•¾îÎîПéjjÓGkñ Þ©>•:ÍB˜»jëñÇPå•èuÀŸ‘qѕLål”À ï5„#¦]1¢ñ«ölX[¦{û¹³{Òû[ØbT}[s'GÈî>fÐVÿá‘[[Œ¯OÓ1·tr §ÙÛ«9µO;ª§ñK#·fþ&ž6OûöŠ§¹gð&ý,¤â£I#ƒü›#ø2E¢?_øˆâ‚üÖ[éhÇCµØÑ'”ëÉl¾šI!Jtèvew·§ÁŠ¯wPûÙ]qW¾÷b÷ñûÓÖJCŸˆ¾|ʼ¾çЮ pxüqgÛäø%³o¹MtœÙ×±:Å싩½¿xö¥xÚ¯}4á(©ï—Î>šz€æϾ” ùkgߦ¾9töÑԟˆl†ÿêìH…âk>möCìG®5AS°Uà)f$@š{•-HéW?ã’Ѭ¾¨ÉòÙlP¡^]ÃTCÑUô“󰌶 ¯†<3ÑK¢}Ê¡‹W‡å‚·²ùñ¤_¢2 ЕM΋ҹäi ] S -+àÄs —«ä$òËâ›ð,ÿ« ÚtxÈä3ˆßõ~Äï^˜ð¬µòËùþÑ«Þ]Cµ´3xßåÊÈiðÆ+‘=¼ðš°ô™Pu²x¼SÎ4Jqæk<.#~©”ÃWxò‘âÒÆC¨Ÿ|Q‰çêm¡r£øYEóM¶æÂEM‘ ./OtËL÷=…ÝyQßô䕉öì¤ÃUþN/¦ôò&*i„Ø38xÇÉÓXM¾ïK¤¾–è𩨰ÉE&÷^•DÐ\º6O­E™€¢ -:\äœ_"ba™°;sÅ·¥ç— ®2óbž¾ 5‚¬ÂÝfhZx9cJ„KN\§à{òtpÆØ7—f¸Ê´9¿KކD„úGèôûQ$B(( ‘ù—wÙw‹„Ìà ¥„±à›òhˆ,`;÷îÞ u’yû^+C€ÎwØî@c{ |Yú^Ԕ¢ðNÑŠ :q"TzY ä1މµ4àºþÿí=i[9ÒßyþC'Ãach·Ô­>HHÀ6ׄ„c8Ç`‡Îؙù²¿ý­R©[êÃÆ6Ìî>ïîd7±Ë-©T*Õ¥Rõ¢óœ>Øìô÷RÿMŽŠ ï>Ç[Uåç -6=̺ñzæI.é7¯Õ½RÅ഑h³úÅ.æ’4«¦8-Ë­«çÞܳöíêݼpڈY›X¬ºçL“ÃœÈÚÜÊóК¿ÁzqÚ {íý6‰î»*K:ÀsOïÁÞ{kôqúeòiÖê‡Äéy¥’AB­79$îØ ¬•A"¥¤ÙÙD0÷,þ>›[°‹¨ à ,ÄÎüúH(Î~L^#›K_ß^ ç^y÷•æAã±µºQÿükô‹r±Åb|¯ý¥/û™ÉÂÒ*J•Oò`%}º aüg%qJqï#қxùnRy·ò0u¡´äbaL)ºXhúcèº\¢üûÏt˜ ÂKçÛ3NõpË6<㽅ùúÒÞԛ›Å7Îï´ovî$•ÄÕi{J¾è¹y•./Ž"6u?qš!ÞkBß7¾ögþ¥ë1¼»L]§Üߗ– VuÊ\hÒu9â«pkӆsŒ«O× üá‚+™u„¬µzºóí£÷‡êþ^ë羟ZŸ~ƒvɜœ¼g—º£f\P‹×FŒg ЖXår½îN-oF ØîVyyÛÝ ¨ÁôÂÁ}vhþõv•îÂ&%w@Ál/òews«òüTwjóZªÄ×HÍUۃË9É1½d|¨ÁñíiP'_0ÐÅm7à^Õ®UÑu^'™‚E›`„à-›ýîFo¹(á­ä÷ìÌv‚x å}jYÑ¥;íN¶§å_g"Ì0±\ý4Åk÷«ª\Jf†k8t‡P¦®ÕèƒËÝäŒãc©%ݞ{+•tL›êoßxùzs š/ÙÕï·AÝ­MM‡zJx–p êcSU©“{,UdÞn|õ~«zqØ^æå«/oÎå -žI»KG[ø€­O,òfÛߔk.à -i60*¬H³íà=Dz‹÷žµ.Û^"üPýþÍ[à_»;«È ¹ñ¾9Q—/ʚŒ°nÁŒÓ9õ‡ã_+²PI1+•Ëü£ì™˜é2<ô»ʽ—ܧýb”hM\ŸÐ%ðé…CAWŽkMY/`N‰ !~MªÀ®N -žË Ç)Ç·øÚLrÛXÞ?žU_붼l'}T5Y€Âwµø’°WÒ÷~åíaF_ Ö¿™Å&Þ-ÎêÌ ï©[Ä°ƒ¾,Æ?l8Æõb_³:/‹N”ͻ˫‹M>sèÕ]øà Ðp¯K7‹é÷ê–Cå&æ'ñNú¦,7_*nÅ·˜?UhSÀÅÝýi.‘š œJk£°0jTtT?9•÷¥F—­mɯê¦òÙÑ1KnäWW*IÕZ^öç“"»¶¹G¯v&—g£ò©GR‚ÔÏv‘^ Ø­>»#ìÅ1÷~õ—û·•½7]ÿݞ‡ùKÁçv‰ÂØ壝Wqí…c]2૎òòcû2žæ¾QÄdÔòá>U፣uF<ß8ÛãTƒ¾\íqõéñø Iþår«©>ñs\Ë}A}4±Ë#[¾·”7¯6jÛ|ÜV-$7֏$ hŒ¾¾iÿH~ó’MqjÌæëþ«zr±]»²Ïg–>ž}Ûh|Xµ£*͂5‘d¥U5›)£¢r¢wA®wâQ?W©–Àßóè²òԛc¡>5ZÉs®zî÷ë% CmÕw?¯4®^Ÿ-mïžL/ŸÎ-î£z}‹— ãýðpçk ãn"uѧB²6Ï­‡Ð¿‚d藨‡Ð¿‚Üž/Q¡1i ¼D=„Ja1„¥¾ „àV("nU·¯:Ý­îÅùō5;>öf|¬º´ÎØÞMûv¥Ûéìvþ|hܞ=^wn¬y«º´S__E£svÛîX³*?0¢¾Ä%ÊHq{ВkoÑêåÚ/Û ­Æ7çð]6`ún÷'&>¯Éë5gö$¦Sª@ií~¿R`Xò¹«£Òښù¥ÑéÖ—+¿mìg¶ ´»£¯»«X¥`y¿ÖÙ^¬ÞŸ¿•)d£Æûïo޳Ю•¯§vêŸ×¯ËÇ_+-i åëonD½=†¤‰Ln(¨F2³»äãäê¯fˋ œÜã¹¹%w çj”Vëo+`¢ãsͅl…X9>Ç\ÀV@uò\sa[‡Ù\(MÀ×=.‹0™E…À5’uš”ýq}NŸ7bQCÚ27lªæDþÊÇmw:ƒ¿Úøõ€ú…}scÓ–'첪Nt¸.W†©³7jTð9Óégʕ4ÕU·«EýIu2j—{Ngüµþ=øp·´»t³O¥ŸjÇ3_¡ÉR8;HÜ®›0ÙWs‘O7f -OTÀètÛ¦âNË'2}j½þ ->i…¸vä®É'`¨·ëò“ªªuz.¨š™F—{6ô±Ê`åBùò›9è|©DŸZõ…¸ŠS‹UœjG{ïµízyîÅÊìHÆÄû½•µÊå³%«¸ñ¤N&¨u“)Ž«²œºe3ôiùä× -}208w%,.'g¢ã]¯]5¾MÞc ®Å·ï¼8„óY YRÉÅä”4þž®•w—x•aâänêˆË¸q©{ -oÂxI½¦jˆ­WpîUeõçÕp²_ïïщl6 íå…C˜Nhgbq¶s§žjýD}ØÖö°V Å^ó!1H¦ñM£?ñäCBke2f¾Mÿ¬(ÿþð֎Óhøôâ«Ïªò]ݞ•ïk—…5D5¤¼pÉó¢GàN-¼aI3 ²°³ÜÖ§@Eio?PaÊ«¨ïžz©¼ -±öËOÿñ·8¯âëd¶ƒÇӏ?uþÚSGü×\ -ÈÂáu’²—O94oL‰Û•lîú±î`'I¦Kh´ÜÄ+Íi^¾®h´—Øê—s£==͞Ãó¦:(iöìCŒ>{¤¤yÓYkìœÆÞäˆVÖ\è¬ìÖ|?g’â´Ô¼rœV@öϬìÃiƒrkYsÚPû6E´Aaω˜œ–¢f†ÓúMDsÚðHqZ¹§ LÍÁ”ô«éÆÉ'Õ¿ÿ’îc&#‡Fb&¥¤{£?HA©¤ûáa²ç(l1“RÒ£ ±™g(i钃×Z¥3ÀÔ ¾ã}­#¬zt„~öÚ«Ù­ò,¥€ßÚ6„=¢µáéV›Ñ©•f3á|¼½Ð;6{~þN–«ÈÖåk;.Æzýà8%»*¿Ê´õéGgFk–U$R»Úòë|i®BU“å× OõñmoþAJ‰u#Xh†IR~³< ÖsÿÙ𩍘ɻúœ“4ýçõªy"ðæ|)þaKWÇ@— -/­.ÌG˜ÆÐàI?C£O ›aDÌI…¼ëÏ÷?á‡m&oªèªófHµù÷U§Ù¨Âó_ÕyʤR…ç_¦Ë¢ªó0Œ.<ÿ÷U«³cáù¿¯ê¼É§_Õù$#$¢zéªóEáΣ{œ>üžVÂKExËãÉKãAt)Z\V⃕/÷$µ.^œJ¤Ö},glrÔvYEúElmâÇ»ä`%9?F¿;tº‚¯ÈÁÒÔ¶ŒôbZÛ¶¼pôñ²ñ6OJZyx'oXeÞ­A‘ÀúäBúÝ¢ -%EibI0õN»ºŸ|šâLµ«‹ÃR¦Å“ܬ˜‡Ÿ*?oŽ²$VïæQmêHdG…€$ӝkq¿æôO8ñ=7xŽÙ\¾i›g˜žÐNçáñN>"šµÎùÅÍFë¯Nw|ŒYôǁ?øwYŒ‡¾„nœŽ•äÓ+[x¦Y]ê>4.Î.noZÝ¿¬y ;ømco½aÍ[ôtž~c•'§ ÃOey|ÚDL›ãcŽµ„ü1>öÿYKw܂¿ìÈ áZð!~ÀWpîDø¹,ðá ¸ðÂ\ü¢-ì‡æƒü…ß~…O?ö‡Åë7ëø³cµÇáÇíñ1Á\;ay,°}—…Öµt#ÇöYÄ,/bvè‹ÀrýÐ8 ,Ï÷ìÐsC 9óÜÀ97€v½êž ›Å0ϳ}Ïõ­¤Ï÷m?ëᶋ±J€z:qWù BÃo½ÖÒ±ªë7´xÖÙíõÝíãMÛºÿÞºëX×·íNv%‘Î\ÑY£(˜ÍB—!)½Ðµ]\ÄèE¡í†ø˜ëÛÌç&„Ptin -èF‘ÍD‰»rCÏvB‡kC°¡çÛ.w\ã1lJÇ Œ®bHjĘ w¥‘ÏÍÖN‘K{77­ëNÛ:ï¶Ú˜DÀEY±!’iŽ©D` îyC~°9ã°ó¬Úùø؜c;øŸkùàɅ0šAòƒÇ#5•xr×qCöC…¾Í#·WK[sïp¶v¦åð„ÍÏdÐÚPƒ"I9PRxBù 9§VëŃ%f‹À "¿lUwº7çV©V[:±¶}ûÐÂgÇ­,9${)r˜Õx‘ãqa»²ÎÔñ}Éü̇M³N€t¹‡ôö€Ã=d{à7Ç÷Âmø$!ŽãÃOܱ=`«ŽCø¶ç¸®nÓú,ä) p|;ŒPŽ˜@¾—ú¾Çôоw5zaÜՓ\Vz-^ –dç÷Õæ.Äî_w‘–KӀyvä‚^R%R1nG1©\îD¶‹BÄvòD%ñ8ì~lb‘x<ˆÒO Dæy«G&j9¢9pO2‡ íöz ‘ÜZA¿íñ1ß*•­ƒ}µG¤*†]ma"& -,yØæú÷Š&øƒâ†NtÒV“nÀ"ZÌè¹8Jj®>€œŠ`–¦ó¤F%îC 5D ìIOÀÖ¤V@ÂÕÂíiJxŽ¢WxÆcŽ‡ÂÖЃç#É41$ÆÆ@èQ­9WRÜEÕë‡Æˆ JÄ`')Ù.!êxœ¢ëÄg‚6{L 79FH9E-µ¾'Ù,KÔ~ªý?†»rrx+Ç- û™H$#K" -€ùp_¢¨r9L ¾yRT‘dó)ø1)i—Ç@µõI¨aSϕ&A6—êÞ%#Á­ŒäHµž@ٚ‹PƒÍåXL:ÑÎV6ghŽ€¾Œààx93 q",l1ÐGi½*Qs}n̸i€u¼ c Æ{6 ÀpEh£E1€»°Ç>ƒ†H3Øðµ!år x(ø vÀ ª’dÑLU"—WZä -¨ÔiJm"œy$’GI„RÞs=+¯5êĝÌC¦4õ 2¨p<£mÂÄIÿ9Üê},J`)èd, –òrKxK‰4KA°È'éÕÔG–òA>â´úðTñ¨’§Â4O 2*S<åý«y -=Ð'£˜#Ë O!}N€ ,A+€˜ $š3°4LJ-Ç•à ’Q஡8Ša’#`æMÁéð{t÷9,úø#.px-‚ùq–…ápÌÃsTp0ÂôZà–ô‰w´W‹d!¡WC¬y0K'畠‹„}ÆDÎAs¶6ܘš„`¿DÿZ¾y¾iö¨”g#ѝ±“‰¤3~«˜á>\Çöt¦ÝŒ<Ifظü€±ˆÍh `ê;X<~d,"ek‡q3WBÀ bŽ -tDò'~ª›˜ÅÀ"t7^,Dá…!˜F(‚Q.cˆD%8X¶¸a1JàFjƨUs‚14ëXoX¬¤wâÄÆ HÒÞ%BÔ À¹ÄµrÀ­’šˆP¤¯”)=€š£º‘ ^(æôäz…*‚́c$ÚÒ@n»>s5æ PLǓ#_Š%¨çV)3¤^£—bŠdݐ¦ˆ&‰¤íÈô#_¸9 fÇA¡ûQ$'Î"´\ÇBbùÚÿha°´©iÇÀÔÄSx  ¨B ‡JRp½üÈ(½€>Ï0J1ÐD ˜/¾È¥ÆÆéáGHe¬fLp“r©íoP.¿/·ÒÒ#"ž–„rQY:f¢†9(›GO‰+éԻ҆S¢ŽÜ|Cj€–™&åªÑ‹’¼y\ë/FÐ:Q¬B2ŸŸÐFý·™ÇÞJ(àà߆$xD>˜‡¡@ÿÌñÑÉ¢õgx("á`7p:èw+èj_ٙôÎÎÈã‘@™ÈÕ}4‡@Öx“ÎœÏl‡…~8£èA(¤«¯Ïv.I7×Gg¬Nè†+”BRz`}ùh?Ƽp)iɅ 0*@`»¡(½ºh’iÇqâȎx,å}šˆlã ãÊ'2Q˜ü% -Cø'b"¡ :`l  äe©°éûÝÇ -OÅ1t}%¾  #ÙT ’aj°¹@¡;– 0Îq,÷ˆe¹Œ - -¸à¸Q Á7€E'”\å -E­cYžPn@XÀŠEŒP͵ðˆ4ò"þÙ¢éNèÀ_°òn:¬€åŒ•>̟œ,Ÿ]]ÜÝwöo»—÷w0ÖÉÉMçÁ¾¾=ï¶î/®í»«GÀÂ>í¶nÚ0»““nëæ7Àåþääâìö¦ùÇ÷‹‡ŽÝº(㛆&×oήÛDvzÏuÞ·oÝuªçñ±*Š,ß´=ž¶(K*ãíÜtš¼ÉœfÿԖ^6öP£©$oÀÁbx–ªAÿlÉž¬=Ù,L1ÀæÈÀ–$ GL“–£&ÊL6{:`jÚæÙ V”àQ3aýsa é¨Ù0¸N#æÃL61\ùüœ˜ÉæÈY1qÓÑòbôÀCgÆ 3p67F1ÜËäÇTͦVuóöa»svÛm¨Èu¿¨nwZW¿µ`„?ña«T_Z_Uë¸ûí¶{M¿ÅBÉ"5Ü\ZP\í<üuÕijÒ²‹v -å˜YøÌ¢3„5b*ù¦$Ä°þD‘)‰ø¢iŒƒÚ×éÈ,…ˆ Ná0ÄN®6g0 æ0_`+»˜C»™1:HÄaл‡.xE‚aîl.‹´h 󢶈]ã9p'Y$ŠC•/”ôñ¨ÎM rðuðAhz膠ÌĜÜ7O:g&?°,¾ÂhhƁÞ-ÈT_$s—¡â’–N(²”ːmR£¯xîwb“0á#± -±La -®oAGJだ-¹HÞæR¹HÉ\JgÓ¹CO3¦¸Ðâ04ŒÅfòIV¡PA,3¨¢¨vÌ)Ia.-55m’ú&O½˜j/ ¤bùDÂê)y¸ ÒðLð‰xHãÑRñÈ#&ãAÓQÓñßòHòŒ”’÷\xa±‘Rz± Éú0Ex1ϔÛFGÉÃ+Bq£¯ë1b6žé€ ™—ø#e䥐árò†8“•7€ҏkŸò9z’ûßîn<Å Ox…I†±U—I3$ðH‰†´ s©†)Ù°¯»>bÂaÏ]ótÊ¡fޑ’{n›§Ó‡9“xø_»mžæ‘§6NQ&%Z}#æRÆ®¢›s Ģì·AFÌ©ÌîÁ³*upi”¼ÊÌî"³r¨qÓ¹•ÿ½[ã)îxbg¼á÷˜þ+sHKÜ¡ q.4öñ3¤*,?|iÏ!‹ÔÄÐHÌ*B\û_…™ –Ïå‚`3ñÓ ØÈþDh>'4 Õê;ŸJÀ‘2CSÃèìLl&‚¦¦Û,pAŽhŠÂ搅y¢%S4·Ž¹¡ÍUü–^#ÛÓ\x#íÐ)Š„m.ç“ÀÃf}šØù”)p£‚ÜOl$zÆ œÉÿ̀ãdO“Kz€ÓåxØLÐÔ^5)Z˜ ªV²0›3^2– œftªN²9*ž:|Vgˆ6¯SÍHJø(#ñ³ßŸÐ½$~Ÿs÷3Âç:/Ô´ Òà”`ɉ¡œ•Wy™–]“§ïÌó:à:Ñ*)¡µT^µäÕO_=¥ÕYFáe5c–ÅSŒY¬¼žž±>æOk}Ýa¼‹3 ȑ®^”ÝÜ=ÀQí»?²ƒŸN,¤Ò“iì3*©‡ë¡k‹ôò‹âÞ˪è¡!{èÓ6Ho¥öâè§9'§YDëÆbpšsr}ÿM蛪ñ:­ìÒ³‡jì¡H‹ÕnoôcÏêé'Cx›Ú<}ÉZ“%­2µ%cªå¼ñ‘˜,†Rd¿¤‡Z§qÎiÿD/d̈́Œ‘¶425m€ä†¾ çœF¿NCMş³ ÒFD½ÉÑÃ@ÉYKÄ° ²&FÎ`…4 -Ÿµ±ÉXâyc=kÕ×Ó¼˜62C?Wáåܕþ*£Øiëáâ»B/ºïŸ6ë˜UZºÁ†é³ùÆ"¬ò•$Ð⫋ðFÉ]ԕnëš%ÐÎÃm÷/„#S ôˆÊ€™Íy($EYÒ:l#Ã<Ó#QÍ{€d1±ƒŠœ²U­ßÞ|»¸Â}l=|'¹UÅi.Ý<\´®.Z÷HÕ4 ‡·Šs5А®f4&˟˜µeEÐ`e(F:*ƒ¦òEû§oJéoR?¦É§73IǓ͗I;†ù½xâqóïJ=žlþ3¡ŽN?Ìiú÷¥ Eê -«ÒIvØîÉÂû‡ÙËOå§:þ þdÁ¾Bñk<Àÿ§­©²,æ܍×Ô5€^ ܨ™’pnn|Ì|–Ó³òÉìs““ˆæn·ÔÕy~ßúGÇjÝÜà;wð“uÞí܃¡Ñ±î¿ßþl”4˜œ\ÞZû?›ÖZò -endstream endobj 5 0 obj <> endobj 25 0 obj <> endobj 37 0 obj [/View/Design] endobj 38 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 45 0 obj [44 0 R] endobj 62 0 obj <> endobj xref -0 63 -0000000004 65535 f -0000000016 00000 n -0000000173 00000 n -0000026899 00000 n -0000000006 00000 f -0000086484 00000 n -0000000008 00000 f -0000026950 00000 n -0000000009 00000 f -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000014 00000 f -0000000015 00000 f -0000000016 00000 f -0000000017 00000 f -0000000020 00000 f -0000086741 00000 n -0000086772 00000 n -0000000021 00000 f -0000000022 00000 f -0000000023 00000 f -0000000024 00000 f -0000000000 00000 f -0000086554 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000086625 00000 n -0000086656 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000029537 00000 n -0000086857 00000 n -0000027307 00000 n -0000029837 00000 n -0000029724 00000 n -0000029037 00000 n -0000028218 00000 n -0000028475 00000 n -0000028523 00000 n -0000029183 00000 n -0000029297 00000 n -0000029417 00000 n -0000029608 00000 n -0000029639 00000 n -0000029911 00000 n -0000030085 00000 n -0000031263 00000 n -0000054430 00000 n -0000086882 00000 n -trailer -<<91CEEB81984C404395810B8A574978A5>]>> -startxref -87017 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai b/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai deleted file mode 100644 index c7480ad5..00000000 --- a/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai +++ /dev/null @@ -1,716 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - xmp.did:AD1F418A7C94E91197BDD9C8DFBF9319 - uuid:bddc7d4e-65c4-4f22-90c9-2f47cc2b6270 - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - proof:pdf - - xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 - proof:pdf - - - - - saved - xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T03:03:20+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:AD1F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T04:28:29+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - - EmbedByReference - - K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai - - - - - - - application/pdf - - - Eclipse_with_icon_3 - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T04:28:31+02:00 - 2019-06-22T04:28:31+02:00 - 2019-06-22T04:28:31+02:00 - - - - 256 - 240 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqp3FzbW0RluJUhiHV5GCj7zkMmSMBciAPNlCEpGoiyxzUfzC0G1JWAveSD/fYolf9ZqfgDmm1 HtBp4bRuZ8uXzLtMPY2afOojzY7efmXq0hItbeK3U9C1ZGH0/Cv/AAuafN7SZpfRER+38fJ2eLsP GPqJP2LLWf8AMDWqNDLOkLdJRSBKexAWv0VyGKfaGp3BlXf9I/R9jLJHRYOYF931FOLXyBfS0fVd VlkPVo4mY/8ADvX/AIjmyxdg5Jb5ckj7v1n9Tg5O14DbHAD3/qH60fJ5d8kaLCJ7/wBCFO899KAp p/xkIT8M2WHsTTR5Q4j57/scLJ2pnn/FXu2Sa6/OP8ntFqg12yUDalkjTjb/AJhkkGbTFouH6YiP wpwp5JS+ok+9JLr/AJye/KyH+7mvLnp/dWzD/k4Y8yBpZsEHJ/zlZ+WyuqraarID1dYIKD58p1P3 DD+Un5Krxf8AOUn5YO3FhqEQp9p7dSP+FkY4Pys1Tmw/5yD/ACkvCFGuC3c/s3EFxH/wxj4f8NkT p5jorLtI83+VNZIXSdZsr9z+xb3EUj/SqsWGVGBHMKm+RV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KobUNSsdPgM95MsMfYsdyfBR1J+WUZ9Tjwx4pmg24cE8hqIssH1n8yZ3LRaVF6S9P rEoBf5qn2R9Nc5fWe0cjthFeZ5/L+13+m7EA3yG/IfrYfeX97ey+rdzvPJ4uSafLw+jOdzZ55Tcy ZHzd3iwwxiogAJxofkrV9U4ysv1W0O/rSDcj/ITqf1ZsdD2Nmz7n0w7z+gOFq+1MWLb6pdwZedI8 l+U7I6hqtxDCkf2ry+dVFadEDUWvgAK51ui7Fw4uQ4pd53ed1PaebLtfCO4PNvN3/OVflewL2/lq xl1eYbC6mrb2/wAwCDK/yKr8830NITz2de8f8y/85BfmhrjOo1T9F2zdINOX0KfKWrTf8PmTHTwH RLz68vr29na4vbiS5uG+1NM7SOfmzEnLwKVQxV2KuxV2KuxVsEg1HXFWWeXvzX/MTy+UGma7dJCn S3mf6xDTwEc3NR9AyuWGMuYV6z5T/wCcs72MpD5q0hZ4+jXmnnhIB4mGQlWPydflmNPR9xV7d5P/ ADL8k+bowdD1OKa4pyayc+lcrTrWJ6MQPFaj3zFnilHmEMnytXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYqxHzJ5+tbIva6bxubobNL1jQ/R9o/hnPdo9uwxXHF6p9/Qfrd1ouyJZPVk9MftP6nnl9qF7 f3BuLyZppW/aY9B4AdAPYZx+fUTyy4pmy9Liwwxx4Yigu07TL3UblbaziMsp3NOgHix6AYdPpp5p cMBZRmzwxR4pGg9C0jyhouhWrajq8sTvApklnmIWCELuT8VBt/M34Z2nZ3YePFRn65/YPc8vrO1p 5do+mP2l5Z+Yv/OUdjaGXT/JUK3k4qratcKRAp6VhjNGenZmoPZhnUY9Le8nUvnjzD5o8w+Y783+ uX81/dGtHmaoUHfiiCiovsoAzNjARFBKV5JXYq7FXYq7FXYq7FXYq7FXYq7FVSCeaCZJoJGimjIa OVCVZWG4KsNwRir2T8v/APnJrzVojRWfmVTrmmCi+uSFvYx4iQ0Evyfc/wAwzFyaUHlsr6X8o+d/ LPm7Tvr+g3qXUQoJovsyxMf2ZYz8Sn8D2zBnjMTRQnmQV2KuxV2KuxV2KuxV2KuxV2KrJpooYmlm cRxIOTuxoAB3JORnMRBJNAMoxMjQ3LzbzV54n1AvZ6eWhstw8nR5R/Bfbv38M4rtTtuWW4Y9od/U /sep7P7KGP1T3n937WJZz7uU48u+Wr3WrjjF+7tkP764IqF9h4t7Zsez+zZ6mVDaI5n8dXB1uuhg jvvLoGW+Z/Nnkv8ALPy/696/Bnr9XtUo11dSAdht07saKv3DPQND2fDFHgxj3n9byOo1M80uKRfK P5k/m95q89XbC8lNppCNW20mFj6S06NIdjK/+U30AZvMWEQ97QwbLVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVTLy/wCY9c8u6nHqei3kljexfZliPUVqVdTVXU03VgQcjKIkKKvq38o/z+0fzf6O ka0E03zGQFRa0t7o/wDFJJ+F/wDis/QT21+bTmO45IeuZjK7FXYq7FXYq7FXYq7FVk00UETzTOEi jBZ3bYADck5GcxEGRNAMoxMjQ5l5b5t82zaxMbe3Jj06M/CvQyEftN/AZwnavap1B4Y7Yx9vmXru zuzhhHFLeZ+xjeaV2id+WPLNxrd0RUx2cRHrzf8AGq/5R/DNp2Z2bLUz7oDmf0DzcDX66OCPfI8g n35lfmV5d/LTy7HFFGkupyoV0zTFO7Hp6stNxGD1PVjsPb0TR6OMYiEBUQ8dkySySMpGyXx15o80 655n1ibV9aumuryY9TsqIPsxxr0VF7AfrzcQgIigwSnJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq2rMrBlJDA1BGxBGKvpf8j/+cgTevb+V/OE/+ltSPT9YkNPVPRYpz/P2V/2uh33ODn09 bxQ+g8wldirsVdirsVdirsVeZ+d/NR1Cc6fZv/oMLfvHH+7XH/Go7ff4ZxHbXanjS8OB9A+0/qer 7K7P8MccvrP2ftYlnPu5THQtFudY1BLSH4V+1NKeiIOp/pmZodHLUZBCPxPcHF1eqjhhxH4ebL/P /nnQPyz8oibgslywMWmWFaPPN1LMevFa8nb6OpAz0nRaOMIiEBUQ8VmzSySMpcy+MPMXmLWPMesX GsaxcNc31y3KSRugHZVHRVUbADpm7jERFBrSzJK9R07/AJxx/MzUNPtb+2gtDb3kMc8Ja4UHhKod aim2xzHOpgDSoj/oWL81P98Wf/SSv9MfzUFd/wBCxfmp/viz/wCklf6Y/moK7/oWL81P98Wf/SSv 9MfzUFd/0LF+an++LP8A6SV/pj+agrv+hYvzU/3xZ/8ASSv9MfzUFd/0LF+an++LP/pJX+mP5qCu /wChYvzU/wB8Wf8A0kr/AEx/NQV3/QsX5qf74s/+klf6Y/moK7/oWL81P98Wf/SSv9MfzUFd/wBC xfmp/viz/wCklf6Y/moK7/oWL81P98Wf/SSv9MfzUFd/0LF+an++LP8A6SV/pj+agrv+hYvzU/3x Z/8ASSv9MfzUFd/0LF+an++LP/pJX+mP5qCu/wChYvzU/wB8Wf8A0kr/AEx/NQV3/QsX5qf74s/+ klf6Y/moK8981+WNV8r6/daFqqot/Z+n6yxtzX97Gsq0YdfhcZdCYkLCpRklfUP/ADj3+dTarHD5 P8xz11OJeGlXsh3nRR/cyMTvKo+yf2h/ldcDUYK9QQ96zDV2KuxV2KuxViHn7zIbK2/Rts1Lq5Ws zjqkZ2p82/VnPdvdo+HHwo/VLn5D9ruuyNFxy8SX0x5eZ/Y81ziXql0UcksixRqXkchUUbkkmgAy UYmRAHMsZSAFnk9QtU0jyR5VutT1SVYoraM3GoXHUkjoi+O54qO5PvnovZXZwwYxEfXLn+O4PFa/ WHPkv+Ecnxn+Yvn3VfO/ma41m+JSI/u7G0rVYIATwQeJ7se5+7Onx4xAU4bF8sV2Kv0B8kf8oXoH /bNtP+TCZp8n1H3oTrIK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxX/wA5Ef8Ak4vMH/Rn /wBQMGbTTfQEvOMvVUgnmt5o54JGimiYPFKhKsrKaqykbgg4q+0PyR/NKLzz5b4XjKvmDTQseoxi g9QEUS4UDs9Pip0b2pmrz4uA+SHo+UK7FXYqhdU1CDTrCa9n/u4V5U7k9FUfM7ZRqdRHDjM5cg3Y MJyzEBzLxi/vri+vJru4PKWZizeA8APYDYZ5rnzyyzM5cy9zhxRxxEY8gh8pbWb/AJc6CJZX1eda pESlqD3f9p/9iNh/ZnUez2h4ic0uQ2j7+90HbWroeEOvN43/AM5OfmUdU1hfJ2nS/wC4/S3D6kyn aS7ptGfFYgf+CJ/lGd/pcVDiLzbwrMtXYq7FX6A+SP8AlC9A/wC2baf8mEzT5PqPvQkf5y+bNX8q eQb7W9IZFvoJIFjaVA60klVGqp9jksMBKVFXzn/0M7+an+/7P/pGX+uZ35WCXf8AQzv5qf7/ALP/ AKRl/rj+Vgrv+hnfzU/3/Z/9Iy/1x/KwV3/Qzv5qf7/s/wDpGX+uP5WCu/6Gd/NT/f8AZ/8ASMv9 cfysFd/0M7+an+/7P/pGX+uP5WCu/wChnfzU/wB/2f8A0jL/AFx/KwV3/Qzv5qf7/s/+kZf64/lY K7/oZ381P9/2f/SMv9cfysFd/wBDO/mp/v8As/8ApGX+uP5WCu/6Gd/NT/f9n/0jL/XH8rBXf9DO /mp/v+z/AOkZf64/lYK7/oZ381P9/wBn/wBIy/1x/KwV6T+Qv5xedPOvnC80vXJYHtIdPkukEMIj b1EnhjG4PTjIco1GGMY2EPecw1fFf/ORH/k4vMH/AEZ/9QMGbTTfQEvOMvV2Ksk/L3ztqHkzzVZ6 5ZkskTcLy3BoJrdiPUjPbcbr4MAchkgJClfduk6pY6tplrqdhKJrK9iSe3lHdHHIfI+IzUEUaKEV gV2KvPfzJ1kvPFpUTfBFSW4p3cj4F+hd/pzkPaPWXIYR03Pv6PS9iaagch67BhGcu79XsbOa9vIb SEVlmcIv0nr9GW4MJyTEI85Fry5BCJkeQZ9+Yfmm1/L78vLq/t+Pr28a22mxt+3cybISO9N5GHcA 56jotLGIjjj9IeDzZTkmZHmXw5PPNPNJPM5kmlYvLIxqzMxqzEnqSc3jBTxV2KuxV+gPkj/lC9A/ 7Ztp/wAmEzT5PqPvQwr/AJyS/wDJSap/xmtf+ohMt031hXxnmzSioNL1C4sbq/gt3ls7Ixi7mUVW L1iRGXp0DFSK9K/MYLHJULhV2KuxV2KuxV2KuxV2KuxVGadpOpakbkWNu0/1SCS7uitKRwQiryMT QAD8TsN8BICoPCr2v/nE3/yYuo/9seb/AKirbMXV/T8VfWGa5D4r/wCciP8AycXmD/oz/wCoGDNp pvoCXnGXq7FXYq+l/wDnFXz6Z7S78mXstZLbld6VyPWJj++iH+qxDge7eGYOrx/xIfQmYSqV1cxW ttLcymkcKNI59lFTleXIIRMjyAtnjgZyERzLxK+vJby8mu5jWSdy7e1T0+jPMc+Y5JmZ5yNve4sY hERHIKGVNjNPy10oS3k+pSLVbcenCT/O4+Ij5L+vOm9nNLxTOU/w7D3n9n3uh7c1FRGMddz7vx9z xn/nKfzkdR812vlq3etro0YkuQDsbm4UNv8A6kfGnzOeg6SFC+95p4fmWrsVdirsVfoD5I/5QvQP +2baf8mEzT5PqPvQwr/nJL/yUmqf8ZrX/qITLdN9YV8Z5s0vff8AnFLT7LUZPNtjfQJc2dzbW0c8 EgDI6M0oIIOYerNUrB/zl/KW98h616luHn8u3rE6fdncodz6Epp9tR0/mG/iBdhzcY81edZcrsVd irsVdirsVdiqP0PRNU1zVrbSdLga5v7xxHBCvcnuSdgANyT0GCUgBZV9VyfllpfkL8kvMtnDxn1S 502d9TvqbySCM0Va9I0rRR9PU5rvFM8g96HyLmyS9r/5xN/8mLqP/bHm/wCoq2zF1f0/FX1hmuQ+ K/8AnIj/AMnF5g/6M/8AqBgzaab6Al5xl6uxV2Kp15M8zXXlfzTpmvWtTJYTrI6DbnEfhlj/ANnG zL9ORnHiBCvvuyvLa9s4L21cS211Gk0Eg6MkihlYfMHNORSGO/mJqBttC+rqaPeOE9+C/E36gPpz Q+0Go4MHCOczXw5u37Gw8Wbi/mh5dnCvWuxV675WtBpnliAmNmcxm5kRBV2LjlQDu3Ggz0XsjT+F p4jqdz8Xie0s3iZ5HoNvk+Rdf/K/83tb1y/1i78t3huNQuJLmXZaAyMWoPi6CtBnTxywAq3CQH/K lvzU/wCpavP+BX/mrD48O9Xf8qW/NT/qWrz/AIFf+asfHh3q7/lS35qf9S1ef8Cv/NWPjw71d/yp b81P+pavP+BX/mrHx4d6vtDyla3Fp5V0a1uUMVxb2NtFNG3VXSFVZT8iM1czZKGC/wDOSX/kpNU/ 4zWv/UQmXab6wr4zzZpfQv8AziF/x0fM3/GG0/4lLmFrOQV9B+ZfLekeZNEutG1eAT2V0vF1/aU/ suh34up3U5hxkYmwh8SfmV+XWseRPMUml3wMtpJWTTr4CiTxeI8HWtHXsfYgna4sgmLSxLLFdirs VdirsVVba2uLq4itraNprid1jhhQFmd2NFVQNyScSVfY35Ifk/b+R9J+v6iiyeZr5B9akHxCCM0I t0IJHUVdh1PsBmsz5uM0OSGSfmz/AOSz8z/9s25/5NnK8P1j3q+EM26Xtf8Azib/AOTF1H/tjzf9 RVtmLq/p+KvrDNch8p/nd+WHn/W/zQ1rU9K0O5vLC4+rejcRhSrcLSFGpUjoykZscGWIgASlg3/K lvzU/wCpavP+BX/mrLfHh3q7/lS35qf9S1ef8Cv/ADVj48O9Xf8AKlvzU/6lq8/4Ff8AmrHx4d6u /wCVLfmp/wBS1ef8Cv8AzVj48O9X1L+Ry+Y7XyDZ6R5jtJbLUtLZrdYptna3ryhfYnYAlB/q5r89 cVhCF/Mu89XV4LUGq28VSPBpDU/8KFzhPaTNxZhD+bH7/wAB6nsPFWIy/nH7mIZzru0TptobzULa 1H+75UjPsGYAn7sv02LxMkYfziA1Z8nBAy7g9qmUUhiCngXAqu3EIC4+iq0z1ACngCVbFXYq7FXY q7FXYq8w/wCckv8AyUmqf8ZrX/qITMjTfWFfGebNL6F/5xC/46Pmb/jDaf8AEpcwtZyCvpbMFDGv zB8h6N528uzaPqS8WNXs7sCrwTAUWRelfBl7jbLMeQwNhXxH5v8AKWs+U9fudE1eL07q3PwuN0lj P2JYz3Vh0+475tYTEhYSkuSV2KuxV2Kvp3/nGX8sNMh0iDz3fcbi/uzKmlx02t445Ggkff8A3Y5R h7L8zmBqspvhQ9+zDVif5s/+Sz8z/wDbNuf+TZyzD9Y96vhDNul7X/zib/5MXUf+2PN/1FW2Yur+ n4q+sM1yHYq7FXYq7FXYqoSHheQtUBZQ0RFN2YDmm/gqq/34VeSebbn6x5kv3rXjKY/+RYCf8a55 x2rk49TM+dfLZ7fs6HDggPK/nulGa5zWQ+QrYTeZrckVWFXkI+SkD8WGbjsLHxaqPlZ+x1na8+HT nzoK/wCc35vyfl7e6P6GnrqMt9Hc843lMQRUaLidletTXPR8GHjt4551/wBDe6j/ANSzD/0lt/1S y78mO9Lv+hvdR/6lmH/pLb/qlj+THerv+hvdR/6lmH/pLb/qlj+THerv+hvdR/6lmH/pLb/qlj+T Herv+hvNS/6lmH/pLb/qlh/JjvV3/Q3mpf8AUsw/9Jbf9UsfyY71Y1+Yv/OQ97508qXPl+XQ47JL l4nNwtw0hHpSB6cTGvXjTrk8em4Tdq8gpmSr6E/5xD/46Pmb/jDaf8SlzD1nIK+lswEOxVgn5ufl Zp3n3QDD8MGtWYZ9MvSOjHcxPTrG9N/Dr7G7DlMD5K+K9X0jUdI1O50zUoGtr60cxXED9VZflsR4 EbHNoCCLCUJTCrqYq9N0f8n7pfys1rz1rSvAqQRnRLU1Vn5zIhuJB/Jxb4B+116UrRLN6xEK+h/+ cd//ACTvl/8A6PP+o6fMLU/WUPRsoVif5s/+Sz8z/wDbNuf+TZyzD9Y96vhGmbdLMvys/MafyB5h uNZhsV1Bri0ezMLyGIAPJHJy5BX/AN9UpTvleXFxilepf9Deal/1LMP/AElt/wBUsx/yY71d/wBD eal/1LMP/SW3/VLH8mO9Xf8AQ3mo/wDUsw/9Jbf9UsfyY71d/wBDe6j/ANSzD/0lt/1Swfkx3q7/ AKG91H/qWYf+ktv+qWP5Md6u/wChvdR/6lmH/pLb/qlj+THeqa+U/wDnJ258w+adI0a40KKzS/u4 rcXK3BkKNK3AUUxqDXlx698jPS8IJtCPv5TLfXEp6ySux+lic8izy4skj3kvoGGNQA7gFDKWxmP5 ZRA6tdS/yQcR/snU/wDGudJ7NR/fSPdH9IdH27L93Ef0v0PGf+csb31fPum2gNVt9MRiN9nknlr/ AMKq56JpB6T73mHiWZSuxV2Kt4quphV1MVdTFXUxV9Cf84iD/cj5m/4w2n/EpcwtbyCvpTMBDsVd iryn88/yci86ab+ltJjVPM1klIuii6iXf0XJoAw/Yb6DtuMnT5+E0eSvkCaCWGV4ZkaOaNikkbgq yspoVYHcEHNml6/+Q35Mt5rvk8wa3CR5ctH/AHUTCn1yVD9gVG8SkfGe/wBnxpi6jPw7Dmr3f89I 0j/KLzBHGoREghVEUUAAnjAAAzD0/wBYQof848f+Se8v/wDR3/1Gz4dT/eFXo2UKxT82P/JZ+Z/+ 2bcf8mzlmH6x71fCVM3CXUxV1MVdTFWmGJVbgV2KuxVMvLV41l5j0q8WvK2vLeYU61jlVtunhgkL BV9IZ4c+huxVnP5XA+vqJ7cYt/pbOp9mPqn8P0vP9vcofH9Ceaj5H8oa9qV1ea1o9pqN1GywpNcQ pI6xiNGCAkVpyYn6c7IZJAbF5tD/APKpvyz/AOpY03/pGj/pj40+8q7/AJVN+Wf/AFLGm/8ASNH/ AEx8afeVd/yqb8s/+pY03/pGj/pj40+8q7/lU35Z/wDUsab/ANI0f9MfGn3lW/8AlU/5af8AUsad /wBI8f8ATD40+8q7/lU/5af9Sxp3/SPH/THxp95V57+fPkDyTo/5aahf6VodlZXsctuEuIIURwGm VWAYCu4NMv02SRmASr5XpmyS+gv+cRh/uR8y/wDGG0/4lLmDreQV9J5r0PKPzx/MLV/I2oeVtUsf 3ts8t1Hf2RNEnh4xfCTvRl6q3Y+1QcnT4hMEFXonlrzJpHmXRbbWdImE9ldLyRujKw2ZHX9llOxG UTgYmiqZ5FXzx/zk5+WulRWQ87WFLa8aWODUoAKLMXqFmFOjilG/mG/Ub52kym+Eq9T/ACYAH5W+ W6f8si/8SbMfP9ZVD/nt/wCSm8xf8YYv+oiPHT/WFQ3/ADj1/wCSf0D/AKO/+o2fDqv7wq9FyhWK fmv/AOS08zf9s64/5NnLcP1j3q+FaZuUvWP+cbPLuh6755vrTWbGDULWPTJZUhuEEiCQXEChgG70 Yj6cxdXIxjt3q+kv+VT/AJaf9Sxp3/SPH/TMDxp95Q7/AJVP+Wn/AFLGnf8ASPH/AEx8afeVd/yq f8sz/wBMxpv/AEjx/wBMHjT7yrX/ACqb8s/+pY03/pGj/pj40+8q7/lU35Z/9Sxpv/SNH/THxp95 V3/Kpvyz/wCpY03/AKRo/wCmPjT7yrh+U35Zg1HljTa/8w8f9MfGn3lXmWeSvobsCWc/lcf3+oCv VYjT5Fs6n2ZPqn7h+l5/t7lD4/oTHXPzL8jeV9WuNP17VY7G8lKXEcLpKxMTRqgaqIw+0jDOzjil IWA82gP+V8flJ/1MUP8AyKuP+qeH8vPuV3/K+Pyk/wCpih/5FXH/AFTx/Lz7ld/yvj8pP+pih/5F XH/VPH8vPuVsfnx+UpNP8RQ/8irj/qnj+Xn3Ku/5Xp+U/wD1MMP/ACKn/wCqeH8tk7ld/wAr0/Kf /qYYf+RU/wD1Tx/LZO5WBfnf+afkDzB+XV/pej6xHd38slu0cCpKpISZWbd0UbAeOX6fBOM7IV8y 0zYpfQP/ADiQP9yPmX/jDa/8SlzB13IK+kc1yHz/AP8AOW4/3HeWv+M11/xGLM/Q8yry/wDJ381r 7yJrXCctP5fvWA1C0G5Q7ATxD+dR1H7Q28CMnPgEx5pfZOn39lqNlBfWMyXFncoJIJ4zyV0YVBBz UEEGih5j/wA5Mf8Akrp/+Yu2/wCJHMnR/WrIvyZ/8ld5b/5hF/4k2V6j6yqG/PX/AMlP5h/4wxf9 REeHTf3gVD/849/+Sg0D/o7/AOo2fDqv7w/jor0TMdWK/mt/5LXzN/2zrj/k2ctwfWPer4Xpm6S9 Q/5x481+XvLHnW9v9dvFsbSXTZYI5XV2BkaeBwtEDH7KMcxtVjMo0O9X0P8A8r0/Kf8A6mGH/kVP /wBU8wPy2TuQ7/len5T/APUww/8AIqf/AKp4/lsncq0/nt+Uw6+YoR/zyuP+qeD8vPuVr/lfH5Sf 9TFD/wAirj/qnj+Xn3K7/lfH5Sf9TFD/AMirj/qnj+Xn3K7/AJXx+Un/AFMUP/Iq4/6p4/l59ytj 8+PylJoPMUNf+MVx/wBU8fy8+5WF6hEYb+5iPWOV0P8AsWIzyjUR4ckh3Evf4ZcUAe8BD5S2sx/L KUDV7qL+eDkP9i6j/jbOj9mp1mkO+P6Q6Pt2P7qJ/pfoeNf85ZWXp+fNMuwKLcaaiE+LRTy1/wCF dc9F0h9J97zDxHMpXYq7FWwaEHCqLpliupirqYq6mKvf/wDnEof7kPMv/GG1/wCJS5ga7kFL6QzX IeAf85aj/cd5a/4zXX/EYsz9DzKQ+b6ZsVevfkT+cL+Vb1NA1qYny5dv+6lY1+qSuftip2iYn4x2 +141xNTp+IWOavW/+ck3ST8rJXRg6PdWzKymoILEggjMTR/3iGR/k1/5K/y5/wAwi/8AEjleo+sq h/zz/wDJUeYf+MMX/J+PDpv7wKhv+cfP/JQ6B/0d/wDUbPh1X94fx0V6JmOrFfzV/wDJbeZv+2dc f8mzluD6x71fDVM3aXUxV1MVdTFVCf7QHtkJKpZFXYq7FUz8s2bX3mTSbJQS11eW8IA61klVffxy MjQKvqfzdbfV/Ml+lPtSeoP+egD/APG2eQdrY+DUzHnfz3e17OnxYInyr5bJPmuc5kHkS59DzNbA mizB42+lSR/wwGbfsPJw6qPnY+x1va0OLTy8qKO/OD8no/zEutJI1M6XJp6XHKX0PrAkWQxUWnqw 8ePE56PhzcF7PGvPf+hP/wDv7f8AuX/9nWX/AJzyV3/Qn/8A39v/AHL/APs6x/OeSu/6E/8A+/t/ 7l//AGdY/nPJXf8AQn//AH9v/cv/AOzrH855KrD/AJxHoAP8V/8Acv8A+znJfn/6P2ptv/oUj/v6 /wDuX/8AZzh/P/0ft/YtsZ/MX/nHv/BvlS51/wDT/wBf+rvEn1b6p6PL1ZAlefryUpyr9nLMOr45 VSvH6Zmq9+/5xMH+5DzJ/wAYbX/iUua/X8gpfR2a1DwH/nLMf7j/AC3/AMZrr/iMWbDQcykPnGmb JXUxVm7fmbqV3+Ws3krU+VwkM0Mul3RNWjjjYloXJO6gH4PDp0pSjwAJ8QV9R/k5/wCSw8uf8wi/ 8SOarUf3hQh/zy/8lT5h/wCMMX/J+PDpf7wKhv8AnH7/AMlFoP8A0d/9Rs2HV/3h/HRXoeY6sV/N X/yW3mX/ALZ1x/ybOW4PrHvV8O0zepZl+Vf5c/498w3Gj/pD9G+haPd+v6Pr14Sxx8OPOKlfVrWv bKM+XwxdWr1T/oUj/v6/+5f/ANnOYv5/+j9v7Ft3/QpH/f1/9y//ALOcfz/9H7f2Lak//OIPJi3+ LaV/7V//AGc5A62+n2qt/wChP/8Av7f+5f8A9nWP5zyQ7/oT/wD7+3/uX/8AZ1j+c8ld/wBCf/8A f2/9y/8A7OsfznkqbeU/+cXE8v8AmbS9bfzEL4abcxXItTZelzMTBl+P15ONCK/ZORnqrBFKy/8A MyzMeq292B8NxFxJ/wAqM7/gwzz/ANpMNZYz/nD7nqOw8t4zHuP3sOznHeIjT7o2l/b3Q6wSJJ/w LA5dp8vh5Iz/AJpBas2PjgY94e2s6ssciseFQRx35BhxH0fFXPUAQRYeBIpUwodirsVdirsVdirz X/nIn/yVWp/8ZbX/AJPpmVo/7wK+P6ZuUvff+cThTUPMn/GK1/4lLmv7Q5BS+jc1iHgf/OWIrp/l v/jNdf8AEYs2Gg5lIfONM2aupirqYq+2fyd/8lh5c/5hF/4kc0ep/vChDfnj/wCSq8wf8YYv+T8e HS/3gVD/APOP/wD5KPQf+jv/AKjZsOr/ALw/jor0LMZWLfmp/wCS38y/9s64/wCTZy3B9Y96vh6m b5L2T/nFgf8AIQdQ/wC2TN/1E2+YWv8AoHvUvqbNSh2KuxV2KuxV2KrWFZEqKhasG8DSn6icVY3+ YWn/AFrQTOorJaOJNuvE/C366/Rmj7f0/Hp+Ic4G/wBBdt2Pm4M1dJbPLM4R652KvWvKd2NU8rxR s7q6o1rK6MVdSo4gqw3DcSDXPROxtR4mniesdvl+yniu08Ph55dx3+b438xeb/zP0PXtQ0a6806x 9Y0+4kt5D9fuqExsV5D950alRnUxhAi6Dgpf/wArK/MX/qatY/6T7r/qpkvCj3BXf8rK/MX/AKmr WP8ApPuv+qmPhR7grv8AlZX5i/8AU1ax/wBJ91/1Ux8KPcFbT8y/zEVgT5p1cgdQb+5/6qYRjh3B X3B5RnluPKmizzSNLNNYW0kkrkszM0KkszHckncnNTk+o+9DC/8AnIj/AMlVqX/GW1/5Ppl+i/vA r5Cpm6S98/5xQH+5DzH/AMYrX/iUua7tDkFL6LzWIeCf85Xj/cf5c/4y3X/EYs2PZ/MpD5zpmzV1 MVdTFX2t+T3/AJLHy7/zCL/xI5otT/eFCH/PD/yVfmD/AIxRf8n48Ol/vAqH/IH/AMlJoP8A0d/9 Rs2HWf3p/HRXoOYysW/NP/yXHmT/ALZ1x/ybOXaf+8HvV8Q0zfJex/8AOLQ/5CBqH/bJm/6ibfML X/QPf+tS+pM1CHyR+fPnnzlpv5p6zYaZr2o2NnD9V9O2trueKNedpCx4ojqoqWJPvmzwQiYDYJef /wDKyvzF/wCpq1j/AKT7r/qplvhR7grv+VlfmL/1NWsf9J91/wBVMfCj3BXf8rK/MX/qatY/6T7r /qpj4Ue4K7/lZX5i/wDU1ax/0n3X/VTHwo9wV9Z/kLba+v5dWWoa9f3WoahqrveCS8mknkSBqLCi tIWPEovMD/KzXagjiodEPQLiCK4t5IJRyilVkceKsKHMXJATiYnkRTKEzGQI5h4nqNjLY309nL/e QOUJ8adD9I3zzHUYTiyGB5xL3uHKMkBIdUNlLazL8ttVEOoTae5+C6XnF/xkQbj6V/VnSezmq4ch xn+Ll7x+z7nR9t6figJj+H7i8e/5yp8mtYeZ7TzRbp/ourxiG6YdrqBQoJ/14gtP9U56HpJ2K7nm HhmZauxV2KuxV+gPkj/lC9A/7Ztp/wAmEzT5PqPvQxD/AJyH/wDJV6l/xltv+T6ZkaL+8CvkSmbt L1D8jfzH8veSLrV5dZW4Zb6OBYfq6K5rGXLcuTJT7QzD1eCWQClet/8AQzP5c/761D/kQn/VXML8 hk8kU8v/ADy/NHy153tNIi0ZblWsZJmm+sRqgpIEC8eLPX7JzM0mnljJtLySmZqupirqYq+i/IH5 +eRtA8maTo99Hem7soBFMY4UZOQJPwkyDx8M1ebRzlMkUql+ZP58eSPMfkjVdF0+O9F5eRosJliR UqsqOakSN2XwxwaOcZgmlUfyt/PPyV5X8iaZoWpJeNe2fr+qYYkZP3txJKtCXU/ZcdsOo0k5zJFK yv8A6GZ/Ln/fWof8iE/6q5T+QyeSKSTzt/zkD5E1ryjrGk2cd8Lq+tJYITJCipzdSByIkNB9GWYt FOMgTWyXzfTNqr2L/nFwf8hA1D/tkzf9RNvmB2h9A9/61L6izUIfFf8AzkR/5OLzB/0Z/wDUDBm0 030BLzjL1dirsVT3yR5XufNPmzTNBt6hr6dUlcCpSIfFLJ/sI1ZsjknwxJV982dpb2dpBaWyCK2t 41ihjXYKiAKqj5AZpybQq4FYB+ZWjFZYdWiX4XpFc0/mH2GPzG33ZyXtHo6IzDrsf0fqej7E1Oxx n3j9LBc5V6FWtLqa0uormE0lhcOh91NcsxZTjmJR5g215MYnExPIvQPPflm0/MP8vLmwiKrNdRCe wkY7R3UW6Anw5VRvYnPUNDqxOMckeReEz4TjmYno+HLm2ntbmW2uIzFcQO0c0TCjK6HiykeIIzfA talirsVdir9AfJH/AChegf8AbNtP+TCZp8n1H3oYx+fNje335aahbWVvLdXDS25WGFGkcgTKTRVB Owy/RkDILV8r/wCDPN//AFY9Q/6RZ/8AmjNz4sO8Jd/gzzf/ANWPUP8ApFn/AOaMfFh3hXf4M83/ APVj1D/pFn/5ox8WHeFd/gzzf/1Y9Q/6RZ/+aMfFh3hXf4M83/8AVj1D/pFn/wCaMfFh3hXf4M83 /wDVj1D/AKRZ/wDmjHxYd4V3+DPN/wD1Y9Q/6RZ/+aMfFh3hXf4M83/9WPUP+kWf/mjHxYd4V3+D PN//AFY9Q/6RZ/8AmjHxYd4V3+DPN/8A1Y9Q/wCkWf8A5ox8WHeFd/gzzf8A9WPUP+kWf/mjHxYd 4V3+DPN//Vj1D/pFn/5ox8WHeFd/gzzf/wBWPUP+kWf/AJox8WHeFer/APONnl/XtO8830+oabdW cLaZKiy3EMkSljcQEKGdQK0B2zC184mAo9VL6SzUofFf/ORH/k4vMH/Rn/1AwZtNN9AS84y9XYq7 FX03/wA4reQWtdPu/Od7HSW9DWmmBhuIUb97KP8AXdeI/wBU+OYGryb8KH0BmGrsVQ+oWMF/ZTWc 4rFMpVvEeBHuDvlOowRywMJcpNuHKccxIcw8Y1PT7jTr6aznFJIWoT2I6hh7Eb55rqdPLDkMJcw9 zgzRywEo8ihcobmafl1rwguW0qdqRXB5W5PQSU3X/ZD8fnnTez2u4JeDLlLl7/2/jm6LtrScUfEH Mc/d+x5H/wA5O/lo2n6ovnPTYf8AQdQYR6qqDaO56LKadpRsT/N7tnoOly2OEvMvBcy1dirsVfoD 5I/5QvQP+2baf8mEzT5PqPvQnWQV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kviv/nIj/wAn F5g/6M/+oGDNppvoCXnGXq7FWUflx5Gv/Ovmu00S1qkLn1L65Ar6NshHqPv33ovixGV5cgiLV91a ZptlpmnW2nWMQgs7OJIbeJeipGAqj7hmpJs2hE4FdirsVYr578tnUbP69bJW8tl+JR1ePqR816jN D252d40PEiPXH7R+x3HZOt8KXBL6ZfYXmGcM9YuR3R1dCVdSCrDYgjcEYQSDYQQCKL0/TbjS/Ofl e50vVYlmWaI2+oQHaoYbOvhXqCOjD2z0TsjtHx8YP8cef6/i8X2hozgybfSeX6nxv+Zf5fan5G8z z6Rd1ktWrJp15SizQE/C3+sOjjsfamdTiyCYtwWKZYrsVfSOgf8AOVHl/TNC03TZNDu5HsbWG2eR ZYwGMUaoSK+PHMGWkJN2hH/9Dc+XP+rBef8AI2LB+TPerv8Aobny5/1YLz/kbFj+TPerh/zlz5br voF5T/jLFj+TPeqKi/5yr8tyiqaLdHxHqx1+7LY9nk8pBNL/APoaTQP+rHdf8jY8P8my7wtO/wCh pNA/6sd1/wAjY8f5Nl3had/0NJoH/Vjuv+RseP8AJsu8LTv+hpNA/wCrHdf8jY8f5Nl3had/0NJo H/Vjuv8AkbHj/Jsu8LTv+hpNA/6sd1/yNjx/k2XeFp3/AENJoH/Vjuv+RseP8my7wtOb/nKby+oq 2iXQA6kyx4ns2XeFpCSf85b+WlNF0K8f3EkYGVHRnvQt/wChufLn/VgvP+RsWD8me9Xf9Dc+XP8A qwXn/I2LH8me9Xf9Dc+XP+rBef8AI2LH8me9Xg/5m+brbzf531LzFbW72sN96HCCQhmX0beOE1K7 bmOuZeKHDEBLF8sVVtba4urmK1to2muJ3WOGJAWZ3Y0VVA6kk4kq+1PyV/LCHyL5YCXKq2vagFl1 OYUPEj7ECn+WOv0tU+GarPl4z5IehZSrsVdirsVdirzfz15UNpK+qWSf6JIa3EY/3W5P2h/ksfuO cZ252X4ZOWA9B5+R/UXqOye0OMeHP6hy8/2sOzm3eI7RtXutJv47y3O67SIejoeqnMvR6uenyCcf 7Q4+p00c0DGTM/O3k7y9+Z3k/wCruwjnFZLC8oDJbXFNww8D0de4+g56RoNdHJEZIcj+KeJ1GCWK ZjLm+MfM/ljWfLGt3OjaxAYL22NGHVXU/ZdG/aVhuDm9hISFhqSrJK7FXYq7FXYq2CVNQaEdCMKo qLUrhNmo49+v35YMpColNVhP21Kn23GWDMFVlv7Rv92U+YIyYyRVeLq2P+7V+/Dxx70rTe2g6yD6 Kn9WDxI96FN9Ttl+zVvkKfryJzRVDSarIdo0C+53OQOY9FQkk0shq7FvnlJkTzVZgV2KuxV2KuxV sAk0HXFX1N/zj7+Sp0OKLzb5igprEyV02ykFDaxsCDI4P+7XU7D9ke521+oz36RyQ90zEV2KuxV2 KuxV2KtSRpIjRyKHRwVZWFQQdiCDglEEUeSQSDYeX+b/AChNpcrXdopfTnNdtzESfst/k+B/zPDd rdkHAeOG+M/7H9j1vZ3aQyjhl9f3sXzRO2Tfy55ju9Fu/Uj+O3egngJ2YeI8GHY5sez+0J6adjeJ 5j8dXC1uijnjR+roWRfmB+XXlf8AM7y9HMHEOoxI36P1JR8cTdfSlX9pK9V7dRnoui10ZxE4G4n8 fN43NhlikYyG74982eUdf8qaxLpGt2xtrqPdT1jkQ9JIn6Mp8foO+bqExIWGtJskrsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdiq5EeR1jjUu7kKiKKkk7AADFX07+R35Afop7fzP5thDakKSaf pTiotz1WWYd5O6r+z1PxfZwM+ovaKHvmYauxV2KuxV2KuxV2KuxVqSNJEaORQ6OCrKwqCDsQQcEo gijySCQbDzrzV5EltS97pamS23aS2G7p/q/zL+Izju1OwzC54hce7qPd5PTdn9rCdQybS7+9hmc0 71NNB8w32jXXq255QtT1rdj8Lj+B8Dmfoe0MmmnceXUd7h6vRwzxqXPoWZa95e8l/mZ5fNpqEQdk 3jkWi3VrIw+0jb9af6rd87/s/tKGaPFjPvDyGq0k8Mql8+98q/mZ+TXmnyLcNNOhvtEdqQarCp4b nZZl3MT/AD2PYnN9izCfvcdgOXK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqm3lrytr/mbVY9L 0Sze8vJN+KCiovd5HNFRR4scjKYiLKvrD8pPyG0XyWseqamU1LzKRUT0rDbV6iBWH2uxkO/hx3rr s2oMthyQ9VzHV2KuxV2KuxV2KuxV2KuxV2KuxVi/mPyNZakXubOlrempJp+7c/5QHQ+4zR9o9iQz XKHpn9h9/wCt22i7Vni9MvVD7Q851LSdQ02cwXsLRP8Ask7qw8VYbHOM1OlyYZcMxRenwaiGUXA2 p2V9d2NwtzaStDMnR1/UR0I9jkcOeeKXFA1JnlxRyR4ZCw9A0Xzvpeq27afrUccbTKY5BIA1vKrb EMGqBXuG2zsez+34ZKjk9E+/of1PM6zsicPVj9Uft/a84/MX/nF/SNS9XUvJsyabdvV202Uk2jk7 /unHJovluvhxGdXi1Z67umfO3mfyd5m8r331LXtOmsZjXgZBWOQDqY5Fqjj3UnM6MxLkqTZJXYq7 FXYq7FXYq7FXYq7FXYq7FVW2tbm6uI7e1hee4lPGKGJS7sx7Kq1JOJKvavy9/wCcYvMermO+81SH RtPNCLNaNeSD3G6xV/yqt/k5i5NUBy3V9KeVvKHlzyrpi6boVlHZ2w3cru8jfzSOas7fM5gTmZGy hOMirsVdirsVdirsVdirsVdirsVdirsVdiqjd2VpeQGC6iWaJuqOKj5jwOVZcMMkeGYBDZjyygbi aLCtZ/LVTyl0mbj3+rTHb5K/9fvzmtZ7OdcJ+B/X+v5u903bfTIPiP1MN1DSNS06The27wnoGYfC fkw+E/Qc5vUaTLhNTiR+O93mHUY8ouBBR+iebtX0kqkcnrWo628m60/yT1X6MytF2tm0+wNx7j+N nH1XZ2LNuRUu8Mxj8y+UfMlm2n6xbxGOXZ7S9RZImPTZmHHv3oc6zR9u4cnM8EvP9f8AY87qeycu PceoeX6mAebf+cWvJuqc7ny7dy6NcP8AEsP+9Fqa77KxEi19np7Z0WPVnru614/5k/5x0/M/RS7w 2KavbKdpbBxI1O37p+EtfkpzKjqYHyV51qOlanps5t9Rs57K4HWG4jeJ/wDgXCnLgQeSoXCrsVdi rsVdiq5EeR1RFLuxoqqKkk9gBirMvL35OfmVr/BrHQblIH3FxdAW0dP5g0xTkP8AVrlUs0B1V615 U/5xLoyTeatYBAoWstOHXvvPKPvAj+nMees7gh7Z5T/L/wAneU4fT0HS4bRyOMlzTnO4/wAuZ+Tk e1aZiTySlzKshyCuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KrZI45UKSIHRvtKwBB+YOR lESFEWExkQbCQah5D8vXdWSFrWQ/tQHiP+BNV+4ZqdR2FpsnIcJ8v1cnZYe1s8OZ4h5sdvPyxvFq bO8jkHZZVKH7155p83s1MfRMH37frdli7difriR7t/1Ia20Xz7ox/wBDEnpj9mN0kQ/88yT+rKce j7Q0/wBF15EEfL9jbPVaPP8AVV+YIPzTi185eY7cBdT0WZgOssaOmw70IYH782GLtjUw2y4pe8Ah wsnZuCX93kHxITE+aPLWow/V9QgZUfrBeW5ZT232dfvzY4u2cJ58UD5g/ocKfZmWPKpe4pVc/lZ+ Uet8m/QOnSE7sbVRA2/c+gYzm1w63j+iV/Fw54pw+oEJNc/841/lNMax6dPbCtaRXU5+j940mZA1 U2tAv/zi1+WLOWD6igPRVuEoPvjJw/m5qiIP+cZPyqjK87a7m4ihD3Liu3U8OH4YPzU1TrT/AMiP ymsSDF5ehkYd7iSaep27Su69vDInUTPVWWaV5c8vaQKaVplpp4pT/RYI4dv9gq5WZE8yqY5FXYq7 FXYq7FXYq7FXYq7FXYq7FX//2Q== - - - - - - 1 - False - False - - 119.000000 - 118.999512 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Standard-Farbfeldgruppe - 0 - - - - - - Document - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/Shading<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 119.0 119.0]/Type/Page>> endobj 8 0 obj <>stream -H‰tVÉn9 ¼ë+ôM“¢Ökœ`NÁ ÈarHâÃK'ÿLQK/^l¸›¥nq)Õ~ø÷Ñ?|~dÿáã£wώ½Hë›]þ|wÿùߎIŠz\Õ®ŠëŸŸî៯ìþuÏ^<ãW°-’0‹Obö·_ÎÖíº…B,Š»Pãä·X©É¸…²àÍm%Q‹uÞ -Õ¤Çö‰Ù^vüÚyu¼ûq浉»§î ~Ÿ -e”fɧ†´'Ž WÍÇL9ù€(\}N`$.tsW|wU)·²p«T$.GÍ07wÅ÷…K¡ÖütÔùÊ -;Ñvâ»9N8Ó~®µÝzWŸ÷nLl?È.´0$M'óôÜB†š$Ïê«X«?|ó_ŸØÿ}òŸ¾ùÁè{jj¹Áeª&)©ïˆI)*K9¥„¨5¨—FÚÐÐBM”CöIˆ^v1v»@JZĐ0Z¨h]èæ ×ÒÂ[%ÓS¥èBëÖÖדï[¢ßúž¸<.ˆÐPç̅¹´žèxÈ©X£Š­—azÜzyé¤L1.Œ¢ƒš(  ȁ‚V=رÝÜÌϽےtÇîWaªí@jìã1±’ån(!Ùl¾E˘§uwO=½#«fL«‰©ævÿ±¡çÔ­MÌeîR5ú^¯Œ×A=¿Q,@Ùi@™PJ/0ã(™ªÕ“ې‡E¯ý4X®ÆÂÉw0Uæ#Ó7q櫽Iwl¢‘•PN²RjxiЙ]µ¼¤v5¼&8ÐSᛔkçvšRH’°P,Œ^’†NvƘ²iƒfŠ+(‡ö&8Úí½ ÷µÀÓÄË'sŠÂ*‡t^¢ÓNâî· $§ ÆJ6ñη€iŠºW`XÂYbçp/÷%‰öub®õ±áº Omsƒž„]óy̬6çe˜s”èS6^îãwýÐØ¡Q“× -×bgB-uÝæ¹Oý냱Äq²1 rTq•QððB➴W˜úÖ̖@§:¾9šâefÕº“ÑÍê§` -:`Ù/½&œ1¼‘"ܕØÏÃìIÚSœˆÇPiÉÆMÚ("Jí÷é3þaùâþ`I§°™ -endstream endobj 12 0 obj <>stream -8;UT3d1$(!#XdW+I*n)TEYph=lWDIX;+X<'.?nF.`PGr7D'0;'C-cJa))@!lGl10> -SVI*;>8s'Sl1D@Ghoas$iEm@/.&inSS-&a*08^n~> -endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 11 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 5 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (Eclipse_with_icon_3.ai) -%%CreationDate: 6/22/2019 4:28 AM -%%Canvassize: 16383 -%%BoundingBox: 404 366 514 469 -%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%%DocumentFiles:K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 399.6704 358.1719 518.6704 477.1714 -%AI3_TemplateBox: 639.5 400.5 639.5 400.5 -%AI3_TileBox: 43.1904 129.791 843.8301 705.7915 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI9_OpenToView: 60.5 670.5 2 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 22 0 obj <>stream -%%BoundingBox: 404 366 514 469 -%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 -%AI7_Thumbnail: 128 120 8 -%%BeginData: 22177 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FD31FFCFCFC9C9C2FD04C1C8C8CFCAFD6EFFCACFC8C89FC1BAC098 -%C1C1C9C9FD70FFCAC9C2C1C0C1C0C0BAC1C2C9CAFD0BFFA8A87EA87D7E7D -%A87DA8A8A9A8FD58FFCAC9C1C198C09EC198C0C1C9CAFD07FFA8A8535328 -%2821280028002100220021002821282853537E7EFD51FFCFC2C1C0C1C0C1 -%C0C1C0C8CAFD07FF7D772828212800282828212828282128282821282828 -%21282128002828537DA9FD4BFFC9C2BAC098C1C0C198C1C2CFFD05FFA977 -%4C0028002800282128002821280028212800282128002821280028212800 -%280021002853A8A9FD45FFC9C1C0C0C1C1C1C0C1C0C8CAFD05FF7D532128 -%212821282828212828282128282821282828212828282128282821282828 -%212828280028214C53FD42FFC9C198C19EC198C198C09FCFFD04FFA87721 -%220028002821280028212800282128002821280028212800282128002821 -%2800282128002821280028002100537EFD3EFFC2C1C0C1C1C1C0C1C0C1C9 -%FD05FF532800282828272828282728282827282828272828282728282827 -%28282827282828272828282728282827282828272821284CA8FD3AFFC998 -%C0C0C19EC1C0C098C8CFFFFFFFA853002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%2821280028212200537EFD36FFCAC8C0C1C0C1C1C1C0C1C1CFFD04FF7728 -%002821282828212828282128282821282828212828282128282821282828 -%212828282128282821282828212828282128282821282828002853FD34FF -%C9C098C19EC198C198C09FFD04FFA8282100282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%280028212800282128002821280022217DFD31FFC2C1C0C1C1C1C0C1C0C1 -%C9FD04FF7D21282728282827282828272828282728282827282828272828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828280053A8FD2DFFCF9FC0C0C19EC1C0C198C1C9FFFFFFA828 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%0028212800287DFD2BFFCFC1C1C0C1C1C1C0C1C0C1CAFFFFFF7D28212821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%282828002853FD29FFC998C19EC198C19EC198C1CAFFFFFF522100282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%00282128002128A9FD26FFC9C0C1C1C1C0C1C1C1C0C8FD04FF4C28212828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827FD0428A9FD24FFC9BAC19EC1C0C19EC1BAC2FFFFFFA92828 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128002821280028212800A8FD22FFC9C0C1C1C1C0C1C1C1BAC8 -%FD04FF282821282828212828282128282821282828212828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%28212828282128282821282828212828282128282800A2FD20FFC998C198 -%C19EC198C198C1CAFFFFA921282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%28007EFD1EFFCFC0C1C0C1C1C1C0C1C0C1CFFFFFFFFD0428272828282728 -%282827282828272828282728282827282828272828282728282827282828 -%272828282728282827282828272828282728282827282828272828282728 -%28282728282827FD052800A8FD1CFFCF9EC1C0C19EC1C0C198C1CAFFFFFF -%282100282128002800210028002200280022002800220028002200280022 -%002800220028002200280022002800220028002200280022002800220028 -%00220028002200280022002800220028002800282128002800A8FD1BFFC1 -%C1C0C1C1C1C0C1C0C1C9FFFFFFFD04282128282821535353525353535253 -%535352535353525353535253535352535353525353535253535352535353 -%525353535253535352535353525353535253535352535353525353535253 -%282821282828212828A9FD19FF9FC09EC198C19EC198C0C8FFFFFF520000 -%282128002800217DFD43FFA828002800282128002827FD18FFC9C1C1C1C0 -%C1C1C1C0C1C2FFFFFF7D28212828282728282800A8FD44FF282827282828 -%27FD0428FD16FFCAC198C1C0C19EC1C0C09EFFFFFF7E2821280028212800 -%2821227DFD43FFA8280028002821280028212153FD15FFC8C0C1C0C1C1C1 -%C0C1C0CFFFFFA9280028282821282828212821A8FD44FFFD042821282828 -%212828287EFD13FFC998C19EC198C19EC198C8FFFFFF5300280028212800 -%28212800287DFD43FFA828002821280028212800280028A8FD11FFCFC0C1 -%C1C1C0C1C1C1C0C1CFFFFFA800282728282827282828272821A8FD44FFFD -%042827282828272828280077FD11FFC1C09EC1C0C19EC1C0C0C9FFFFFF21 -%282128002821280028212800287DFD05FFA85352534C5352534C5352534C -%5352534C5352534C5352534C5352534C5352534C5352534C5352534C5352 -%534C5352534C5352534C5352527DFD05FFCB280028212800282128002821 -%2800A8FD0FFFC9C1C0C1C0C1C1C1C0C1C1FFFFFF53282128282821282828 -%2128282800A8FD06FF002821280028212800282128002821280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%280028007DFD06FF2828212828282128282821FD0428FD0FFFC198C19EC1 -%98C19EC198CAFFFF7E2800280028212800282128002800217DFD05FFA828 -%002821280028212800282128002821280028212800282128002821280028 -%21280028212800282128002821280028212800282128002177FD05FFA828 -%002800282128002821280028210053FD0DFFC9C0C1C1C1C0C1C1C1C0C8FF -%FFFF53212827282828272828282728282800A8FD06FFFD04282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827282828272828282728007EFD06FF28282728282827282828 -%272828282128A8FD0CFFC1C09EC1C0C19EC1C0C0C9FFFFA8002821280028 -%212800282128002821227DFD05FFA8280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800227DFD05FFA8280028002821280028212800282128 -%007DFD0BFFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828212828282128282821 -%282828212821A8FD06FF2828212828282128212821282828212828282128 -%282821282828212828282128282821282828212828282128282821282828 -%21282828007EFD06FFFD042821282828212828282128282821FD0BFFC198 -%C19EC198C19EC198CAFFFF7D28002800282128002821280028212800287D -%FD05FFA82800280028002853280028002821280028212800282128002821 -%280028212800282128002821280028212800282121527D00280028210053 -%FD05FFA8280028212800282128002821280028212152FD09FFCFC0C1C1C1 -%C0C1C1C1C0C8FFFFFF532128272828282728282827282828272821A8FD06 -%FF282827FD0428FF7E282128282827282828272828282728282827282828 -%27282828272828282728282827FD0428FF7D2827282828007EFD06FFFD04 -%282728282827282828272828282128A9FD08FFC1C09EC1C0C19EC1C0C0C9 -%FFFFA80028212800282128002821280028212800287DFD05FFA828212800 -%282128A8FF53210028212800282128002821280028212800282128002821 -%280028212800282128002828FFFF7D00280028212177FD05FFCB28002821 -%28002821280028212800282128007DFD07FFCAC1C0C1C0C1C1C1C0C1C1FF -%FFFF53282128282821282828212828282128282800A8FD06FF2128282821 -%2828FFFFFF53282128282821282828212828282128282821282828212828 -%28212828282128282827FFFFFF532828282128007EFD06FF282821282828 -%212828282128282821FD0428FD07FFC998C19EC198C19EC198C8FFFFA828 -%0028002821280028212800282128002800217DFD05FFA828002821280028 -%A8FFFFFF2821002821280028212800282128002821280028212800282128 -%00282128002800A8FFFFFF7700282128002177FD05FFA828002800282128 -%0028212800282128002800217DFD06FFFD04C1C0C1C1C1C0C1CAFFFFA800 -%282728282827282828272828282728282800A8FD06FFFD0428272828FD05 -%FFFD04282728282827282828272828282728282827282828272828282728 -%21A8FD04FF532828282728007EFD06FF2828272828282728282827282828 -%272828280077FD05FFCAC198C1C0C19EC1C0C19FFFFFFF4C282128002821 -%280028212800282128002821217DFD05FFA828002821280028A8FD04FFA9 -%21282128002821280028212800282128002821280028212800282128007E -%FD05FF770028212800227DFD05FFA8280028002821280028212800282128 -%0028212821FD05FFC9C0C1C0C1C1C1C0C1C0C8FFFFA82800282128212821 -%282128212821282128212800A8FD06FF28282128282821FD06FFA8212828 -%2821282828212828282128282821282828212828282128007DFD06FF5328 -%21282828007EFD06FF28282128212821282128212821282128212821227D -%FD04FF9FC09EC198C19EC198C0C9FFFFFF7EA87EA87EA87EA87EA87EA87E -%A87EA87EA87EA8A8FD05FFA828002800280028A8FD06FFA2002821280028 -%2128002821280028212800282128002821280053FD07FF7D002800282100 -%53FD06FFA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA8FFFFFFCFC1 -%C0C1C0C1C1C1C0C1C1FD1FFF282827FD0428FD08FF7E0028272828282728 -%28282728282827282828272828280053FD08FF532827282828007EFD1EFF -%CA98C1C0C19EC1C0C198C8FD1EFFA828212800282128A8FD08FF7D002800 -%28212800282128002821280028212800280028A8FD08FF7D002800282121 -%77FD1BFFA8FFFFC8C0C0C1C1C1C0C1C1C0C8FD1FFF21282828212828FD0A -%FF530028212828282128282821282828212828282128A8FD09FF53282828 -%2128007EFD1EFFC898C198C19EC198C198C9FFFFA8FD1BFFA82800282128 -%0028A8FD09FFA85200280028212800282128002821280028002821FD0AFF -%7700282128002177FD1BFFA8FFFFC1C1C0C1C1C1C0C1C0C1CAFD1FFFFD04 -%28272828FD0CFF4C00282828272828282728282827282828214CFD0AFF53 -%2828282728007EFD1DFFCAC1C0C19EC1C0C19EC1C1FFFFFFA8A9A8FFA8A9 -%A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FF7E28002821280028 -%A8FD0BFFA8280028212800282128002821280028534C21FD0AFF77002821 -%28002853FFA8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8 -%FFA8FFCFC0C1C1C1C0C1C1C1C0C8FFFFFF4C282821282828212828282128 -%2828212828282128282821282828212828282128282821FD0DFFA8280028 -%2828212828282128282853FF2828FD0AFF53282128282821282828212828 -%2821282828212828282128282821282828212828282128A8C8C098C19EC1 -%98C19EC0A0FFFFA800280028002800280028002800280028002800280028 -%0028002800280028212800280028A8FD0DFF7D2100282128002821280022 -%28FFFF4C21FD0AFF7D002800282128002800280028002800280028002800 -%28002800280028002800280028007EC9C0C1C1C1C0C1C1C1C0C9FFFFA228 -%282827282828272828282728282827FD1428FD0FFF7DFD0A28FFFFFF2828 -%FD0AFF53FD1528272828282728282827282828272853C1C09EC1C0C19EC1 -%C0C0C9FFFF7E002821280028212800282128002821280028212821282128 -%212821282128212821282128A8FD0FFF532821282128212827FD04FF5221 -%FD0AFF7D0028212821282128212821282128212821280028212800282128 -%00282128002821280053C8C0C1C0C1C1C1C0C1C0CFFFFF7D222128282821 -%282828212828282128282821282828222828282228282822282828222828 -%FD11FF52282828222828A9FD04FF2828FD0AFF5328282822282828222828 -%28222828282128282821282828212828282128282821FD04289FC19EC198 -%C19EC198C1C9FFFF53002100220021002200210022002100220021002800 -%220028002200220028002821280028A8FD11FF2828212800A8FD05FF4C00 -%FD0AFF770028212800280021002800220028002200220021002200210022 -%00210022002100220028C1C1C1C0C1C1C1C0C1C1FFFFFF7E7D537D537D53 -%7D537D537D537D537D537D537E537D537D537D537D7777FD0728FD08FFA9 -%FD0AFF28282153FD06FF2828FD0AFF53FD062853777D537D537D537D537D -%537D537D537D537D537D537D537D537D537D539EC1C0C19EC1C0C198C1CA -%FFA8FD1DFFA828002822280028A8FD07FF28A8FD09FFA9282252FD06FF4C -%21FD0AFF770028222821227DFD1DFFC1C0C1C1C1C0C1C1C1C0FFFFFFA8FD -%1DFFFD0728FD08FF5328FD0AFFA80053FD06FF2828FD0AFF53FD0528007E -%FD1DFF9EC198C19EC198C19EC1CAFFA9FD1DFFA828212800282128A8FD07 -%FF282228FD09FFA2284CFD05FFA84C22FD0AFF7D00280028212277FD1DFF -%C1C0C1C1C1C0FD04C1FFFFFFA8FD1DFFFD0728FD08FF5328284CFD08FFA9 -%2253FD06FF2828FD0AFF77FD0528007EFD1DFFC0C19EC1C0C19EC1C0C1CA -%FD1FFFA828222821282228A8FD07FF2828222252FD07FF7E2852FD06FF53 -%28FD0AFF7D0028212822227DFD1DFFC1C1C1C0C1C1C1C0C1C1FFFFFFA9FD -%1DFFFD0728FD08FF532228282853FD06FFA80053FD06FF2828FD0AFF53FD -%0528227EFD1DFF98C19EC198C19EC198C1CAFFFF7D284C2852284C285228 -%4C2852284C2852284C2853284C2853284C28532828212822280028A8FD07 -%FF2828212822227DFD05FFA2224CFD06FF4C21FD0AFF7700282228212828 -%532853284C2853284C2853284C2852284C2852284C2852284C2852284CC8 -%C0C1C0C1C1C1C0C1C0CFFFFF532221282128212821282128212821282128 -%212828282228282822FD0A28FD08FF5322FD0528A8FD04FFA92277FD06FF -%2828FD0AFF53FD0728222828282228282822282828212821282128212821 -%28212821282128289FC1C0C19EC1C0C198C1C9FFFF7E0028002821280028 -%21280028212800282128222828282228282822282828222828282228A8FD -%07FF2828222828280028A8FFFFFFA8224CFD06FF4C22FD0AFF7D00282828 -%222828282228282822282828222821280028212800282128002821280028 -%0052C8C0C1C1C1C0C1C1C1BAC9FFFF7D2828282128282821282828212828 -%2821FD1428FD08FF53FD0628224DA9FFFFA92253FD06FF2828FD0AFF77FD -%1528212828282128282821282828212853C2C098C19EC198C19EC0A0FFFF -%A80028212800282128002821280028212800282228222822282228222822 -%28222822282228A8FD07FF28282228222822280053A8FF7E2852FD05FFA8 -%5322FD0AFF7D002822282228222822282228222822282228002821280028 -%21280028212800282128007DC9C0C1C1C1C0C1C1C1C0C9FFFFA828212821 -%282828212828282128282821FD10284D282828FD08FF532828284D282828 -%4D2253FFCB2253FD06FF4C28FD0AFF7728284DFD0E282128282821282828 -%212828282128282821287DC9C098C1C0C19EC1C0C09FFFFFFFFD04282728 -%2828272828282728282827FD0F2822282228A8FD07FFFD04282228282822 -%28007DA82853FD06FF5328FD0AFF7D012822FD04284CFD0A282128282827 -%282828272828282728282821A8FFC1C1C0C1C1C1C0C1C0C1CFFD1EFFA9FD -%0728FD08FF5322FD0A28532277FD06FF2828FD0AFF53FD0528227EFD1DFF -%CAC198C198C19EC198C19ECFFFFFCBFD1BFFA828222822282228A8FD07FF -%282822282228222822282228222852FD06FF4D22FD0AFF7D002822282228 -%7DFD1EFFC2C1C0C1C1C1C0C1C1C1C9FD1FFF28292828282928FD08FF5328 -%4D2828284D2828284D28282277FD06FF284DFD0AFF53FD04284D227EFD1E -%FFC9BAC19EC1C0C19EC1BAC8FFFFA8FD1BFFA828222828282228A8FD07FF -%282822282828222828282228282853FD06FF4D22FD0AFF7D002828282228 -%7DFD1EFFC9C1C0C1C0C1C1C1C0C1C1FD1FFF2828284D282828FD08FF5328 -%28284D2828284D2828284D2853FD06FF4C28FD0AFF7728284D2828017EFD -%1FFF9EC19EC198C19EC198C1CAFFA8FD1BFFA828222822282228A8FD07FF -%FD04282228282822282828222853FD05FFA85328FD0AFF7D012822282822 -%77FD1BFFA8FFFFFFC8C0C1C0C1C1C1C0C1C0C9FFFFA87E7D7E7D7E7D7E7D -%7E7D7E7D7E7D7E7D7E7D7E7DFD07FF2829284D282928FD08FF532829284D -%2829284D2829284D2877FD06FF4D4DFD0AFF7728284D282922A2FD06FF7E -%7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7EA2FD04FFC9C0C0C19EC1C0 -%C19EC0C2FFFFFF00000022002100220021002200210022002100227EFD05 -%FFA8FD0728A8FD07FFFD0E2853FD06FF5328FD0AFF7E22FD05287DFD06FF -%28002200210022002100220021002200210022007EFD05FFC0C1C1C1C0C1 -%C1C1C0C1CFFFFF5300282128282821282828212828282128282800A8FD06 -%FF28292829282928FD08FF53224D2829284D2829284D28292277FD06FF28 -%4DFD0AFF53282829284D227EFD06FF282821282828212828282128282821 -%2828282128FD06FFC298C19EC198C19EC198C9FFFF7D2200280028212800 -%28212800282128002800217DFD05FFA828222828282228A8FD07FF282822 -%282828222828282228282853FD06FF4D22FD0AFF7D0128282822287DFD05 -%FFA82800280028212800282128002821280028212152FD06FFC9C1C1C1C0 -%C1C1C1C0C1C2FFFFFF28282728282827282828272828282728282800A8FD -%06FF284D284D284D28FD08FF53284D284D284D284D284D284D287DFD06FF -%4D4DFD0AFF7729284D284D227EFD06FF2828272828282728282827282828 -%2728282800A8FD07FF9EC1C0C19EC1C0C198C1CAFFFF7D00280028212800 -%28212800282128002821227DFD05FFA828222928282229A8FD07FF4D2828 -%292828282928282829282853FD06FF5328FD0AFF7D0129FD04287DFD05FF -%A828002800282128002821280028212800280028FD08FFC8BAC1C1C1C0C1 -%C1C1BAC9FFFFA8282828212828282128282821282828212821A8FD06FF28 -%29284D282928A2A2A87EA87EA87E532829284D2829284D2829284D28537E -%A87EA87EA828297EA87EA87EA87EA87EA85328284D2829227EFD06FFFD04 -%2821282828212828282128282821287DFD08FFCAC098C19EC198C19EC09F -%FFFFFF4C22212800282128002821280028212800287DFD05FFA829282822 -%292828222822282228222822292828222928282229282822292828012822 -%2822282828012822282228222801282828222928287DFD05FFA828002821 -%2800282128002821280028212821FD0AFFFD04C1C0C1C1C1C0C1C9FFFFA8 -%2128272828282728282827282828272821A8FD06FF2829284D284D284D28 -%4D284D284D284D284D284D284D284D284D284D284D284D284D284D284D28 -%4D284D284D284D284D284D284D284D22A2FD06FFFD042827282828272828 -%2827282828007EFD0AFFCA98C1C0C19EC1C0C198C2FFFFFF530028002821 -%28002821280028212800287DFD05FFA84D28282829282828292828282928 -%282829282828292828282928282829282828292828282928282829282828 -%29282828292828282928287DFD05FFCB2800282128002821280028212800 -%280028A8FD0BFFC2C0C1C1C1C0C1C1C1BACFFFFFA2282828212828282128 -%28282128282800A8FD06FF22292828222928282229282822292828222928 -%282229282822292828222928282229282822292828222928282229282822 -%2928282229017EFD06FF2828212828282128282821282828212877FD0CFF -%C9C098C19EC198C19EC09FFFFFFF28222128002821280028212800280021 -%7DFD05FFA87D537E537D537E537D537E537D537E537D537E537D537E537D -%537E537D537E537D537E537D537E537D537E537D537E537D537E537D5377 -%7EFD05FFA828002800282128002821280028212821FD0EFFFD04C1C0C1C1 -%C1C0C1C9FFFFFF282827282828272828282728282800A8FD44FF28282728 -%28282728282827282828007EFD0EFFCF98C1C0C19EC1C0C198C1CFFFFF7D -%00280028212800282128002821227DFD43FFA82800280028212800282128 -%00280028FD10FFC8BAC1C1C1C0C1C1C1BAC9FFFFFF4C2128212828282128 -%2828212821A8FD44FFFD042821282828212828282128A8FD10FFCAC198C1 -%9EC198C19EC198CFFFFF7D280028002821280028212800287DFD43FFA828 -%00282128002821280028212152FD12FFC9C1C1C1C0C1C1C1C0C1C1FFFFFF -%53FD052827282828272821A8FD44FFFD04282728282827FD0428FD14FF9F -%C0C0C19EC1C0C19EC0C9FFFFFF2822002821280028212800287DFD44FF28 -%0028212800282128002800A8FD15FFC0C1C1C1C0C1C1C1C0C1CAFFFFA921 -%28212828282128282821535353525353535253535352FD0453785378537E -%5377537E5377537E5377537E5377537E5377537E5377537E5377537E5378 -%537E5353525353535253535352535353525328282128282821282828007E -%FD16FFC998C19EC198C19EC198C1FFFFFF7E002800282128002821280028 -%002100280021002800210028002100282229222922282229222822292228 -%222922282229222822292228222922282229222800280021002800210028 -%002100280021002821280028212800280053FD18FFC9C0C1C0C1C1C1C0C1 -%C0C8FFFFFF7D002828282728282827282828272828282728282827282828 -%27FD04284D294D2953294D2853294D2853294D2853294D2853294D285329 -%4D284D282821282828272828282728282827282828272828282728282827 -%282152FD1AFFC8BAC19EC1C0C19EC1BAC9FFFFFF53002821280028212800 -%2821280028212800282128002821280028212800FD04284D2829284D2829 -%284D2829284D2829284D2829282928280028212800282128002821280028 -%21280028212800282128002821280028A8FD1AFFCFC1C0C1C0C1C1C1C0C1 -%C0CFFFFFFF52002828282128282821282828212828282128282821282828 -%2128282821FD042829284D284D294D284D294D284D294D284D2828212828 -%2821282828212828282128282821282828212828282128282821282128A8 -%FD1CFFCAC198C198C19EC198C19ECFFFFFA8280028212800282128002821 -%280028212800282128002821280028212800280028002821280028222822 -%282228002821280028002800282128002821280028212800282128002821 -%28002821280028212800287EFD1EFFCAC1C0C1C1C1C0FD04C1FFFFFFA84C -%002827282828272828282728282827282828272828282728282827282828 -%272828282128282821282828212828282728282827282828272828282728 -%2828272828282728282827282828272828282128A2FD20FFC9C098C1C0C1 -%9EC1C0C09EFFFFFFA8520028002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002800287DFD -%22FFC9C1C0C1C1C1C0FD04C1FFFFFFA95300282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%280028A8FD24FFC9C198C19EC198C19EC09EFFFFFFA85300280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%280028212800282128002821280028212800282128002821280028212800 -%28212800280028A8FD26FFCAC1C0C1C0C1C1C1C0C1C1CFFFFFFF7D002828 -%282728282827282828272828282728282827282828272828282728282827 -%282828272828282728282827282828272828282728282827282828272828 -%282728282827280053FD29FFCAC1BAC19EC1C0C19EC1C0CAFFFFFF7E2128 -%212800282128002821280028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002821280028 -%212800282128007DFD2CFFC8C0C1C0C1C1C1C0C1C0C9FD04FF2828212821 -%282828212828282128282821282828212828282128282821282828212828 -%282128282821282828212828282128282821282828212828282128282821 -%2828A8FD2EFFC998C098C19EC198C198C8CAFFFFFF532800280028212800 -%282128002821280028212800282128002821280028212800282128002821 -%2800282128002821280028212800282128002821280028002128FD31FFCF -%FD04C1C0C1C1C1C0C8CFFFFFFFA853002828282728282827282828272828 -%282728282827282828272828282728282827282828272828282728282827 -%2828282728282827282828272800287EFD34FFA0C0C0C19EC1C0C198C1C9 -%FD04FF7E2722002800282128002821280028212800282128002821280028 -%212800282128002821280028212800282128002821280028212800282121 -%007DA8FD36FFC9C1C0C1C0C1C1C1C0C1C1CFFD04FF532800282128282821 -%282828212828282128282821282828212828282128282821282828212828 -%28212828282128282821282828002853A9FD39FFCAC99EC098C19EC198C0 -%98C9CAFFFFFFA87D21210028212800282128002821280028212800282128 -%002821280028212800282128002821280028212800282128002100537EFD -%3EFFC2C1C0C1C0C1C1C1C0C7C9FD05FF7D53002821282828272828282728 -%282827282828272828282728282827282828272828282728282827282828 -%002853A9FD41FFC9C8C0C098C1C0C198C0C1CAFD04FFA8A8522800280028 -%002821280028212800282128002821280028212800282128002821280028 -%21280028287EA8FD45FFCFC8C1BAC1C0C1C0C1C0C8C9FD05FFA87E522821 -%280028282821282828212828282128282821282828212828282128212800 -%28287EA8FD4AFFCAC99FC198C098C198C09FC9CAFD05FFA8A8534C002800 -%210028002800280028002800280028002800220022004C527EA8FD50FFCA -%C9C1C1C0C1C0C1C0C1C2CFFD08FFA87E5353FD06280028212821FD042853 -%537E7EFD58FFC9C9C1C198C0BAC098C1C2CACAFD09FFA8A9A8A87E7E7DA2 -%7EA8A2CBA8FD60FFCFCFC8C8C1C1C0C0BAC1C1C9CAFD78FFCACAA7C9C2C2 -%9FC1C1C8A0CACFFD40FFFF -%%EndData - -endstream endobj 23 0 obj <>stream -%AI12_CompressedDataxœì½×vúȳ0z®g-¿8ƒDNÆD 6Ø`œˆ`‚°$&]|Osžá»:wûÅNw+ %Âoïùï5ãõó`Ԫꮮ®ÔUÝÎv'XÑ* aŽ“ß..Ê Er4“q ¯׋ņåø•çÁëÀ! ¶*^§úBËÅ°3z•AÏBQø”€ï{ÊSfÆr3rå ¨%häux¼ðiwÆ-(ð¼:\ÌÖ,ÕÿcÆMû³!½êGCäÌ+u­h™G"ᆧ±L$å(Þ¢&äêw’egSs4…—èÍj4[MJôŸG ‹9¢‰„#ŽÇ±D>¯Ï(VÛ(ObQØ2O¤b y4”LbqðN -|ˆÅà‹z¸YR+®ÍÐCŠeËô‚f،£üÝ-9OHÇ µXÐ8J r8W¾CÐ+´%6܆!KÝ`"ÿKÙàŽ¢FÔȲ1[Pl¦‘y÷D3svM©÷Ņ–ô„!ÙÙ2´^l&³UhÀh”ï ùG _}G4þc:ã(@g¹xïC `º–$çÀ#hn‹×x¤_ÚÌ£»Ír@™L¤qô}´ÆýȂƒ±ÃÏèûdÿz ¾êP‚1 y¨•”ÔߢÏ[L02sjõá!3ô~ގ¦Ó¡DN^<“`ÚãxŠÿ&–LÂobÂK]j¹^A3™ˆ¦C`Ò0 üV|›‚qò ái -¤CÉ4îH/RQ w€)‡_ˆ/È3Ný>£þÈ8îè%­Èpžñbÿ[xô°YPÌãj§2¾KóT»¥GÔ¼!ƒ $"úÁåßB‹.ÉL(ð+½Øph¥$,`fšä_dA\@ÒZS«.ÝC]M $áƒ5“Žƒ§Ž8@ƒ'$´¸ü[!A8"†$œÍ6˜à3œ•»˜ìטÙHžõdđâ¡a„RŠiñŸÐ[0vŽ£Vb÷Ǖoüƒ…n[ku5*ÓK8 ,ZÞÀ˜jAO„§òè±YŸüövò[4þÙÐň ʑN„ÁòøӞ -W7 íÀ£˜¢Å€d©ðLÓlÅ;ð߁5 ÖÚ  ÈɄb„ÿçááŒ<2^P†×ÃMé Ö\¸3$zž€%„`/¨1nU›ÄyØð }$rJÔTüƒ4؀o¹0µ‘ì4L-Ñÿ8°:©0Ë# -.ŒÕ å_¦©ðˆÒÈIÀéðËhF1`Ĭ#Œ$œ±ðpÃ0Ôjøø#04X–¬l<‘ -‹íÃCzý—“©ål5[×“‘0 ÿlH.V4žþµžR«0¦‚C£Fá%9„Ýd“¢‰onØ0÷ÍnÑf4æ¦ EI‘à G…—À®Ñ0ún4ó  ©Ñl± $°¥7@‡–$;Ü,PR)øðgC2àøqJ.Æ<áKց§#á"âªÈc,*f³ÈÓ·(¾.VÃe¡ á*z=\E/(UÅëUé½k¾Õ5âZÑæZjSå¦á;„€iñ/´øZŠZ|ŸZÒ{Ë͂›­…[ìòÄ£8 GþåGÅˏÒ[/üÃî”f·@1¼¬Æ†I1)Ž‡T¼Mò¨I ‰ÈARá¡HŠâ¡SòË%½7ã[ÍøV3Š™Ô†äXñi¾9-ö‰V¼@ M¤÷F³ßgð žþÕ i£êÏFzç/þ1‡ˆñ—øõÉoÝ*/ -ã7ý. ´€BøGûHÐTWCj׌£¯VØ[úû-¬iÖ¼À âîë ‚dšÛÑe6T÷¯µ¨uâ>èIŸC+ênž¥úm¤ôk ½Y_¯ÆôÉoÞ|ëQC`¢]5r´ßà`„Ý‘Ãé„ú›š §Àp XG |/µÖÁÚkp†rðOÁ»èOðÿ1ü¿÷+ÔX2þÛú{4òn|²”û{I6 ð´ºúZÐkʸÕñD2k;(Ú rE2ô@Ä „븆b…œs³ßK š3 #Ú$ ¯- @˜¬ÕÐK¨›YÅ#[¨Hn -LK X zª60‹›Õd‹bh |{;à;-ôbÆ.%àÊo¤Ï6{ -Ⱥj­ø.3vêèÒôB‚|»Êa=[±ÔBÓk`ñïý£IõÀÅó¢LSˆÅõt6ÔÃÒžg”.2ƒ÷mq×M•ÖΚú{F.t1n¿öC&ð ¨| ; „€i›Î$7œ:š3à°13ÊbµÂÉÏV#ÐÑÎ8r8h(O(–âþ怀âŠð¡xA‡ºF©N‚A`ó9J+¥º©1Pë¯8à®?®Vä葉ð•#€t¿ú,â(!ž;ù­­ÆÀOü$ªÉj -üKƒßiðS¬–пRµŒ~*èþGü'üàèNDÀpˆ(ø”ÿKþwò[áC­#¨E”ˆ¡Ÿ'’à'A¤Àï4ø–~…O)ô©ˆ~—ÀoñðY„'b;á-žÆKx¯‚.à‘H$IDR‘t¤)Gª x4EãQ¤HG‹ÑR´‚Ç"±X,KĒ±T,+Ÿ -ø©ÆwÇâÀm‹Gã±x<žˆ'ã©x:^ña1 4Àà'‰¥°4V?%¬ŒU‘0<‚Gñ8ž€ž3^ýªàÕ‰Fâ¨_r¯¢ W°On´ z„¡%@oŠ±2ßèaü€ÎÄàà5Ð2F€Ç0Hâ(˜`0¦ -€R£+1ÁHSà' ~à ¾p‚Ž| ‹Q,ŠÁI½©F*à§,âÛz ¾‡Þ?Ê7åwÁÛà§~Šè' ~Rà' N~#O€ñÃØuü'âK¥RÉT"OÅ@—#)<…V©&+Ér²”,&ÓÉT2™L$ãÉèX$‰'±‘¨$ʉR¢˜H'R‰d"‘ˆE<çÌ^‰—ã¥xÌ\ -Ì`"GøbŽ‹~‰AK¸Ã±d2…~1hL‚Ñx$‚AO4 Üôð±â1ø Ž¨ñ€kïH@w>…0;`Ýö²ÄÂBÚ¤#\ N)ø€¥Sq~ƒá‰d$>D’©X‡ð8 ø׀Ã<DØ¿REe¢¨2·–£öœžtûW´ý+Úþmÿ}¢-• EŽ.ÜÐcŠ·(ÄqtÇCµ#æL­4}#í_Aö¯ ûWý+ÈþsYTWEÿdÿ -²Ù£ K€ÖǗdêÿQ¦W³ØÀIóÏ`^÷ׂ‚»ÍýÇ -ýåÈÀpãŠ^yá; ý¸k‰v¤çá2½\üb¶€QLøJyJÎV¾ ÿµm5……6î ÷fìl°à–Hv6T@·ø˜£í쾯ˆN¢0£#Ì0aŽ‰ØqZ¥!ԕÙ&9Ì_Ž &Í=PCšQÏ£)ÑôÂá©þÉ1ä{\­á 5ò§˜ø´Ëë2½úb¸ò†åè%ÿ8„ÅáŠZtÁ›]zA1äjH‰®*ñÀTr% EÔoMgÃùŠbÙm”ÀÈò ¤žn÷Czô@-éß©6 úÁCÃ1S›¡†3˜M%ôAêÂíìO᫘v,"pùÛ[òO遧>[ý½Ã}µ Üá -w8¸yëðTfìzAþÅÿ¹ £ˆ6§Ð÷YšGöä70£$á Óa¸Gç1è =§vA-FxՒ—Â|CaåH™7˜ãù/8¯7àÓ7ø[ÇÛ杀‡ð!øÿ§Ǝ¬Pã€eB*í(oŒ63ÎÞÍAÁ±ïDqsÚ@pÇ¡ŒI½^Yªú;µjFÆô21ÚÓ<␼=Ƭ« ÂtP0KäOjˆ’¹ø‡„¾¬wàÉT*­”øÙr½%>æhñ„Ó¸pÇ3 ¿ÙaÖp~ÖÐ~·­¥±uЯÑAøÿ°‚É‚Àúÿ…Š¨3œ®f‡ö(˜½ó¯:úWý«Ž,ÕQ䢎Òø/þÿc«û_ÅÖKû[zGUÿã«øŸbT¦#ÿ®âÿäUüŸ§@ÿ7­âÿi]üÒjD2£}\C8µ¡d‹Àg"™N¤¢è‰ È(†'b"wò%qc_…7««‘"¸i%m“ ŠƒIÿ{{`¿ßÚò2Dç¿!é´ugí!øW’{#áÜ-Xۜ±œzf¶ÇÌ·Ù38ŒcüC> ‚úÄï0í·F„^‹em’#a`<,~þ©Xè‹çÛæ=¢ gž?—‹h$9à» 6Å;” q‘aÈÿV0G¢h7œG•¡VB«ˆà¥‹á/î¯5%<ö¸Vlÿw’a³ -ÏVÙöwr±‘ìAC¸Ë)´zêÿü'0G(;TZÐÃ9 ²Ø “Ø4ðà`†êoq;ƒ<Ó¡¸;4U6?&SNܜ(öH1#~¶µ2ìÌôÿ8#ì.2¿Û °í?ƒáá8‡(Öø¿”E3, .¨CÁ:´Ï©ÿëtèŸÖŸÿ]K™ÿñàïÿIÎ.fÃÿ=bÇÒ¡†EÄ] Ãaÿ1qS[ó.´üGHo‹€á%pËáM)x -€­ñ‰Mÿ”Îw±à_¶Æö×?dXÒù5VÃúӞ(ú‡ KÚ¨4π急ѤÆ,‰­ám¿ô1*´ìÐfH¡ŠþVPvÿˆ~,)ŽsëIܙ³‘3±ÅsŠÖüëXCÿ9Ä -0^­ÏÞ)Ñ>¿/Héi ½.2ÉÇìõlí2M¦ã8pR -Çc¡T$%lð£4Z:°HµD|–ü-ÉÌÅ®_Qâãj6ã;­pD%ýÑ.>_I‡7IÇ9É]x ]úÇÎw§M³38ô8"ÊnñD(ñü'û pyP¼@¹f‹ 7 IfT¡Æäf¡v£ÅIÛ êŠ¤Ö’7*¥K¬ÉÑH‹hI²s™*üwìšæ´íÈÅL”5IQ*ŽÖ³(à…¯†ô‚‘™ªxí(n8Úñ@Â#fSZ¨Åkwˆœç˜¯èáœÞpŽ _unÖvÆÒðL-dž®Åd Uë´cM®)ÆÁΖ›:§M³ÎaR  cO¿ÒH}؀cÈ»&ù£‡&Ìlä`åqÀÔé”!4Gônc»í„¡¤Õo٘‘"H‰x<7nŠ+û`ÙVÙËÆrÐÉvRS1V˟}בɅ«¦²ÍP,ÅüN9ºÔŸ:v€Ì3NddÏÛíŒãÀ²§ÿõÙÍjò±½®0)>ŒÎÖrwÙGX8‡rñÇ¥DV8¬[ŠJ ŠØÄ!Ÿf&®lLõJkí—Z¼„IÙî_“\M6ä„r´éµ‚Óƒq‘Bô)Ž`'™õ(!á晹š±S@ô‚¦‡‡âŽTOˆ)Qfð ù O¡¡ÊÔbQý““•€8ãWÐ6šµGr"‰Sxv ™Žá;u K¯UãàÁ¤b;‚)!ûI)‘Dx€¶ éR©*۔…܎„•ÕÜõjDýÙ¡€*íø1cX+DˆyLfÐè=iHǘx ØAó.AٞödßaÚ! ÝYWÊ-Ì1–dËZ”`ôï³f¤,Eè§*V¿òɌàïè+ǀ\H©•Æhà9š@èÂXޟxj-Åa<üi¦ -Ól^¼&6‹…(o„cOÁSQ”E’‰¤Ù²®)T€éú/éëݶ’ª…¯nÃ֚Ê* 7mLC -.eÙNíVë”aW m ¨ LKN1?»±%\¢ygƒöhA*HjÙÖIQC5I#0»²oIDð˜ÉúWrH<•Ná&m#Rr {“+nææ%)1u2>G,•Òøз>G]±ñ$ÀO§`Žè·~Rį`€åÄ É…•„G§*x߄v¦ yúªY²˜Ññ˜¥$ádÈôP딁“ÎIse¾öT*jØ‚Uu&Pá¸T@#Æ4¨Ã3ýè•jjcñT҈!4²JWz¹É¢L'Öfkؤ"ƒE£Ñ0Ì"±Pl á£>¯IÞ°$ˁᑞí -³Î€`PYº"—©ÚV— - EnP™Â…@x|ꖏ£jö4 §Û eãVÕº³.Cç=?@Q&¿‘…íå $Ï¹•¡$PªÒ­h$øRõµØOòM$DODá‚DÀÙ5s;ÔâzÆPî¡Ü“G®4Ä2ÔýeA÷?¨tÿVۖÀ»CNW5ëÊ,ž”ý<¾ OÖ0Ö¦£¤5STm[ZãÇÁpGµÝفb°µÉx˜6iÆ7¶&šºÕøF6É&@Ü2•±‹-[•ŽÙ -Ù0b$EÔ,–œLë°,ӃÐø ð?µÛjQ“‹…E3v>[À@ça¦mÇðµ?°‹ŒEÓ!½XÈ>…gÛå×¾ †&v–øŽbKSK@ŠßÐx–¡RÙ&ÅÕY&=†Ã£(uHr«»,·øðêµD8 ’À÷„A^;/­GKðx±²ß¯õÈ>x>íB~Eoþ×kFhgÒØHè€h…¤ã!iÓSÛT¹ƒ™Æ{ʨ¡j+0JBœÁ›BðtQe…ҍ9ZŒóÄSqKЌ¢#),’kÞôÛó[FâTT6Ìpêè2Ôl$+ Ôl5£Î|† °•Jún#jÉiÜJEK`´Ò˜5§m·Å¨ -×Zˆ—ÅÎ&+=ý¯++Â>—)LÔVv’ì`Æ-ɵ} §ž˜í±/˜\¹M†|©%Œï› 6•”Ï^"j¼ˆnsfÖ;¼]D'ü©m9ÚyJ3‹‹Á ÙZØ1e „x2gF¡‘˜€¦0wµÍXèùIÐ,þn1Rv¸^ ÿ2c|£áj+Z§mÄoA¹Åa0J0e rmƒBC³¬'ËyˆZÁÜ(Sq ›±Rå€%/£ö¼|W,;/UÀÁh±3Šªã­¶@âAcM#¨ô;h=Â!C¯­Ú@»jl«vü½ŒÕZáñ­–É°fS*ÈH¥R²ÑšSŽËª±R)éë#Øݏ£é‰ÖrOl4VöDoeW\h´°ˆ|£53¦W¦â¶c3,…Fôf‹Ãý23–A“Á Zf“ΆVԄT윴nyü† ^ZY@[àC–b?úÌÀ†Ø)9‚×O˜ƒzFT¤3šfI=mðç:¤Ž“G1=¼ Ãh÷àÐ^Ÿ^ÓÉVSƒ†‚ÊTăôæVnȇ™,š.ffÒ´€1QRíç´¤×C3‰ƒZ°fӏZŒ6ú¾»á¦«‚…y<3ֆ2AÍƛÕЌkøFBØ@â ‚^"W+)¯Aß=FÍ,½áRikyÊ4ðUG¢U{(FӎwÏu§åÀ#‰X2ÉD0,öîµð—À*Tڎzæ(h:Õ¦”^#qOj¸üËÌ#W´¤¹©¥GΛ«zkÆJg¨’]Õ^WŒªÀoXªBKðO}G¾(¾©tå•á¸¼7ߞýI-Ú3¦†œR€ˆ;ÿ|¼K Áˆ6¡o8ºA1ÚQ p‘e%ÄçíÁ˜òd¬‹¿ÝÏv”HqWeðØ#0™±v…è‹kÂdYCƄMá¹5k«–8l‰.,ÉƨAP[)¸i£-ê)àX3y%¶%H–{¢pƒV -vÌ(ÖåÈVŠC¤(”,GRÃ[‡j¶„÷ªÌ†SxÇ xH1ÊKCƒð -O¸ É:–`…ž£årô(æj5 :8@ÀRŽªtÀžKO<vý_ÿ/,垭”Hôˆÿ¢_‚Eö½á€äŸ0äréø¼ýwÈQ -9®W¡½&Ðs èËÿú¿Ã)ü€`À W“ÿúÿÜlB‰½bÿþƒÎQ¾+›Õ€šÍ3渐9›‰,ЙÙÚJЫæïÁÂ"—™ˆ7\‹Œ™Ó+¶~ &0±ÓÔýQu£¤TÖÍ»¦nØÞ*ymîىM»Ìl©ì±)™EVµÝÛ¦ìPéZÊ»åšö‹Ooù›dÇ™dmz1“Âú6¸ØÛ[zE§ ½Êù_†¶­îÌ(.Ø&ŠÕǖÉ5Ÿ&8£ìÐXèÿõj¡t Å ^´Þ=Öµc$ч•=àñ?hf^²2iÄ7²ÿK±•{¿!›ÄN™ý|D}_H%Ü÷œ-½én̤¼5³ùAhùඦg7*+GÌt¤°·r?ѝÀÅ-9Ü -+LKg;©¢û8P’rãÙfŸ¡ÍP…²OXM‚o”¤7¥ä·Ý§Ünjš=]Ãó.Q»K]~ÏG¿Bðʪ,ù¨¢'\š‰^p±S¾¾NÅ+z»j¹Þü¹§Kw–|ÜD]­`©ÀԖÓÌdå¼!œ»<#Cìyâ±^Mœe -µümì*Ó|wߘÍ0IT#·© <;Ã0¶ò]™°óBö3ä+äk¶À6"a€¦m:±Õ WšÔ\Œê”g—ùa%rO¶p5G/a²B\d’¯5®òýQŠ½Å%Ýd‹×nêÏ'Î6D%vþTú^¸ŸšÊ»èB;O¦ÇÉÞýÛ{±[õŒ±*Ûe> -¹9ñQÈ°¡¥¿¸ØžÚh Ð z_`Þ+㏧diQXoF¥Åŕ;Èøß7ÅfÇõà-do¦Q€&‘í}Š«¡{鿼͆“Ë÷ËY2fÇÑ"3¼Æýó .VnØ \ÒM%Ÿ¢Ø(3+‡I0Éøí¥' J‹d{ɏá¥yQ(_çΞªtâU¹~Kœå“eúӟëÞ2‘ÁÙ‚›_]€!å¾38-o‰§Äý -’*_š{AA{£&†œÝVÂdÎE8ý¯ D“€>Ô Á§×1ô‡?Oä„O¹§jƒo_T¿xh‘—È5ààg̟ÏW‘ÊÕäRôt™ËŽ¾ï>ÑlJ=ðZ¥¸ˆ´*ÝH]ø»€{.`+*†¾‹;K•>"71W±Äkâ{XìV¾ý•q¸ñS%I÷y)1x¼O·/ž‹­r©]wf?…ŸÌ )Å^º}ž ¯‰Ñkµû{¥Øs±ET¾ŸúåÙw"œ//&Dyìà ó_ÉäȖ¦:?ËF±Õô5ˆŠwÔà©#Қ_¸uèÞÕ#ø!å)²ír§Åî ·Ùœ†¸ -Jˆ“ñÌ8EP°‚Ze˜ä]}]L"_¹« -F¼¢ˆr_9¢xÄð—èô§v¾ÔÄUN®8<û\MÙ ¢’T7ÍZ±ƒ#¾Éù×Ù/Â3n„ŠX®ûñžæøž¨)’Ø<¤)ÂãZ{ËÓÄüêo†™_Á:x¡‘°éTGQ `u-]`pgÞòdZe“ÙáãC1ùyÒÎC»¾è©€ŸÖªÁÀ ­7-é9Õ(4ÅîíÈ„M>])5_æzýEMíj/É1X<ðjZìv›}¸6ám/²D%þñçk_ðÈ7yh`\Ã1Q­Ä“¥D°ÕC²'„×{„µþZûJßÜhYZ¬zt±;}>0~ Àº ï"„+˜|+>Œ§nðڇ«”ð7§‚èôVÆîzô—žò"±Ú{®‹`h|t£Darù åýWe›>/†¬º«øÐ}[¤¾Á’n²^€häô –+Í=ë‘«á…¨}ð‘J²Ý¢Ý86ØT=—?O²æÑ<… íá’ÐAª³Õ õåÏ^³c ¿‡gñ¾Y¼;_7eáiºøUÈÕË!Ðä«äAÓUÂ_7ýbgӍÉOQc(ÓÀ7Ë3̸ø)S.Ô@+wÕ*¯’Éy†Ý̯°†gM€_£ÖÀGEìæå2Íâx¯À'R|?Á z }}Ã=@øÀð<ç/ñâdAü¢‘á"4ükð7Ý~áßeԄGó]€—„~¼]© åîU=yË+Ÿz>!þeU&ìŽԨģ‘‡+¶âAÎG•­¾É=燆 ÿô–:»¯ç·"……§Ñ.;¢‚+Rÿ†kåø7oæoE% ܛh‰£– ƒðß¼ºï YRŽ_W•í呈Á“Oâõœ+¸D$š@ çÂN³º5¥¯Î¦Èxê. -,`·oBw”4ß"8ß;À Í·q[n‚æFšsy4±…þimŠF»8d‚c75<©C*¥ „¸?Ÿh„*×ßIRC9þÅU2toÑì[ Àö`™j;cäËð$Í'>iÔJ‹ÄäMãsÈÆ­¢«T«R›_P`Ýç`Xe>¸ÚútNû³±;5ܦo”s#¬Å΢àïN~|øpՊiÁMîú(@¯yÌ"èyŸ•§ïÎ èt¿/²ÀG 8Ô(ÍoýÀûicâh A3Ðù,Í#—Nù™ÄöXf´\`pªnTz¢Däªï!i¹%‰ÏßQ]m¾"éeŠg®Àyø  I%‡Í›Ò}»ÐŽx_–wBW7/Åû»Nºú⃧ï¨À´ KÎ7ƒ6Ö\‡5¶E1æ¨=쇣ْ(0Ìô!3·OWC»Ê~ADzŒÓåkðÖºT/Å6% <²NÕ<¼}ÓÙFPzЍý„fEð´(0§7uÂç Ä ºž€c­€ºz ˆ¾×9…ÍrƒÏUáéÞïÊLýPˆéoÄî -Y½B©+7ŒïKÃ4‚vVó|Si%« Õßí,ãH¢èT¢jC%½½’£rüS^ÉzËXѸŒJË3v–¨ŒƒoÀ«þ”h< V@Vç:zÝOu]ç¢æz©ŒÉJ‹Ôy rãñzd“G°-&s¸nflú4;>ïL•f“€5Ôê[õûc¥¾ƒóµî—> ½sŽ“P7Á4Oœ ®I<”âÝPP~À³€Û‰]¿Õr Iå¢xñí÷xœ™¹ïo­(•—ºOopªvqöƒ~{—›ˆJZÕªçKÞ ³-  ,õ靣x^æn’Uô+Äd/vâÄGmÉùÜ°Ý7/lԌěg,Ð-·SÞ&¹J<×Êwåޕdð ¼Äï©0Î7`Rÿ<€™.ü(ÌF-° ðÓmÊhŒ[aB`¡6‰K⧞«,šqÙ@æòóÌYw¾èòìô<ø;Ö*®ò״Δ†yÆkÑÃuúvÆáºieªB¶´VšåBßržLo „.“£»Ê8ý®¾RœKCÒô7ãî[àó¥HO[> ¿@[@ £oÞåîƒn]]+Ø(™ˆêqIz^¬v‹Éô²'û•ñ=ÛàE†ÐÙ:RkåâDŽ(&õóKüº˜ϋšVB“¢ï»Ðë^“D®Â)ºäòÙi!óDM -©5ÓW„HUhª¯Mà¥öT3\ñòöŸÜ%W[Ü.ýùd­^øy;HS…$ôhYeáÖÁ=à‘oW¡7înÀó‰›M%ô0 -2wßs…å~u§Äª,l Iëö§i––@ª6V:÷"<¥>¿Dr ½@‘zkS©²l%0 ª9ïùÅ#àȗŸÒ²•o3Íý)Ðhó×Ò<‹{€Ä‹]®Fú¦Ë/Kñšýøª]ÎF9ûä*cš éðmèщn:=åñUt{}$aLø¢¦qþü=Ã"ñù´RË_PÀîH'øˆð°÷ÊJp³„çzôÐw(-ž+Tî:¿V`F}o*ÎdŸ€¥TûFë/E7~5/äòë3墭#ðiVÀÀØÀk"ÿ«ãÁÆ=¸ j‚úùIDºÓô”Ô)Ñ\U‡ñ@ yuèå.&;·˜‡—v‘.Ž·Ä?DHßH!¶ax€Q…M2·þè[±Ûu9m-Y3îhT @ÚÀ8°œ»«"¹"îk}aÕá ¯êë±q€†¶^‚g¨ÚKa¶5‘Éῼy•½º7´éÕ$>J‹dáyÂFkîx$}(:2ÁqŽ‘ƪŒUÜÖ½Xi±Xiý|µGûžËÙ :Àrn¥‘-€LðŠ ’‚{%gp +>ÐM®hýŒDj¾‘z.ë„ÆUž&> §uN†¨¦ê“ü©?4‘;/].àà'Ô&’Æ*¸ò»ÒcÁ¿‘ ìSÕßrû ?ƒzzDl—¿ë±qP!SÔO…Ü‚ðò -èZh“ÖòOù®šþâLž}M˲ éÒsï}î Œª‡gg™œ`ˆþ"œ3±($Ÿ'ÕbªÆrpƒ>Hxn‚½2þ¸d³TƵ£~ð*Qç–‚yy5¤¶D禘¬' -%Äïë=YF eÇŠÑ -bÚW +ސ"5ˆs?xº,ñA&…bMwdÍÆ ä#b@/á°ÑS)¹Ûb'Ps3ñ­4 ZnNûÅT0t -˜Š “ý´¢J±ùh”è=~ôRÉ«r½<}B/촐»~VÜ©´Ÿ­}-K®j!ûñÌÑä½Ú‘ÀÏý×9PÃãuñaR‰dò¹ÀzŸO+›èG±sVZëIW1¹ ýšìö7+Ю|Y™Ä§¹Àæ}¥@þÇWn’ï‡ÈC)%Y%‰)QB 2|Ž¶ËYHžVP’èÉG9ÙѹÚúü3(» Mf4v3Ò×.-‚x·öüú¼sÕäøßäîs°!¾>6S˜âFÎSpèƶæãH4#À†>©ô@X &¬$êT ?#K¤ù *¸=`×~n _.€ˆ»ß¨Ÿ>»É."dHÁô¼ð݃_>©ÂœÒ_O@g­1¶ˆåî֊@*¢WɝëV|³ð0xi”Š©À5œ×Lc*ÍA õÅ L¿*°±JÃb«Q‡û¹“HŒˆªO÷§@WPoYò‰þ®„«ßÀ4KÓ³êç3 -?ñ|Ñiÿ•xl½} ¦I¼'¼\–®ÞxéÖë%W×÷~M ›÷î-pK¸WŸ¿Vƒ/©I)ö *X`ö˜»֗øiW—Àƒöï+‡«JP|—ÙAf~Yù˜½œ!v|O äþ´4‚½/O £`åzQ~ҘXäþýŒð4J©bû5@Ëã×ØJ11ƒnj¼:èV㲘T¡~…öD}„"Ýb0å5Â/(§H–ýb<­J~}Š«+g›øò|Dà¢x¯Ü8ǘ¢ƒðþgöºUHdž`4!؎€á¹qƒM ñçÞù ¿”ýÈœ}ØʆŠ§ûþê­?  ?ÖR—­óuíѵ>O?VßÎӓ't¬ú¡Ïbw:ä`ÿOþDªŒŒÀÍ-TÞÃÂ*!R¬)IÅäCœ5Íù§â]÷"Ø£™ 9 àÙ 4ßP{(š†þÑ^òwêv³àfëUÜ:“i»€NqW£æ–@˜¯È_+ŇðúXð@ù•~J¢?ÿJú¯zƒ0ößýWS. -?Eb¹ûLTzp/}B²Ñ«.W¦Km^?{¸$¡ó‘—žFü—‰©ÓSg#Î`1úÐ8ƒa÷Ósþ:p^PxÑé†.ÁÎÕ8m¦þ|Í銱Ñó{„?vÕúÊcõ¯›+Ø»o—RLiSõß6Ÿ*kgG|Z™‡Âl¼žþêÖ ¨¬>•¨‡B˜ä2íÛtåµr5Í^á©PÉ»tuÊ׋JõíËOâÀ´Yŝe`u‡Á¡à Ÿ{Ýýq¦ßu8š g ?zs"D<ÿ|w¹¾Ø}püÜãËn&½XåŒ -\W™w&U¬'èW/U9mª•+_#ž}mÜ.ráŸ2\†V ®ô=ÄØH3¡7›0 ,Mìïùv«&Ë0Y¶Ë¼¿®±p¬ãQ¤O•ÙÁõ"Ÿô܅\8¢kKÊ|`l ÀSa¦#ì­8¸T-–úÉ~ƒ?k ðúKEõù¸}¿×ÇZK~Æ3ן!«j4Ìçù]ÓkbÖ¨]ècÍ9= ‹_0úXÛ8ÜŠF2>½á²îÀmÐk|ê!Ý/U}¬±—gŒÀ|·2V>cXD|JŒç@¼ßéaňîSÅkâì¢Ý)°Âå‰ÕÎ^u‡{Z Ü׃гîÔ¾“ kÛíÖP8šå#„päÚeê©}a>"7w«w{jCo±ËÛ²`Ñ[ õ™# ±4ñE딓«±’̧ë¢g€•&VîDT+[üˆÊXáܨ×côÛ ­5wêaÝI£‡•Ù|á^ÏÕۇVd—¥«yƒá&ÎÎ;=&«5öòõݱžlöbîuVH4 CÕ›;C¬njRhŒÕfØuûbõi°4lêžð]% Î[€8¹Öbm&K/֗ Gƒ5ÑiÎ{<ÖêûœPõµ€5ߪq„qšf¸õ69?»Oèb½õ13C¬…y¿\Ôà -ÐÄo^¬“¡X½á²§à{cD8]¬þUÖëÝ{ý¦„°Âíԭᾕ±žû9¥µy¶éL£”.Ö^§õ°B ?Öµ…‘ßXo-`½òö>Ÿ¾ŠºXŸ®>„©µíáöûEîÉë{ ûhu½úXïZ“ïçJΧÁ**iìƒ ÝyÙö»ž°Xÿþ'§µUð2oE2´îp«ßÁ„ÖTÝùt‡5y¬ä)WS/ž+fóôƒXý2Vˆ†—P­³¬÷s³ì¬—Œë—ïá\À:Oû4šÇ…ÝÞÅֈ;ï©«±†vrƒòâඬh†œïg `-°[rñNóX¯<Հ†ÂÎ"ÑróX?¸Ì ŠÐðDö>ú³õˈ5¼-ñ`²éúX‰+3»ò -X3÷!õX돥 WŽ7 j‹èÕc³©îÙ¼µ!VlKÜ¥]§ÏÜý5ÀْÕLq°zô_DsòS•’f˜RÊýòØ|¿Ñ}}C:sØõ»Ÿ3xêÎã$Û>Ó{ -Eç)Aœ¥ó -l°Í”õÁ*‘$ÎqøÔ¿ýtºu›ÞÓ“l}ÔãAé¶FÒ*Ÿ®Ÿ#I¼ÀvYrޒ -Ñ©õÆÛ×ÈâÎ@åáÉè}v ÚuzÞ¼ø© ÜÐyÙlô‰ô “q·¶ƒ¦º¢i댲ò´ué´ÑŽÙôç¢LãE¸*ž¤\Äàõ€Ç_¢Ù;~íOeh^#ڈĕÖ~­õÈ|~]a×ÂÜx$ uccårn»€¬t¿•…N%|ʯ=£®VFü¥ð”ª\À_gƒÊ[0ˆ‹ô譂ûJßlåaÈ¡©|¾z¡øÄdY²Ä5A½{ØO˜•*¶Æ,w»‰_\ _#T~ˆÐ±–4†Š??ˆÖ4T¾öØF¦ú— ÚëŸu·Xó>Á-ÓúœTŠ“j\\žð͍5áѯ¥ë®3Â+¼Ñ}O½A -#D¿ÈçŠì#éÍaôª×½5ŸC$¡·ßð.“&^ʏ0ë;d¥è ?µÎj7zsD­§àyAI[°½!½°±ûçِ¿dæR0´1Ñ8yî®[­ 3Ò#†¨>Ö -ª X é•scI/z ¬´R¨ú^^+1ˆã‡DÛqF>«xõƒ­I0¢ú4¬5\‚±¦¿<«ï-N¯GRw¨À_oÊPíùªÐÏn¨—§RŽë.O¯áà¢çÙFÓ|phyªÆ·=¸÷3ÓÁ!Z»øµdÔÈiÙ4ÐOò¸¼.4.}ž ¬ÕZC;¤“ßt§l{H•ŠÝ¥õ¨bwŒj‡\jC¾¥ä´*@óþs0m°qÆóªGh Ý}/1O@bh¿ ´rèÍÈ Ð¥QҚ8ˆÐÚHž6mŒZ»ú„8´º¿$!µ2àÑ@5Àÿæ ×ÛÛ»‡Šû5ámh³Y…¿‘ˆ¢ß: BžÞ↠žÒþK^­iú–ù1è[ä'RzMßè3Pòh¬3y†e¢i¦ežZk¦¼þȘ*=c)¤Þ#ík6„¦Ú²&·LIÅ j²ˆ•Á¾“šÖ®ÒL2èþÀiN/8°aŸ$‡Þ§†Ý’Í<{}šž™hς¼~­•IM¶õô­þÆmÑÊÖ³7‡hÝÌSŒ¤½‚ƃ¹Éª”<7»B³rKT xacMe^J4+ƒo‡aªÅî¡DSK·Ý‰&DÂv‹”ž_‚jﶗLՆå,›Í²èÔô—Ë[…­«¿&uy& ešl}oÔû!ËsR|lJÜémÈiܕ}wÚ¨;æÒB¶ÓÌ Tk/íÆŒG“gõ$ĎS¥ò5=úƺ3¨'VòÀ¬'‚ÕYß²:w% ꉞ‰¦ç?¢^]UzîÇvsáÖ¨Òê\«²§2hÃýA™«ä©p»aÂ[–Í5t„k;Hý…5…Ò3ºìvk«OöD@cip}_, -ä­OÕµ'áµ#¼ÊÜßjF(mWÂW8+ëAŹ¥ù`§øqFÈ{Ò/ë]¤F®û÷56ÆO_ô8‚w -w¤—áb×_éb”>½âÐK½Ò/9A­©;~³±áœ[Ç¢nä•nL1 :úܼ;²q‚÷fö}ô<# -V®³E WP7Zû~¯Áy çÆ:"PZ£©w„(¤Àò£ØùӁCºÙèõ4Æ­e(zžþ‰ÙàC a¶ô ¤MŸÙ%\bÛԑb;æ ­ -ª„Ú̆©Ð˜ÚÌnhÌlE0ÅÄÒ֟‡Ìý™]òI›^Û¬Õ0ÛÖÚ²’Íô⺵§J5„{-­d8¸c¬›†V+îÂÎÜ;Õ -ÑN[ËîWQ½!‰{¶‡¤ÕöD*ç͖Vî! -a4áEE¢²‘ò30s!’võ’˜Ÿ&$ê*?¯Ç¯N -ãzîhý\ÓÕ§LQÜ6òHÞ}wC3j´j·WM4 ¹úƒÐÂ6׍u”BÎ ¡Ë€ª…́a|4sJ(X6ûR;›fPŒwØ }–â6”÷ɲ9 •"Ú:¿¬‘C¤›¤Ö€Ái,’v”nì\»k$'Y캡EŽ`@Á’±Î顋÷I·#HGÒMà4k@‡I7ޓF€ÞÅEPúºÛo‚·VÀ(î1,ð’*f0iYÌÐÏF;¢ìQF9T¶‹ÀBgÜÀMÎû49c†¹{dt=÷´‘µ=vøÁ”*ÃÝî Ch¦Wë´º/k zG-Æî}K-ƒTß+~›ÂÆPp§î(Y@è ¬ - JØæF¾% ã$CA›ÅÖë@Û1N¨VŽš¬¡/o@G?>ídýë)G9ÊdÚáÖ?pÁtó TN¡mý éº˜†ÊÑ,r ¡a‘§ÔùÔړ˜-µö´“õo¢ÖžŽbý?*Ç­l;k@úúÑ\9 òô6²“~4WŽhcå²ÐèÇ­œ{©N:ãFÊQŒ ˜§fÉ©†òtìÓÐeEEK -‚Ê+Ó ¶} [So‘ì@h¶V¦ #€Š[†L%¯šh+㕾½‹kê2=یyk·aµNaŸ1‹yï”ü‡ú$¬VŠ3¬PÒQS/²š²‡6t㬉šSãø幕§C‚m -ÿ.‹l;4)=Ï͝'»©½ÔϹÉÜì”Ç¡qZË~0åÅVÚ`WAËÐÖV¦¯ÍÀî(‡ÂšL_ eÒdX¯[Ú>™D“•l¡ÜaWÑKÉVŸˆ®ƒPuNÎÃyž#Ӂ5zMg0ì£Z>€æ8å|æµ|‚q{x9Ÿy-ß :æå|æµ|'êÒÅýËùÌkùšã”ó™×òhJ÷.ç3¯åƒ¶ÀQÊùÌkùN¶J÷,ç3¯å;A¥‹G(ç3¯å;Šý.ç3¯å·¾.ç3¯åãݨ=ÊùÔ ÐƕHk­Ã®ï+ >ã:°‚ynۙ` Øèc•+~9ðZ„·ŠUþŒÝ€TÛ¥M=Ý?@ HÕ¶¿n¾SØvç¯Û •L§“í2ŸíT6ŸÍz@¿aŸ w -M v¡nŊuŸý†,׍]Âkkˆtútb»Ó"lfÒ' vÔ6ô.õ{;‰4š—sh¨jž_"ìFÙL1ù¬î¹Á'{Òrû—àéáƒSÛõ†é<–ew;å—Äv4ëϗÖ²r£,Ëîìå—ð±Nژlïॠ½¶Y(¦Màۚ_mV|–ªiÙ¦ü"OŸ“&DßÓ¦sLÈu¯6·²½Æš$ +*w´Èy4 lÚÔ±FÿvDeTC -ꔑý‹{ŒP•ÇÙ«G{ãÌmŒj -ÍNWØAΎjòš3¬¿,ǸŒkäòÜՍAŸ”f¶Ì{Ð-ãÌ{iúLçPÞ¿™§Ï­Ô°í9TG=õ*òí.ԚuMŽ”î6ƒfqPƒŽ [5ó*]‡¹•ÉÑ,*vv$šñNÊ>DÛ:°ahêxq’Ñ$Q%XÇð/&uÃò)y#_Zö†0¬Š(Mð{k“º¥?ØÅù_²š»Ò]ä:9·ÖþàVDØÄ4:É"Rz9uíc»ý¥‹+O·Y¬Kö¶gI›A<©k7VŒ5ã²?RÀš"Æ;•†äЄ»Í -öôô‘=S×,÷ÝólÎìZ˜‘vR[˜×z•ºŠ`ŠŽ…i\›µÚ¥@_:êØ¢VÏZ—em%'ím§>YTÙª¢V¤âKÚX%ø›U©,H Ä‰*jCº°‘ ée¥—UšŽCzÝ8J…äÕ#nž‚ ë9ègt5öŒé eéšgÛÜ¥×— -.#F]7?ö Î:ܐ4=ùÌf‰ŸE^–drX•ø–0Ï«5Xâg§³,fUH/lªÇÐöÒê3·fC|çÑÍ÷RfBÚÛ1Ý«2oÛ[CÅyǮ̳N»>Jež-N;¼2OH†Õç»2oÇdØ}+ó´.®PœwìÊ<µ³c•ºýÊ<«T«#Uæ)ÒG ëDŽP™§È¼WçÙTf¶+óLæ昕yz;…öö…`ÐÅö.߉yÝaÎF¶S/‘öÔ¡¼êåVâŞRàqÏêmÂe>ÂѪŠ*\¶çf1¤q±M¡Ålx@‡ÀC‹QíF©vyvJ±~4—k3ïm¥XëlÂZ:³MÚ±HÖÆz“±oY–2ÖY>Þ)ÇTϹ³L3\Õ÷;®¦: ù§qÈ5‚:9Pû2? Ǧ‹‹í²Õtøz„P¶•£&fcÓðç¡©Ï;6=΍—i&m8B¿&俳4³Un·ÒÅÝ®ƒ:¼Höýç˜E²Ú‹dߎS$‹ŸÆ6¡*±€ŠQÂ¥% Ý„¨~”²8nÀfw°£ÉZt-ÙÐÖG䠅br¬eþ’`ª«ÖcÆØZÅdØNíêò ÖãaEy[jÍN®z˜vŠòNlv}pQžfyfý–ø©r.,N¿XÀ¬ÄïGÂID;Và‚Ú>q_ËfÀªP¶Ø™8Ù:þC=¡a[¼&ɰⰏ)‚)&ê–®€%~FlÁë›é®B¸èž¿JO—«UÊ'Çoãdå•èušB˜+5«Ìçeÿ²[™ãåRøæ©rFÝt*WþN÷’þò'À§Z´s—‰çwbqçO+¼rBQbEº·]‡–º»’Îè:£.»;ë½´•Ñ.U)Z>S~{1*»{6+öƒ7â†XÑeäXgð&ò£+ô¬ŠýÖQc¬ð&rC¬ð&ò‰\v¢½§ÐkRv׎GXÕuhèvn «ö -=€Þ º0(€óšûdÈ+F4rò¼nû%Î.bw•/£²»¾YÙÝyÂ+µû³Wƒá¦ê­Ù-i„õÁ„ÂwžŒõd«Ø«V õԞó*ˆŸ„¢Àï2l«]´ŒiJI šb_¾LÑF;†æª²2£~‰Ia»íEì։ʔÍRý­ò{·[@Ú¸W½ËT±ºçÀR…‹J¿´qµ½;жOL7Ïè2..*[d®jöÏ £ƒû_¯·Ý§æF“àŒëõô¦o‡°ÝÖ©m;gjÄmYœ—®Î4¹ÛM™­­Ÿ;¸ïÍz†#T˜fwáY]´b5B!x_±‘«m³ü”¶sNJ]Â[åhÛ_7´Õõz зò©œÂãöéUõí³±(ìÓóŒÃv{öéUõ™ÙÐ{öé9-|€ø¨…}™Ç.ìÓcŸÅ鋊•cöípF×!…}jBòU}ÆÛ«{öé)'1}ÄÂ>½>iólŽPاWÕ'.Ï=-W½Â>½9<á39faŸ(åfñ‘ -ûôªú *V)ì;ˆhö ûìí…}zU}ûÍ¢°O¯ªoÛN;¸°OÏ&=Ñ«ú>¬°O¯ªO£¤Qا·Ù"ùžÇ+ìÛðrê²rq÷(ìӛk󍕽 -ûôªú¬ôÍ…}&¾ç1 û4ä°SP¶OaŸÞN4''Ù«°[øˆ’L»òTí%ÅìÄÂî0,TSé駌\Û° -ìö y¡»RQËX)lŒ\&Óe—7j ¡“ؤì"~°ºÿoÿâ9áò?³<»öºËÿN¶ïX1˜‚ƒ.ÿ“¢¦÷ÿÙ¯Á4ȹØ-zïËÿ4û7÷ÿíV*¥sùß>AÈ=.ÿ3B*ïÿÛ£^JBhlÜÿ·gIôêÑvø]ëÆñj<®2÷¶ -rM‹›Ä½50¾ŒçÀª›uÃ0¿CpiYÓgœÀg?»»qðµBAßv¦±^Œe½£Iíò8H›C -rՏ‚qmÅÐIjڒ¦ör»¤©½”5Ÿ07ÊÏHóÁº¹Ù´J‰ï5Õªs¼T«ŽÝT+‹LêöÒV–•BLïÁ;)Šlʲ€M@6u ™‹ËÚy)êA9QûíQi¯fxH¢FtÚ¬öÕ9~|wi¬¸Ov;ÞB+›×ÎèÚ}IäZÄV6ºB™Ró›‚å -&§Nê:›f%ÀŠójS¶Áw~Ë}O{ÁBX‚ef×Û.ŒéÑvÍ £t ´c]îØ£åŠC¤;·uݒB̬ïP/A X²€M@»Í'¶ŠËå˜÷ìŽàß @ꢎ/#Ò,M Ł›ÅÐ&óm•P¸¬ cl®ÇÝîý3ÌL¯þ;FIªÂ;Úz4¹÷oSý{ÿN4…˜[Wÿí±Œt’6öqq÷¸÷Ï@­ÉWÿ:®­Ú¨Ý.ëÛíÞ?QØجÝØëÞ?ÛÇ·Ãܗƒh(É´³@ ª¯­Ï=ў¢h¿Ú—<œÙuTƒ)€æG¨ö}ÿA¥¾êݨ}Y¿ldtA@TûÊ2 :¼ÚB1=Ûn·êû'óê{½B* 6[Aõø¼{Ì ÏŽÞø$œ] ©ú ͵TVÕrÞý‰âÜA›©;ÚÎÞ½Éò|¶߶SH…ˆ¶S-•iIfÈÐÏ×ó=j©Ü—=c1mn1ê„`·l²…=‹± -"í©1Ë!Ë«ÒmYŒ/²Å(™‡Ôݖž§º²ÈBáDçÌ{“Ê4 ¿ÉpÇGonÊ![…ì6NÕ öª¾íÔÝjz6܍²uà~—ajrnÑ݁Ǻ óE“œubZŽmf»ÉË ý B±Ü‚sÃ0Wø_0ؽJ¾T^‰—nåµÊŠõD÷¦\ - ËåR¸óE;kQ],Ô½bQêò­³ÇõâMU{3®ÌKÝgÚJ†RUæù³Ã–n= @Ã_Mw‘sÒF%ÚBDUÜ(lˆ#º¥{µ£©‘SV«i±~™]þL+°J¥jhüÕt?+ W[#{ž6³Wӝz kä˜ÍóÓôŠóü¹ìÒø>“+c/ozXOЩVˆÈKãòGŒ »]C¬®&5a¥V厇º$ðþÙkõî­fHaÕ½ŽV´<Ä÷[S Ö¨€}Ø=c³]Vn'ƒ¦±÷¦-1o›o'(ÎfB?eD\ÄÄf¡U¦fñ傞úÓËΔö/ÿö!ym½K†”éµnV)6Ú`ŠqYԏaŸ”ž´ní–b#핝h/¦©’¸¥é“t’ÓàöŒ;µÝNÓ§ÜX1&•ÝÄ-ÃmŹ갅â¶Cݘ}.<4܉åýž6/<4/<9Æå'¨Ðô¶C9xà…‡¶’a¿ð0ozÛ¡œmwà…‡æËXåFr᡹æÓó=÷ºðp«4BuÛ¡:çvç@„|á¡õÔ,ë í¥]|áaÞô¶Ã“Ýï)ܧ*XLÙûÂCóÛ·2ºö½ðÐ<]íÄâ>ÛšïÇÈ9P^xhîËñŠàʳ{¡Ó^šïóˆRàà ÍS¼ù=é#\xh~ÛáÉoÇ1/Êæ·*­Îƒ.<ÜQ -ì{ᡊݶn;<ùmï{ -w9oäÄôžÂK.üÒm‡‡—’¹Â÷Êã ¿ðÐ<‡V Ú᚟<¢v<¸ðPUøµ•óq¢-ZÚ÷ÂC›2íÐ Mu`ù7ǸðÐÜà?ÙážÂýÎÿÑ&‘vá¡ʶǭ«Öv½ðÐôŠBdõ ›/<4O3@™)ǸðЈÉøÛ—i…‡æƏ”daUlu᡹ñ£É~ØÿÂC5ÁµE"ûDu/<4‡¢¿µÇ…‡FPìÞ*oóÂÃÃ2ºt.<ܧT_Š@zááVá•ê¶ĆJëQ÷¶C…L;ìÂCó$*9ÏæÀ ͽ{%ѺðPÝ1›Ës÷ ó=m_xh~Û!Z7Ç*¼2¾íðDçhý½.<ë»ô-ÆEõêAšé+é/<4/cCËó§påMo;Ô!÷¿ðp_ËfÇ Íoä¥À.<´×y؅‡æºB -©jÕE3ڲݚ1“NójÂàXV¥e㎞§çaMDØt/Ô"ß_þÉ4¢¯ ‚©C^.•ð,•)ËHLKw¡ ú±+¥tiVX™æô¼y7Î`Ø}Š6Óçb“&Ë0¶èôM˜ûpð"ãŠ>ÝƋñ„Ÿ^‡é é®S©´ïêíüõÔyÍyEâ!|úò™È4ç]¼˜¯:M75]æO?95'…ù×Ý´AuÒé»÷úO¯ƒ¯ãÎô~¶x¬…o7½~Íëé÷Ë~ï÷Kü»µlû³ãµÿµÀ1›a¢çÎSš¢ÃØù4 Ðx_›Ãž?í¿õäΗMlt±ª0ÌU¦íô}Ôn‘RkáÏcŒÀ®òÑ}"°Ú}‡ÕZwS†™]™Í4ïf݁»ºS¨üÌÿTý—©»78'ðPmT€‡U{É>ÃNnΰp‹ÒNÂÜô©2ÃäY®òJ›Äeñr(_‰JG½îÒσL/D,€F ×u¦ç?La•¸s>Ý5üh¸ºcÝ|…Î}®‹çöy*»(]´;µ÷Wçú2–vÝ&üҕŽ`ªÞ«ÁdÓõ}‚Ê|ü{J\Ìì# +J€ªi1j#¬¬\F_ %»!CˆÒ–äÁ©®ßUã*éθèH¬úTú霯R¬'†-:þ@€OÕjaüˆ•P-pqxÿÕەšh¬‘Ò‹¿Ê¯ot.]¾öäÛ3h#¿¸Øžúõ5^ýÌäÊ32ŒÃ ZU‡óŸ4~ž#ýú(€…ÉŸ Ôûç0É"_*ô’žG¯OCh³G”ógnä*aáx̋þä‰V Á7?ú,ì‡ðg!ÈÿùÁRô)zžË}}ï[&…lÓɀž7<Š~°Õ—ôÀ'?@¨òÅ@zP¾ôˆ¤!åƒÉåXz€)ϯ§âƒ;/+^kž’ôµ_ѾöJ‚Êë ¿ "~‡Á¢©%^O4ðÆF? ¡sƒ…Û_qI7Ùbãé©/ft¯ D !UBÓ…n - 'Äx I+ €‚ù9>âè ]—øó-¾íÌ£àݮߟ?˝Á§ÀGw…–Ht¾4ƒâ/ÍWʟO¼+a2çÊLVîG"W}Ëâ\0 jÏ÷J/jyqi7Ó ‹«2ï ¤¸d<ïMê>ª7£ê•ëÑ¥I0®gœ¨FnSpàyF"ÞEÿLàï2& h¸´°-ě@×$àåÁcùàÓ3¼F4¯½à7œ7ÕÃÏH>}ó5 £â§Q Áæwþ€@‘>‡…wço˜øé—º3à3ºšy¡GóQT~ùtFûh¡D¾n.„Ñ̗ $7¢¥T4•¥>½ãò4A´J‹ÔYJ¡µ¤êañ¤>~hèï¼ÈÇpÏ! ë± øîÃkxÁ>‘¸øi‘Û ë›ûŽÉÝh„Źáóæ³É^ðô–øº½H#AuõÙ$vSóÇÁ|}$üÕÞs½ØxÆÎz_m´j¶Ë’¦Îh2St4µïƒØ8Óïgg ÷YunŸëÎ`*Ðwº×]| -6œÁb”rú±&Ôè='0”›NßÏEaR üò »öíJ˜Æåãe¥û²ãC,€hŽD'\¨˜ :Ÿª$/ì(²=’ºIè9ÁS½êü] ):…+R ¾ùÔ¼ ˆ\]"ë|WA¯ê™ -_âi­q"¬o„ǯ1q¥y]ª(,œy€$y– Ç“¸/ŸAñ51zCÆM?<ë¨ä…#¤áÊMŽÆ@cBfšh÷-J‹Ó¬ÂӊU8Khö¡l #¬üonÑýۂê¨A˜n‹ ¬Uk†±ø q%ˆSˆˆS2/lîø‰ÂŸA†!Ïóùø;+·ªp¨Òꍺ|A¸žÅ‰ -vÃr10A¨e5¿ÎàÃ$F€®Îã+ ?Å¢¶u}}åÀë‰ -òV£.g®žµÉ́Oè5†‰c»´}À,4«ïU!‰52äeäëî«ã¿Šx1Ü?/”AïÜQ (”–ð’ÌD‹_Ý&hêK1ž©D¾²£F -)¼^H7áFA{ˆËˆ÷-XÛ È¢ ‰ÎkP¦í÷¦ôZ t̟ƒŸ ìi#•‚3"“Hr< ù&›ûðv掰<Ô1ÔüÙ=Œá…ˆ·NÄAŸ.óȀƒ«5‰–1LMKÁOQÿ&ïs,#\_.…°°É^5V&ÚQ¹òÇoŠºàE'ºÛíë®ôuûTNWSÃ@•ùÌ|f_›«|mÑ{†¤ëñ7¬f×S?<ãE%ÏÜp ~4`á¼ è IgÁ ñ›8[—Ë¥¹{õ^ %Ýl–J3óbgãœ&êÍ*IºCMõut:E²ô© /5/菲ÆT·5Ó|(dªÔ¬4÷xî«õö ‡ÔO1\¬\/g,QYà%Á[ŠUf`e>pÐoºƒÅ©?¿q9÷D õMã¼ò^©Õ.çÅn%ú£7fÃCa9„$ò("žZ>GJú²B‚[e˜œ±UÿìuZìöž˜QG€ÑŽ_k‚ÛØ P?E*¡Pî‰èsx!{3@„·Au€†'üU6ïÚ{Î÷æ4߄ÝÚ<@êo䊸ù³`„s_nWPy!ŽyÏSÆVV¥V»ðATâñ¯b7ûíAæà[â`÷œrWDHZ”?H¢£å™ìûªv§[àH -ìKsΊՋK ç:1ó¡#4;Œ~—¡+ØMQ®ð+٠ţO«Ì¼Þ¼õ½«L}Ä*rú„d*6ãî:[e>­øbðyžµ[…0ݗ¾î""}Ïéó‡Qùã欞ÝLòR(Æô€éí«Ù¥„¿9hÙ[°à : ÉpÎρ¨ýyÏD˕~±[þ|·»ì…#Šö6{XÛiEݨm ˜÷P8ŽsWÁÔB -tÝk~Ȩ¡’68lësóe·§í-åmˆxрÚI³ï®ÖU]GT0ž;Ži;¶)cÈi»’{§#OÚlÌzì¶;jèxì6Óºëë`N;Ԋ㙘–7^”³:a‚@å!Ýÿ;§ÿÕS€ÑÂènàŸn?øpú‡!ðôþ4 £-§{ýxî ü¬aÎ-Œ€?"Dòð׈5x&à 8¿Ü0˜ÐS8 (Ջj_ú¡—rÁ¯ýê;ñ#²ðj­ByF¸˜BÏý 7½ -ty!úúY±5É5mbç•ñ=û€‚ƬóÃ]æáòõ Ù Ñ"㬨GmZÈOã±Wɯ꼰ú .<¼Øµ1ÂÓ :`ŽyÒúc¾¯Œ]ë3(àÿ°¿Ö£6+ùÐû›”6PÃ}ϼ]ÝИ™”%÷N3mHp¨Ö°&©µ»Z•8íHV”E! -›_iHÔÍîòöˆ{„s)7%ݟçy7j7êkñÛµ´Y|€–qú>ki¹y¶¨ < 4äOXëÓ)w‡¹„Ó{÷š†Ê¤• Ö¸ãÿô¹ÏrP£ 8tê”|‚ê§ÿ$œÞÜÜ,†±lìWè…(€û>â×ʧÕÈ^i‡ýñkµ³1•ü=ªÐk\^ƒ¥ØuV¿­©mUû? oô´Ý®¨­ ƒ)ҘQ–À/ ÜXé å{ç•íèɎCWsZdØ÷²ïÓ~%ôðŔǗ«Áq,+~omG•»;§ëäÜþ -žÓ®Yâ6x²À.ëlÏ#jÁr§í"XvZdvdší™6^dpÚ.‹  ±Xgh‡^Ó`’Dt5If>Ú·éb=‘€GåçJ¥¯»³;ôgºšÚÀôÑZ|ƒwªO¥N³æ®Åzü1Ty%zð'Fd\t%S9%°C‚…Æ{G áˆi×GŒhüª=֖éÁ~îìÁžôþ¶UßÇÖÜÁɲ»´ÕÃxäÖãëÆÓtÌíÈiööjB-ÆӎêiüÒÈ­™§‰§ÍÓ¾½âinƼI? ©8ÅhRãÈ ÿæ¾L‘èÏ>¢¸ ¿õV:ÚñP-vô åz2›¯fRȆº]ÙÝí)Ϝo^ËÈ­Ln~¦á§ —)gøTÑÒóhcCóòÛD*勻)®¼b¾ÞÇw¯?k¥–4”<ÎËϑ8lî®fŔí´‘ö^×`d¿^mTÃÜßf{ö/í¹Õê¯bH´û×+?Yü蔳^?Öm¾ž}’KÍku§PÒ8m,Ú¬~7ó¹$ɪ NKsëê¹3ÿ¬}»z·`Fœ6æDo–ÊÃî9ÝäÐ'Ҙ_yžj¸M֏ӆÝû›ü $zïË,êÏ=sçÖÇÉ÷©§Yk'ç¥R - E´þxd¸cðV -‰„’f§o¼ùgñ÷éü¢™GMfh!vêÖÆ@aöƒ`òÙ|òúvßuêÔ?”Z{õÇöj³öícð›r±ÅRx¯ý%/ûéÉbe¥ÊWy°’½>“0þ«9¥¸÷éu¼À|7¥¼[ù ˜q¡´èbaLÉ»X¨ûcèºî]¢üû¯d˜ Ä 盳VyÃÔ<ãÅ…ZegúíÍÒ[ë÷7´o¶î$•ÄÕIgZ¾è¹8¥?ørö–?^öÎ3Ä{Mèû†×þô¿âz ïÅ6S×)ww¥eƒURšâºáU¸ÆŒæãêÓµÃ8çJfM!«z<݅ÎÁ‡}u¯ýkWO­Í¼E » ONÞ³KÜQÓ.¨…k#&Óh ¬t¹V³§—×lw«¼¸i7)j0³¸wŸšß®Ò]بä(˜Í%¾l¯o”ÞƒŸjO¯E«S•ø«¹j»w9/y#¤—ŒÕ90¾9êä;ºx½ãâlàUíj]ç5’)X´ FðÞ±¹vó–‹ÞJþÀNMË ×PÞ§–]z3öTgæ#?ž 0_@Çrõë4¯7îWU¹”Ô /8t†P¦¯Õè½Ë6Ýä ãc‰%ݜ'•tH›òç³¥E^¼^߀æ³üãÖ«ÙÕé?žž%ì©úØTUêèKÕè·_}Ø(_ìw–yñêû;«{¹‚gÒvåâ`_â±Óµ7K¼Õq×åšË°B’Œ -+ÒêXxϱhã½g`­ËŽƒ—?•œ9‹üøóÝiI^È ÷͑º|QŒÉëæÍZÝðx8üX’… -H’¨øˆ^©„X6ç‡ðeG¿ÀL—á¡ß%_î½è>íw­´@ûÍõ]ŸYÜt帺גõæ•(âרúìê¨à¹¼pŒ‘p,q‹7f£ÛÆòþñœúZ3åíd3꣓(|W / ;…øÞ¯¼= ÃĈãßôbï—æâô ï‰[Ä°ƒ¾/…?4-íz1Ž³º ‹Nõ»Ë«K¥˜|úЫ+qáƒï@ÝÝ,¦[Ü«•gx³0…wÒ×e¹©ðRq;¼ÅüµD›ö(îî¯ó‘Ô|Ê©Ð@……Q£¢£úÕ*}(Ô{ì´±!¿ª›Ê§‡,º‘_Þ_)EUhxÑ]ˆŠXl›ú½ÚšZž Šß¥IhR?›yzX`»ü쎰KßûåßîߕvÞöÜ÷;æ T¼o…±‹[¯ÂÚ ‡qɀã8ȋËpš»ZQ‹È‡»Ty„×Öñ|ýtCLR børµÃÕ§ÇÃï$ù—‹í–úÄÏq-wõÑ:XÂ.LùÞRÞºjZÔ¶õ¸©:?.îE7Ö$ Ä¿íüŒ~s¢Mq¢Íæx÷U-:ŠØ¬^™ç³•/§gÍú§µW[±‘B¥Y°&’¬´ªf3­UTŽô.Hõn8ê·2Õ˜æ;]Vž~{(Ô§zû"zÎVÏý~]‰Ña£Úö·•úÕëÓÊæöÑÌòÉüÒ.ª×wx :Üwnl`ÜM$Ž"CˆÖæ¹õC ýõCÛó%ê! .† m—¨‡PÊ-†PùçûÉ Onø"àFyóñªÛÛè]œ_Üs“o''ʕ5Ævn:·+½nw»û÷‡úíéãu÷æÁX0ʕ­Úښ/êÝÓÛNטSùûžõ%.QFŠÝπ–|X­Ÿ«—ß6Ûõ3kÿ}:`ænû&>7äõšSs -Ó)U Ð¸ŸÃ¯ûŽ ùÌÕQimÍþVïöªË¥ÏÍÝÔ”vwp¼½ŠU -–w«ÝÍ¥òýù;™BV?¨øñöóÍjñzz«ömíª¾|x\jK[([³ô÷¢R$2¹!§ÉìvÅÅÉÕ^Í—ê8¹OÚsó»sÕJ« ¶0Ññ¹æ¶B¨Ÿc. a+ :y®¹0„­€ÃŒm.ÞÀ×.‹0éE…À5’uš”ýem>>oÄ¢†´e¾4MªæDþʗM w:ƒ¿:øuú…}scÒߘEUhM®& ScoÕ¨às&Óφ, ”)iWÚß,çõ'Õɸ]îX9žñqí‡÷鮲]¹Ù¥ÒOÕÃÙïÈÐd)œîE -nێ˜ìX_ä“æœVበ-lšTÜiù¨^¤Oí׿SÁ§XG¡®Ø ™â õnM~RUµNÎUs"ÓèrDŽ>V¬œ/_~3W -ô©ý¦¶Vqjs­ŠSõ`çCl»^ž;¡2;š1ñag¥Q±|V¤ÄB7Õɵ®3åÃaY–sC·l–>-},Ñ' ó‡s[ÂÂrr::îÁuãª~6u%¸–Þ}ØsÂÎ7þeA$SÓÒø{ºVÞ]äUú‘“»G\&µKÝÓxƉê5ÕQCl¼zS÷ç_•V5©†“ùzw7Gˆ¾Ig“Ð^^Ü'Œéˆ–q6g[wê©ö/Ô÷û=`mK`Pìµ"ƒdß4ú Oþ0$Ô(’1s6ó«¤üûý[3L£á3K¯¾©Êw5sN¾¯]ò\ùbïÁ$[ðbn¡$‹eÚoÞ.Ì«8,Ý]­š•®×Ò·“áâ5ÙJ‚èýb)DúӜ²^vä±À'PÞïÚñe¥#¹5–©¡½ñ‰éÅ\º÷r¾vÇl4Ȋ9ª¨U]­Í¬ýºõ¾®Ñ#hhý$Ó¨1¿‚!Çu½óƇMt‡¾ÎÊDŽÉäÛ§°†hÌ# /\ò¼è¸S ‡°¤PZÜZîħ@yiï>QaÊ«¨mŸ8‰¼ -Ñøí—ûø9Ì«8žJwðxòåWœÿ¶Àôÿ˜IYÜ¿ŽR@v²) ûú iq»’îÀ^;Œ;؊’é¢-7ñÁJk†¯«í¶úýÜÂ(OQÁÚ¿fìòu UR,£: Ò«òhÏ8,—Îå:Ȅ™uà¿é©W;ëZÖA:û¢P˜}ñdցyûܬt(G:€aÒÙ(ê÷[Žt:<nDDØKa.t¬©ÓÁ^úZ((:´?l$è°pŸ—Š3DÎdôòkùÔñO—ÐA°ú¦ LªÒSqÔÛè´ä™<†ԁdè˜)Çê#N(êÛÎfpËGïg‡Øý;#¥m¼‰èl9¨ƒÛs&N,s"ôòí(/l¬‰PIê!S¼ä¾Ééc {>DAçͺ”Ð#ïó‚Λà ŠHD}èì9Ž°)è¼v ˆ6ìŠ${æ ñ­ûñ…û°˜=ç¬õKX+輙à«ÉðêÓÓ‰ÙstÞTG…˜=cÀ)ļi5ê['aû7¢c.´V¶«¾ûßRICqZb^N+!gVà´a¹µsÚHû6A´aa߉蜖 fŠÓM$æ´Ñâ´b?NššÃ)éW3õ£¯ª~ÿ=ÙÇlJŽŒÄlBI÷%Æ`$†‚RIÂCgÏqØb6¡¤Çb³ÏPÒÒ%¯µLg€‰üÀûZXõèýìÆ«¹â¥€ßÚÑ„÷8DkÃKÒ­Ö£S+­VÂùrz¡[wlîüü½<,W‘­Ë×fXŒõúÁ² -fY~•iêÓÏî¬:Ö,ªHdìj˯ …ùUM–_›ŽêãlgáAJ‰5-X¨‡I~³< Žçþ³æSk1“÷µy-&©ûÏkeýDàíy%üa#®Ž.^Z]œÕŽ0µ¡Á“Ö~ІFŸ6Ã,ˆ˜£y×ßî>›LÞT‰«Îë!ÕÖ_Wužf£ -ÏÿuUç)“Jž™.óªÎÃ0qáù¿®êüdX ÏÿuUçu8ùëªÎG!ÉÕKWÏ w\uÝãäá÷Œ^*Â[œŒ^¢KÑrﲬ|¿'©uñúËt$µîC9c’ ¤¶›pÈ*Š_”Áo~¾V¢óhô»E§+øŠ,MmÊH/¦µÐaKÎ+@ñ+>^ÖÞæII+ïå «Ô»5(X›ºSH¿_’B¡ ( B, -&Þ©qW³Â“O]œÉ£¶IuqXÊ´p’ë%ýðSåçÍS–ÄêÝ*¢õ8ÙUG! ÉâÎcq¾æôO8ñ=7xŽÙZ¾éèg˜žÐV÷áñN>"ZÕîùÅM³ýg·79Á úcÁüÛ Æ}ƒ _B›'“ù´ÁŠFoÀ´Ê•ÞCýâôáâö¦ÝûÓX°½Ï͝µº±`ÐÓ-xú­Qœ¬<?åñi 1mMNXFÿÚûcrâ1ü3*w܀¿ÌÀñ§ŸûÃ`–ñÙ8üfIøqsrB0ÛôØK(—C`Sځ Ö»ð¨åUsÚ¬ÀL6·ûÃB ½“¡HÚ[ Dˆš8—¸V¸•BRÓŠô•Â"¥ €ú¨6LŒR–œ\ G*KÑ+¦##Á–rÓv™ã…t85ò¤X4ÿZfRCÆ+ôR,-ŸƒºEð$K„@@ÒrdñWØ ‹FÃA»A 'δlË@b¹Zÿh_x°°‰i‡ÀÄÄu<$$U``‚T¢Å§æ}€–¯Šx'¨£¬Wd€R_ãôð‹%¤*V³G–ö¸åÅDJl~rÙÕx¹•–þ¸ð¤¤E ’r0jÆ lÙ ¸œ{±¹Ê*¤*d _ < ƒN¸pm’8–"?Šb±r&"-T4 s è›cD@؃\î®ÀBþ*8®HÈl2^]ᆃ¥¦ýíûŒø]²Art€µwÜ°ðÈÁ¡8§åá:€Áږ àé+#5P'…€¦/PéƒÐáÜCi(S,,/ÁMtò¤u« ’#ø.žÄď }Œ™BWàҙ$&• ÜrŒ{$æTDeÁxSǏ ړG…ƒZHuÜ>³Éø†qY M%p܇Âq0´Å‘©`_aÌY"ã -‡  Öò0^Šþ> ¼;ðˆÉÎðJ Ô( e„V¸\‡€(e^4-Cɑ“@‘‚f@àŸœkäW͛Pëø>E™m…ë‘m'÷ÌÚõ}d3жkkYJi`?‡u1ÐËÔpŽBV—V ‘rÑ<8lá’ccˆ%j¨€ ï´Íâ»qpݱo!Ⱥ l‚êu`AT||Д7»í«Ïmáïø°Q¨UÖVÕ:nŸÝö®é·b,®PÝ·*k -Å­‡?¯º­¤ì¢]ƒ¢?dþ³ÄùVÄ!•\]bø"‰È”D| QHGAÚñíëdü—Nˆ Σà 0O.=g0 f*0_`“Û˜©»™1:®Äa0Š-lð¾à Ø\6:0IÑêgE+láÛÚs඲@Gû*+<5éq⁠ ® ÔçàSáƒÐÂwÐÝA™‰™56¸‰ŽtL±`i|…%Р '¼h©®ˆæ.CÒ E--_¤)—9†kæR¿9P<:Š˜ð‘X…X&7Q ×7'UŒÀc%‹á@9éb$o3 cH¤œ”1¥€ÓIc'mlª5VòSDÉܜ0•FË‘É C*åd†•2¹aDŽtvAÇÉ{.‘žŠê†¶„Ù¡ÜGƽœ™—6b䎕1“0û†Ì>ÜÙ2‚BJž2ÐîGùÆò]‰ >Å0T-²Álr“[Ú0@k¡Œ'ÀÀ -È&ŸÉPp4U-=Œ]p •Ás.C󲸈Åa iŠÍè1’¬2C!‰P§PEQméS’Â\ZjjÚ$õ½˜<µ|ª½€ -å «g$þávÌIöÓÁ#¦û!ÇKøC"™òMÇMúC|ÇLû#É3Vâßsà…ÅFBé…2$íÃäåù!xÌL?]nk¹~'Û/Åæ@×c̜?Ý1ë/òÆÊûK8 £eþ6p*÷od×>åsô%÷¿ÝÝxŠAžðmaG<’²Ã³¦zÚ¦¯%y1i¤†~®ºË¸*F‡­{—ï½è¾Ú¨cF¡rƒ “ç6òHXG,JÒŗ#áK’¢Û®+½ö5¥bF ­‡ÛޟG¦öé•ýà3“s_È´°P9>­#Áš &ß—Gl®š÷k=Ère{%9e£\»½9»¸Â}i?ü ¹QÆiVn.ÚWí{¤j’†£Ûę*kHW½Î“Ö<ÌØ2´2k°Æ2Ç£œCZS©ƒ³Q¥ôשŸ -ÑdӚ[©Äæ©ÖK¥6à _<¹¹õW¥7OµþÑ'NqÎiú÷¥9çÅér+ßI†ØìËÄCû‡9Ò}s–#ƒ”ù?&üDŽãÿVy¨UþO[Ue-Ì󮪭ylVõ I=8??9¡?kѳòÉôsSSˆæv¯ Ôz~ßþ[×hßÜà»wð“qÞëރ¹Ñ5îÜþl5˜šZÞX™œø?ž‹uÓ -endstream endobj 6 0 obj [5 0 R] endobj 24 0 obj <> endobj xref -0 25 -0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000029195 00000 n -0000000000 00000 f -0000031822 00000 n -0000088050 00000 n -0000029246 00000 n -0000029600 00000 n -0000032121 00000 n -0000032008 00000 n -0000031322 00000 n -0000030511 00000 n -0000030760 00000 n -0000030808 00000 n -0000031468 00000 n -0000031582 00000 n -0000031702 00000 n -0000031892 00000 n -0000031923 00000 n -0000032194 00000 n -0000032368 00000 n -0000033545 00000 n -0000055932 00000 n -0000088073 00000 n -trailer -<<5C6B5E0266BBED4D88B3C749965F7285>]>> -startxref -88269 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png b/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png deleted file mode 100644 index 0bdea555..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/icon_black.ai b/net.mograsim.plugin.branding/raw_files/icon_black.ai deleted file mode 100644 index be5ef960..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_black.ai +++ /dev/null @@ -1,1414 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[5 0 R 22 0 R 40 0 R 39 0 R 67 0 R 66 0 R 94 0 R 93 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - Web - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T01:30:22+02:00 - 2019-06-22T02:45:18+02:00 - 2019-06-22T02:45:18+02:00 - - - - 224 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AF/8AOLv5/m+S28g+armt 6gEeg6jK396o2W1kYn7Y/wB1n9ofD1pyVfT2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KofUNQstOsLi/v50trK0jaa5uJDxRI0HJmY+AAxV81eTfzuvfzH/AOcj NHtrJng8q6dHfDTbY1Bmb6tIpuZRQHkw+yp+yPctVV8lRySRSLJGxSRCGR1JDBgaggjoRir7e/5x s/PpPO+nL5a8wTBfNlhH+7mbb69Ag/vB/wAWoP7wd/tD9riq90xV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKsx2AA7nFXxR/wA5L/n4fOF8/lTy3P8A86vZ Sf6Vcodr6dDsa/75jYfB/Mfi/loqkf8Azif/AOTt0f8A4wXn/UNJirx/FUXpWqajpOpW2p6bcPa3 9nIs1tcRmjJIhqrDFX3z+Q/51af+ZPl3jPwt/M2nIq6rZDYP2FxEP99ue37J2PYlV6hirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfKf/OUf5/8AM3XkDyrc/BvF5h1GI/a7 NZxsO3aUj/U/mxV8r4q9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVTnyh5t1zyj5hs9f0S4NvqFm3JG 6q6nZ43X9pHXYjFX6EflR+aGh/mL5Wi1nTiIbqOkWp6eW5PbT0qVOw5I3VGpuPcEBVmeKuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV8/f85M/n6PKlnJ5R8s3A/xLdpS+vIm3sYXH QEH4Z3H2f5V+LqVxV8WkkkkmpO5J61xVrFXsH/OJ/wD5O3R/+MF5/wBQ0mKvH8VdirsVZd+V/wCZ evfl55ph1zSm9SPaO/sWNI7mAmrRtsaHurU+E/SCq/QryV5z0Hzl5btPMGhz+tZXS7qaCSKQfbil X9l0PUfSNiDiqeYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkn/OQP542f5daF9S0 50n82aih+oW5owgjJ4m5lWvQbhB+03sDir4Nvr68v7ye+vp3uby5dpbi4lYu7u5qzMx3JJxVQxV2 KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXpX5HfnNqn5a+ZBK3O58u3zKmr6eD+zWgniB29W MdP5h8J7EKvv7RtZ0vWtKtdW0q5S7069jEttcRmqsjfqI6EHcHY4qjMVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirA/zh/NrRfy28rvqV3xuNUueUekabWjTzACpNNxHHyBdvo6kYq/PvzN5l1r zNrt5rmtXLXWo30hknlbpv0VR+yijZVGwG2KpXirsVdir2D/AJxP/wDJ26P/AMYLz/qGkxV4/irs VdirsVdir23/AJxx/PibyJqo0HXJmk8pahIKk1Y2UzGnrJv/AHbf7sX/AGQ3qGVfckE8FxBHPBIs sEqh4pUIZHRhVWVhsQRuCMVX4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWOfmB590DyL5YuvMGt S8LeAcYIF/vJ5yCUhiHdmp8gKk7A4q/PX8xfzB17z75oudf1mT95KeFraqSY7eAE8IYx4L3Pc1J3 OKsYxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FX0t/zi/wDn/wDoma38i+ar n/cXMwTRNRmba2c9LeRmO0TH7B/ZO32T8Kr6+xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVAa9rml6 Do15rOqzC306wiae6mILcUQVNAoJJ8AMVfn3+c/5vax+ZPmdr6flbaNaFo9I04kERRmlXenWSSlW P0DYYq8+xV2KuxV2KuxV7B/zif8A+Tt0f/jBef8AUNJirx/FXYq7FXYq7FXYq7FX2F/zi/8An9+m YIPI3mm5rrEC8NG1CVt7mNRtBIx6zIPsn9obfaHxKvpLFXYq7FXYq7FXYq7FXYq7FXYq7FXYqwD8 /v8AyTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdirsV diqpBPNbzRzwSNFPEweKVCVdXU1VlYbgg7gjFX3N/wA45/nvB590kaHrcqx+btPjrKTRReQrt66A UHMf7sUf6w2NFVe1Yq7FXYq7FXYq7FXYq7FXYq4kAVOwHU4qw7yP+Z2h+dNd8xWGiET2Pl+SC3bU FYFJ5pRIZPSp1RPTADftb02oSqgfz+/8k15s/wCYFv8AiS4q/OrFXYq7FXYq7FXYq9g/5xP/APJ2 6P8A8YLz/qGkxV4/irsVdirsVdirsVdirsVR2ia1qmh6taavpVy9pqNjIs1rcR/aV1PvsQehB2I2 O2Kvv78kPzk0v8yvLYn+G28wWKqmr6eD9ljss0desclKj+U7HxKr0jFXYq7FXYq7FXYq7FXYq+X/ APnKL8//AKqlz5C8q3P+lODFr+owt/dqdmtY3U/bPSU9h8PWtFW/+cHP+OV5u/4z2X/EJsVewfn9 /wCSa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/OJ//k7dH/4wXn/UNJirx/FXYq7FXYq7FXYq7FXY q7FU+8j+ddd8l+ZbTzDok3pXlq3xId45Yj9uKRe6ONj94oQDir9Cfyx/MnQfzC8rQa7pLcH2jv7J jWS2uAAXjbpUb1VqfEN/bFWW4q7FXYq7FXYq7FXhP/OSf59x+S9Ok8seXpw3my+jpNMhr9RhcfbN DtM4P7sdvtH9mqr4jkkklkaSRi8jks7sSWLE1JJPUnFX1n/zg5/xyvN3/Gey/wCITYq9g/P7/wAk 15s/5gW/4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FXYq7FX Yq7FWa/lN+aeu/lz5pj1jTyZrKWkeqacWpHcwV6HwdK1Rux9iQVX6D+UvNmhebPL9pr2h3AudPvE 5I3RkYbNHIu/F0OzDFU4xV2KuxV2KvLvz5/OvT/y28vcLYpceaNQRhpdkdwg3BuZh/vtD0H7TbDb kQq+BtU1TUNV1G51LUrh7q/vJGmubiU8nd3NSxOKoXFX1r/zg5/xyvN3/Gey/wCITYq9g/P7/wAk 15s/5gW/4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FXYq7FX Yq7FXYq9T/Ib87NQ/LfzB6dyXuPK2oOBqlku5RtgLmFa09RQNx+0u38pCr740zU9P1XTrfUtOuEu 7C7jWa2uYjyR0YVDAjFUTirsVYX+bH5o6H+XPlaXWdR/fXclYtM09TR7ieleINDxRert2HuQCq/P jzd5t13zb5gu9f1y4NxqF43J26KqjZY41/ZRBsoxVJsVdir61/5wc/45Xm7/AIz2X/EJsVewfn9/ 5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ//AJO3R/8AjBef9Q0mKvH8VdirsVdirsVeveWf yOuvN35Ky+cNAR5tf0u+uY7qxWrG5tY443/dL/v2PkxCj7Y260qq8iIINDsRirWKuxV2KuxV2Kvd /wDnGz8/JPJeox+WPMU5bypfSUhnck/UZnP2xU7QsT+8Hb7Q71VfbiOkiLJGwdHAZHU1BB3BBGKt 4q+A/wDnKHW9U1H85dbtry4aa30ww21hCfsxRGFJCqgeLuxJ64q8nxV2KuxV9a/84Of8crzd/wAZ 7L/iE2KvYPz+/wDJNebP+YFv+JLir86sVdirsVdirsVdir2D/nE//wAnbo//ABgvP+oaTFXj+Kux V2KuxV2Kvt//AJw2/wDJRzf9tW5/5NQ4qwL/AJyj/IH6s9z5+8q23+jOTL5g0+If3bE1N3GoH2T1 lHb7XTlRV8u4q7FXYq7FXYq7FX1H/wA4s/n48E1p+X3mecvDKyweXb+Q1KOxotpIxP2WNBF4H4en Gir6xxV+e3/OSP8A5O3zT/xnh/6hosVeaYq7FXYq+tf+cHP+OV5u/wCM9l/xCbFXsH5/f+Sa82f8 wLf8SXFX51Yq7FXYq7FXYq7FXsH/ADif/wCTt0f/AIwXn/UNJirx/FXYq7FXYq7FX2//AM4bf+Sj m/7atz/yahxV7o6JIjRyKHRwVdGFQQdiCDir4j/5yU/IR/Jeov5n8vQFvKl9J++hQV+ozyH7BoKC FiaRnsfh/lqq8IxV2KuxV2KuxVlf5T/+TT8m/wDbc03/AKjI8VfpTir89v8AnJH/AMnb5p/4zw/9 Q0WKvNMVdirsVfWv/ODn/HK83f8AGey/4hNir2D8/v8AyTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9 g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdir7f/wCcNv8AyUc3/bVuf+TUOKvdcVQ2p6Zp+q6d cabqNul3YXcbQ3NtKOSOjChUg4q+Bvz5/JTUPy38w87YPceV9QYnS71tyh3Jtpj/AL8QdD+0u435 AKvLcVdirsVdirK/yn/8mn5N/wC25pv/AFGR4q/SnFX57f8AOSP/AJO3zT/xnh/6hosVeaYq7FXY q+tf+cHP+OV5u/4z2X/EJsVewfn9/wCSa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/OJ//k7dH/4w Xn/UNJirx/FXYq7FXYq7FX2//wA4bf8Ako5v+2rc/wDJqHFXuuKuxVJ/NvlPQvNnl+70HXLcXOn3 icXXoyMN1kjbfi6HdTir8+PzY/K3XPy580y6PqIM1nLWTS9QAolxBX7Q60dejr2PsQSqwrFXYq7F WV/lP/5NPyb/ANtzTf8AqMjxV+lOKvz2/wCckf8Aydvmn/jPD/1DRYq80xV2KuxV9a/84Of8crzd /wAZ7L/iE2KvYPz+/wDJNebP+YFv+JLir86sVdirsVdirsVdir2D/nE//wAnbo//ABgvP+oaTFXj +KuxV2KuxV2Kvt//AJw2/wDJRzf9tW5/5NQ4q91xV2KuxViX5n/ltoX5heVp9C1VeD7yWF8orJbX ABCyLuKjsy1+Iffir89vO/kvXvJnmS78v63D6N7atsw3SWNvsSxt3RxuPuO4IxVIcVdirK/yn/8A Jp+Tf+25pv8A1GR4q/SnFX57f85I/wDk7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/AIz2X/EJ sVewfn9/5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ//AJO3R/8AjBef9Q0mKvH8VdirsVdi rsVfb/8Azht/5KOb/tq3P/JqHFXuuKuxV2KuxV5t+eH5NaX+ZXlswjhbeYbFWfSNQI6MdzDLTrHJ Tf8AlO47gqvgHWtG1TRNWutJ1W2e01GykaG5t5BRldf1g9QRsRuMVQWKsr/Kf/yafk3/ALbmm/8A UZHir9KcVfnt/wA5I/8Ak7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/jPZf8QmxV7B+f3/AJJr zZ/zAt/xJcVfnVirsVdirsVdirsVewf84n/+Tt0f/jBef9Q0mKvH8VdirsVdirsVfb//ADht/wCS jm/7atz/AMmocVe64q7FXYq7FXYq8U/5yN/IiHz5pJ13Q4lj83afH8AFFF7Cu/ouf9+L/utv9idt 1VfDU8E1vNJBPG0U8TFJYnBV1dTRlZTuCDsQcVZP+U//AJNPyb/23NN/6jI8VfpTir89v+ckf/J2 +af+M8P/AFDRYq80xV2KuxV9a/8AODn/AByvN3/Gey/4hNir2D8/v/JNebP+YFv+JLir86sVdirs VdirsVdir2D/AJxP/wDJ26P/AMYLz/qGkxV4/irsVdirsVdir7f/AOcNv/JRzf8AbVuf+TUOKvdc VdirsVdirsVdir5q/wCcoPyB/S8Nx568rW3+5WFeetafEu9xGo3uI1UbyqPtj9ob/aHxKvmv8p// ACafk3/tuab/ANRkeKv0pxV+e3/OSP8A5O3zT/xnh/6hosVeaYq7FXYq+tf+cHP+OV5u/wCM9l/x CbFXsH5/f+Sa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/ADif/wCTt0f/AIwXn/UNJirx/FXYq7FX Yq7FX2//AM4bf+Sjm/7atz/yahxV7rirsVdirsVdirsVdir5p/Mf8gP0N+bXlTzz5Vtf9xE2vaa+ tafEu1tI15HWeNQNoWP2h+yd/sn4VX0tir89v+ckf/J2+af+M8P/AFDRYq80xV2KuxV9a/8AODn/ AByvN3/Gey/4hNir2D8/v/JNebP+YFv+JLir86sVdirsVdirsVdir2D/AJxP/wDJ26P/AMYLz/qG kxV4/irsVdirsVdir7f/AOcNv/JRzf8AbVuf+TUOKvdcVdirsVdirsVdirsVdirsVfnt/wA5I/8A k7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/jPZf8QmxV7B+f3/AJJrzZ/zAt/xJcVfnVirsVdi rsVdirsVewf84n/+Tt0f/jBef9Q0mKvH8VdirsVdirsVfb//ADht/wCSjm/7atz/AMmocVe64q7F XYq7FXYq7FXYq7FXYq/Pb/nJH/ydvmn/AIzw/wDUNFirzTFXYq7FX1r/AM4Of8crzd/xnsv+ITYq 9g/P7/yTXmz/AJgW/wCJLir86sVdirsVdirsVdir2D/nE/8A8nbo/wDxgvP+oaTFXj+KuxV2KuxV 2Kvt/wD5w2/8lHN/21bn/k1Dir3XFXYq7FXYq7FXYq7FXYq7FX57f85I/wDk7fNP/GeH/qGixV5p irsVdir61/5wc/45Xm7/AIz2X/EJsVewfn9/5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ// AJO3R/8AjBef9Q0mKvH8VdirsVdirsVfb/8Azht/5KOb/tq3P/JqHFXuuKuxV2KuxV2KuxV2KuxV 2Kvz2/5yR/8AJ2+af+M8P/UNFirzTFXYq7FX1r/zg5/xyvN3/Gey/wCITYq9g/P7/wAk15s/5gW/ 4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq+3/+cNv/ACUc3/bV uf8Ak1Dir3XFXYq7FXYq7FXYq7FXYq7FX57f85I/+Tt80/8AGeH/AKhosVeaYq7FXYq+tf8AnBz/ AI5Xm7/jPZf8QmxV7B+f3/kmvNn/ADAt/wASXFX51Yq7FXYq7FXYq7FXsH/OJ/8A5O3R/wDjBef9 Q0mKvH8VdirsVdirsVfb/wDzht/5KOb/ALatz/yahxV7rirsVdirsVdirsVdirsVdir89v8AnJH/ AMnb5p/4zw/9Q0WKvNMVdirsVfWv/ODn/HK83f8AGey/4hNir2D8/v8AyTXmz/mBb/iS4q/OrFXY q7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdir7f/wCcNv8AyUc3/bVuf+TUOKvd cVdirsVdirsVdirsVdirsVfnt/zkj/5O3zT/AMZ4f+oaLFXmmKuxV2KvrX/nBz/jlebv+M9l/wAQ mxV7B+f3/kmvNn/MC3/ElxV+dWKuxV2KuxV2KuxV7B/zif8A+Tt0f/jBef8AUNJirx/FXYq7FXYq 7FX2/wD84bf+Sjm/7atz/wAmocVe64q7FXYq7FXYq7FXYq7FXYq/Pb/nJH/ydvmn/jPD/wBQ0WKv NMVdirsVfWv/ADg5/wAcrzd/xnsv+ITYq9g/P7/yTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9g/wCc T/8Ayduj/wDGC8/6hpMVf//Z - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e - - uuid:29dab8d7-5b1c-014c-8e3b-a6adb016ac80 - xmp.did:66A6819719206811822A897E387FE54C - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Cyan - Magenta - Yellow - Black - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 99 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 96 0 obj <>stream -H‰|SÛj1}×WèVž‹®` ö6.B)Ý·úВ”?´ýèh$e×nŒÐŒ4šsÙñîãlw÷3ØÓ»Ù°õ÷ëÉìÞûôÛü´¨Gh9$KÁ~»hÑŔ"ÛKÝ|$‡T$Ë>;Î5þaͧí{NÒœGŒk—)¢8È,o4c -RDÚn“ÜöCæ+>SJJ¨îÊÈ£dHRÅä|ô=xÇ´=…äRxm~w/ìš!Ø 9-¦ÁUOfúZÃåÑ%QlD—…z—Q–‹ÙÀ ü,+I,ËË’¬ ÷³Æ"à ‡åÙW‚¢K9‘í[?E” ‰Ïìˆ u˜ÚÚgYÇ©1¶¶d¯hZmͱÈâûÒîBèyèy§«ï£Äç~Î #ÄJy8@!ÞÈGߥæÞãVè95GûË[Žr’wW~ŠŸzÏÜóq_㲞)ïyco·uº¶—²wX¼Ã"sØd ªƒJð±Ý©éZªÒ7’Îý<ý-iH©VhÞûý´\?i•Q힪ï>9Ì,¾Ëøùp0þÏÌ zwlù`S‡yRKY ›ä‹ïíDbIvùn¾ì¯'Dµ {•ÒeÔ/8&Keäuʶ À›é:^×½ÕcÅ:LìÒ~Æßz}xX>˜»¥ýÏÿ0J‚ý -endstream endobj 99 0 obj <>stream -8;Z]_5n8N$$q/KmrsR+pb-FV*b(FC? -endstream endobj 100 0 obj [/Indexed/DeviceRGB 255 101 0 R] endobj 101 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 94 0 obj <> endobj 93 0 obj <> endobj 104 0 obj [/View/Design] endobj 105 0 obj <>>> endobj 102 0 obj [/View/Design] endobj 103 0 obj <>>> endobj 92 0 obj <> endobj 106 0 obj [108 0 R] endobj 107 0 obj <>stream -H‰\“Ûjƒ@†ï}Š½l.‚§=$ Bb*xÑMûÆS¡®²š ß¾ëþ!….(|̎ÿÇ0†EuªL7³ðÝ͙fÖvF[š†›mˆ]èڙ N˜îšùNþÝôõ„®ù¼L3õ•i‡ ËXøáŠÓlötÐÅ6Aøf5ÙÎ\ÙÓWqÞ°ð|ÇêÉÌ,byÎ4µîC/õøZ÷ÄB߶­´«wó²u=7>—‘Xâ9†L3hšÆº![›+YäNβҝ< £ÿÕS‰¶KÛ|×Ö_OÝõ(J¢ÜÓ´ ½§8• ô¥è‹9( PR ځh’ž’tZ)N}BZ Æc_Ï äIäqäIäq JAH—HçH—HçH—÷„H0 ‰IpLBb¼ž¬å O O™IÌL`f -3°V°°V°°V°°V°°V°°V°ðTÞ3Ù˜ òJx¿÷ XWÄm2{ì_s³Ö­ž_w¿së¶u†Ä8ŒÌu­Oð+ÀøJÏ -endstream endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <>stream -H‰š a{ Áÿç÷  J `Já«Øå -endstream endobj 112 0 obj <>stream -H‰\U P•×þι÷"ˆâ‚ˆŠ>|ˆ ƒJ 0X%bjô‚hAÁ…ºcM£I´Ö­Æhš8­ˆËCͤ©N"“ŕb\f´©©UF¤1¼ÿö€N›ôÝùßîùÏv¿³\€¬†BÌÄÉÏ é³G8§äñÌ,[ä<Ø>¿ @=6 -JfOۓÛð;8¾œ]´´àü£E‡€ €áͅù¹³î. < -¼4Oô‡ -ÃÿÕÈþÙG/ZriÛGËdÿVT4f®ê“9ȏF^*Î]RÒ9§í{Àn-òÎy¹Åùۚ“ïË>Bü7•,È/9z:dp 7àJ×Ñ&Xð³vZC%Ê°§o•‹îdYÜFµe¶Xë;dNcI’Xm+2ҒœH„Ó4ë{ö*9KÏNcD;OoiñŽ`}º‡¼{©<ôÌígÏ×-Z-ßmŸ1|­Åä³çé/CÖïZÿ3(íé³PblÆÛÂJP!t~=²­ø%þ‚Ló­pñáÆQ›Vb/1X´âpùØÄñ*J7‚0bT%­A´XÉÀv„à¢XhüeœÃ8^´2pNÍðs›óÖµ&{(žôœÇCê£a¿f֛]æ]´Ç÷*ÌwÆ 6Å¢• c…D°²y4jޔ˜²$†r|„s¥¡=è„WDú×؁ñ .â+|CD¨?­¦«ToÁWcטq&ÏÌG -^F:VË×0êKc8Gå¨ÃêšïoöÓKlg  K°¿Å&Tâ®ã&)öç ÎT‡Ñ£‘ƒE .á²ØüV0UJQ”IÓh%½Nií£Ct„¥p¾RJýJ¦íãovš -ñÛ=¥6Hfâ0AòY‡r¾ä¦è -G±[‘nç³í¡æ%SnΚkp¡ŸÈŽF²œ9 S%ê¥x 'ñ™èÖáþŽ JŠü©“`á$½B“i±Dq˜“»Jþ⸈q½ŠRuzª>â;aÛÇìǶ1•ÆkΘó­ù&~’$¯¢ [3ö¡ø9‹»¸'âÃA½%ÖT/çÝ!öoS³”“¯âClÔhµIÕêP½Ã~Ù.¶wØÇM¬I“ÚRÒa¡ˆ•5Rª)Ùb{ ¹%3Ç¥zðˆºQ/Š¡q4…²ÈC…4ŸJ¨”–Ó -Aµ‚NÐIj ›ôˆ5;8XpŠâ™¼†·ò ®á¾« &«,Uª–«­ê„º¤þ¡ƒ´[Çè4íÑKõ2 –rtõ;ßÒ\ìËóíô±ÙÉö/ìõvµÝ`m̧æ8#1fc¶Ä¸Rοñ¾ÔÇA‰ñ¯¸‡FÉùw‚…¢¶Ô]"îݚ·$‰;M"ŸJÙT «æ -þ«©’ŽÑ):MÕTKçè -Ý¢ÇLý Y£¤ 2¹@ΰ“+ÙË×e=á«HåVCÔP• ÁôÆ` %HT2­Žê --?Õls Y§ïY¬®ÈM¬¾¤zHéÜUÐÅá’}=”÷8éÀëRùÓTÄé;jÿŒo -¯[©ZÎxE|’öH^â¤P:½«c• -#0—·¡—p©çLü“ÖP°tn“ä&‚  U ÏD=gKÖ/Q'D«¤N‹±žÞ‚›|tçy3†Q¾ú¤9Ôן©ù!U©TTQ“®Õµ¬ÅRµ #Ó#Q*d¯ÌˆLéÌp)U‹ÝRÿ¯Êœ€Žü„VpæÐuŸöñLD¾ZÈci»ýDQC±?É4IrŒðƒo…éXÝr‡$H5Ζ;¦P߶ִÐêªúÞd›p{†ÕÞ¾…e‚NªL·õÒK©¸A]i:M҆Çkc¦ ’ê[&„ÚQ8.é0ûCŠ§ã¤R@“¤Â§;*|ïèõúu½X¯»©I¦æZlÁNüYn“äÞê'8N4§Éì™#wD †ày9]^”©4N¾¥cŠÌSLÉÌC©LÞßãªä†/xL½ÌþB¹¡–c•ôÿ:l°ûq™òû*œßà³\Æsp7Ôç*‘¦ ^¿©Ë1˜DÅópÉRoÑÛ`®Š·è!Ó?VºTêÞ4šsÀwQìí—Ø·8^D£# ý1‘~ÐÝÉJLÊÊÌH|!atü¨‘#â†?;tÈà˜çE»£èß/²o„«O¸³w¯°ž=º‡v éÜ¥s§ŽAÚ¶ ðoë×ÆaiÅwŠk¬Çéôxu¤+55ºeïÊFSXc*ãuzZŜ?•Lɂÿ“L|*™ø_I -rÆ#>ÚíLq9½uÉ.ç)gR–пIve;½[é´VzS+(tx¸(8Sº&;½äq¦xǖ¾•âIsUþI®¤|ÿh7ªü„ Êâ*©¢j%8$edÃ/P‚òvw%§xC]É-xUߔÜYÞôIY)É=Âó£Ý^JšéÊóÂõÆ«>¶©ëŠß{ígûÙ/ö{/þz~Žóž_b'qB$ä£ ~MHF¥ã#e6!•C@@7:R[ÚI„MPú`ÒÖ?¦}HÕ j7UzNYê„QåI¨Cýkü±ibSÖ±ªžV(+8Þ¹ÏNJ¤iÚÍËÉù¸¿{ι'÷š¾”Õ Y˘Ž!Ói-£¡»Aç•|ë¢q¡À£ý¹w@;0µ/cÚ¦²t !ën3C¯,…¿arq(óÚãVÙf ‡(T4Œ×óâÎÌãV•Òl怱¤q$gŒÀÒÀ‰£»XœÉfL|–TèNè®*û;¨ SMîyÅdµAí°ñ|B1L´ë¤:‰èóåÛ(2¬ãM5Ó²–ÚÍû‘±ëä{’®Hë-m­y^¨86ïõU®æqæàšÍâ¬î”ݵæYLiOAB˜Ê´H2쩇’ƒ=ȘînвF™ "GLv(gð}TOǛL#¯)Æ= ?]¯™ªjü=DYš'k©öUÞL¥Ì–š"Î!ˆ)`ÜjÉ]m­/Èí¯ÀpÚ¾ÊöµƒûU•ø|AGûA0gvf*²‚ö˳HoOeM’£–ÅUKàYj™Yµ¬ ÏiÉW}fLWbíóñÁÚáÃ}&þóÁŠ}t·6ºsoF6rUߎŽ¯“*öž5[•3k‡26™T9"Û,+$å¾µÎTÈp¦½>‡•Ô -Nd¥¥ÁʈÉç¶WhÖ­ªÿç Bù_t”õçËaU˜f_j½üÄ:y<ΰ`{‚ŒŽï5 ÷:ÛT Ãє#gLÊ3û5…׌y¸‚$ŒcùՈÊ çesäB6q÷A¶4˜×ð¹yŸÛ½73ÏÃsçÜxf.7C¹Ál¾l™y!ÝÒª¥J*(T@£}®Ž´¿<¯#4cYí–Â’§ Y:ת£é©èøÊB k!.¯Ó{Å¢¯ö¶ƒÎUÑÍTz7U{»ÀÂSËÜ{àJC•F«ÆÐxæñ|°™U0ÀbbÍ|U{YÍà ó[ÚI‹1Lj ô2§£YÃPàGƒù§÷d*Üoâ J­Ïš0¿iQ˜;K‹¼9³&0ö{5jHÌRQ©TôF³Ö ‡Eá0Àfá6`?ÄÀ9ÑHÞá,`î -성SƆܘ9›DX'ÕÍa$¹¾új8õ ¿Ü?Vꆿß?ƗúQº¿ÔO7vlT¡QÔCvôH±->Òô)öE„ÉäÊ#¸»ý^.;ôd3×Â&ä­u‹A‡ƒáCÁÚÀÖZfŒek/zâž½±€ÆÒºâäXi¹Ÿ/òK°\º_{{1%;ð$îÅî-›7Áÿ['\ëý"ýÏëÐâÉIÉþ_$9¯(9_x’èåßÖñݘà]š',¸¹+…K—W -×9· yâøé„qÛÊ#rªŠ¶™%lD"RÄN³¢#ä u»4àõÁu‚ HÝ¥<¶Š÷>Å»€-¸ëÐú qºDWg÷±«“$ô¡ $§þ+ÚÏN¬”Wލs ½Ž·_ºŒ·ß´aO|eТË_³}·ÕûX6ˆ%ÖփzÙü;Á~}¿Ì¾îzý!þ1{¿ÃΡ9ü[|ýþÿƒ½°!‹=ü»_Ù<[Ñ[À³ºO¸®µÛ°í–PÀWó¿§ ¥ârq µa#Ç''á-WÙÞRq¿íviŸ ’›üÜã÷ -ÓðE¦QòqæíWòyÀM+ÿÕv‡¡o¹vüî{"qk å»ÈV^žms5?ÉßT^FÉòç(¿òçsQ/ëuyÉBùâËwgë¼mtDKù®®53Qo½7.uÅ¢"ڀ“LM\óªbë#2LMdȇs¼RǛ ØáiµÒi¬È߇ؤ!£ŠŽÐ[‰ÐÐI}/ÙÀ'ÂRH -JÉ/1Ž¨\'ÇäzÙîH&š͉–„ÝááÜ˹8'Ç8l‰¸Ð #¥6¢ã”£QGmövk>UDz$Áµêh’‚†)Iµ@KF=Ն{oPÙõ€«•Òþ˜J ”c11/”ê:0IT"ó@$7­Q’ôk€bóC?[Lô¤ÛÜ@‚”«óK*äS=ŒÏª§£êÓÄÍ [C”TЭovx+o“ øººxëȅ‚ð9;A“LhqøA7o»lwNüÉÓßÝP7ì 7ú ±m|p|¨EjêýÊ÷.¥ÂM½Û/\$üh峟}û‰.õ='>Â<åãoôï9õÒï4I[¹½8ÿÒ́¸Ô€ÕEÙ¾%ëŽýœÍü¬è’ åºOp +ëòq‡lg} äÄáŸê,Ïq>þÖE¨†ˆ†à\Õë¹S”ý 伪½ÖÅIÄ•œF -‘›º|ñ˜¿FŽ¡(z߬dœïb?_*òËÖ/áx‡z_{ÛØ¿·ü›uÂÆ4iEYP7YÅI[§^˜ÕRÐM¾•X$+}ƒR¬¬üÓÏú$·K²?x¸/T+†ÃbmÈÞ±Ç! ¾ žø%x✥îΓL*£óÍ5B£=î–eÿ@œñ0ðڝ@nÔ^úpsº¸¹bìØ(ÏÃÑú³Þ*7tn÷½â=›<Ût¶ù­¦·š¯rWZØÑìâzZìÍZK,åOƚ4Îï¡ #}"ƒ_ˆ¥ ½ÉÕÔ"†ŸMYtÕ¹z¿ê[æ^B,òਤWXÖÍE -øßW(&tA½ë/Â@ã“5ä›ð 6ý=ä(jÅ?X=¨üýezN€›‹Å4¸|‰/âªgõ,¤+8m´¾A •D@ ë¨Vtª÷ëXlR=t§OW ÇÇSÙnÕª½Á@@íjèÞJº:!‹NGµ@W˚ã?|Wkp×¾ww%­´’vµ»zìZ¯•%Y’eËÆØ ‚DE8!úÙWÏ0HYüwÝì®·¨õ‚ ›¨N§–÷Á›‹#á,>ß/(eÆbû×îøFΚ®ƒýFFÓ#ˆ ”Ø“Ô°Ãá'òRÇk0{  3\ŠŒ>+¬¬j¢Ð©°¥3Ø1=âcn[„ªI5ˆŽás‚Lð3÷wÕo=síýÕ+fêQà^ÛûÒÑë×m`*î'˜d6åځ }'¾®ŽLÑ\¢"þò£·_xïÁã¢Ê°¡'EÈ® -|RŒ*p¯n-ÉáÉ!©_óGò7Ê_ÒíÕL-;ƒidg3-¬1 Þù Žï¡Â^<9œÍŸÖ-p‡o‡Y[¾ù Ã0¬ÌÈl”‰² iºÔ(µJˤ5R—Ô”úÂg¹³âU›Äak -£ -F´¶àBm¶&¶*µ²b_h0ñ™õ’å²UlaA\‡”ä€Óïò¹Ác ¡°Íá¢\‘¢Ê“@SqSiÂà6ÚmáJ葞¾²zš6eñݨ— %õf›çoÆz”ÁDE‚I¢þ„&¡0#+µ£?T_aÇv¥rOÅën[‡t!¤Ñô(XÑ`%RëaReB¯d -í$ƒ# ¼ƒyÚhµq6ʘd:J¡,~Ww¢¨4ø¬ o`–ÒVdMž²×ÆYêk½Èæ9Eõ1Í"†/¦Ä‘ïø‘’ ¥€oˆŸœPÄÂ/¡¿qÇTÞ*h"ý2¹ÞSý¹dåN¹%ÉMqÔEúŸLT|½^µ„ýÛÅÒfÎlâZ$ 2›Ìœ©•BÀ¨à™!¦Œ4/ÀÆXÍ¿Cºq€¦Á>(º3ˆvÓ¸n§_¤iZ•à×xüóÃÂåt))µiÔ3¬B›»§ ÀsöòRxvO! >ãñRܶËÔ"œ”]¹“¹“0¯("“ÏUºí¢GŹŽ"ðýn˜(ÑÆü3‡î@1TƒÕì5mô–ÓQS$P˾qÞPFè̺֧Y8¾Á™Íßԓ|è<ùKÉÅÀEíjäJ‰)ì,q};Øi*™LGZJ–ñ˔¥‘ç+x“¯ôU’iˆ àDm‡-n´ôá)NŽ{eÙçՂ¬GËgZYdƒîüÚodU Až%Pê$½ -£¶àBYØ_ µ£6¯ìï.ˆµ››Ä}¹%³?i|±PüFȽìƒÇ˜ »àéӞŒ º4OcÄLùâ<Ð¥ -y«rÇ?éÓ³¤IFÉìlð(ӆx'¤œ=MÊVh"æû¿øáΝn½sÔouõý„<sR™e薲=ü©çþÏV}Аíä|\⋽ƒcCÀÕ÷`—I·::núÁë'Þ«Kº$·›+]ä+o#rücï«¿8y)ˆø=AXW e–ýzD·/²µÛ^¶ï-é´wÙϼSp³€õÒ.ÆÞÇqSVL”€’h=GZ1¤m=@×ý)wV¾FDZ£¡‚àU©¸ÈG24‹Bâ~­ -ê0¤yDwÄE]Ü,^­¢T¾ýAðú4w4nžÂ–Daa<¡E9Öä½8Z‡ƒe4Î̯Y‘–L~­*Åãpy¼¤¼¼´D«j4²FóóÑqWVŠciF•†|ՉzV5RKz ˜èížÝüÜõ±—8ÃQäãïa÷c?“þOøÕ/IظñŒÿ¦[žU†²ÌÝ.·¿ uyφäü²"#²MR€Ÿ -˜–DžDJá'‹9>rVµ+‚™~ž­Xn£ œÊ¨“Ö5s,õ_óÉhñ¢Ž•m¯´¬R$Iû.«^ÞÞÒß°‹b̐ÆjÃÙ(.knúÞÂô?'ýkY¹«Hݑ~01aF%äÞ_!5xln‚ì=¦I¥’.-–ÖHÛ¤ïHT¶ƒ[. Kڙå6›f÷¤#"ʱ–wa8|.@:ì,.‚Õèï!jCœV«M -@ržÙcB§T.mœRmý—Ï€n:ç=Äpyö ¦…&6|i˜‡?wڇ?%˜÷EPö+6÷G=óðói¤BY3ÿ"údÒ¹hÕËÚÄ­âË"‚…}9f<¢úrLtÞ'q»5@NÕÍq ¹^ÎÂIÒôÕã…?aՏ]ñ¡G×û9^ïD©Ÿvh­"Zk/bh -ÆôZW¥«Ê9ÛUíªuÍqé®FWÃçÚ+ìgä®Bk¨pi j l£¶lTi ‰j -,¥l ºrŽá¾¡jPª«®žS§UŠ.<Ty°ˆ¿Îßå?ã­Ïñ:oáSNžw951¢Æ&4NƒZ*¨iJP‹T$ÌÉ$—„ÉT<™LĵŠ”Ž'× 5‚ÆT}c£^¯ÅÉ`nqQ~N€T¬R¯!Rd,dñ‡ÆBUVTD""ëpª^®”'<íèy˜›Tórñ8·=æ>¬#âj}n<‰ºÞº:KÔ;å›Ö㠇‚ÚÉ: ìt“ÖõµÃîLÇÉÏ&ãî'ŽZ·<Îü$2¿Ç0ÿLd( æG}k·Ú²"Qkžl¤Äzo‹)Àg÷c* ,pµ˜ ˆ ­­r ,ÁŽJXы¿þ×m›µlilA+ ð -üudyÇ+éBwc 5[Ä(ñ©s -(aƒ$S Ï$Ë̞ëÏë74´…ª¶V¯¬hnÆJ}í«Éâ¯5¤ŒÇ…%E…sé?à‹ùKÛÒ­M©TSÍüé³XÍ𘾤i]ú†ñ|¨qYNt­9˜ -HåÊ—!•W}zå-ò /‘—hx‚î"»h˪‚k¨µôZÙòšü ¿¥tƒ3ÐP^P ¬‘_Í$*"S’(ú$ŸYƒÜYf rgŠu:³XÍmÖ Žˆp8£9ÊSf!*­©"Áp—PQ’²R¨&ñ¼›eXÕ?$ —#Î(G¨I¸M!.S‰Lq¦GP¢ø_*ÏÿW‡9`£)š¤!°!ÁÉtŽY‹bF-š[ׯúØ&Î;|ïs¶ïlŸïîõù3¾;;‰“æà $Äé™ø)kÕ]VRHéPéšÐ* ƒM6ÖIãcPV í†(S骕ŒP jÆ`0Æøк…­‰U…‚(C*YaŠ¶J«íýÞ³C-ӒÜÏ÷Þ½Îïóüžçù©¾zñ­0.ЫŒ®nPÜiÅ ø9vÜÉ¢ÏÙÑcó7w=9'µÀâÃe"s³~ðÜ£+û'»Q‘+kºÚ«¢Ê~2áF]«fþ0{ë.‚€m)' á)?zÐLIŠMÁ~…9ƒÎðïÑï—|`g—Ú{Dz ½ÄÖãèázÝϊKä§ýŸÎº“áv—N‘~‚ëÓã·>M·¯i…¼T=õ$˜Õ0½Î H:kÂ6ք=}ìQv„ý½É–°ÃèʁHÐxÎkÍv÷‹…¨AtÇ -…üíP¨@(Äù±ƒ^ìÁþCù+”œ¿rÀ£ùN´µÉ+ØÎ`RÄáü¿LYˆfx ÅÁA±“Ïo˜¥Ÿ±c^‚—P,ú[1)20Ùq”à†ã\^ø&šÔ4ª&ê0ù§ ajbžš<•¦s£ÇOäþ¤ǑÜyy×®ËäBƒÇr7‘xôs7÷³‹—v¾úá%À¦r>éÞrjÍL'´$àjª‹:én÷S0a—º—£U÷-«ãÏã.Ø/8ÿ–¸Ðpýˆs™f•}³`X%bµl0Y FJcJÁ¥xéô–4#–,ºrW%Ã1€©ž¤ÎsU:Úf³SªQÎVè‚9BSk(Jç”.*í+µ•§<±y"ô“M“Ø?M[ÿ‹òþ½»ñ®A`¥«þ ^ ¨W»Ü"¨7ä?x+¿¹…8¦Ðed ÷l©IРûX±ú¯ßÌe\ÞôŽÕRÖ¸Öo\ô‘ü%&ÝԎn™ëq&2ƒ–¡º¨žöm ùç©wä3måóÊùÖ÷Û>–¯6^oûLkü´MâeV)iu¶©²Oñµ†Û6Æ^nüÀ?&?žêIõ+Sß36¤6¯ãý˜Ûl ©ô\GuU¼¢Áœžn Ýçj¡§ÔÇmuӏ‹á(F Ó§ë¢>“FM­Õ £WÌHÅ4]§ {g‹>'º(Úe¢¡Y _‰U>Ý$Šª€vš]}U¨*øÀL;ÃVp:ÿÄ÷ =G&² "ðÎCÕ£ÞìU«ù²ÙQŠ`Ü %+¶$I÷À·#œßÂ\j±Ì-ÕÜ&i‘r¹ÜßêS)#Ü¢¢f ŠÔK%P) uúý¥i𽐑N©ÓT -Ï­ØEL¸PPA-?Gÿ ¹Èáüß)þ՞¿±¿7ƒäˆ)éHj¢»ûad³’X -ôØ ÕÀPRD^¬ ´9nÇ Àí˜2òàdȦ·‰ aR&É18A£E¶q¶%¬|æ£#¿&0K^65¶Â;" M‰Š² -‹…S˜ÕdÐ ÈÀ)65oÝ Ƭúµƒí_[ôçS§Ö8|n"RÐßÞ·{×Üy¹Së9·m/S] -L}1R‚éDª¥º)]ä@|õƒKßXÞPôW@__ZŸYÙޑLjÏ¤Ÿ]C&”­à̆m+UC1ËþFîp(Lï憸ãÜ»ÜU®ä[žµž—=¿ðœäÏó¬ßìDAlh™ésØlvG y±Ó' -^QÂ%AWÕ0zÍ£FY™Ý@ˆb]zÇëmÃè—&®©q8µ -ý$ñF´È7"G#%à¨%Cè*ˆ¤­«TAÁa¶´FÉbÐ]‚ ,ò„Âχœ*Ņ]*EÂp n4Þá¢%ºÍ…£¶N~¼Ý§!€hxÚâԊþΓÍØí ¸µ÷oۻà -Ê f1iîì_Zò(j€týË"&‰&§(MÆX–±,!Š#^ –öcpN6nàaÔkò2m$Ō8(2â!ÔKÉÈiºM ÕK}Ò.é¬d“Ž A`T9ÒÁëŸVŒu÷_ëõŽ)Ò£¤·È_&L®+©«^÷Ýëêä#@9n³àVwH1i}×òî×dMt°¡žÄ£n=ŽŠÐ›1Ž¦Þý„Þ·9÷ÆW ²È u#j,Gu›¬i5T;7AØüK…i"PÄ:•ÏÛ^¬+™s_¥’ð¯eÞT^÷Ó¿Vúí¥×(?V•ß*—”œâØEïû/ãUÅq…ßìÏííýíÞþÜîžíóÞÞÚ·¾ßù8 [v𶍥U Ń¹(?NH„µªÕ4ÅRA•Rhƒ+¨”–¶4IEՒ@Š\‰ÔRhPKAj*ᤆ¤ -V‘J¢4ôLß®€¤BÝÑΛy;3»Úyï›ï£Þ¤è TuFWª‰qÔ¬ÖÆ´©+™•ê:fÒ«ö½Îv²“éWwh;ŒÎS̐z(ñCíêó’zD{•:͌ªÇµ×Œ×œs‰?ho%.jÿHLiùp¢&‘§ò‰¼¶ÇØãü*q:1ÁN(K¼GÞÓ>¢n%>ÒâŽÎÇýøšõã Œ_؈Ê~¼ˆbAEY±¢ŠšÎz®E6Û´]›¾áµŽØlzÀ¶)Ñ^eS¶}رí¬c¥ˆ¼ Mð»ùý<-ðõ|7Oÿ“'¿áÇù+žƒðüa–ç¬a3éÇm]]Á¨«K–iè#TB3Go?ä–T†6–aLUQð8s0,u#Ö ES×°j"´©&pD‚'“(í¾Šñ6‰›£’I7Ã@!tÊv¤“¦Ü tDÒ¦F»t¢Ÿ5È(ù®ÛÏn±Õp|Ùp²XÕ¥°2’X ñ²Ñánrˆsš¼ˆZE#ϺZb-嶴—)o卣\1^¦Fɋn”57©D=«0Ï)ø›÷J±Õ3'ÚÚË~7?ÛÅ×øWð-Î÷-.æYWJheÖU[w³ûY -Øn–bϐw é®œú°RY8û§§ qª’«^§ª_3Äj%©OÏ>¼yÍ{z—ÅKòÙðÍNqÊkT§½ >-¾ŽV¿ÓðìlVæóú}ò°P©T?íû´s!?ï(ÜW dÄ;¤ˆ<™æh:KÏÃò\¦ÊòYþ„ÞÛ?6Úÿë&/]ßõª#'¶Žî,U“¬¿æg‡PµÕ)rWo§”êuêGwçñªÏC˜Ç% ™Ïè Kº•¦µVÒÚ-ùßV˜—?/?dõ“þø»6ã×à'Vl¸]Áw‘JR¼$ÏBx*-,`w•N‘Ôa+…r´ÆÊä[pÈÉæ¢O”57\jnn)Yù’ÌS~z²ìa²±xIÅÏ­¨­ kš"[I¹”³=ïÙl!“ÍÚ+—±äRÉÌXJ&cÅ%É¢€$)á)N ˜b%ÞCúš¥#™D¤§<¤·;r-ù|.©U)j 5™ºáÑôò*–+²&;ÀN²7Øk,ɝòCÿ/b˜ ¢à\P\wa½O£´ö=Áæ<;ZhîXÿ/þÏwÅOŽæ‚bg°“, -é9ü¿B„ÜS<#îÑfiêñ™o©dTM\ó"l¬#_ò©ÁÕú¤¨4W¯Û§nµþ‘Áa¤IQ•÷C­›zy6Ì¢ îÖï}™&ËFYKõÓ_`Yh‚scà`Ò#ów0^NDߺ‹ÃRïζÌLýÇ&Šj 9jÓêìÎØÎF.fêõ‹êÿ{£ñìUàØQªú -!‘QšsyX‚°¦Â£”ìZéÙ£þeyiHχûbËÄE.r=[Շ(Ôe?sÅ|¢/µ, }‘HØÈ}0„Dn«·—7ý=¼9íQ:±RņÏéªS—ÎêU„ï¯>Yñ4I—=–«¡øH·ÂR¾ÔÅ⓮ò<æä(y˜ ËR„›áÉæbmeÅ$&‰ÅÃÁ=mß+Õ=ó ê§5H˜‹n%Q—ÙéҚΖ(Ãñ\¨ùkC6¦ŠÏbñS˜¹½¨t-ÔŽx{Òt»üe²FØJ¶›EŸ0ʎ™°ËìH¤Ê‚°ûd½‚X¶Ýˆ]ÞÜzTÒ’ös”N’“™.ò.&ÿd_¦l¹‡ï oå·F˜L]JKl‚L]¸§)­ª—IׅMç­XcºP7õ¢¾Jߤèô#ú}Réz*–¦éE)3. p±Xãm=ü==_¨ "A^‚ºu 6§©r¡Ë×!Õ)lÇÛ阈œº³ù<îC%Ï6R~<—|u¡ŠlÜïIªøߑÏY­rin3TŠ»°þc·®ÙLZs«G.ÎL)f.×s᭗íYžD;1tfx±V›ýú̹2þü¾3ÿ:uy¦Jf¦–/'»®¼ðü¥á㈚ýÈt·!j6>we7×Íw‡ºÃŒ+ºqWr¦‹ëâ»B]a¦(ãE©¨0®ÀB…0#p‹áz®ž¯›¢7%S A4V“nð1És¦™LXéÀ,ì¡Üc -„aø\Øs‰EÞå)~c„çË3k}Q“*Ô¤Rµ5–©øP+vIÝ%m$I,E5}~}¨ÜÚð­#0MF¨NrÇıìÆõ½7­Á•î”c8o¶œš+Þjó¥o®ü‡¬Æ¯ø&ì'»ü¯ö 9Mºð=~ë¸Ò8ˆ÷8ÿe½Üƒ«ª®0¾Ö¹ i ¤!DÒ  $\Áˆ”Jkr­`‹TD åph-A‰dìXƒ01 --CIÐ OK•«Ž¼ ´„‰ Òœ–Øê` /iUŠ·¿µï=—K þèùf}û±öÚk}{í2D~+iPóäfó”œÖ2ÏŲ]Æ2³ -ڙN%Hº,œgþ'õ²æÒÏKh^Œå;I©7NRåër Ké+9˜a½(JÆ:ìÒc†´Àݬ»´Pc½ Œ¹Ë4ÉY/¹,ÏÓû Œ—Ïê¥ê3:^‹c+nëRNŸV»‚yš<iñ³ÚÉjÞ/3z¥“JzöåìfR‚ÕŠhgbý,cELÆbE´pRÁ 'c¯íš-µòžÌ‹´h:Ï©âi¹/v—W±Õ*©örÌA½/ÇîQñ/-ç¯ÕvW[Ïm_ÞtÿtÉ¬wž€§Ãä-fé1¿5Ú½¿Æªð™õÚÍ?OŸÐ'ä |Ãlä[ηRÔRåq)ÅwKå»Øyw‚ì¡Å6Ã"ÿ–þ‘ãò©‹ÔDZÉEé$¬a1úkô˜†ß4 C1#äHˆ¿Å2•U[¢»e¢vûu‚,‘­^W$÷Koð ½o”ùÒWÐj)­OöÀÛdpä+6‡¥Œ\K„’¯èd:ÉÇ«{¡À|Ù¤‡ñíÕÚ]6ÈZ-ÓXݝÉZm“}°ÆBâïòCž?•/å/²^ÈkrXÖ²Ê ù»Wþ#hõ_ˆœœ¥Þaìeòžƒßót-Hèw¡ëÓzŒ÷G«ù÷¥¼æ}O«ôQí«õ \ò*mÖ¤Y7 zRÿ¤Ó`¶ÏØ?Çé·5I;i?Y©çå´7RéMÑ~šÆÊ^‰¿F/à©Ðõ$„a}RÄ·:ªâ{¹®Jg¹ÉÕì†vUcy‹-»’]›`ÊO¤ù„Z«‰€&ÆÓÑï5º@›Ðüm¤~ë0 ^úÏÿ‡ Ýë4YM« ¢­×ϝžŽ,xŽÍOé/âsõ¿ÅæzM¹Zǘ8˜ÜµM¼l}u‰Ù'VjOÖ7¡ôm‹÷žpå6âÝþ'ÉÏ]¹E·¸ï_áÕö~]íb>n.›ä÷>/ë¤&A¼›YmüB~*£°ÇI|#؀%¦È­Ò‘uhM¬ÆþÚ(uR§ÿЋz‘ø.Õíú™žÒ<¯«½IÜ “<ý/§ôœþŽb…ÕŒõ>yûrDgè,4<"õè—ãiro¯åEøc‘Noƒz}QÿzÅÚq+˜§˜sœ?ˆŽErAþ¬Ÿ³^ïòÉøÞD‡UZ« úŽîƒà¹;u‘‘¥?ÖïÊåk¿F÷èot¿î‚‘8°@âûÜGm$¾Þ¨$îדXÉö w¸Qi½s$J±Ë;¢b:Øm´Ñš!¸~΀Gç8)Sio2Ͼ nµýî>t¦/ü¡Jѐ—ïån(sQdžè{c«(ºÑ²Íhk' -¯+5ÈK ږ´ŽÜv"øšˆm¯´ˆö¥#°ËgÍX”_SúlÚNg‡6JŸ-Ú+ãö„UÈ:/¸gJäP|]ے®DiŒMcëe"+'Ga;§‰"v•}º–ž‰¿%ë9/¦Ù§3õ°Î¯Ë Ç -çt_ëUð­“oqÖ °Ó×ÉŸç…þË-ôÒ½ltX*_hŠËEj\®Ò<(Cöѱ,:“¿ùN¬F˜üؾTÊv"õi†­ä<ҝh:岻ݰ`w¾Zf"º2i·Õev äN+`V˗CDÙ=Ô²LyÃI²‘|n…äs¦9#q¢HÉè“D¼vɌEäêÀxèçœ6²Ïë¤ -_‰¶µÉh`Ùfkî‰rÌ®«2PŸüì> ¢9í"9ã4ö{±ˆ^Å?Æ-%œáú» lOvž{Øíð%òKPÂò2udzM—=䒖!ïæT™†åºÇ¬W@‡Ùe–ËL‡0jæ¾åœe8†vv|‹õ°3á0ÞÎr2«’×ñ°mH˜Qç1ªÍ`§üŒÌ®ÒýIŽajüéUN“éàIÍ×þ _þÆn¨äFœÚô²—ê¥rÞêNse®7„¥ž{ˆ}ªÞöW£Ö!„§ê`}H'é]:”÷§?ììv/±S¨!Z7Q#7p³ë+ÚÙ+½Ù\­ ùü.=îÆìm½¹–œm7–Ìý4íBºI{é~O¯=ƒôždíðª&zŒîo3tG,€úñv§ŽÖ<í¡wk€•8† -ÙîŠÎA6+Èrù&{µ­uë° åDPÅ®l+õ•ÙØz''‘ýX;LÆ~†•îüSÂý |'È{q¾’¼ünǟivâ‚oc_±òY"2‡…Ô“Õ5éE~?T~B» fj­+èsVy)^Š(ÒïDyÜEn®|‹­v;Wòþ4LM$¾í· ÞílëW™´Ä÷»>œ'Jc°Yr Y¸E}ì|®…³;Øø&~DՐãó:<Î/½„tIüA¼Œ[ÿ7 Ç"D—odÛmÆV`7™²b€•®g^\Ù<ý*«†m·ô•æé—æZœèºCxi#b—%t?VáQqCüHÜȼä²ÏÀmÆOÂúºqÞǨ>£K¨hïy -à,åÃs‚b'¾Œ½ÍC$4%ý¼;¿F:N+x•¯ ö́™ ?R„7ÁAx°ô:⁋©cƒhuLüü ±ñ’ŠŸ^þ!rÚ/þ(þ†5Š(}ƒÞDêš”Ð]7á ø1²i–áÈqÖoðuúÕÔS9ýSß¼êûFÂ.àäIØÚEñSqHœß4Ja'GR¾× üLŒŠWÄ+†H%ñ"ÝŠ¯ñ;ö¬8K·|ÐNÇ¿ÿ^sÂZ!|çgޝ%¸‘ŽTNÍxï|6ۊóôÄx%ˆ–æ`?î@ߛ0ÓÙx¡ÕC*n'}Ž®ÁbòaåO‰Óèÿ+¢A|6¼~ýóԄwU;Ÿ×ˆÎ»($æOþ'ìãؽß!"þ"Úޘ|•Þ@Éìàk¸õ?†ÓV õ0Nx1­Ä øiÌþ<Þ êÝZ¢Ò\`œïŽúÉsO>Îþ:ý¥}nÔXÂgáE:<919Ée‹07ÅÚɁYáÏÏd<ºm鰒­·½9”gNï]Ö^gú\3Ӗ-É­´eƒ -s7Ù²„ÞgË9÷Ùr.ä㶌ùä^¦gȤZª¡T©“úÈßH - ¤(kš‹AVÔ}k,G‰‡BH&u@·íçœn¡ö.Ð×,@jA®Z‹vCÓν‡1nzœ è}} ýFÐgüý£(‹eÆ13³¯¡:H‹3¹zªâ9øÐCuMŒëÃ8ª?õÛu×!×­*Àã™RëäÿÝv>½¼&­A¾%Jë㕸ùSýDì?5y””úùU®}ïFÛkP+À+gBŸÞVÌI­NÛ…ymWs{‹kX´cª•05í¥ëš¬C£Ö/šÙÁ·þC•'0‹ ZƱ -Mö<ƒö\ÚnúÏNÙB€ÇV³ïçÿì}'vôŒY[³¢Þìì³Ì‘p$1µÌ¦H,‰ùÁHx¹é …ÌŽàö¾DÜì°âVl—Xn´X=1k·ÙµÂªÍß`d a†"ۃ~Ó‰ÆTSu_Sg.V¬¾Êìð…¢}f‹/ìøû¡]é ›-¸©³/7CSûéÄÌ5ÁžPÐï ™öˆ¨Á f<2ó[`½‰Ý¾˜e„VÌL¨ÿhí47ýV8n­6ã–eZ;z¬@À -˜¡”Ö Xq,U?Èc¬„/Š/oòn^ßä]ڄ®ƒV¬ÍÚíÝ´±ó¿P¦rf[jš>3ó¬¾X¿é½ý¿Ï®`C»ƒÿwà¥Í´žùÒ,çr ^ڄ™uò~oGiˆÿáí·{oj¾Nl‚:'OÉSÉÍu'Àîe6^XV»Wñ™̓ùunOµ—,sbècã%eµ×=óä8M†<(÷ÑBôýÍ»m> ¾üq›û’«O>ò‚®ƒNþm4¹¶½ö»,Ô»XIkFÆ¡qzJä(f5ŠYbV£˜ÕuP^G ~ú֏à®VÚ]ÙÂhÒ1×Ö@ð̐]r N²S>hó­rK²ÖyÒ³MnF×G™ŽÉNÐa¦ÝLۙqéË–#,»YvÛ²¢ÕS¨“©CQÙ!7Q%4‘ë˜{åý´¼yÅÛd+ór-ó Ðß ¾õŠÀ×É8ߊ|3x òŠ¯•$›5ž(òÝ(30žÒ7c͘S3Ii†1à2kºA‡€ €äšB6#5!y¤-ÑG#JIÊF$7Rƒl@É}¨{h£tñ?ºP˅‘\X+zva{\ØåI¨)WR ÐxmÀ4ôS…vU˜WF¨’˨ }-4öS1¸is§±€/0ö%8=ùÆ1òۀ(°×8–œVä𣞪[ ´ÝÀð4p˜NîTIãLÃm¸e»Ñ.s`ݕã.W-óºU)þ¡ù)>k^­Ã“•X¦JzZªøØZ ¸39'`ÀtÊé$p¸ ¨/Çb”c1Êñƒåh_εr¹Þu`0¢rôsiÜÚ TOéEi+ ©@®m*P·ÚË ‚[¨r/0 œ´ËJ٘KÙ8KÑW)f[ êfÉꔥI#ßqë+îuxÜX÷v…Ƭæ¬ÛåJ uˆL«my?¤ý”n1 ýãÕóÛF…gÖ&»u3Å1QjՊ½Û¥M›I¹I¥]¯×µä•4î’Uk§²RN ÖîÁ‡@•@%m/ qâZ!¬Î¦­Ër„ .9À¿ÀKxoÖ%I¡Î·óÞÌ{Ÿß[ï¼í@I §S€S€ã `ESEXÍ{€»€;€ À€Û°:ãøc®\-¿_þ¨|·üMùAùqYýQišJÓʐ‰ 8ÈäÆ´c•¬’&aô)ûR~(¥%åQëXÀþ Øoû:`_Ì Ø»°WÓUë(gpv³w8;ËY™³×9;ÍYeŒúô2|Xü"¥-å)K9I/o2rè'ºB Þ:õ½ñqé/#NÓÍÒ§F¬ú$™­$j?”^3ÖJ3‰åd¢^6~NCò6ýŽ¨”[3êïêUÕRÏ©¯¨³ê)uJ5Ւ:®å´¬vDÕ2š¦hiMш6ïl[Nd|$‹j$2-ÇY%ž#áì§PMñRÊUÜ%›ºâ×kÄ]ÕÅßKfL3o½+^0m*r.q—í¼˜ãn¬î\ó܇Þ\ñ"Jïø0Êg1%Ë^LwÐt« rUo@(¹µQjßÇßxQšnlødâƅü…Üù±sDs(ùnË󽸓Iñ•»ä‰o'}q;“¾ OnI¼2¯œ­9e•ï 2ëÊ|íÚ3뎿Ë#:؝1PIёGô§xEey'P%¼¢ä÷ñ¢E£æD†ñ„³(9‹û9kû9k’³6䤎±‡£nCr uûNñ98'äìyšm›ÿO£Ò [QµWk›µ¦YkCoŠÛ7®çÅúª®H•n¡K©“ÍÕk×Q·Ú1Ý2ێ¨šŽ5zÏúEÝ Ó‰H¯¶ìE=«íl6¬FÍl9þÃzkº¿/ÝçOÒEÓ­‚µ0Ø4æª÷p÷Ñ]Ç\}ÌÕÇ\u«.sɪ‡²ÔˆíWƒD?Tg €›÷'²œ—Õ¼`äo¥ ½Os_Œš¶`ÐÑ5[™­  Þ2tó‹CWþæ‚QxDï]Y0™6É×Þsà -Ãáà9¯[çJxEjy….t\(øä ;þCeTîÊ%؟¹3㎌»v* ý‘«v Æë Ø ÿߨ ‘i¸· HøtÃÚà$é.ìR`!±;,œ‚¼ÉÄö¯³v7 -endstream endobj 98 0 obj <> endobj 97 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon.ai) -%%CreationDate: 6/22/2019 2:45 AM -%%Canvassize: 16383 -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%%DocumentProcessColors: Cyan Magenta Yellow Black -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 2 -%AI9_OpenToView: -497 224 1 1518 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 67 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 115 0 obj <>stream -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 7069 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C457DFD6DFF52A8F87DFD6BFF52F8FFF8F8A8FD69FF7DF827FFF8F8F8 -%A8FD67FF7DF8F8F8FFFD04F8FD66FFA8F8F8F827FFFD05F8FD64FFA8FD05 -%F8FFFD05F827FD63FFFD05F827FFFD06F827FD61FFFD07F8FFFD07F852FD -%5FFF27FD06F827FFFD08F87DFD5DFF52FD07F827FFFD09F87DFD5BFF52FD -%08F827FFFD0AF8A8FD59FF7DFD0AF8FFFD0AF827FD58FFA8FD0AF827FFFD -%0BF827FD56FFA8FD0CF8FFFD0CF852FD55FF27FD0BF827FFFD0DF852FD53 -%FF27FD0DF8FFFD0EF87DFD51FF52FD0DF827FFFD0FF87DFD4FFF52FD0EF8 -%27FFFD10F8A8FD4DFF7DFD0FF827FFFD11F8A8FD4BFF7DFD11F8FFFD12F8 -%FD4AFFA8FD11F827FFFD12F827FD49FFFD13F8FFFD13F827FD47FF27FD12 -%F827FFFD14F852FD45FF27FD14F8FFFD15F87DFD43FF52FD14F827FFFD16 -%F87DFD41FF52FD15F827FFFD17F8A8FD3FFF7DFD16F827FFFD18F8A8FD3D -%FF7DFD18F8FFFD18F827FD3CFFA827FD17F827FFFD19F827FD3AFFA827FD -%19F8FFFD1AF852FD39FF27FD19F827FFFD1BF852FD37FF52FD1BF8FFFD1C -%F87DFD36FF27FD1AF827FFFD1DF8A8FD35FF27FD1AF827FFFD1EF8A8FD34 -%FF27FD1AF827FFFD1FF8FD34FF52FD1BF8FFFD1FF827FD33FF27FD1AF827 -%FFFD20F827FD2DFFA8FD04FF52FD1BF8FFFD21F852FD2BFF52FD05FF27FD -%1AF827FFFD22F852FD29FF27F8FD05FF27FD1BF8FFFD23F87DFD27FF52F8 -%27FD05FF27FD1AF827FFFD24F87DFD25FF52F8F827FD05FF27FD1AF827FF -%FD25F8A8FD23FF7DF8F8F827FD05FF27FD1AF827FFFD26F8A8FD21FF7DFD -%04F827A8FD04FF52FD1BF8FFFD26F827FD20FFA827FD04F827FD05FF27FD -%1AF827FFFD27F852FD1EFFA827FD05F827FD05FF52FD1BF8FFFD28F852FD -%1DFF27FD06F827FD05FF27FD1AF827FFFD29F87DFD1BFF52FD07F827FD05 -%FF27FD1BF8FFFD2AF8A8FD19FF7DFD08F827FD05FF27FD1AF827FFFD2BF8 -%A8FD17FF7DFD09F827FD05FF27FD1AF827FFFD2CF8FD16FFA8FD0AF827FD -%05FF27FD1AF827FFFD2DF8FD14FFA8FD0BF827A8FD04FF52FD1BF8FFFD2D -%F827FD13FFFD0CF827FD05FF27FD1AF827FFFD2EF827FD11FF27FD0CF827 -%FD05FF52FD1BF8FFFD2FF852FD0FFF27FD0DF827FD05FF27FD1AF827FFFD -%30F852FD0DFF52FD0EF827FD05FF27FD1BF8FFFD14F827FD1CF87DFD0BFF -%52FD0FF827FD05FF27FD1AF827FFFD15F87D27FD1BF8A8FD09FFA8FD10F8 -%27FD05FF27FD1AF827FFFD15F87DFFFD1BF827A8FD08FFA8FD10F827FD05 -%FF27FD1AF827FFFD15F87DFFA8FD1BF827A8FD07FFA8FD10F827A8FD04FF -%52FD1BF8FFFD15F87DFFFF7DFD1BF852FD08FFFD10F827FD05FF27FD1AF8 -%27FFFD15F87DFFFFFF52FD1BF852FD06FFA8FD10F827FD05FF52FD1BF8FF -%FD15F87DFD04FF52FD1BF87DFD06FFFD10F827FD05FF27FD1AF827FFFD15 -%F87DFD05FF27FD1BF87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87D -%FD06FF27FD1AF852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD06 -%FFA827FD19F87DFD04FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD07 -%FFA8FD19F852FD04FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD08FF -%7DFD18F87DFD04FFA8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD09FF7D -%FD17F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD0AFF52FD16 -%F87DFD04FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD0BFF27FD15F852 -%FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD0CFF27FD14F87DFD04 -%FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD0DFFFD14F852FD05FFFD10 -%F827FD05FF27FD1AF827FFFD15F87DFD0DFFA8FD13F87DFD04FFA8FD10F8 -%27FD05FF27FD1AF827FFFD15F87DFD0EFFA8FD12F852FD04FFA8FD10F827 -%FD05FF27FD1AF827FFFD15F87DFD0FFF7DFD11F87DFD04FFA8FD10F827A8 -%FD04FF52FD1BF8FFFD15F87DFD10FF7DFD10F852FD05FFFD10F827FD05FF -%27FD1AF827FFFD15F87DFD11FF52FD0FF87DFD04FFA8FD10F827FD05FF52 -%FD1BF8FFFD15F87DFD12FF52FD0EF852FD05FFFD10F827FD05FF27FD1AF8 -%27FFFD15F87DFD12FFA827FD0DF87DFD04FFA8FD10F827FD05FF27FD1BF8 -%FFFD15F87DFD13FFA827FD0CF852FD05FFFD10F827FD05FF27FD1AF827FF -%FD15F87DFD14FFA8FD0CF87DFD04FFA8FD10F827FD05FF27FD1AF827FFFD -%15F87DFD15FF7DFD0BF852FD04FFA8FD10F827FD05FF27FD1AF827FFFD15 -%F87DFD16FF7DFD0AF87DFD04FFA8FD10F827A8FD04FF52FD1BF8FFFD15F8 -%7DFD17FF52FD09F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD -%18FF27FD08F87DFD04FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD19FF -%27FD07F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD1AFFFD07 -%F87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD1BFFFD06F852FD -%05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD1BFFA8FD05F87DFD04FF -%A8FD10F827FD05FF27FD1AF827FFFD15F87DFD1CFFA8FD04F852FD04FFA8 -%FD10F827FD05FF27FD1AF827FFFD15F87DFD1DFF7DF8F8F87DFD04FFA8FD -%10F827A8FD04FF52FD1BF8FFFD15F87DFD1EFF52F8F852FD05FFFD10F827 -%FD05FF27FD1AF827FFFD15F87DFD1FFF52F87DFD04FFA8FD10F827FD05FF -%52FD1BF8FFFD15F87DFD20FF2752FD05FFFD10F827FD05FF27FD1AF827FF -%FD15F87DFD20FFA87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD -%27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF -%27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F8 -%7DFD26FFA8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD27FFFD10F827FD -%05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF52FD1BF8FFFD15 -%F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827 -%FD05FF27FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15 -%F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F8 -%27FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827A8FD04FF52FD1BF8 -%FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD -%10F827FD05FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827 -%FFFD15F87DFD26FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD27FFFD10 -%F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF8 -%27FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FF -%A8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD -%1AF827FFFD15F87DFD26FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD27 -%FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27 -%FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26 -%FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF -%27FD1AF827FFFD15F87DFD26FFA8FD10F827A8FD04FF52FD1BF8FFFD15F8 -%7DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD -%05FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F8 -%7DFD26FFA8FD10F827FD05FF27FD1BF8FF -%%EndData - -endstream endobj 116 0 obj <>stream -%AI12_CompressedDataxœì½ër$Ǒ&úŸfýµ?ÆLZ[¢33"2#u֎Y.ÎJ"M¤ffwÎ Bƒ$vº^4ZZêeÎÜ;þ}îá™U…F_¨ÑîA6P^™™qñðËç÷¾úúó틻?^NºÍ³ÏþîïNï¯/îîµ!yóÅ˗oß<܃ô‹ßÿrӏ'®Ú~‘¿µ+ÿñúþÍÍÝí¯øÝIÀ·¸ÿ§?Üß¼y¸¹¼Ý\\¿’‹~¹ùÅ/ñí77/¯åû›«»Û“Ë›_z«RËÙåƒ|5>†çC×ϛáW1m¶¿å%—·º|óææ/×h*d¶´»{{ûâæöûÝÝÿúÕ&›Ïcž6 ßÿýÍï¯ßÆîd;©4Ɠ^FxÓ§ùdÎvGƒë?Ý\ÿùW›ßÝÝ^[mï¾Ö±±ëô_ûê÷o_^ßÿáö;’6kýöîÅõK¹£Vqñò’ÃÒ×íŠo.ï¿¿~)s÷òí'uöVd~sùã5&Å`|ùúúö›»ä£~çi3 qƒwêófNògf IéGo´¯ÿZÕ¨µ”úÇ ÷•Œå—÷7ßßÜþª<áôí¯ïo^Ôž†MÖø'¹ù.ÿÛÃÊ«?<\ߖîÉuúÛfªt'¿ý­žß¾8½{…QxÃv-íËüyy÷½}[?ð;©âíëgŸý˳ÏÂüü¾½{¸~#5¾¼ÞÌãóïï/ÿt-ó9??{·éC×\ñÇË7×Ï¿“Qº¹Uê‹?*MÙÍë77Òüó—ß}o¿äûçW7÷2E¾{yý¿ž¿¾¾øáîí›ËÛÏ¿¾º¼¿»}þ½¬Öýòú»‡ç_žË,IZ7Rÿ–.ýáÁ›ä¥åƒ~õÇ·B}x~}ûâòÍϯ_ñ׃,Äëç _\c}HeoVêÍw×Ï_Ü ƒN…Éýü¿¾µ.oüfóüÍëË+éŽ1>¿z{}{õ£|ŸÿñþNVà/e÷c~^®~u÷úG«óþÅwׯnnonåöix.ýsuùòöîáù?¾þáúöù½ ÅyµëÏ_]^ᱤ[ež¿ö-w¾}óüáÏwoÞJ§ÝÜÝ?øáþúÚ?]^½}¸~þê­Ì×ðœ´W2þ¬íêúÅÍ˗—R“,E¿CèÕ囫·/ùD9ãËÿùöò^îÁŸ?\¾üNÛ0â›M?Ï·œRÕV[Ü6£¹ÕþÝúÛoñÏ·çÏO힟óöçç¼Yj9on?÷û¾Ð«¾Ð&¾h®ù¯9øáùïØ Tó¥Þð¥Þðes×úL_ú}¯Þ¾|¸yýòÇç_¾y‰9ñ‡òBЛÿÐÜü¿ë¿ê—ßüpw/³÷V¦Ú›ç—ÚðeyŸËæîKmúÒ+¹dw\^?¿*Ýq­·_kí×õf©êÚï»Ñ«nôª›¦‰¿æZºãV¼ÓËïÊ3Ý57ÜÙ%~ߋ›?݀ ñVo}«-½]<Ï[¿çGýúñc!?ûì›så…é¾ýæl ïߒќß^ÝaÿÕæÛ康¡þËóÕÏW7('þæ¿=cíÂÓJݛoîß^óãë²é°áoåI¾’îàŠúÝk~—¿ýêå[ùò×÷wo_qûÝݳÏ~¡Ó?^_‰T$[Ջ͗üòAäžß]^ýðýõ_®o®~¸½þ·ÙIW -ݯ9èõ/ßQ±0ðûë~+÷ò£üþ¿ŸrÿÙõw"`Ô -”ú÷ÿO˜¢ð»ÛÏÿ›ð҇¿¼º{ñö¥|{~û§ë—w¯¯72[7ÿtyÿú)M|õòòöò~Ã/J m½›/ÀV.ÿõáæO›W—Ò¨\ô›Ù#¾º”þ}R ÂL^K¯ñ&^³lí± š¯žÔÔåÃ"ëÉ6ðÆkßbk“Q|{ûý^ñEôú§Tÿõ¯þx÷òæÍ+¯¼¥øßO|RéÖÛ/oõ‘ïß¾ùaóÍÝÝK¯ù·o±9¼¾¹}sýrõÔ"é}S ùŇÁâùߢ‰ÓKe„-¾þáæêP+ÿžÿîæú`cGîÒìºâPjõë××¹¹|y°ÅýÛþæ³9¸‘-_xç&ðè5_ÿùòáê‡Íonþx/Ûêõ;V+û»›Ûò _¿½y¸öFð2”¿¿~sýð—aÐÂ^Áf䆋æ†Z}Â^Ón'ŸþøF#ZÃä×÷ nD}þõÝË -¤êú·èÓf÷‚òx×üחÿâæï¾Ý‰¤ùŸ…¼þéWehJ°­$þ_ʈÿ¥ÆqQ&/¹›e۔”S+gM9ï.¤Æ‹RÖþ M M‰‹’´Hà÷ԏR&þÎM™eÛ<zÙõgRʧ3©ñ¬?'í¬¿hKÛ}|¼òš›’†åÙgú{˜š’‡YŠþ»mÊN˳ÏþïÃczlTÃb\c3ºuŒ¥Heœc3Ú:ºí(g)øÑ͋qž›‘–¥Fó2ê;oýÑ>oG]þ՟îà˜‹2¾ñ ã‹ßaŒõȒ9ÚÓj¤·V–cŒ1Åïs–³Õh–fDzŽŠŽU¹ÙÆLÆIÆTÇ -cvjåŒåÜÊJYfxÕ˜ö­hýŸÙ¯;®™ öÐÀùŽ3ßçŒOÝÛSŽœ=[̶¶†B c˜BsØI9 2ì} 1Ƨ˜ã·qÏây¼îRH1iJsÚ¦]:MçIÖ©ËçùB&ŽŒéæ8KEsžçy7ŸÎçó…LŸ~¶q›¶ã6oçív»“rº=۞sJ ò -q—vÓ.ïfùj·;ݝï.dšIo²ÓÃižOçù|>—ÆÎOÏe–œŸŸ_`j\H§]¤ yÙ yü‹­iôBn½XýpL;«ÓΛr֔Ӧìe۔¹©q–æk™š2.JjJlJhŠÌF©qðÒr¶Ê•»öáÏ۟³E9Õ"]†ß»¦l›2/JnÊԔ±)ÂÐϓ—¸(¡)CSú¦tmÑnö™ @ûíÏiSvZÊR]Œçr—cWFm9RËё‘c;"ÍH,ûÙëÖÛ«f¯JÍ«>µž\ôá²ßV½µìé¯e¿hŸl­Ì,ÙÊdedIV"K°"óŽ‹ÑöTÝ|)”—ÓÆÊώekefÉVd±ËâŸNG+ÉJd V”'—=@øj3¦çÇÇ-sœÇcѱ÷ÏØÛ[öíÄތ콞½uÎÞÙ±7²¼ÝÄwÇã-;¾ÕßbËçžø”‘O%Ï"Óæ\ºôTØÙVØZö6 -“‹Âìáóò¤2¥Î¥³O…n…-æí$ 2 £ ²ßô²_ÈПI§ìæ­°Ó©À¨"” -†§ïÏ¥‘ÞDw}Í"ŠWћ* k+u՚X;Jï?ØIþüí`ê@. -AfÈ$3eÇ9³4ÚîI¶…fÕ²«:­*Ëj™ٖ÷þf¶deïbd>«¥üIòÎåëRªÆ”ºÔdú•–´ÐÁL/“ƒ1ýQ™¡/µ½²[¹.èÚ‹ôâB‹<¥„^4üžW%¯JÕXõ¯ÑtٶĽöÊp ØÔØþ쩎X­ìç¿Ïa-2 O½ì¼l”ùhÉEÔ§UŸXªöšÚ"5.>»…£þ½_‘©!5O,‡:ù@‘Ÿvå“Ú ->êçÓÕØl¯½w¬J¿EŠ?³¢r[±…ÛH6Ý»ØNlÝ˪V=½¬öb©Ka½¶‹ì[Ör»zw¶ª‹aíNnu­$·IT»ThW«[3Y§ò—ÛBªmlµ6Ëê<ãÖTl,­mwpmî–¹ýÕYl8ë՚V¾j*–¡CëÕ?/l‡i¯Ä…µñøª\Z®Ö6ËCëö±Õ¼Z«\ÕG¾{ÿýèªþXƒŸ¾Æ#Bo«^í+X*µì+XEV騰ŸS"™MÁM&\½ºh¤’i!• Šu*JU¬gŸ‰’5K•,¨YU,U²NiuRE+»¢Lтªu*j֎ŠV¦ Kf#•­ž å‚ú÷š -²¨ZªlAÝTÝ¢Âuf -׎ -W¦Â• ¬L掩]Ô¥¡x©êå+Sù‚ú©~õ\VTÁN©‚A ƒ6I³¸T4-QÑ•1QÇh:§Bv& -T2(ePË ˜M1Q5ƒrȺ:*h¦Ãï´DùÞD)oÄ ?=¬ÊÙ!ë€T9Ne·Lõ %’ƒ·¼»áڍVì¹ú»åÉ­ EyIømܓœ³.xéB²Yp͏”ÓÊ,(+nwÏ="_'žÆ5Žr“O¼ª]ÕÒZÈڟ¥Q°1u.ípeÏ¥ÊћJ[KX”¥Í/­Ê¸(",,‰ÓÂƘ©c-ËvUvëbͶœí•ýŸ‹ýRf›0Èv'ï”á` K±"î—t¤ŒG‹Û“¥ÆiUò£e~G‘baÕ>\vO,äøRãéËÙӊԸO=4”O.Rã±ï>ðçÀöúÁ5¹¨s­u0'Š–hEí©Å¾:Y)ö×يYg¥FµÖ–ŸÂ*ê*ÃRømÑ­‹Ô_,Åj7–ùMó”–ÑK±5g/³•­—ÝžuóÒÇ:Ä«ªá0wjøÒÂO±àIG¸Ñ1.ÔržíAÇyÏ#xdU?^þŠ«ú½Ì¶ ív§jK¥£²Xˆ²E ‡ñNƒ:;sÃqœè:Î"x÷ñȲé¨9Pd…Yö -²Å• gò9ÝÉêPBéTÆË[ŠÊp.c1©ƒ.fȟt3?ûŒ®æ ©œî杰§3w:w"%Bâ„ã9ÊB–ž(ÂÏ"Îoé„>öqn®èn++F„þÂ?œÒpKÛ‰jÁܸ§é –‚‰ y±§­2ÐY w5d÷‰Në,ªÇL×µ:¯Oɜ°Ð/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“Ž^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïäOÝý?|Us8 _M°I¿ä¯q“»“(kg3ã ¸øëgŸýÝ·O¹v÷æ@'I®LÝ&÷'¢?ŽÇ+\_ÈÚNúqšc/ßöPŒ‡Á’r¢ü1¥Á¾ú4Î\ µ '¡K±6÷Ñ5éót¢Ô¦Q.ëdُ¸Q4sQÝYÙS73²F8eLòǀß}SY8é„Ó4õ‰*´§;᳨,õ]šxcþ¬•‰n™µAø,*“áKó¢²ÔusûtŸ¦ÂËa:É!̨*§iþØ]WwhÎÚÃÏó‰ðù£vyêٝUüf`eþýÍ«W×/Ê´¿¤âX ™ÿÙYç…1ÌÁXe27ßdŒqk¬ð¬õÙ›‹†6¡ˆév.|¬7ún=—ü™ä3ƒñA*ËÂGYL|™òä.H]Iz’Ö©ÌÁŽÒU2°ÞÙäÞdíeC5T\ÃaƳÎ݂§4©9l2³W4z_ÂOƦ< —âžôj Võ x"Ý9vhkˆ¡bN† RDPÇíþ|ÏéÜ7º©–Dõ—ž%è‘RôDI:Ó4º¥<½£:-£GÁ邒u•­Š‰qTùZ%ì*cSÊ6p¦Â3!gCÒ‰—Òv¦´]äí³…Ì½’ºMæÆ\(NÊÝEò–U¶”½1KfƒužRt Ö;»Þ‡s7å݀îj6±ˆ[7¯A̓›š—@æÊl¥2Kk0óÙÌ||~f3¬ËY*3»™[sçsöÂl+úrÚÀÎg¯Îߙ[!g±ÌlÉ#·Ê:ŸƒÁì”Ë«ë³Ìísë²ÓÆC®ó\ŠÌlí“Íø‘ZååÉäíº‡¨#UWÀ9Wׁã9³Öá ërØe6왽÷:,A÷{A2÷BV üÃûA֗…BL+ç¸rˆDÓŠèYEÇÖÐÁWÒ®q·ÔµÔ®§fUí²NfJì#ã¹Z¿p õ¿ë……%ÚB.;Eš‡>M %^®n¬]ŸªB5|äqœ{Üg³ä£Û*ÔÎSí&ã‰HZ¹yž®BŸ`ŠAX",4a’]ÁnîûI”¼$þÂÛæ(¼´y4Ê­}cµûèšÌ”»ؙ)̙æ/يs¨ùi&T#“v±Õ3Ÿ¤Ô!INcúتÞÓtóåýÕ7/®¯a¼ñ¿¥š¡¨=E2Fô›¢—´(û?yUæE„Íi»WN”³GŠ;·`>âlïÞ»pB‹B1|Šr0¸¹†7O༫k¶_ÆÖd®Ð] Õƺ”¨ö„EŒ×ÜEc¨þìÙbƒÎ«[,k¶6Y/º>NéÌì< :Y t¦-uk3ûœv5Ìå@ër²Y -«ÚŽsòŒs±ø²ΨêÇÞҏmãH(hO.ÐêYìh™æ}ØÑ ª ­3Z¢MýÖ³{­ÏÌà–8PÜ®4æ³ÛÐ详 í1ŸuõZύýì”×°iŸFÒýÕ¢¦,=Ö#U™Š*žkÕO*"¨"*ˆFÜO\à~ZÄϼ‡÷Yx±|#{L\byŠø¼Fìì#uöQ‚§ >ð.gÈ9ŠÎY('‹¨ìãØ¿cJÒ¡àa-ÅÖÒ/c¡Kt‰~.qÏ5æ¹Ú³…éuaxUo­ûk‹Çvëã<Ù8i¿«@ŽS÷NΫpŽP¯f~=Ÿd.’ì¸fóZNc‹[M±Õ‡½ôb×0‰R°Ì öPoö°ø8'[†}̔Z&7Ù&“å=Ddúž†ø¢¡ §fÌ]„hHˆJL%0DCCT ¡³Iä¨$raúŠ2Te{;€·f.a#màÈhŠ‡)5Af%µ¥³Û<0XÂL–!Ã"ë™Æ67¢ê±°áZâ¡b$Þÿُì;Kvüì檜HyfŒ˜š¼´¾ ØR—E+$|H¤ßÙÌ ö£¾Z’Ün´6p|ÀíïicøÃííå«ë›ï´éao8@m>‡20%WQš,LýñÐM"pQÐLÈín»Ì‘°Ú* @!Û¼v€ÑÉÁµóž[³K➂Už¾$/¨ï°~‹³b¹ù㩁Ëüó·z¯§ÞÙSׄ m¿/zÞ\Ïf®ÙKßðH–ŠÃpgéë:Ë|N?Mž˜O”%f+œ£f‰ùɳÛüüÔ˧^85BœR‡äìä^è÷Mî'j×:ðÇaÆù êÕ¤ô$ÕÊďæµ]w˜Û -Iò×üv0¤!Öû)!0ð”™ë\(,2Ó¬z.ëWÍ:™+VáošÃNÀáoùäD³äY“µ®ÀßJAÍY7Yh -°éÙgmZš Ô´&Hf’Y´†™ó&œbžQÓ`ÊO4CM /M…*JUÕSʏ)cTˊ’V”¶¥³±ÆË,Ô´—Ë"`Ø+á`‰GJZSFkŸT¦ã…¾ëÃ%X±hð§•Úä~± OX~®ñ؍TQä·Ñ¹ŠJm%‡i‘5s m¢Œ Æã*ed¯Ò„R.™AhódˆGƒ^Z “.+ØÒÛD…+@ËÞ´ nr€å^x“‚,G7 ?µk‚œŒ3Y¨SGTø°xJôTJ1kèÔh¬¦to5¢ÓJ5»Ô(šj¦éׅˆ§Z”´WÈ¥Æñh9à_9RªÑ*vå}ʞiY¤Æw\ñ¾åÉ5>ùGjüÄ?ÿgÔøGNrn±‰ZÈVSžøm4£dß?1]O8Ê)µ u@iî]hyÚO‹¼»êj*ðíÖÍt˜£žR`ÛB&r•ÂW&¦…Tî²]pµÁ¯yKå/ƒYt*—Ifú”ݺá4å§N×%ŸY€‡Ö0©ÂqTŽZpcÜg8RVheŒ>ΑÞş¼H|ûåq®÷AåçÿZ5¾g\ԓ­q B{v–ia2Ësr“–šÄ–m”­AjW)rSq¸fÕ"\E%'†—¥-mZ.?E§[çúå§`K™9¦ñì3ºÓ„ÖS»úkbt¤'Ãa€í¨O~\å]ÁèIy“pý9µ¸9xz;s¤k)k¾Œia`Å-VÔ¶˜°÷¢Ñ¬ZͩՆ–úËZºm~ ‹~v ìç¬QÏt÷h,_úÓJ|J1œò»ËøÔ"5>ùÚO56f²³½tÂ;™¾Óy’%ˆ\ºg–7md¾´Ž™Òv4y4wõ–m'óMk0rÁÄóÜip¥©MãΘýL£RÉzFW™§—ÎS ቢÄ%<%µô:¹´§—®ÑÏ>37Wqq÷V°¨„ޝZgMl¶ÉmVÝXta 9Ζ®«â¸ªN«ê²jV¡:«,³e ³åÚMµvRqO=ûlå :æžZ8§sLIGS‡œROpCiØSËéSŠÓñîrÌ µW˜Ïó“–ÿ3jü™£üÌQ~æ(?s”OWãÏågŽò3Gù™£|ºnöG?üð/齟†˜û™Îô8OŒ€J2 A™¦¤Îø¾Cøށ?øçxȑÿI«->}„ƒõa“ú“N¸Ý³¿úÊïf囱?A¢‰Mˆ'cߤÛzä’U “Tœ†q3t'a˜§C5¬/©5LÓ!0BKÿx<Âp0<‚g|;_°ÏV@죥ìvÛ³½rú~ÅkZ®ñó˜çgÏKå1óÓ@þ́ñûGxåýx£Æ‚ÙžR85¹öœÏöŒÏUù›­©MÙtꉫ}ÍfˆÎrÔ#î×Ânl vÃù‰Kv¨‘ŸîÔ¤¨©i–r“`©I¯ôI®Y2Á0feRSH}&Ûê"óÝåØæ¶ëRœ»áÀG LŸ®N‹NÝг:È´^xö1íú1žÕ¬ApΨ y «ÀZÿ$oóéûçãYçaÆ9|löܜÎËrȬÁ6y0.Á¦O‹N{`ÑC0×Xׄ ûh ‡ßæ0„vñ^v ԙá¯?:úN0#øq ¨ø 7؊´`aïhá=@™Ë6jhÈ>ïÉ 0qÉAÖßüu áàzëõ`Àºa•÷·Í@¦˹çú­™~Ss<ŸfÜ1¥‘eömâ#k>ßÑóøn-îÑç5lÓ=PñLTB'ƒ,Ít¹í,^ûÜ ¾šHl¸áD˜5ÞþDUŸ[u0 e¢;®omó -ê:ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£!8~²J ÀÉ%çBŒ¬É§CŒÌü÷M²Zr»îfrc×!ýGèûÀz«ð·1mÞÔ¶Á÷¹ë£Wa>¼ ó:«g,ùیÝ>kb[™{ ¤·BWÖë÷œ;¸k1õîr¿ü”{ù9OÍå¸Ævæ䶖¼#g¨I¶õW¼§šÑ5mDê:½Ô¡SýS–\Š -PUyJt)ƳĒúæ·¸ê=’PYéق-m1Vv´S‰í,‘C ô¶k;é`kÃ#)¯¼ÅÊ -¥íe$â`3«s–èãEóè ¬äœ[Í<Ð*ìzéÏ3æ«åIiVÍ4…©FP?ƒ°K˜q½&²Æn`‚²4ö=üI/JSÔ²p”Àpà¯sNfQçÛgý¤õš±èãŒÿ¥ÎþÛõ§s*¬êµ~íû¯-̆ï–ú.Ì¢nÌúþdßsþí鏪ñ°b¨"¦¨Ð~½,{JÎ*×v‹”«j“«RÂÏKŽð²³iŽqÝyT,ÒÔç0ßQ›,ûc¤L8P âBÔ0ʇ§–éq2p9ó:Z6GØLË!ì†㧢rª¤¨ÖB•w̋¨"eC“! Bþƒ¼)oKòšûÞþí%¤÷5.U; û6`d=“,8¾©ý·*‘ûüŒ®¥š:S-Šj^)ªÓBŵҨ8Ù?{?¥W(Ž_j…Úúþ±oëcÛZ5ÈÕ£½Î¤:%5Φ`íVØV?„°9Fph põè‹ìç·î,{bqg¶ÍÇ\šû9,kK=~bvwÕ2#Û)s$ ´Tá GêgÜþ› ÒUã•ãH1E…Ù –e_ÉY*A‚tè -©Ñœ°²³,0õX‰ó&Lç9aË -s̍Û:qÇÅÁž§Í¡žŸi«‡yn-s]±–f+Ït<žÒBÞÓõ˜ä‘aw(Ì¿½ ý“Ôø¨J—Çûd~hñê‹Óì]•*IçW -W«ŠU­dm¨jÜhþŠ©î 5Î~ÀC9âátáÃXz1Ê!Ê8šÏ¼"Z¤qï<í¨øøÅYÚ§çgÐt“0*Àބ›á#‡Ãÿ",)™‡iÊ'8ñh3œ>M­CðãêQ§Zꆙó®Fž³%Ì´OšÇ3†yè óô¼u$öa§aØÍã|tUv¶Ù{½Už6C<™–OòÁU|¬#/tä¥5"÷ Fg½¥=91pŒ{h5^§oNhF2¯eÚãrjl9áªü[O:]ž[e²°þܜïº>åu-N@BélyÊw­¾?hÕôÎUV\Îåié5 ÿQ ¤qÛ³@.šc÷Ï™›—§D? Džäè‰ U£ß6¶/•S×A€¢3ñðÀnÈÓTË;Y]Ã1Dš[|ë:iïûßmçëÉz¡?\fI&»5—`Y¼Gà¸póG¯ÄÃàøô3:BáÏèøŸÑñtü8\‡B>µÕ?!jëøq¦0~zÐrzâ$|BøfZ×3«Îì”ærnU=¹*ûÉUcsŽV=h˜§tØ3ޛý.ççÝn‡sìÜ±œŠÇ.øØY7Ħ=IÌ *Ãâ<ϽøºGŽÙX ¯ÆïUyh<4¯›Šy$-#‰ ¬uæULàúˆŠ½g> x|b篋éý(Ï~*×~|ÑògÏüûÁ‡þ0QÑñ9S¿&;YUgMMw]dìšò²õÌ ‰"]ŸÛI¾OH£¿JwmFÍG šO‹K9p¸Ç‡F¦,C4‡{¬SƒœN3ñ¤9ñ!*uŸêH¥ö(Ÿ‹'z0Ûўµ[æC“ýÑ9ñ®DèË4èfî¦'ùc¢Ö³ã¬‰[zïx f®43Æ*8œì‘VäÓIäE.ÿ+ÖxÈ©vè$øiÉñ¤Æ}Žw@s9˜Êz™ÈÚ"°ž}ö‘1X“FaÕ,™e…e®Z=hïg²«ËBY&‘9?œFæ';SëC¬‡OÕbÚì'Û¿XЋ%ÅßYMò'ý­Æ&úó4gOJô·Lóg±["ó|Tô–FOj—Ñ[2Ë>8~‹ˆ] 4FC꣋µu±Jö3N ôóœøyNü<'~žÎ‰eZ°÷ȘµŸÿëýoþIÍ[Bùöww·_ÝßÜ>ÜÜ~ÿùç­êÞ~óì³ß½æwA¿ûêòááúþV´úíËß¼¹„6omæùd‡nà8Ža3ÄxÒÉèl†~<‘É5êoõ×?ÿ¿ßê‡â@ýçõó?ÈßÿC¨–®Øüvó/ÿ½Û¼xÆ»~ JK¥âÍ+P÷ÚÛüfA.Ïõ›¶ŠƒÄe·øçùöþáìæêáæîöòþÇͯÔ(ò|ww÷Rúâ ë—oÏ_Ü<ÜÝ»»¼úWé½o¿¹yyýíﯯ~¹ùO¸ãÿÂ?þÞÿñ­Ör¦/ý¥Î•Ç^ª1´gM”Ù’-K¤œË¹—qÎ]˜7ÿ|©u-{2ôýIÆ~“òI%Á:JÞsŠ6i>E&Ûk8AmiÂÅq3d¹\˜Á&¥“^Và抷åt"‹†Y‘C¹o>é¦0l‚|;±ú‰Í ù$ p;äî$͸: 0ëmS<}f3Œ}–ÖFiE„ÒMô¡@¹6A^C$d»M¨½h8öÜË,§Y{@f„àŠN%ƒ›†ËˍÔ:ÄMOpDÕfÎég™±?‘WÂsØ!D¿«?i·÷'Æt"|2iÒ<$§ǓØçyÓ'Ùq,÷'³p£ ÚÀ·x¨8Íi#õåˆÓ S±`4°0$¿O^ -=÷y"ü =òI'úÞ&JW -³‚<É8 -+ ×IvŸtýˆé'{™(¬gƃËÈÇÄÏqÂscäç2r /Ü óÝ ÑEóFE!ê¸Åt"l­Œ[èOäƒÌ¹Qú·—w“ûE]7c”LòÐq‘çÍ(aˆõ>™}ý0n¦ñ™])ÜzÆm²‡ AÖj h#7 O¯³kÀšÊ[½ ¼Ò, Gðyƒ5ÀÉ,“Sö9y°“±“ž¹¯˜Ì*4'Íd¹=IW™xœÝÓ Pb”û4b6ÊõyLX<]Â,_¯9Þ÷®ñ3ý|’c—q ×Í«Uæ²TrêÌY֋L2¼ÈÀŽèü³Í$yºYÎ/’µ›:ø±4äS4™ÆóˆK¬™q¢µB¨SOS/+oá­^«¾xèó‰péË ,@¦×«%5ê 2=e Ȧ< AVã(Óºlìd¾‰rÚ\µåZQ!X{v_¡'¢ËØyEýI”Yдg»¯<–_VÜ+Z½_}õÿøüû‡÷ØC¾xóío/e>½{ýã·wßqOùõýÝÛ׶‰¾å÷ׯ¯/®_|+¬w›yó‹_nþùŸŽl<2SÒØV%ÒÉL·m'L-pÇ65 ©Ýq&=¯Þvœ˜O„oIß`E›Ë•Šôðøʬ 9„ð¹1 î…ûò -äZ¹Q{¬†3Ì:aõ>Y¦ZQÒê0Ûz_¡öÝl7Ø؃PúÑ(Âeso(zk[\(Z/ì²>›Sæ¬rÞY¨Â¸ü­3øá¼Ùë›=N sOºe^5Hÿ -Óyµ¤Šä–Ö Ì"F–ÖcO’ñ±öȓ=ÖkЕAؗWâk«ö8©½ lF[¥žNW±7Ö5«º>‘_UžÙëY½ÚzI¬&aßëd+¡÷Jöµ~´”ÚSÀf…Ès”=Þ¦à {­t¯0Ür2vŠµ=0 ¸l®Â®ºˆ„±Â¸1Å°Áw²-ÉV„'îúÂN;áâع«€©õÂçEùÙÌQ6â,¤,õYԈÍ,û…ˆv6‹ ý1 ‘=bÃ]°—‡™EXÝEÂ+dzbÙç¡ì^BíJw,ï0@(’Ý +‚ r}–Ö҅Xîj¤uÙ$a€e{¢]LØusœqߪWö·!,šNš¶S'-¼ZRñâؾå…SädÃ4„âÈòòùÊ;[4Åz‘HÂ&šJ -ÁÚ²Û -UF[ºaãõLèä8ÖÖ -ÁîÓGªW•gözV¯¶ž|ýfûú0¿¨ë#ëÁJM2b2Ò2UOúÌÍ!cJƒÓˆNœ`<,©|R/“Î!y=…`ÍÙ}…:@ßßԊDîN2j{F°ûì©üªòØ^ÏêíšN4½M;ñ¬á^&Nšr+ÈÃڑP80ö£Œ’ˆj½ð|نù„ý4` šd•Êšž±XlvȤ›!€%|™ù"@Ÿ Xd²$ÆNKŸáþ!¹´C 9tc½J–ù{ec0‚(@í6`TFŒCù”l?Ú}"På ۇ°fßzè!S‘ŸŒˆõS.Ž:‚Œ+e ýV'‹h ó w¨c¶ _ÍÕÏ"œVŠÞ*;²ˆì¹¹PsJ1rƒ¤BÔPDû˜ûTn-d²– _ 9ÉPÉê¯Ðc¬ÊË: œÓ²¥ŽdOBĶ$“³“íDF Ûf?5Ý4t2V/45OØ°Ü1¼pÂb—™7áÆnnöYNƒ¾ƒ&à0Ø4Œ Ã0EèZ²O²ÔÀ£sחõ$Ÿâ((JqÍBUzRxêfîô֓u[‡.ÂÛ£©©HE• 1S^iw›”C¹÷Âϑ*§R|®ÄŒ¡©Ò cßÔåkÓît²tG%­©KÄÙQ–QÓ¨QìV:¿Ð_À+[¿iíŒ~f7Nð. &õcœsÂä.dQ³EŽGÇv2æ´ ˆ˜—'c­å´i*“Òã«ÚªQìÖp2«o/” h³¦2§,[u²?žW毰~צdÝ°DMYZ~µ¤"4!aÕíîˆÇQ¢u#`Z‚s)d ª—YGØ+r‚µwU&ŸRƒÌ€°½¢ÁÞÊÛ3‚­úòX~YyðRÑúýÞ!é}” ZhSUkÐ÷…ÂíYP.p§Å ÕG‘ÞD…[´ ي6»AKÕ™MÅ 1Wæ[\´PÛa"0ƒx)Û+­ž–á! ‹Ù)xb1iÉëŸÀ´î&-y …E«"$À\,Z`¿a>(-rFŒü¢EÆ -û•´°©tã8»A«\ÐسÀQcÄNiÏ-‚.L<½Û³úACžÇ¥= Ô)ˎPìY.;{–@K{X3;Î Z²²`Ðw{Vԓ…9Kd¨k–°…†ˆgnmY`¡«Æ,©# „ÇlYÂÛ9` S–ˆê“ì4nɂ™4K'C–ìjaÇêUü¨†,ôa—EŒ,†,iÿ~Š¥!«—¦¹ÐŠ!«—Ù›×.ðcNâ…!«‡f<ÍnÇÂVÛey±bÇêEç¤^ر°©Q2.v,iY¶pYQŎµ·Ôö·95õqiÇrj±AardL&3QõL.ÌXØ׆1×kz˜Maë+•¸T©fƒòzŠ•ª4¶°eùիʛ”zÖ¯¶dç"EÅ¥-«R;æä6*X¢6/MY่¨j.ë´áZO!´¦¥J5 T­ÈlTµ½Ö”åOåW•ÇözVo÷¿•%ë#Œ† 1´‹óRnMqh܁ðÀEéh÷öXJ'™?ª;”÷Br•}kh‚ÝRĆê”-Oß«¸{ì¹2hÕ)H‹FêݙH¯ ^_ý>Å-å0݋cÝØEgŠÅ3HmiÆ{× (øÂDŒqß ðV‘–ʾUœƒ]8¹¯ÞAޙ@)îAvë4*îAԗ'©Âýƒ°Rßq¡ì€"à;’»‡J¦<“û°ËžÞ?sÂÁiºôÂôDÕ݄ÐX£túf™wâ.³W+r–m€…✃µ„ïäN<§,݅ͅô6UÙgk±u‚-ˆD;WŸ!tcZ—½=§,½†Í…þð^Ùú-8e¬å ú´òÂÈÃIè>º¡—}xê«+¯–®Ãz™ù›šœbM.‡é»Öݦš&°ôÖËüὦõ[þ;‘º„é™ß.ÀY&8öM*‹ø^´Nl¹ùä ÎBE¦Ù›ጤ¸«5Žˆu¡nϏ0ïQó€4¦•Š)`AõBø©€Û$ìßÉZŸÀ˜ý֔˭²k±U¹µ 0ÁD ¡aïU÷õ© –¹Ô5wCîuSB]0ŒÃ<÷X†Ž,¡B1='«Ò[/Ɣ¡;Öº*¥kØP%ˋP˜«•EaC›V åª *Ÿ®^W^ÀëÚ{ÓwÈCŸÄE ï§ÄÒG {²wqRïÐEص‹—ºá ‰•›š6kÞZÐà+:íœR;ɜË$+žê!Å2?ÍS픥§º^X<ÐWEh)ajfY%cXSë›Æž×%®e7wW¥q0Ä«›÷0V‡µï±Å‹ì„¥Óº^Wüѵ®J±F—ŽkîÅ4xe²iÏ+ÂÒwÝ\ç/àu­ßô's_ƒ£ ÛÈ+ÍÓÉEót[dÑ<1MhÂYhž`/¢3 ®yB?™svͶ ݪ§‹êé¶À¢SÂ*>ÁºP=¡Ov‚ -ÛdQ<Ëç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgSÄÓù…Þ}EëÜïЖ«Q#K­³’‹ªH;íE™Ätè/µNڙ ßÔ ûÂ/½2§,´À†lêb­¬¨”µÕ…îY¯^èo敭ßõ¸3ü£Ló1âVpø«_­ÈàHô<ÆâÔU#Ájë ö8Åíó´³6B €±VækÕ‹‘g˜)Æ¢•É®%lnlZ-·î›sÕ/ôWðÊÖïúúÆ,àqPõ°Ã -V-@”‘yê”1PæëÝy±Àî§ r á(³£Ud¶Ðk;ÿÐ+oqe`W窼°üÃÒ4:£‡¥ÇÊ<‡!  ‘zøré”ˤÀÑýH¿=ÜìŽýPö’‰Þû€ ¡ ¦¡W§¹’Eöù”Œ#‚*Êd챂Dµçk`—Ê걸²B`G?£ÄàÞƶų̈Ð(yðiœÕ]G»<,yà ž'ªS®]÷c¡ðtY‡&Ù^_ŒnÉý±¯:°)ÀZ"7Å)èw%+¦Qk‰ôτ jÁãX 6g‚"ŽšëX3Úª -Áš´ 5¸Ö4èÞZ[šÍ¶y2¿ÎŸÞëZ¿æO(H à ¦Ft2ð„ÓÇ^‘ ¹,LŒ 養 ó+0öÂxCÕÖ)ø»r#”Ò‘òe߈sXiµ…0 §;&¹b' ÚP4Äú(êF#CÂ;„‰[/œæ”œµ ÎPÅpÌ rZ‘Á)U“ªB¯Sd!U²’§PäTóóIE'ôaÊ"Pf^Hړk`hÔçËóÊÚhîìU ÅyÆ´ «±ÛŒ•ò>lL+›[¥ |‰Ï E@_u¶¡†D‡¦ƒo¹SCUðV9Û;à΃i‹ š¨C¢ <6¨}’æT¿S™Ëԟм٠ŽíS'–Ô©UɊ¨:/Me‘ÛR4k? -¸¬3¶7¥„ÅãFAR=¥Ð'ù`“uÚïsLOàöðJ´Ú½Z‘eûÉ4»ˆ¡Ùß(ÏÂí#ò- ŇtøÆZ/”½,µUÙçÐÚ 1áĵ~ÓTCLwµ=£Øþ`~¡?¼W¶~ËÆ+(ó—þ7Ì|ne¯VäYM¨€ßÐsE0-ÇAáyN1ÀF¯¨¤æBY¼CZTækÕo5ò¤p­ î]Zk«…b·–Ç«ú+xeëwmúA†gNؗE$óՒŒ vR®Z5Ë`@a9œ2QNpпP¯‹H3šºœRµ[ Q‰®ƒR!bJ›öÙ8Gy´rU}©RÑÞkÖ.€ÍWD¼Ì¡Cñ7äÉYq‰"¼©y‰’9¬²YC¡?‚ÝÆúB&tmÇZYC±VíV'ó¦© n‰ÚVrUØÏ/ôW°Êöߵ釗ô h-ÑŠkÏÉ°éA†‡ìÆ!VFé(h‘þÆJ¹*ÒKJãØ^H8Gn*sJiՅ #›a¤V&\•1\Þ¨ÌiQ®\V_«Ô´÷¢?™±ÀQÝØL‚lùK°;ö³‘yg ÚÛԘàÈ*pwX=Bv‡@¼CU KÊïÀ¦§‰oƒ¼"4 ä£AÌ;TÈRŽyGŸ©çµ€ÞqmHî@2Ð;Í-qŒõN™ˆQö¦æ5ìïG@–ãÞaŠÀ¸ö»èÀveðpüA…n }‡6T R 9wuÀkî”+ïì ͅmoê*”Ò¨+TFÎ'•Õº¤­a¢X-—S íuþZ¥ªõ{Wý? žî¹Áñ®•¬¨“9Ç“¹4WdºSÌ"böæB¹×ªœ`MڝN–즩k2stmtjÍÖþp~?¾×µ~φÛÁx!È\5·Hœ,r—ÜŠPK@”ð -°1öæóìpà«Sl™Écß\`-ÏM]…PÚt–E*Lz³Õš0·âÜ6Y(&–gó ýù½²½ý mµÆÂ"Â|@aŽÆÊ€Õ“ŸÅ@Yj¢LKpݏàiž†¡†8ÅD#¨×ä?$v3ÈÊÜ/T'#“ÛB¦öʝª×X˜lÐ=J®~UE -øA)´RF˜/üV'‹Ô 9×(€–4ð(§˜ädQõÂþ&LTJ±h¸Ðeäþ„é$0Ð Æ$°ÑXŸ· À5¢†¹$G˜Ì{NEJI£Æ” àˆñ j/F“&€ê«ãa€NФcQ‡¾ïs À^ƒ|GE²²8h÷cnâ°›ñ!ögï¾%ºè1š=ÂN^­È¢ÒáPnGãóÍç&T |¾Ý_/³€¦&§X“v§“û¢O—º -Úð§Ø­åÙê…þü^ÙúE¥¡ çc‹½G‘p¿“=«>œ†’Ú™J†…Œà¯ ;¬µU£Ø­îo.´€¦2§,[u²?žW毰~צ -’SiŠnB¯danÀº8(_dà“ŽˆóÞwŠó,‚üë…% VV)ÖêU™‚FîÍVS+ëìõj«F1àçú+”ÊöÞõBó' XBâJ܀#âà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q~ÉçD &pD\NÐ"â<žÀq5   â<¢`ˆóˆ‡Ä•ˆGÄyHÁç1W‚ -W -–h¸Wàp¸Xàh¸Z°ÕØÇ•à‡Â•è‚%Îà  -çñ…óƒÎ  -çÕý^b –P¸dàH82p$œ‡,‘pgàH84p$Üþê<à°5<þ א ¾æÐ~¸•€%Îêu%– ÖU)-0­!‚Í+s”[it‰†ó‡k®ó(uí½ér 8‰†kȆa+0ÿ‚ró`€ÎcêeUÐT䔙֐ ÂVë2”[m²ÃùƒùUþè^Ñúé¬ÕÝ ;Ÿ0b_r2¬“ -h)ë#ÍÅғ{6f³.`¦öBaa!Œm]N±F«aBɲÈÚS¼2šV[¡¡>]¹®¾@©kïM›òQšû:õ5ÅuL`¯Vä^ƒ“`óÙ(éÀuAõ‘B¥¸±Ç43¿{çÚʜb­^K¡‘ƒF7•%È©mÕ(v«?ž_è¯à•­ßµíՏÐYá®ì&U_Ò4i¶’aNcZàﱝwO"u8,ÓäJ¿Šil*«k՘~!Ï¡ÆM­L(ÓL¯wiµP¬ÕòxõÂò -µ²õ»6Ü*f“M°Aañ¼Z‘ш²›S²ä.=„-=¯k®{@|òÐ^HyßVækÕ7?'瑠ÅRlv¹iS?ÛmåÑÊEÍ;Y5ë·üTksÌ -i4pQS¯Vd ¾h¦À¬&b^4H€Ô=7”ºÀÆ~qa‡8Ï©­Ì)֪ۘœL·ÖÓìܶ©gölå²æ­´¢õk¶ú1ZÀšÙ©JH…¾Z‘¬ Sè%•1žÛ×#…øB1ж}¿.°×U)Ö¨{«<ÁpÑoj]0ó©mÓ(WEy¶‡ó ý¼®õ›þd“–Q‡D…@^Îâú2bÔý .(ÑsÆ ”‘¬ú9±}¶÷9qyÝ/BÄJžšZ -ÁÚrÍ_©²¼#]÷¥žIÃÓkkSïÏdTh«gýf­ïwPÝzF»<*]֍ꬥÆ5cöõS;.c»³*Æ~°Y ­È ֞ÝW¨˜&àU^„voÏî,ÖÇòËʃ—ŠÖï÷S-Hîȝé-#Ž’|µ"C6-Àh€ -*O7¨ôÑe˜æ Å9Ühåõ Ñ s[W!X›Îߔ:)ƽ©)[m27¹Nšgó ýù½²õ‹~"ÑcÝ¡CR#8vXe_-É°èÀ u/ö³‚( 4á N0Y¾˜šË:uå55JiÒîtòÀ×ÙÔºh- -¹i³PìÖòlõB-¯lý¢?•„ ž:ZRŸÞ‘.•:2ÞeÀ°{ TÖK#I!˜Jp*ÚÔ^‡e×Ïm]N±6]›42œ5€jÔʐÀ¶ÏM£F°;ýáüºòü^Õê5š JCOG½Ić);ÛÉ0k%ÒÔ¤ˆ\OH¢Œ=6ÌÌAc{7fWŽí…›jeN±VýV#Ê,jeBí<6­Š…>^½Ð_Á+[¿ë'ۄY -êð øþՒšKjˆÑŒ– ’ŠjPƱ•bÂH,ÙýBΐ ª©Ì)Ö¨Û{”,]Çüxµ²¡Ó©Új¡\•çÕÇ«ÚÔºV/Z{ðSFȽ#ðíú7sIí¶€vâF UAvËkwSŸ+°4îÕ \wF¬J®¨nX ;f 1P÷„Á¡ÙµÅt˲¦1UH7²vgìˆîi1ñn݉é²cÅsÃXK§rsÃ;BôÝÍ xWð[í"q™¡b¹ùT8[(·´§ É=šŽâ@î¸ØIZ÷´Z˜+Œ{šeQ‡PQܔ´Áô n˜’ 5f î^–}q‹åÄ ÐÐY^6ú!ÌQ6/߳yfØÀ‰‡kܕjFu$ܜrƒËF<}ØÃoOpOÀøT¨“xøæ_@*+¹À èÛS.+HIÙÇó”ã -Q {?N•š‘­›¹á­&',°N-H¯¨À$½½œ²>W!×g/Uí¿äO£Ó|T֏£7Ï¿¸}8p~]þñåµ>Ïoý/×?Z ©Û<ÿýõ塃sÎn^}ûÕõýÕõíCsƒÅGoã9;ÿtóâá‡ÒıçúêþúO7×–ÇzùæxÏ4O#Ïsý¦}˜£—ÿæú»‡oe.îïnÞyõ7w¯÷.pï‰Fõè{þýõÍ÷?<<õE÷ç7GGöü™žít~ûÂnv𰧸ùÓ5ŽzâoªyŒ–Eœo˜U…È32«‡ÜӒõ×â¤'ƒ›¿ï‰O¥ÉÒ@Åo-ÚÕ›œìø›¶ŽÃÔeÕ3Ÿh —ý¤cvԈƒÔ åä~èôðî¡Þ—És’Æl#wdôìó "¬YãØ‚È78}¾) ŽÖ‚ò‘§ªx÷Äês1 ÏÀ‘kBÅ:UI¨×ðjÙ*¤c5AO€î=!¹L²½‹jFgÈt~îÄS%½;ÝlÇs0GSÀé -Á6Þ֑TrÔÞc#†N 9L³ÂPßNO - €ÈE[3x»î¿”Aàó}YßMvõ9洘Ù³"%óìý<2ô€H³òn-9Ž½Þ⬔ÄQIÈ©M †Í­ 5 •Ý=¼.YxܤÊfŒc=¤¤Ÿúž‡°% vÇ{ y•/ŠáøVºØ…XDž0¯5²{ša—õ]&’ÂÔ5KœhZSðP‰q´øs"ÃII3ñ¤’‰ÆYÀ³õšº‰©}ÝÛ¤¯Ñw6`coY„!˜¤XP\HõÖHM¸Ç¹yÑLé#sCP™­Õ™B Ýyk ªj7@X½ièä6ôŽÑó8:á‰A.Òh5!{ìÝhqt0³ñ:ÚíÊìês -:Â!g $Í£ÓÁ¬  ÜÀè9¤ ê=å6]Â6 ° %éG.Íl‹‡”јÂÐم‰—å>«P'Š¨‚ƒqÌ#))øQæ*¸BiaDìWàÜ%u ¾çDbò°vžúÙfx>¦ö ˆb†;52³Œ|˜{Ȉ:zla§«|† Ž˜ÄNuÜ΃º_ÌAÅaÍ}a`Êç) Z;¼rDj¥Èq£~Žî–‡×{$¦3NèOx2gyº9ZŠ¼GNDa¦¹ !3E —ÐXƒ¹ô43݊…Œm’ÚžIÆ)S_À2qn[oÉ;@û&ŒŒꤘ¦Iªe=ÄiöI»™`zOçÁh¤‘œ:tÁ‚"¥s†Á.;Õ°{¹ ±>P±;šW²^ƒH6^d¶`trq‘ŠøÀ©Ó5BÀÁÂ3gMt6‰Ï£÷Ig9@ v›(ss[Ö¦÷Š¯ÊpAÐFCÍÊÃíõzmošt†Ò,4÷<Åkr…Ö#ä_@˜CçyEò-æñ”¤3ôjŠ½rÃÂD®ÒM³&æ‚žh)‚f•î¹©vªòømD8a{J°â“^Lüÿ¬÷aǙ:}=cs½.nj¦ 1ÀÚtl£›°"çàl1sÔ=t ×j²§ÌLÌWWžFÐÖd}sôËDˆØÆȖrIÓZY’ÇEÉ$Ái/\1àØùæþX€!#Ü؞›6  -£ 5ó÷q¥!HµWóy# -Bžß7caÅrTÈDÃÞé5çaFîk²Giô&§¥NF\»zÄãäý"¨²ÉÞ¡¾eýŒºä•…˜ÔìU,sCŸK2Š•àÝ8À‘¢ !vÎ;;t‰Q‹Ì%Ÿxb­"ö!EnB§ßÄýUõddCàIË¡þ#™´æìG´'EÓd'o ¹±‚<¦^“ Žè/PRèԗ5ÔJäÑ t~Dg„5ÍË[y´‚¶‘£QfÍ3}™°9–„$vpEšétËV{šÌÔÏÝA_5d•ì±ÓS_‰ô~j04-gH›»Yƒ)X—6 -Ã# -ø ‹ÃúSìõ ¾tç£ ÒnÅpôVcâXb¶ÓDMJ̃mšcÓèÐk_r}\G3³>/â/é’âR)¯Ú­ÀôÏ&›LšÝ)d˜Á£Sæ7ØÑ?Cª©aƒ-(Ff'M:ð$ÒG#÷n hxnl¬oÔsQ°DF›Ê -¥a êSffØ^5D{\ŒCÔ4µä¨ /"€o’fÅíë¬G¶­ijpúœi s°²0é­Âÿ4|’hRf?ўêA”ƒ:6˜/)š„-CP×EV3ÁˆÜËúÞ÷4CÎþÙc¾[7…³~T¯ËU±¹)›ì*‚:¥h!ÄÑÅ ô–‚‡–P¿3æNÉ´ªñÂ!©ÏyR WÉ -ws.\t ¡K‹‘ …ž‰Ãy£†ÿr?º`fA›,·-ÌdŽ-˜þ躇,Ȉmœ2g§mÆÎ0£F£ öf,‡±{5ŽW¥6Ý1qB“zÓdöÙb^g“µ¸ÝOÉ(lrýì[Ü2%}ªe ã:O4}'b·gKf>BTÐWE€uA- PnƒÅÀ SmºÒ4­U^à`æN«#˜ïÌ|Åö9Gž?ûÂî˜@hq"«F-´3çrh pT™·uöÀ{ìœ,…H¯y`gc8XÓiÔ]ÃÔ²úvHÞ¦Õujv¼¦Ò<óÈΙÁ¹4 *çlþXÃ@í{ ö±Ï¦·‘«,Ò'L%}©0uÀ›m’ÙI»aŒ#LÃ; }³®¦ÆäΝ¾ gËlNA†ˆL²Tg`LŠÉë‰ÿ•:hÿ’F>~Qø3WŸ-ß2ږx'ý ß“àìJÆ~û‘iÈJ É •¡+ÚN­jpšEM’0ρW4öw&"m K€3z£)€FØ?h*½Óñ3쌺áPø¬¨!ٖ…sþBë'ŒŒ£h@íxH„í<+œù°ø~Í]9ÚäH©Í7S¨A²bF)ߒa;‚ @c5æ!Ä+v43èJD‘|RN÷¤h¬·Á$ƒR{&ˆ²­);`;UO.肧Q$žƒ['ëá2ˆ*̱9X5Š/ÊîÃ×çü01üT ˜spâÛô“²ö23—TCŽS6y‰ê‰‹>¹ÉT@¾@LðÉ ÷V7ÑSFOA -xûY­êõ. 3ü¸ÜGR1~vnE ŒiÖs­9ñìNˆØ=tŠ÷™‚½ «?3é›psƒÀAYŸn@HÍLˆ)´à‰kV}ŽÖ5mq4<|£Â43/LiVŸ/mœJ êî¢O´‘@¨[•¶`V¦V˜N•2¶Ê¬ ÔVaáãQ­ÃjE¨ ЬìÂÉ>iµ4ñ/éœÇ«RéÑÎúÉålé¢hƒcýÎó®ú éT1ÇæŽY£zõ̶ ÉIǹl… 'ÚÜ@&£¡éR'/4ŠÁ™”Éç1 ½^GÇ)<œ’?|gûº@£'€§Ç¢/—d!L/‰-`Kk€À´§ÉÄ;œö={5nÖX3➄ÝÁ¤§œ¿×UÂSí>îY „1Ôû:H) ö¶ÓÌØÄP½ª©yÊÆFÓan¨°ú¤ ÞIN)œ‚ÌToðÂ÷x|w‘YÌÌK»(}˜´«+rS ‚Š H\c.\½ I6Ð!cGÅÞ6šÿÂ¿sÛ(¨ØRçÉE¢Ìšéx*ö V -|.óDnÈÁ@Sá4¨Qή¢gÙÿQk…/ çžìŸÄjæðN½[Iíº@`£³&aÊ5ÌTDÓñ̐@û ­Ðû¢ÐzÅ!€Û´(”g  AÇ>[Õ=êUŠä-BVï–pÆ`škÇ+1ÚȜ™pQÀ'ÏeçêgÝ Z2Çý/ wšè;k㬩®½ raêì*òjìT'#³Æ¬·5†ìŒÓ.`á™u®15$thQ ñ™²**Ñ#jIf -"@,Öð˜PŒ³'±³Í3ùá= à{ F6é4²z²÷aªùgõÿæƜfuìq¯êõ1™­·u>ð'v‘Þ =é‚g(§©7Ûb…€…µ}Z¦cĬ@¸©6שí) Š,'zÅQ$ö$ғÏÛà»b*ˆI£=iannã¶óº¦ÏéÀÔlúÆ!TÛ8 Gˆ3¬pj¨‚‹<ól*õ7±k9âÐsÝûxö2z¥hi25 <ž6ŠŸS“1“Æt¸XèÞnŠH8×@QM³:œ0Ûëô£môȚIµ¨’‘3¶%ª–Öžy{®¡Èס£©snÐŒN§òk:ѕ¨°¼ÑpXy.¨+%#ˆ–&µ\†È((pHJ–²&¿¢JÈÀbe:´cÕ/øY6äÎÃRçgx¸»[| RƒgàU´•!E퐉±j Îá`Íæ‹u|'՝{CO3µàڙša”8°‘úEpàÕu£ÐÍÊX¨í-º·‡¤#%qBʓ¡ CË™ŽåI ˆ®ÕÐ ¦V7|$¸‚6L8zû95žSM\4k]júèœt göÀü›·š")ÛÒ¨ðR˼BŒ“tҙøão—'ºaÕ·Íôrz‡ŽGAˆG/Í~ˆ ³Þ0¥nŽ<0 Òð`Ê1SØGqÅàâ*욡›´Ï!O€Ñ»²ò­¢ý:©ÿ¼ Þâÿ¤×`塄Yü\"ÝqŠì‰=§.NÆ.#ŒeƒÂs— ̈…ë -s,œ5—EÉ - ûõ*w,׉b½¯œ -ˆ Àš#ƒÜñ2µ@Ãö‡£~ ÁµEž› ' VžI—Šæ³˜é¬ä&zêÒVPQeŒÌBfÚ*B×(Ýž×s#ªöXcŦ‘9ÅázÅsG7QFµÆ……2ªi£a´aí10’‘l`†!!7FÆ Êj'„¬gžÂ´¡Í’9ü[ØxU3Õ×3QrElJœ´ÜH0;ˆ€Öì¼²¥b[ágˆj<o²,3ø…«ä·QêÌâÕ`#¡ïxgWŐӒ'~Òè”}ʄ!PzK$K²wììmÎ6= Q\„Lø4yêãÖê -ÜÅè`â<´6&ôïˁ€ª°›Á5-2”ÚêgÑÒ9Sà´v궮·gèNÆ%&ÏòÆeØ©Eݞr&=ÊW€¾•yTÎ+`d'Ô­ iJœ¢}B†™“*;%2Ö+>ó¬~ÝîÍÍ^žÕ,+¦ì0*˜’‰LáBcÉüýH À“4œçG'aŽ*‚ÛT ‰–>5u0ÛAd–;¶’ÀÝ"hOûmt`ap u4Û}è `ƒ£‰€‚ÿmtÑ ÷AL@¨¾î%jâe4™åK³K `Ðê¹ùOf–Ä2çŽ7™\öŸ]ˆší àÄ:ÕqèGÆt@ ½ž÷ˆM¥H8iϝ¢Ò„Õ)þ™²‰¼èt½é»ñ¼t¬æ¤üqÜ -àv-ðŸ~t ìz?òTˆ$€Úї·ËvF½ @âóÛP5[òv¦/ƒ9å@€ÐM䧋±iRV - -n#Ú BӖscŽ˜àz·×ˊ—€zC]¢@‘í€X,€Äˆ½Á• š'gì b ¬EåŒAARc¯²®ÝÔrtõ<"ØÄ4/î#ÛbÍ·9*e“ëHµ I L“šh’±±Ó¢L°½TÎ'µtŽî!`*ç€7'׉Aˆ„¦úÏ„óãLa -¢<ëɭߏ Þ9ªúÏTð ¤È쮞'֙²ßÙé†SV¡ŽF¼N £}!Íjè0QÓ£Y0õ0ÃÀÄX^Œ¼Q&ÆÒ²0zðp‚ÚÂäpÜÆÜŠÜQB Pg@=¹ódUlm¬G"]¾Øè(~˜¯ŠJM¼ýx}ã˜#%Sä:$Z½øO =ÂÆM,͍»¢NŸbeg*à±Bž‘î8 †{'muŽ†4Ðaws‘±Þtd"} rƒ‚Z%1qpÞ Œ¹Z4¼®QCrô|6X›xø­úüh–· pÉÌîÀõOœ'*EÓ¥œ9-ôD›€ÙÝ:TYÅ;h™ ²z€ò;™!`OL¬öºCáf¿øã^Æþ—›ç_?ÜßÜ~¿ùÅn·½ºzûê÷w—¸xgV¹8Í¢J“Á«BVœBßYk² ½´)Cè9K]/¢ .Úiì´J2ZDҒÒYØlÕ©‡>1ë}_ÏÏcšpÊ90 Rý+9FÅÃÔë`¢,‹ê]æ5ôë´Ü§:'"§ÀH¨yõå`à™§ÄôŠ¤;0 ®±õ„Bv*°)˜£›Š³7€øêÎN7V ö!…1?S‰é5Dr,×÷4‚++‡ÀóSªG”0 û Ô<8Œ‹Ä܅ò¬p¸2‰öG.Ù`ÒNÀםõÐó™TËDg¶rzup_Œ©ÞG<³*F½èj€±$aâgîÆövA$ä¤ö/¦œ†e*¶m0/ð]lfcÒYT&`¼Œ€éLÔÆ&Èã@@ñrs N<<¨:É-z¸^Êîúapï}Tz±ê“áÙ'õ2Ž–ƒÅÎ2¥ÛŒ{Ý©ëÀ#¢Ç;“‡Añk?™c¶c.È7«ß7ÊθaÖ ÌcêE3-á*2e:cךÔiÒŽÙ¿„ˆˆ4\Ʊ¤ÿCy…z×ÖY½gc”)!@×c=@÷Ž¶“Ûmà‰cÕ^ˆcÂ0#¸‚ÉJ*†Õ‚˜½]VD7èYY!#ç€V7!¦š4O óX/Ž /HêK†ÔÒõigàð#ûÑ@M5î™lßÅñQ6†Öù«ÿe8—µ ™š¡&-Çefê¡iHaD!¬áÜ A†§lÊû²ðd8Go/+‰ºhô`š‘Lø´‚ø®!W Oôø +…´M•‰y -m ÓyŽ:aµ¹¬¹¨ðg2Ÿ**¯!N È*FK¼ ½PR[¢f– ÜŒ>*€µgÆVô:pwê†WŸ‘}ù‘r½ÝeD³â]h2ÁÙ"z^Oo÷¾ ¥˜+ )£—…¤à‰ÉÁ•0+ÆÆî3jNê蓐ê‰À2Ði ×Çì‡׏<^½ŐK~ˆ‹ gƒ²¡=ä°Gúþ€‡s®¿±gdMvôßM*éÕHÎù¬xÍ,:%‡cЁ {³Ê¹°Ôa:‡o·,®¾‡‡¤+†H,X3íæ§e¨5„¿cT1Þ³ ƒÞ¥+‡ rVo»w¸oÈê™çk a~`<¥J̟’õ‚Û<Æ| "5ñèDÅg8@á¨'3g<•Öë²A_Ãь˜RÌ>ø‰+@1jÀԇ¬)Gªj±V$cö1Ž2*󀟍Ç;â˜Á!Kïê‚À]ßÀœ©Oa:èސÉÍcHªˆËÔHÄѬ`cR00ô’÷´#^ Sy«Æ±Æ<ª¿{P0bÖÙB -ß3dµ¯‘Ò€ýÔ{Œ¬s³“M¤=ål7z&bêu·wh‰á't„†{ãY9Žè¯¡Óóö*@'aqrõê©!!Nz²RÜI,R›@|’9R°ŠCºça‘½Þ©¦$@úÀIiÌq“:\{ʳ&­u¸÷ª8 a¡¾Ï’‰óT=frTÈo…F—°u#TãšÂûí2É̜æÀ’É8zĜ›ÀN#º‹)Ø«‹_§âž|þéUÆ 0|ʼ¤žõŽ [Èà óïËY&”ñ¸ ý¢Šmª'–4‚6˜Kß,<mÕ;SU7?ö¦íÞL*´’‹³”q¦ ¦ˆõ>Çê}¦U•ê•@?Q•Ù£T &ê“þÆYMcŒžœ)o©IN߸yžO£þ{ø=`GÍ°¶2]›Ó‚9—´1†Îx¤Îs_Ò -¸Ú5Ȓ®ê@ÊCJRq„õª XZ?Ý&MÛhEÃ酹mvñÄýC“y@·©O™oÑÛ±µzö¸Àüï´µ ¯Xð b{g‚"Aí®¬&àÙÂ$ÁJN 4@{à@›‡ßfKd®H Ó×AŠF³Ñmeމ¼ óÐUÝïgúÔ0{'4}Â5ÈL謅É"GE¬F³q!7k¬q0ÆÁ¦ôywb þÀ¢Ë|B%ÛU=À3´—å‚xÒq2Ãc5-,¯ìlã(r=Œ­XÖ¥HŒkRh ‘GKª]ÖïÓùŸª/›ú@_øMc`¶£ÎùjYã¨N%Ç æ¢Þ‚µ˜gŽç}ªÅÖ •Qgþ0èp”‚·„Q-ê.èah yhQjIæ¨X"PcP‘pj‹XPiå4†ŠŠúƒž„ËŠè§Q“¼™ò¢ŠÖ°ókç±s¶XÌd±*Æ«OËà©}Ðk„(0/ÁŒ®ô·C‹ C£/Ó¿=Tb¬ ôáL£bl< úÖÕàx_ô< ->«ïd 2pîE3Wzµ#{£ç=V9èãi„(Ý£´ØëÛEcBIAk,ôô ÖP&QÇi—]פVaׇš?šÐL¥ãðgë9ÕÓ&{ÝPÃlÙ£…«€@”™alÁe~ÚСñìӃ¾E`þFFÊc 1Ì6xæÆ$è5W^²°`1“E®Ú*〴À4ãÄQ+)+¨›‡ÁÈDNë·yª†ÌݐÔ#ǏØ.“¥×°»& WI‚f4%ƒO´ Á’§ØÐ p5ê†WaÛ¢ñ–çܙ±7M­™>8ŽðPätÁ@ 0´ øv@p³¨Q¯Ò¸è`2xšjsdfÈQ8ŒI4Ô>–ÃÒC~C|o胲°`¹)ô6Èl™§€¢Þ‚›# •Ìþä÷q³-„$Z6•hØ@>7ÍÙéᡘiöEDáhVG ¶9Ÿ³‚KM jæ˜!,uó%¶wddNn‘¡ƒ9ü¹ ¢ÇFÀYo78¿{iü>š™-,„O‘>êg‚‚Åš€Óë|„V¢Òh2ŒÒ`é˜ /+8ߘs†HYã5ɾM ßÛžßn?€¹(àÄP ÐÎdGb(aÒÃ6ÌS ‰­1Ûñð½eë ê4˜9ÄßNϪ™õqûrÄûPÐ5 VÊ11õM~uš#€™iJÐi™Ê‰‰­Wé_?ýØÛ¤,¹R‡âÂÍTßki¼_“RVèøXôO€Á«t AsôÔ{ à)\Áä!’QÎÆ}YTŒ66!­øñ¬8Z -íš_,üÍ"»̯u¸LV+-yø›pÈá -8gaªì° ÉÄÖl€¹qåƒxçÅáϗÁ˜©*ě)­ò‚.c/2ç „'äéάù“F¿îyŸû‡êqY0Ðcì.)ŸûñVʏ™•t8ˆu™Yõ˜Ð›ÖÀ”¦âÊ"ÿ30©¼¿ -zXýà 4¢ f-ŽF,Î`pCE¬Ÿ®›Ø[§ÆV1ÕI1Ôòáe£¶hŒ•„óûÊ>õøƒëÖåF©¢Ӕ¬ö³ô-´“Uo–°Œ æ5L„Á—˜OQ¡;¿ÇëQ)ªÜ´Ê°x h^„Ì ‘³¹Ý©¨P¾Ô­®‚ª/ÀÙP ‡T®Ä[L«,3Ƅ٬§!±d©Å»÷ÀHçÝUǪ^ºKÍõ’Üf ‚P䖪W×Â(f—•Çßi¯˜[VƒfN’»¼ª¯,`¢´ä¥–¡N_8 ™ôA6UÐ1?m}Sq¤àèrÞ´Ì¢”.¡DcÇŸ¦ç7UÊ žÚiP 7ámdz£—«.P©ó) î•³u÷;u]G¥@’PÃVZøi3¶Š Q•ù†¶ô/Ä#‰ ÒUJ ½„Ëë:²n“P¨Qóž9\i»ÿ¨Ú¡Ä ©È<»0™?}qv™P"Dƒüã Ì°ÐèÝmúüͳÿóg9ÛŸ£ýoCÿ>þ{?ô ¬*¤;Èøz¡?þq®ª¢ ü1‚Ê$*îôã{(Áðc´¾å‘Í>†O Õʎ>ƺ¼ß}’±´E1a€±úçàC‚L䡱ÇøgÔcüÂ®ƒz̝ä0l†#·@7©ÇñÒJˆ—xŒX.¤â?˜áóÝpÇÐ~§rOÚ1ªE/)D(H)Öm°ãÝJŒ/º¶B=QÇå6b÷ —1éL~º$:.Îş¤cfúœe KAœ¤@ǏgÚt 9¨°Bæ3 _Òâ# ¤aÇ#‚ÊßI9f3§^ä˜ê€ÜßÇeˆãG Ð 8æßõ oLã‹nŒÃäþ,¸ñcÁÛÉ6F÷$r<Œ6†lófÑhc,ìĜØÉÆ¡i`ãjþ÷äW•ÌTc¬îg1ܪÚ'ÒÓô•Þ€ÆœÍŸ±xÆ,WKi­­›?‹h܂"ž1ŠãÚxΔŒœ4cxÄJÁfŒÆ@w*‹e܊bOÊîõ%F¶œýçå™Üc‚Œ‘ùG¦þ࣢´©ÿ£I¯¿ê÷‚bŒ¿S;Æ؇…ßB㸨=0ÁÎê,€q¯Êˆ¿5jn_ŒsÇrЋ!$ÃÕ¼˜%Âøt^Ìœü^¬yR­ƒŒì@ú  /–äÍ4ã o â-iÜÔg²‹ù7•—ý€UIY‚]ŒÛÀN°‹Ñ~ -ï]ŒË¾…ˆ¥Tök£ sG•ÍA.–µ— †á‚†¤N`Ù¥1ï@ó½Yàbº8™n;ÕTóÉ-ÆJ¥Ú-肪%KhQ”­Ì-(ÿžÄb®^¾d‹G·ÌkçÈo+pÅóPЊq8È+† -`³Šñ\:.“âöQ»‘ŠÇ­O%@Å|‡ð%‹SŒÉ.ò)%k± ?CDß ?ƟâÇjŀî€F1ØÐÚˆâÇQµ £ä¿„bü}‰&º…ÈŒ|bªçï>ñÄð*àçïtbbºRŸpâªüd ‰aGZã@³Ä¸æ C:…úëЩ|\bäk!.1rMµ -Ôe3XûI%F ˆpÌ -\„ªÇÌ$&þnâ]¯hN ƒHÌÌ -ô•—"ñÁ#¾=nŽao¨vL#†Çõàã;ä˜Y¥ÚcdOJ"~wåVÔÓrfLâ=×DŒÊȏ„!aãa ҔôKÖ²SˆÉÓ`}£òL -`Çۏ²þ}U?Ö¶¿Dâ¿ÉÂO6olç³d,J1‹š f}És,?vø0Šñï6&{Uíº[,ÊTºçƒ¡Š÷˜á‡]ƒ·¿(ð; Ã€Lc– -æ0þv¥%# ø›¥ª;qɐ18̯U/ Î?wÜ0Š1_møµò"õ+`ÃèÛy«èt±†‘s‡“¨a€Œ«;™Ý>ˆ8@Ãðzàlgc 'Æ ãßñ0Êð#ÀC0†‘°ƒãˆá§Ès†aäGæq -#±|aŒ*å„ ÃC#ŸÕlah ñ}Z`pI²0òŸ„†´RÎà -÷¥8°ÂÔY\eR…¡y0F”ÃÓ;”éd -b ![ …¹pÀٚ( (?î( ÕÜ]ò -“øù<“'Œ¿9Ûí8á<„÷ špVˆ1XÂØç~N’0z^âÝ6HIl¸vÁ¾-p=0ÂÈÝe±ÙùW1&¸¾¼sô1ÝÂÕ((Û.ê¹á› |ñM¸ÇAøõö6"€pÕL<ñÁДòF¾Äá›ð`WNvð¥lê‰6Ñn’ƒq‹Êâ_þj0=¤Z'4êÍ[½,U“W¸X8ÁÿbޘÄ`$DJ]Àà!NÓÉ ¶ö;pÁ(*“œ­#<&^äTñP̍î¼HÁtëw7PpÓ59ÁUɉ Ž¿Jp<0þüUúJ"8Û±‰M¼v@ðü{ç‡1ðÀ¨pÂq'دÜÌc—ÉjM /.§õõ.ååTBøâJ ä‰¾(r»û‰Æ÷*–µÙÀßágE¯5øbqºO80Êa)s 60ü°»M40ÓÏs’”„ß`à×{ñqr¹¿ß°Àh‘x¥I¾¨0/yR1j0°rPqKé¸ø"[Š;.>Þ À"•¥Å¾ ì $0‚7w?‰ÀˆQ#f@`hz°¢1£_–‘A……RQ„0Ô}Ÿ,àì^F³â›h©ð7<׌ÝO›`$»Åe²õQÐh§Ãqñ,(À¸ÕÒs+ˆ¡$‚;8Œ¾Ù!:M0ï -Á%›¢(¼6†Rƒcðñï–îüßÛ¶ÀÿÞ®qú/òÿTPmxDu#bö/$Íý ¤0ý½ü ÿ#P€1⡾#˜¾" ØyÿÒÙ¿—‘yï üàßi4ø÷ÁÔQÆäþ¾»¹ËF<Úà³û«F'-Mîo¢~È\z®¿ —͙‹ þMÐ^Qhà_lG _€ÑKóí þ¥9™ñ.!1ÊÉ~ ðobyä“ßÀ¿i S~½'–hm,î/-=õ7î/˜Â{Íý¶ÕÔ4%h¨ôÈõûKüÝÇäþbϛ¼àþeÛÒýÆý¥™í¿‚û‹ÿè­.ì/ÿ£–ú†ýí÷¾ö—ØûXØ_þSò?-FXFî]ö—I0¾$ýå"îÀþ"S%Ö°±¿¸Wû1öW¯Ôö—º\õ—˜Y@,‚úËöƒ‰Îú‹_èÛ šú‹Sºˆü ê/ -ÜÇIýM9°‚Aý¥J+»5¶2XÔmüFýå®,ª&ƒ¯PaI=ôC“úKZ.hè/¢Š3õ—ñÅú¼A™¨Óweê/ÃGBQ›ú;^ÿφ8õ˜Šû™Ì_ð'sj ù‹îd<уø +SeüåfõY¼_èö;Ü c²~ôR‰q¿¸N9'îw AûIÅ ûENBe%;ë±È˪0¦Ü;u7‹ô‹¿s~Þ@¿kÎEùív™&ä—Y“6Þ¿¨_jZˆ_ÆænÌÃGJ å7Ä/¯:_i1~ùøøAÎ&r·"Ÿâw¨&Ӏ_ÄÁ˜o0àœ³ó}aCMà}qºA¦û’‚Šˆò÷MT\uÂ}˜wjC- ›Ö‰'ݗƒZuG5•" ×I÷åÝ€~Ð}ÃGP)è¾40ëå X!t_åJ›t_%hæ[œÂ}ö ûâ´Ù "辬2B!iÐ}q)]:¢÷ewŠ¬‚<¥ŠQ؁ÏÎt_Þ îx_Záaïˬ=‚݁÷…©‹ï kP«jݛ貁÷¥Ù‡ïKåf{êÄû²» Ƃàûb4ÁúêäûJË ’ƒÁ¯ÜŒ%¡æû¦ìdÉø…•kŽüJò©ÍšFi4i9ø¾0ÒÛ¾/ ߗ,èÀ/Fr±‹ øU} †AÛxŒAàVVà7‘ÝzßðKÆރð+k“ð˱ú҄_Hß?¿ìak~U‚šv~Ù6K¸¿j¦ö”IøE"NéAøMddŠÊ»¿z–&â7C—øåß|¿wÄ/­%O¯ôâYyÁæK€ÿ¯âIé*IØÖi¨0’„_i¿¯~~éÿ=YCŸÄªh¢@w'¿¨ Ýídüœn}Éø…Åӗ¿´D¾s1~Óì?aÄ/yP-²€fï@üâBåŒ◓5=ˆ@üÂbýåø¥6‹³H´5Á -G lMøÅÍhlÜp~!Ò7ºØ„_¼cO½ŸEøM—X'á—EBtƒðËÞkJ›ðKç]-6ÂoŠ4ü$üÒÒ¬'é£Û¿- 0Îâ{>¿âJ¤g~1ð¾&þ„_½½ž„_ZñáG·¿$üÂÀ‰ë ü2ß…XAç2n>¿2Ôr~ñ{äíá—_ÉuOÀ/&«ÕƒïËLßÓêäû2MšÒ„÷b„ê -À.Ä/†;ç9ia÷ÀߊÁçºO¾/Œ—A¼]Û0Ã#º/DÇp2w¸/»*ŒÌPÒ_¼ þÄhq}k› 2›á¼fö¢³03חÜ>¡#ûâyÏø{ÇúN›±¾ÝÓsðzÁ°Åòö ú¶GQ깑IÓÁô¿w¤ï´™èû:ÿ5‹‰¾ýRÿэçÛ=dÏ·_ú狿qSš/vâòÜ4ßn­KÀ|û¥7ù`ù678 -”o³8H¾@0 3p€|Iu-÷äøòoÁB¼i‡ƒâ #Þû€øâo¼4ÁðEPœßáÛ.'GðmnM_†Ås:¾Èìá܃ߋO%äÁïmÑøaÇ÷ËUÚTHë¤R'¼·f ãwv/m¢3›}Hƒ4¹4¥G½í¦ܱ»>“Û‹ü*2âÂö‚9ìÒAí¥æõ¼†ö"c¬6‡bö6/-d/{ß²WÄÞêuR{q Þ¼^ž ˜fÆõV¯ƒÖKDP;¬—Õnx9ÍêeM”JFõ®ƒl¤ÞÙ½Ô Þè(~ͯۜ^Ð=ষèÝø](ì1ò^ˆÑ¸Ð‰^Aè%Q ɶÐ+Êá>/þ¬¬MŸ·[Yqàya¢ñÏ u?â÷AçnÃêçEÝÄÅ«›«W6îpõtü½“y§Í`^Ðr*A5SÏˁåfí•Ë:5§µ‚”®ôw*/¬j/ ˜…(OŸT^®V8ýïT^"§Ø¨7ü+Ô5¦òr Òýw*/&;†ŠƒÊ 4‹ãȲJ¬¢ñð&/–]ðŠƒÉËsº´•ê£á_tStWÁ|ŒGw€Ý 5 )ŠÚ}2yåaä>™¼0p¸ &/ lv°3yé¦ñäÍä%ˆt0y?8*Ÿ§óÇdò2X‡¢ˆƒÉK+³ˆfò*„—ÛDð20ÇrНÉ˸ d3Áä%7ƒ‡“w½’—ÎÕ yç -3jYa#å@òª1¦<"yiÀi—>¬ -k–#zhöG y¿ð7«ígå0qyÁÂûD^Æ°v "/ƒ$˜K"ït-Mäå iQƒÈô‰‘8ۉ¼»5»7ðAä%%ƒ×Aä¥Ê¾ø*|©È©M"¯P yœD^*©]HKùÍ@cyñ(¹p:ˆ¼¨QÁê4¼(³"ëZõ¿ì7uâx¡¬ªúézçÅè0^F©ŠJ'Œ—•Úó¤ñN1mÐxi`G«½ˆF²ô$QäqÃwC\Ë¡ù ñ2$ø>éú)¬3l3Ž—Á¬”N/¢=¬ž4Žˆ¬AdD#¬QÁxQBUŠ·!)ÓÒDñ¶ßïÄ ÛMôŒtý¬6+}rx›¿‹à •ò¦ðâOô5/Tj˜¨os۞@ð6$Pó3 ¼ˆä 6rx›ƒ­Áß­p1¯4ù»Õ±½¿ È1%ÆïV ƒ¾K*T;Ù»lՋл•QàîVgìn5?(Š~Ñ ¡Ÿ îâÔo5_Ð]ö¯FÒÎÌ]Ö¨§>‘»ÅR¯ƒ¸KAÀh¸‹’=o Ñ'¿ñv±Å'¸]¬ А*h»øNüۅ -áý`íB…ÜP v†-'g¢ˆnf÷A}édìB‹ƒ÷Ø…±» ìBøM€r¡ñ1'oÞ?EùÀë>ê9ºíó:ñ~²uQJO™º Õ!Á 뢪†’í¬ h~(¸º›VAXT]ñU÷ñ¤P]œÉm8ßL!CðŽ¨ž‘ºHp6v᳀©p«}Îààz¹¶6P+$¼·ÁÓEU-\Nw$ .îÌ0]H–É×Ûaº0bØ –.kŠF™(]h°ìÛIºk?Ïé‡Ðƒ£‹¿ã‡&G—‰Ë‚­¦ ¿¦pctQëØÕAÑEýb¹Ew¦Ýá8òÁÐEVB¯IIJ“˜ó¡Å=+瓡KkW{AKˆ6Mc2tJ‡{{@tÙ*±Æ€èbÞgØ/ º4 ηCt×ÁjôaL|9ÅAÑeÑ‚E®N¼ʘÁs‡‚"(º3_|Pt顱·R[e€œ‘£ûÁ³[A±oŒÑÎu]„|/ƒÙ0,"âÅ\ +N‚.j .wCS]܈_æçb?&s|.+7oùߤçŽ@à—±9ÆØx®*#JÞ6Dß.¼ò“ž»M;>—>—y@ƜG€~†Â!@D3fÒçfp60/@y¾,@ÖBÊ(ºà/с‚.RF A]à°v ‚. tó‚ K®A—L¤¢p5gGA’&?—{±ìgçç¦Ç¾]ðsQÌEIðsÕþ ç2›–äSÉÈs.rÔ? !!ß?è¹°êÇLÏM„ÝcÒsi@8æ çÂZðÀƒžËÍxLÏ呓ðЋž‹ä$Ǻ çâùRXøÜi8ø¹Ëj€.ÏøFqUÔù>ºHêÒS››e/€ » ;@wZ ›Jƒ›d€î|1„.³³ctYpn-°ÛÇ̃u #bº¯ÞZnñKÉäÛ霗ç>üšÀÜ¢"¬¼An©€¶ÂŒ[pPðq‹»€÷ë ÜÂÈ®)܂‰°}ðmo'^¾mko‹¿2Þ"ÈpÐmqKà¬Üö®ÖIÚrsp mQÅz8••ÜVØ5Vø®-‹°oÑF!€ Ú"iZÛÉ´Ív‚i‹¿Ü ¤-þFú Úæ¢ÅßÚ¿@âÙ>€Þp¶È°¸¤Ì4öDnÀl©cèÏɲ}Јì*³ê s'¼È Ù"ò„èÃA²,»O d[r›Û¦Þ'ÆöQx}Rl“çTCl»ôÒÃVui"l;ßæE°í$e¼lÁž üÞüÚ®’Ók»4CoìZÉ~&º¶Y¬crmv}ÔI®­âLp­e±“[Kó;¶–ጲ¨µšY&³×Tߘµˆy Y‹÷–í!L¬¥Þç~ÖÞòr‚W›={®–µÐO9iµÐÔ6YµX{O¨ÚªZ“7Tíë”2Iµc‰)@µZ÷”|‚j%¦ÀzÏ Z*ÝÁ[J—‹¥Ár@©–ÙþGVÃûÓ%ê¿iH\ãoï}cLm^êNR-„ x…TܪàÔ"™F 莩ÅÊ.VPjQ1w6 µëF-¨!½¨Y - Ö¡7ýóZ}ù. I§Â‚Ëö¤;8‘±­˜ w eÁW!u0¬HùŒÅ•¥Zº7¬,H# ûU–è—#çЮUµ;…ÌíZ…»‚Þ]ŠðO¢ìË JÖ([cž@ÙzE¥© –§aGÊ.£˜²Õ<œ‰4Ų“ íƒ(K± 7óbå6Ù£#R\!ve¡´W]µ²”ç;nˆ[‹5L´[©L¤™Òíƒñè=àˆF—§èO–ìcÃDÉ"džâ ÉR¶Ä¼óN’Eb«ŸÉraå­PTKX¥sÌSý‚©Ûw€µÉ%Kˆ51²X¶(&·Sd –ì)¯;ƒêÊ͐-–'YtIԙ;™§ Ⱦ»3Ÿ¿¹ÃôÙ¿A–ݺ˜Ĩ /æÇi¦ª\ŸÔä° % ³¢«‚9ËÍî=áÉú‰n¹D¤#r͌o5¶ €íö¨) áUiN|XPfCá)ÜR‡ Öf÷”»CA1̄¢¥› å涧¹ïŠNߓösKÇªI5p|q^)‹!ù`¥€ä$¾ðHø@à•Ý‰œÉ'¯OÝZ"_Ž†‰ÝÙi\e°ã9h—¼tž›9+r”È­²(©ƒ@ ;#Ár§mWŠM“ë,`p¬y!ÙÔ1ð>›2`Àf©”3`EøP‡dJQñˆ¡Ï`·â)[‰«Tä§H$`µ—z;`YU)Ž~„³À‹í‘°A[ë›#h5¨ ­¯IŒe&._Sš‹/õq‚Ð5»$ŠÐjÊrÁ{þ›rZÙ®ý‰Á‚“¨V -/X¸RâO²?#,5êäÔSìÖO²ŠÝº.7ã¢*7ï93uQ ÃÆñìj í¯@7UÚ[X¤*FĽâ 'ÔúŠÎt -…ø›âŽ¦Ýµu¸|àÎs4÷.ÇÝU7³†.«ó{ o–4ÏÞ"»rF -…•ð$+À’»ž\šL|¾\¨ãÁû7PyyÝ|7n¶…ìYÓ'ÚBn—î8šÚ\ã#‹’g¶¸ìÜíbøxXǧ¸$IDJ_F/ÒҚ6d¼Ã3 KVóÊKóÌô)rhA 1³4"-³|%<þÃ,É™´Ü£¸ð×Än¦!+RD„ê!ö§9t ƒÄð ]Åf,¥jVKLE= øà!X€…}$ðˆ ÐB^À¼. -|””ŠE{ÙÃa]QW+–éx ")±Ks®¿52ž0SŒR‡…h n( òv!Ðß=¡s`&Vʁ B úÇ·x{±kT¿r!žÔ¯Kø×R€uöS[ìw=nà27DÐV2 £fSLáÚô/‹„Q–v¹Õ‰š˜±K\v73UÞ·$×>áË/êmâ5NÒôÒ8p×9͓­ÙtDÙ ¢&XX&Çm¨ªFUQkS VdG³Š‰põ|óW7KµoúÒ,JàÅÙ´KªæK4Ga^lҧܭF³t§`UGìì{²Æ ÜÁ"ÒÜSËm¬yÓО\Á"Ø›Øw=NʾÔnYû«P Ú¥æ`\ \ْËæ”ï¸ô=w%·iá:¼u7€‡´YÍÌ W›»ê2ˆˆ¿ôªþd7 ®F°êË³Ö - ÕºÞÚ¢÷ºqÕI¯Ï±äû‡/[QïáÐi‡ã%Û¸zÅÚ -ï -ä,+À!í~4R©çis¨41é—5_‘JåaÄ~ôã%ïÉXæɖ’Ôy`v'KvÝuº#ñ²p|¿Äá®T‰!†¾¾›’Â{p}^*&ø'ÖÈaýX²ï[ÍÒ=`Þî`Ö¬×ç]4„2-¥˜[Ûâ„XQRvmˆvŠœ,[¼×li»û¸SږžµÅ>•£8Q!4Îüʑþʯ!² 2}˜4M äÍܕAtsnaùÔ£¯”:‰ôX­¼kxŒTÑ\.™Åƒ&AÙ"å~,s7œD·—Z´[QöBàH=݃Ø%0¥/±F`Aù£0?¦J+ ƒP7¢ Û»‹‘gƒi@´]–…ÈKT(«»¼kõ˜Ií‚T‚’#SžÏ³˜–[eåÞsš]JÈ8/£ hÍÀ”´ r#mñ‹~ÞÚÐ+4úY¤L.‹1Þ3¬ Ýdò'ðõså<ß^ aàuø™6)iÔ´Y^È4’ùVX’¼kÏ¢ ¸·®:ÂkGoPå„ï€*_XÊbõ¨ª‹‡^ÝxPLÀµ žèAa££Nå~W‘„ÛÉ ³\ãw[\v÷9^©A§O­»µÍÍ¥ Eøá€N¼"6øFs2Kä«áD<-ޕ*vîZf`,n8–—¦2SZÈs@í(5}ؕá*Ò]Ö§–T|(zßÝëPøm”jçæ¦ß ãÌe ԍÕp/“5ñ(h ~¼õâ0q³J!1zb¸T#¸*î8„zìxGþÃòß S/¯›ò]$K»F«?fÏ箪›€ È.зß$úŽŒގ‚§çñ^Øõƒ.½SÁ/¢1Þ¢31¤i& ‚*YJÙüå!jᏲÃÉýh²À†t>t¾økàpɌFyOWýáѳILF-¢’ør…2Jî„k€kWÆy]ɧ™‹Ñ?¢ê<3½œt+ÀÌ÷Ll‡¡œŸ™(r^ê%Q9,½„äf®khF$µ{AÛ¬`à[Ï¡d¤µ'W˜03âÈcA^ ½Xþ(䅲„†,³9 ¿%)¡Î¨}~åˆ`oÂçà†3:?ŠŒu¡(Å%žA¯›$KZ8ü0*Ž‚D²1€3©T&?ÂãÒf,5—µ'%\°2XÈí2?æÇüËòZf߇|¹ç}&G¬) ýðsQs™äيOº…6ñí¹ ÂaÙӚáS€¬Xõƒ&hOÖ6×8¶œÔ^Fց ¿rf`xJ‡€©²{O—2sîɺ’LWñX;i°8ÝeÍ,uõ #ä™&DH(F¿dÀΛõ(9h])nÀ£=Y†ËǙ}§è1±Sïu+þË8É -DòE¹ W a¥œ*ù6—Ób°<ëㆹ1;ÐUQÌc)¬Þ9=0WºöÌób³¼×ãˆ:?g¹0îð!*C¥Ë̆Ì1ÏÅ‚Df€®GHü“Ú<Y3æø‡ˆ‰Ñ]£„3[$‚i‰HC-‚ÞEs¿µÐ.8VoڐqíÌFŠ=ے·¯Œð8Þ«œ†3:EÍ¢™,Å;-ŒÐõ¨lÜOԎ:Jèøm ‰Fa@ûY\œAå¤è1áQ‰$«Ù_´¸ÕݲP~¼€p›Õ\3zZÝu™²æ¬ Ù†Û°«Z€®˜?„ò\ah±ÁÎPê®‰'©Ç¾rBÁýL‡×Ó QÃaÈ´Î.îÍs`á 7wUƒÑ¢Nä¶ ¾¹·“k;×½àÙ©ppZšŸø…e.ž—óö…SÙ§o‰jåZ³¬Ãºyð'ΘÝwÿ{˜©»33B×ÕÛIŠ®QÝÝBTYf”¾ƒœËà“¡ÌÄ3æ‚ɋ2Ó0àæêIá ä\Ô¹(â;´ø|Y’Fm'lè‰&N ֛ú§dR¨ µCS„i#5óžK'¤•¢µr¿`¤0ýI®Ú­ÓU%ŽU&² -½I—BZŒÎ3¹Bv ]÷øÖI¡ŒË„ÔÞÁ¶¬Ÿ¼ÔP‹)&P›_Þ¡žç·r9 ¢ùÅtôe -fL^°(V˽ïêÆ·ú#4MI´ÖI!lVéÁ²'X«;•ÛÑ46òf”,„ä죝…ââۗê„ÌÞЋ?Z¨ÝƉ±¢½b&ˆ§çP–’xœsü€…µïu,êÏ3÷¬ÑöéZ°ÜNÀèåݏ•¶ûë¦ì›ž›Þ¥Ý臤m@ ƒ®”Y®GvÔT©xÞ_ÂW)o1#{Z<¤÷љŽ@ݐnÖ¬â¡þ…x®gbâ±@î§Ñèv+¥ÛœY˜ù瞷ñ»b5 ;§äö2F‰rN?ÜfŽcèXQžæçÒìŦý›vCvLJ °yX¥Ê¾3Ãagf³€n¡ð‚e¼Q‡iàQƒa®okR‹.‰uB%θlj›„ŠCdDa`[ç aÄÌ`›²É¶ÔÂ;‡s ê -fP(…T"#;æ€Ô´å¿“ïÉÈ<©d”¬±M†ƒCó:©Æ„Ö€ºE¬$y·^¦#–ÜE÷ìŽ.ñ43çÍÊ~†“<ZJ×qÕ1_§’Î\´Ð‰„ÊFqáË=⨻¹ÛÚUž`à”(3f·•Û5t´$‹µþ>".7ÛÐ!;£`Û#½1>WR4‡c-1®S-‚@#aL—Wʄæ éٕɸóñ0VÀ -BåÀ²—"X[sl!eàR´é¡R‚¨x¨˜˜.U@u­L K3̌M8À–޷𛇗E½p!I!vü$‡|XÚ\xR¬_Œñ:/ÂÑw"›ƒ´…—˜e°*v„B4¶DCrŠ•(ZåٻÑfSTZ’dwK¨WÈáZÉ»añCRÿ×Lê> KÁ¹«·-ôšY;ÈLd&Äfî(4àíxq…R–`IN@&gqmŠ5lnZ­å¤p´8=@Ý*e9…° -;²5RIþT¡%~”;”H¾9”Š‡²®¹hÒъÞÁe°M¥ÍAJN&yzs0s*-Å׉Ÿà;ZJ8=‘@†eå)›À%ÌWR±[”j-*A©y).ÕӅB£—=(R‡õåh‰ ü:ÁXì=ÓS™Eâ-ú÷!ÇI9SsÅ,êìz m9÷”¤E{@¬+ÔÝ5;I!k¬0—Æ+ÉߞV¡[¤gE¤?®°•ª˜µãKí*÷æâŒëŸêZcÖ1hòɪYÁSۖN0£Îf)ña¶H-…¢¥ y¾‚Õ¸KšŸGª: -ï]Õ_™‡_ZÝj<«‡~Ìzžl%PshŠþ$Ÿc¤_…4“EÐS«ÒT»¯Ð -C”ÉOºÌ­Y…;:&QhEü-5•ÕwAAu©•{êXR­0™:ߪb}º+\i(¾}· éStàQt«Z–6*Õ=Ýåa!‡v1ÔKýb*³½ìþxK™?½O©'îÍÄäO"àc°8KUTý3weY0Ì\g2SÀßĆLzpzў\ÏñZ͍Èf†&Uóü)¬gç^HÑêTÊ€Öõò²k_ž]0!IR\¸ú ¬}I਺y÷LS\Š›,M<Ðs¹4÷Ïü>²;ú[ÆÉø°‡,v]o‰G°ÉT—Â*ýs3I˜aÊǯ‚zU“•Q]”1ã8뀢fØGߤû@Åqy^‡fN\Tyl4Ó½gÖ¾+ÆD=Mfkâdi×*瀯)YtõoÀ-’´?ê˜ôî·®¸æ7ÆNÓ{a¯o`E ú1Ì]EM#<½¦e6-µ¸ -EÝÃǦýb|²ØoS;qXj·°P×Íj±g™>ÃgϜõRF‰7“!VælÃbǦª…ùÚÎÁzÖ¼im‰ÆªÞwŸcGRÎTÅGKM‡‹IÌ$ _¬Ðq³Ï¾xš¤ú<¹–†-YN#µöï»^N«&‹®hyŠwiQråSR/ë¹ u•`s¶ÿŒŽëF¦UŠÉPúbOqU”ãª'YrÅTíð#m*™2À~>R.ÑY4FÇåvˆ´<~Èp×^Óڕ<2š)a59krÀb׏ޮãÜî ½Å4¤w¨ êaŒÆ8ŽÓ]¦¬‡â½$+¥ÙÊVeýPv‚õ8ÝÂøSêš:ɀ7$oÀ™†Ïñ(HÂìj’îÓE¸ÉŸéÿà -ˆyƒ°,҈|»“8‹,äŽWƒ ­gëJIE#I¹ëi†‚bh”HÒkø½Ÿªœ?•ä¸!‘7aÝoö—¢ÆRˆ(ϵU|hH6Pǽ*Ս(åQï¨ -C>‹G¿á¦\ÍcÂÃ%:ð%AÄ«vùbeùb·[ÐÁüèÅí~TT-ܒºJ£“ÆV Æ#2J OâÒnAü½€2”Èmf_zºÂÌès¤+ènq¸xÖR¨©tvÓ@ø9”4Ýßé¡Þñ¢]à,VȔãf§¼h¡N »2Œ»RZ–ˆ˜ ™ BŒùxCs|…¬ -O÷RJ -Sh7× ÿ^³ž]«–lÉ -ä¼XHÏɛ׍#K)ürÛ¸LDì™tn*ÝnKliYÃklfªw2ïÍ-pò ¥M™1Ýe®.:‡(I}¡×òÊàÛ/>XHÂå#Šsð¢«t”]‰Õâˆ\!û£`}ÈÌ&TçÔI`›4׬¹8XÃ'éáF;"ç¢jXIòÄ¡u=ÎCt/ÕùR™ÏŠŒì‘éŸBÈÐDAˆ-×®ÑJ(~CçÔfÀ™?ʌT2Í -¹ZTÁÔT–¡¬7 —ð°uÈƸ2D æjô{DpqU -Õ|VëWcó -²ÊhØÜL]o%ÖT®ýĽëéÃìŒ:D?ñêÞ7¸Ê6±øQ¦»£a3fçÖ¹v+cðu_«‡Ãeïâ&ºÐ꙲(\-ÕjÐÿWEª>÷N&ÈÂr©¬Á {٘ƒ±N¯ÚV€¡ü\Š’ ÔÊT'‚E¯AˆV0{³V¼kˆt`¦Cˆ4bÉ}v¸ ßx(ÔÒVÍ(5Ìž~!ÛÀéâÆnL5¯|1ø?÷¥z#¥šQÌ¥ ¬_46Œšn÷òٔ ò7•²Èâ‰à›Q(út1©èõï#®©|Ž0!ºF/*¼há g×NÌ]E‰Çb&Jä'Ð/ÝÐT¨VÓÔ¡Ô'u  Mvâ•w”‹Ró2̛×å@lñׁϫ™ôÐ'DLY…Ëß?jVpe­©« ‰Z HXÈ'bSFiZDL¸ú˜©Ã!ãÖu³ä¥ÀóXMÙœ›,êBÃä”긷&-. -~¢¬ÉCýçx¨ªëÂ%0D–H©8¼L¹ƒè%o‹{i™œ5f\b §¾˜"–n„Í<²b'+–Úٟ «¬e&­™CËö&%G¿kÎ֛¸Æ>zNƒ&nç.t¥Å½?8HPI„þ&Dq€‰\9¯ÙÅÌå ±ëñ5º­¯6¹É`ò½ë´Öž-ÀÄràÔ h˜ „"|V.Ó²z½4wï.KmR)ÎÝr~VÅhO?ÓèÜË -Ï[à(}¨5ðйò-­(\KµÊµYÔf—jy«µ˜¯w6­º»ÆÜSe¥0«„­ -ôRÏ¤Aí'š1Þ³U`ŽNŽ"O¯J0]Pµ…„Ÿ)>JÖ²ºb‹V§IŠkµùÅ׶§<QeŽ fÆîP€àt©Ìâ‡NÝ`SÞbîZ¼JúïèkƒVúIK‘§U×lx#AÖȕÝ¥èJk„ÈÇÀbL‹vELK• Íº§ärޗáèÜ°¸h2±Ø†ý°ë–æÍlnºª.!,EҊx²#¤™g¦xìaEsóêmxÉ:Á‡­=’ÚA"<6«tvHD²cϐ‚nwó42UÝ9ÚqÍ=é -ÀL±7-äo¢éÖ,°cõy{ӈ\x¹L+Y€ sÓWŒ!eZ|¥‰"–­s;|µ¸½,·¤O…­Ãâ!¥™];7Ä샕+ƒÄ㪚¡ªöqÕ´±ì¡ÝÞÆ=ݼƒE“ËPÙÄÉ­° «a6kÏo«1Ø«†:c`=··™«2”|w™¡d\‘꼪xš’…[ N“{'63ÆX¶Ç–Õã?9ŠÛž¾äJDð0N¼ªñW½]êCPƒÁilj0.Æ&$+;!n‹ð -áËeˁ“ÁåÇ4BœÝln7É$ܒ¿Î)›sß݊$䙪çl߅ÁG°xU—$Ãg ;µM¯îPé¾HÈYuŽKpÄ¥fâjúü{7kpɔÞa~|«Û59z\i{ϥі?!yŸû\P1Ç>.} š÷ecý)U}o.ØçoîäýÒüï†4Â‰“hŽèë hŽÀyžørö]TåÀ™ßùߠ™߯£f™ü̃eŽÊÔ~ˑÊ-äñþÄ*ÄàqT/s9pÇÁtæb/°ãÏ¿ÌØñY]~PÇëIM¹„?ÐqKԗcgŽ?ö äøc<ïDŽÃ¼Ê…EHÕÄŽG;ØàSI½ÞŽgB$¹üÚêäm°Æèg -ç`#Å×'P㐫]õ^C?f,Ð8ÒV¬ô ÐxqjrÆQúXcº0ãȈ”Rú×(ðGõKÀñ†ûbâÑXïbÄ8SÑUŸeË,b dŒca¨WÅ|qd3Ue¼8\;ʺx®«NJ S<ÕM¶øÏqEl­J‡g@‰üAGPWš–ÿ -° Ë‚+G€Cè'D&)HNØ -3¨Ùåslq)ȃ)Ž¾ÇïqÁ p6s¼ž7 8²/|}ÂÊò¬¡<&aoÑpø¤‰#ߣô²aâE¾ÒD‰#HËA¬œ¯a`ÃqV;X>r1|QÄãÓ&D†¨îeî -v„8ԏ9Ýbàr9•@|v~x‚N|øñΠ‡?H'<ü‰®dÁž¼NÂ6|çj2Á,ÜfA q¡‡cE©”‘¹á¤/=„… ÇY=yAÃÁà`ý~0ßâœÙ ‡Uߦ‰á0$S.bÅؤ|Ñ pÉfˆóRŠ‘ÿÁ -ÂIP‰Žt±Æv“ÂK0^RÐçwNx µN`‘‹»]̑ø€„C@^p0‹¥ê~<þ „ß!~ B8ZÔªnӀpö¬µbñÁóp«ÂÀƒg5kœppìvë0«rﻦs“ÁPª¬*3ü±òÎL Gó²fqiÀ¾«ÚxŸPð¤5/®S³è^]ãMq¯Š ÎÞ³ˆà5 -Å¿œ5œÎ9à!úþ7—? þ?©¾8fûlUûds3“c”`@3Q»ùÛáÀ þ®ª©_Üïi8°ßÓÔïáPG°¼‹LmtšáaÍÍìOOâ÷2lÀïi Þwž•¯ûŽ×ò }Šʧ€}c­E=\°¾/F= õ^òYCb1±¾År(y±¾/Ö ßýõ}‰IqŠaßß!ëgö´iß 9h>hßpSªÛjH²V£·g+ ~ ¾±bgŠ$H߃>®dRø†X¸?½q¾QntÔ; áNցF=½x-æ”Rˆù¾ç±ÅÍ6ÕMB€ƒò}9*Ÿ†ܯd­¥ -*¤¤?ßÙ´†Iø¾³J3&àƒ™ÔO;ߢ‚[ï}g§Çƒî œºÄž;Ü;G#Â`{g·Šžho¢ÍêJâh¨Y°7Ä5´Ô?ŽXoø’ÒHâù®ëe $‘»µ:¡ÞÓå?Ðk°¾:˜Þ¼OöÚVQù0w[DïÛ5Xè-¸Ä8€ÞwÄƒç •‹Çç °„fÕxÖßӂyßÃG°¼§(oGyCEÇ,HÞ( a5P ºÁdâå$o®OîÍZƒµ Øi8HÞËj’÷3§÷G|¹ê˜\³µs¼Õo©¥ò¦ÂMæƒäMy# ’7>^Æ&É -›$o (í2Æo -¨X'¾S¼Ù9>+… \Þo„9ž’NŒ7Âr÷³ Þ+¬Ô*½y¢;Â{˜h6 ÞÃjú ðÆqÞéÝ£ÇÓ5¼›Á<™ƒßëà„tò»QA}‚F -à’éÝ$ߪdšðnD] úx79Ýašîw ¢wr7¼+¢M2p·¯5©Ý؋ïííF@Šƒ`v3âÈZæ`v³7›¿IÐðIìf„OòA»Õ¥KÃ#òâVÝ- ±›«*µ! ("ÑË·{°lÕ²[æ«·6t1¯Ý0ˆ~ »Ù܆ø€@vkÝ`ˆ·ÖÒwô;9ÝêþHX‹‘ÝŒ‡éÙÍeN¶²›ÚsaiÌì¦>]߈™Ý´ècؙÝ4g~l‚Ld7”•‘²[’ÿ¤RZ»²¾Ù--ÿå¬ÙM÷‘a‚€vã¾=¢~Ú­°ˆ b7‚#·Ýæ@OíV¨ä1édB»ÓìGcf÷ ´Lf7ƒ3L|Ìn\ªœ¹`vÓW¤2¼˜|YÀ{0»±€(<¹h„•“Êa‰ì&êŽ/ҁìVdyԅìÆGÄÏDv§ç :ΆìfсÔáÁ°!$§â@vÓõW‘ٝ¦Š!Ý´05È†mE‘™ßùìF&r -®”§)DåQá ‚¹Èžé²›f683²?AÕÚDvÉïDvÃL8ÏDvӢ중ݲ0é¶#»ñ£¤tNd7R¤o±)Eõ.܁Ý̈’tÀîá\ÚdqcdMÄÁìnwä‡mFK÷ÇÄîZ¢HivÃz9òÅÙÒN×]˲¯%Au¾gºkŒM±Y5èêDuWwJŸ¤nðê.G×CvÎC¨›¤ë>–µ· ™™Ó= §{YÍéî9Z†¿ 6–öî˜îö8 ?73g~Bº§á`t/«Ý-š¢ _w@7iå÷èF”[qæsàidÇsc?Îûçî!3 -:w¿üöpî Ô‚Í ŽÚEÍ à ‡©ƒÌMsQw‘†¤Ëá´Ò’ñ•;–FR.ƒÊ Cq™]WĔƒÛ½˜ÜíZÊ?¦I›»]M$7 ÔDn ïX@n„YÉ" w‹yãqYWM»et«Få qƒÑʒ‡ÆM«!æT `?aXâ~Y;HÜ5Öq#ô«ÞmæILùá¦6•mþLáF^qC¸›»'ƒ›MÂÇXîµÐAàÆ ±äèpó´0n·šBà·a w¿Ó·8áÛ,«,m±·÷ã,ôöìâäíy¬àlÏâo7ëÕ&w»¹UĤi£¨‚£üAÝîÕUs³ÁÕâDnCŽH­ÇNÜ]t,à6 œc¸ÝCìrð¶aåp¼mÔu0ƒ¸mPÅU·Ó¶QEÃ@À¶±ôfúͬíù÷Ú^V“¶AÇ©nµÈ -¶Ѧƒ³=?˜m,MÝÑ;ºSÁŸÇff­„"®G¹ÐáRzUSwÌ6¬µf -[&f›Ûðfs­ÂâÙfKMÊ6–Gjû¾C¶_©Ê—€lóÄx—²MB$öªžÓÉkÈ6)ìKm>ÐîÝ ²ÍÇÊÚlC¶ù~p È6-Š‘îm6 «P€ýê.01dû£÷ôyzVLÈ6# –mš•}5d[‘ÉÜR›G• ïm†Ä¨n -È6³Ðmà0ùÂŒmÜ×q›±½–ÉÁØÖ·î†[ 8G?é`lÓÂ+xf„´*r{2¶SÐm&c‰‚±ÍÛ®MbW*‘] ¶ñ -‹ˆmx….õÞÛËžÊ -¼¯!+##E•ÓØÞÌFl³É33Ø†E*·±MbãØNäŸ'•Îª=ÄÂxÄ6^a+GŒØ¦ÄP‰ØÆsèî@l£\ô´`l£nMœ{—¤³{Þ§“¯ œRQÆkà çtm¼.òäwº6ƒHÎ¯Í ’:¡{ ¡…k֝®-+IÆkóXOÀ´Uœ=¼xmÆEÙ¡$øÚxîŒ9N¾öèÁAßÛ¨'Šr]&sz02¯Íú¢$Œö¢k£ÍOÙØÚ‚2’lmtíèJk¬èc‹‚Á k³|±hEËÞl˾sµ±>rÆA -W¼œ¥Z ÀB:T»¹ÅØdj7¯M¤6€lŒmDm4â¸@mê?.SàzV;Ož6°hŒÑO»ÞÂ0N› 5¥«L›­(H2KÇÙ@Ú5µG»¯5 Ñ©Ytþ˜AQ\†òg;EJ -Æ¢¤!?«`h—îm2憴ˆŒmÀÀa9Ú¥)ªr´¡÷Ri°çÐö³þ;ðÙ%ô=%‚Yž ‘]÷yÒõÙ¹¼³Q¢,Ѕ¹Ù¸AÍÆŠ…¶3V¹b+è{ 9–è/;0ûq Êäe?îÁ¼íFÜæ ˞ —‚•]+¨lè_8‰¤l\.@ÙO´WN6jÌÔêjÇd?¨LösZP²qF·ñ˜+7©†Á‘`dczj†fÓ'z\ˆw"²áô+œàNox²¡Ë¢¢zçc£ÞZ!ÇQÇíMÇÕé읎 #ÃLÇÑÓ<ØØÁÌ<ÑؐIÆÎCL06 ñs ŒÍDËeÕCg‘ -™\l¨Ó"Xµ°Ø½E; c±G`NƒŠ="¿C±‘êÑKTg2 ¹OEˆµ¹x¢ûw@±ifà# Ø‰lâ4>M(6sô¹*6ÌÊ+›®ä×Aš 6·é.X¥•ëˆÆbâüV`±SŠ*ü‹­uÓ( ‹Í8]¢Àb‹a´ûÖWþ¢šÇ‹ÍijšÇE'°®æ -~c.6\68<°ØCÅàŠ ր:њ‰=¬ ;‘ØÃø$bà X ØÃ蜇Íêá».ö¦uP®½dô aŠArõÜNvu ö–ÉÛyØ\W¨ƒˆyØ\Õµºp،ªV×u.¦5c«Ôw›gwߋ†Mÿü÷WöTÎ2hØ´ˆÚ¢¶%»ìfÇa³E¥gÆaóÒõÆaOˁÃƞ†<‡•à‰Ã† VT²³ã°a¾ÕFµ…ˆÒԉæ×ÎGuà°éԑ]8l€.Tù'6·à£;pØ<¹û^4ìt¹RrÒ°YÃQy§aÓªÀ4lZª`°XñJ -+ž4lº¤Ùu ·–"®\š4lXT™qà°¹˜¾Í=Ñ8ÁÒÀ,ͲNƒ -e›ËëõîŠrÜ9‚‡­”3þéàa3“̽ÐRë+!Ä&”ŽãÑÄ&(H’j± ¥S‹±•¢)Rr. 6Å/üw±i¸¿®ê÷˽ó°‘Kõsˆ˜EŠ2Ôàacݶƒ‡MÈeô®PnIWEêG€°†£;›3êHç†Oð1ƒˆµ§Þ¤ƒˆÍ°¶pÀ&bÃ5•kHlD#h;Ø"Hõ¼ØÔ1꫌éJš$¶´¡õ^HlaÅ›;ªâlb36xtB‹ŸäµR±¹UFgá°%÷Âaóì™x -6bc*ý8pØ0û'‹WOOÇM‹À;f#J„ÃævºÆaóà±v6×Fä®O^¢Hó°—ábof±ñ -Úèša¨Ð¹oؚ;\¹aŽ1>ˆØ›e'b/s±¹*”¨ÀDìùîžLl¦ÇdžÄ&8€‡@b3©™]Ž¸ôŸ4ó] (6³š|›Åfb’Q‰Š-Q~ ŠÍÒ¥ŠÍm¸v>¨ØR\·º¨Ø«/YP±ëýy£b§ªž¦b3Å AÅæ×⃽k‘â𓊠oá¤b3fÆN›'¶W ,6-šè„ŦA¢ˆ‹ÍÇ Ng#ð}O4¾6qºXlâĊ;2ªü©b–Òƒ ¾º‹M- -5TÁņ³éææb3C´ËÁņ™ øÉŦ…+¸Ø´¨ýâÎÅæ)( -.6Ã1*Hq­®m:¹Øô…™6.6Ù|ì\lf0ÔPsçb/sp±9²`p±yãØáàbÃìÎ;N@Á"­Wp±¹ 5\›f>³àb uØÒcSYß°ØÔy²=°ØÐq¬™\l憲;µ,.6cäd›UÍcÇ]Ãëhjƒ¸s±‡q$Ó:›+*u(ö²šû…þGѵœïä‡ÕÀaÝÁû~=ŸN$öÍ»œ>M"66)Zˆ]=<ìêðËÄaW‡¦' »Û×8aØÝÑÇ ´v‘ÿBa÷xvWo…m7á‹'»»¸æÄ`÷HƒÍ÷åÉAÁ†ÚEù‘‚Lâ Á†c]p¥³Å|FA7MÀF -êê‹ÍdÖ¸ßð×¹F2Ïôk†»äjx¬ê;p¯‰Ç*Hìkô:¡BmžãˆµôŽ¾F½¾ _‹j’¯ïh~€¯!ÿB@:°×T?—{Q¯ª'òú~Âï4ñúŽNμfŠëêo¼ë;.»Fƒ×»¾?9h×0ÒE ØõÊŀ]#-ƾÞëµ@#/Ò5ÒZøUBÅ ;ëœë2LVÌ5ƒ‡ã^”ëÊÔrÔQ q É ézA¸®Öž€ëêEÁä[c?âo3þwЭŸÓû'º±Ûúñv¢­Ñî0²Œ:AsÓZðnÒžóÁµÆBMÉJa­ch¨u3jædZcíèø=Ý(®%‹²ô•±ßÒhPÎ,ø`Mq±61p֐ jÊÜiÖ¸âêþ®L˜RPó(‚Ï@¥"Ì~í,kÐM’5E N01 [99Ö5º¾Æzr‚b]Px@¬Ù%çÖ„ ÓUØí‰ópÁ°†•“b¬TfÂ3֏ùB¿šÄþŒ¯~‚ ôê'¤¸¼Vä»TÆÿ]_K“e×÷£ÐQ€«áӑºÜjfÔǧ“Zä #­3ˆŸ]0«o˅Ndõ=9šXºN ¬¾#Eu«'ò)xÕ0hbtrFJ\õý‚V ºGƒ€UOXûÁªF…ê0]’t[ŠnRu®þ|Puapªs((S 磶7Hu¶'2!Õ00ˆ+FuŽ¾©¢úå hq: Õ%Þ/ªŽ`ï|ê‡ã䆧f!H•ú—Ë+JJºE½3M÷ ôï*«ÜÃ)‰Ç¦FЊLäM=˜—MŸ&™º¸ÚS7w°:¹Ô K÷I&/œmó ÆI±Ð7˜Ñ㖠ùdFCY&2zDeP£÷-`tLq𢻓dÃÃI‹†’—0ƒ z©ÀÁ€nѧò`EC¨@RhX‘X(šû6Þ8ÑÈc1¾iL4þfŔ)ÑíŠbóüXTœ‹Syˆh¤ÚX€}¢«Ãë“]£ì.ÑÓp0¢—Րèj–Ô$c…̨ӁˆF·õQö`…B¯crT,.\<Ñàu=¾™LÊaá”ëâCcE¥Æ…;Ë2øqÕ›ê­\`V,{8áЏU$“ ª“š MISù ]­öšdh.ó\üÇzpBfµ_rúq)-.t,'š‹çÚÞ°ÐXh“÷¼ä€" -]¬4=™ÐàvŹ󃉬ÜDB¿»FŸ¿¹óõ¿/úk¤çŸ=~ùôÿùO¿ÛÃýæ·ü¿¿üÿþúý̗ß|ÿËÿ÷‡ÿî_x®Oÿø/~øË¿þÊnÿׯüåŸÿðÛïøéwÛ‰á¯×öçvûW¿~ýÒ¿ýõ¯~÷Wñ?w^þÛþÿ_ÿðû×iýõßü<{;›×ùÿú‡¿ÙOæg7ÿòÃúÝ/_wöÿþío~úÝÜú_ýæ¿~Ø8*Oþ§×ùÏ~øõþ«ßým/ô/~óû¿ùÙ'û§¯¿þÉ?¿ù§?ýÊ»ÓðÀðË?ûÍOþzû~÷z¿ûÎöúÃ~óö/¿ø“?û¯ü·®û§¿ýoóWóXÿèÏ~øý'ÿõ)ý¿¸>ý“_üÉõéßýþòßð;öûúôÿ¼þ뿼l¿ÿT>ý‹Oÿá?^Ÿ~õÚãßýÅ/þä»60ôã~\]n{û…¦Ë…‰?oíôå8Ö믟ðÃÿòõ?¯‘‡™¸ mB³þ«]”)4xé3½–—¯5þã5€WZ!DŽKŽ ÅÉ u¶$ó¤ÝcìeDÆkÕp±hx8Òv ¥íõÇaéF½†·ã¨#`GñÜ8)üuvÏsØìë„×a·Kûx^GøO¸É ýÓ´{­ûáÙ±‰¦gÂá_îPGÕÈkÁ}?7AXþnoº>ý‹_Äãl@K -–|!iºžÝ£kÚ^FÊúï7£%º¾Í^„æ8 oìõ:œç`ã÷ëU;Îí¯yÝñOõå† øYH£8þ½Û}&¬^å՚ތÌ»Ù‘ÇËõÓyXÒ9îOç9ØøýϜÛ<íx£ÿÐ]zÉFÚu†r^KýqÙv•‚—ùa«]Ôò¶^ðRßD¬ÃnwlÃy{ñ#pÊύáÔæ·xßñ²oïÃ<ìþæ|¸ßì~ÔÔó}dËâïöï4ð tvŒl›ñÙ6ûٶî‘m;‡cdÏ -qnÜ y?ì2žç°ìÛ ¯Ãn—öá>|£(æ™r¥·óÌu¿SJá'³ýâf܇ï?º+$âµçƒ»öÃ!;§½ù0™u–탻‚‡Ó êj>uº -6¾»+ûÆËY‡]Æó6û:áuØíÒ>އo2™®9ú¼½Ë©ØÎa¹ÛÙnÆãÒ6f݇ÍZwlóŽÛ»9ÛÆËý؞Ú4¾=âeßއyØýÍùp¾Õdº¦éó/¿b;ål'¼«Ûܘu+6/hÝ´ÍU8îðæWl/d{pÓøö”—}{%æa÷—çÃ}ø&/ðú.ð-µûãøö㓿Ý/÷4^S~Žhïuµs|È֐Ÿß¦ïãþñúä×a—ñ<‡Í¾Nxv»´÷áÛ/gÎ;¼¾åí4ÖW¿ðf<®n:Ö­ØFžuÓ¶Ïó¸ÃÛ·¼m¼¾úíÁMãÛS^ö하‡Ý_ž÷á/gÎÛ»>äíÖ'¿íf<.m7Ö}؆uǶoó¸½Û‡¼m¼>ùí©MãÛ#^öí}˜‡Ýߜ÷aù¨=ÉÛ - Ã—€ðêŠÃë،‡‹²Ù—?³vy>Û9nÒÇs[‘–+(ú~[Añ$´öXÞöf<\ó;üøí°Ëã¿?.žŽ_Öyþk‡zÿô§_Þ¿Uøþ`ßÀ÷(ðëŋ÷sÖØýËÇ#±àÿõ0åÍö€œn±Þ~½Xk¦É -2ÚîÉHR/ãÓófÄ(\žm¦‘‚V>‡e(¡çOÇ9„qÍ4£µ·­‚?»Œç9löuÂë°Û¥}¼ßr¦Áïw8Erœ†€ÞÏy›ñ¸ºeßnÅ:ìvÓÖ9œwXîM~Û8K¥w>¸i|{Ê˾½ó°ûËóá>|«™†….ï·÷riÒq¼Êûíތǥ-ûvÖa·;¶Îá¼½‰}ÄëÛÆfTOmßñ²oïÃ<ìþæ|¸ß2p͋Ù{l!È,—ý; ͹•öïöfıÚ8³½¨Äæ<ì-èy÷¤§yØXr߸I |vÏsXöí„×a·KûpŽÇ#ú¸EœŸ·ãpª­éüÅÍxœÞf_ײv]õvÇ-‚ÃÐûxÛؕuça—ñ<‡eßNxv»´÷áÛ¬çç{²VBËd7áxu¡8[ß_}ãù6ì‡]ÆçÛû2Mßh=¬µžX¦uÀõü¶Ÿ^÷î<Ïu£÷ç#Ù»ŒÏ‡×gžç·âß„°wŠ2ʛÑWý~[㝇=c >‡1P=Õ·¨à~Øe<ÏaÙ·^‡Ý.íÃ}øʀpÞ¢õä·ã¬‡´ýâf܇o2 ÐS¾?Þ^¤“ Ûωg¼çÇÙnÆãÒ6ûºÛaÏäºÏáCrý<·#¹ÞêÌ+ÌiÇOy·ûLjÎQw3Côf_ãùvØ5òoçpLÏí[ ˵gñ}‰öcÕ@'ÒéŠe´ù¾Ä×;ƒÝ^¹Ø?>Ý{ߗûÆkÕ°»Œç9löuÂë°Û¥}¼ß,Ø-¿ú¼½k!°ÃZ2lg»KÛÖë>l˖uÇ6ßþ¸½ÛB`Ûx-¶§6oxÙ·÷avs>܇oì¶k}ÞáµØNc­¶ތÇÕmKu+¶•Ëºi›{Üám-°m¼V ۃ›Æ·§¼ìÛ+1»¿<îÃ7 v×ÿõ–ê‡ñ!ìÇ'ÏÐ[~§{ú‡ñWú}Ž ÿ½}™4½ kÃõ±¯.ãùë›}ê:èvQïÀ·>œ÷v}ÅÛi¬ï};áÍx\Ý6h¬[±9q˶Ïr»·Û<7\_úö°¦ñíÉ.ûö̃î/̇;ðÃç]ïvë3ßÎv3—¶ë>lCMܯíkÜnìöáÎ ×¾=©i|{¬Ë¾½ó ûÛòá|ÿ÷Œ½þëŸ~úËøÕ§öwý»…^ËŞÆ%Ò]™îïîÑXè²Û¿¼ÙÑUXÛ/oÇù9ûvœŸ|žßFœ{œ,cl\íh_¿(ãj¹ŒÏ5ê>ÇêU¼q¹ûÇÛ¿øEëËúú©Êƒ ïÚãdÐñ9eÙ;v–±Þ(oàï¾^7Ÿûòɔ~ϓaÝ­4Õ×'f#ªÁt¨Ø’1µËçðb¶#\¨´Ó9ô+®} ×¥ns2ú ©ì·cà÷½Ë·7}Uód›^Kßø+åm֚èÞàÙú¤Ú4–§ÆeùÆ_X*ÜÛ=@/o_A™÷|)a݃·çð9Q…2[Ø\͏ ²×ý¶½úY“LNƒû×i9:´íãz­5ü{(ºóûéþ¾6b‰Ì/iŒ¾Œè¨Mcíq;`omnìM &k”¡Î¯Á:94‡å³~¢¶rÇÉ¡²ÎV´³²é~R_ߋoÚCüJS»픽ê&EeœŒ¨|ýêümžÔSº/2%7²×;žU.ÕO¦ø®ö?ð¸û-Üz{_/ÛÙÎÑ냪"çÈÁnÏ0²ß€·$÷ëó<¾ÙÁF‰ÃöØEK6öøÖ÷1öxÀÂã[¦~õ*Ö]EqTŠ·ÚÒ§ýzjØӈ»ŠÏ¹úQŽ¤FÏÒØkoa|’߶øøü3¿¸ÆKíÅûórÔjÜ펬uªëU1§êG‰!ÎÆòÄ£ë^uK{ãöx㫏){ÔáŠ7¹òy„x¸—ž}lŸÆÀ£ùêUì¯ÓëD»rº½N,’”uÀ_¦½L{ñ>Ä cŒÜŽ¼1Kã}>„Éý8íw¶ 0¢xÕOMWÔٰď ›x”»½£â>Ž‹Ï:ìy>=Rå…FG—Ã:¶ Œ …1Þù×hÁßÝxn*ÚÞy&s d!Ï=þ´yOÀÏ<½¹qžãm_ƔcÄöÐêŸÃ¨é#ßwœC‰¯£ÃøêU¬ D­«m¿øã´_kŽ{Ýëˆ …K [܊q÷yU½\mÏ56ÎӇÕ+ ŠÜlÓíÿê©}™S -:æ]öwèüöt%¯eègÚxßþÖەK5´ Ï\š¯*ì9<)–èÈX<{ûÖò§¯žÃéTÆ/ÒgŸãכËU´1·Ýûû¹Äö;´Ä½ØhßGÏr*[\8û|‡±Ú©Ä ñé«W±t^5Q‡d牢k¾/a·Ë{Ÿ¯j½"ìÀƒ|õÈóGï<4_QÏ=^Uçª¸c¡úeÚ¯Ò¶äƒøø0^õÓW¼®ôí+W -ÊZõêX+7§Ã>¨’¤1ÁI’ñÚ_ïÔ¿?#?q„×g—ùÙå+^b*>ÿ̹íq›~½çlóöÚk¶ùø-üû?°ñqäÃEë8ü3ª¢ ö~~ {~4·ÂÞùå“?/ÌãÉËx×6âsmá!ñ¡8îóëK«`èž>9›}\1Bå+…ƒa?Ç M×å)11H$cò×Õ<õìúÚ5Ãæ-óúùØ9]û¹†½ Èo“–Šô*^_@·1@IxH!i½YfüÍÆl]%ÆíK+TûÚ»#¦¡½ñ} {íq¾œD}ˆZý¿fۏÆçÉyÙ+#ÆÿFœ×]o_.=.SŠ+ËÏÚÿu›âÁÄä“‘Ó Zý ¥íõb¸d;ƒ1—ñµ¬k+óã¡'å;Öï9Œ0¾ÖLcÛr9_±þIM#.£Ä;ڇ/"œ7bæ¡}{G/_"¹=¦Vß´„Ša—˜%=ÊJÜöä%RA$kø¼î®ÛSàå¦øvî4Ö^ë¦9‘?Õ¿¾õxM6€9¯éçS¸÷yáåiĔн çöO‰{c1˜©Ol|ەX/^qÇ£4óžƒH)śÖ'AOÆ¿ôÌ-«p¶>nҝÄë©Û[ØÁ)b=¥‡ñõ•¥Í8p]ó½..® `Î⃄Gò5W/~WKÝ®âzÂG®Û7P³&Rô «q+)ô–ë%qèöçu·Z‹^ošÝÍG¡‰¸”ùiÂO˜¯/Z÷6ýºÞãÚfö¡¾¬ð f*6®Ok´¾¹´ùiōø¹Ã^ó.´Ú·#”ö§ÞÞxå ¸(ñ–£ÆdußuaE -c™[æª o8d0bæ›scZ_†gJŸðë¾ ûb°f:OÆüÄ­Hqdä)Ò L¦ùÅ 7°f¡{~1WDìx՚²Ì-qz·—/„‘G†£çÒ|dÐ|k|ò9_Æ&잇òõðÉKž÷í)6®Nb$ó¦/—ø8H^ëþIóÍ.ì¹ÃŽ¢+óÇ·¦qÏk µŽ¾ÆК—óÙҜ¥1#Nû3]ÍQRٜ՟qbK)‚(lüO°eEÎÔ5&ÞC$e?ÇR›OvhÔDÔ9[*4hã“ÇÕâ ¿ÙZ7Þ:DF¿„}²Zaó Žò•»ãç^ó‡:eèñ‘¼æ‘ûÏ!@A-nóÌëÌòW°ÿ̞Gã -6~b9ß{%¯•áœÀ“' žG¨#6¾®>½JMU7{gÄaQ„ã# Z|×ÒË»ˆ»ï«úUNqnÉD3Ç!e¼Tð÷}^jþbjW#\sˆ}îÑãs‰ûú˜UЌö‰§#°ò%ìõŽw"Ftà{ŸxrN|„é…–zµuäpI¼@•ñ¹Ÿ9Õø…¸">ÀQoúólQ;' yç¹Ýs~‹á[MZ"Òë£ú¬Ä}C„v9?qä!§"#‘¼Úä "cLñ‡»û­Õëç†>éöÞáFiÌ9¸5/y®GO$‡Ÿ€qeú °æH µª‰ÿù5s€„]¡ÃÍ}¼–½Ì yízHªîªç‹ØåZ«ôé~C.™æäf_Hòé“W8…2ÞW¼¥Íø5Ž0×01õ£¥ÙÜø5ÄVº«9&¡-B‹ÕsC'3¡ÏïVC]Fç•x¥ê=—!¹({èÏ@Ã<¨æsäfØƹRG¢báéñ–p­&cI}~Hóån»ÿ3PÚ¼iÏ\Š@9ZÅÎ>ÐzÇfžÓ°“O\E¯sV}͙xƒ¿„ýÎW¬ÓœmrLÔþ•fãì+ÐA.ygóÌ듙O͍"\à -zO:Úäa÷;EËáëÎþålÇk9Ë-›{ð¬ìñ£)‘Ó'¬Âajà<;LS_žæ͌ùÆü:BHåHpäˆLëëˆ3H}…Sz‘q)-3ȊFó9FýZµX,©Hz‡(걫_4Ç%ö -÷˜q{ª…Ž¨ÇÇžRJjcç6×薞㯞}â|~É<UZ9&½×ëÉÌ/¾;¡cûԘDØá[€btMˆ]­XUŸÞó…¦1Îåì(áçcÞoþ=_òký<Ã6Ç=S°ñt!GOq„üÄØ͗láºcäÍY ô‚Zã[+a¬ Û¯Ôù–k‰±ÛI¨ÅçÆCÓ{]1_cᚺ¡ø½½ãç.{yì{‡} -ñQ×9Ù\èE3ú>a,¯bÞ¥¶â»ÿI(ä·{NN/8‰qóÒÐÛ2Ö}uÅd®5 gIº¾SÔ¶×9éŽÈ%²ó}Þ´+Çfœä©eËÄî¹(¹vת£I©ŒŒ§Û“ØÍîjŒ"O³›A{sbº%C‡²vMßc„qÉÏz©‘%`ÇÛxpšPhL {Œ”ªm É —4óÍø²æ±ßÕ×RgHÄ¢"|Y±a€v;ÂZvø„›D¬Ë£µqƬø€Ö¦ź•™\*¶sŒ×œ/ìf£o;ñ¤íÜòü<#å2궖¸þ{ï¶äƑ$ˆÎs›é`vLǤ9]`Æ-/-ë²(²5]¹$[­ÙÙ¶2*‹…! -¨Å…õ3ó2ß°Oó¦ÚÇ9áá‘@È/³/,Àéááá÷йس¬bK`|ZKµ¼•œ÷¦ Žìl ®¥`ážVš{]Áîjê0r$m§ª ¾á¡e…‰úÔ2ž£B SZi.D¯0ädEQ0a &6´¥7f‹Ú+Ú £f­Å÷G‚SI–I¥|d”ò'\ƒbÀ|¼΅ “‚ÆÙqà’MÆ}€;+ێ}l\¾ÊqÚ;bL¹¤ä`K¬ñΦvÚ/±kA‘kÝÇâ7c@£¨Ÿ8%h­BÝv¢qZž°±NÌx‹<%  p’ó¨!<ˆ”C´å<ÈG˜,Åð`¾’&j]pD©ñ´“<ÈÄ)G¾¥¢Ð-±N -‰` ÞÀ#¨qJ@›–F> Ïbø:ÐòŒŸ©1ɯ‰“ePyó—};o‘s-ÉÃëðn`7d P²æ |ˆ´dSd7°µEl&‘¡Lâ€ŠMlùpð”ÅùLR‰b iJ+0CZ>Ïî#;Rá]˜±ÇC¨H‰‰¦<p¯‹9ªÛû—yY/qÆ×ÒGBHwpfWB¸±0X-;Óà2„à òw8xw-sx-уX¨Ùã#LFçgžS´ò$#—;ë¹#v,?‡ËyYò"iáÁ\¨}`ož¹òç~\nÖs{>ОJ˜+æ)Å©@Ӕ¹´öAR)Fô Hñ!§¥' (ÞÄPtg¼BPcËBµoŽú‘¥Q Æ{ †b@R2'"PjҒ$ÅÜ6Î -ÁËn2as$’‘£y5L‰YÂÝ̘1˜ €`4$^«ÉC,%`6ÔX3[•iF@Â-:[<yåÐÇ÷❩J>ÍxhÐGZ!ÊGšåޗèé踴d·1ûyâ¤"×ÛBS˜(À9ß/ÇÄEoúµËqº…¦mVd: -ÉÍ}%X -Ýy"}1h^ڈs+õ,÷c ±øؘ¨ I@ÍÒ²¬`ЬI D扻4Å3!Æ  -2öaT;cH G©HÁeí3 -ÖÅmo¥äð™ÂÕÓvô+dΞ)âô.î -&#ÙϲUéÊóŸÕÀ˜ƒ«UpÂFˁ9qüqùÎ0tÇq‚ñǹ¦pvŒañrv¬Cš‡*œ¶êN$È ¢-ʈ€!¥ %ùu…"IUjMqØkU¸RC–’ì'óŒW†×øòÜ2ÀÃöPZGp:cÁ!í3h¬Ü|½Â÷gFžRîGê*»øÆipsùø{¸ã‡ºM ôvdØÁ!T*‹|2ªà>ˆ4gÎîÃI3×w d|’eP,A°ëÐSWêLNJX¹÷̃+ψr˜i쐥`š]ºT€p¡97 w<g’¹xÊ@vœ(Ÿ›áàÁ¥ƒÇ - ÈÚd È|.Ü?Åç®ä8òLG¶~¡œÂ÷ 埊v¡ :ËýыÄÁ0P>紟”ÂÖ -UЂ‡³è_¹1‹]Â+A™r· ùɝRÚ«mÛjÈo¡X8J%7ffBø^šÇŒÇi!’O#ÉÉŠ¢o /e20wÃD&SijKC¹&9çZ9[Ɩ”à˜w®}cŠÿÁ %´voÒçyÔ»¬Yâç|—à‘Tړò"‰yé(…Kº›eýYP¾W8ºHLÍDäÊ۝<0³+¢¬<´%úQHN æôÛx ¾meô¨o9Y’ï0_„4 Lƒž‰€!ñ¶p“k>Nðæ:ß7UÔO³_;’Ö)ÑÚ¡ã c$9[DIæå†56XÚ ¥9ω–[ ËÀ/᜘%º‡x½EJ‘ -ByZdWš åû Ó82•\f‰»¾É%‰¤ Ôf²øݬi&sî#)*x ú%åAKNxÄQ2ó‘)9ўô~kNÀ´àì¿(fV;÷ŽƒƒŽëûfØ.8גkL!X‰KPs-ɶ™8§æ)a@§*‘0fòðc¶Žà!¥„’ÊŒ kö$òñ¿VNÏè*dge`±!Fj|JOf8è+q®z´%àM|á8HirÎRʍ ñg©3b9º…´"¸PÒûéTâµLñRœº¬ÓCFôÁ+üüiË9$,°_‰øZ‡øh–^և›d½®àÜe4aÞ‰žÄš ÊÔ7²}¡ˆBCKDH۔r&iýhÊYÎ9Ž#qaÉ^äË){ÉÄrÎpõ褻4¡Æèbó¢oJ»ÍYA$aú@V9ȓ„™Õ,l”eg Az„ɈÛ ü©¦+¼Tﳂn¸ŒlP BL«CrIÈL|°œÓP4­¡éi “½^Q¢„% }<#λGãìGôµ‘¥¤,8J Y¶ž ^ó†ô½Àò2?§¹¬ðaœä“å:£Æ±]£3Jº ÙÔ¨æƒ ½ƒ„Æo2LéPI©²’ÑÆ}àtJÌ;#¸Jˆ—b1afŽқoÉ\Bç1fŪ¨ôâh.)§ ÷M{M¹V&` $ä…ZÉˏŽ9l’wž° —í4Ë$åÖ¦5z¸ U+ñùc¡1¢uç¥æŒVäa–ƒ½7ñQxظ©³Á„ás)Ž1HÅ;×ýb¼mŒ€¼  ö`I5ïPo¸QäÅ4sCҐ“.L„!+ˆK$^ûSŽÌ3Ú¶’€RÑò“‘¥LÃÜò™Ë -#À Jä¦ÔD@’d¼¹”!  –‘™‰Dפ¯jš­·‰ ͸3Y®Y ÷ï5Nz©RÏ°# qa–l6£àªÄY?Ø *ÈL±M0Ò¥"[ ù1ý)ï1g@øŒáøšé@Çnx "qUWØ% o0Ž¡´€ÝZ™fY¬ !É­ðJ±æ9%$Þ —±¿1 >O×6 '€_2©w˜•¬É + "d’†Ý;uÆ'ß ²úú(À@û)RÛò ¤‚58ãÔPl¼FÒÉI[*ôÔħáç¹ © [‡1ç9¥"¦ÁÓ—=»ÓÒoÉw’DÌ[AÆöÔøaÙædx'9•b)ïðI(€y€÷ž%Ñ|rüÂ3ѓüIʹ™ä锯ÀØûb8”’ǘҪt) èéIå ãbf vs˜µ>¬Ô(o“_‘&yYC´û(| ‚½?VÆɆÞT%3˜9%I„Á‡#§÷<#àuívø–òÞ„m Øû0óRP:K ­Ê€ÁPÁ ÜÁñ–¤†Ú{·Ž$×}ytéQ.&ú³7PՍ-|`Dµ¨¸ÝQŠÅ< •ñVl,¹ìdž!©¦sÅÅ>:o¨³èQ)jÉóM‘&A;¬ÈɊç‘[×ÒwL³µÑWƒ` & g[JŽ^oŠ˜D¡ÝuŒ~9pU Iízâ€^åÝáé`1é{‹ÒMÀPÐ,gÞƒ>lš —k‚@£hñDµ. ± ³…²pHžÜküÈN³1’yŒs|ÝHn)#̆+[`Xcö -0À}â*\«îÔ-fŠ”ÁŒjCpógD7J¸G´Ìàia'û£ x]SÅ !¥ìÑOØh1’ª•d[·!.!$mg7ٚ…6ŠƒRJ× m0A+Skï… À´…!ŠWèÒƒwxÜWU &vKfâÚ2 žå´éȓ œMžz™¸È"v‹»š1•Ï…Ébcd¯óvsὌ)kþâ3VžQ½ÏŠÃ×q¼|ƒg8‹} ”0?ñ"8ù”s iª>;ß7v* -&l:xF‚&3„Ì ùÓÏS8T8T<æœN?XTԉ\Óó䂃Ê’\øyrxåɽÅg¨ `ž|‚uoC‘’â˱Z¹‹w[ˆøuNù90—Áã¡a¹'!^,#’Iïñ+à ¼Ö£°š‚Äœ!_*¡p~g$~]¸Bº~g†•Z@a-¿R>Í -Îåð†“C!HTˆ‚OŠË(¨«MGcÖd I¼M€’t’Þ-É»ŠUSèAAU¬rš¢‚“†WZÁGãe$nȄ Ҝå&̸=#¸Q¼—} p’eu*—8–p‚Î| -K9¯”,¡¼¡$\ÁìÄ42"ðÀ „F‰OYðI’Ü7.¸ -zÛO¶—÷H>—¹@ˆt*õ ɛ…*+gºXx®©o™ä £DQá.x£tI‚å™Py$I1š -œj¬2I*U΋í÷h–Süh(’ì )—Ás9`ÈiØc^–"ÓÌϝ¢ãK+y šLi†J©¹ÐؔD”$+(^vS©“Ñn¦u¬Ÿ@¶`+yŠIb ž‹"WÌ9À7K¹V\üWn\EâB„Cæ`\ó®¥?¬SïÞ÷¯3ó‹*¥˜fÉ fÓ\_>$‹l£IÂaܚCÈš¸ ’ÒXqÕYdŽq.yߘ˛ù¢SX՜[†ô©$*ßäÒo,ò²›LPÌ»fk2C!œ¢e¨¨˜CËõ½Ð,åßÙ5˜d2Šq×.ÂÙ³" ~ùá ŠÜ—†k¼cÍc((øØIY\”£ œ*Ø¡DŸ‚ :ÆĜ™07Ñ!cVÁ]ˆžoÌÅÁ@Oø™köØ yÓ'0²t¢ÇƵ u[e9gA·Ùý -ö…’ ĄL(Å; ™Ã9æê BDVÆė l݇í)›?uÆááPéU²R¹@{á"›(æl$Ìþ0ì‚1øKÔ9ÿS°çÒx£€OüŠ÷†¢<™‡“ dª€±3ð)C§B’«OOdÉ¡ý '' -à¶Ì# }Ïc§!‘¸ 3M¨È•ªœP%ù´u%68æè¼å’d/¸jX!5÷XG…ÿʸI™®”ç'X°ÁË§ô|Æî×$w\Â}Aâ3è¸H›Ë¤éÞÅñƒ ”ù, ÌSš(3|ҙ0Š‚v¥½‰XO,BJ`æꧮ¼%¦#Q2oâjò8`(„‰žÇ`¨*ž×N6ÀK؄—¹ìo £À8!#ÌxPú-ž»è:ǑRIÅÆüé€úçCì”eìDQy³°„Ïx -Ȑç•Íœ.‡Ý5\x_€0'A¡ß=.ªÈƒ™p""Ý¬KHoÄÒ (™ÿ† – ñkT –I´ž¤› eFu21·&`¬ÞÃåžhéK¨): /^€†Î¹âÝlrÂ, ]ÁJ -È(èä³Rªô逺H©®`ž1Ý| ”71Ȥ/ZãÚSN!œ¥L•=,0ã²l˜8í1CIIz£ K@ O@bjBë3$P çe-Aþ£9u–iÌÅ$µ¤ð‡¤åJÅ£^G Kœ<¨18 '˜”ê]·N¶•è=t¤y̆bƒòI”ÆÕÙóIhÃ٩Ù* ‰H/8µÖðR£º'ÒPґIi¢-‹®|?ºÔY˜Ý2œö›²ÒïJyb6±ì„JÃÌe‘Ù’*ìȌ2ÌÝzåŒfÉÕ*“ÖʙÎÐÍ9ž4Û¬XY@iÉ %¡–öÔâ›øyÍË‹hF5ˆ¸Ê²/ -À„=FQwó,‹µ6YSyTö#P‡xŸ «Á>À¢¨¾’¦ª2HEgúJ’tRAô֑W-”Î% îZ»´‰CŽ -֮ζÌ«bš“ ‘¼nËk¨¾H¬%ÆJ‰âáï€2㢪:'´* ’mõ!ÀI<´Š$ã³£¡%‹u2ªÅd¨„Š-¾ôSJµ4©Ã¨ § ë©Wl*ή·¥Y8¥2S)3ŒP -ÏKòb -íÁɁ~0dîI<Ë}} -0gJ³ØœQcb…Æ—_K#NTaªŽ±†8ºÎXrÒºŠØê°>ÀúC; }ŒèÍwr¬"ˆêŽ<㽚ùZh™cª~)ꕿ“ÂøÚéŒA²ð˜kn\u·;"ñ,fŽ'ёŠEP‡ €ÝJhIa ¾(GÜ8$~ª¼ÓÀp.ãõQ°#ŸjZ¶&r!4˜rÆË2Î>L\iGOǔT8‚Îìē‘§Tá¥\ÇfªÜsÁœâÇñ,QÁ½Œ‰“ú҅:6h¥Tt l^xê@9BNä‘ZPã‚cäÈBÀÕʸ†`㤝}+ fa~ƒ¬n*P?± ¦K‡ZL9ž‡ŸQŒf’¹³Ú$Qjâ¢XyʹŒ“I¨´.2fËѐnjr*ýÊ1ŒTÞRÅa¡Ž‚QœË¬Û4d¬Ã0X vm -Éf†¯¯ªjœÅÛ圴`b½„£JĦÜsš;æ+‚fÎFí£¥Ø ðà2¡x{û-笰F%y€g†l¸Ä Aæb§¦ñå¡Üg»p¨Ajá4ɬÑÞóbŠ³›»`/êCê»3a -v4ÎÓܑAIȑnZZ{µO±‡mݔˆ†êoC€"¾5KE©ˆè,•›)Ì.aG‘t"B*(Ó ¢ÄiS,Ÿ4o×XrþVÂåX¡Ø‡¤E( ų̂&>œRˆ…¾ÈÈIeŸ¨æ¦gðýl¹B).‚ëOR,{äF¤"ª¨–§lÚÃD,*ãé˜;ÃUù@‹exÆ5y°°|Dd*1—(Ç®I¨SçËha—N¬{QšŸk싃¦‚/A -e™1‰Ž2犔]ž)$XR-ÌY8#xÆcÌgKÁ0EÉÃTôZ†â«9k"©ª÷ã×´h£Â¥¾Ò0 C®r(1‡[ÊQC)Á ®îõfô?„šlkÂE•BÐ~è\!#W)¡UœsÆ®|/{SXæýÇx`p•ybn™Âú`ó;jˆ”h‰Ÿž«p²³ñ…2͖{R¸IÀ&w¾z7äÄiTJ—aBÇ)q¶Âó -éSòÕ-õvú‚mҕ ¼4åŒÞK¬[S¾sAüĖ°VɐÂý 4Æ7-¸&+‰ÕT”Sœ­Ý„¨ZÁ¢›I—Ëõ䚀:çr¡™Ž0hÞÏhÓtÀP/Ý‚˜-qz †ŒýÄö<†,Ü9àV$uTZKdÌ;^„Òynñ×ø5~zLT6;ÆBöh.ƒâÚ>™W…-PrI7¬6ÂB"$ÓpÀ¨p˜vê¦ÑNüöûŠ%@££ªAX¬Ø7TQøêaP#>åچ&”ƒ÷—²ÉPB|­ôü¿bezÑ{Lbo`Úԛ:8kV10—5À"ÒkBÊ;ňT -$ãm€'± -–úšÞCÆÀ£Œ‡dåíÊ(N©è?jž´1¡ñ†àg{kªl(š)©Êè« -#Í<¡ iÏ3±1UӑR0Ú4yûCã„#¦‚ùŽqb±ÒaXE`æ–…Ó á¤à, -2ô’/€lr)ÎÈ6A,žºŽÁ• Â×%,@š”u5,Á”ëH-£À>—P耚4q²a#äÕTJUÁ ×_Ç1ÌF°Î»BG¢þÜ´ù˜U´ª{Ãp_νüƒ@6û¸ -êJÈQPþÂ:ÞRŽ¯£È' -fÚ¢>JíÈ?…J4kÆ딛”`™x&ùu¬{é0Š5Ež/\IIÙu5¤¢@Î0ÒàšåœSÉÀú„”š¼’PÇ@¬}*emúÌÙÏCE`ÔTo¼®4uÝ ˆòéÙ>stream -¥¢+ë=›e:®(øÆ>ϱ4«y¡êß«`(A€´Ú UÅQ)¾Ì¢îñmÎ+„ÎpÕeÔCg¸ÚÂ=0ca‹*«Ôu†_Ê£c]ò/ÍX9çÀãË ×ðžFד¥:¨Ë"¾¤”U4,{.)5T² *!!Ö¯é6ë5Ìá¥ÚU©r?¥|»o¦åÂÁs¾‰1gíÖÝ àóˆ¸víÖn‡j^t­q_Oàë[èvêö†;w“ÐmC®1:ø¹@C¡8˜rÏ|}IÀ Ùàžˆ¨¼‚ -ɂt“­ášgI¨Á´Ö·øpJCV2N>\œ…¾q0d*iÂÒ° -G™ºPäH³‚.¶[ëC¼2Ç4›?o.ØÓ§œ(i»b%e³J€¡^¯#ï,\X­;+S¾û+¼7U”ö™s¥IwÎÔá ¬6‰b$L”Jtz4À•Z A¨3œmÀsÝ×ÄY,Ê÷хÜAΆq%£Upº º…S~ðÕ×bæs@3Ž'3|ƒ/Œ -r$§:„€²8õΡ\ñôŠî‡¶¿ÑrR«/ˆ½Þ‡ ëÈs„YY7÷4cR½„+r1¤úlGv«U½o¾íýò÷µÏ_?ü!?ÿ~rùh¶œ_?,ål‚PÐ󟦓ç³Ñd1š¼>9ñðGåëÑ$þå«?üt‹¿‰Äýøòç§OFc‹ê«?<àϽ?Ùo¿üxöÓô²ÄϏGÃÅh:ÌÞïøé»Þ7¿ÞŒ'öÇÛÁÙèb¹(çßöþh>œÍ«m†×£ñ嬜` Ù{ðÃd~„ïoKüñ¡“¯¿í=øÛd4´ð—÷äuµíÛÁxé¿].®··ž n\cÛßüÇ0´ërôúzÑ|lÔþ®w"[ î}óq½?’!ýÚ|H¿Þݐþpþðâuy5 ¯å_“Eùãhñrx lfr.wti›î(4úc³áz9]ΆåÃñíõ 9M&Í×Àhrw‹àb¼œ5Ô¬œ/Ç-øµ¿«ÁéÆ#›/.—oGèVóñUŸj¸º7 ElJýþŠpU>,çóÑ`òhçŒFCØ>3>i—-øìå2Ú#jq^Þái؊k +œ^]ÍËÅîíóqâ]²Šg8ÒcfcpAëNÇÓٟÞ]e fÿ~¼£u•Ëcó;Ó’æ»-‡Ëñ`öý¯·ÓI9i±0ן¼³á¶íét2_ ömxò®Fkšv9» ˗ÃA«µ[yª;.>â `=[îXuŸï¬84}"ûŸûf0mÆtf€Ùj¢~k>¨ßî\Ðy>Mg­Œgüt½y鏝3/¼³¶ŸMD¶aíòîöÄ®3(Ôô¶œ Óæ*wôı]ݑ|PêÛéôæv:ß©ñ6i.ç¿iÁ5ÞÜ!Óh~†¾Ù1øʈÄQŒh‡«2"} ÚåÕbDêxxÞñƒÙhq}S.FÃ{};Iêélp{Ýb¤Çr$G‹çƒÑ.ãLw&ï3#‡v¤ïa@ßcßå,ÿXÎ^—@×c–¼ZoÉ/a’>ig #ãÕ¸—W½ï¾:ôð°äþ†‡µÚ±…‡Ý»à°{¦½Ov7ÒÉÅ¿—ÃÅ£érriûøhºc&֘§m»˜7Ÿ½ÊC OÄCc°‹åìb9.'Ãæ¾u÷pS"ñ«îdx“éËÅh1Üq*T ù«Ñ¸l±*݇ê'Í]̓yùdVþ諾ù xå±»êóF4ÎÉòæÙp1xÛf6ãgîj„°-ï»>ýª!ë9lU«ÕLeÇ>›Eîè VrÚ)§rÚ)§‡¡œ6«ï”Óû§œ^ÍVÿ4Í;õôèÕÓ憦ãÖN›ó¬N;í´Óš©N;í´ÓN;ÝݏãÐN­ ý¸¼ž”“óan_PšsJÌ—£e‹c™Úß˸-ò#;®x \ñÇéìöz:ž¾n.÷vlq?¶˜vlя¯9%:¶Ø±ÅŽ-ÞO¶øýlz9*gÀøEŒ¥íŽ1vŒ±cŒ-c'2Þ‘±cŒcìc#Æøt°üý?æÃërö÷r4¼þ þ™”³Oäµ?F6ٕ§ì6ÝgÚtY·éüøšS¢Ûtݦ۽ž„¹¿qžm†vlqž'âÞEz¶ÒÑÄzþe:þíf0/gË]Óº€ÏC½Ÿíªˆ^¶PHïpÜïê/Ýí_º$yhLdÚ ôù²‘î҄†#ê.MøT5Ÿfåe»r°Gû}ü—'\§ÓKsÂÅx0|ó]ρ¦·ƒáhñþOI¿ÍÙvL—)à ï÷o7ª#ÝwO`‰ó¶›_.§ïNïå -ü€c K,9ÏoKÞØ (Ê(ïEyðËÑÕÕ²Ebï±0Êæy®žío7Z{ððÇêvNË»*ÝÕÛÝíVâA®Dñ¥±ÄG‡"„ú”y5LæW-nË9Àݱo¢Igñ9‹Ï^"ñ1Éûn}’Äߙ}¶L†O>e²>{.é.¢÷;s¹—ëµ¹ÍìÈ.ÖÓ÷ùb½6ƒ;’‹õLóͽzýý¿®Çå£Y›XþîZ½êPïõz-|ñÇRT­ßÂq6¸-[Ì8µ¿«±]ŽÆƒ5-Qï¼Ï¡÷>XéÇéìöz:ž¾n~² ªÙ"¬ ã‰O<$¾q,œðއZÝNØ<›éXXa› ö#‰ø¾ap-Öݑò‡ãë¾÷åZ` óû‚*$-DÞã®pÐ<–öX ´CŽå„û,ÑÝwyÂݏz;já!°#ú3öfœ^&“rü²—ÃV:óú“w5ڇͽQ{výÉ»móÕÚ ¿r¦ßñ½?-d±£‰ »ÇZóx¤ÇÚãÑüv<–7ådñãàö˜Ï¶{\«ç¢¹•çXŽíPb¨·öQT>6ú±U j#Œ Ãl¾P”aޓ’CÍÕìcá(m˜ä±l§æ³ttIÓ-ŒvŸ-eúÐvéÕ¬,knŽ¾í -(_‰÷Ãü_ͦ7-F…­ïjTÍ÷ëbÚBøœÞ¡œ¶C ŠíÎåë6ŒÕ7¿« Æïï›ÎòËÅ`֎Áºîl-6Üe‹J®ñ] ªùa ûð£é@W»«!G“rÐüšèá`<üqÚ"¥$z⮆8+ÑÑ|B//G‹ÑÛ6sÉOÜÕ'ÓI‹‡Ë›åîH°Ê£gîTILF7mzþÇOՑûS«fx#—ò.réàÐëîHí9]äRƒ¹º[ë÷°‹\:êÈ¥îr–õkìRAäXθ.vé(ιa»ÔÅ.OìRsõæ¸b—ÚHcG»tµ.véxζ{»4üb—Ä»ÔF;†ÙÅ.³Þ¿Ø¥6LòX¶S»Ô]÷°ÿÌ3Ói¿Cïr‚÷*ByhÓÓ&žµ›žÏ>=Ÿ´äËÑÍÎ'íÌtä>Vp}øÃùóѯåx~;*Çç-Ã1Yô4IÏ4×SÝܾh£ªFÜÕ»Jš­I6+o¦»ìŽ4ô|4¹,¯F“ä+Êm9Xžuöñãc!ÝwG]T»Ý p$\rHW½=[î`÷Á9®µkn}ӂo¼¹C¶ÑÜ4úfÇà+#G1¢Q •é;Ô]šhGØReDêØDßc9Š³Ñâú¦\´3ŽñHÞëô:Æ£ùÞ'‰~ì³ùBûMxçÎÿÀÎ@Gî¿;¿e‚ñ!Í:w~çί!YçÎïÜù›×¹ó;w~ûQ}iîü®[çÎ?w>ŠàЗÉwíDÂ΅ œÎ…ç°Î…-;þÁ°ËÑÕÕ²E¸cá"Í͍ž§Ó‰•ø'-öÛڃ‡?VÇ"^¶+Syè®Æø¾§ït¸rl¿µ³`EÜ±ùêñmgpp@¸í*Mgþ ?ê ÒBw¿-‡–3Ͼÿõ֞mlOëOޙDÙ|ÇP§Û›Ú֟¼;‘d‡ô¡Ú¬äÎ -uXV(Ú1”uhŒº³Du–¨ÎÕY¢:KTg‰ê,Q_ˆ%Ê۝œ%ʛ¥Ð ÕY¢ŽMÑï6^càJg_sM;ûÚGìÏK¯ÞÛýNt¿ç5gö±Kt6—{ŸÝ~èUMŽ¤òL‹ª&]å™ÃёTžiC~4‡ñRufß:~Çq,G‹çƒÑ.wcw&ęÜUƒëÎäƒ^uGr&ï§guçòAË­O®c;’»*p-ÏäcŒ³h?Ù]¸ìÌtäžV€{9¼¶HËÉ}ºÎ­«¶§ÆÜ©8º"ÍË6vE*f·5¿éü²ù-õØö®–a‹½o1¢÷GÂ5Ž…N¯®æå¶Ï¬¼lÇíTay†#þ‚µ•˜ò/Am9´éúl®‹£›©NÁ<>SèäëƋøÝè²MìŸo~WG©P-†v]¶ -œãöw5¸aš®…@w‡ò\«!µºïPèŽÍ7÷¨|g¾éÌ7_Šù&íÌ7Ç'£ç÷Î|ÓbDù¦3ßtæ›c˜ò/Á(phÓՙo:óÍý1߀‚¹°²ã|¸Ã.Ó©—÷Z½¼š †‹Áø§é¨EV„{¼)™øew2ÀaKóIS^}‡Ë|2}¹-ZlÜ965·Éý¯EC!ñH=:_”û#ùRüÍãԎÕýÛòP¼~Úé§÷T?mµÍ: µÓP; µÓPkGÕi¨ŸNCm.ÖvêýÓPï}Ôᥣ6¯sÜ*jóqv*j§¢v*j§¢v*ꪨ_?üA$çßO.YUE˜ÐùOÓÉs‹/Î<ñðGpÿjüËWøéÖáÑîǗïo.¦cÛ¥Gå娜\•ãK¨ï0•¿ÿG99RãÅÕø÷ÿ^—ÏÞÚ>•ô~õ‡¤÷Ë»¯þ°¤ÿýó(òàÏàÑKð¿¿¼‡oÿb?ý»…½ëéޏ½ûGÒ»üJô~y¿Ù¥ý$ItÑ;)z7öü=ûê'ü!ë§&“ -¾Âÿàk* ~N{§¶AÑK±aÑãßèlS@+øs^†_¨9| Ÿ)>x†é—èÅQ—mÛ+ˆ|n½?Y_$FgøWÛfðCŽ]…¿nLôËIh~’»wÛ¿îåð~”F÷ø÷ëIîu’»ðoÑ#¹'Pîèóè&雿M`e]ö^Ï0㋞úç꤀ys3Gÿ>²Ós’À`“DôN„Å(e/²Bê^VhÝûå¦ÒRŠú–©é=6Åù¨N™"Nœ…GìbüL[ÒÏ¢Eˆ„ºq«ª:'8ÌD´Oµè/ÏS4{+[ýڅ‡ý{¬4ÓQ¢ŽÑ4oš9Ù|æ,*™Tig€ÊjuæDQß2•k3·ç£f8eV9œ¸o¾íýòwïCË©’~Zè&=Uv¥Ø?Raì“«TÀáÿ¿ ÖypÙÏe.TO÷¥V÷è |–)¬=ÿ#L1|.l÷ðG,‚>ڟ”@­¢;Ã|}nO°EõœþúüK…,7ªÈ#SÁ£G!€ðÅtJd|}üýÜ÷ ÐÒknÂë:V7€¨Ùºí½•}eRQ覽ýÛ&T$fؓF=‡jA³É÷¿ÞNg‹WtH~}žô<šNÇÕF“ÁŸ|º]z¹àës±Žê…=ºæ‹v(B¨û¦'ýß`!¸môó B…HXªpûݼž×g$Ià.Íøo淁Eš•jx™Lµ!Þaûg;¨28ET&©á-©;íO2>À¹àx?ý%Ö`¥ž¯ ¼û&ê |@vbÂß­Ç´ÙÎìí/ÀiM•ËæÀòø؇ÙÐÄôÝÁ¼Ë£]X’*;ǑÝDC…ڏUÇcßS4ÙÒÛd÷˜õî1';ǬŠê˜—n”Â2ðáÌ}PDþ ¶<-ÂÐuýÐQvH 'v¡Úr²Ý•_tNã\äQý#je*íÒIú%~ôWîΉ@.ÕzD± ¡ª-ì†Ý:²-ÖŒÐø?Bš)ú»u©âՇŽ/]Ÿn>¾tÇø­JA«RÐbTч¸*ueUfÕ´©š®,ʕ'jF$ý€¤OâGA?îšÔw™Þ´ËôÆ]¶aDƏÈøѼÐߏ¹õÎ=¦7í1½sÕ/ñKPúe&ýºKÂߏ¸üDeºtõ-kF%*³µòÄú`¤‹tCIÜüŸ»òĦ$6í$±i'ÕŸ¡8ý¦ç'Ãÿù˜KNlÜBbÓ·PÝP•Ýà_á% ú‹Ã!V÷Q–˜“jæÅ U룡'ÖæÅý°6\bÆ­&ã֖¢?u‰­ E¯ ¥f·¬ EïŠqCñ²®Ÿ ÿç#.±O='±"2{&ýBJ!rì(/¢Â€ -4gítòàM-x‹1Qfhñd» 'Ÿl‚ÿJߌ^ÞdÚK/è) yÅu•›]…”˜MSíP>VΑUåÌ-¡5a…ꚶ&ï¯Û 7ã]“„6á•ÅÚ\JÚ|Bÿ¨»PégÓÛËé»I­BïÍüN¯ßÛØ_ô‹D -;GhA¿YÐIÚ×ø!†å}aÒL÷ò~jLnß(¥8E;/™êªxP0О+ÐÎì’FØõu+Œ±Ñ ߈ûE°æûþ‘@D»J»Ó­Ö={dIV¤;­{cïÁOÓŋr8]Zžà×>*öOªrÑOU -»MIº¾^OþðÔó‘WWÓٍû–©]ϗӋòüáŹíóËÅûqyÞ^]ÍðÚ_.›’û˜ `Ó§´%‹¥yÈ„5˜"e˜]&®QÖOñDtgX¼hÅuàPÛ~åñÍÃ:KÃZgTð¤t+Tû5P@¯îð2¬o-ÑP-5åF¶J£¦›-ËğpàÔüü}à%èÃûAá Üb¿XjãS‰}•Hòè1\ºMØdþóÆ3¸£T•R°rsµ«›û&€b´Æ&VØȯ©œšª®3´U–·Æw2Ëø$Ýcv¼Æ°W9Ö.¶Êì"6K u~¹vâ6rÏ6à…Ù&þä$ؔø“Žy¡Øȟð©D3/Ô1/lù®GMÞ¥õÊk¾x^¸ÃA¿²ÃcÕò£8¾O4í2áwXFh¿‹°óP7°å¸î©³n\ÉûŒcÊ<ýZŽŸ—³«r¸p -ŠS®Þ°ŠÓDIßïšgYO🼄þÏçWזÃ7ådUQ[ Ʋ ]¯BçڇÄôEšd9x=Ó,19,¯‘¦Y}%sQAƒ]õ Ž% -ƆvwKÊ~ڗ*sx ïgYªCO -cŸP¢_¤™ þqÖ!„çÌK~•W¬vædµÃpÊԌë$:~_¥ÍIL¹“˜ªÀ¬á»´}ÀØ#ûÅvHYÝï_ÝOv¨if ’Åc6 *§Léã) ÐçG¨ýÚdð¥ú¦¨¡w§n9P¿ã1½ .KðÌ@ŽÎ¥J•bmŠ: ™õó¤@SÕړŽI™ÐGr@8¹®¡=þL ž£MB|¶þ.×l½þ¤`DÎ>^¾ú½ŠÔ’ßöèzã§Æ¥™ÊàiY„©]„N6÷­o´*d‡sXˆ¼ Ï¼†ì·¾‘Z 8'Ö¿îR@±‚=¼ú”í–‡e†iOç=mÉo„Fn»ÿ¹yû÷£É›ÁòjþnðºžÃæ.ìë¡%KðBN„³9%’—2Ša±Ùu›)¡aiä–I }úWHZià2¹€•–Øݕ¹ƒäȤûãvOñõfyK’;Geuhßg$œ1î»´ß-‡±ïVørå,v®‡:‹A©3ÒLÈ ¹h¢SÇ~ -‚­}«Î-›€­É`à9@ïˆÄ 4Ò«~šË'à‰2öÀ(w¡%P 7ŽËÌö*…0{¤x<îeôÝ7n,:tÀÀ£Ðw€=·,+. |°;±È3…c…‘ ԇ<ñ3C߁ò¾/âûj7‡VJ_¾×†¶)L/=íÖRea96 Á_¢rXIž$žsZÝ0ѶßöÜȍ -w œ¯Üy^éÑcs\4µp¥Rnjßai’åóž ~¦sGS~2uJY†g‘UÛuk9ˆ]ËJCü¼%÷(e_f™BÉ°¨ßôh ˆ°¹—€Y'JÅCal=‹:^ëvñË\Uölô’5lÁ§dUk·í/ ×à{¤OæÅzBÏîJ+r¥á»Æ‡ê¦‡äôwšÜKü÷!*!™eZÜÂêtij™N@A€è-¢ŽxÔϕ¡8Õ>Ÿ™xxöéB%ü”ý“Û #œô•ßJß/zÚ÷Ûcã²íð˜÷%ð%ô4}eìðo§§}ߪ}wã9°ÃÔvMjÓ3V̔cUšÕÌ$ò³«OFã›ú–ʱÚüD§–UÁž;ð·ðæö3Æ[ì,‚Á•Ž øgë`ѳW^§ƒ­“9º $,)- -{T¦ö ­ѓ[¬øÚÛ-t½ÝBëÒx胇¦Æ@à„NMŠáö ¸]S87­t+ ]Í2<•Ô²þÙÌî"{RÚg ŒHw~[ËûÓÜiJÚÊ3Þk;—Ìò&ë' -r n #KEöF#T’oxVf‰QO`ïÃG›uY€Þg\,mbOìñ²ñx1ww0ùƒó7+æ&oËÙ¢¼\ݤ§ãÑí­Ý«ðÇ£9lYjÿ˟áß%üƒIav”âo¸?^ æ.™ìÜöOô~yêlnåÛÞ+ö¾÷ËOù7^'†ÿüt;[ù—ë-äºÿåѺÒ= XÀ>}zø?ÿ÷¿7þçÿÂï›þïÿþ<¿oèx÷{÷û?ÂúÜþû®ýõaÿ¾`Ovà -ÈÑþÂìËBóúiWÌÀEïÉò·ßÞ÷€ÏV%‰¯Ï‘+âü—ÿÏ $þv‰љÕϙÃ~‡ˆÏ×Q:ö&¥î$t%ÄހU9d¥…gêÿ¼t=ƒ¸8ž¹?¯º.™|}^'›DÐX ê¡ Wͺ€A#yÄbYR0S¾>AÆØZT±rïþÂÊ×ç"®|}þ!Ë×ç ²4íx­Ðòõù·‚œçÎyè7 ,œ·o…‡‡?ô.Ӟے£ßÊàZ÷®=»˜—³·å幕éÏ]«yuûØù~8™Nz…,܊_ CK"7G¢2pZÙVð+-|€àL «Õ¿- b &§*Ï06LʐÖÍÀ2í߂`/NëhFÊ ‡žd ˜êðÜÍ -С¼0q¬ê- !?î¼ÝíEšçÕރy QáÑ¢/²,Sú½ÀÐû -ÐÏ«GÏÓƽˆ§œºÏ8Š ÷ØcÏøͼ]HÛ&:UZÆ@7XmÙ¶6*"ˆ桳*1Mß }¶BLÓw6µð¬é[¯„À¤dXDɆCeÔL îALHîkLI?†íÑǦäÅÈÂfŸA¿ZLÉè}_ä´ËüÆ°Éõʞ‚½. -%íÇBeѶ cþ´ Àˆ˜10q™á=S„{QáDÔß -'¢aNÄC'N'Z¥ÚÙwó -ƒº©Âp¬–‰ÜDäÀsLQ¡¤åC>ñ=¢$XeU…¼Á+Umð -„(%+@j@OÔ½ˆ(ÉݍÉc"XµÃ'*®Q‹|›ªHWˆÃp˜Æb11ÍìÉ.tZå’Úž–‰Ì*4TvH‰ŠH¨ú©†´_Fˆ€èÃ`ˆŒ™hÀ¯ˆÇ݌ˆÇc!X­Ã'â­QÉ/·< |Dċa8Â<âªHƒÜ¢i^!^æbbÚY¹Mfñ1šös“j0Ç¢]€ÚÅ0!c&ÐÛ#Òq'#ÒñHÆêÇ߉tk4ògµp^÷˜t1 (D8üÝæV0Í« -ø´®ÒÞ¯bv LUD»@´ °@»CdÌD~}¼i©›ñx,ü ÖcŽ¾ñÖ¨<5ˆÌþ&Ï*2caÑÜK(^}+YäAd¤ï±ÄH°X` Ïy¡/`öz},.¢R–fiþ:}Ï£_Mæ)|?"Q‘@±¤ž#0æÀןÖPɏĜ˜xã!’ ÅDð‚VL<Èbâ‘ØÆϑ`ǘ añ"˜"¡f"ÐûcâùnÆÄ£¡ðsL˜x«TZ‘c⌇Hb„«˜z$…ÅÔ#YôÂcößcÚ("]¹ñZ¦½;¦õ1& „äáêÀ¤[¥ÑŠðWÙ´¶–?¦Ãæó’TL:¹bґ`Æ’èƨ aõ"˜#¡f*Ðû+»Ö÷³²mý`¶%𶠀°mWèT•ö"êI¦•!ÉED’"Ò±Œ‘Ž%1‚±¬Fˆ‘.ÀébŽQøý騛åh$’ˆ7úNd[¥OU¼‹¨F  D4zš"ª‘lä/‘|FXé{D1‚E a¥qӋ#jQ÷"jÑăöX£ïD­UºT幈Z¢qå|P¸q“œQËKS±Hà" d„”¾GÄbP VÂaV¶oD+ê\D«<°zñ=Òè;Ñj•*U.¢hX$òð~ôbQD+’ž"b‘„ÅOy Œ±úﱈœQÙc¥qӋã}è»Q‹FÀOÑ  køNÔZ¥ËÙîÄOëŸM¼ÿ£úi“þ󏞴ªX²ÁOˍ些øióL°›Ö»’èÿ¾èÿTý}êþÓý‡ÿS³†þé㬾Í?îûŸÎZï u~ÐZ'Í -¸¹›Æ{.W5¼«Æ=¹æ¬Y·q×À£ë7â½\6u4DŒwD‘O.'“ë½9öé:Î -¸…GÇ>YçÓ±à}½:øèº_gܳƒƒ[óí t/ïN ·Î@­ÛgÜÆñc­sý xç>¸æþ©B[8€pdë. ï媣àv‚×y‡VÀmüCöÑ:‚÷óá£ë^¢p ?ŽnÝS„à½|EuTÜJô:'RÚ܍d_PçHðž®$x´Æ™´náN² µÆ¡ÞÃ¥TC½­´®ó5U¡Í½M5»îo‚‚Gûxœà¹uŸSÚØëCZ÷;tÏS Õ¶Ò¸Î%U…6wJA¸Ðš[ -€û8¦ riÝ5U…6uNÁ€ÖÝSÝÃAUC³í’Içª -mÏÕx¯º‡ÿ -Ÿ[ó`U¡}X8¤5/BÛû±j¨¶ã(\wpEÐ6.®HڎŒL‘°ÝÊÍÉԑ±© -mîê -bvdsŠ¤lÑÆÝUCµí4®ñƒEÐ6ž°Hœ®Òx/oX$3Wi¼—G,ÈÑUïå«¡Z3ºJã½f‘ü\%òN³ %W)¼ã,œ«ÞËyVC³fBó -§Øǯ ÌU -ïå[‹¤â*‘÷ò¯E’ò -¯ØÇÇVC·FRr…È{¸ß" ¹Báý\p‘\¡ð~n¸ W¼‡+n^Äâ -q÷ðÒ‘¸BÛ=¾-qBqGªHê!g’E}Í}å¤:XxËAïk@ p%ÚÕldº (ƒäêôPÏ¢v+=Øm–õ•åP)$:7:ƒ -!©«#–~þ\ϧ·»­\[[¿ýÍ·QÝ•úÂNÂUæt¸YSÑg>ŸÄNTÞÏ~;ÑpiäÌ&yÂ_}Œ+|vñ¢øáù‰ÃӈU`5&úxúç¿åP® ¿UÐxô{è_zF© = -=}*"ANT¸n裿žÂ}Æbø`ÀW9– ëám0ž ž.Ò&ª‰$>û‡ñYÀ›Ó½¾þå®S¡'Ü(—=|­°<÷æè RU?úþp?Ïâ‰ON¹Cgã"_xr¾Í<ñyäÊ -Ë@W¯ò5›Úfbõ’Ž­xW¯ó݈WêÝúƼ©7&z4Ñ ESQŸˆOSÍ«!Z‰+³Ï[ԡӏqe¯LV/ÍÍ åhi*sR1ÞOXß:+Ö/SيûQsÜÒ¬^`Fópí´ÞjÑ û$¬ìÕ oU?}§•oø“xl¢¿hEÿ4¥Qc±‘ÔÑßWÜÔ:Këé¿÷£æ¸WéÿU£¡¼˜ín(7ë¸æ}C‰e>s†swâQü/]×*cÄ:,‹ Û›D}‹«hŽ©ô)=,ªË`}El+‡v ŦU¿È,ãL¡¾® ½ý¬"Ћ—/·Þêû ¸pÕ¤)ކ^¨œÒØÌò t±Ry¦ šrÔàõB ½Ô†(`§Z¤¡Má-¡Œ…ôª!&t9˜}ƒÖ.ì ±@r!›0ÄT&×nDf,«£n)¬þà—ÏþöÃãޟzß G³á¸*{’y LyAw’,¾H^dõ/÷˜H°\.àsڎûpƯT Y&Ñ#¦‡X½™1#C"üV@5u÷ô*C¤M;Ãc\8+a:)—ޝP4}‚¶™äJÏ' Þd†¨q܂Õ3Ivô0J}HHzÛÔãě\R–¡E¸(Ía?õCùhZOšWä(¼ä¤^ç©kY¯ñlÀY£ïԵܤíTîú‰hvS¥%K¿>ƳQ™'&ð Q¸2ÍkkÀ-Óx¡Ô} ¥5Sëf–Ô*¿|xõē/†hÈÏ¥O­HÑ`Š«‘æ¡øX]Ë4o ÇÎÕÙ߀sU‚?jyU÷ÒDUõùŠ¥= Öêäóÿ>ƒÀ -u ­ÈG¥}µ ¼/UÎËÂ`¡ðܙe!àL¹ܙÎ7)„ñòªÐ:ØפY†7òdV&‡1Mà+±òI‘Ú“Àœ] .Y€ZqV\˄r‚¯ý,¬œ|A "²lO@ÖÕÒK_™J4¸œÝ[á©|«VϳŽ»€Äv×.WN&™ ×%¨hœã)K„«Xd*uÕ¨1‚Š$,a<¦*IªËø)*Ù?õÅ}Úä3™Òr‚!¶f}ÞºÇÌadÝÚܹðµÖ³g«™?ŒHÚc]Ðãêúš­g±†jˆ U™¿¹ q³õõy4_4K9Ö¥‡ÛL‡ðG¸ ŠÛ+Y˜0¡ ÄId}.ýïš*±ð*MÐ*ÚÍÀ+Ç/y,‹ýò'ü<^9ÓèïY°k@9Ç˜DF°¬_(¼~¯lÀ[ee* ܏,5^À‚Wiœd«Åhpr+•àmEI^‹ ütö 3ZêÜ?#S«¯ipíºpgXeºi 0Þ®Êèû©«?jd_«¢€Jq¡Z•)ƒù³=—RP¥âÐö-°ÿPD(Œ»mÇ®C)p×8E"I \Ö}êtԉUùÛ};¡¯5ßèËÜ­Ä4z50èÜn‹w_eà\Ötx‡ogô턾Ö|£/ó#_€îÍ´BޟÙ+àÄsØóäóGÁýÏeïÉàít6Z”“ÞõhòÛòê÷ÿª¹‘òóØØ  •p©¨½ÕÙà¾ÄçEwу)Üí`"Á$-ÓwØ¢ŸŠœâ£ (Àå˜d$8Ye2÷gÞǘô]*8 9æaC¨¢tBª´pÎ_Ъ3ôh è½ÒAœšmÀFcLÐ5³šºNwO£.³ÏÕ/Èû¨Æ´%Ô¾½ª4lž"¥§CÙpƒ;¿ ÿøåCÔòÜ-•ÜÈؙËeš€‹- -Y!˜R :‘Éþµšx( ób0ÞÓÛ ËFãÃ?t“eRaÜÊUQ1‰ÎQ6vQ®…íÐ΋ÝIŽzV‡tNf¸o5ÍáȹB_|fr(: ܽ&hó%â]|Ÿú{O] õ½ða´ -´£€<2q¾œ»P„‰T N4ìÁr\maZÁ c@ZË 2'bUB—N0eI"Üm½0Áhç aç:…‹¤í6¾ ²p¾{Beô:XÍH騄" ýÆ{Yµª ¶r&O _"õ ©t¢dØwqNTÞ¡Šœìðl*áÞX™ÀÍ&(éb¤§ŽÆL݄…1 ïTL%Ø7À¶â‚©!Ó'µ[D+b+itÌ3(q7~£ßþ:GÙm*ŠBâõ’¹(@®Ó©Â[°UÜâN§Û_Ÿ×ò20>îÉÍÀðYÃϼ'GsÙ‹§¹ôö=¸ZL—˜¯Aºägƒ”¸¶¼Í¯{q7ûÜ^üÍÊ5ÎAÛó8|nËYh Ÿ³’ì^œÎ>WÃëÛÜÒgöáw˜¶¹Çäô}xž[ïûp=·Éöâ{àæ©á|އ÷A6s[îy­küÄÐ5¾›=x &ToIÊÞoÙÃ˳ŠÜ¬#JKÀÔWƏ@v† ­kÀ ÎLÔÂèÑ3'˜¢…º, Ð*~´„4ÌRzŠ©EâÌ”­ƒ¢^¬ŽólË©QC“Œ)à3[Wè Ñ˜Gn•64ê~@P ŒÈºU ¬<^C§¬ô©†Vñê:H«{ -^­¢§í†Ls´ºgÇ*µüä¬ zþÓtò|6š,,Š“G=/þå«?üt‹¿åî·çã¥ý÷ÙÅ¿[õØj‚˜²Ü{4[ί{?&ƒ×å¬÷lv Fû?öܯ§ƒñxôz6¸½ }ÓW–Òz/–“ËÞIOõž/úÖÛ³=þ¦þ«!Ö>³Òú‰Ã1 ¯íC&~Æ®’gKêëʝ^Ëùbtµ v—lTi:XüVZµxòº¤¶~æjð:•£yùàÛ^ߓÛNQ•ØŸ`â.­tf&ê<|…Ïà0pÿWÀÝ!öÓ~S½‡?œ?šÙõ=.ÅÙèÂn«óӗ¶ezþdÕ$؎JÀ?ñ9‡³i»Ë[†óSùŽZ÷Dõ«Zû -ÿ…m¨íœ¹½ÒØoâEnEZéh‘l¤Å'˜ÚÂýfgñå⽝°¯þðà¯“é» ~ƒƒö›‡ã÷óùàüéËo{~²ÇՃ‡ö,~[r£§Ó›Û©] OFc;d|îôz0šô\vž¦¾Íá ðóh>²Ç1"­Aòr1¾i…äÑ`>V0̦oÊ6($þ4~6óÖXø°d˜.^”é=/ñW×ÐS£×ÂJBáƒÇåUï»ÞWè}áBÉ໾¼gåƒÞƒçƒÙ¢v”§ÓÉår´h6Àí¨`ì­(¾6€.Pæ/¨o×WwïßD?ó5÷ɀ“ÎäèûËrÔÅþÑ»mef†¦+$æ.!YFüÛ¼üþm9yvyقðŸšZpr'¹ÆXã4‡!ûÁdÂ]„›Z -ðVÇKróB ‘·5Å\m'Ø£qiϱG1Ä·Ç֋ÆPl”}æû_Ëá:ã~D5•—c`–¥'«3ìRÏ<Ÿ]]ÍËÅ·8/Q|óÃx¼Dmk:뗿B‰%w¸Á¥)DF+QLËÙÛr6^Ê +çþ©wf {òýÕUùƾãÁ«ÑbOþͳåbn5Â(@ìñh~;¼w_¿ýä|ž·˜ûÁÑ퇉ëTcvt¼»ëÓnŸdrž¿Éˆv8ÇÞ}Xg÷u„­Î©ž0RLJÕËÑÍí8V^Ésù‰•Ê -‘FÚÙÞëò¹Ý…‹FÝ3Ü=4€w'}wÒw'}wÒï£Ý}«NèD€F"æ¼}âC¬þèxx{§ÓÙÄòúrt|?|SNzƒ‹™E\Nâ“bû䈾PF:ç]ïŽ_ηl†ÎTyïM•B™ÎzöÁ,)?¹ºÛǼ‡QÄJT}öƒ4 ZÉéØY4TîXý{Àöswpƽn?5±%èMÃE0º­?5ÿ))e﯃ɢl~fBæ¯ÉéÌ|±ëÌüryYÑñ²Ž—ÝKyä ¸Qµ -:n´‘=–v$?•ÓÉlp}S‰“òØ&d*™¸+¬D&³Âg߆lÌÌH¸£)8á×Ò2…xi™©©IÉ‹¥Ý…L’fWۗ™ÌS‰éÖ")0ÓʄWÆ£ €Pª"ÝB(q_ •¦)Ü¢aה1™ÈýRR–@¨†L€YŸ¶Pê#ßGeyŠë¦¯%^âM£˜ñ ˨D‡ØF·JbÝK -å™R¹À ¤Ȩì€%˜ ²Q³…2úc’å“ ïn{ªÔ(Œš6 -/ô†*Žã÷•[q–îYª3ä÷»)·Pú“.ÀO,¸Ø:ÑåÞ. “ª¼€E¢%PýÖtç\Š)²Ô]†© `ß楓õґ¦[;­×ŽÖy'Ÿ„ˆp·p )ÔaÇrÂÎNµqÝdǽn>˲é,g¢þü/VAîò :cÞÇqLàrªÍ‚€ì×‡cLˆÒ2íõÚ=QXy´¯ŠäË˂HDZ ÂœÒÉæE‘éãcû¹U¨S Ö{n¾y6^ÃPN¯gӛã䓇‚¶=/t‡¹}Ãc›Mïõ\ÊÛÑd^Ž?,Ö²š±Û{ð·Éh8½,[^¾hQ‚qK¼DjQành/?xúìâß_؟ÿÔ[ЮÙyçhÂmOø#b-rU<œ¼ÌÆ{/`Mʹs`?ÙyÂ5仢ðøãòÖîäù³Iþöó`6 -5Ž+½(Çؘ¯¦•ßè=°rïê1óÏ'ìÕ§Dóð×"}nÕã î²ZgV&Ã& -cRÁô ú¨7ׯ~ضáLžåûm·Ïh_t»×`C¶öõG A|~5¸ìqðz› D*iòï“Å-ÒBӞ¹n¥ÌáŸ^Í-¶Ow˜ío·Ü²‚U*óôX ÙŸåȐè×ü,GÆq&8´WÅ P¹¬+Tž$ÛK•»²Ýǘí WÊËw‹èÓ-"Åܽ\Cæn²¶ŽhþUþÙ¦ÿ‹7½^—–³L@ü,ÿr oGhê,è;ì_Ì+”Køþt<}÷QôÉê>ú_Jeûè”ãÉe՚t1^zµ -’By;~» ·º -åCLðóáØõŒ¯cXÎËç/ÏQEJ* Ü÷¾ÿõv`™ê£òj:+{?[ ü€4…ƒáÉãÁëùðJÓuñ¿¾Ï|øñlzÛ{y=¸üxŒ¸ºyšæ{f5œÏoeóÝõtö›cÊlê¸ÌÞT½-g‹*7¼Œ˜?v̽cÿ›å­»~.ÿ±³bN¯bÅ9ý(ž¶Ú!‹ÞÆ¢:XôûÉeTtw!Óçƒqiw Æó‹æýþæߞæórvc÷X9ùÇ·H_~ÒUøêχuT‚Ô¤ßÿƒ~n±e€w¼ØÍΘë+|}óâé£Þ‹é‚_‘¤nùÄR#tÞ#͕›?-ÇÜ>•YŠɠ܆†³ßÿkÂ-È -wZ_H£\’F)4-5¾BÁÍÚ]`}Íða1–îìE†]zÌÒRëéŸen1«4šÈ̶V8éiž¹Dã$nP0¾âÎVQZØÓ?I%æ~~¤á*oÆ]šˆ¤iæ¸aŽ×£cN—Ò!0oŽY?gãhOpK “â& -|V S`ª.Dî8¾²ç®©"/0š† -skǀ` Q8^RØêO¬\Ì©Tnwd:A̹Nìg<]RàáàRtfûs§rpá¹1Ke%6œ½T[6‡«²Û”ìîaÀ©åšX™=Xº(D¢Š2—„hÑ;2Û]!q£Zꃱ~Çڍ‘¹R8"ë,sÌ3³‡Yêvi&pߦVžD&©Ç‚6]âã’b¤±BFM[Í»…PŠÿcdòH̯w­>PAö—ÑÍ „¶ìDâV~6^.˲ÁãÜ4 üÑ5"{9µ/˜5@ånDôt:¾tQ4;QqS‡lsP{„ƒ×]KÿÔ¶+VŸóméxüæél°œ/–W`‘½ç¯[*fî@Ž“Ò8†¦)rx«yy†]|.8D;Qó8=,> «:’4ÒB;V§\¼å È6ŒU­p‡ÿ“Ð"‹ÞfÂq‘•áe¬ê§¶=¨1Tϲ8×=E½Zýàñf¸™AGÈ"Vlù9Š.FOI–!>iÏt<,5ÿ¿"À¿À%/³ò…ÆãØTaâIf¼|A[ý@¸%r`T¹ì¿;HËÌq¼:Ë{µÇ’q§ºm2Â¥•ãÒlF­—VµD^-­b˜:!ËξSf2êØêBš¹3%—,ð/{t¥ØC²_†ŒòêvÎÿ§Å’h”0à8°ÿ+צpW?…ëÏ -òYêU.êÑê–5Ô³`iËXܯª–(i˜jûo؂//®³‹xú%nY¾¦$PR±"A¿¨H©bI_F¦=E’Œ, ¸aP¬ò²@F†tHyé8¡ ł,’ÚìPK–T©ò–’Ê´15ʴ뉛Ö¦Wz,®óA!µ¢9,Æ¥â®Ø½š¹œ%3Hït⩻ԝr=«=‘¸z³°Í¤åšÌœ€ Dš¥^x¤´ÑHÌ%úäEXr‚ð=ìolekwƒÐÙh¾¨Ú"×-çۃ¾ª«T³–\òUÈÇû*¾¤hݦèz´çýH"‰ïPTÿäz?/®Æ¿ÿ§Æùô­»ïÕà⬴-Êû)@Ë_å j?™¾YÎø|zû·Ûz,൸œ¾›0àQ ±+Wåøòè8*Z'•‡ŸÑ³ƒÅòfŽMéé'£1ëÅK$ÔË¥m>ñ·Y]Žo³^iõýhòf°¼š¿¼v¿?öRœ¼zøòÕ÷ðmóÕñÐã%T]ývíÒBO®-¤÷‹çñt¸´³¼°ýà}‹5|]¹ûñÁ/?žý4½,7üü]ï›_oÆÛàÄ.¸Ùèb¹à»<œÍŸÍGzKÔÎ -‚Vê*'¾¹øégøgî¬üæÿÌÏßfóçqÛ·ƒñ’Ãó !˜Ê·ó½™W¿=©&ÓIلJã©]ñ—ÈDMÿx¼M.m‡E“AÚ5ó²\ü„£i0иùÇ\N±(ÍH1‚kcíŒ&3}ç ¡=SøÓÛælÚƂ‡q­‚8½9ö÷I—èŸæðôÂj÷aó•ú9öÍK¸ä°ús¿¶òüêݬï#àäs¸ûÞ֢̽ŸçÇ -mö»Ñ%¤76˜wßò ¸·bçȬùúºwá¦1¶“¤;÷¾Ñ¸ÞȐ4X¤Ú9ª_›1 Ç©mÏÅta勳òjñl6²êl£á­?t0¢òȗÓålX>‚ðÝÐ%ìwý¸)ƒK+d}„ÎܙÿçÒ[J­¹¨5‚8êôѸ,/a-þ!§ìÜÓÙôöᬸñºcuOfàÆÿóéh²À}ób9.g•2ˆ1ûGŠµƒûŸX|â\püjÒw¤mòIñüá >>dïþ ½xQŽ_M_¸¸=ŸÎGÐyüYr§’æ‰UFñÃüálq1Ì.—Wƒå¸ªÓdP$$Qu•’ŠÏˆÛÁåe ™{Ñ –\¯Âæ·ÓÅ*l0ɈÛ]ގúÄ·)@yêCs]ÿ~è=\.¦½ƒù¢œ~+W±>üÁÏ´¢zo&Óá›érÑ{=›.o··ͧãÁ¢ì]@,¥ëWZ½ÛÁm9ëÍG7ËqHùûš <{¶ãS까,fƒÉüv`7Üð½í×èÒâãq©e¾[OÚÞ-·}=+yWïlìlú R•+nJ–×ÓÁäí`þ2KT¦òù¬œ—³·eÌÛ½ï/G‹ÁÅhLÊÓr<þþ×E…‰c÷7?‚Qí8;/ƒÑ7‡ŠH:5ù«ém¥ÿ€«š£x„rOKšY,€ª–ZJf…iHI8åZ2œY?L.Ë__–Ãéä²åCOF³ù®áBÙ2c›žã!}èD3¢½ç™1¬Os–‰†Óì‘šYŽyPÒ»bæqKܼ^·àbâã.0ÁÊ3ä 'oí[-;¼Ø.ë8]üÌp<ºµüŒl¿ZþùÚ²y˜™HrcE©uÃAU”YŽÿ2XXÞs6ÆÀç±`Ck;²röÃãJÛø÷W`ë‚WWºŸô“HV|óð‡'Ëñ˜¸žÏ«±¿G•Yšmc0O£Cg+'zT’Õ¶}Á‡S8j>» á£ÍÖÆOÃ2TÎÙÖàZë|cW~•ï,5­»ˆ–QóM›•„ÉtG6‘sgÛ&äĆUrÊ 8_ E¦U°™+Å«ÃäE.¶´}TџM¯Fãò¯åû­x©=DçëŠV¥Ù߯­F¾Ž2ˆÝ•Ö/—v±>™Úãøp¸ðÄwÐ>dS®kٖ¡7göÜ&Åù‡Çt¬ýۏååhyÉöÿˆÎ8X=«ÍnS6ªT_`5Õý4^Fˆñ$‚S/¼¨HkmŸùÕórãZ«4{Y,Ã`§Ð<øÙ /V…—JÛg«Ñnb‰Þ÷Ï_¶ ´ÞE.‡³!½\ãÝ«¶Û@1ר!É<ÆUš‰Ø01™1³7š Dæ ZY¯f)Z?Þÿ>½èßZEsfÎՎ­µƒWÆãÍæoF·v oV˜Äj»Y Õ*KèâlGÓát<ŠE’¿úÙÚ ‹ž‰¼Þæÿ—éÅ“«i/kwQøqj9è?¶†["ꪡq­ûóŸél}8 -&äÁsþÈRÛä¡ÛËûóxÒ¼_·—ÍÑ»ˆ‰ðHÝz¸½ùv[:|èØ+LŸËS®69ø675¬¸òŠ~¶ãèÆnªþ؊#$Yô‹S2ô˜ÜìD=‹:’'¦oÒííß‡¦âñr6¼î½š•£ Ëi-¥F“Ö{Ø6C€lRáÆë/®’ss« --· ›Æ²çt«íÖ6CÛìvsYÎG¯'±ùWnãÞYµ'¶D¦IÃÁüb´¸Ü6çxՉYûxÖ¿ ’é¦&Ãéê~€1ۀ )F–׉×g²¶ùì²o…mHºhº©å•=­¹B Ê«µÍn½/dëÂÀ¿îo_Œ¾ŎEbåj³9ètŒmg÷;F:ގ‡ï·°1×h8Y3á­6ZX©<ögl¥²ñà¶9|Ãm¸}}ó¦_NÀÔ³•]C³9WÙ¹–±½ãïÑfiòÝ ¨ŒCkÀêX"´µ„·FUßù P¢v5Φ·»Ú€œ5²2Ä®v`ãê@Û÷Š{/¨œƒÙšE°~–GƇRƒÖ‹x\»LJRýyÍ¡ÜÉ|¥' Z‡ž4h÷¤ng]MýËñŽèÝή¦“­ìÚÍ­ÒɖŒºÙšÛásK­Ð2ï_Œ@šÜ6éóþ¤|=ˆ<âZ ×4ë í¹4فm,†¨þ³©¦~1ÌûóëçËmԂVåì\7ë ™êìDþI&‰þ_ßîÐo¬Tˎuâ¨m -]ÅkU׈œVÛ÷Û4ô¨åtq½SCwâjݞÙufT“œ½Ò¾–VÐ/çåãé ¡õŠýCz2Víc³ Îùç£_Ëñór¥ábB¾gûzJeŸ¡rœ‹Ø1àž:cÒÙ{ -Ã֞ª¾ËZ¿Ì=Öàmû(xª­ùB&ƒÝm®§ïþ2º\·Ž«ï¾LøÝmƒ‰j,žÄ•ê>†ýÅRF?üäœVؖMÓ M_Í··»Z -h‰Þ„GA´ÛÐl˦Ãm]ÐÝh«}ŽÚ>Ì//ÀÓȦƒQ9ïÙcç²g×](jùÎ|QZRO^—“ÞE9ºé½¼Å8ºÙ¤g,g½x"[Ž.µyϾåäñô Îo -,¾+'—ÅK‹Ü¾`^ö¾Qÿ±gç_{Ïüö÷ÿ„ÝÑ$~IÏÎ.Âàõ7vžŸ.–¾ž nnzïìÓ¿õ{ú½&Qß·½†lrL5½ùýÿ@ÖïÄá€ÿÛ^½þý¿Æ‹Ñë’zi;4ÿí]9|ƒ \W–“‹ò=G جº%a_?œnw±ÍÊü½Ø!߆EäÄÀ‡³m*$µþÿ»û®ìÖufÍ÷³–æ°%Ëʁ¤rŽT–eåd+˒­|ÿû¿ô zýÒéÑô03ERTØ}{õÚgùH"ˆ -…BU¡> 6_ÂDHEgBЌ$__/ÞPt’˜¢ï@¯ä•ý$¦hã°úá·X†ˆÍŒ¨ªnm‰sO$íÎÛr;dÛE¥‹ÁœŠß½ÇÕÎûv³bƒÒ-ÓÚòöw;…ðt°Ôýë—Âc].J§WzÞ쁹u@bSã•a·š«á1ÝþüïT„r xyñúΨ¤UÀª>öˀÞÿ×ö°N^3˜7ÁÒùoÞ$½+®ìâ¨Ïï“ö,ÊýÎђîâŠM SD6…‘‹á¹Ë¼ÉáVì)l-×Î< F'&[Ö}åÙ4b>«I½¼Ça76#‚Újä-öÞkCǓ>ë9åíö!W™ -vÅ¿*xÊ7 -žæÁR{Z-V¬}›¨_…„,N5‚Ñ®\»·ª‰"3\*TbbzØNÆ'`=Ì÷é#nÑSî¨H%\ôô¦¾XN˜&x®Šv¼QäÝ«ÕÚ¼ˆTŒo“ˆ3I®éiiM§¸*ri ( D )uýG¼nçȉlˆÂïòö4ų  †ËÀ¼l|&¿ãÕæ¨BM‰V7Ûd¨˜ñ¦h¯Q;ÉÐãåè©×ìþ÷›ê}hžÙ ,”±:7Mü†`å»Ow^Ùg›¨íù-ÊRRÞCÀkNg¨Å*Åú¨Œ'œ\1^p¢žÊçýžôö=uÇ*†¾5܎C㎭à2TìÉø!ûó\þj ­ÍdL­ÆŽ£ÞÛ̑ޗ`¼™–ݱ`éÃXŽÎS_†$ÊþWÜí~Á°cú;½´aúxhà°ÄöÝ1~,N@&*iL©Â)¹ÌUKñ°{^O­"ÑiÚá0./h•f]@Зμ}½ì)ýý™t÷ì¶Ä϶tLäë§/kÔûrΤÝúvò{cl2éV˜HÖ¦÷¾Vµÿ‘h¤-yªürÁÏxxùŒŽkÚözΘ²³ ƒø•qO/>Û¾ä&¾éɯSêË×ÃÒS¼´‡cÆ6Uhô15X¶à“aŸÎÏòÚ¤Ýÿ­OÔí/¿T#:ãِ |›¬Sr꩚R_îa(œxu¬É7ÛÈO›™Ôül‰¶ -/_¡ét¼†ŸVVrQú¢Hã˜sì;¬ô£àjP˜%7¯1£ý`ý8'JuÃvÀ¾\€Œ7ÔúŒ'~§Æk¤rú~>"+ŸÏy\¸‡i·®ƒ8[å4]8¶ç|ƹ¯íÂfÁUÊ9ƒŒ—#&»mžÜøÞ¨>tK¯ñT>üÒ&m¹&à¦H –š»Ñom2=Dì:&æöö¼ßÓD#ýmM/œÅ=9õIï¤Y ¼¿vš‰J*ùž^ÔWûøþ3¸d’încH1´çõÈ!nm%ݝD%“þnS«o¯3´øy]fR xù|µÙ–#è¯ïŠ‰JÉR̤ͳ"ņ×Ô€"pÚ9ªÖXk¼§ºõúÇñPã¤K4 -§óeçDÌåq‚ŒÎAËTU3¨’‚ÉÐdoöº$FáXË|Ä]H£p& dÄb³&·x¼„Ìå.3”øľŽgÄ'Ø>« -¥lbXÀ‘Ü„­»Ð(cZ ,Üèfý LµDÈ﹘gL†9õå­­Ikɑáä̃î)›:9ƒ‚³ëÇ:÷bN-¿È£/4m־яÃ{nÓT®Ë’vÛ$ 5,õ¼˜dòÌ -”M4N–ºk©ö¢¢¼rÙ®o&I`DÖ]¾ŸÓ{Æü¾ eҞafGðì3®k _ÓE†L{|I¯½ÒBºÇçZ6D5íí,ÉïÓì'¹ùmm¯ŽÔQ´²ìHÛöÈì¾~¢¶ø2‚×> I¯µôE«NszaÌyA{·_”J$[£Ñ…âgՉ/#¨ïGé‰û«h¾NÂr†D­Ñßø¿7ö0ÒnܺÉp¶,œ\›v«L8‹›xª¾W³Œùlk OuãØäLš"û6·òˆžB6|KÐÀyý¢€d å  ¿§/ž$~ÞôõQ!E? $Fñp.åEF- J†$Þ;õsÃÍ=E…¡N¿üÄÓ 2þDµU±Jê×ç+Ž_°Âºʦ]ü™%±">K`…n$@}¢˜c5ðiÌ<€ŸàH½„~.œ: "| ê0u¢¼—¨¯ø8Î|…d¸zê5øÀx§ÿàß)T„"óf -€—èvôc‚ÚÂUAKúQþSÓÒÿ!™nÂæðªš%)2\w™RT•ëYú¢m\˩Ρn¯æd~·§/3¦Ÿ²LC´hêˆ_¨^†û…S%L½YX÷üŠPåfo…aè5ÇD¿Ð3¾A2tEã$¿ÏøŽä—çF„eÅ>V"„cΓ†i4ƒ:ñ›FõbH{Ú#xÂ&Ò" ¶mtsø<¿`8Õ: ¥þâ+‚Ɔs®7‰ª -}ex­HF<=(>°¢½±¿Ñdm–!ƒZ‚ÑgfxÀÍ®mHZØÚhN ¹I*H‚˜^W"‚¯ˆ °±‡™Þ°º”œ£œÎ[ž”°¯Á&–f‡:7o)2REù¬ðUê7‘àƒÆ–æé3¤Kž`ÅSõ4‰6â ä&¯0ê ˜¼¬@KµòšðrdXF"}À©]FðÈ N3Ò -ôChkZVñ77ÎÀ¿Xüu)ø«ò²”•»ÁŒÖâøÂ擠Ÿ1+ìz@ØIéu¼ýÒ\¦Vƒaœœ®÷jÍäÙ.žÓ»¼Å·q¬m7ʒ^ÚÍ1ÊÖ|ϛ?¸ÅTàça/ñ–ÑH}k½t±¸Oò»”εßt%^&ÀûÁ/ÈX‘Ë|Ã6ð}”Ùr¨§N¹à֎œÚΤ×FØy.+žœ,Ós ™ã™rÂ9À1¡­¾…×]¾ÅübèX6™íBªPAÇ ^³oåÚG6ÌOóˆ Gp³St»G„ ¨[¢›="huÂþQ»Àó¬9ÏÈ¿qrô84_×´9Ö)$‘å,d]•Ð›¡ÌÁç;4"oIÚ_phϸq¹èx“^# `ž$«ñ¾%Y}ýh¸÷ŽU<%mñƒ®ËXÌ67 TW8V¶Ù/X®j™ÌЬý‚ÝuÅÓÁo¼]µ‚_Öú -,ˆo$î<]}BÉÙӅƒe$Z €FkÉ(U”É‚Úrj¦1áMè%Q0á"}9“]\ü“›ÉRӘ×8º]¤VǕ7½°÷-FîS¨>AHUE”WoU sf»ðlª¸AE‚¸_û–1wßO‰bŸ±:R|›¥g?#…&]zaŒaéTî…b©}«:¨@µfµ#žà|d˜Ó¬Ê½;“G õÖ9[$øÖô’ÃÁkŸ -¦,µñ}r`b—°/Vú€öê_3y¸-ɉ³·Z6H÷Qè€^ÂKK Uå][Ì®¨/ì"çä 2‹%uÏÂLN­ØGÂm -T6lû)û€¦ïz‰‡cMC:ÿ³ê'=­Ž#Qµ¼/µ†5“}Í~ú’k|v@Ö œž”C-0g:ß/Y RC¥€®×¥šïoôõÌðÅÐM/˒¿Þ–.˜Ì&Îä¡m‹åëΛÕ1  -ôõ/¾ÙDSuƒeµv$­ÞÁñÚ “ƒxK:±¤K`˜—Z穀©%= ‡{@‰€Q‹åûÙ0]»ä¢xqù{±®ŒÕ2°õl‰Lº›³HuNPÎc }nû\f‘”jY|oÓPETQh>0¯QgoéE`ä${ó“AÄÒÀ÷ÁضÀ ›Ø~U,"y¶F¿|pÍ͊åybx]RRX'ÈF¨!{r˜^TEJeЍ͡e-•ø\fRñe-§àùDÀ¹NˆJÑE–ïx«‘gÂé¯9@/¿èâÁö|÷ïC^ˆT@†$Ì4d@–Þ¿Dݕí+eÿq-µ„³›ò5êËæâû^¨ËÒгò·ª@F¾ ñÖ¢qæUõÎiGmfß¾×<Ëüixu™ß½%ÄÎÛ}‚(%Àb(ØXäŒç×|0bØMô4Gr•s:78Ó¶I† ›õ¯M ‘Ý}ò§õ\ -MUV´u/¹á& ñܯÀ€k8ÑzÓ8[üð¦bþø9ʾf´ÅøáepJ/¶‡„ÜÀ:º4ÃM§N&µˆ¹.§Ñ§Ƅ  4½2úÎ÷ -#<ë¯t6ú:vGÀKE„§­Þ‘­7”1ågmè€~@mÑIÏÃèHœ­b…鲘Ì~Ï!Ô–RöÍ<éÞxlGw/üIÉXGàÓÌÉ«;ÚzÞhÓM&<öbª \LAídˆ”4©EJ—)ý’SÏ/ mw˜%øeLøêå ‡î{b›X\¨H°¾èG@¸¬ÃŒ*l,[]ýD£aÐ -¦lr{ûWF§ f»)€Àœnü&0"–©ùaä´{ð¤ã¹Ýž)lÛBƒÏKIU¶ß ½MdwX#…^A°Àµè3¹ñÅõÈÝ w[½pÛÃg9CýQ ÚáÛa~À¢œ3cÉÍf7;ûìb·¾™õ|BN°°‘oiÓUz©‰Íx7L^àN–¨mK§´­²Ÿ1VÔúÌ.·è 2Ðä §:ï'ðx´‡ é¯åD«ŒoŸ«•OZü ÀËÿö -í$‘iPJœtˆ$‡¿Þ°ÖF¨MZ+F+àáÀ.µ˜0å¢e0)‹z@:ãP$ÝFLÛdÌ|+]\[]a‚ ½O½‘µÊD½§0Q—"¦ª¹ ƒ)Àys®^‚aÚæeJe†§hMï&îë,Ʉ?{<Á]z{ÆT°·Rxóçš ? ×53ŸttÿCۘ±é\ ÐPžþÉnÉ[)îUÇ9` n±Ðâd+ϘO¡-9õš=ɲټòýæ«V. ™ÆA9cR­ï‘ö®™t·]vž¬¶e¢‘>Z¼ûâ8n´ ¸`a\H­Å M‚ëHúsÕ}AÞëù²¡Xƒ~äêpUS_ñ™=ß¤Ú"[#ª/S1éO¼÷l[ÔZÒaS+è«zÈIƒôpjR@ºŠÜ …»™ˆJ/€b0(±é~¨Ó˜ M¾m‰ß˜ö=32}pR|¤ ÚÆk ]ùpÊWr5o°Óœ€ÞÌ3´ ŽÖl -@3¨þÃ.ÌOó_>U¥DyC+Y¶À´ÚÀ\jÉi4g‡š†>Ð$ûúÀ²} ËÁ¨¾c€Â_Ólå‹jX¼!úSA0Ÿ#D l ¼Jžwz¿/Ք˜m's„—jmËñdO<ØRÅǎñëà%G^CËIey®~כãÉ1åëgúßÿó¿ÿ¯ÿ¡œ4I¿vœ‡½x™ÿ]ÿ—ôñ—¼¶êãÿ˜—Ï›Ój·™'.eºluHÃ^¾(ºÑR£®úƒGæ¡æ”kÉÿI:kÒõŒ|ÖXkâĜֲÝû:¹à'®]ìƒ*û =¹bSVÙuî¥Cÿ(Ê>%¬‘š÷Kk²ÍZ{é?­ÈZ»ÓèÓZ§ŽºÖüÖÝjÍ®ìÃU -h­Ñ¬Öà>ºôUDß«Œ¢XnTˆÁÖù)«y~HžIk¹ÔNóÚ:ó4½v8ž\`ÔÈF þk'絸ó¸ ?ßˁt/û -Åp¿#iþ1ÔSŸùMšì¬c^¿mÊ\¥©ÞÐ9߁ý3î{­íë;»z8œõa7ëZSîhƒ_»tç"»W®sѝ9¼-/üÐÝג‚S]ÚScSß]”ÎSGæ·A˜]=63à¨#Žñ‡ãÒHûÏ4_‰c™©×ŸuµC/ ð5»ïvӐ ÝûÒñp{‡ÏÐ{sºë&þ` ªYüÃÝù*Ù$©~.“9Yª0—øvj9ÂBª“ÃÀimKS}Kš_š»MIŠêñeàMrTa^@8­ú~[ÒTÝæŽ54­”¥¨Σ Éò֎¤¨¢ø Ët×û¢÷‡ªÝ,ÓHV%ûªË삯•U¹†¨2"ÂXöe[’¥j,”Üe97S¢©šET0Bº¶ëÕs2‚7Ýۋ¡ ê£4Õw£Q4´î†/»ATÁ¬šBªŸ‡ÏÖ¤†¨"I TpèiΖNIª{ãM–ªÏ¹¨¥¨2‡CXk>ƒÖ£Twþw߀ã ªGc´‹ËPõ|™ÉyQ…ûpâîºÍŸÖpè§&IU—{^öÞsYŠ*–)V“RT4´¯¿'&Ídwwˆe¶†4Õ¬>b(Í¿š’T³U QEÊæ‚É9ƒ]ëø¢¨’ë ŸjXg>ã6ÄaËÕÜðdz·ì0@Õ·ã¨2ª+åß>éîví&‘û<GOšª»—ÄJ?UŸ4Õ¼îì/u§~8=…„)ª•Í<'KµèØïl2TûV¬^ڟET!ŠpÑ5(e21­$ÕF~•—¥Z/{#9ªi¬… ŒdwKö—Ælh IRm "GYª-Ó|¸QEdhÂe¬m%e¨’ÖvÜHIRíÙYªßºF)I-kRÝýðbŸã‘Ušê[sµ¾¾Ù$©¡ˆ*E†&¼ÇLK9ªelD–ÒÒT3M\×9UóRT‡7;tRh—Y4y¬ 風Žu§¬`òhƒ‡³+…Aª¶ ª•ˆi? ;q@5r@Tá²Æ¶·]Mu°ˆ¨¾.ú:jy'’]Е‹0ëξ8W‘‰Ì%yôWƒï¥ÐÆÈ»ZS $´Óø„=_ÐÚJSuw;òTu™™S–*r£€+ÄSú|ªÀê®ÐXŽêHjÖÚi3ƒá…#Œ|–ªKÄd脪ٍ€Ã:Ÿª»®ç¨Âõæ<¼î -©"ß@†ª÷úÒTÝ]Þ¸Òæ ^ÀäB–*ò d©Bß`&E­žîî\¶»`á®vä©BCC–ÃÐÊòì4qw«Cû´ÑôÑ'Z܃*˅(;ízQ÷GI]9ó;UŽÒDÉËSLŒ7‰3gà’û).˜ƒŒ;JÏ0Ìåæ~·5qû§Ï÷é) -²v'–Ya5^Ä.únØÂBS½G3ˆG¿ày}Eà¶ùÖ1¨Thu‚¥¡{˜A¥DÁªh Û|_ ¯ôŸq‡gMÓ16fƒÂý4N~³\‡y(Øè(ùJÿ±•·ƒ(«^}r˜ðÏú¤ókž~…€XÆ°¼À’j*Åq›l¤úC³— - V)OÚpVÁxô‡î!ò½%{ø®•ê!$#è$úS“FÞº|m ‡g Óvߎ–4q'‘h±#-Ã/Õc²ÂÞÜÆ/…Úl²UA¸.ö|™Ïvwjå‹.Žiù¸®{÷eYÏ臹)³žaš¿„Zȱ½ÐB]ÛN@í¿`p™ë#BŽdyu°h!³ɦìôìÚNÊ-Bªý¡Ù'µ=ÙG~´´RJ\qzR®Dçbx±tSçP¸[$]û‹ -vców‡ÚŠdsöý‡ë—PÒý2Pý’Ö©›×mµ]’U6@‚„k†KZܳEƒÈ UډC™ƒðf(¿pcóSӉ$G(Д#YÛ䨢6¹ªv¢¨úß]LÀ ±W!ʳè 9åtx6#°lcU¢IF6Æâóœ,Š†”6 £ -ÿÐͧ"ؗz(\½bKšè61 £Ú*Û6l‘rôeºY©JYg¢aºFîýÅ°¬ýeÍ«V A×éåVª+Ö¤P"³bË.S€Ì­ƒ<Ëâc½1w“Q%«Öí5~E&&m"’½@Avõd[tÝփmz‘m§Ô #`éZ¯hm¼\óøÃxÅÖ»a ±ùxØd6½žPÛ÷¼¥Ü0J UÖ&\`ni˜`³˜ªmaÜwžÄ4ÖÚ{ -ÓASïyLi·›™FG˜˜Í)ºy·D²3ÕGò–3×Xfÿ´h™9Œ -¶®ôšƒÛ39eÆ·¾% Ð¥µîYÓ37QŠ·¸Óf™Ñ\æ\úP±„¸Ã:ì·3èÏ°ÆYb ªã r½áԃì¼Q3TÃ+^ ×ƀ’lÌ} ª%„Ø꼋-WÓž'ÜK¯Y§è­€êG´·)È_âÇlì¨Y\(´è;ôÁ˜TOA&üuÚçñW2"§Iä&Êw^ÖÑüózS³@›N/·«¾¤qs/ÿ4UðGªà¦¸€lOV£2סe£’ñœ¡.òÁ7ó…ÑÁ˜)}Â-ÉïÌzxü"8Á¬7W<#×xDُ½ -)E‹ôu~©œì²nëFA~Ý8Ùü¢ ú ‡h¦S«çOA8Ùeœó«±(—>¨Ó© -¦(~ - -® R W"˜éˆÂµ`Êõ@.èNM(N ïˆ¨ü\±V£¬"B/’«’KØc‰ -€L (½PÝ%ñ*+$¢’,âz`¨ -g¡‚¿#HÈ@Þxn —ÈÄv -²± æ”¨ $!4³cÁ÷“ÈÌvŚ¯’ñGT=­¡¯XÚ §wÅ;clœFµW–y+YȾ¢h]P·.»"g%?0ob͈ùAqßÑjÈì{ÞƆöºV¸Jv ‘Q’x(AîGUA‘"#\ïãhå2†Ò¢ÅOÆ̅ ®|W×%ÆÌeì4áâg¤_Œ¼M]ð)~3ý\ïµäì‡:õ‡w7PÜ^´üIm¯ª oÁÚ$¢´R!Zžã!¥µ©…JÎüQ‘…#g6ÉÖ"Ø)¼^‘åÎæðwØQEÖ§ôË&ªE ¡o©È~ÓBÈå§I×æx`Yåí2Ò¶€ùÒíì4ž¶=Ñ¡ì4¡gv÷ò&³k¤¸S(Ë͙pÞd˜" }éÇsÚ ¸6³H»ß‚Û›´›|0¥Ó|†vk]n}«¶ï%kSÔn¸À5íÖÚީ݄Ós~\»Öp__¬”îÒ— ך#å@©Q'כãxÂ..ªH8ƒ[7_[kÉ™H˜pЬ -~6Ò)e¸pV'3e Sd猁ßÔ †ªŒ®x–—ÝÈVi±uZR—¼¿Mé¶nÒ¸´Uº­Û*.gu -´Z§[ÖlA#'L˜’W6W+RaøËւVO¶¢G³*¨Z$Ün©ü«]ËÀ»´×e¶"¨Ú rs‹#eÙd­âõq¬+©ðy®ûޝ6Zu -¡ ¦"øEé4ë#¨M¥õ=r k{Øú‡›ªâàÌ}ËÚXW~β*Rc×^oÎ3’“PEj"{ȍºV®b}T^9eƒë쏬‹cÐdãGŽLÐt£“!“h˜-éŸDS›¿z -R³¸Ô9û4LÞep“šžW¶ð€/qg[bÕöÀ<5L4ÉUdw+0Í«v4Õ)ë2m©wgeÔt‡ -tµd"{¢6IŠ#Ð*æ™h¥"’®]´L]$c¨ˆCË®T]%7N:5N).Úö%Á¾m’A¦-RŽ+ΓÚl,X•ä>«lnÙþµ©–eLëê ·Ør‰Ž.%Ðïªc˜2Ó~rTÊô­@[€“ ÍRŒ&ËO2þ"½ãO/x¨Mf()Õô8 Ü^´ò•Ý´ÆÃôËìLfúø ӈ¾“", ó8Ÿ2–O#Zº ׌åƒÛDOó)cù™çÀù”±|tñn8Ÿ2–’y -œO˧¹€.Þ çSÆòià 0πóIP­Š ‹Ï€ó)—CdžçSÆò à|—(>–³Ó®Âù„ Ð -<‰ š+™÷ò`¤ýMm’ƒf]Ë/oU¶Ö¼Ð“¾;ñ¶ŸÆâ6Ý ~7ޔ¿®°SØO R÷³êæs™Ê&pÊ@iªRþ„;… -µ]ËòºÚCÚ¸UâSÝC)ÍՌ*WÅm’EE@4à•@—B›Äà=:¤z~OÚ\´‘ö¤ïƒqUÄ~¹l~ £äRLÈçlðQipòáðèÜNjlçø颳0µ÷6ý5!Îj=c6©O÷:Ö %S5o½jXL¡:D¥Š [¢n -ì4Q¬ME¬Á6aD% CŠ Œ{7½fY…¥îŒFy²x4ÿ隍q ¦pp¾ð"œ¼Yñ&¡$¦ÐqÉcäæ² y3[:xŸUʼ¯ÔD˜Qå1T‘y¯Sxå0ÍM˜BQÔS½D0LÖvásKÃ.v<ªíú1·Ô&¿÷qӈç1Íõ ӄñbêÀKAÕ2Çò9@™*37' %Íy´ÞÜ -ݻв0ºG#ÄDó¿:ϗ9ePè^ñO±+󜳫¥*@dN1Ã#u 0¦xŽ “£µwç(Im¬(8E²`»+óV󏎨DȱmE\CìZTìÁ.¹e»Äd© -0%)}#u?Ë“2×)[€³0e,¦78ľπRÀêI* yXÖ¥Ýq¯öW1÷¹‰OihyV©ž·ÊP±‹ä¤ûY%Úȁ†û©‘ƒë=™6iÄ8éü­Ñ¥6±"¥rYS`•ªèÍõ”x5ð<…6]œ29‰£7õŒèÍ<0ãát1—>hÒ+Goø;…Ê^Eá‘è8.ðSx8z:ç6)¤Œ¨ÇÃݽÑHA 燣7 ÇÛOEÕoà -ªÞÈï@¬ @H=:p.k÷„$ iç¥!½+"CúJ®ºCº¨"u^s!¬¾^SWý&lçŠ5}Ƈ#@4Îï2KW´H«ÂÙoOûXoŠ*“!®BüÉoí6ˆß-W&BüÔ Z•!~Ü¢Çetݛvq~òçkñZn&‹ÒÂ4ŠsåÁoW$­|"_6ééqd“gópڞ22ïÊ.yri×OFæ=˜ «™w5ö9ÈVµ×« -Bª<ÃÚNWì#õ–MW|„ò-;\o88Š= ¥“‡¡bwŠÖ@™ë¨kQ›DØȉ?¤*µ\pÞuA"APp|Mïƒ×¬×µÀŒ*ií~ûPk)†p ¼U>]kkm­A^·ÞÐZ /üô‹¦´öâЃ9;km,F¶k~£™ø”vg!†è”v÷îÄøœàŽFý–M¬vgšèkkô›ùC£öÓevYªX&é­ÈPõ¾°Y`¿ìN둧šÍº,U1" QÀ…µŸ -×ÊUã5UÑz¡M󍣪¹¼§0Þ¶ìä h]%ØÝ“¥ -‚ÌgNì÷ºv¶&rTÇ -T³XPhuŠ±Ë‹,UíNj·)Ça›"ØO—ÉDC §®ÑGŸ˜;þÎ3Uå*/sQ9z#ÿ¢¨®Ѫ¨òp®ùÇ0Â^_˜¨`3nxÝf­±J1çëù½—Æí»áGœŸ/ŽÃÞ .Ú]Íë¼°ÈßéW>‹ú"£K¾YW¯¨QJṸϺ^Oên=Ì 0×cQ²×ëݶ{7êžÎÔP'\*—.ÊTºYïjîà R¥p³žl%÷oà]x×.ZQÛËÓàîf¼ŠŒM&öz³®d£ß0o°EÉý¡ŠUü} 5·ò©ß -ì»?fs°OÊKà‡ížì“Bõ‰lègû¤¢ˆ’óæ1`ŸªOóSØ'ÆWHð¿Ø'…êî>Ø'U•æúa&·ûd2!Ÿ ì“Ú笞ÏöI¡ú.6VöI…d4¢³ížì“ŠÒó]Ü'û¤L.@ü4`Ÿªï"Kõq`ŸÔ:NˆŸ -ì“j“æòàæG}RcÈ-kOöI¡LªÕ#À>‰ªb[à À>eÄÊӀ}72í^`ŸDUÄS™æzi7û¤\0Ƹ}"°OjÑ×P¨ïgû¤* ÓGŸ ì“Úl‘ȼØ'…ê»tqöIÁØÄ+OöI¡ú.כ‡}Rì™êÏöIùˆùû¤P}ò)#°YûˆÁ#ò…Lƒ¥çÕDwxJ¹QjÑWjõcr<÷?©6]19î¹ÅïŠÉ¡ŽUWïˆ*Ã'FÒ¬ú’_Ôo’¡‘‡cK6K¢MWqõ¢¥+÷„{[7·‰IÍºib+µé27CYÙ(°Ê{“þd—5¡ËäÒÖN¡ËT»L—‰Ýò¡<Á²&{ÿßMà9© QžJ{ýæËÿ”” wÿß#C)V|OúNLß3Ž/ܔð(Û%Hæúý_þ§.ùðå|ËFþþ?Ux)¥Ëÿe£|ÿŸêí'°L¼HõšMƒS{ÆcW|RúèÜ3ÐDEUù@J)¦)`ú”3ÕH)u×Õà½:LßµLc:æêµ}ò™!ªáqèƾ+ tê’Ô ƒ|êZÅ}cíÒT—]ù4r§ZÉlÁ¨þø²ËT+ÐT÷•¨²ÚT+ä<-Õ -M𸤞«œ…W˜OØIAµÈœzΉ€ÊŠî[ʼnc°¢§"]‹ÀÏl¯Þ†´§j»ŠöU¼¼^Œöýž›.оßó+»Q\ôLsíxCX›ªû‘3 Xej³¨Rl¼ÅL–›õ_7edžïl*mN+î2e»%:ÎWúQUYÛù(wcšÏ»Ü±)á°ß!mÊB(nÓ­í -ˆi}ØÆ@µ(§ÞRÑŽ1 *zô†oê¦>ñ’7^F$š(ŠŠÛ7‹Mv9ÁoŠ -õÁû‡îýã…¤¯þ»o>ŠïýS¥Ó¿÷OÑT‡<ν ™‡+R†4©sq¾÷]Öä®þ»½_R©¢˜ZtÊ­÷þi®Þ‹{×½ªoÏ~쟂/SD¬ÜˆöÅuWð¹‚ÜÁkh_\wïýòs®|t˜: æ%ôþb7JeE7¿$£¨¢ÇѾm.‰êš·v½"ù³íx);4*âúþ"kçÆ[¹Ä1Ku™µ![MåíJŒS6 ÷*°T*TÑ^•xY»†¥ºD¦M®Dûü,•1ò¥"'QÞ»LOPÛZÅôT¤êˆ\ü‡|ÏáA-JÃÞÀ, zt(,¾7XŒ$«K¥ÎbœE#EüüÜm²3;K .Ëq+î6åP“Ê'>ó^™öœSµ¦= w;9Jnï´lRɐ¦l"s”‰Þ˜~4·`eÎù5‹]ùTfgš˜Þv”úékW¨©½]ìݘmz]ËFR¸,P˜¸%Û&|¡Ð¬·d÷ʨé™Q>CHí.WZ6kK¹Uwê§e·d‡î4ë¦Ä-šåyð¸+™ ìĪ¤J¼qvK…ˆÐÉ«‰ðj€›\jÞ¨g¼êt9ZÙ(5K>¾|ë¼ É§ÑÒ-ºÌê.‰Ã=äō1wz¤Úsv•#·]ÛIÙ¸U ƒL#?ZÊN·ÚMpò9ÛD]»d®Îñ4ò‡PB<âåþ·(EQ%$ñæ èe–*„$^9‚ôzR yníšWC*怩‹§ SQðËÍ¡ ±¿&î*•Í8óDOzâÒ© (ý±®,yP³qãA]€_ -ÿ_Æøh¦)E`Öþø^qLòª‘B-Òr8;I÷ M#¾Çせêü⣪óVÔDõQ \›¤ð7ë€üQ *LuA›è)ëû^\¢XýK`K5â3ºp‰×nýQCÑFþÚ¸ -R-5·Ç©¯íêEB—_¥ÚüK¦]E©ï&§vŸÁ´«W -ÝÄ4dÜŠYl6ò™v$Q-õæ~H¢Z<"“dq'$Q-‘2ï†$ªÅ# -’ao‡$*H¤öÖî‚$ªÅ#JåÜÞI”[jä²î„$ -Xª€Gär9î‚$*¸‡âíUÞjw3$Q¡M<¢Ø“®4¥ûõàe…š›.©»û²B$û—.+”?<ý²B^Îíß¼¬šžßù¿|Y!½!yãŀ7_V(¶{úe…²)Š·±êÚe…µ÷{>tY¡ ü›5—Éqª9×ËÒ·^ƨ½ðð§Z©¸ðPý©V]x¨|Ûá]©½Rޑuυ‡’À'œj%ºðP9„¤‘?Õê¶ eGéÊ©V7^x¨|Û¡Àä¸~¨µü…‡Êé&Â@ת”=éÙÛùëÍC*wN"Êq߅‡l~Êå'*wI.öæ å°ž§à=¯ß{­žÏ¸ðPù¶CÕùȅ‡Ê+e§=áÂC«âm‡~á¡ä‚Ù]lHÞ{ááUВz”Ò…‡Ê{חi w^x(WáÒ÷šê*×ÂtITôðù?ôm‡ -Iä·]xø„#&./<¼áŠB)ìý*ßvÈm¬}Û¡0žöÀ…‡VÅÛùú¡ •³Ç¤–µ».'NpWk¿¹µv§±‘Àiˆû­hõi~"µÖª.Ia­w‰-WÒZö/ ¯ã½ŸíÌjr -•¨·¤ðPj5vâ°_°7ñPI{@”!‰²|ªïpÛrŸZ{äþcε΁^wé?' 39œè+Ԑ&úÓ÷ÜÞș© Mƽ~µ¢¯pl€Åb‡¿Øé%7]Ð'rºÞ0§'%~¶¥c¢Ønb¹I¾“šûE܆ýŽ˜v-Ö´íõœ1åòyܖz°-À{ÖÄgì3ÿÁ2ÂŒ–xó´KÒ¼ÉÍ`Ð^ÌØÌd -2¿Å­¨0 Ëpr 3Ï2v¶¢ʲ¿•œ”íäÌV0>¶ºôÁWhÎuí+>¼Ž™&V­è*G|²Ã!Ÿªv~€XTŒ ÚUUjêMð+†Òði®‚¾ÒõN{}œ¹nÆê,××.ð´aCO ³7È2¦á`É`f½#6õWÒ0â!¬¥çÇé€SòÜ£KӗÕË §T}HÒî®ãU‰;_Žak3tðF›î·„ïsfBZ›0÷êZ@†ÚnŸ`Gdä҇Ã#$K„ù<[3½oÛ8± Ò¹ˆþæ ¸”îåq$ DzZñП6M}‚Û«és€Ö1‚4‡ô'b Ç·í¡êöâ°Êž]¶E 7ÀøG Ï5ºò‘¹óÅ4§Gðš3 -;yӳ綒­NöfÂëͨ­MÁyrŧZrãXZïÓE)]Ìk뜉1÷¦Ø0‰ÛKáG9’®×s~ÎPýt¢Ž¸ DÓM)C¨ï¡?¥Ç+¶œ‹.×úIˆ›SI5>3én -çM­ña$'öxØ ¥0:ÁŸž#§—R@×u*s÷jkÏœß̘ƒh-Žz_Sçt/3ï¤_fg2õYxɑ‡~xèÙLb[òðÙ*fúæ<1­ŽJd;¹oe=Y‚ý·¬CU`¤eÓSøa÷= -5Sju¬+ …aeJÕ x qÕGøÔɎáøê:ƒ›ÐÆøف¯> ¢ê«»IƒªsÏhȸä¡þìK¬u æùüݦŒ* Nû’žébÿ gû>ÀmÆ/'Å´¢™¯&'¨Â‹Vþo%+TNEJ‰CMêLÂ[ hҌƒ§Iõõ&¹Ñýfp»>ÏÊ÷›™Q6”™•-éDÚÞ·"Ý -G° ғñ-Ò©HuZÛSêÔ3)B~Ã(ú9o‰«œÓ©vQØîŠ}¥ÄHd˜º ²ê\EóQ¬ðýë§úcœÚ“Žb®¤³]„›1kŒ ¼ø¤”7ƒ™¹é¡"PQP.äs%ýŸ¥Û‹ÐÉI>ùÒ£ÍÕ`æOœ-êv%,®A†§1^•× ‹ºw<ø/Â~É¿yÓk¨76ÊòðòŽe¸`Dºu øUŒ -I¯³ì?EñÉr‰9WïúF"ý“¬P;…N3žó…³.Ãaہ‡AÁòڏ漫B)l €|Œe³÷ÃO® 7NIP¾ÀՎ<, hl„¥þ†0Çæ¯ \=¥Þ¼WDÖ¥Ý6=op&Ñ=å8‹RÚ}’e]úÔ?=Ð, þT›\s\­·è\e›ºêJ<<Ï劙ö ú…]â½{Ãvê—Ê7oyhñKTïé-ށ(p15³Œhw^‡[×ùÕáan†Î`qÌ®”†~q /t4@Ê凜 -¸­¥O¤«]¥(‹÷  .·ËàŠ½Æö P—øñ젓¢ú‰"P1s(˜a/ÒEI²Ûfs%æw|Ú+Ñ/-á; ñI„](+#¦a…Îc^ª–áÍá°Ð“€Ó^’Gæ–×Po›×õ:³€7G€ðMœaÐg µ’Oð†×esù&1"! »h ¡ -‹z ó+ç2Œ>CUyçj²«`…ã©K»Ó‘®›svqKr–¦âÕÐñA– §!^b&´ìÇñls‰c‹ÔwŠNnn”wêÇÀ⃑PâÃôàf‚浀“‹7҉U1E˜_µE~as( Z®bR…¡¨.¯ß€!9ñ %‚zŒÃ[@,ìkT.‡ê7qºë3ò LÔ¬›~ÍÒn°ýωÈyØ×r®¤Áã˜v뛷ðšõo¤TYË@ÏÌAŒ\dô:a`>¥„¹Ÿ,Zc!ghRÊexË“cá‹å5æ0>ÀT6ØbèʃDG g;“Á˜Á -وU¤(`ŒH9`.Q)µEø 畋•ÑêI³;ª¢—:“¼Hb -w‡íԞ -ò© S ëâ,&*ÜûšÔ§™:¦‚Ð'ª éäU€g:Yœ ·S;d͙P؄MÅ$+[0Šb’Ìo­=ó[÷à\U~­\4Äk½¾¾n؀ïŠëjè­áÐO‰êš;ðÙ dn¾ñ7Päv ºÇžÚf‰·-cà£Z3àî@íD̦X#H‰§FƒËWYӇÞgRÕÑT§•2Œ&ë.ÿcÎ5BLëh·N’ -·’]:_Û=_¦‰¾ödߝ¥ZÄw^ÐÑ,¼ø6<Ž‘eBÏÐŽ ˆ :G„âCÜÅãÃkX;bøàvr|€ÍYó®4Gû®ŠL €1ë_†–W!ì,hªÜYˆª˜€@yµ ÞÂZŽZ÷±oP# ÔUgH¾“æ"˄ܧC÷Ýd˜à°#&hÐAš´<ðñǵ™ad—(ºÉ -ƽ…“HJT %¿\g½©€ÌEA“í±Ž¤vÑÔb˜¦¾#Í SíˆÈMO[àdyD´á„Uª@F-3àF…ýZGÆá7®Wƒû[߸m—Â$;¢’›0N‡£ -Žºl.ie²´ô®½iÙäÞL…g¯²E_ÝoéÑè1I£nUzDÒJn‡¨IIS¬cÇ–4ã—é1IÃ~Ír’¦ºŽ’ÕvUJøpœà$mà3ô&n¢ ±l(íúzْîú¼U¨’É6M·)‹F ÒÜd×åÉ.ÝWç¾r#vAäx<ґœ>îT!›ÌF¾dGröÌs„_·D) Šiw͑\¬F\iÄ!êÄù‹tÎ}r4ü:&ƒ×ǖ„ÉÒjåÁ_¤%Û!݈~E´DdÄí˜ê}ö‡Äbj8DÜd˜¦bi¢ëð¦ä'»JÕ9åcü¯¹JœÿµÚLÐ[<܄lMQ>Žß®ºÓ1밓>³¥ÔgØxtÖÚQ£7®:؋U˜?Ä÷`€¨µm­µgªhmæØTkˆTz̬3ŽÚ® —¿*Gš«Esq¥8lÖÞ -½ôjȂ7¸õ¼ƒ]/éOÔþwvM¿ç2É®•¼ tNm¼í/X%pݵÌÙ­8Ðk0þê÷6#ÁT¢iý2›õõâ¡g3™Ò½L:p[ÄË6邮 ^n›YCEmÕÓ;š“|z·WŒ/y(Oº»ãgÍxF¾WénPÜK|Ø6ýÉDoõ™fMÖ»F»Óou®"2p«>Ùså8>øÞƱJB#òЦóÞ}AÆ¢•æ–)&ª ïRŒô Jí<##LÓió³%FÛ,J—ãrn ÒâMQd¢ÙO ¨`§Só.ße²íT½ÞYC™kí ù­Qoš@l&LËq´ü;­Î7O0@ û./ø±¡ìû B ga¿vÄ|õx•(†ôÈ¡$*˜òfƊx?cžðveW¬évcóu3A£˜~ÁÞP][ÑR&c±»cbõ`òŠzã±Ë68]‹…ƒ0ÇP’£ÞY·Ð…–®D¨æƒ™®@ªˆ†¥Ý.}àDßM ¼¨ÍŠÁƒîºô!²ÀßqY“ æ|^³îCL›éÁ/“|m,ÀMû¨ãè…âùq!_ÍY [˜j06nð€ÙêÍê;a+ë\Ùp?1*裂¯9—W@ï{ڝ_ wîÃ;–­;è6N8 -p³ŠŸWIk—Ëü$TîH#ä?m×ZÏÁ }5[tc®ž6?;{­­5¨ƒ§Æw­a¼$`âZ ¦÷uà§7ø©•hCk÷Û[ðk‹JpÓ¥:.?NCd!L‘cÄ Òç_‘MÙ¸|ZMvúžzˆv'{¾Ba’äT’¡£y©¤XȽª†C*C)¸ü563aÒ½e¢Zã®i .óЧ}­¡3vi U[žGŠ;ÁiŒR;ä x@uwp&g¯±¬PÜQÎT²ß.HwÈÙZЂ,L»Iò7?™µ…J,GÙ"0NÊD‘® Îz±.£!TIxÞ‚^ ¿˜ÂÓFíQ èˆH&…؝†7¼;x.0Ûj©‹Y²Äpšñ2e7Ò®pÇÅ òà S0p˜€­ƒ[ÿ¸5f֝€ÊÊâp_ :wÓ’Z—¡¼ôíí1À„´ñyz ¢7¡šŽÐEBýÜ<ð1g…|áo¬ïÄ°¢é'Om[¿NwP»6`!°çœ«Éa£@G|ÀrþŽàö×XRë0ª|!²”nOE@».ܖªYú²”ÅîN0²ÉWÎH3#TÄ_Uά²1¸ó6¨b´B˵AåYE<ÔÚö»Ì%ŽÁ¯M­m8íi­Ù}TkO¸&P%'èߦŽ}õP¹óÁ©i ˆù<5}ЊÔô-dPÓì²öwÕ4µSÈÛ!BjšxXMS)ö¬šf<•jÚ|©¦%’G€‘$«¡‡ÞVXçCðlt ih¬PùhÞ¢¡qè–$ўÈbV§¡aL–JºÏàihÆæ}‚Á›ÝÁÄ·`²Ž´ÀÖ…ÁÅÁe³ºD•qwœ”ëLe˜2é˜ÊQ°4#ZxÊfÀ'¥fæ<ÂÅ¡ƒ®wÜâù>9@T¿ (bBµ¶Ó³P»{í<¯0ÉÙCYñ=ÌZ#ŒA†~"P‘ YÏPßûàW„µÑÂOA@áõì2˜+>àDB"…ÍKg‚ºÏ6wn´‹k!KP]'a^v€ÒÕÙT)A-ØÉÑnL— ›ƒ0@@ -$bƒZۋgK¥0´L†JÏCI‰€Û,Ÿ…/Q·‰šÁW”³à(€·‹{Š½OC< ì`{‚i •¾“Òß6"Sgv~mð6ÒÕ¶¯U^7„O߀M¨ë\¦0ŒÜ -/‰»X.øÛÁék}{˜<Ü<½Ÿ²šY½…Në²,ðŽòx«•—ÄMíØÖé ys,b¥:é9½ëçÙÏÞ¦Ä'7þ?|ýni f Š`½#`T†€{â'ð‹ž*–/BÓ¥‘ì[h+PÓ -←Œ9{&ÆÅb êd &Ä·¤ú=XG{ã2¿˜^å™è `î¿wy1Áì&©uhøqÁlaò8cQ#¾ÊE^˪KH){´Pú^¤ÎZ~¾J¤²4yÚÐ4S LñTÅJé#ˆq)û@®{†§dyàç„Ù¡-Q‰óc]ÂÉÙSÈ£gí)çX{=ub‹´>/³Ñq¦,ZDPŠ"ZG„Ö¬h úü¸¨Šƒƒ†ù~¡€ÒàƊ,º5{±”Y=yÊf14¦ b#Aç>œâà" mâeðÂÐrvæ~áf†”8Deø)ÚÿŠ d˜/aÊ·à›¦3T‰¤«Úü5Â7ÃPÕ{AE6(R°{ý]‰Ñ— -X @³0Ü)tQÔ7q³ždµ(4»1Ò¥‘öÉÎE‰í´ÖbÔ4¼:DZs&‰EdŽk ÝtÄ®³Ñ»+èkÊCÀ9û&ŽÍ?û!êfY%DÃü4öL 0zÊ>°ó |,š¾ÈüòL0+8Ç@ó&±p?óîȦl¼c}*Â<È; Ámìû°RAöÏã÷<¨á(§fHÁt¢*uˆ\=Q+'K+äM•^ò€J ÒjÚVÞRP¼©=Í«ª“>€"–‡ ªâôÕ&ªÞÃ~Aë´¬^ÙÓÌv74n<Þcσ8="݁‹‘¥†›ØDÌÇÊKÛNŸ8QMÁŒ®¶Éåã“wH Tº¯ŸàO· 3=>qöÁ/W^ºáonQÊÝ¢jfÔê¦ÒV¿9“!Ë-?½~<Àû zh‡ôÐé"§˜>ž"Ò¥ºz>a¢ŒÛ ÃKàNS¥Æ{(ä]x(ƒÛ•¾…:XÍk„¬ía¤ÙJ+b0—ø‡åt·Hd$Œqí'¨¡ê‚'„½Û€h…óÎUç䠜h`1 ˆY9Rg£ÝKæŒúRÓôQ\¸£èØU4båý6ÖåwM¡óL@§LÖÔéí†Ê×Ê¥FëÄLt”:ځûàVuø t õ»¬ðÍí¥ÛÁD>¶Tn*}ÄD¶‚!ÆWÙ&F‚=ЫêÞþ7à|ø.ÏôÇY;oæ‡Êaµ\ýþ±iþ iþq&ò8Þüm3‡ù¼1ÿÏSz;=ÿÌO‚œ‰z*Ÿ÷{Òóév6ÿC/èqRa§Eˆvo]rñnJc¤ì:÷R‹ŒÓ ¬íWj»Æn3ÂKµ`Üÿ³ûT´ß”;Úà×.…Vá¢?G ãØò’ž’gÒZ.µEÚ¹_Q# %àhÍkqçqvæ½"òÅâζe|ç àšŠãªDgUÁÞèÓ~'ÜԈß p‹ù öð >ˆÁ‹ÜIÎÝt\•è¬*Æ1öqU¢³ª­¬â¸ªñ)À,è>3Fq}M+nåsK0 ÝŒ1ÏòNþÑ*Jvƒ -£AÜ^¥Òn ¦\¬©_ßã\åCtÔ)ø-ƒ 5 㮦×0¤á§g»èŽ -ß÷Š:36tt$øÚDõZ¨r¾÷]ì!UVžA¡»%îl­‘À+îA¦¥ã°ÝÂÿ¾ºëCŸÈÌíú0ÇýÑUJÕG´TWÉøBß=nœ7ÒùYD{™Ð „‹±y3|aα»ÙޏùB6© ul£5ö¤é¤¥ÒÁÐÙ -àS§¦É€ˆò¯É؅¶ƒ¨/37ªƒßu UiGP‚¯æp¦uc> 8™›pÉBàÁÌÅ{0к†ÌòEŒÊ{æT®õ—ç6ÎæEê˛©Ð[zr¹Üj]ãr+NÞLi‘9 0مKðg>͸Á¦tôåôí¾hŽçÔÊXÌѐ¯eו3£òk€±.]†áч²VxÆק—‹tð¦Ô”Œ­°7ŠVËgŠ•&ik H !Û­ù­g¢•è9ølŽÊâ1¯6Q­ý·úk@¸É+o¼ ‰Ç…€þ–ñÂl£þeㅯÓþ¢ñ‚,*<÷WæÄqê|TîàTAZ˜2’œJxºŽ$×pç þM$9Kø«Hr ulò/#Ééd -í_F’k.I®xèd·oý»Hr6yïï"ə使Œ$×pÇæþM$¹†¶û{Hr BÛ©?ÞàN$¹Fÿd$¹æ>Hü­Hr‰éù7äšÊw"É5B òßB’2Lþ—‘är’öd$¹¼¤=I.%iIÎJÚßE’‹$ío!É57¾ð’\Ã@âÿ.’\ÃAâÿ&’’`ò¿Œ$×\…Ä?I®á ñIÎ_¤ÿ"’œ²Ó®!ÚF’3Zà/#É52ø'#É%Tçß@’sYb$¹ð¤Rw݄[×>#ôMŒÛYþåâiÜp¬7*AÞýì¢Ë¨ðã—Ó^»Çad>á&´¯E{Á¼³¤¡ì‰Ø(ç‚mÀהƒy-ãd]|†åo^¿Ø˜ëÅVè#û "2»Ô’}†óûFißøGþeËùÿfã?XºÙcí¡Nm -C•D¥”CÅ'À½e)Ü -}d”hU[¡ìƒRá•û–÷ïƒjþQ½úÈ>(ë¼¾j}`TÃü¯o…>²z±ñxõ…»öA)ISµúÈ>(³U§6šxg(é´¢‰w†5ÿÜM¼3”ÈO QM¼3”H¥†Ü°‚ÑÑ<ŽÉß³üü -~ªÏOç*â&çËÕoiüï9Xnð?Ô? üƒÿ'ßàÓ¸ýÄϟhæ›ùEEë›ín><¬–_'™–š0‡ßãvù<æ?Îúé°ú]þ1%“‰)`im{ʅ}Âÿ$s‡ßQ9ÜåwxqÌÏþ@^¨è~rµ¤Æi8ÝnÎ?W‹ê™Ë‰^{ü~7l• ‡ý @Ê躨4ÿ3û¦Ê&ÖƛÍ͍Ä].–ƒ<2üó}}Råqyqö— I<ª† ‚ûz{K@®†ïãӗš&—’´úÚ)»]BŸ`<}‚Éê“Äï/-›Ç?¦Tå­Þ¨5S|åíìRÏðªÿ“ðùµ€CZˆÑ?ð/Jš’Âþ8aÖ́o¡¯ãŸyþw6ÿOú‡úi{ø7ûl-|±¹IŸáDàÝƒy¡ÁóÄ_KÜWwH®)*-þNÿeÆ©c‹Ágjû»XýuǶøㄽKüžVãÍj|„š‚J”‘ã6Ë)ÐÖhГù¼Åø&NáJœ"ÃëñA‰û¸›@ŒÀ±€ÃE¸ÁdôÑ÷…ŠúŠ9€|=êó€ô#áò:Ü^T®˜ßá#hHÔJ1Hº›Œ -unS¡Ïcôí-xlL¥1q{<ÌÍJ%R9´Œ¡Ï<ùcŠJüôÿ¸Tº9@€îà ?^—¨SjÀu€úw9<­ã„s`@·÷Ñë ÆóBƹ˜Ïƒdõ²VE¡ü/—Éÿ»"éV Sà1îÁ©éN¯š.æð`žÅs ‚ìonÁoÔ{nÄñ‹ºGØ> ØCÿe£pk¢²ö¹Ýa‡úՏc8e\¹ÐÔf¥{=@wSfˆ0: ø ½ˆù)]rQÛÿç!m?½¾—óÆa¼Ú@ëiyÿÇüϘ2mæ;ðèÏò0?‚!™ÿ9~mÿ/±/ß®’Ñüó7íXP -endstream endobj 5 0 obj <> endobj 22 0 obj <> endobj 40 0 obj <> endobj 39 0 obj <> endobj 67 0 obj <> endobj 66 0 obj <> endobj 77 0 obj [/View/Design] endobj 78 0 obj <>>> endobj 75 0 obj [/View/Design] endobj 76 0 obj <>>> endobj 50 0 obj [/View/Design] endobj 51 0 obj <>>> endobj 48 0 obj [/View/Design] endobj 49 0 obj <>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 95 0 obj [93 0 R 94 0 R] endobj 118 0 obj <> endobj xref -0 119 -0000000004 65535 f -0000000016 00000 n -0000000248 00000 n -0000042339 00000 n -0000000006 00000 f -0000183270 00000 n -0000000008 00000 f -0000042390 00000 n -0000000009 00000 f -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000016 00000 f -0000184311 00000 n -0000184342 00000 n -0000000017 00000 f -0000000018 00000 f -0000000019 00000 f -0000000020 00000 f -0000000021 00000 f -0000000023 00000 f -0000183340 00000 n -0000000024 00000 f -0000000025 00000 f -0000000026 00000 f -0000000027 00000 f -0000000028 00000 f -0000000029 00000 f -0000000032 00000 f -0000184195 00000 n -0000184226 00000 n -0000000033 00000 f -0000000034 00000 f -0000000035 00000 f -0000000036 00000 f -0000000037 00000 f -0000000038 00000 f -0000000041 00000 f -0000183479 00000 n -0000183411 00000 n -0000000042 00000 f -0000000043 00000 f -0000000044 00000 f -0000000045 00000 f -0000000046 00000 f -0000000047 00000 f -0000000052 00000 f -0000184079 00000 n -0000184110 00000 n -0000183963 00000 n -0000183994 00000 n -0000000053 00000 f -0000000054 00000 f -0000000055 00000 f -0000000056 00000 f -0000000057 00000 f -0000000058 00000 f -0000000059 00000 f -0000000060 00000 f -0000000061 00000 f -0000000062 00000 f -0000000063 00000 f -0000000064 00000 f -0000000000 00000 f -0000000000 00000 f -0000183639 00000 n -0000183571 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000183847 00000 n -0000183878 00000 n -0000183731 00000 n -0000183762 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000044681 00000 n -0000044351 00000 n -0000044281 00000 n -0000184427 00000 n -0000042772 00000 n -0000065709 00000 n -0000065596 00000 n -0000043349 00000 n -0000043716 00000 n -0000043766 00000 n -0000044563 00000 n -0000044595 00000 n -0000044445 00000 n -0000044477 00000 n -0000044819 00000 n -0000044846 00000 n -0000045310 00000 n -0000045583 00000 n -0000045653 00000 n -0000045928 00000 n -0000046032 00000 n -0000065784 00000 n -0000065985 00000 n -0000067021 00000 n -0000074284 00000 n -0000139874 00000 n -0000184459 00000 n -trailer -<<1F85C3F3F3281849A05EE2E218B76CF0>]>> -startxref -184640 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_black.svg b/net.mograsim.plugin.branding/raw_files/icon_black.svg deleted file mode 100644 index b61a1330..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_black.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_black_512.png b/net.mograsim.plugin.branding/raw_files/icon_black_512.png deleted file mode 100644 index 25c717c9..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/icon_black_512.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png b/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png deleted file mode 100644 index 18b26e33..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai b/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai deleted file mode 100644 index bf34ead9..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai +++ /dev/null @@ -1,1441 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R 6 0 R 33 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_blue-orange - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T16:29:46+02:00 - 2019-06-22T16:36:11+02:00 - 2019-06-22T16:36:11+02:00 - - - - 224 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Ann5Hfmx9aWHyprs3+kqA mlXkh/vAOkDk/tD9g9+nWlev9oOxuG8+IbfxD9P6/m6Ts3XX+7nz6fqe25yDu3Yq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7aztZru6lWG2gRpJpXNFVFFSSfY ZKEDOQjEWSiUgBZ5PF/Ln5mXPnH84tOhti0WhWaXQs4Dt6jei49dxtuw6A/ZH051uq7JGl0Eid8k uG/Lcbfjm6XDrDm1IA+kXXy5vAUd0dXRirqQVYGhBG4IIztiLdC+m/yZ/NVfM1mui6tIBr9qnwSN t9aiX9sf8WKPtjv1HennvbvY/wCXl4mMfuj/ALE/q7vk9L2drvEHDL6x9r1DOcdo7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kKCzGgG5J6AYq+afzp/NY+YbptB0aX/c HbP+/mX/AI+pVPX/AIxofs+J38M9A7B7G8CPi5B+8PL+iP1/2PNdo67xDwR+kfalf5C/+TM07/jF c/8AJhsyfaP/ABOXvj97X2X/AH4+P3PPc3rrlexvrywvIb2zlaC6t3EkMyGjKymoIyvJjjOJjIXE soyMTY5h9W/lZ+ZNp5z0ekvGHW7NQL+2GwbsJo/8hj2/ZO3gT5r2x2VLSZNt8cuR/QfP73qtDrBm j/SHNnGadznYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/PH82OXr+U9 Cm+HePV7yM9ezW6Edv8Afh/2Pjnaez/Y3LPlH9Uf779Xz7nRdpa7/Jw+P6v1vC87J0T0L8hf/Jma d/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FUx8veYNU8v6vb6tpkvo3ds1VPVWU7MjDur DY5j6nTQz4zCYuJbcWWWOQlHmH1x5D88aX5w0JNSsyI50ol7aE1aGWleJ6VU9Vbv8655h2j2fPS5 OCXLoe8PWaXUxzQ4h8WR5gOS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkv51 fmuNBtn8v6JN/uauFpdXCHe2jYdAR0lYdPAb+GdP2D2N4x8XIP3Y5D+cf1Op7R13hjgj9X3ftfNp JJJJqT1Od8847Ch6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxVkHkjzpqv lHXI9TsDzT7F3ak0SaImpRutD3U9jmD2hoIarGYS+B7i5Gm1EsUuIPrjy15k0rzHo1vq2mS+pbTj cH7aOPtRuOzKev8ATPMNXpZ4MhhMbj8W9bhzRyREo8k0zGbXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwD82vzOt/J+l/VrNll1+8U/VYTuIkOxmkHgP2R3PsDm77F7JOqncv7qPPz8h+l wNfrRhjQ+s/i3yvdXVzd3MtzcytNcTMXmmclmZmNSzE9Sc9IhARAAFAPLSkSbPNSybF2KvQvyF/8 mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVZn+WH5j33kzWQ55TaPdFV1C0B7 dPVjB/bT8enuNR2t2XHV465ZB9J/QfJzdFqzhl/RPN9Y6bqNjqVhBf2My3FncoJIZkNQyn/PcZ5p lxSxyMZCpB6uExIWORRGVsnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8xPP2m+TNDa9uK S301U0+zrQyyDufBEqCx/iRmy7M7Nnq8nCNoj6j3ft7nF1eqjhjZ59A+Sda1rUta1S41TUpjPeXT l5ZD+CqOyqNgOwz07T4IYoCEBUQ8nkySnIylzKCy5rdirsVehfkL/wCTM07/AIxXP/Jhs0XtH/ic vfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV6X+Tn5pyeVr8aVqkjP5fu3FSd/q0jbeov+Qf2x9I9+e7 c7HGpjxw/vY/7Id3v7nZ9n67wjwy+g/Y+n4pYpYklidZIpFDRyKQysrCoII2IIzzsgg0eb0wNrsC XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk/m3zVpXlfRJ9W1J+MUQpFEPtyykHjGg/man0dTtmXo tHPUZBCHM/YO9pz544o8UnyN5w826r5q1ybVtRf43+GCAH4IYgfhjT2H4nfPT9DooabGIQ/tPe8l qM8ssuKSSZmNDsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdir sVdir2j8kPzY+oSReV9dm/0GQ8dNvJDtCx6QuSf7tv2f5T7dOS9oOxuMHNiHq/iHf5+/v7/v3XZu u4f3c+XR9CZwz0DsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLHStOudRvpPRs7SMyzyEE0VfYbn LMOGWSYhEXKTCcxGJkeQfJX5kfmDqHnPWzdS1h063qmn2dahEPVmp1d6VP3ds9O7K7MhpMfCN5n6 j+Ojyes1ZzSvp0Ylm0cR2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f+Jy98fvdj2X/AH4+P3PP c3rrnYq7FXYq7FXYq7FX0N+SH5sfpKKLyvrs1dRiHHTbuQ7zoo2icn/dijof2h79eF9oOxvDJzYh 6f4h3efu+77uh7N13F+7nz6PZs5N3LsVdirsVdirsVdirsVdirsVdirsVYn+bH/kudf/AOYU/wDE hmz7G/xvH/WcTXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv +/Hx+557m9dc7FXYq7FXYq7FXYquillilSWJ2jljYNHIpKsrKaggjcEHAQCKPJINPqH8nvzTi812 A0zU3CeYLRPj7C5jXb1VH8w/bH0jbp51252OdNLjh/dS/wBie79T0/Z+t8UcMvrH2vSc592TsVdi rsVdirsVdirsVdirsVSbQvNFjrV/qVvYn1INPaOM3ANVkduXLj/kjj175h6bWRzSkI8oVv3ufrOz 56eEJT2M7Ndw2Sz82P8AyXOv/wDMKf8AiQzf9jf43j/rOl139zL3Pj/PU3kHYq7FXYq7FXYq9C/I X/yZmnf8Yrn/AJMNmi9o/wDE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2KuxV2KuxVE6bqV9pl/BqFh M1veWziSCZOqsv6x4g9cry4o5ImMhcSzhMxII5h9Y/ll+Ytj5z0b1fhh1a1CrqFoD0J2EiV/Yen0 dPn5n2t2XLSZK5wP0n9HvD1ei1YzR/pDmzLNS5jsVdirsVdirsVdirsVeXfmn+YPpLLoGky/vWqu oXKH7I7xKR3/AJvu8c5ntrtSrxYzv/Ef0frey9nexeKs+Ubfwj9P6vm78i/95dX/AOMkH6nx9m/p n7x+lfa/6sful+hkv5sf+S51/wD5hT/xIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C /wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXYq7FXYq7FU18seZdU8t61b 6vpknp3MB3U7pIh+1G47qw/zrmNq9JDUYzjmNj+LbsOaWOQlHm+uPJPnPSvN2hRapYNxbZLu2Jq8 MoFWRvH2PcZ5f2hoJ6XIYS+B7w9ZptRHLDiCf5hOQ7FXYq7FXYq7FWB/mX5/XRLZtL05wdWnX43U /wBwjD7X+uR9n7/Cuj7X7T8EcEP7w/Z+3uel7A7F/MS8TIP3Q/2R/V3/ACeHszMxZiWZjVmO5JPc 5xZNvogFPW/yL/3l1f8A4yQfqfOq9m/pn7x+l4j2v+rH7pfoZL+bH/kudf8A+YU/8SGdz2N/jeP+ s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4nL3x+92PZf9+Pj9zz3N66 52KuxV2KuxV2KuxV2KuxV2Ksl8g+etU8na4moWhMls9EvrMmiTReHsy1qrdj7VGa/tLs+Gqx8Euf Q9x/HNydLqZYZWOXV9b+X9f0vX9Jt9V0yYTWlyvJT0ZT+0jjsynYjPMNTpp4ZmExUg9biyxyREo8 imGUNjsVdirsVYt5+872/lrTuMZWTVLgEWsB34jp6rj+UfifpprO0+0Rp4bbzPIfpdz2N2TLV5N9 sceZ/QPP7ngF1dXF3cyXNzI0txMxeWRjUsx3JOcJOZkTKRsl9Ox44wiIxFRClkGb1z8i/wDeXV/+ MkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/wCS51//AJhT/wASGdz2N/jeP+s8Frv7mXufH+epvIOx V2KuxV2KuxV6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxV2KuxV2KuxV2K uxV2KuxVnP5V/mXd+TdW4TFptDu2AvrYblT09aMfzqOv8w28KabtjsmOrhttkjyP6D5fc52h1hwy 3+k8/wBb6tsb20vrOG8s5lntbhBJDMhqrKwqCDnmuTHKEjGQoh6qMhIWOStkGTsVSXzb5psfLelN e3Pxyt8Nrbg0aSTw9gO5zD12tjp4cR59B3uw7N7Onq8vBHl1PcHzxq+r3+r6jNqF9J6lxMasegA7 Ko7ADpnAZ88sszORsl9S0umhgxiEBUQg8pch2KvXPyL/AN5dX/4yQfqfOr9m/pn7x+l4f2v+rH7p foZL+bH/AJLnX/8AmFP/ABIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc /wDJhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXoOi/lhP5g/LWTzDpKtJqtjdTJPaipM0C IjfAP50qdh9r50zRZ+1xg1fhT+iURR7jv9h+x2GPRHJh44/UC8+6ZvHAdhQ7FXYq7FXYq9S/Jn81 n8t3i6Jq8pOg3L/u5WNfqsjH7Qqdo2P2x26+Neb7d7G8ePiYx+8H+yH6+75O17O13hnhl9J+x9Mq yuodCGVhVWG4IPQg558RT0reBXz/APmlfXVz5zvoppC8drwit0PRE4KxA/2TE5wfbOSUtTIE8uT6 f7PYYw0kSBvKyfPdiWap3bsVdir1z8i/95dX/wCMkH6nzq/Zv6Z+8fpeH9r/AKsful+hkv5sf+S5 1/8A5hT/AMSGdz2N/jeP+s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f +Jy98fvdj2X/AH4+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8WK fnl+U/oNN5r0KH9yxL6taRj7LHrOij9k/t+H2vGmy9n+2brBlO/8J/R+r5OL2loa/eQ+P63h+di6 N2KuxV2KuxV2KvcfyM/NZopLfylrcpaOQiLSLpjUqxNBbuT2J2j8Ps+FOO9oexrBz4x/WH++/X83 edma6qxy+H6v1Pe84p3z54/Mr/lONV/4yJ/yaTOA7X/xmfv/AEB9T7B/xPH7j95Yzmtdu7FXYq9c /Iv/AHl1f/jJB+p86v2b+mfvH6Xh/a/6sful+hkv5sf+S51//mFP/Ehnc9jf43j/AKzwWu/uZe58 f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc/8AJhs0XtH/AInL3x+92PZf9+Pj9zz3N6652KuxV2Ku xV9N/wDOOf8A5L+T/mPm/wCIR5557Uf40P6g/S9N2R/c/F6gyq6lHAZWFGU7gg9QRnOg07R8zfnP +VLeW7ttb0iInQbl/wB5Gor9Vlc/Z2G0bE/Ae3Twr6D2F2x+Yj4eQ/vB/sh+vv8Am8z2jofDPFH6 T9jy3OkdW7FXYq7FXYqnvkH/AJTry5/21LL/AKiEzC7S/wAWyf1Jf7kuRpf72P8AWH3vs/PJnsnz x+ZX/Kcar/xkT/k0mcB2v/jM/f8AoD6n2D/ieP3H7yxnNa7d2KuxV65+Rf8AvLq//GSD9T51fs39 M/eP0vD+1/1Y/dL9DJfzY/8AJc6//wAwp/4kM7nsb/G8f9Z4LXf3Mvc+P89TeQdirsVdirsVdir0 L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/wDnHP8A8l/J/wAx 83/EI8889qP8aH9Qfpem7I/ufi9RznHaKN9ZWl9ZzWd5Cs9rcIY5oXFVZWFCCMnjyShISiaIYyiJ CjyfKX5qflrd+TdX5QhptDu2Jsbk7lT1MMh/nUdP5hv409K7H7Vjq8e+2SPMfpHl9zyuu0Zwy2+k 8v1MGzcuC7FXYq7FU98g/wDKdeXP+2pZf9RCZhdpf4tk/qS/3JcjS/3sf6w+99n55M9k+ePzK/5T jVf+Mif8mkzgO1/8Zn7/ANAfU+wf8Tx+4/eWM5rXbuxV2KvXPyL/AN5dX/4yQfqfOr9m/pn7x+l4 f2v+rH7pfoZL+bH/AJLnX/8AmFP/ABIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+ TM07/jFc/wDJhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/AJj5v+IR5557 Uf40P6g/S9N2R/c/F6jnOO0diqX+YNA0vX9JuNK1OETWlyvFh0ZT+y6HsyncHL9NqZ4ZicDUg15c UckTGXIvkfz75G1Tydrj6deAyW71exuwKLNFXr7MOjL2PtQ56f2b2hDVY+OPPqO4/jk8lqtNLDKj y6MbzYOM7FXYqnvkH/lOvLn/AG1LL/qITMLtL/Fsn9SX+5LkaX+9j/WH3vs/PJnsnzx+ZX/Kcar/ AMZE/wCTSZwHa/8AjM/f+gPqfYP+J4/cfvLGc1rt3Yq7FXrn5F/7y6v/AMZIP1PnV+zf0z94/S8P 7X/Vj90v0Ml/Nj/yXOv/APMKf+JDO57G/wAbx/1ngtd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJ mad/xiuf+TDZovaP/E5e+P3ux7L/AL8fH7nnub11zsVdirsVdir6b/5xz/8AJfyf8x83/EI8889q P8aH9Qfpem7I/ufi9RznHaOxV2KpB538maX5u0KXS78cW+3a3IFXhlAorr0r7juMzuz9fPS5BOPx HeHH1Onjlhwl8jeZvLeq+W9ZuNJ1OP07mA7Ebq6H7MiHurD/ADrnp+k1UM+MTgdj+KeSzYZY5GMu aV5ktTsVT3yD/wAp15c/7all/wBRCZhdpf4tk/qS/wByXI0v97H+sPvfZ+eTPZPnj8yv+U41X/jI n/JpM4Dtf/GZ+/8AQH1PsH/E8fuP3ljOa127sVdir1z8i/8AeXV/+MkH6nzq/Zv6Z+8fpeH9r/qx +6X6GS/mx/5LnX/+YU/8SGdz2N/jeP8ArPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz /wAmGzRe0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45/wDkv5P+Y+b/AIhHnnntR/jQ /qD9L03ZH9z8XqOc47R2KuxV2KsM/M78ubHzno3pjjDq9qGbT7s9idzG9P2H/Dr7Hbdk9qS0mS+c D9Q/T73D1ukGaP8ASHJ8n6lpt9pl/PYX8LW95bOY5oXFCrD/AD2PfPTMWWOSIlE3EvKTgYkg8whs sYJ75B/5Try5/wBtSy/6iEzC7S/xbJ/Ul/uS5Gl/vY/1h977PzyZ7J88fmV/ynGq/wDGRP8Ak0mc B2v/AIzP3/oD6n2D/ieP3H7yxnNa7d2KuxV65+Rf+8ur/wDGSD9T51fs39M/eP0vD+1/1Y/dL9DJ fzY/8lzr/wDzCn/iQzuexv8AG8f9Z4LXf3Mvc+P89TeQdirsVdirsVdir0L8hf8AyZmnf8Yrn/kw 2aL2j/xOXvj97sey/wC/Hx+557m9dc7FXYq7FXYq+m/+cc//ACX8n/MfN/xCPPPPaj/Gh/UH6Xpu yP7n4vUc5x2jsVdirsVdirzT84vysj81WB1TTI1XzBaJ8IGwuY139Nv8ofsH6Dt06DsPtg6aXBP+ 6l/sT3/rdb2hovFHFH6x9r5glilileKVGjljYrJGwKsrKaEEHcEHPRQQRY5PMEUnfkH/AJTry5/2 1LL/AKiEzD7S/wAWyf1Jf7kt+l/vY/1h977PzyZ7J88fmV/ynGq/8ZE/5NJnAdr/AOMz9/6A+p9g /wCJ4/cfvLGc1rt3Yq7FXrn5F/7y6v8A8ZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/yXOv8A/MKf +JDO57G/xvH/AFngtd/cy9z4/wA9TeQdirsVdirsVdir0L8hf/Jmad/xiuf+TDZovaP/ABOXvj97 sey/78fH7nnub11zsVdirsVdir6b/wCcc/8AyX8n/MfN/wAQjzzz2o/xof1B+l6bsj+5+L1HOcdo 7FXYq7FXYq7FXjH53/lP+kI5vNGhQ/6fGvLUrRB/fIP92ooH94P2vEe/XrPZ/tngIw5D6f4T3eXu dN2loeL95Dn1eL+Qf+U68uf9tSy/6iEzre0v8Wyf1Jf7kum0v97H+sPvfZ+eTPZPnj8yv+U41X/j In/JpM4Dtf8Axmfv/QH1PsH/ABPH7j95Yzmtdu7FXYq9c/Iv/eXV/wDjJB+p86v2b+mfvH6Xh/a/ 6sful+hkv5sf+S51/wD5hT/xIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/wDkzNO/ 4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/wA45/8Akv5P+Y+b/iEeeee1H+ND +oP0vTdkf3Pxeo5zjtHYq7FXYq7FXYq7FXi/nH8p/wBHef8AQfM+hQf7j5NVs21K0jG0Dm4SsqAf 7rb9ofsn26dboe2fE0uTDlPq8OXCe/0nb3/e6bUaHhyxnDlxC/m9ozkncvnj8yv+U41X/jIn/JpM 4Dtf/GZ+/wDQH1PsH/E8fuP3ljOa127sVdir1z8i/wDeXV/+MkH6nzq/Zv6Z+8fpeH9r/qx+6X6G S/mx/wCS51//AJhT/wASGdz2N/jeP+s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv/kzNO/4xXP8A yYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxV2KuxV9N/845/+S/k/wCY+b/iEeeee1H+ND+oP0vT dkf3Pxeo5zjtHYq7FXYq7FXYq7FXYq7FXzx+ZX/Kcar/AMZE/wCTSZwHa/8AjM/f+gPqfYP+J4/c fvLGc1rt3Yq7FXrn5F/7y6v/AMZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/yXOv/APMKf+JDO57G /wAbx/1ngtd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJmad/xiuf+TDZovaP/E5e+P3ux7L/AL8f H7nnub11zsVdirsVdir6b/5xz/8AJfyf8x83/EI8889qP8aH9Qfpem7I/ufi9RznHaOxV2KuxV2K uxV2KuxV2Kvnj8yv+U41X/jIn/JpM4Dtf/GZ+/8AQH1PsH/E8fuP3ljOa127sVdir1z8i/8AeXV/ +MkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/5LnX/+YU/8SGdz2N/jeP8ArPBa7+5l7nx/nqbyDsVd irsVdirsVehfkL/5MzTv+MVz/wAmGzRe0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45 /wDkv5P+Y+b/AIhHnnntR/jQ/qD9L03ZH9z8XqOc47R2KuxV2KuxV2KuxV2KuxV88fmV/wApxqv/ ABkT/k0mcB2v/jM/f+gPqfYP+J4/cfvLGc1rt3Yq7FXrn5F/7y6v/wAZIP1PnV+zf0z94/S8P7X/ AFY/dL9DJfzY/wDJc6//AMwp/wCJDO57G/xvH/WeC139zL3Pj/PU3kHYq7FXYq7FXYq9C/IX/wAm Zp3/ABiuf+TDZovaP/E5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/nHP/yX8n/MfN/xCPPPPaj/ ABof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+ePzK/5TjVf+Mif8mkzgO1/wDGZ+/9AfU+ wf8AE8fuP3ljOa127sVdir1z8i/95dX/AOMkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/5LnX/APmF P/Ehnc9jf43j/rPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/AOTM07/jFc/8mGzRe0f+Jy98fvdj 2X/fj4/c89zeuudirsVdirsVfTf/ADjn/wCS/k/5j5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0dir sVdirsVdirsVdirsVfPH5lf8pxqv/GRP+TSZwHa/+Mz9/wCgPqfYP+J4/cfvLGc1rt3Yq7FXrn5F /wC8ur/8ZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/wAlzr//ADCn/iQzuexv8bx/1ngtd/cy9z4/ z1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVdi r6b/AOcc/wDyX8n/ADHzf8Qjzzz2o/xof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+ePzK /wCU41X/AIyJ/wAmkzgO1/8AGZ+/9AfU+wf8Tx+4/eWM5rXbuxV2KvXPyL/3l1f/AIyQfqfOr9m/ pn7x+l4f2v8Aqx+6X6GS/mx/5LnX/wDmFP8AxIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7F XoX5C/8AkzNO/wCMVz/yYbNF7R/4nL3x+92PZf8Afj4/c89zeuudirsVdirsVfTf/OOf/kv5P+Y+ b/iEeeee1H+ND+oP0vTdkf3Pxeo5zjtHYq7FXYq7FXYq7FXYq7FXzx+ZX/Kcar/xkT/k0mcB2v8A 4zP3/oD6n2D/AInj9x+8sZzWu3dirsVeufkX/vLq/wDxkg/U+dX7N/TP3j9Lw/tf9WP3S/QyX82P /Jc6/wD8wp/4kM7nsb/G8f8AWeC139zL3Pj/AD1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/5MNmi9 o/8AE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/AJxz/wDJfyf8x83/ABCPPPPaj/Gh/UH6Xpuy P7n4vUc5x2jsVdirsVdirsVdirsVdir54/Mr/lONV/4yJ/yaTOA7X/xmfv8A0B9T7B/xPH7j95Yz mtdu7FXYq9c/Iv8A3l1f/jJB+p86v2b+mfvH6Xh/a/6sful+hkv5sf8Akudf/wCYU/8AEhnc9jf4 3j/rPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c// 2Q== - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:73FE812EFA94E911B987F622BD994B0C - uuid:004ce5b9-fc7c-4b0d-93ee-bf4717f6614d - - uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:73FE812EFA94E911B987F622BD994B0C - 2019-06-22T16:29:45+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Cyan - Magenta - Yellow - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/Properties<>>>/Thumb 38 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 35 0 obj <>stream -H‰lK -Â@D÷}Š¾@:ý™O²5Š« âãÂ,Ôûƒ=ã' -20Ý5¯Šiw¶ãÀ¸ZL¬™L£ß½*Þ&h·ÆéWd?‚3ºã8CÑ3ô½K!)‰ö.-td]ÙÏp‚=È\ _0Ëd -"iA6I°ÉÞ§3Tåoݤ•ý%žð¿Í—1ûiÜä\+—Y;q%ê.S -)¼”w"³X35fÊñ“¸ýà Œ[>¤ -endstream endobj 38 0 obj <>stream -8;Z-Q9+lk"$jPWQ],\i6ZcXl0:91<&O?ajCF]t))bSU7-g/@oZJb=TD4`>/`f0_;N -8C70HZV1@\[_^QkYh(XZhc"omWBGXj"MjeZ8*Do-[FJI3=#Ahc:OcT?i2RIgeHAe+ -eTESII-RNAZO,\Bil_dEc,:DoOCXu,(2q'cVX^Jhe38'i1)g(1JrG!;\,&'M7RVCu -irj;VlI-Cj3d`.0dN -endstream endobj 39 0 obj [/Indexed/DeviceRGB 255 40 0 R] endobj 40 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 33 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 37 0 obj <> endobj 36 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_blue-orange.ai) -%%CreationDate: 6/22/2019 4:36 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%%DocumentProcessColors: Cyan Magenta Yellow -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 45 0 obj <>stream -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 20905 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C4585FD6DFF7FFF0885FD6BFF5B0EFF0F08A9FD69FF850837FF080908 -%A9FD67FF8508090EFF0F080F0FFD66FFAF090F0837FF080F080F30FD64FF -%AF080F080F30FF310F0F080F31FD63FF310F08310931FF080F080F08095A -%FD61FF3009080F080F30FF310F0F08310F0F5BFD5FFF310F0F0F08310937 -%FF080F080F080F08097EFD5DFF5A09080F080F080F30FF0F08310F0F0831 -%090F85FD5BFF5B0F090F08310F0F0837FF080F080F080F080F080FA8FD59 -%FF7F09080F080F080F08090EFF0F08310F0F08310F310831FD58FFA90F08 -%310F0F08310F0F0837FF080F080F080F080F080F0831FD56FFA931080F08 -%0F080F080F080F30FF310F0F08310F0F08310F0F085BFD55FF3108310F0F -%08310F0F08310931FF080F080F080F080F080F080F085BFD53FF37080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310985FD51FF5B -%090F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F08 -%85FD4FFF5B080F080F080F080F080F080F080F30FF0F08310F0F08310F0F -%08310F0F080F09A9FD4DFF85080F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F08AFFD4BFF85080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F30FD4AFF -%AF080F0F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F -%080F080F080F080930FD49FF0E09080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F30FD47FF300F0F0F08 -%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F -%080F080F08095AFD45FF3009080F080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F7FFD43FF5B0F08 -%310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F -%080F080F080F080F080F080F85FD41FF5A0F080F080F080F080F080F080F -%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F080FA9FD3FFF850F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%37FF080F080F080F080F080F080F080F080F080F080F080F0831A9FD3DFF -%840F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310931FD3CFFA93109310831 -%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 -%0F080F080F080F080F080F080F080F0831FD3AFFA931080F080F080F080F -%080F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F0831085BFD39FF37080F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F -%080F080F080F080F080F080F085BFD37FF5B080F080F080F080F080F080F -%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F0885FD36FF310F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F08A9FD35FF5B080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08AFFD34FF310F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080908FD34FF5B080F08 -%0F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F31FD33FF -%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 -%0F30FD2DFFCFFD04FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F080F5BFD2BFFC2FD05FF300F0F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F08095AFD29FFBBBAFD05 -%FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30FF -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F7FFD27FFC2BABBFD05FF310F0F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F85FD25FFC2B4B4BBFD05 -%FF5B080F080F080F080F080F080F080F080F080F080F080F080F080F30FF -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F08310931A9FD23FFC9BAB4BABBFD05FF310F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F0831A8FD21FF -%C9BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310F310837FD20FFCFBBB4BABABABBFD05 -%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF -%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F -%080F080F080F080F085BFD1EFFCABBB4BAB4BAB4BBFD05FF5B080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F085BFD1DFFC1B4BABABAB4BABBFD05FF300F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F087FFD -%1BFFC2B4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F09A9FD19FFC9 -%B4BAB4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F08A9FD17FFC9B4 -%BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F0FFD16FFCAB4 -%BAB4BABABAB4BABABABBFD05FF310F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F080F0EFD14FF -%CAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F -%080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F31FD13FFFD04BAB4BABABAB4BABABABBFD05FF370F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F080930FD11FFBBB4B4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F30FF310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F5BFD0FFFBBBABABAB4BABABAB4BABABAB4BA -%BBFD05FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 -%0931FF080F080F080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F08095AFD0DFFC2B4B4BAB4 -%BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F31 -%080F85FD0BFFC2BAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F08 -%0F080F080F080F080F080F080F080F087F3009080F080F080F080F080F08 -%0F080F080F080F080F080F080F080FA9FD09FFCABAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%85FF0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 -%A9FD08FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F -%080F080F080F080F080F080F080F0885FFA9080F080F080F080F080F080F -%080F080F080F080F080F080F080F0831AFFD07FFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F85FFFF8508310F0F08310F0F08310F0F08310F0F08310F0F08310F0F -%0831095BFD08FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FFFFFF5B080F080F080F080F -%080F080F080F080F080F080F080F080F080F085BFD06FFCABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F080F85FD04FF5B08310F0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F080F087FFD06FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF -%300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF08 -%0F080F080F080F080F080F080F080F080F080F0885FD05FF31080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F0885FD04FFCABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F -%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F -%0F08310F0F080F85FD06FF37093108310F0F08310F0F08310F0F08310F0F -%08310F0F08310F0F5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD -%05FF310F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937 -%FF080F080F080F080F080F080F080F080F080F080F0885FD06FFA931080F -%080F080F080F080F080F080F080F080F080F080F080F087FFD04FFCABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F -%08310F0F08310F0F7FFD07FFA90F090F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABB -%FD05FF310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%37FF080F080F080F080F080F080F080F080F080F080F0885FD08FF7E0F08 -%0F080F080F080F080F080F080F080F080F080F080F087FFD04FFCABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F08 -%0F080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F -%08310F0F08310F0F85FD09FF7F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F080F7FFD05FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF -%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F080F080F0885FD0AFF5A09080F080F -%080F080F080F080F080F080F080F080F0885FD04FFCABAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F -%080F85FD0BFF5B0F08310F0F08310F0F08310F0F08310F0F08310F0F5BFD -%05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD0CFF3009080F080F080F080F080F080F -%080F080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD -%05FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30 -%FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD0DFF300F0F0F -%08310F0F08310F0F08310F0F08310F0F5BFD05FFBABAB4BABABAB4BABABA -%B4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F08 -%85FD0DFFAF080F080F080F080F080F080F080F080F080F087FFD04FFCABA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F -%080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F -%0F08310F0F08310F0F7FFD0EFFA9080F0F0F08310F0F08310F0F08310F0F -%080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD0FFF85080F080F080F080F -%080F080F080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BBCAFD04FF5B080F080F080F080F080F080F080F080F080F080F080F080F -%08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD10FF85 -%090F08310F0F08310F0F08310F0F080F7FFD05FFB4BABABAB4BABABAB4BA -%BABAB4BABABABBFD05FF370F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F080F08 -%85FD11FF5B080F080F080F080F080F080F080F0885FD04FFCABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F -%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 -%310F0F080F85FD12FF5B080F08310F0F08310F0F08310F0F5BFD05FFBABA -%B4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 -%0F080F080F080F0885FD12FFA931080F080F080F080F080F080F087FFD04 -%FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F0831 -%0F0F08310F0F08310F0F080F85FD13FFAF3108310F0F08310F0F08310F0F -%5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD14FFA90F080F080F080F080F080F -%087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F30FF0F08310F0F -%08310F0F08310F0F08310F0F08310F0F7FFD15FF850F08310F0F08310F0F -%080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD16FF7E09080F080F080F08 -%0F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B08 -%0F080F080F080F080F080F080F080F080F080F080F080F08090EFF0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F85FD17FF5B0F0F0F08310F0F -%080F7FFD05FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD18FF300F080F080F080F0885 -%FD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F -%08310F0F08310F0F08310F0F080F85FD19FF300F0F0F08310F0F5BFD05FF -%BABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F08 -%0F080F080F080F080F0885FD1AFF0E0F080F080F087FFD04FFCABAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F -%08310F0F080F85FD1BFF0F0F08310F0F5BFD05FFBABAB4BABABAB4BABABA -%B4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F08 -%85FD1BFFA9080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F080F -%080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD1CFFA9 -%090F080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF31 -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F -%080F080F080F080F080F080F080F080F080F0885FD1DFF85080F087FFD04 -%FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F -%080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F08310F -%0F08310F0F08310F0F08310F0F85FD1EFF7F080F7FFD05FFB4BABABAB4BA -%BABAB4BABABAB4BABABABBFD05FF370F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F08 -%0F080F0885FD1FFF5B0885FD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F080F -%080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD20FF31 -%5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD20FFA985FD04FFCABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F7FFD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F08 -%0F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F -%08310F0F85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F -%0F080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F -%080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F -%080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F -%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F7FFD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F -%080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08 -%0F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F -%080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F -%85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7F -%FD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85 -%FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F -%080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F080F08 -%0F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD -%27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F -%080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD26 -%FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F080F08 -%0F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD -%27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F -%080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD27 -%FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F -%080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F30FF -%%EndData - -endstream endobj 46 0 obj <>stream -%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´Ù243wdEÂÝ#؜áQBöµ;;’’Ì -c:’Ì,rɗهÙ[ý>U(`æG±9ӕ +34ÌÃ¥ÐãSÅßýo_ýöËë¯_ÿîîËp5ìž|ñwwxs÷ìÝë7?ݑ¼ûù‹ß½}÷¤ýæÇ»q¾ðÔõÏËS{òŸïÞ¼½ýê§üÝUÀooñþxsÿöÝý³W»Û»—òЏw?ú1~û÷ï^ÜÉï~õôw/¾»ûòõ›g¯¾¹»zvÿcÿ©ñøì<6ÿdš~2 㲋? óî«_ò‘g¯þøìíÛû¿Ü¡ÙPØêþõw¯¾¾õÍþõÿóÓ]šw_ƒwÿ˜"~ÿ÷¿¹{ûÐCW%-|òøúùw/ï^½ûêÍëçwoß^¿xýæíOw‡?K_~ùìùͳÝÿy÷âÅë?ÉÓ×?OOoï_ÜI§_>{·'ŽÐõÏÇééþ»û_ÿ껗¿»“ñ˜—‘ôð”õýÓ[©HêÄ¿IÏOþRH¿½{÷N¾Ošã@ÿægûþ+„Êò£ÿö•ôÿNZ|óow¯þûkÍo^ ÞÞ}™Æi‡ÿöÛ¼{ùí Tö}JóU’^ó¯þ‡ú°t‰~Æ«’—e÷凫y¤Ò¯F™“ݘ–«¥ØmÔîþx÷§Ÿî~õú՝ Ðõ›w¿Õيqô¿ö«ß|÷âîÍ?½º'=“¶èýòõ×w/äVÅí‹g–±ýמøÇgo¾¹{'“üúÅwï¸$‹·"³ð‹g¾Ã4ŽÖȯ¿½{õ¯ÿ™Ÿúå8Ía—Ç°d Æ4•Ý’ân,l$I;ãìíŽí¿V;ªBEµ‰Œ©ûJfó×oõÓúùéÏÞÜݦ8O»¢ÿa?®J÷ÿ¥þß>W:ÿîÝÝ«úý²¼¿ìËpõË_£Õ›W_^¿Ä<¼å¦¸“öe½xýý¶ýÀßIß}kÝ á©LÛWoî_¡â'_üJWž~õâ;ùåÏÞ¼þî۟¿úýë'_üHÄ?ß=& sûõî׿ûòƒló_={þ‡oîþrwÿü¯îÞݽÝíeݟ•­þíßS±ô÷ÍÝN+ïòGùû÷øû1ïï~/;²U Ôø¿CŽ/^ܽúòÿúîí³wyùúëï^Èoo^ýñîÅëoïvÏ^}½û—go¾}L_½xöêٛQ[èëÝýüÕ»»7ÏþíÝýw/ŸI£òÐ/îÿ(/>“ñ}T ²œ¾•QãK|fÝÚCt¿zTSÏÞýa·—üú­×~ýꛘÅï„=oGŒÑçSýoÿüòw¯_Ü¿}é•÷ÿ÷#¿T†õÕ¯_é'¿ùîívÿøúõ ¯ù—rdݽùöþÕÛ»›¯.¢ïýM5äŸk›çŠ&Ï^¼¸ÿæͳoÿpÿü\+ÿÕ~ÿûû»³]xÿQ«ë9§ê\«¿ýöî/÷Ï^œmñôµ¿¹Æl în¾¾Þy <øÌoÿôìÝó?ì~qÿ»7ÏÞÜß½g·b²ÿêkùÐß~wÿîÎAgp®|s÷öîÝ_Þ ƒö -6#/Üv/´êÓS9núãäË/>häŒÝ¿êùٛg_ßËQ&ÒâÏ^¿øZþFªnÿ–c3ïö_?ùâ¿=ùbèþ7ÖÿÅÝß=݋|õŸ…¼ý3nÊԕ`%ZIü-3þ/5Ϋ’½”aY•ë®ì¥¬»r3ÜJ·µ¬>­ÿ3u%t%®JÒ"c€¿ó8KÉü»teY•ëqïåàe?¥ÔŸŽRãq¼!í8Þö¥>~^ýº»’¦åÉú÷”»R¦EŠþ÷º+{-O¾ø?ÎÏé¥Y «yÝì¶9–"5ÖyŽÝlëìö³\¤àoÌnYÍóÒÍ´üWjÔ9¯³¾÷ùÖ¿1Û7ý¬ËõÏpvÎ'™~ƃÌ/þÆ c®g–ÂÙΛ™¾¶²žcÌ)þ¾a9nf³68—mîPt®êÌ-6g2O2§:W˜³ƒ•#ˍ•[”ºÍН͜Žœ­hã_8®{î™[ŽÐĘÙDžý9ò«Gûʙ«çk…m£­)„òhŒKØK9†[™ö1†cŠ9–¸Ä븏Çxoe8§’h‡)§%]§}:¤›$ûT>i”%ç4Ïs™—ùzÞχù8ßÊ¢e0bNy΢6å}>äc¾•3–©Ä’Ê\rYÊuٗc¹)·²pdN—°ÄE*Zʲ,ûå°Ü,·²|Æëp¯Óõ|]®—ëë뽔Ãõñú†Kj’.Ä}Úç}Ù/ò«ýþ°¿ÙßÊ2“Ñ䠇C<¤ƒ|Âa9\ö‡Ãáx¸•e7r2â1ç£|Þ±—ãþx8Þoo™žpoæ›|Sn–iìæp#«äæææKãVí6ÝJgoåóo¯¥H£·òêíæçtà´:í¦+Ç®º²_•ë®,µH‹4ßJîʼ*©+±+¡+²¥ÆÉKÏÙWú¿éÿWå E† ï»rݕeUJWrWæ®C¿I^⪄®L]»2ôE‡ýÉ6}ú?‡®ìµÔ­ºšÏõ,®ç®ÎÚz¦Ö³#3"5Æ~Fº™XÿzÔm´7#ÌQ•ñZ6cj#¹Ãõ¸mFk=>2^ëqÑ1¹¶²°+ÙÊ̒¬D–`EÖ7£©z*øV¨ÓÆêŸ=˵•…¥X‘Í.›?f+ÉJd V”'×3@øj7§7œÇ=ç­pžçs1pôíkŽmæhFŽÞÈѺáèì9Ez—Ùwô½Ø«#{qÍïÎüÊȯ’o‘es#Czvv-l­{›…ÉEav“ðyùRYR72Øa†×ÂËu™„Q9oF9ƒoeê2(ûåZØiY²0Ö$ 6È 5ʉ}+ â(ƒµ6¼ùFaɳ°æX‚0éQÎö[Y*GÊ}¾&^rvž„­aî£È·²ˆŽ2¼{aý‹Y‚$BcaœåeIßÈdäи–ãÈ2§$‡ICeùâVÞQ¦d/Î"OŽ³AQŽ¢I¤A¶À,ƒR×rXÉ7ʱ5‡$Xƒl‰æVëQ¦Ç,^ÅIŽ>Õ0Ï)ûíD`{ÏÖ'ù¬l0=ú!îA@X(@¨@!"F]ZeM¬£ÖÐއ€2­øÅmw(§Xd%Y_£¬­s+kꎞRø£'ÕÈ ‹Ó*q[×ËÎ,œXr(‰ÀP?g£Ÿ‹³,½ræd ~2â\¼F›õ}—1‚I°¹Ê”2n(gŒ&i$—5®·SaŒ7ÜzÍò3eÁc¥`CévêÏQ?€ëc†ÏÓ5E››p²(bŽ.>©À¨"” -†Š÷7ÒÈh¢»v³ŠâMô¦ÊÂÚj]­&ÖÁÒ÷Ï’?™:‘+ÁƒBG’e¥ì¹f6‚F?<ɎÊ¬zvՖUcY=Ó"ÛòÑ?ÃÌÖ¬ì}ŒÌ§c³•?ËFÞ»|]KӘÊJ—ʦ_iI+Ìô2©13Ð?*ó¯T⵶WO+×]›`‘Q\i‘JèUóÀß˦”Mi«þk6]¶/ñ¤„“2)öGjìÿœ¨ŽØ½ìçÏa-² -^ö^®/”åb)UÔó¦Ì,M{M}‘W?»…£ýû´„ …KCjœYÎ ò™"5>îÉGÿ9k+ø¤?Ÿ¯Æîx}`Uú­RüъÊmÕRm#Åtïj;±}/»ZõôºÛ«=¦m…íÞ®²oÝËýîÝÛ®®V„Ó½›Ýê0[In“hv©ÐïV·f<°Oå_n i¶±ÍÞ¬»óÈ£©ÚXzÛþìÞܯ,s§»³Úp¶»µ¬¬|Í*T-Cçö«ÿ¼²¦“WÖÆË»rm¹ÚÚ,Ïíۇvóf¯rW_ø݇ïèwõßÀüü5^z{õêTÁR©åTÁª²Ê@…ý†Éb -æl2ÉäêÕm'•ä•T2u*ÖA”,ªXO¾% j–*YP³ªXªdhuRE«¸¢Lтªu5kOE«Ð†%«‘ÊÖȍrKýûˆ&¤‚"ª–*[P·&U·¨pMáÚSá*T¸ r•ÉÚ1µë–º4/U½ |*_P¿"Õ¯‘Ûê–*؁*”0¨aYšÅ£¢i‰Š¨Œ‰:F{Ð ²£(dPÉ ”A-ƒb–c¢jå,u TÐnM‡ßk¾P¾ƒ„—)åÍx!àÏH«qvˆÁ:!MŽSÙ­P=C‰äà=ïî¸v'…U{®þÝóä^†¢¼$ü6žÈFÎYW¼t%Ù¬¸æŠGʎée” ·;Ëç/Îȏã¹ÉgÞÕ®Šjé-dýŸµQ°3u®ípõÌ¥Ê1šJÛJX•µÍ/mʼ*"¬,‰yec,Ô±ÖåzSöÛb;OÊéŸÛÓRW›0Èþ$ϔél gKµ"ž–t¡Ì‹Û“¥Æ¼)åÁ²¼§ˆH±²jŸ/ûGr|©ñðÈr|\‘O©ç¦òÑEj¼ô»üsæxýèšÜ@4¸Ö:™EK´¢öÔj_ÍVªýu±bÖY©Q­µõOem Õi©ü¶êÖUꯖbµËú¦yJËì¥Úš‹—Åʵ—ýžu„yé„cãU͏pž;u|iå§Xñ¤ Üèê9Ϟö Ë¼çž³â1ÆghK»ÌcÎp–÷q©ñA>ò²áôr9×øhNÑíþ‹|â‘\á”<°«.Å]ýAfەáV»ƒÚRé(†,¢ìAçÎa¼Æ NãÁÜÆp'ºŽ‹žÕ}|„Yu Š¬p"ËCA¶º’áL¾¡;YÊR(ÊøÇò5Ee8—±™ÔÁ 3äOº™Ÿ|AWsTNwó^ØÓѝ΃H‰8áxŽò¥3EøEÄùk:¡Â>nÌ=\ˎ¡¢ð§4ÜÒóu¦Z°tîi:¨¥`aB^i« tVÃ] Ù=Ói]DõXèºVçõÌ ý–nìÁ¹p忕óVŽÛ8­ñXᷕ»6®Z¹i㣍{6®Ù¸eÏ#f¡v®¸â†®e²žÛ­9œ Œð²ÆÙÖ¼lýÎHF§ü©—yÎË5—¸ÎF*é‹Ôøy/×xìéÿñ»ºšÃýê Ùãn’Í»2\EÙ;»€^ŸððoŸ|ñwOóìþí™:¯’<™†]¯Dœ/W¸}µ]s^â(¿¡OðJ™¢ü#§É~=i^vx@k™®Âbkî“kÒïD©M³<6ȶŸñ¢h梺³²%¦a!]8eLò ]eájNÓ}ÖgªÐ¾n„Ï¢²4)óÅ"üY+ݲh“ðYT&ӗ–Uei–þë>O…Ÿ0—S¾*!,¨ª¤¼|ê„n«;·fíã—åJøüÅ»~ -õì ¿Y!˜`™ÿpÿòåÝ €2í_Rq¬Ìÿì¬óÖæd¬2™›/c¼6Vxì}¶Æ梡f(bzœ  OyÈQµçávKó‡j3³kd7äpÀSáàÒC뚶­ã4¡"«gDm»j#Æi2öR]ž;IÇ©#ÐÒÅs.£Q{Ëmêì4Ž)"˜G%lÍcÙÐ ŠO0„ d7†Q8$w{>Œ½èÂ]l—~²æ†ïñÍÐÓ»sÇG?­—ê’?úÄA>3¤²R!|”ÅÀW(Aî‚Ô•dD id ”®’õŽÙ½É:ʆjh¸†2Œgƒ»4©9,›Ù+š}lFáGcS…KqOz3«‹zR<‘ሎŽº6ÄP5'C)"hàqsâtÝTK¢zƒKωôL):S’.4^SžÞS–Ù£àtKɺÉÖ -ÅÄ<ª|­v“±)e8Sᙐ³!i‹ÄKi»PÚ®òöq%so¤n“¹±*„“rw•¼e—­eo¬’Å`ŠŽ7îœ(yWˆg/y(yß@䒹WÉ;t’w6©{O©ûH©[áŸMގ¼ YÛ¥m‘ʏ”¸«¼}*q'“¸)s»¼½§ÌM‰Û™•AÞ šÜéN;ý÷ÿ{M5C2qfV6—ÝMsÞÕõ;º¾«‘ºÂŸG7[‡Á·¿ÃêïhŒºB¥“ƒãÕ$.Œq<¾‚ä³ýWéú_u{¶ÿ^¯LïGƒQWùBÅ%ó&n— €:)®T,ØG¡ÁFgקpÐÝÌÁf âÚÍÆ[svSóÈÜA™­t@f©q f>®À̗×g1Ãú¼^¥²²¹‡1¾foͶ¢Óö¾zuý.< -¹ŠeeëJžyT¶õ f§\^]Ÿumßؐ:¹®s)²²uµg[ñ3µÊ1ʓÉÛõ QGªî€îîÇœsfmöå¼Ël:1{Ÿ8œ tXƒîO‚dž„>l@ùç Nƒ ¬/5ž …Èç¼q^ˆDӞŠØE—öЈà³;iß¹[Ú^ê÷S·«N YW‹¥ö‘9Cî‡Ö/Ü£@ýFaa‰¶„K1WÁ2)¯”xyº³v}® -ÕðQæyñj\Dt.fHÝV¡vžf7™¯DÒ*Ý÷|tú9a‰°Ð„,§‚½<ŽY”tÿBoK^Úõ#ÍòêØYí>¹&3•!f -K¡ùKŽâZ:‡Œ -`dÒ!¶z–«”¤”èÌ@ŸZÕšn~ýæù»ƒñÆÿ-ÕL}DíÕ,’1¢äkÂ$‡g¯•£±ŒÏÀ”·µÈڛ»ú¢&ë°·vö’`‘`cz ÕG¼m°Ç¾‰±‹ó•ΫiøØ ->pð‹o0ôö/šâÚÀ÷rz•ž{ ¸LÍF¬0ƽ‡ßT}ËàÎPBªN”\ïɮݴÐÐâÛk/-œ—ʺL+ì´ÂP[ ®BVÀzÙfh5 îÂ(—ª½¨Í`鴘½I7ÕrnŒeWVDë„.ªù²,©¾Î¥–„jMØWùÅNŒêBQÑ|2”¹™3’U›DȤ½è4Z–ŠÙ´˜ Qî’KK(GÉRÈÔ¼$/íOöR¼\{Ù·"5ºÒ`k·PSW%t…Ã÷䋽¤U9ýS6e9SDØÌ×'åp¡(î܂aø‚³}øàÂ- -Åô9ÊÙàæޜ=Àyßö츎­)Ü¡ûª});Pí «î¹ÛÎ>ÐüًÅ;«[¬{¶6Ù/º?tf,ºÐ–zm+û†v5¬å@ër²U -«ÚžkòȵX}ÙWTóc_ӏmóH(èH.ÐêYíh…æ}ØÑ ª m0Z¢Mý֋{­fðKœ(n7 óÅmhôWӆöÏºy­—Î~v`À5lÚ7†‘tµ¨)kõLU¦!…ªçZõ“†jH †â„÷W¸Ÿñ³œà}V^ìßãÈS ×Xž*>o;§HS”à¡ÃžÃå¬9Ñ9+åd•}ûwIIZ#tâ|à%làƒ¥ÚZÆu,t‚®ÑÏ5î¹Å<×/iŠš)aš¥JÕ:ª¹E‰WU¨©=-~ÙšN9Êk¯ÜԒÓ(å¦ÖoTú^•7¬ÅZ•?oh:Qã7*¼)ñ†¿[«ñkE~­Ê¯•ùbVîì¡Ì’«ôM­¯ŠýäO†N½¿í”ü×å<ÜZxEm¼ýY¼/íXk‡tò[‘CWZL߸*=îz Ýè5hNªpÈÆ«²?)כrîhä±ërö`§ÑîrqAIjLJü࣍i4>Cù¨Xø‡£áB*;pDz¿%]GÅ÷qñ杕Õ=¯<´ÍG{\™^W†WõÖº¿¶zl¯}ž³Í“Žë´ ä8¸wrلs„f|5óëM–µH°çVXÌk™)ÆV¶šb›{íÅna™R°¬ öPoö´ -ø¸![‡},”Z²›l“Éò"2ýHC| ÑPƒs×!¢S ÑÐÕBèl9ª‰Üš¾¢ UÙޞàk3×°‘>pd6ÅԚ «’ÚRÙτ ^ -¬a&ëa‘õLc[:QõRØp+ñ\±Ÿþ9ì»Kvüìæ¦Ü|LyfŒ˜š²¶œ ÚÒPD+$|H¤ßÅÌ ö£±Y’Ün´5p|Äëhcø§W¯ž½¼ûz÷‘v#ì g¨½Ñç\¦ä*J—…i¼ú¯Inkš ¹ÝÂm×9Ö@[…(àz¯`trpírâÖlƒx¢`Õ¯¯É Z¶½Ø3+ÖÑ͏ÍøðtX֟÷ꃾzo_Ý.ôã¾ys=ߚ¹æ$}ÃY*ÎÝe¬ÛL¬ó9}?yb>S–˜ká-KÌ÷žÝ懯^õÊ©bNrOY½ Ðï3MîWj×:óóŒó3Ô.ª)œIj•¯ˆŸÌk‡á<·:RJoùídHCì÷!0ð”…û\(,²Ð¬z#ûWÍ:…;VáošÃN&Àáoùd¦YòØe­«ð·dÐrÖe -``A6=ù¡MkX“šVÁÉL2ë`‚Þ0s³À„SÍ3 -ršLù‰f¨©á³©PU©jzJýcÊÕ²ª¤U¥míllñ2«-íåºÈ˜NJ8[⅒ÖŔÑVæG•|¹Ðw}¾”+ þ¸rF›<-äñË5^z¢“*ªü6;WQ©m¢äWY3'ÂÑ2e57é¬ {•&”rÉ Ò@Ÿ'3Ð@<ôҝpÙÀ–Þ$*\ZÖð¦up“ó ,O›d9»qXø‘ð¨}ädœÉB¢Â§UÀSò §ZªYCÿHÆjêð6#J5­4³K‹¢ifšq[ˆxj%œ)ñBI'…ÜQjœ/–3þ• ¥­ŠaW>¤œXÖEj|ÏZ]ã£ÿHŸùÏÿ5>ÀQ “ÜX,D¢r­Î)Oü6›ÎQ³ï‚Ÿ˜®'å@-CPš{ZÞ­ƒöÓ*﮺š*|»w3ç(•§TØö™É³\¥ò•Ì´Ê]®WœEmð[ÞÒøËdÆe’™>å´î8MýӖëšÏ¬ÀC[˜Tå8*G­¸Î%î3](´1F_æHïãO^¤Æ~ûåa®÷Qå‡ÿZ5~`\Ô£ÿúÙÿH5vf²ãI:á½,ß|“d "—îÑò¦Í̗60Sڞ&¯™æ®Ñ2£íe½©s F.˜¸`ނ; ®4u£iÜ‘ÙÏ4Z!Õ¬gt•yzé’kŸH5.á1©¥·É¥=½t‹Fxò…¹¹ª‹«º·‚E%ŒîÔ:v± ×]n³æÆ¢ KxÔ´Êq¶v]UÇUsZ5—Uï° -ÍYe™-Ç3™-·nª­“ê‚{êÉÕ%÷ÔÊ9õcJj¼à˜:ç”z„JƒÀ[)vOÇûË%ƒÖIa>ÏÏZþרñŽòGù£üÀQ>_?p”8ÊåŽòùj\¹Ù¼üðãIï}žb:Óã’•d‚’sRgü8 |ïÌ?øÏùœ#ÿ³V[}úÃ.Wƒp»•gó+Cš•ßÌãMìB¼šÇ.Ý֏ljÈRqšæÝ4\…iÉçjØ>ÒjÈù¡§:aº€G˜€GÁ3¾ÝlØÇ ûb©§Ýõñ¤>¬xM[À5þ<äù9ñRyÌ|ƒÆ ?:0þô -¯roÔY0û[ -s‡‘ëïùìïøܔ¿Ùšú”MOÌØìk¶B|vÖ³¶šqævãºb7<‘߸d—ùíN]Šš–f©t –ºôJŸå™5 sQ&•Cµð¶†È|w%Ž¹í†—a:ó P¦ÏW§ÅF§aYdZ/<û€˜ã ÏjHÖ ¸TÐ}ÐÇU`­–Þ|þñùtÖyžqN›½1ç™û²2k°M^ŒK°é#À¢ù,zæº뚐Á+`lá|oÎChWý²k Ž†¿þèè{ÁŒàÇ5 â{Ü`+҂…m¼§…e®Ûh¡!§¼§tÀÄ5Ùþæ¯m g÷CØîÖM›¼¿}2=Xn<×oËô›ºëù4+àž),³oÙòùΞÇ÷Úâ}]Óɦ1ÝÏD%4di¡ËmoñÚ75hð¥ÐEbà 'ÂĬñÖð? ªúÆ"¨ƒ)Ýq}|kŸWP÷ç;Úf<êsMD ÄÔ¼G}æ£.Dz Áñ›UjN©8Ÿb|aO>b|fåh²Íöø˜×õ4“‡é?Â8æ€ÐW…¿Íeîó¦ö ~È[Ÿ¼ ËùmX¶)X={`ÍØgì®ðYÛêr8É^!½ ºâ°^çÆÁÀCˆio×÷åO}g•Ÿó`.ïÀ=¶7'w°½äí\¸CõB²­¿â;½ÐŒ¡é#R·é¥Î%˜Ï$˜²äRT€šÊS£K1Ÿ5–Ô¿ÕS„ÊâH+¶t¹²«jlg œZd ·ÝÚIg[›Hyå-6V(m¯#'[Yƒ³DŸ/šG'a%7¼Øjá…Va?Êx™¯v–/™¤]\XµÐ¤Aaü Â.aò\dµ%YuÈʁ˦ö²³ðþ ›ø–‘…×¼D -«Ãï0=/Á=êzØ÷ÝØ Ûûâ趻½ÖeNõû -<´ Ü.qÀ5dÈcYÖÙTG“dZ@ïïAú‹w®V`å3w1<Àk·Ü–iáZE@q>„böþæT×a]ÎڴʶѾñWßòõ™Ö¹èa‹  Ø€ˆ§á¨Ùò:§DµÉðLðԅó#œ FÉÌ•…:{Ø醧H8 L,‚’B!ôÇ¿®¿ïûÓnûÖ ‚ ‰ýè+‚ëíÛ?|Ý'~ÝJe?L´<ŒÃBËÃ< ¢ä•ì™ˆ¦ âNÿђèû+#>s½&²Æab‚²4#üÉ(ÊSÍjÙ ¸J`:ó¯sž®Qçûoý¬õš±èӌÿµÎñ -Çõçs*lêµqûÝfþ¥q §h˜‹öŸWHœùÇy5á3Õø©*D<«AÄ­?€É°Œ©Ø- ·¼a¡²Nܯpki–ÀÀ5=¹§7v|3à€DÓuK=¾º Úuý…~µO±OwQšìmÑ6WW¤m.G[_ŒÖÃêח¢u×£­²{>|±ãã -îmýÀ;¶ÞWþjtá¦Ç^GšÁ(S …D«h¸÷eÉÿ2ӕì ×Xy=ê!Z:2Oû-_5Ýx„Übz¢Ñ&zÊ<â¦åЩÍk5XB²‰&jv½biìZhXƒ%wŽ mº¹íöLev¾¤³%҂s®Ì[x Øg-^£¯‘–]¯f¬—dèM±5•e¶ÿ/½¦Q‡):x -ö‰›>azÿ_üÝ'¡ºtô}lÀãb>êÏ5>öv¯Í Ûó j®uƅίqÞóúfȅeBH„! F^Ë<ðBfȁ½¨ÐžKR`'º$x4xʵÝúP¯P®w¾†ÔëéëmíŒþ²äþ*ùådù{*PÞ&pþrä÷^Ô~þ’ä‹—­ô¥ë3ËD/7ÐËÍm>=$®Xn -ÍLáY)¾­Èl\ÍøîÖ­•á}ß彪†÷šûª7½e Ø4ð`¸q#üѲ™îÍí9±ªY¾˜q¾þéR¾òƧ¾Ä“.”é|áí6çÊø±…×´Öòá5:У¹+z‡EuYŒ'ð -þ(ž ±Ï„!sZeAl×<&ÿá:"s»yˆPð҇­s›¥³½Þð†­K嬤ûžrpÈg+ 5nmˆÿþ‚ô÷Rãƒ*‰Ôxþ7ç/ 9½è ¿ð€êØ§W‡Ì'™E×ÙEǓ]U÷Ԟ·g_›Ë°ø…5ч-;ÑùüDãæЫ9pún ­Þ€ Çý­|øž~ž>?sþýéOªñ¼b/¨"¦¨Ð~½.'JÎ&×v”kj“«RÂÏkŽðz²iŽq=yT,ÒÔØï©ÀeËþ)NȀ¸5ŒòáÁ2=f—3¯£es„íPÁä°Ân80~•S%Eµª”¸g^D•)šDIòä=Hy×TP ¯¹ïíß_Bú_ãZµ³°oF¶;ɂã›úÿ6%²bŸ‚ßѵVSª³UQ-E5¯T\+Šó‰ãsòç¯Tãà -Å¥ûK­P[?½öm{m[¯¹zt2˜T§¤ÆŬýÛê—v×N®]}QüþÖ½eO¬îÌÞ¡ùKó4‡eË`©×O,î®Zgd;0GÒDK.ràu¤~Çí¿» ýI5^P9.ST˜Í`]N•œµÔ)Hç. ý +{ËÓ®•¸éòÁ ž桬0—ܸ½w^]ìyè.õœèøL×z™çµe®«ÖòÉl兎Ç-ä#]I>q‡Âüû ÒßKª$py|H懯¾ºÍÞU©št~£põªXSÐjֆ¦ÆÍæ¯Èír©qñ ꇕcíŨ—<4(ãl> óRˆhmÆ“û´£âãWwinŽgÐtY`oÂÍp…‘Ã᪖‚”ÌÔËn<Úåx5¦Ü;?­uª¥aZ1Æiæ=[ÂLǤy瓫²»Í>¨W%ï¦x•×_òÑU|ª#/uä¥-"÷,Fg{¤=:1pŒ'h-^gìnhF2¯uÚãzkl½áªþ·Ýtº¾+¶Édaûsw¿ëö–×­8 M¤³õ-߶úá UÓ;7Yqe:×·¥·,ü-Äíï¹í®Y<½ dé.H\ßý6ù’‹7‚4þº³}©œº ‰—Sɹ^–7²»&†cˆ´ôøÖmÒÞÛîדýB¸¬’8e{µÔ`E¼à¸ñò'ïÄóàøô:BáèøÐñtü¼œÝ‡B>µ5>"jëòu¦0~~ÐúŒzä"|DønY·;«ŽvKs½·ªÝ\Uü檹»G«]4Ì[ºÎœÌ~×ëó£^·Ë9NnîX/ÅK|êªËç±|"‰¹AeZÝçy_÷À5+äõÅø½&ÍçÖu×B5¤u„àq­Î²‰ Ü^Qqò͗£//ìËüuµ¼äُåÚošÇºŠáÜУœjThdAC;e˜—ÅÖ¿qgßÛ Š·»è“+û^¢ -ÿåîþÿûÿÓî·Ïÿð§goþ‚m³¡üµ.¥95é}äµ4O¾8I[\“ ×¤Å}Ââ£ß‰¹N€^0»±$ÅS‡Ô_G\¾„¡¿‚aßE|J„Ä¡»V”d?2FŠç õäž[CÐƌó}_ùsbþýèK˜¨èòš©‰_“ݬª«¦¥»®2vKy ÙzaD•®oì&ßG¤Ñߤ»6£æƒÍÇÅ¥œ¹Üãc#S։!ºË=¶©AŽçÓL‰¼ÊåÅÏ9ÕÎÝŸ×Oj<åxg4—³©¬×‰¬-ëÉŸƒ•5 -«Å`É*ûè(,s…ìÕêA{G8Ê©.eDææ|™ïíN­±ž½U‹i³m?tübE/ÖǖäOÆ[!LôçiþŽJô·Nóg±["ó|Rô–FOj—Ñ[²Ê>:~‹ˆ] 4fC꣋½u»Iö“ϧúaMü°&~X?¬‰×Ä:-ØdÌ:Íÿõá/¯æ-¡<ýÕëW_½¹õîþÕ7_~Ù«îýož|ñ«où» ¿ûêÙ»wwo^‰VýâÏoß>ƒ6oÿÚ-ËÕ2O ÜÀqžÃnŠñjÙÙMã|%‹kÖ/¾Ö¿þõOøû;ý¡:PÿõÏúó‘ÿ¡þI†b÷ËÝûïÃîë'|ë7x ¶T+Þ½õ¤½Ý/Väú]¿è«8K\Wð -ÿùÉõ›wÇûçïî_¿zöæÏ»ŸªQä'ûׯ_ÈXüÜÆåéÍ×÷ï^¿yºöüßdôžþãý‹»§¿¹{þîÇ»ÿ„7þwüÇûý÷ßi-Gíô¯u­L¸öR¡ã”¸j¢¬–bY"íÒàRlK²û×gZ×z$Ã8^ aw©\Ql ¤Ÿ“T´KËÕ,2ÙNXÃjKWÇÝTäqa»”®Fف»ç|­¤+Ùäa—¦«¶¢E\Åi.»¸\‰þ€K“ç«1Èó1\Ɏœê{ËՐô òÛÌê3››ÊUšàv(ÃUZð~¾ -0ëk9^‰>³›f„>Kk³´"Bé.LúQ á\» Ý Ù^ê(ÎN¦½Œ² -ç|%"ëÀ‚\Ñ©drÓÂJíÜØ¢)¶‡D26ÑUR ֖½V©2Û2 ;¯'cãÜZ«{O?©=U¿ÙëÙtm»øÆÝõ·Ÿù@EXÏŒl5ɌÉLËR½ ‡‚% N#:qp‚ñ°¤òI{Ls†DäõT‚5gïUj¾‚¾¿k‰Üd)´öŒ`ïÙWùSõ³½žMïºA4½Mñ3ìáQNʹäaH(˜ûYfIDµQx¾ÃüÂ1OØÂ…²ìRÙÓ 6‹­Yt °$“/+_è« ›L¶Ä<Èf Üß"$W‚4‡anOÉV"¡ F¨?Œ*âόy!Ÿ’íG{Oª’q|kös`„’ƒˆüdD¬ŸrqÔ„`Ü(“,èè¯:YDk˜_xB-˜#°]øjv¨~á´QôU9‘Ed/݃ò™9ÅÈ’ -QGícS}µ’ÉZ‚,Hh`ì6r’©’ݺ0b®êË> \Ór¤Îd’¯Bı$‹sãDf Ç昻aš™«‰šš'lXÞÈ3ÌØì²ò2^–îœå2hBžƒ=@ÃȘ†¡kÉqže«G—a¬ûI~Š³|¢(ÅA4 ùTIá©»eÐØ.ÖÓcºW숦r•Šb¦tiwËÊ!ÈÜGáçH•Ó(¾VbÁÔ´'„yìêr‚µio:Y†#ˆ’ÖÕ%âì,Û¨kÔ(öª?èðʶ=mƒ1.¦À>¤É¤~ÌsIXܕ,j¶ÈñØAÖ’VóÊäSãd쵒v]e²AFüªµj{5\MÂêûå@Ú¬«Ì)ëVìŸç•y¶}íÆAö ÇHÔäP¤å—k*Bv]ÐáŽø%FQ7–e%8—B– öØ\t†½"'X{ÏëâSjõ¶W4Y¯¼=#Ø®¯ŸåÕ¯mû÷Iï“ \ÐB˜ªzƒ¸Ÿ(nςr‘€;­­1Šô&*ÜÚ ÉV°Å Zª~Èjª-ˆ¹²ÞâÚ …Ú–´ÀKÙ^µh´”YY´ÈNÁ«IKºÓº›´@˜äƒV­qŠKµhý†IÆ Z´È1ó+‹+ìWfС2Ìóâ­ú@gÏG'¥}·º0ñŒnÏ'Ù e™×ö,Ps‘¡Ú³\v¨ö,l;€Öö,°fœ´dgÁ ïö,ì4¨'+s–lȄY©Ö,a eæI@c–ü"¾¹·eQ„¡³¤Ž€³e o焭LY"ªg9iܒ3i‘A¨†,9?&|Ôʎ5ªøÑ YáˆY YÒþükCÖ(Ms£UCÖ(«7®]5:áÇ\Ä+CÖÍ8/nÇÂQ;éXµc"ƒsQ¯ìX8Ô(W;–´,G¸ì¨jÇ:Ùj§ÇƒšÆ¸¶c9µÚ °8 -“™¨Æ‰ &Wf,œkÓ\Ú3#̦°õÕJ*ae\jT³Ay=ÕJU[Ù²ü‹ÚSµ'µžm×Öì\¤¨¸¶e5ª™ À7ÒÜF%+BԖµ) <UÝcƒ6Üꩄ޴Ԩfj™ªµ×›²ü«ü©úÙ^ϦwÿSY²>Áˆ `*C‡È;gª«ÄȲÕg1îâðZ!Œj§J©³¡¢Dilfà ÚR0k)8y@X™;/Ì7“R¤¹ê`…ÛTLùðqv‚ù ì«ÑFƒÁ? [/ż•°,hÁÍFÅ6f|§}’Tã  ûðĨJ±Q_ÀáýABìÊ)÷”:¨§Fˆ<¨Å'†HQfkdaž¢ODµ.Ó±1¿fµ‹´07Š!|$MۃÜ]UúsmÑ é‹êƒˆ¶»V ”1N¡·W)öbý0°õ©VvÒËïQFrÄe9ðãÆ뵇¾ºýð\˜€¯~?¸)ÍîÀ3ǟœí"CâÍêùåQ}¶/pþˆ®POÕ÷G!1° uþáx‘ÃylÞ?¨!"MùR÷”g9Û§æÿïãǹgWgS«@œqr@‘0d ˆÂê 6Y÷>—æナ'’dnn@a†Ò<·d}†šXµß©Þ ÷RƒÐ9ac(îÃ1o åÖ§Î\”vàH¥’ù©ºC©q $W9·¦Î!1,UlhA9ò´_Õ%8â̕IkNAZ4ÒèÎDzÑ}õûT· ”ÿeÂr¯ŽA ã)VÏ µ¥ý¬®AQð…ÿˆã¾Aá­"-Õs«:'ºpÊؼƒ|3R݃0ì¶eT݃¨¯d©Âýƒ°Rßq¡œ€"àU;’»§ J¦|“û'°Ë‘Þ?sÂÁeºöÂôDÕ݄ÐX£ úît›^vân³—r‘c€…꜃µ„}r'žSÖîÂîAz»ªìgk±w‚-ˆD»4Ÿ!tcZ—½=§¬½†Ýƒþñ^Ù¶—g‡2×òcÚxaäá"tÝ4Ê9œÇæÊ«„µë°=f>Á®&§X“kç!f:AÀnuA·§®I#¬½‡í1ÿx¯iÛËÿ R—0=óÛX#ëǹIe¿­Gî`>9¨³P‘iö&E8#)®Áj3bf¨Âó#Ì;ÂCÔ< ie•b -XPçc{¾Aªà6 çw2†6&0f5•úªœZlU^LD0ÑBh8éê©> ¡Á2—†îàîÈ£J¨ †q؁—Û0Àñ-T)¦çUzۃ˜ -tÇVW£ jdé…¹VYV1±kµRž×Iå×µçj¼®“ž¾Gú,.jx—¸$Ö>jؓuº«“~…!®]½Ô£O0HlÜÔ´YóÕê€_Ñe甐úEæäXYõTO)Öõižj§¬=ÕíÁꁞ¸+BO ¹[eŒiM½ogސlºÖÃtÙ]=A”ÆÅ/7dÞÓÜÖ~ÆV/²ÖNëö\õG·ºÅ];®yÓDà•AȦ=¯6Z kßu÷œwÀëÚöô{s_ƒ£ Û(ÍÓÉUót[dÕ<±LhÂYiž`/¢3L®yB?™sqͶ ÝVª§«êé¶ÀªSÂ*ža]©žÐ'‡NA…m ²*žõç•ÞY‰®vÂlS—+“ôN8ŠVZ'Lg9âëüA¾ªužèËլƑµÖÙÈUU¤ˆöǪLât诵Nڙ ß´ÇÊ/½2§¬´ÀŽlêb«¬ª”­Õ•îÙ>¯=è=óʶ}½ì ÿ$Ó|L†¸þê—28=±:5gÕH°Ûˆ=Nqû<í¬ÝƒàGl•9ÅZuÆbäf -…±herj ››»V+Å­ûæ\õ½ ^Ù¶¯ß£o|ž'Uì`ÕDYò Œ2Çh\Ÿè~ȋvŸ3äÂQG«Èj¡× vþiTÞ*âÊÄ¡.T3xa'ø‡¥yš²1ÁgŠ#\Í>qŒ™’N!®W]ùޑºjgÜguΤÇjO5iâ«ymB¸Îa±ºÎaFhCä…¾\:å -)p£ÇDtÀ8Óo7»ãCE?”³$Ó{ð 4Á4ê4W@²Èþ"_€RpEPC™Ì#v¨öìN©2 ®›«(vÆõC0JLîmœ`Ë @ÀŒ -r’Ïó¢î:ÚåaɛðIsª¿©Ì%W4o“†£@ûԅ%ujU²#šÎKSYä±ÍÚOƒ«ÅŠƒíM)aõ¹Ñ@TOiôE>Ùb=]ö§Ü˸=t‰V»—²?…f‘c"4{àå[x|Dö²RlsȀg0Öö œe©¯Ê~½°n\w]50DÁt×Ú3Š½èæúÇ{eÛ^v^AY¿ô¿aåó({¹!/jBü†ž;(҄e9O -ÏsŠ6FE%uÊæÒª2§X«þª‘³JÀ­2¸wahm­VŠ½Z?¯=è]ðʶ}íÆA¦gI8—E$ó嚌vRîZ5Ë`Ba9̅('8ˆ_hÏE¤ ]]N©Ú«N†¨D×A­ €H1µMûÙ8Gý´úTëT­è¤›m`ó¯pªçP=Ä9BrV\¢oj^¢d«ìDÖP)Ə`7±¾’ ]›æ¹UÖQ¬U{ÕÉDÁ²ë*ƒ["¤¾U£<¯lŸçz¬²Ó¾vãà’ž­%úOuí96=ÈðàÃ<%ÂÊ(Ý-ÒßÜ(Ï«ô’Ò<÷ÎQºÊœR[uaÂÈfi• We —7jsZԏ«µn՚N:ú½ ՍÃ$ȑ¿»ã<›™w¶¢ÝqLÍ Ž¬ -w‡Õ#wTÀ;Tº¤ñlzÊ´xä}¡h Ÿ bÞ! B–rÌ;ÆL=¯ôŽgCr’Þin‰sl¨wÊDŒú«°w0Ý°laïèYŽ{‡)nã:¢3ǕÁÃñ*tkè;´¡ JÍyª^ëxt§<÷ñÇÉÐ=hÐö®®J©ºBeärPY«Kښ2¥ÀÚh¥¸ü˜bèŸónÕª¶ý¼¬ú<Ýs“ã]YQ'rŽ%&kiiÈt§˜EÄì݃roU9Áš´7,ÿ<„]WW6stk4÷fkÿ8Î?ßëÚö³ãv0G²–EÍ­'‹Ü%¯"Ô%t6ÆÑ|ž.|uŠma8q»¬å¥««j›Î²H…I`¶VÖV\ú&+ÅÄÁúmþ ¿WvÒÑïÑöáPkl,"ÌW‘æh¬¬¡Ø=)ñYl”¥.Ê´Ðýîàѐ‘–¯KÐÈ£ÙjZeƒu¯µjãþyþ w¡VvÒ×÷͟%l` ‰«qŽˆóÀ‡ÄyäÀ硉ó؇ĹÃn ‰óè‡Äyø€câ<~`‰óÅyƒâjÁç1Ž‰ó(ÇĹp‰«a‰ó@‡Äù#+Dœ;½Màˆ¸.œ GÄy<#âZ@AEÄyDÁ -牫Žˆó‚ Îc -*®8®†¬Ñp5®Àáp5°ÀÑp5´` †«±Ž…«Á…«Ñk$œ‡8Îã  -ç+(œ8Î# šû½Æ¬¡p5ÈÀ‘peàH83X#á<ÎÀ‘phàH¸ÓÝyÆakxü5®#|Í¡ýp«k œ -´çj,A««Qz`ZG6›Wæ(·Úè ç×=ç¨uôt}>œ¿FÃudðU˜E¹y0À - ç1í1‹*è*rJLëÈakuÊ­5كáüÃü)ÿt¯hÛÇK:kswÂÎ'̣ڗœ kEV-ý¤¥ZzÊÈƌbÖSîÂÜ×åk´&”,›l¢=Å+3¡kµÚ×ÕçZj]'=í6È'iîÛÔ[ÔCԐÁ^nÈ£'Áæ#²Q҉‚ê-"„Fqcifþ ÎÎ9ô•9ÅZ}^-…FÜU– ¤¾U£Ø«þyþ wÁ+ÛöµÕOÐY᮲ª/)/Ušmd˜Ó˜Vø{çÀÝS…Hƒ+Å4¹šFÅd„bš»ÊÅZ5¦_É E¨y×*J^èõ®­VŠµZ?¯=X»Ð*ÛöµãV±˜l‚ -›ç册Q6”Ý’’%w!lé}]K£Xgñ)Sÿ äc_™S¬U?üœ\f‚ke°Ù•®MýÙ^«ŸVêúdÕl{ù¹öæ6™Òhà4¢¦^nÈ@|ÑL;Yeb^4H€Ô½t”¶Áæqõà€8ÏÜWækÕmLN¦ŠÛê‚ivéÛT‚³û¶úX×+­hÛÍ~@?E Ø2;U ² Ð—2€uAcʽ¤2Çy²s=Rˆ¯SíØ÷çJ…{]bº·ÚȆ‹q×ꂙwJ}›Fy^•gû8Ð;àum{ú½-RXbDy9«ëˈQÏ3¸ DϙwPFŠê_äÄö³õKäÄ,òº?„ˆ•’»Z*ÁÚrÍ_©²½#]÷µž¬áé­µÜÇÇû7Õ?ÚêÙö¬÷ýNª[/r—§SeȆYµÔ¸¬Þ `jǕ`lwQÅØ–¢¨"¡9ÁÚ³÷*˼Ê+†‚ÐîíÁÅúYþXýðZѶß׆ä‰<˜Þ2ã*ɗ2dÃÙŒ&ø¨ ò “JCi¾RœÃ́V^ƒ°ôuU‚µéüM©Y1î]MÅ¢ø[“¥ËuÒ}›?èßï•m;ú™Dí€NIàØa•}¹&â76Ô½8. -þ¡€>ф39ÁdUxøbêԕ×ÕT)µI{ÓÉ»³kuÑZJ×f¥Ø«õÛڃÞ-¯lÛÑïKBO-©ÏèH—F ™ï2`Ø£Æ*륑¤L% ¸-÷ÏaۍK_—S¬M×& g  ­2$°KרìMÿ8®~¿Wµéæ÷³@iè¨7‰ø‹± ³VR!MMŠÈõ„$Ê8cÃÂ4F±¾1»rìÌØÔ*sŠµê¯yRfÑ*Šhç±kµR|.ôóڃÞ¯lÛ×Ïv³Ôáðû—kj©©!f3Z2H*ªA×>4Š #±f[ôE8C&¨®2§X£nïQ² óãµÊ¦AC¦Z«•ò¼~¯~^{ÐzÐêÚt´à猐{OàÛgôo–šÚmíč@«Šì–ny, Ø Ïê®» V¥4T7,3¨;crhví1ݲ-„iäéFÖNàŒÑ=#-!Þ= ;1]vlxnkéT®pnxGˆ¾[¡¹a*~ ¢]$.34,w2Ÿ -gå–ö4¢¡"¹gÓQÈ=÷;IãÎ@«…¥Á¸ó"›:„†â¦¤ ¦·qÔl¨1q -´ˆ› X,× n¦Áò²Ñ×aŽ²yÅpŸÌü‰Í³ÀN<\ànT3ª#áf..ñô῝កñ©R³|b±t§¬¨z(u£äºUd¨ìÖ^ÞnŸUó·ŠNú÷Ч!TD]lXA·\¡Û ²èÈϹ ŸîÛðpƒUܶ0x97Sƒm3Yc€Ï†ŠLEm§Es,6örٖ-¿04ªR’v0l„sm±Ú¡'  =lÙCƒd- ÀUEdOPw¶xlhï ‹=ٗT€5òa™TٚˆI±ý•ˆtüSˆ „­–Û$$_Ç^ñ]C¯±Rs\ò p^*ð+ŽÑÄ+àu.Æ w¢%©Â®™¢8¥ êZ˜O™ÉØ@×0\󱊹.Ù+ÈõÈüP«*äº-Î -¹>]®'ܼ+bºVˆëF5”4“Iuàê\Íd+´5V0¥> ñÃÜêi„úܨ‘nŠºµ×£­ý«ŒØ>Ûê9é]ë? })¥ кQ+4Ú¬êžFPCÞb¬EÈedMƒXËù<÷Õ8a °®Ô -‰®9jښ[ƒ«í›*±}´UsÒ·ÖíÀxìâürE­PhlA\þéhé-Yæ -U ÛÜXº§pðAôòz*a…onTÃA×z (íõpjÿ¤ú÷¤V²íZë5Òo1Yã -Jݨ~ƀŽ=l ŸÔ¦U€HˆéEõ괊œÐÙÕ`Ï­"CF·özuû¬ú˜x­hÛ¿ÖuØ¡à§_§+±¢e¿hÎ -ˆ†qŒùUWÀia|돉(4¤ƒí„„¹Q êìڛë!ÓþQõ¡Ú“Zɦg—|ððOÌ%¾‚T6r…A"Ðw¤\V‘’rŽ—\âQ û8çF-ÈÖÍÜðV“VØF§V ¤WTa’ÞÞ -NÙ¾«’۷תN;ùýè4Ÿ”õã⇤a÷“ßÜ=;wÎñþåÓ¯îÞ<¿{õîé½û³Õw?ùù«wgÇ_Ï~÷âN;ð‹×Ï»—Ò¥—¾zs÷Çû»?=ýÍë?½­ý p‘‰Vré»x'Ï?ÜÝó‡w—‡¦>ûúÛ§2¦·o^¿zÿÿ¸ûý»Ç?á‘®Þß½ýŽ^¿ðŽjPÝüpGÿåþëw¸8³7Oôn§›W_ÛËOÎ^öô_îÿx‡«žø7ÕçÂLò¹, -€ÆfÃk8sô”e+„eiáRvjÊß¡ ë:D\ÛGu*1#-ø¢œÔÊQ0ÏE¦§àD^Ô½W äÅ®X˜‘ÐoÁ0;©ÕÙÏH¿=ÍÎ1q§(«Œ²J‘8ãÜ[jй –ñ«˜F¤2NÔ9(sqb)¶&ÀÔHÀ‘„ÚéæŽE“QGÞÜ°˜C…ÆVÌÀâÃä¶úÙzÛRً8¥“Õe2*¶&FFÃÛÕQ3Í6>Ïí¾¤€ÁzP· ϸlüâD‚<±2RFÀ1*Œ÷ôvY &^” -ˆ.Oÿ‰©6qý& ÁÛ%côPô™‰ËH%¿ a@À×hòÜb£òk{O˜^ÁYT촄¯e ö¡*˜ð©„çU Ðs·>†{¸“%"BêHa·ÂÒ8Ô×挳dя!Jâ¼h³%dà?&tÈã$æAW ê™p2€Gw?ˊŸùÖèG/ä眵. -P3ã…C˜¦ÊGšÁVÝc¨éà „lxì-Î:ã¦îç¢3è"­è ·y$Fµ'€Æ"¯œÍª–/")BTž}fÐçaá#ªy¦av"!,z­LdPñÞà—! ¾pmÃFYߣ¦#rU¾‡Y -QÏJëž|–œÌ`)f„Ex­óÊt&å"Øà%w‚žnLˆJIMo o(f²!)ž©ô«ø{üúy©Ý™ô!Yþ„ß3C“׳®1dvN–¢)ÈÇL©€ ™0͉u¨b>G;59Siª •L.2‚·u0âÝޓ³ƒK}"úÉ·˜Ç[’B1Î0ª)ö¹E2¹ÊMÌ5½ÑRÍ*=òPTåñ׈pÂñ”`Å'¼˜øÿEßɓힱ¹Q· -5SÇ`m:¶1LؑKp6‡ˆ%ê:Ñk•í+ 3ÀՕp§´5Ùß<ý1$"Ž1²¥RSAà6‡^–äuQ²HpÛ w øN~@…y>Ö`È7÷÷¦åIXa´©fþ>î4©ŽJ`>oDBÈó÷l¬X¯ -™h8:£æ<,È} Bñ(Ñä´4è爋ï%çX4!3ڀWƒOé`ŠÈ9#½ŒƒÖ.Œ†Qc†Á‘ú?ÎñÆ5' •i1°a@(5a©,¹õi"¦(jf>ãS  9qH(>šH v‡… Õs@m[¨¡*pÔW@ ƒK¼dò Ÿ¿‡„¨ jFÄ &E38AÿЫƒ:&†„áYfC GæJWíŠ&#ìD¦ u‰MÆӐ"ÅVØÄ  “è±Ãha )ǛþCfAØræj/ê2™žkmnñP†øB*–$̲¢â~‰jÙã4"ö¯Û@#€H¼­œßI- AMŸâvçNÀ¬««L7ªñ7& -¸Ÿ`ýàÕX¡òèhy¼p2++÷D|žY¸° -ãÂԉšiÅצ([µ -×fÐY–+jHvdឿÐûI #ã*P^Òa», -çüXü~ -Ý[%ÚäH©Í79´Æ Y1£”É°A ±ëâ.;Zt%¢H¹ª·{R4Ö×`‰A©#DÙQŠ”°*7 ÁÓ‚(ïA€­“õpDæجÕeïá××ü”™ˆ þ‰*PÌǽ¸ñm ú€ÉGEG€™Kª!穘¼Duæ¦Onr/|2Ƚ5dzÊè©"H½_ÔªÞÞÂ4ÏËs$Uãç0èQʜ½×š ÏބˆMÐàñ èOzõ‚ìþ¤oÂÌ V]x'e}z!53E ¦Ð‚h&®Yõ9Z×´ÅÙ ðð -Ó,|0¥E}¾´q*%¨»wŠ¾Ðf^¡nUڂY™ZaUÊØ*³R€ÒZ…„ŸGµ»=V¡‚`üI³² $û¤ÕÒÄ¿¤k]¥Ò£œÙåbé¢hƒPœcýÎû®Æ éT±Æ–Y£zõζ ÉI祅 'ÚÜ@&£¡éR'4ŠÁ…”ìk˜„QŸ£cŽ^Îɾ³S] ÓÀÓc՗k²¦—Ä‘°%‚5@`ÚÓdânûƙ=Ï7k¬qOÂî`ÒSÎ?ê.ᭈöÏ,ÂÚ{¤PG;ib¨^ÕÔÁLڂU€¹)P+AÅ$®1®>†$y boÍHá?¸mTœiðä"QV Ít¼{R+~®ëDÈÁ@SažÔ(gOѳ‡ìÿ¨µÁsOÎOâN5sø Þ­¤v] pÐُ&aê3ÌTDÓñ@ûZ¡E¥ŠB,iQ<(Ï@@ƒŽýl#T÷hOA*’^„¢Þ-'àŽÁ´´Wb´;ÜeQ¸2ᢀOžÛ4.ÍÏ -"†´dŽû^8î4ÑwÑ!Æ]SCÿäÂÔ;ÙSäÕ8©NFfE_ë Ù·]À³èZcjHèÐ0¢Ⓥ**Ñ#jIf -"@¬Öð™PŒ‹^'q²͓ýòPpÈ££ƒ@›tš Y­Ÿ 䖯qQÿïdn̼¨cgÕ¨ŸÉlõxmð€?qˆôéMÌ8“xA9M½Å6+,ìíC]Ž«á¦ÚÜ ¶§0)² JœGa8’HO>_ƒïŠ© ²F{ÒÂÒ½ÆcæuMŸ3("€©ÙôG‡Pmç4œ!z,°Â©¡ -.ò»©ÔßÄ¡åŒCÏuïà=8Ë蕢¥ÉÔ,H@T\ð=øÚ(B|I]ÆLÓáb ³z»)"á^E5-êpÂjowÐÏvÐ#k&Õ> JF.ÌØW”¨ZZ{æE¹‡"»CGÓàÜ`¨Aå×t¥;Qay³á°ÊRQWJ0F-Mj} ‘QPà”,M~E•*ÅÆthǪ_ðg9;[?ûÀØÝâK`<Ÿ¢­ )êhÿƒLŒÓ P[pk6;6°Oª;¼†žfj'Àµ“»a”¸°‘úEpàÕõ ÐÃÊX¨-ƒº·§¤3%1#åÉT‘!ÈåLÇrV¢k5ô‚©Õ ?\A&½c‡ÌçT-Z…š±:³$ðΘ¿K—àVS$•j›@^Aj™Wˆq’aC:S¼w%Ó «¾m¦—Ó§8u¼"BAÇÙójÈiÉ?itJŠ>e¨ -£¥F’-9:vö¶Œ{MÏH!>Džú¸·ºwF1:˜8­ ýǺA  *ìfrFM‹ ¥vÄ°ê]´tDNÆø­ƒƒº­Ûkź“ñC‰„ìYÞ¸ µ¨ÛW.„#cDÙè[…W…á¾Fvò¯«v”€!åÄÅ!Ú'd˜%©b°S"c`½â7/ê·ÑãÑÜåEýgÀ²bÉN³‚)™ÈþÇ)t–P‹%ogú‚9˜SÝD~º›²â°RPpÑnr˜¶œ{tÄ÷»u¯(^ê u‰ - D¶b±B öW6ižœy4ˆ5‹•3Iͣʺö^PË5ÒÕóŠ4bÓ²zl‹57Üæ¬@”Mî#Õ€$™ €’³šh’±±CU&Ø^ª÷ÎY-ó g&˜Ê9àÍÉubP3‘ÐTÿñ3á<À8S˜‚(ÏzJï÷Æg‚wΪþãgªø!+2{h÷‰ ¦ìv»a.*Ôш7è%a´/¤E &jš#c6 ¦^f˜cƒK‹‘×!*ÂÄxXRæBnðBûàAX< ЂۘÀC‘Û!*Bê ¨§ ž¬Š­ÍíªC¤Ë7ýÕ¯óUU© À‚·Ý7Ž9S2E®C¢Õ«ÿÚ#l`¤0æ'×XQCT@!Çr}O#¸Šr|?¥xD ²Ÿš‡q‘˜§PYW&Ñ>ðÈ%›LÚ)¸ãº³^z¾j™èÌVÂhsK¬ދ1µ÷ègVŨï] 0–$dþÌÓØz4ABIjÿbÊiXQrµmƒyïâ0k“Á¢2ãeÌ`¢6A^ç*@ˆ—›c(pâãAÕEnÑÀõRvÔƒüì£Ò‹]Ÿ ϞÕË8[»Ë”n3žuׁgD& N“â×4<>›cv`.È7«¿7ËɸcÖ ¬cêE -á*2e:óЛÔiÒ‰9¿„ˆˆ4<ƹ¤ÿCy…z×ÖY³wc”)!@×c=@÷Îv’Ûkà‰cÕ^ˆcB˜‘W\Ád%ÃêAÌzWÀzQVÈÈ9 €ÕMˆ¥æ?š§€Æen᱗N¤ õ%Cjáڌ´3qú‘ýh¢&Œ÷Lvîâz(‡Cë¼kÀÿC.uoB¦ƒf¨I@ëõG…YA§viRQk8H€aÀ-€ò½"<NæÙÛ+ŠB¢.=˜f¤>­ >¤kFEÈÃ?TÃ=~ÂJ!mS%ÁgbB€ˆ—Át^¢.Xm.k.*ü„¯ŠÊkH€rDÁŠ‡ÆCÄÃ(ÔԖ¨€%(7³Ï¤ -`홱£ܝºáÕgd?‹üH¹ÞÞ2¢YÑšLp·ˆÞ×3šÇ}ìBiæJ“FÊèc!)x"2¸ÅØØ{F-Iý}R=Ñغ,áúXücâú‘Çk4 r©ÂÂq‘álP6t„öHßðp®Âõ7ŒÌ£ÉŽþ»¬’^‹”áš/:‰Ï,¢Sr:&ÝÈ°‡9kœ [¦søvëæGxH†j€Ä‚ý·Ðn~¨S­!ü£ŠÑÏ!Lú–î2ÈE½í>ྡ¨gžÝ@ÂüÀxJ•†?%û¯yŒùDE*óèDÅÏp€ÂQOfÎx*­'¶mƒ±†£1¥X}ð W&€bԀ©ESŽ4Õs­HÆ!*ìbeT\æ?¯wÄ-<0ƒC–0Þԁ5º¿9SŸ8Ât0¼¡(’›×4 –©™ˆ£EÁƤ`bè%i-F¼À òV‹beV÷¤`Ä¢«…ö3µ¯‘ҁýÔ{Œ¬s‹^“M¤=å7z'bõ´wh‰á't„†{ã[9¯iÐûö@7aqqê©!!f}NY)Þ$iŒ] >ɜ)XÅ!Ýó²ÈQßTS }à¤t測ב²Ä¢IkçIî£*S…FXh‡Ÿ³d⼕C¯™œUEò[¡Ñ5lÝ͸¦ð~{ W23§9°ƒd2N±”.°Óȳ…îb Žêâ×¥x"Ÿ~U€q Ÿ2/©g½#èò0ÃüÇzW… e¼.ˆ@¿¨b›ê‰5  æÒ7 B[5@ÇîTÕÀ¯=i{÷‹J­ä¢Æ,%Ü)¨)"B{Æ±öžiUµz%ÐOÔdF6Ç(Ղ‰ú¤¿qQÓ£'Ê[j’ÓÞ7ÏûiÔ¿ì¨ÖV¦k3pZ0ç’6ÆÐÁŸ4xîKZw»YÒU¨SyHIªŽ°QµKëG [Ö´V4Ü^Xúæ`OÔÐüلÆ`*Ÿ€?XÏÜn›õ@ ‹EdÏ®Qg†±—ùiC‡ÆpNOÚ;Š ÁüŒ”ÇA -b˜lò̍I60j2î¼daÿÀ+ÆiiƉ³VRQP7/ƒ‘…œ, Ö_#òT ?š™»!©GŽ?â¸L–^ÃÞÊ®’ Íh$?jŸh,‚%O±©›4à2jÔ ŸÂ±Eã-ï¹3coʽ™>8ŽðQätÁ@ 0´ øv@p³¨QŸÒ¸è`2xÊ­923ä(œf$jëeé“!¿!¾‚7ŒAYX°Üúd6‹ÌS@ÑhaÁ͑†Êfò÷xØÖB-Ë56ÐD‡Ÿ»æìöðP͎4û"¢p6«#PÛ\ÏEÁ¥&á5óL€HŒzx‡Û;3²H'·ÈPȃÁþ\Ñã àª7ˆ \ߣŠ4þÍ ˆLŒ¯Hõg‚‚Åš€3êz„V¢Òh2ŒÒdé˜& /«8ߘs†HEã5ɾM ß;žß?€¹(àÄP ÐÎdWb(!k€a橆DÖXìzøÑ2Œ ušÌâ½Ó»jýܱ^ñ>Ut ƒÕ£rL,}“ßf]æ`fš Z¡rbb+ÄU:OÔhs°˜s±˜×7Œ+¢Š¾é–uié%*ØO‹~å öÝb™½…õ@°nC¸ÄeQ„!2²MÝVdÿ´0i…ÇӐl¹ôd©aQñ:ÖY½¨<±rªÙÁƒÏ&Íå`GÀ =y‘L0/Bºž£ú;™øSlå.w¨–ƒvdԞ*½Ô©G¨Z"üރ倥S‚WŒz»€>pd }³æ›c§yÓ%¸é\è`…5 æøÜ嬏-نE£iÛ½A£šþÜ_H±¼ú ð5,p‰õ4{{hÂÂbhÔb¡˜t;‚ÕÇH§A=¯€ªK6]“×Kb¤³y˜™h¿É«l4¹Pòñ§ð>œT„bMWB‰«×ŒÊ´ùXñÅÎx4x'XI*qU‚ÉyE÷?¶ -“Cxãŝ0t3§–šufW,ÀRãݐ+âG™zq1;A±Ì$@Â*v5< ùÊZŽ vƒ”A®ô†âÈÇ4íå±콬HPãcÐ$^ >+®‘&hrO]—HøÄ,\5'Ïb Dæ(çÅ}“fÅÈKÄ!›sEnµ¨j—maágjˆ¼íÀwëba Ғ}ÄÏL¹XêiiªL`“‰W³!™5ØÛx..¶}iŒqT!V¦b à´9:€°yfÀ< #O1Ϛµ8*÷+vîó½h¦zt JŒÅBÊý=5¨Ø̌¤Ãç "ÆeNYS蹡‡1°H”¦Á•QåGœÀÌ:ÁñU£‡¡¬ƒ–¢ dUŽ–ªœà†2~zîÀÞúi¼*f6§b 9y“¥Ú"e1ÉҜp¶^yO=~ þøܪ¨ÕduVÛÜW÷-°“³®,À҂856Q ÖÅÑì)èÎý8$ EUq§Ôl••bŒ"›âÂg즢HøR1t€P¥%8[ÔÐìÔÄs=VfŒ3ž†KZ¼âéFç]4ŽQ½—²ÅKò™BÛ8ÛtP»Ö4Š“…•×ŸÇ>b¢Ò&½Ä [ž$8wÙ¢¯i, £4N -Cœv&²LÌMU³cÀ~šK‡>¢¤ÆÑESÎ[¶Ì¨.]&%"O Õ/OYçÏQÊÈz¢I;-Q !˶#5et°èƒÁX#PêœĽò´.¶¦†a)0*Plڟ*~ú¯Š`FUúrÿ0=’f)J -¥„Áô:æj– …5{&‡aìÆQ;„¸ø (2;]èÌwYœ·L¨#D™|2£Ìb@£­Øtøì‚Ùß_̳ý1µýÍd?M|ü‘Oî œ5n•»øóšÿxš5Š®¦?†Q™ûìÇaQgM~Œ«oY³å>†L ÔJŸúzy Å3CµE0aM|  zÏ*ï1 ÈLyhiñ3¾¶f=ÆÏìZe=æK*Ðl†šsMqœí¼l2Z ðrMx [. šï8`†íÛ¥;ö{ŒÁ³#ZtP„)Ñp[ëdÇ=•i|qk+0ўê8K±»Êtk"æšé9ù)’ÔDÇÑ|ñëLÇôôiÂY‚  -â#5Ñq²“v•èpPM+dyŽé†cËs 3r„>Í1,!ˆüõ,Ǽ̩Ėä˜è€©lr ÀT&5ÅñÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc§@¡ 8æßã oLãóLº1SïsO Þv¶1º'‘ãa´1d›iD£±°sb%‡¦5ÁÆÃüïä•ÌíTc¬Ú9™Æܪq'ÒÓôQހƜÍÏgòŒY®VÊ\[_þ,v ñüñŒQw=çÄÀ’‘f X)XÌѨ•>YÆWWìiCý>ÄȖ³¾<“ö$È™dê7Ž1*J/õ`4éõ÷ƒú½ ãïrí cìÃÂo!Œq\Ô˜` g uÀøʈ¿5jn_ŒsDzы!$ÃÕ¼˜%Âøt^Ìœü ^¬yR­ƒŒì@ú > /–äÍ4ã„7PñVŒ4¾Ô3ÙÅü›ÊË{ƒ IY‚]ŒÛÀN°‹Ñ~ -ï]ŒËnBÄR -ªûµQ‹9‰£Êf#Ëz÷ Ãp@C2XvhÌÛÐÅ|o&¸˜.d¦ËN£Œºs‹±’@©v`‹º jÉZ%@+³A‹”'±˜k§—/Àâç¶ÌkåÈo+pŏg¡ ã}ƒR|²AŠO«R ¸~8Å`;@k·!ŠOGՂPŒ’güRŠñ÷!šèD"3l@ð‰©žowâ‰áUÀÏ_éÄÄt•;áÄCùÉ@#Ž´Æ†&f‰ñ¨A&†t -õסSï.øظÄÈ×B$\b ä.Õ*P—AÌà¸w*1]„cŽPà" =f&1ñ÷%ÞõŒæ°0ˆÄ̬@_) qïâo<âæq3pÄ{Cµc1<®ß&ßÀÌ*Õ; {R -ñ»+7£ž–3c¿ëØAĨü€üHb6NÖ ¥¤_²–•BLžëg’P;Þ~ìTõﳚø´¶5Äø%ÿM>«yc+˜å Ϥ³¨™`6ч‘<Çòc…£¿]O²‡QÕ®»Å¢L5 ;wð0ªx¿Ì>Ù5xù‹¿ : È4f©`ãoWZ2’€¿Yªº‡‘ü#€ÃüjQõ"`þ¹â†Q,ˆù*hï•©_FßΦ¢ÓÉFÎNB †2îdÖ4| °†áõÀÙ Î0Æ&NŒÆ¿ãal”áS€‡` #aÇ=Ãgg# ÃȏÌãþFb+øÂUú†‡F>«ÙÂÐâû´0À4à’ldaä?9 , i%¤œÁîîK±a…©³8zR…¡y0F”ÃSc_ʲ3…±„-Â\8àlM”÷ -†j®õš@a?Ï3yÂø›³ÝŠ®ð>A® -1Kû´s' £ç%Þmƒ„‘Ćkáfë†FÍΗxˆ)tàñòÎÑÇte£ l;¨ç†Sl‚ðÁ7¡=oá×ÛK؈ÂC3q⃡èý|ˆÃ—ð`W&;øP6uG›h—ä`Ü¢>¹Á‡¿LiŒ„C½ÙÔËR5y‹…  ð/æ$#!ÒÇ?â4í¼`k¿Œ" ž¬àjá6ñ"§Š‡¨`nÔê$#Эß]@Á—ƨä$o”à0$øQlÀø_ðWé+-ˆàjÇ&6ñÚ!Áù÷ÊcàQá„ã&دÜ~˜ÇîÉjM .§õõNåe*¡ |p%Ðk¢ŠÜÚ½£ñ½Šem6ðwøYÑk >X@\ÚF9,e.Á†Ö®D30}ž;HIˆñ ~½7“ Ìõx{ãEâQ’ -|PaÞkR1j0°²QqKé¸ø [Š;>Þ À"••É> ì $0‚7íމÀˆQ#f@`hz°¢1£_–‘A……RQ„0Tk; ¸º‡—QÀ¬ø&Ú@*ü Ïuã@í¼’Œd·¸L ž -­`8n ž·ZznÑ!”Dpgc‡1À¢K"€yW.Y¤ðEáµ 0” -ƒÿ‹'°tåÿ6GØÿÛ\ãô_äÿ© Z*ðˆêF6Äì_Hš5úHaú{+ùþ F ÿbÄC}G0}OD°ó -þ¥³ß¦‘yïüoàß4ü{bêèOrßÝÜé#mðيýU£“«$÷·P?d.=×_ÐK<—3 þ-Ð^Qhà_lG _€ÑKóíþ¥¹˜ñ.!1ÊÉ~ ðoayäYßÀ¿i<¦üzO,Ñ®gri¹ËýÆýÅëIx¯¹¿Â¶šš¦ •u¼q‰‚o÷“Ü_ìÙÈ î/Q¶WioÜ_šÙþ+¸¿øûûËÿ}¼aEûmmby÷ýLì/ÿ©øŸ&#¬¢F·õ‰ýeŒ/I`ù€È£Û°¿ÈT‰5lì/îÕÁ~́ýÕ+5džýe†®ŽIý%f‹ þ²}ÀÃDçJýÅ/Ü'Û šú‹S:ˆü ê/ -ÜÇNý-5°‚Aý¥J«º5¶2XÔm=õúË]YT4Lþ_ÿ þÂRîÐ%õ—´\ÐÐ_„Egê/ã‹ã|ƒþ2Q§ïÊÔ_†„¢6õ÷yý?âlÔ_`*ڙÌ_ð'k¹&òÝÉx¢ñV¦ÊøËÍÆ9y¿8Ð;ì÷qƒŽdý2è¥"ã~q!œrvÜïóø›ÚïSQLØ/r*+YY¿ˆEV…1å~Sw3I¿ø»Öó ô{cÍ9)¿·]¦„ü2kr=oŒ_Ô¯Ÿ£LÄ/cs -7ֈá#%pÕ7Ä/¯ºe2~ùøøAf¹¦Èç†ø}T“iÀ/â`Ì7ð‹¿ÎYù¾°¡Š&ð¾8Ý Ó}IAEDy…ûªŽ‘p_æÚPKÃKëĝîËAm¸£šJ‘p¤ûòna@ß辌á#¨t_ƒõrŠ¬7º¯ò?ýJº¯4óíNá€>»Ñ}qÚìt_V¡4辸”[:¢ ÷ewŠª‚<¥ŠQ؁ÏÎt_Þ ®x_Záaïˬ=‚݁÷…©‹ ï kP‡jÝ/ÑeïK³+ޗÊÍë‰÷ewŒÁ÷Åh‚õÕÎ÷•–$ƒ_¹KBÍ÷-Õɒ ð +×ø•äS›]¥Ñ¤eãûÂHo#ø¾4 D|_° ß¿ÉÅ.6àW}ô%mã1m€_XY9€ßBvkk ø¥cïFø•õ~’ð˱ú҄_Hßß¿ìak~U‚šv~Ù¶J8 ¿j¦vö$ü¢§ô ü22E坄_ -½Ÿ«$â·tC—øåß|¿WÄ/­½&áWzñª<‚`ó=ÀÿáWñ¢t•$lëô¨0’„_i¿{'üÒÿ;«†>‰UÑDîN0~Q'@ºÛÎø…¹4}Éø…Åӗ¿´D¾s2~KöŸ0â—ÇŠ<¨Y@ 3·!~q¡rÆñËɚD ~á±þrCüR›ÅY$ښ`…£¶&üâf\lÜ°~!Ò7ºØ„_¼cçhç$ü–ÓK¬ðË"!º‚Aøeï5%ŠMø¥ó®– á·D> ¿´\ÖÇÈôÑí_–gñ=o„_q%ʙ„_ ¼¯‰ÿ -¯^ƒ{ì„_ZñáGš¿$üÂÀ‰k#ü2 ±"‚ÎaÜ|~e}'üâ÷ÈÛ Â/¿’£%à“ÇqïËLßyäû2MZJÂ{1BÝ -ÀNÄ/†;ç9ia÷À߁Áçh;ßÆà Þ[Û0Ã#º/DÇp2W¸/»*ŒÌPÒ_¼ þÄh±‘}Ǖ 2/ÃyÍìEgaf6®/!¹÷6ÙÏ{Æß+Ö7mÆúޞžƒ× †-–·Õ÷:¥ÎLš¦oü½"}Óf¢ïëü/¨YLô½õ]x¾·‡Œàùއ†¾ÀùâoÜԍ拝¸<7Í÷¶Ö%`¾÷¡7ycù^np(ßË"à ùÁ€ÌÀò%Õµ·äøòoÁB¼i‡â #Þû€øâo¼4ÁðEPœßá{NŽá{¹5M|¯eø"³‡s~/>A”¿÷ŠÆ+¾X®!ЦBÂX'õ‘ðÞQ%Œ_Ù½´‰rÌl6ö! Òä^ДNõ¶K)&¸cmœÉíE~qa{Ávi£öRóˆz^C{‘1V›C1{//-7d/{ß²WÄÞáuR{q Þo¼^ž ˜fÆõ¯ƒÖKDP+¬—Õnx9ÍêeM”JFõ΃,¤Þì^jPot?òë6§t8€é½ônü.öy7H/Äh\èÄF^Aè%Q ɶÐ+Êá|^ü9X›,>ïmeņç…ñ—x^¨û¿:/pÃV78/ê&^Ø¼X½²q‡«§ãï•Ì›6ƒyAËÕ¤$ž – Ëû˜µT^,ëÔœÖ -R"¸Ò_©¼°ª½€bb¢œwRy¹Záô¿Ry‰œb£ÞðCŽPטÊË-H÷_©¼˜ì**/<Ò*Ž#Ë*±ŠÆÃߘ¼XvÁ+&/ÏéÐVª†q›¢; &àcœºœÐè^¨yHHÁPpµÉ+£ÞÉ䅁Ã]0yi`³ƒ•ÉK7'o&/Ap ƒÉûÁQùœ>Ì“ÉË`Š"6&/­Ì"šÉ«^½ÁËÀËAW&/ã.Í“—Ü ^LÞ§ëÝؐ¼¸t®þɛ+̨eE„” ɫƘòtˆä¥§Ý3|8Öì[ôÐì@ò*~'àoUÛÏÁab#ò2‚…÷3ˆ¼Œ1`íD^I0—lDÞt-Mäå iQƒÈô‰‘8[‰¼«µº7ðAä%%ƒ×Fä¥Ê¾ ø*|©ÈåJ"¯P õى¼T>R»P¦ò›Æ òâQrá´yQ£‚Õi yQfEÖµêÙojÇñBY5ô=Òõ†O‹Ñ!`¼ŒRu•NN/#*ã®IãM1mÐxi`G«µˆF²ô$QäqNÃwC\Ë¡y£ñ2$x>éú)¬3l3Ž—Á¬Rv/¢=¬ž4Žˆ¬‡È ‰FX;¢4þ„ñ¢„ªOÌUÅ ØþÝv/lèéúYmÖïäð^þ.6 /TvÈ?˜Â‹?Ñ× ¼P©a¢Þ¼—Ûö‚÷BµžIàE$±‘ À{9ØüÝó(Éߎímø]@žˆ)1~w8hô]R¡®½Ë&1P½½;Õ îîp¦qÃîóƒ¢è Jú ê.N½©Aø„î²5’vfî²F½Ü‰Üí–zmÄ] -ž+»h!‰ÐSðv=ëo«Q|âÛŚ ©‚¶‹¿áÄo°]¨`ÞÖ.ÔYÈ jhؾsvQ Šèv`vOԗ&cZ¬¸7Ä.ŒˆÝaÄm” 9y³ðþìʇ^÷TÏÑeŸ×‰ß;[¥ô”©2 ².ªj(Ù^Áº€và‡‚«{º9p`uQ„%ñFՅ_QPuOO:Õř4Ãù2… Á;¢zFê"Áy™° ŸL…¦ö9€ƒëåÚÚ@]¬ðÞOUµ@pm8ݧ8ápáãÎLӅd™|½¦ #†Ý`鲦èé‰Ò…Á¾•¤K±öy&H÷q=8ºø;~(9ºL l] -úk -7FµN€]m]Ô/ö6)ºaŠÑ}GÞºÈJè5‰Xvs>´¸¢gÕº3ti½ÕÄ^ТM˓ ]†ÒáÞn]¶JG¬1 º˜÷ö ˆ. ˆó­Ýy°}_NqPtY´€`ÇFх«/‡2fðÜ¡ Šnæ‹7Š.=4öVºf g¤Àè~ðìfPìctçºvŠ.B¾‡Álñâ ®‰+v‚.j wCS]Ü-¾ÌÏÅ~Lælø\Vn6ùߤç>À (.csŒ±oð\UFôºlˆ¾]x哞;M+>—>ë³ãs ê@/®Àç* _Jòs‘$àp³ñsIKéìh¬öq›àç*¹ Ñlòs)º@µWðsihâåª=ö)|ïŠÏE‚O÷Üø\‚Y h|.¶àmÚð¹Ðg°¹}às™dÌù ÐÏ£pÈÐь™ôÜ ÎæÅè"×eèÂÚI%@ü%:AÐEʈ!¨ KÖ®AЅn^ti€Âu#蒉Ô®æì(HRòs¹Ë~V~n9íÛ?eÁ\”?Wýà7z.³iEþ0•Œ<ç.ÇAý“Ðòýž «~ÌôÜB(P{’žKÂ1=֎ô\nÆ;`z.\„‡žô\$'9Ö=ϗºÀç¦aãçN«º8<ãAÆ-TQ׶t‘Ô¥§–›U/€ ; +@7­Ð-¥ÁM2@7_Ì ¡Ëìì3 º,¸F=ºL¯U•~Má ­XÚC—É5¬k‚¡Ë ÍC—¯=Ö´d貘)(3tù¯X‰n]âÅàJD—ÉBu_¶$xÑpè@}ùxªR¹¦è2Ì´uPt¡¼cÅàNÑÅ—,0(º$"\j$KŠ.eh˜•7Š.µ XFÑÅKÈ6`;Ff£K Mbti¡6oÃèòˆý6V•/ä¬ã Œ.,Œ‰­]ú¦LÑ£KˆØuÚá!›*9„­VŒn£Ëéêqw[=IÜ06Ü0º0ëõ2F†£ËM$;Y1º4óQFW¶Ë`]Ñ-Dú´St©¤T (ºP®püHŒ.áÕ­Ù'F—áaVvF—ݳðqùðÊWŒ.W>Ç4>)$D7 CwZ5B›’è¤Ë÷ðƒoþGX°F‹… «âü’]8û\­?wh´Ùñ¹C±Œ¤ç©Éž{Ë/ØÙ¹/ã%R® ·J¢“œ{G»Êœ{“‹¼ìs±ê*¨¹Ö²îÔÜÛéSsÑLE´÷“ªN¬Ì\h̑ß53á5D;F[-øڈ¹0 `.bÇ¸\Ô`¶Þh¹Ð£+-%X.þVFJ°\ü:³•Kê0:í• Å=^Ÿ<;7)ßH¹ÌÇÀ£M jrÓ»è ´À‡ÙÂɅ~Ð* ¶íÑàÜ6Øp}%äÂß@ò'¹ìÉw´äã6ˆ0÷ŽÇmÖK$òw„q³&„v8.¬˜±‚Ûܼ Ù¸­I•µ£qÛC,Á¸HÒ"ªo Òálƒ±bqûca©¸ µ=-¡¸p¼2q÷蓈‹ªÍÏRÒ Æ6.ŒL‡‹(†6 W±”g‡ážk ÷tcÂ@áž1-$\èe½7à ç†ÁEؕ¹6Sp¡3x&5²X3o\äékO.þ‰#ø·ØoáÆ¿…L§ºÍ‹6ѯs\A¿…ª¬ -;á·¸H£û7ß‘£¡Võ%œ‹]Dø„²d²€éô~'÷vy°ao‡[6õ6j«z; Sؘ·ìjÑz"o³@ÖÄÛæªîx %b SR4n:{ðn÷Å »án è(OÒnO·– -Øíi æƺ…1‹@݂×o-H·ø¥bòm:çÝeÁ¹…Ï¿&0·¨ëo[ê# ­0ã|GFÜâ.àýÚ·0²kŠ· d"l|ÛæÄËÆ· `Màmñ7â@ÆÛâO6º-n œÕ€Û¶a„¡-͘ƒ m‹(Ö鬤YU`[ÔXáSܸ¶,~@ÀþŠ>0 -ÕIÓqíLÛj!˜¶øÁÍ@Úâod¡7¢míZü%жûÏöäô†³E†Å%e¦±ŠpfKÃ}î,ۍȎžUo˜;áEÉ‘'D6’íòû2A¶]!·äØ^êý°clO…דb[<§b{K/½1lU7Pa{ómžۛ¤Œ7€-Ø„ß›_{«dÁôÚ[š¡7v­d?‰®½,Ö1¹¶º>j'×ñF\kYlrk)b~ÇÖ2œÑ'µV3K2k‘q-ãY‹˜÷³ kñÞ²=„‰µÔû´7`m“—¼ÚêÙ;pµ¬…>ûN«…d\ɪÅڃxÂ@Õ՚¼¡j_Ï ÷$՞Œ%–ÕjÝÓ몕˜ë=ƒj¨to)]–˝¤ZfûOY ï/‡¨ÿ¦!}p¿½÷1õòR7Iµ.à -Pmp«‚S‹d% +¦+{¸XA©EÅ8ÜـԞ®Gܵ éEÍR`°6µøûÒ?ÏÕÇé|ði‘±DÈ?ð´ä´Œ¾ÓiOxFp€*ŒˆVÅù²‰¦½K¦fiÄڛ÷Až`ay¿qia¼˜å<¿‹r݈Ø≲ªJ‹:fǀҢ.ˆá3o„d]’ö¾µ2$-Y¬÷•¬Yz0ol@ZDñàŽ„qܒº6þÞp´a íåy8(³Ð bIº±h¡ edÅÆ»(’$Úü{ц18´ÄçÞObh¯S¢B mš–BBæZ-‰sê[¶ø§ŠÙ‚@{Y¼Y¼êM;ÍH3®Ò~qDö3}²½¡Þf“?‹ ^Sl’!þ]GÒg³<Î>‹@¾°`ÏÞî¾ìÙÛÝÄ7ô,ƒ¤ý ò,3°âÕrVd†¶<w6˜I½o7 -êìí/r‡Î‚3Œ7 ˜³@Ú" ÈYü]¢žÄYKKàìƒE‘ñ²X=¢jžÛ†›}fW9–¾æ;FÀfY÷RΝ5 @SUê9ÊúTH¤ÙÛ«Á4{‹¦•˜Ù'=A™eeš{éL-2iÂ,p5cçÄÊÉ@Ì¢ç4œv"fƒä¤Vy¿T¥€ÙyŒ•/{GrÓxÙÛɞ€ÉÆ'¿Áe!éTØApÙ»è&2öê&ÃmhYðUH +R>ÏäÊR-}=oXYFö ª,Ñ#.G&Îá:fÕn -™¯cî -zw(ŸDٗA•¬Pv8Ɯ@ÙqD¥© –Ó°"e§QLÙaN"M±ìäB{#ÊRlÃͼ˜@¹M@öèˆtWˆíDY(íUWm ,åùŽâÖb -Àf*i¦Ò|0ý8¢Ñ%Ý)ú%{Zà(YäØP@$Yʖ˜w^I²Hlbõ Y.¬¼Šj «tŽ9Õ(˜j¾¬MîUB¬ÄÈbÙ¢˜ÜJ‘íX²—:ï8 ª+7C¶[ž¸!dÑ%Qgî`dž‚ ûîÎ|þæÓßdÿnYvëb£.¼˜ÓL1„C¹>©Éay”4¬Š®Zæ,W`4oçè OÖOܖKŒÇ‚täOŽÌøc›Ø¾N5¥!¼ªäće5žòÀ%uÈ`muO¹ -ŠÇL(Znsá±Ü\ö4÷]Ñ閴Ÿ&A«&Õ|ÀñżRCò'À4*É)|á‘ðÀ«º9“O^ŸºµD= úf§q•ÁžŽç ]òÔy.æªÈQ!·ê‘EIJØ –V–])6-®³€ÁmL°æ…dÿTLÄÀïlʀU›¥R΀à:$SŠŠG }»§\l%®R‘Ÿ"‘€Õ^ê}ì€åP¥8úf;Û#aƒ¶Ö#è0¨ ­¯IŒe&._SÊŗú8AèZ]Eh5e¹à=<þ›rZÙÎý‰Á‚“¨V -/X¸RâO²?#,#êäÔS¬é'YHŇÎn]‡›‹qQU/º¨„aãxvµ„öW ›!í-,R#â~â 'ÔúŠÎt -ø›îŽ¦·këpùÀç¸Ü»wWÝÌ.tYE ˜ßkxk´”<[x‹ìÊ)XV¬K½õäJ2ðùr¡Žïß@ååÑøn4¶…¼«¦O´…\4.·ãhjs,JžÙâúaçn7ÃÇÃ:>ŵ I"Rú0z‘–ë҆Œ7À`xeaÉl^yh~‚™>E B-4V–&ãC¤%ËçQƒà?̒ü‘IË=º ïqMìf²"ED¨bÏ÷JbßN7žSäZ¼’w]ë ¦™….˜ã½á DÑÖáìõ¸÷Øæˆ0Û®S;)âÅ ÕÑ¿±‘†‚$ì]#-|GŒ’~FÑ3B,}2$ЊC…/µ©ù#Ûo@d‡=µámF/;aE”Á&š‚*\87@gÚ2 ýM† -þ,y‹ŽG”¯Bh²÷S…qì‡*q†“|äïã±°€‹_tvÁ¹Bò\X^,Îý(¿à«,þI,˜ Óƒã)î ÈhŸ5^,Û{æaf§Ã«jµD çBhÞ ¶à‰ñ`W•Z+weU%ÍÌÞ@cK5Çåt;,·zCTQn¼kŠ­€Ø–Ë'vi~˜Í܈@ ¥(‹ê±¬Š,€÷M D–%Þü¨RÃè¯$ñ9ÖQf&³fǟ:L2¤Ñ@=G¹,-gnÔzè.3^ì!‚4Äµ§—Gç™± x/tµáÂDOB¶èÁ1oG©ðޒà©Ñu$Õ`ȕ‰Pä¡G¯E 4Â|ªðžñ/¿\·ÉÌâVþ¨8÷À}_.W³ŸñŸs9t ƒÄð ]Åf,¥º¬–HE= øà!X€…}$ðˆ ÐB^À:.<( sÕÚky@%?}l2W=‹+E1‚^"ÇÍėà+ãJ[:“”›Þ®ÿ>½N±Ëº|Zø()‹ö²›Ã:£®V,Óñ@ERa—æ]Gdü¢6¯qz”¦o–ÂÁ€»æ4O¶æ¥#20Èf5ÁÂ29nCU5ªŠ®+•`ÃHv4K ˜WÏWà4u±Ü¢ö¥/Í¢~Pœ}@»¤j¾G£qæ°áÈ&wÊÝF4«Ax -ÖXuÄξ͐5–hàvqrO-·±æ-öäj ÁFØÄþÖ³á¤ìK½-ëa -To©9ØWWµäòrÊw\úžo%·iá:üºÝÒf533\-wÕeè7TýÉn@·ÁªO,ç\7\ÑHhÄÐðÖ+z/`p 7œôúK±ø²uõžv8^²«W<¬©ð®@βÒîS#•zž^•&ýªæ+R©<ŒÀ~¼ä} Ë<ÙT’:ÌîDϔÝEwÛ‘xY8¾ -âpWªÄCŸßM/á=¸>¯tü kä°~ìÕ÷mTé0›;˜]ցëóîB™ƒRÌ­mqB¬+);7D;EN–W¼G¶´]}ܔ¶•ó‰ÚŠnŸƒÊQœ(‚'¿r¤¿*FÀkˆ,C†LfMKÇy“»2ˆ.bN–O=ZñJ©“È வ‚w ‘*šÃ%³¸bÐ$([¤ÜeèöR‹Öu`/^ÔÓW`o LéKÌAPþ(̧é‡Ò -ÃÇ ÔèÂëÝŨÙ`ÚmWe!r€ÇÊê.ï:ìÊpé.óS+*>=ŒïÛëPøm”j×ËM¿AÇÉe ԍp/‹5ñ(h ~¼õî0q«J!1zb8T#¸*î8„zìxGþÃò·†©—×ÍNù.’¥Š]£Õ³ç¹«ê&ಠtó›DߑqÃæx ,xzï…ýW?è.Ñ;µü"ã·Bt&r@J3aTÉRÊæ/猻Æqÿg&ç½q0U€7†> - ‡`1å€+ÌÜS Vž;Rüš³óÄ]]:BýâÚŠï{¹ôș+BI´Ê#°ñòC܈¦v?9ƒ³riÁ\÷­V{3Š ŒN½¦!Wvѧϛ©›³Ê è~Ûaâ3Òÿ kwrŒÝJšòTz?, æê¡Û*d†x1ÝN Ù/D󼘬æºULbø[Ä&œÀµüï†íÕfÝJÅwÆÐ+bky½4LÈÔvÏÈ)¬ -mÀ“Áƒ…9QZ¨ÀD©Wӎ|Ž¹'•÷۞„ÓñŠÿF3éfÝ@îH?¨RN‰È^pÜÛZ½PÅupˆD–ó‹®|2¼£ë”Æ«2»©¶Ö\*±äYô}Â,©¯’f·–»ÊÂw–Ù0FÿpDyè©W:hp‚‘š—z†¨…?Ê'íÔd é|è|ñ/ÖÀᒍòž®úãg“˜ŠZ D%ñä -U”Ü ×ð®]IçuŸfíFS@üˆªóÊôrÑÌ3ß3±å<øŒ(¨D‘óR‰Êa¹{H`溆fDÒaQ»´ÝÀ -¾õJž2÷ä -fFy,È+`¡Ë…¼P–АU6gâ·%Ôµï_9"Ø/áspÝπ"c](ŠFDD1@Ä_ „gЫ‘d Ã?ŒŠ†£ ‘l àL•É§ð¸´€Y˨}îI ¬ r»Êù4ÿ°¼…–ìûP÷¼¯äˆ] -HŸü\Ô\¦x¶â“¾B›ˆøöˆ\á°ìiÍð)@V¬úA´³j„k[.j/#ë@Ð_¹2 ðxJ‡€i°{Ï-efîɺ’JWñX;i°8ÝeÍ,cö #ä™&DH(F¿bÀΛõ(5h])nÀ©=Y†ËÇY}§è1±SïÑÿeœd"ù¢†‹«…°RNƒ|›Ãi1XÎùqÃ|1;p«¢˜ÇRXýæôÀT\¿µgÍwˆÍ>ð~§G êüœå¸Ãw„x¨b •.³2Ç<_|™:N!ðOjód͓ã Fw®l‘þý¡%" £»r zÍwÓvB»àX÷¥ ×®l¤xW[êò•Ç{UËãŒNW³h&KñN #tœ*÷µ£Ž:~H¢Qp?ûY\\Aå¤è1áT‰$«Õ_´¸Õ·e¡üx=à6³ ¸fô´n×mTʚ«6dÿnîh:cþÊs…õD‹võ¨¾5ñõ8ÂWN(¸Ÿéãõ4hÔpj‚ÖÙÅýòœ¿9sGÍ \Ê9ûêç.íHXTÓKŠ‰aÖÇyKÄS)Ho:Vþ&1HîFNÞ¥s¡EQ%^ÕîڞJ¤î7ÂN¬1äõS`Ö¿Ñ[õ4؟#!(0²<³€V ÒMº'K_LãYò7cÔ~–ßìrÁ‘c˜§«÷î03®’:s¦P"ØWÑ«üˆOW{ɃÝö²Îàa}“Q!˜o6ÛyTz !BL 1§‡M”î{”R˜{²¢<¯ç<#‘òHéWÌ{t0j±½«µ¢0»ÅؐsɑŒÃ;Èޑ2ŒÌ'ÜǪÁSÂ-t¡0º }RGЮŠiúÍáæ{4«ãoۗ1ñ\à lX֚ƒªì73Òx§y0 -³‘PWkë“h™¿z¢¤¥&¥>I´Ì©ìX6<òÂíµiú & a«à×`5SÙõˆ¶¦,%ç]CŸŒáJü0„R¢Œ¹÷ÊÐ/œJñÁ÷áëS\£mBeä>+·³…X8Èå®j‡j%¾pðJÎýҏîK‰e™© çÊüõfk™ÁŠ¯CA)v„E²ô"4 _\C¥’ЋDw =rÎ(æ_îÞ çk˜évgf„®‡·“ \%¢ºo QeÉ(ý r.ƒO†F0Ϙ -$ÊLÃD€›«'…3sQ碈ïÐâóeIµœ°¡'Jœ¬ú§bR¨ µCS„i£\æ=– &¤•¢µr¿`¤0ýI®ZÓéª -ÇꉬBoRÆ¥£³ÁLC×w|ë¤PÆeBjï`[ÕOj¨Å¨—_Þ¡»æ·r8 ¢ùÁtôa -fL^°(VK[wucƒ¦þHMS’­uQ›Uz°¬ ÖáE½9šÆFތ’…œ}´«ðQ\|ûRÙzñG µÛ81V´³WL‰xze)‰‡À9ÇXXû>žIý9sÏmná KsF/ïz¬²Ü_÷0eßôzémPڍ~HY”0èJ™å:ÕaGMuŠçý%|•ò3²Óâ!¥»Nnøê†t³Ë*ê_ˆç:ç(& ä~š[)5s6žÈêÄ̟{6ãwÅjx윒ÛË%Ê8ýp›Çб¢Ÿ—ŸËe/¶”èß´ª;>d$ÀæÇ*Uöyvf6 è -/XÆÕy˜æNéN5æúvµè’X'TâŒË–k‘PqˆŒÈ! lë\¢!0,13ئ/²-µð®á\Á‚ú†‚*!•¨ÀÈŎ5 5×ôßÉ÷ddžT2JÖØ&ÃÁ¡¼Nª1¡5 n+IÞm†—éˆwÑÀ=kÑ%žfæ¼YÙÏ0c‘C‹‚§ÅÀïӃ†;IuOÓ»E«1ª§(ŽþN ú™?z¸;U?¢`¤Åêïƒ/ö9ý´?&—™QNE¶‡ÜëÓLÃÁ1øy «ŠšÃœl–\ê;Eñ,}ìâÚ)j®SK<½3àêÔhÏM'°Ùiâä8—ÜÀÞG@Tˆs 77:1W©¸sw…Á™QØn-ʹGa»eµg4•ÄoP‹reJA[(v`ÇKÕÔÇjî"W¹- ÀÙµ”z+Æg^køÔљYolÕ[MåIe î©tWù:=! àÌE H¨l>Ü#Žº›vÍ]å N‰2cv[i®¡£¥X¬À¨õ÷qilC‡ìŒ‚m§ôÆø\IÑ`ŽµÄ¸¦ZF˜¯” Í{¤gW&ã8Í?ÆØg(•«^Š`mͱ…”CѦ“J - â¡bb:Tukej€\É036áGXú½„ß”8<,êE€+I -±ã'9äÃrå“2`ý‚`ˆ×±xŒ®¸Õ¤(<Ä,ƒU±#¢±E ’S¬DÑ*ÏÞŽ4›¢Ò’$»,¡{@×JÞ ‹Šúï̸fQ÷ÝX -ÎÈ]m¶Ðkfí 3‘•›ÜQhÀæxqR–`I& “Î9¹6Ý67ÖrR8ڝ n•²@ˆœBX…Ù©ªÐŸÊJ$9”Š‡²®\4éh] ïàŒ2X ‹¦ÒËAJN&5½9˜9•öîëÄOðí=œžH Ã2ó”—À%ÌWR±[ôa-*A©yé.ÕӅB£W=(R‡õåh§‰ ü:ÁXìé©ÀÌ"ñ+ú÷!ÇI9ÓåŠ-XÔÙµ m™{JrE{@¬+Ôݵ:I!k¬0§Æ+É7O«Ð-Ò³"ÒWxõª˜µãK½UîÍÅ×?õƬcÐäSU³‚§¶,`F%ÌRâÃòØ"µNˆrD”6Ô|‡q—4Ÿ§TuÞo»ª¿2?µºÃxV>ú1ëyª•@—ëDKô'ù+ ý*¤™,j„¶˜Z•Kµû -­0A™|ÒÅ`¾.+à¡pGÇ$ -­¨€oRSùX÷*(.u£rOK†&©ó*váÑÓ]áJCñè»MŸ¢§¢3XÕ²´Q©ît—Ÿ 9´‹¡^êS™íe÷Ç&e~zŸ0ROú¸7“<‰€Áâ,UWõOîʲ`˜¹Îd¦€¿‰ ™ôàô¢=¹*ÎñZ—‘e†¦ óü)¬gç^HÑF*å@»õò²k_Í.˜$).<üŽ{J਺yw¦)ÅM¦&è9Š\.÷Ïü>²;ú¯;'ãÃ~d±ëÚ$Á&©.…UúçË$a†)O¿ -êUMVÆpQFÆqæ#DÍ6°§¾IöŠãò|Ùí·©8,#‚Û§ X¨ëfµØ9 ‚LŸá³gN„¿z(£Ä›É+s¶a±c3ÔÂ|nç`=kÞ´6ŒDãPï»Ï±#)gªâ#È¥‹¦ÃÅ$f„Vè¸Ùç ¼—¤ú<¹«<¶T9ÔÚ¿ïz8­Z,º¢åT(Þ¥EŕOE½¬sAê*ÁËÙü3f8®™V +&Cé‹=ÅUARŽ«žbÉSµ饒)ìó‘r‰Î¢1*8·C¤åôC&°€»Þ£Ì]É#£™V“³&,výhsµçv_hӐޡ.4¨‡wd0ÆqœÆ蒲Š÷Š¬”f+óäQ¨;䎛0Ô±ìه+>šÞúÇ]raáâpÓMrþäsM÷ÀWĬc8_'±EÑV3`>çš]qÃ¹àêNS¾8rZËŽ7Ê3rWQÐKy‰ç På ‚3!ÑÜQˆfŽ­¨`Xï:B¤Ó-~»ÌÁË¥js0â、“<â’ì)ßܒ–k¾óÍmZq“´¢ªn\J]µ²Z4º,E>‚ð -¥Šœœ ŠÆL‡!Õ§Tv ™;uu…{›!‹ÄBå—+¢Œ>\¢bÏ~zS•¬òªÊB†Fq0ödG±§ñÓ\ŽÂžy¡¨‘L$¾e 縄æ°°³-&[F{sWQó àL {´ ¤> »Rl Ëqç¯Þ#[t>V£o!Ü+äUß} ¥ºtw™T½$oW÷0"òsjaÙ΅܎+ã!¨ÂЏvU=Ce¯“‹²dX˜¢’Ó`à5(xô܎w¤+ÝÀƒSü8¡é=Oc`xcŠRĮ€• 1ߦõ{¿°F ,ÖMtÅÁ.Br¬ö"ˆ²TiAP%ÁPn´6¿ÑÛܐłâì\6§ù1i¼²‘%£²êÙýæ2×Î̆wËaÀÀ§¸À­ o—V"'è–êUæ\e'߃ûþՋÚMBjüåWü2¢ô—Ñë:¬'à3¢>V}ýPv‚õ8ÝÂøK¹5u*’oHހ3 Ÿã5P„ÙÕ"ݧ‹p‹?3Òÿ+ òaY¤¹¹“8‹,䎃 ­g{敒ŠF’ò­;¤Y -ŠG£D‘^Ãï}^¨rþT’ã†Dބu¿Õ_ŠK!¢œkª ùАl Ž zUªQ8Ê£¶¨ -xù,ý7åº<&´.ÑÁ€/ "^ã–/Ö§/Ö܂æS/îíGEÕB“ÔUò,j<"£”ð÷$.½-ˆ€¿P†¹Mö¥§+̌>'Aº‚g}!…šJg_?‡G.s±Ú‡’¦fñj‹í³X¡RjŒgXò¢…:êÊ0îJiYí b‚f>2H1æãIp ­ñ"°öPxº–RR˜ª@»¹Nø÷Qð¼µj©–¬@΋…tNÞ¼nYJá—ÛÆe"bϤsSéÖ,±¥eg1S½SyošÀ ӂ–6=cºÓ<\t)P‘úB¯å‡Á·_|°„ËGçàEWé(»ªÅ¹ BöGÁú™M¨Î©“À6%׬µ;XÃ'éáF;"ç¢aXIñÄ¡u=Ώè^ªó¥2ŸÕ#'Ò?¡ ˆ‚[4Î]£•Pü†,ΩeÀ™?ʌT1Í -¹ÑUÁt©,CYo@/áaë:‘qeˆ2̍è÷ˆà2⪪xVëuWcó -ªÊhØÜL]›k*׋~âÞõŒôauF¢Ÿøpï‰Æ° ®òJA,~”éÂîh،ٹy®·•1øºÙÃá°÷ ñ]hõL Y®öa5èÿ³" UŒ{da9TÖà†½lÌÁX'ÈW×R€¡ü\‰’ ÔÊ '‚E¯AˆV0{³V¼kˆt`¦Cˆ4bÅ}v¸ ßx(ÔÊRÍ(5Ìž~¡ÚÀéîÆnL5Ï|1ø?íP½‘RÍ(æRÖ/Ɵ—n÷ôٔ ò7U²¨â‰à›Q(út1©èõï#®©|0!ºF/*¼há W×N䮢Äc1%êè—ÛÐT¨VKêPƏú - Muâ•w”‹Róò˜7‡/ˁØ×eÒÃÍ8!ò`Ê*þþQ30ƒ“(k-· -’¨•€„…|"6e”¦EĄ¶ÕÇÀL·®›%‡¨¶˜Çº”}`Àɱɮ.4LN©Ž{iÒâ¢à3ʚ<ÔŽ‡ªº.|QCT‰”ºÃ˔;0ˆÞ벸W–ÉYcÆ%Æpê‹)béFØÌ£*v2c©7ûT•µLÂC"Ð.SchYÞ¤âè7`ÍÕz×ØGωnÐDsîBWÚÝûƒƒ•DèoB˜ŕóš PÌÜ7j»þ?1¢ÛJ÷j“›X,ÜxƗØJ… ˜»›«øë(Î/ã—8åóBG4ô*¢¿ò`Ä1 þ‰Iú ´»ëNíSK×Ptuå\sJs#ÄYuñb¤/Ó{´‰UnŠ×ÉÉ¥L†Ý#]°øšÓæiv¤n‘®ãÌímF|eQÝi9תcµðãz&šwÓï͚×#yrðÐZ„é¦~ +꒼Ð5ìÞQo!*É)ÀŸâlX«q‡ÖJѓÕaLëÏ9˜UTM€%o!7#OÅôe=¾ìÂNgÑãÛíÎU‹ÂèqWU¿šØÃr¨XLZªKXx¨P]éø̺K‰?Âr…2S—`\.Xe˜odt<•À "hßë.~‰§“cJ«…}ƒÞ>›¢5¥Ú4oÂ2¡»Ði‚9(1Myäî¦H°(ڗ~CR„ÅpRHØRö‹†ãT5!íE&:g¦t‰Iãaîãí²r4¾I!È#r£%=!Ä¥•Í÷f€ë¹È›A°Ç±;.K2×ÊAü9¢´èñ;ÿ¸,,¢wÀ2}´,-Ö· c¼-ÀؐO8|J\x¨ ñÚ—KJ; bÓÞÑbòÞ0NDt÷e;vÇ;ɇ2aAÐmÙsD­^ô -»íG(%Ìb®Óa€°Øϼ•›˜2…p*¡söõïc‘ ¦™Ì©jõ‹'×ìÞ͊¢§®y÷;ºyÁŒŠ Z¨xªâ/´Ãðìþ´A¼Œ§o(ÞÝã6-üÕ«,ïzh3רÈ쟮f†*Ïä…^ÛÇÅ)Œ<“jELuÑÉ*ä7š£±ö9É3´Ìú:wà}Ô¨ 7ÃH%µa~ÙěRð(bÊ;J} ,Ä¸R;Ý֜92žÑsGÞá2㰝ëñ§^Ùl"DÈðA—Ž(ã$…›UX…ïH±JçqfÒ¿ZìL?v+¸kwò¢TKîêã -ñÜSÚ¤4XãsŽÎ »‹& ‹mØ{,iÞÊö覫jà. ÂR$­ˆ'û„43ð̏¬h¾¼z{¼ŠdàÉÖEí ËꝑìØóHAŒ·k<JUwv\¹']˜)ö¦…üM4ÝÊÛ8֝··<‘ ï‡iEO ƒÅÜôcHI‹¯´0@IJun‡¯·—å–ô©Ð€£uX<¤\f×憘}°rExx\U3 Õ>Κ6–=ô®Û{qO7ï`ѤÅ2T6±Dr),¸Õ0›µçÍj öª¡…ÎXgó6¹*AÉw—JÆ©®³ŠçR²p)Á cqïÄˌ1–í±e5Äøgâ¶óžr%"x˜'Þ -Õx‚«6—ú”Å`py5c ƒ•·]xŽðŽÕ¾äÀÉàòcʟg·šÛÄM*IMòל²91÷}[‘D‚­†—wwTMv9ðdêlèr ¡à%º¼·hfåøM·ŽaG—3ãix4‡„T¥mrùSòJ.‡„WpmÓ©`èJþ1ÎËr‡.S’ -ÎȂ¶uãÌ絜ڊz¿AËٍï¼'³õj b9ÿ;¯œ¶ç™¸r£Þ礕Ÿ–î°ò³œÆ¬r„µÔYѬr,/“&¤—yé^&©|˜òŸ ò¡’ÌSŽ>F͠㠗¨/ÇÊ?#ìÈñÓxÞDŽÃ¼Ê‰EHÕÄŽG;ØàSI½ÞŠgB¤¸üÚáäm°Æèg -gc#Å×'P㐫£Í -„¡O³ &hi+Vúh¼;•œq”ƒžÖ˜NÌ82"½„”þ5Êü1üp|€á -È}†˜x4Ö»1ÎTôÐgFÙ2‹€YãXêU1_ÙL•D/׎€ò.^Ǭ“RÃOuÉÿà9Έ­Uéð (‘ßÈâ(º•¦å¿,Ã2†àŠÃàºaÅ ‘) -’¶Â juù[ÜF -rcŠcÅD o Åñ{\0(œÍó (Žì _Ÿ°²<ëQ“°·h8¼ÓđïQzÙ0ñ._)QâHRDz‘Ä+çkØpœÕ -‡Ü ŸñÓø´„ˆÃÕ½Ì=à BÁŠ‡šâ4§›B \.§’ˆOÃʏBÐćŸï zøyJ€´ÃÃÏèJìpàɇà$lÃw&dá6 Zˆ 58+J¥ŒÌ '}ùÑC˜ØpœÕY'4 Öï3üìΙmÈpXõmšC1å‚!VŒMšÁ'-œ—j†8/¥ù¬p œ•XQáHkl7)¼8@á½}~å„÷Pë&¹¸æâ`Žt-¦â ayÁÁ'"¼<~#„·¿!-jU·i@8{ÖZ1ùàõq«ÂÀƒW5kL88vk:̬œÃû®éÜdp”«Ê o!V^¹à€ ÔhÞ@6@—ì{¨÷AZ³ñà:µŠnáÕ5Þ÷ªXà\ᝓ>¢€Q<ðÃYÃîêÜI:愁NBï,pÓ$' -ü ï;AàðÂÊœ¾ÚÐgj¹³w¯ýªúìÊ%o ð›!oÕJ ~36 àÓ9;½q¾QntÔ» áNցF=½x-æ”Rˆù>ç±Ec›êKB€ò݈•ŒOà îW±ÖRRÒïˆïjZC¾[UiF¾1˜Iý´ò½!j!¸%ðÞ­:=toàÔ%ö\áÞ5Û»ºUt¢½aˆ6«3!ˆ£¡f!ÀÞŒÐ:P_|:B¶a½áKJÿi ‹æo]/k ‰Ü÷§êÖ(ÿ^ƒõÕÁôæ}²×6‹"ȇi×$z7×`%Љ±½[Äƒç •‹Çç °„fÖxÖ— ón`y§(oEyCEÇ,HÞ( a5P ºÁdâån$o®OÚbÁZPl6’÷´šä}>ŽÓÈûƒ#>]u L®ÙZ9Þê·t• ò¦ÂMæƒäMy# 6’7>^Æ’ä …Í ’7<'õäM+ë ‚Ç­×½ö$yVãžõä÷í1¶Û;¦òæß·iÑÇÃwF3AސrÖà*vLýTUQÆy“!‰Aޔ…ŠÄb7éH,\Ù@Þ4  o>©kLŽ7E6Ìoo -k¢ÜƒihHjp9Éñæ&üd7Ž7Ìl~oŠnþ$Ç’!"7Ž75ûšºÌñ.ä,_Ïäxã UÅÐÆñ¦VÛ%ـ™aŒÄx 4e„ùÒ'2 –ã ¹ÔAg`¼)|&ågÃxì`n`¼)•c ×oiçX­¶b¼¹'«jã]xoX¼Û1Þ¸°Ëå¡]ÆØãMëÄWŠ7û/Çg¥pÂb‚Ëã0ÇÙˎñFX®âý`…U®‰ -FoEžèŠð~L4K‚÷c5}¼qœwz÷sÇÓ5¼›Á<™ƒßëà„´ó»QA}‚žÀ%Ó»I>nªdJx7¢®ý¼ŠœÛaš¾[ ¢Wr7¼+¢M2ðm_+©Ý؋ïííF@Šƒ`v3âÈZæ`v³7Ëß$hx'v3Â'ù ‰ÝêÇrKÃ#òâV·[Lb7WUjCPD¢—›{°lÕ²[æ; -V›6t1¯Ý0ˆ~¿!»Ù܆ø€@vkÝ`ˆ·ÖÒ-úlÈnu$¬ÅÈnÆÃôìæ2'ÛÙMí¹°4fvSŸ®oÄÌnZô1¬Ìnš»3¿ - ^‚$²›?ÊÊÈ Ù-ÉQ)­·²¾‰ì––ÿpÖDvÓ}d˜  Ý¸o§¨†v+,â‚ØEà„àH3¢Ûèîé/ Ý -•œ&$´»d?3»3ВÌng˜øܘݸT9sÁ즯H$¼˜|YÀ»1»±€è<¹h„•“Êa‰ì&êŽ/҆ìVdùٍ7ŽˆŸDv—ó :΂ìfсÔáÁ°!$§â@vÓõW‘Ù]RÅÈnZ˜d÷ÇUò¢ÀÈÌï|Cv#™‚+å)@ -QyT8ƒ`.²gú†ì¦™ ΌìÆOPµ–ÈnX8ñíÈn˜ çId7-ÊNÙ- “n+²?JJg"»‘"¥x+ˆÝH)ªwá -ìfF”¤ëv?Î¥%‹ k"6f÷Õ"?l+0Zº?&vEJ+°ÖÑ/Î>0v¸îѧ}. †ó= ë16Åfà«Õ=Ü)=IÝàÕŽ®36†6윇6P7I×÷3­÷43sºÓ°qº§Õœî»FË0ã·ÁÆRÃÞÓ}ÃçfæÌ'¤; £{Z…è¾¢)a ºâ`ðut“VÞ@7¢Üªˆ3ŸM#+žûqÞ<÷2£ s߇ßþ Î}Eµ`sƒ£v‘FsøÂaj#s“ÅÜÂã]¤¡èr8­\ÅøÊË #)—A冡»L®+bÊÁížLîë˜Ê?¦I/w»J$7 ÔnDn ïX@n„YÉ" ÷òÂã²n˜vËèֈÊA㣕%Œ›VCÌ©À~°Åý2(²¶‘¸G¬ âFèW½Û̓Hù†á¦6•mþLáF^qC¸//vw7›„?ÏDp¨…7Nˆ%G€›§…q3øÛ¸Õ¿ ½û•¾€À„o³¬²_“½½g¢·³‹s·¯Ècg;ˆ ¼}Y¯–ÜíË­"’¦¢ -Žòuû®ÈÍ®¹ 9"µ+q[tÑg·aàÀí;Ä.oVGÁÛF]3ÛU\µq+mU4\lKo¦ßÌÚο7Ôö´š´ :Îp«EV°ÝmÚ8ÛO৳¥©;zGwc*øëó†Ù†Y+¡ˆëQ.tF¸”…^ÃÔų «@­Ù†…–ÄlsbÁlc®UX<0ۏÙRIÙÆòHmßWÈöë"Uùmžïr@¶ A¸‰=«gàtòÚ²M -ûd›ôv‹î Ùæcem¶!Û|?8„d›ÅHWÈ6›…ÆU(À~Ü.01dû£÷ô9=«?&d›HË6È6Íʾ²­Èd½&R›G• ¯m†Ä¨n -È6³Ðmà0ùÂlŒmÜ×q›±=—ÉÁØÖ·î†K ¸F?é`lÓÂ+83B:¹ÝÛ%è6É؆Eâ†`l³ÄöÖ&±+•È.Ûx …Å -Ä6¼B—z¯ˆí駲ïkÈJÄÈ(Qå´!¶³ÛlòÌÌC ¶a‘ÊmCl“˜Áø@ ¶ ùçE¥³êF±0ž ±WØÊ#¶)1Tcb#¶ñœºÛÛ(×#=-Û¨[çÞ%éìž÷içkC#§T”ñÚpÃ9¤]¯‹<ù•®Í ‡óÀk3ˆ¤NèChášu¥kËJE’ñÚ<Ö0m•W/^›qQv( ¾6ž;cŽÉ×~îà /€mÔE¹.“9w02¯Íú¢"Œö¤k£ÍO_ØÚ‚2’lmtí¸•Ö˜ÑÇ+ -ƒ¬ÍòÅ®-xٖ}åjc}$䌃.®x9Kµ€…t6¨öåcÉÔ¾\¼–HmÙ ZˆÚhÄq;€ÚÔ¦Àõvî݃yٍ¸Í– —‚•=+MT6ô/œÄ7R6.‚? ì3Ú«'5fjuµb²ÏT&ûŒ9-(Ù8£f<æÌÍcªap$٘ž.C³é.ÄÛÙpúNpȧÇ7<ÙÐeQQ½ò±Qo­Œã¨ÏíMÇ~†ÓÙ+F†™ŽýDOó`c3sGc?„$ûq"ÁØ0ÄÏM06-‡Uw E*$¹ØP§E°jb±ï+Úa‹ýæ4¨ØOàW(6R=z‰F&ŠûT„X›‹'º›f>Š]È&.ϧ„b3'AŸ{£bì¼RP±‰à*~¤Ù`s›Ûų´rÑXlX”ß -,v)Q…¿a±µnzúÄb3N—(°Ø¢@í¾ô€¿¨æqÆb3ñ¬æqÑ ìƒ«9ƒ‡ß˜‹ —ƒ 7,ö£bð„bƒ5 N´fb?քíHìÇx±a,Ð@ìÇèŝ‡Íêá6&û ¦uP®½dt£aŠArun'»º{Éä­º ‡Í“kmÒ°ËáJɤa³ -†£òJæUiØ´ 7À`±âQVÜiØtI«ëš–"®\J6,ªÌØpØ\L7sO4N°4°J³¬ÓÀ BAÙÆÃæòºF½»¢Í#Gð°•rÆ?mf±±öԛ´±ÖØDl¸¦rM‰h„m[©»N$6uŒú*cz‡…’æ ‰-mèh‰-¬ØbsGUœ­@lÆæNhñY¼V - 6—¢ÊèL¶Ä O›8lž=OÃFlL¥fÿd÷êéŒb8ã°i¸bÅaÃlD‰pØÜNwÃ8l\#֊ÃæڈܕÀaãÉKiö4l@ìÅl"6~BA›]3 :÷[ÓÂ%Ì kŒñAÄ^,+{šƒˆÍU¡D&bç»»3±™$6Á8›IÍêrÄ©ÿ¤™ïJ@±™ÕäÛ$(6“ŒJlPl‰ò¯gB±Y T@±¹ ×Î[ŠëkL*öìKTlFÀîû|£b§ªž¦b3Å AÅæ×⃵k‘âðIņ·0©ØŒ™±ÓÅFÅfĉíÕ‹M‹&:a±i(bÅbó1¨ÓÙø¾3_‹¸‚ -]7,6qbÝUþƒT1K鋍AP_݆Ŧ…ªàbÃÙtós±ˆ!ÚeãbÃÌ|r±iáà -.6-j¿¸r±yD -Š‚‹ÍpŒ -ҟ¸V×6í\lúÂL››l>ö .63j¨¹r±§9¸ØœÙ -0¸Ø¼qì¿°q±avç' `‘Ö+¸Ø܆®‹M3ŸYp±…:¼ÊcS9Þ°ØÔy²=°ØÐq¬I.6sC՝Z&›1r² -‚‹ÍªægÅ]Ãë¸Ôqåb?Ƒ¤5›+*5 {ZÍýBÿ£èZÎwòÃjà°îà}?ÎO;»ñ.—OIÄÆÃ&E+ØÃÃÑÎÿ${844ìÛ¾Æþ}L µ‹ü' -ûŽp#aßê­°ì&|qb°o×ìì;FÆ`ó}9kP°¡vQ~d…`“8!ØРq¬ ®tµ˜oC`Ã(è¦ ØHA÷ä_3™õ´7üu‘Ì3ý†Ç]r5<õØá×Ċc$ö5zP¡–çøÄZzE_£^ƒ_¯ƒE•äëÂ7ð5ä_HöšêçÞ&õ¨ªgG^·3üN¯[trà5S\ÇýÆ»n!p Ü5Š ¼Üu3þd£]ÃH5`×-”‹»FZŒ}½7Ö5jž:I×HohaàW 7쬳q®ûc²z`®<|Ú¤\P¦nk¤Žú3א̐®„ëaà¸^$ßû1xk˜ñ¿n}^ñ8¸?£k°­OÏa;Úí#›Á¨47×¼[„ôƒç¼q­±PS²RXëXj}5³3­±vtüžnג]ÙúÊ؍oé´F(' >XSÜ­M œ5䂚2Wš5®x¸¿+¦ԜŠà3F©³_+ËÚtI²¦¨Á &¦a‡ ;ÇzDחÀX'7 (Ö#…Ě]rš \˜ÎÂnOœ-ÀÂTNŠA°P™ ÏXŸæ müjlû3¾ú &XЫϐânðjXYìjPmÿ t5~­$˺ÎïG¡£Wç#u#¸Ǫ̃?Ÿvj5’'Œü´Ì ~vÁ¬n– íÈꖍM¬F]Š§V·HQmÀêD>¯MŒNÂÀHɆ«nÑ hÕ ûq4XuÂÚ7V5*ìT‡é’¤f)ºIÕuøóÝ@Õ5T„Á©®¡ L5œq½Aª«=‘„TÃÀ ®Õ5ú¦nˆê—' Åiª{¼_TŸÁÞùÔ'ÇÉOÍB!õ/—W””ÜõfšîDéßÑg¹%†SM ™Èšúa^¶|J2uw+´S_î`µs©O'K]|³øTSÏ÷‘­Rˆ¿Ú¿ÓÀƒÐÙ6²-Æmd[ìsd[;G¶å¶‘ ?‚(ľñÉûa§q?‡i_Nxv¹´÷áûE1Ïô£|¸E˜gŽövL)ŸÌò‹‹q;½Å>¯e9ì¼êå¶[„‰ñBäsÛ4¬ò¶ÃNã~Ó¾œð<ìriîCÞ¢y÷öi}>îeZŸ/Æ2­/ÆmZ_ìsZ_;§õå¶i}>îuã|1ÖÃNã~Ó¾œð<ìriîÃWÞ¢ýÍǽg¾Ë/.Æíôû¼–å°óª—sØnÑ|ÜëÆùb¬‡Æý¦}9áyØåÒ>܇ï?º+$â]çw%ì›BvÎõæÃTÖY^ÜÌ È8ì^ЭæS»«`ã»»²n<=yØiÜÏa±Ïž‡].íã}ø&“霣÷Û;Šå¦û±œíbÜ.mñaæ}X\ yÇ?a»½‹S±l<ݏ婥ñíOûò>äa×7çÃ}øV“霦÷;<ýŠå4¦²œðbÜ®nqcæ­X¼ yÓWa»Ã‹_±l<=åÁ¥ñí)OûòJäaחçÃ}ø&/ðü.ð-]íãøöí“oïãÚ{×>>TkÈ÷oÓÆ÷ñaÝx~òó°Ó¸ŸÃbŸ'<»\ÚÇûðí—3ûžßòró«_Nx1nW· óV,#ϼiËç¹Ýáå[^6ž_ýòàÒøö”§}y%ò°ëËóá>|ãåÌ~{燼œÃü䗳]ŒÛ¥-ãƼË°3ïØòmn·wù—ç'¿<µ4¾=âi_އ<ìúæ|¸Ó@ ÀóѓlVm¾„/PWl^ÇbÜ\”Å>ý™å°ÓóYÎas“>žÛŒ´|\AñÐímœÐÚczۋqsÍûôã—ÃN¿}\ÌÃ.wlžÃ~{ ûˆ·Í¨ÚŸZßñ´/ïCv}s>܇o8ƒæŃl{–d–Óþ†æzõöÛõfı®5pf{W‰Í~Ø&è~-éãßéGN6–\7¾$Þ;û9LûrÂó°Ë¥}¸[È㔽Ý"οçÛq8Վ²ÿâbÜNo±ÏkY;¯z9‡íÁa¸ïçmcWÖ퇝Æý¦}9áyØåÒ>܇o³žÏ÷d®„¦ÉnÂöê„C±=¶0¾¿:ëÆù6¬‡ÆóÛû2¥o4Ö\OLÓ<à|~ËOÏ{·Ÿç¼ÑëÆùHÖÃNãùáõÉóü–Büâû€öíNñBžþfôU¿ßÖ¸Eûa÷¨ÏáC TOõ-ª¸v÷s˜öå„ça—Kûp¾2 ì·h>ùå8ó!-¿¸·Ó[ìóZ–Ãî1PŸÃ‡¨^¨·h¿E‹q?‡i_Nxv¹´÷ᛠô”ÛÇۋt2Abë9 ñŒ÷|;ÛŸ]ÚbŸ÷a9ìž\÷9|H®ïç¶%ׯ‘y…œ&püRW»ÏdÜç>ê.Æmˆ^ìs<_;Gþå¶iâã¹}«ábºÖá,¾/1¾­èD:]1v"ߗòz3Ø핋ýãݽ·ñ}‰±n,CMܯåk\nìòáæ†ó_žTßë´/ï@t}[>܁ïÿ7c¯ÿ槟þòÇ~õéz»þÝB¯ý`Oã^?鿎J÷wí¹Xè²Ú¿¼ÙÑUXÛ/oÇù9ûrœŸ|žßFœ»,ϳ\ra´W l|ý¢Œ¨å2žÇsÊXP‡ô9Ž0Žî{»?ކøÅ/òX_Ö×O=¨<8и;NŸK•ýÆÎ2Ž†òþîëu³ñl‡O¦ß-O†u·þÑ2^Ÿ˜¨Ó5¢bKÆr>‡×³á@¥Îá>âÚôºÔ a.BF´ôõv©+ýqY¾ñ– -m¹èåí+èyÀ—Òæ=x{ŸãÝ ¡Bæ` ›ãò#ƒìu¿m~Ö$“ŃÓ` CÄþ#-ûAó÷@Û.ñ8Ž×Zÿ‡¢;¿Ÿîïk#–Èü’žçžFtÔ¦qÜq;`¿®Ü؛vLÖ:(C_;ƒyrhËgý:ĸz‹“Ce­hgeS;K_ߋoÚIüʧÖí”}è&EeœŒ¨|ýêümžÔÙo_d)nd-žUíÃO¦ûnÜàq]ì·Ðôö¾^¶ÙÎÑ뉪"sä`·gÙoÀ[’ûõ9€¯Av°Qâ°wlŒ¢%ïøÖ×1öxNÀÂã[¦~õ*æ]EqT‰·ÚÒÓ~œ#ì剻ŠÏyøQ>EŒ(ž¥ñ÷Ƴø a‹Ï?ó‹s¼DÑ^¼?/GmÄݾ‘µŽCÝzU`¬eøQbˆ³±Ÿñ(Ÿy¯nK{ãëôÆÇè+Jõ¨Ãoråy„x¸‡ž}lŸÆƒGóÕ«X_§×‰Þ:H{Æò:±HRvÔI{Oûxâ} ˆAƹ?y>b–Æû|“û1í­<¶w 0¢xÕOMWt³a‰"6ñ(WûŠû8Bí6žó°û9øôh(ƒoëØÞý-0&Æxç¼FywÏÙX¨hûÍ3ájn|_ùsu9Âzyz‹×¤•°j²W( hgÙbz9õ>ýtΎ%¥‡Ÿ«?›gæ¯ýb~ û„øé´ÒãýH5Û/¥CïÆz†ñ‰×û@hxãŠV6^ñsüš¾zy¯€H¼cÐ`sÏÃþúº|ð×u}’Ñ_¿^m<õAñ“÷Ãö3fðƒ¯%e®ËÄôµsX¿>¶µÑ@Šé4¿¾9ŠžþšjúAçao‚É9Þæ8\kÏ¹àˆ¹ ÜÏçñvë­{»ð¿fÇxûÁør‡ÿCÞèldA[ö§Å@ˆŸrÄüøº£÷Ïޝ!˜Ö5¦fNC?¦½\~Φ‡«î¹~ÍÎëha¼ŽpŽ/<íµÅÆWï3Ûõ~<‡é»\Ò -yŽhéXæÔcî$áKØïQ|¨×Œã9Œ5>ÒÀ¿zäyO 0ê²ýa·›Á1ðÖ½ŒgŽ,¡ñlyðóÊ{ÄsæéåÆ5ÇÛ{KÛC«£¦ÜZœC¯ã†'ðÕ«˜ˆ&Zǵüâi?æ÷º'2Ž'&.5l¼âV<íÎ êåj{±qMV¯$l(r³M·ÿ«§ö%§tÌ;ìïÐù1ìå(^ËÐÏ´±5ë×Q{5´ Ï\ÉWöžKtdìž=€}»ê§¯žÃîTÆ/ÒgÏqˆëÍé*ÚX¯Õûû¹Äö Zâ^l´ïƒ#<çr*¯¸pöùã°S‰AâÓW¯bý,è¼j:}D’ýî#ìXó} »]Øï|UÇaä«GÎm'xh¾¢»Þñª‚„œ«â Õ/i?úµ< ÄLJñŸ¾zäy¥'øh_¹RPֆWÇZ¹É˜ûC•$N’ŒÇúz—ëôûóÔ3Žðú¬b㞟]=âe ¦âóϜÛú·é×;g›·×^³ÍÇoá?ü·#ÿ[þ(ZÇáŸñPM°÷ócØ멹ö›_>iñyaO^Æ6®'>×+<„“m°}ÇójãrÕ¼5y„£Þþ­2rDBŸÌÁsx¢’ñŏáå.W ƒ”±ç‡½G¬äÿÍÆGàÛcãêÇ=0¿´öˆîéYc±y?GŒPõ(á`ØÏñ¸Òu9{ F ÉxŸõë*@=»¾v °yË:>v.Ç:@ÎaïòÆ¢¥"½Š×pÛ "<¤P´Þì³1[GqûÐ -Æ{î}#¦¡½ñ} û¸ã|9‰úcø ~ͶçYë<²WFŒÿ=q^m4_.=.K‰+«çÜÿu›âÁÄäS‘Ó :ü •åõb¸d9ƒ'—ñ£ÏkëùñГò»[NO_k¦gÙ2\Xÿ”K#.£Ç;z?¾`t6ŠpÞ3íË;zøêɽcjõÍAK¨v‰YÒУ¬Çm/^"uD²ŸW»u{:¼ÜßN+Ï<Âkݔù9¼ñë[gqiÂ0ç5ý| -÷¾Î#¼<˜n/ùýÙã^ÆX fê7»RëÅ«ó´xô€f¶DzïÞtÔ8 z2þ¥3·ÂÙú¸Ew¯§nog§ˆõô;Œ¯¯¬,Æ<Âqäz]\\ÀœÝ <ä#W/~WûX®â„zÂGË70ª&Rô q+)ô–ó%qèöóu·®+^x½ihv—BqïùiÂOÈ×­ûž+ýºûŽkË %ì>ú>Ã'x˜¥Û8?­çº—#÷+?­¸?wØ#ïÂ5îåý -û9š7ž9.J¼å3b²jmÌ#ÌHa,s{®ºðöC#f¾œËü22h¾#>ùœ/ã%잇òÝá“÷š÷­W'1µ•ôå -Ékw„J¾ÙÀ…-ì(º’±æ8®¸5sä8_k¨y„ð50†Ž:Ï«ä,1ígºšO/}qVƉí5\¤¢°ñK<Á«*r¦®1ñ")û9ŽP®|²FM´AÍÙR¡A˜<Ž+ÞðÆÖºñÖ!2ú%ìs”Õ -›qp”¯\‹Ÿ{Íÿa|Ô)CGˆä5ÔØ?‡µ¸]Ì3¯3«9®`ÿ̞=§Æl|Ær(¾=öJž+ÜÀ“' žGOl|wz•šª{gÄaQ„ã# Ú}×ÊË»ˆ»ïkøU.qnÅD3Ç!eꑓ́^T1£?OË«˜w©­øîJù­åd¡áô€“琗†Þ–±î3&s̹JÒõ¢¶÷ÈI÷‰\™ˆe‹hn†±3aáE¼¡111w’1Š9µ¡aœ¯n¹í-ªölÞ4ýܓéê8a8rámöDFÿÌK»žs9‡¹,Ëg4 -ñ¦I¢÷œ‘d¥+xäÎ5Ð6žÜ8#NŒWè°ÓG½ ÖÊ#pì_9GÈdkV6åKðŽ…AÁz> ɤ°ñõáæ ÉL:ç•ç€ž•-cÇÖF ùjê»ÄŽÔ´Eú¨Ö[’ñž¡öø^ÖÔB‹ 4Y÷«ûG`PÔ®•xWÁmûÓ§Nëe?2X×ϔ^ù—{„ñœðqçUC‹CÆò¾„}úG,–Jû _ÕsÙúIEéé{Wó"-Ž¼e éVºX´Ç‚ÄVف§ÄÆ#ŒÖ¦%'aûµÚ?_cÆ¿Ã=äËÈØþzý‚2²‹œ¶<Ï{þ{ë’áAÉXsåÐ,‘ÖŠ\´èü‘ѺØ0K ¬Á‘±e("#²*‰"cÎIíhiÌ)­õÖæf Œ‘Ï/a·²c§ -d¼2ãQÂôŒDG> ôµH7§ƒnﳯw(x¢-­ÅÄú]ö®JѵÁ8£–§æ44C˜É ÷:}ŠÁµåŸûH =3>å¼bþ¼ïP[qL²FîVô\· kȿќ7=¯ð†hŸáÂnaï}‰ôíëÒS¿_óC|SGŽŠ÷ -69`k‹¤=4µœäzõÁÂ;FºîyÜRbã×Ú½ñœúð•EA=±p†dD8‘ÆÚc•TCs{fp¶”|íÐÉ$Ѽ©æí0Á½-r`¦˜ F c¬ms¹§–G>cãžÃjWÏtl™lñê’Täðe,©ïeϊacÍÙ,/ çoH³Òìv.Ñ÷Q£¶ÌwŸšýûW¤³}zÈDaO%¾_ÇCêM¿»©Ó}z|fÏÕIîm%"…šO§Ò—¢ù‡]FîV–3»}mS‹Ïã.”£†±§·\·#ô\IO‘÷¡¦)„òí‰`Uíy„ãL•J-y„gwEÓkñ×Ù֚ò™G€<Éŕ*Û>ˆ$ŒL%—Yd®o²@N"饙,v7 … ƜÚHŠÞ̄>IyÐÒ%<â(óá 9–ô.ü֔€Iæ²ÿ‚˜YaÜ;:®í›tvéȸ–Lc -ÁŠL‚šiI¶ÍÈ85:UŽ|Äa&?&`‹îSJ(©Lš°fK"ÿ«åtEoŒ}v–‹ 1RiSz”tA_‘¹pÕ¢U”T€7ñùã ¡Uèr–çÐð¿JŒËÐͧÁ…’ÖO™ {¨©Ø 9" Å) Ë: 0(¢^ágO[—Câ6ð+Ÿ@ë;š¹•õá&YF¯Ë\nO,aà։…š ÊÔ7²}¡ˆBC‹˜O›—rÆiýÊYN]Gd’­È—Rö(’ÉaH]†®E#Ý%5F›}ÚuhÎò"±Óú8•ƒ+è†ÉÈÕÀ÷AF¡:4'G‘„ÌÈË EÐúa1#=-rÄtÞF«(Q†>‘ -gÝ£aö#úZ‰ÈœS%ˆú,[ WÌ­yIúžgyÊÎiÊ ›ÕܶÃÀHï ¡1ś :TêÏ8whÃ>¸tJÌ;"x/Å bÂì8Ho¶¥ã" 1ÇNåVM9åtábs}ÖGA®•ôHñy¡€–»Ž)æFç8hâ.îhË« Kr1Ñ÷è0[UÝX€ÁF‹:€»Ñ¥XÌCR9k%ÁÆܕý˜S#$t®˜ØGã 5=*¥@-ݼS$HÇÇädÅóȬkn;&œµÑVƒpdâ϶„½Ö0‰L˜ëírpUq4Ü'µcè‰Z•w†¥ƒÆÀ¸í-J7CF³¬¬ }Ø4&ׁ2¦ÅÔº€Æ&ÌÊÀ!yDp«ñ#;q˜¥äŽÇÇø×%w-y€YºÊÖà0[à6q®U7êU쀔ÁŒjƒwó+¢%Ü#ZÇàiaK#Û£À{]Å !%Σ9£9Ä@pªV¢”³nC\‚OÚVÊ5N©š…± VH(M\DNhÀ Z™BXß(\&ì(„¹ˆÝJ]Úc°€ÛªJÄnÉL\Z†ÁÀUJ›Ž<™áá²É+g*`·¸«¯ò™0Yllƒ áuÖ.a.n/cʚ ±+W”Fo³âðu®V¾Á3܉} 9~bEpºSÎ$¤ÅåÙù¶±QQð0q¦€+4CP&XȞ~–Âi Â¡`1§túÁ¢¢N¤‚ž'Tà¤à¢Ààž'Už ÐZÜq†2¦É'X÷ÆaÈR|]¬Vj¢ÃÍ"~R~Ì¥÷øAh˜gSD2n=~¼Á­õ ¬&#±gȖJȌßى_g¦®Ý™~¥fPXË.‡Äf™Ëå°'‡‚—¨…;a(.#£@¦6AŒY1$²6=rÒqHz´$ïÆN5…dTÅ*¥)Ê\ÒpdJ+Øh®Zæ㒷]y3[t -«š»–>}*JƒÊ7)·[C^v©ż gMvÁP§h**fкú^h–²ïÎ5)ĸ a‰ì9& vùá1ŠÜç’k¼cÍbÈ(øØHY®(GF9U°C‰>t¤)2ˆ9qœ…~ó8¨"Ndä鬐hì¦`]Dz#–n°@îø¯Ÿ`¿FUа`ë‰[± Z*ª“‰¹5sê=\îi€’‘¾„š¢Úâhp97P¼Û™œ0 Í.sJ -ÈÈèäÓR*·é€"K¨®`ªÝl ”51Hȸ-ZcÚSN!œ¥L•=4P¹²l˜8m1CIIz£ K@ M@b -Bk3$P w˚ƒüGsj,Ә‹IjIfI Jã8íó"`ˆXêàˆà^ÁIØäTëº5²-·@ë¡#-Èb– b›D)M=k`à„ÖŸÂŸ©\’ˆðÌ¥ÖJ·Ô¨î —‡ttÇ$—Á–EW¾]b,Ìf I—ö›8¥ß”òÄlbΜ*ñ3§³%UØáŠ2ÌÍzuÍÜU«Œ|Z«Ët†>—ãÉA³UÙÔÂHK·P"Êg^QÒø£ÀœGf/ՈL}“¶êX켊23ûÏbpõ™žI×8%íÚX)L!gçÀÀ ‡A¥™ë°}]ìr4½þ@ã#Æõã2"M݁po¸B LÐÀ©ÐEljTÚmÀèu6üGçŠï@ ?ѱã±<T jWHÏLm´$¨Å‰q8s#IpzÒm™ƒ$(G›wÄÀ/ÆÐGÛ7e"ÔÍXb£çŐÿNÓl«a€¹&uKÐíFÝÔÆÁªòIüº=w -åÈB5_\Û¦ŽÇ ½“)ÉxŽEh,ßõe‡Òþ·q r4÷“g -åh6Ÿ’ßÏ f€+WV36r%YÀ„­Ã&"O2O#ÔW÷m ¼`ÌÖŒÊÖàlø‚/,ˆÅˆ™‘Q§Bʸl8åù’vd1ðàdÄžG÷»4³Åhè4[[Ät3·5 FŽ«ÆI#ÓЩÅT€Dc̜å>n{êÆd2ñ£òAXË¥óÔâ›ÜóÂ-S,¢Ô rU–m)PFÎ(cênªT¨µŶʣ:0…×±Ù°ìÎCÔWTU©h,0P_‰“NʈÞ"ðª‚ÀFI‚»&OÙ µ… èXIH_IqØÒ[°ðÉíÜ*B†!G™Ó®îl™™UńK&Dòš-/ ú"±”_JäÊU)¡#/Ù¦A<œÄ@“$"mv4´tbj1I*a„b‹-ý”P-Mê° -æ„ÓÈ驏©8\½-á„S*3•8&€JþyNþBL¡="¸?1ÐfŽ{ÏÒ@[E§LxÌ*NlVԘX¡´åגÀ…T؃ªcÎC]('¹aI]òEl…_`ý¡†>F´áÒ:9¦uG®Ü^U¶š2LÕ.F½²wRH[;ÝaàNxL…k\t·PLâYÈN¢#‹ ðA;ƒs+¡%Åa°E9ÂÆI ñSå˜'§<\™säSÍ#@묉®Ì ¹FÊeÊeF¦´£¥cB*A¤ËìēÑ=îO©ÌJ¹" ÍT©å‚)ŏãY‚‚{Ê'±¥ EhÐJ¨èؼ\à¯7å]"Œg.FŽ,DôQ¾Œ;`ð6NÚ9Ðw¿ò\ACåç×Ëê2¢âaÁ)õ3bºt¨A¡ÅÄÅó¸çY£)sVË(¨BM\Tb«›rWÆIFTÚ ™cËѐn*S*ýêb©¼e†yø: -2v¹¬Þº @IÆ: ƒµ@a‡×6 ¬’nñÚªªÒØX¬]ÎH 2ÔK\T ½ؔZnÀL¸ŽÙŠ Êبm´”3Ü»L(Þ^K]ÖX£¢ÔÕ$.1C¹œSSÚòPf‰;»°¯Aªá4ÉN=¢½gÅc77Á^ԇÄ,vcÂô’ÐEº‰˜Ðê〬}±óР­›ÑpBímPÄ"#÷pRQÂ:óØÌf—8G7"BÂ(Ó¢Äi,Ÿá5oӘ»ü­È•c…bœ!—ÎgF5i¬ða”B,ôEFN*ûD57Í8½ïgÁqìŠàړË™‘Û*# *ª¥‰3ía"•q -ô̝qUù@‹upåjò`aù€ÈTb.Š »$¾N-£…@®t*sº¥ù™Æ¶8hÂÜ%H¾,3&ÑQæ\–8—g –TF sŽ®ÜUdìc ¦(y˜Š~BK_|5ušHb£êíø-Ú p©­4 hŸ«ìK̡ǖrÔPJ°ÀÌU·z3ú|ÍGgkÂE•BÐ~h®BF'„6v9gΕoeoÊSÖŒ†«2OÌ-sA¦°>œù5DJ´ÇÄOËU\²³´…2å‚{R\!.’€ej|õfȑѨ4З.Ďâl™åܦä#0¨[jí´Û¸)Aáyiâ -0Z/ °nAùÎñs[üZõ'B÷'Ð\HÛ4s5YI¬`L9Å©×Ú¥ªeNt“ éºr=©  H]¹P% Âíg´i ¯—@Žn AL„ƒ8-IÆ~b{ƒòw˜‰G•ÖbÊñ€g¾tžY|R†5~¥”MŎ9 >{4åCìjû(« -k w%ݰڈÃà!±˜†…ÄQ7¥0â·ÝWN”"¨„ÅŠmcFÕ™­5âWÛPúrðöR6îKˆÏ”žÿ+V¦gC{=Óp ^”ÁfS^̽Ƨ¼SŒH¡@2Þ¸ª`‰­éÝvÜ(ƒÆ>Y9@;5Š*úš'­DLh¼ ¸rÙނªKŠ&B`Bª2ú*}Ë@3(CÚòLlLÕt8gmânûCãˆ#¦‚ÙŽ¹ÄâX(Â05 -?@e–…Ñ á¤p3˜edè%_ Ȥ8 ³ bñüƒY ¦\¾.r¤Lœ®†%ø¼r¨eØg - P&N6l’¼šp0ðÙ×¹fɜÎ;EC¢?ý7m:­¨À^8¸ _N­üƒ@g¶q…#¯üù;t¬¥_G‘OÌ´@}äN´#ÿ*ÑN3VN§œ§óÄÃw¯sº—ð£˜Qä݅ƒS))Ë®†Œ)PÀe pͺœSî€å )%y%¾,Ž €˜ÚTÊÒô™3²ŸûŠÀ¨©^xxYiê$¸AåÓ£9xŽ‚K§jz¸KãÌív’X¨éµù-ÐÕ½#ˌp*†À)Ù- -.?uÙ+euEܵ‚SÅ(ܵ‚Ò (qæê5ÜWT£òbtõb* QVæ¾lI.}œŽwØbºµT9՗8ݺ¾HclÃêƒ+Î]} ÆÂÔÔbߎÂk´ŠÕöÜ5Z”ª pIÑ»^4wq¨àòsu¢U’جCˆ‘uu-Œ ÊFﺣ‘«×7[ñÏvo¦j×Á•)¥ìeŒ²_`v"WÊË×Hà.š•¹df(Ó`%¼ÌšÁà™Ò„×ÙMÈMqpU´$ÃF¡1]”² ö%]"`k -X`4ݛs=RiÏü„ó €.‡ª0îBÚÈ]oaNd“tãÊKS‚ï\Šf Éâ6Û:ã(KEWf{à7Êt®~ s7öYŽ%œšç«>¸{$%hV»¤ª,(Eâ.³({cx›óÔ#¾3®ê2ꎾ3®ÚÂ-P9a‹*«”uƽԗGǺäK_ªœrînc®ˆ˜»ÌpïAp=Y"¼ºÌÂKJŠ†eÏü%¥’Jv!C%$ÄúÝf=ƒÙ¿T˜*Uæ§ÄÝ±\xênbLvkn0È݈\íڅÝöÕ¼èZc^O`î¡*ë›ïvbö†9w#ßmI®1:ø]†,v9À”{tœñÌ֗ ÂÜ#”Wˆ}² Ýd+]ͳÈ×`šé[x8%>„NÄÜN6\Ü9 -mcoȖTÒȇ¥a%w´(ejBm ÐEšet±ÝL¼ä¥ ÎüyáàÌyxÒÄ%Jênû˜GNÙ¬ÜÀP¯gûwf&¬Öœ•‰»û+fnoÆAÚgê*åpºs¦ gµQ#!ý° T¢Ñ£É Ô¢:@áhž£à¾F/Îb™PwÏtÙ0¦dtìîŒnaÄTƒ|õ¥˜Ý¹ ÊœIwƒ/ŒJ -r$§:„€:?pb;,6ÅÓ R¸mìÚöLDë’ZmAìÙ>xXž#Ìʺ ¸¿§“ê\Ћ¿"Cªæà1d×ZUÖ¸ùiãÙO3ŸoÜyžÜíwö‡“ÑùãÖxœû•=ù~Ð<ìöÇÝþó½= ßϟwûá/ôý%þÆ"óãñ÷ïu{ÕÇÝrŸ_èoÏ}?èäøù°ÛwýÖð͒Ÿn7n¾¾èõõ{ºƒÃîédœ>m|®Þ[ÓmÚçÝ^g˜÷±oÜzÐ -endstream endobj 47 0 obj <>stream -ûáŸñ›Ë¼ÉDtãÓÆ­úݶ†kÜýçŶ/[½‰müªÛŸ/nÝo]˜Æº;¶ùç›0´ó¼ûü|\}lÔ~]ƒ»óàäÎéóü¬×jŸóïZýqþ°;>nŸÃÊïvtÓe£…Fëé¯1¯«Ïàë қêCzãƶ¬ßW ‰Êä;‡ùËn ºU2ŧÖ5什ɰò@‡ùhÒ«Á‘¨ýºw<˜ ÛùÞåy«:ó©1…Ý~åÕ=olÑʹ`ÐÙ³ü~k2u[ýý¥ót|ñ|\ñÝÖ©Á}:oÖ·øjŒ¨ÆÑYã18;åãå+mƒ9F-v¸a¬âNß&3‰¸ õ´½Áð‹WçÝq^ã”~Ó[Òºxú@®ÏÒ7å0îuǏ[Ýeæ‹ >,uغ<¯±H¯ù™¼‰*ÿ -^ ›å‡ùðytÝdÉ«6ù“ô^;s:‚1^•ûqë0?kÜþøª‡‡EÛVgh›68ý5o÷“~G÷s°ÄN:³ŒuÛñ¨úp ­kÌÖ¤m -~ۺз]à[‘ãÉðtÒËûíê¾uópUÒ¸W­exK4Ä`TýÉÅ£ö¸õ2¯ÁvÂgÖ¶ ›Quóik”ßæÿšè ¯±¼§[×PûƒãqwÜ^rÄ¢@ ùÓn¯Î¤Z×Pa[~kÁ:…ø§YÏÕVµ¶ÜKVk!nŽEng°Ú)§;åt§œ^?å´z¤úN9½ÂºÊéÙ°¥Õ«Þ÷ƒîh;ÕÓê›qsÕÓêÖ°vºÓNwÚéN;Ýi§;ítÎþÚi§u$þÃü¼Ÿ÷O–W®(òo¢@YÃV§;©q.Sûu±ŒN·×ª‘¹‰ÌþZp҃áåù 7x^]Þ±ÅÕØb²c‹v|Õ)±c‹;¶¸c‹ÛÉïn>Ü Œ×B`ÌõlïãŽ1îc Ƹ·_dÜ1ÆcÜ1ÆJŒñ~kòïÿµÏóáOy·}þüÓχï)Æ`Ùä¯+ºÎ-·jyÊݦ{›Ní6_uJì6ÝnÓ-_OLnoœg¡íâ<7"Îó/ƒÞo­Q>œ,«?¶IÁž{lëÂ=k éZ|îÊðϚOv¥`¦¹Ð¦LòÔªƒª.n_5Irs™Èîvµ‰f®ŽÐ0ïÔ«Á¹i ñ}WŽ^ãüm+'ÜüËÎzƒAÇޜpÚkµ_ÜnÐà²ÕîŽß|5ëÈZ›t™zk¹I½Ñmؾ»Kt“·Ý–§[¼Å©½9É×H4©ÉL6D6·:ƒWÛÌ(·¢ÄJÜDõlÅýºaKy³#zßSG¶òb½:`mØÅzbw±ÞÜeüÃf^¬÷Ý¿ÿû¼—ïë„Æ_ý{õdõuº!×êÕÙz×âZ=Ö¬á[juº“›“Ú¯k¶;Ý^«FÈMÔB·7¶çÅ^ñYÛ°RxÃËóAoð¼:"ªæŽ'n4OÜÞ¥íã„5b>vœpòòÖE|ŸÖ½fsØÃ{  ºê“µaüaóú·¾@õ0ÓM­ÕtwÕª_j[,\ç8ؔnk¯-ڎzK -O†£æ}*ë½H¥ÎºÛ˜˜•Óê³µc}ëg}ÕgkÖ·O`uçÒÁy«ßÏ{Çy/o×2°Í>¹®Ñ. #½ƒ+vöÉ5k‡ÝÑe¯ÕÎ/òþøaër“϶-®Õãëñ4f>²ÂÇÊÃß´r=§ÕmwwÖ896å0¬>[¦lIÉ¡W…npÒñiu£×Æ1;lS˜FõÙº&yŸ óü·êæè³î²€ò©`ÃÞú&»?èWX«Ýž\L–»úÃá…ϬkÃ…ëêãìtºãîË:£tO¬kŒ½n?oU¿áµÝêµjD¼O¬kˆÕÀp.©ßãX*Ohñ±u Y.Q BWy2¦ñºÕê½j½©>0}ď[Ãz2y`mzbõÁæÏëȶùږcuµ~PC©¬oDÕð³áà¢Æ©Ž­×ª$µú݋:Gõçï«#ÛS«f/ݺȥö.risT³“µaöœ]äR•ƒr½•ê·ÿ"“hw“Éä¦Æ.µ·7v©Î°)gÜ.véJŸsÕEà͊]ª³î6&v©½½±KÛÈúv±K»Ø¥]ìÒ.vé= mIÀÒuˆ]jooìR“cSÃ]ìÒÕf–×#v©½½±Kuvئ0µÇ.m mC±êLpý5»Î ^©åU›ž:±ƒ»éùàÓ³µ÷Ùí*¸–td+¸Ê¨!«k¨†Oê(©Á#ëb®iµÓÇÝ×yotÙÍ{'5ö8ô|˜_ –"ohèy·ßÉϺý¥ä ÖeÞ։t Y×@w1öeãÜÀûÑ%DÙouŒ}ÅskìYXí]„}`¹ÚEØ¿ŸõØ`·yÔ`Rÿ5ôÿoëÏúïmýCõ[ÜÞÂ3³>-n…xõ«&­©ka?]j‚Ü`£ø6W¯5q;ûøš´¢Ê3´‰e´·ý‚»6݊öh²„ém0¬ÇG6˒¼×ÚU·Ÿ½X8δ]›À_}DK¼Ú…‰ђé,Œˆ­Qw©>¢ìüŹykØŸ_äãGÕæÊueÞM<’·7Ùu%Á㚟͛èZm5oØDïÜù%Ù¹ówîüÊ#¾Rîüš;wþΝ?_ÌÚ¹ówîü]ɼ;¿Ü±sçïÜùWȝò-8ôyt»ž¬»sáï\øWă³i¦° çÂ_' y“÷zƒW•g©×}~>Ö öڐ\}ƦŸ[›ÌU]âꞝMFùÁ ¯å~ Ž2óàÕ«a‚ÇõJ Z›ÌRýœ Ï´’XsÅ§Ö5J»¤¶ö|ß11i×ä~ŠUqgUÜYwVÅ7Äêëö˜wwqìL‹WÈ´h´ÌÛχyÞ¿­¥½ü¶>+»Ï·_v½||{˜wn†­þ²Ø…Íqíò[RÝ,œ÷ô·zÇà‘µñδú[¿u/&ã%uÉ ç=°fóÕaGp8^p!ÝT–Žìa½É¤Æգ˼­¥Üa}#Óì“ë5j÷îëK­@¬2\ÿäú´‚%jú6K¯‡u×. ju ÛÎ5ØY¢v–¨%jg‰ÚY¢v–¨Yiag‰º–(kw2–(k–BƒÔεiŠöÎõ®,Që;×í¿.öµc«ãnƒíZTÙÖ÷ë`lYeŒ–ô¼•gjT5ÙUžY— T}DRy¦Æí*Ï\¥ƒ¹v@çÆʽîøq«»Ì!·Á'òª•üvgòæ÷»3ùêhCÎä]5¸ =“WSµ6í\ÞÞJpµ%k~&obœEýU¼a“¼«Wґm¬wM«£·Ï5Ò¼¿»êÌQ¥z•¸]å+*z| Êë<˜¶¥HEõ»¿;ojD½Yßâ«1¢%‡LaD¯×7¢ÁÙÙ(ÃJæz»jÓ8ÇU¦~_,ãNã5ÖVÞboØToÅ-áײ¿S0¯‰‚ÉDt£ò"~ÕíÔ ø³Í×uh²¸ÆÐÎóZs®ýڄŸknx?EÓ×2¬=&«¯Ó²ùEóZCª¡@½ÙXóM²3ßlº¶3ßlŒŒžnù¦Æˆv曫Æ9v曝ùf ¦zg¾Ùê™Ú™o6Ï|s]Íc­èŒÚKlQ×(:àlØj[½ïÝéæñªsï^vÕkœõ'41^ÖɐŸY×£fõêW§­Q~o˜ÿk’÷Û54˜©ÇÖ5ÒþàxÜ×ؾ#lþ´Û«3§…‡Ö5ÔvuCå¦i5í÷^yÕgkW<ŽT±+Y¶+Y¶+Yö^Æx J–Õl¶¦bÙ®`ÙF,kV¿ q<¨¡g 6C9.jõغ¢ô~ @+ {_&±§“á餧YÜF›Rwe‘JMÉô¬£êl–ñ{¥ ȝ͹†)n{Cë m2¸¾‚óá«îð4ïMúÏO–Tðؤ°Á+u3‚k èZ„ Ž+ -‰êÑ©Ñ´¹hçљ3ÜÍõèÀ¶ü>uŠÐ;ýt§Ÿ®Y?­µÍvêNCÝi¨; u 4ÔêãNC½ÂºêÖGV/š²¹:jõ1îTԝŠºSQw*êNEÝ©¨W_E½qç‹Nîö;NUE˜ÐÉ÷ƒþc/Çܳð}¸'0üå㏾¿4x„ùñøÍÅé §»´Ÿwºyÿ,ïu "E¯›ÿû¿òþ§èÏzÿþ_íóüÑKÝ珣Ɲ?ŠÏ^}üфþ÷§ Päààֈð¿ÏÞÀ·oõ§_5ìUC46~þ%jt>fgOà7Ý£¤E‘È{YãBƒ¿G´ç>¨f"á+ü¾&\âç¤q df ÷=ƒm2hŽüËð 5‡¯þ3"ŏð/ý¼8è²n{уOõ£ðG5Y$…¿B7ƒRì*ü5c¢_ö|ó½Ô¼[ÿ5/‡ð#—¢á1¿î¥fP{©ˆû-x$µJ }öOa’nþЇ•Õi<¶`ÆǍøSœ«½ æÍÌý»¯§g/‚ÁFkì1‘󆨌‹†Ê„h<»(´ä¬¼e"ûíª8÷«áä âÄYØß׋ñ˜¶¨©‚Eˆ„º0«ª8{8žÌD´=Kµà¯›§`ö¦&¶øÇ·óÛ9¶Xi¦ƒ£iž7s¼úÌiT<*ÒN•ãé™cYy˄ÏÌÜ|œûÕprUœ9œ¸›Ÿ6žýã½£9UÔL2‘¤'±^)úg’IýA¦qÂàÿÿg­YÞ\†7Sž²¸!š\Ä ÷è|æ ¬=û#L1|Ît÷ðG†,‚>êŸb=šFw„#¸q¢O°qñœ¾qrSSA¥2ÎÒÀ°±¿¢ËŸ ƾ¶Éàï'¶g€–^sáßXÖ±²ÍfÐ-î-oÆ2a™¨ÚÛæ¡MÙ`1ýß`Nn=É[½‡-ù54jÜÔQüÊ ûÙq¯ÛΏۭž~íýa·ó]þƾŒÛ õ}xÆCìÒS:woœèWì½BÓ»ýÖi/¿?év¬¨qã„Ï"¼ûúr0¨ì݂ü0C•Wa¨^ΰÒA™ÀpØO.F(0 JƒÈì_”š’%BÁ&ÕKQd2ü)ÍlèˆeIÙ³­£f:G¨`‘“*Ì~ׯåõŠ$ Ü¥ÊýUvh¤JƉ€—ñDH⺺ƒ±‚S$V\Êޒ˜Ó~OÙóÎÃûé/±-õ|,áÝAgà²éÿ.<¦åbf¯N+‹\6~̐ÇGÀ>äœ&²iæ…Xö—a‰ŠìGv >;VŽ}EÑdAo£åcËÇ-sœÇ<1£d搁GæCLpØ¢‘'™º(:ÊôD/TýOJCÖ¢ð‹Hiœ³ì—?OM¥þ‘Û!q;¢ÈŽƒþòeÃÙcÈk($âb ½aŽlÁ£%#”v„ÒŽfŠþ.\ª8ÂømǗLOT_²d|1­JF«’ÑbŒƒïpUŠÂªTÅ„,š(,Ê©'JFÄ퀸OdGAßíšsw™˜·ËÄÜ]6gDҎHÚѼÐßw¹ÅÒ=&æí1±t•/²KÛeÆíº‹üßw¸üXaºDñÁKFÅ -³5õÄì`¸ 7C‰ÌìŸw»òؼÄæí$6o'•Eš¡ý¦a'Ãþy—KŽÍÝBlÞbs·PÙP•]à_f% ú‹Ã!V÷N–˜‘JæÅ -U³£¡'fæÅü03\bÒ¬&iÖVLÞ雊˜JÉn™ŠX6i†be];öÏ;\bï{NBE`öŒš猥Ø1P^XƙhÆÚiäÁ /[¸-æÅDFš  Å“íŸdîdcî/·íÁèeM& ½4¼žê‘UŒPW¹(ÑUH‰™7j‰ò1u0U”•YB3 -Õ%meڜµÎÇ;# ÍÃ˳™¹,WéQ›èŸøÚ¨ôÃÁegðª_ªÐ[3¿ÑëW6ögÍ,‘BÏZÐ/fAG´—4~ai“ÉD‰FÚL¤Tà&°jA€´ó’©Þ£ÚƒG…êsÚIÝC’ƒ¾.„9lôÆÌ6rý"Xómÿ3ˆÆH "ᝦÝÁBëž>T¤²d©u¯àolÜú~0~’·Îæ v¡¢¡ÿ$qʚIœÀn‹³(™Ý$wÜ·|äéÙ`xa~£eªWqgpšŸÜyè>ßôòÿöâj†×>ë6ÅW1À¦OhKKóú k ’Yâ`z™˜Fª™àÐÝÁÂEëð(®ƒZ°+Ï-ÐÔ¯³Ä¯u‡ -žäf… -»2¨Óé=^†Ù­E  -¡¥±&n…ù‘MÓ¨ªÅfÁ2±çÃì9µûþ>ð4á‹þã Ì¢¿hñܧ"ý*¥Ácx–Ô}×~•w 9õw¸ì6a•Mø§¹gðŽREJÁÊMepÖNoî  -YÐ ›˜b#3¼¦pj ¨8ËЦYÞ _\Ê,Óṯã†=ͱæp±if°YÍò˙·’{¶/Tóø“‘`âO"ä…l.§"áx¡yaÍwíWy—S¯¹ö¼p‰ƒ~j‡‡ªå;q|ï ÚeÌî2°ŒÐ~g~çE ã`Ë^ÙSGK<ܸ -¢·ö‡ê|Ü}÷çó¼=6 -ŠÑ„^8½J4S¥Ìý‰Àagÿ|u­]]›´_äýiEm*K/$t½2‘ -ÓdI¤Rðz&*’),¯4M¸*ss.ô´Æ`ÁmFR&hW€¯RóÇ ž5ãˆa\‹Šb­½óÄÖLSó‰$QtäAŒ7cž²Âôªq,Š õa¨w7g¨ì'M+ƒ×Ò¦R‰0 =ʤ~"fÍ,Q&øÇ4š…ž#+ù^µ7ݙ½éÃ)S2®½pèø}š6{!åöBª³†ï\÷côÝ¡Xë~5?é¡&JB$‹Å -lTNžÐÇ ýîP ô»oï‘Á—⛂NøÞ˜å@ýÇôÒ[¸4Á•„0-œó8‰ ™yБqÕL£ MU3O&%}KɅá䚆úø“%€pŽæAñÑì»L°Yðú½À!bpö1ÿòéïE¤šüº·@× ;5ö+͔‚§yæ§vàØóØÌ·¦qF =˜ÃŒ¥}vkHkJ.ƒsbö›t]ò(¦°ûW8»å܁% ‘6„¦„dcª1] SÜÝnÿEkr6zÕz^Îá?sgz‡5ВÅÜBŽ˜±9EÜ-eýbÓëVÅLÀÒH5“@û>ô/ËD,€Ë¤ VZ¤wWš¥’"“n2ŒÛ=Àטæ-Qj¤0êP¿Or8cÌw®¿k£ßã#Hcc±3=$ÐQJŒ‘Ž`Œ+䢑H ûÉ$¶ú­"ÕlN´&k€„ç½!’¡‘>n&)°|îÅRâÎbDIÃ¥áòÓ½J >R,ó2ún3á;`aÀQè;@Ÿ[šgH‹>蝘¥*ƱÂÈêC–øJÒw ¼í‹…ؾê)b ¥¯1¾W†º L/=mÖRaa6ÀÁ_§°$¢4Š,çÔºa$t¿õ¹‘Jn@8_©ñ¼Ò£% ‡ÍpÑDÃã8qMõ;4MT -1Ÿþij*‘šº'#P§bÉ @ÿ,²j½n5ÛÒk9¿oI-JÞäJÅÈ#,è7=Z"læ%``Q‡Cq0Øzu¸Öõâçi\سÁKf°yŸ’V­Í>Ö¿€\ƒïáö=ʊ?ô„†Þ•ZäJüw;ÕM Ié5î4=˜—ØïmTB”fZ®…Öé’D3‚Á[D±8¨ŸSC1 -ª~^Épxúé,ŽÜSúOª'ŒpÒW÷VØ~ÑӶ߻—n‡Ç¼…Ä _BOÓW‡öíô´í[±ïf<óS݊ ِZ$S±„c•ËU%#~=ŽÕ{ÝÞEy -KáX­~H¢S‹ª Ïø›Ùsýã­ vÀàC¬2Ãì³e°àÙ3«ÓÁ։²]÷E۔`…>*}–€èÉV|aí¢ÜnÁu ª”1 ö€}°È,7ÌèÑ0VÒFèõc r½ bcîU³3(ÿ¨·C@°e4#eƅî)ÈL„îb -hЃžÉ° Zõfv^ïö,IÓbïÁ¼†(ÿhÖdJ©8@B\ï=Ð÷¾´ójÑ»is½§œºθ”{ÔÜbnÆghfíBB7 +Ò2šÁ -Ͷ…Œ‚`B‰)›í³bʦ±©ùgeS³Àp%GJ (Àp¨µ£†ëAHH×א’nHîY?l‹>8JÎPŒ,lúô«…” vÑ7YJ»Ìn ݑTLí)؋à",PRÌb,` Q»àñ‡GK ˆ#“nÑ;Š¸^8õ·À‰hXž¹¡' -žMSíˆì»iA]a8V͋X*r0à92+PRó!›øP¬²q¼ÁËã4ØàQ2zJ€0Tž¨á{PÒu7 ¤Áü¨ îð;Qq†Zäی³dŠˆ! ‡)5ÒLŸìL$E.)ôiqU a¬‡Å ãf" íסD@óô a0D‡™hà^Ïu3 ž Áüh æð;o†J†x©æXà# ^æWE¤-KÒñ”‰i§å6®Âc4i¦2ÒcD;ó´ a0B‡™H@oHç:Î„`~¬qøH7C#{V3ãuIÂp€ŒùÃßl^¦Ó´x €ŸAˆ"íàýqÈ.¡ƒIÐ.í<ÌÓ.„Áf¢{}¸i©›ñÜX܃n´sðˆ7C%ï©Adú/“©*Ȍ™DS+I x•5µd‘z‘‘¾‡#ÁBÑ?g…>Ùèõ¡¸ˆJY¢ -Ò"ü5úžE ¾e)|?Q‘@¡¤èŸ#8Ì€¯?(¡’%‰9!ñæ†H2”#‚´Bâ‘@Ä6÷ v3Bâ9X@¼f†H¨èý!ñl7CâÑPÜsŽ„98âMSiJ ‰G07D›H¸ -©GRXH=’Õ܃V˜s˜í÷v -HçAf|„ÖQ€ÞRŽú’ŽâtÃ'ÔÀ‘nšFSÂ_aÓZ˜ßZö˜ö›ÏJR!éHä -IG‚™{D7‡š!ñ, ^3c$Ԏ -ôþ®µý,l[;¿m‰nÛz€ß¶St*J{õ¸£•!ÉED’Ò9+ “Äæd5Bìé<̓.„áøj¢€{@:êf@9 ¸'$â ¾Ù¦éS愈Gž„¦€j$[D#ù‹@$ŸVúṔ<ÁŽ‹°Ò¸éŵ¨{µhrƒ¶XƒïD­iº幀Z¢q¥î 0ã&9) –•¦b‘ÀE È)}ˆå@žX‡EXiØö½­¨s­RÏêä†l‘߉VÓT) -p­DÃ"‘ÇíG+´"é) IXî)+9¬ö{@,òÄ -@ƨl±Ò¸éÅá>´Ý ¨E#pOÑ  «ÿNԚ¦ËÑòÄ÷럍¬ÿúi£þóKƒkU,šã§udš«øiS%ÞÚMk]Iô¿ÿñßßöÇÿ(þ>íþ³ûûOÉúw³úæÿ¸êvÎÐrg¨ñƒ–:i¦ÀÕÝ4Ös9í¨1àU\5æÉg͸Ž»uؘ¯ä²)£!bì›#Š|r)ž\ÏèÍÑO—ùs¦À5<:úÉ2ŸŽ¯êÕÁGgý:Sàž܌o¡+ywÊh¸pJÝ>Sà:Žýh™ëÁ«8ðÁ÷OZÄ#›u!x%'P¼Ì;4®ãҏ–yˆ¼šõMkø‰pt³ž"¯ä+*£âB¢—9‘ŠÐên$ý‚2G€Wt%Á£%Τ)p w’f¨%%ð -.¥ê-¤u™¯©­îm‚TÝYTYZÅãÏÍúœŠÐÊ^'Ò¬ß  +xžJ¨¶Æe.©"´ºS -…fÜR\Å1‘K³®©"´ªs -4ëžè -ªš-–LJ¶ºU’’ D^ÁýHÈ -¯æ‚ Äà…WsÃyѸ@à\q³ôª$ˆ»‚—΋ÄÚ®à©ó‚o®+xë¼,\ ê -»Y:U’ƒ D]Á™çdàMWpèyI·@ÓúN=/üHº‚co–J•ßIWðùy¡·@Óü~^´-Ðtߟ—v D]Áÿ7K§…D_«ðÃ$A¤KrGWʈþn˜wºã­á8//32gñ+Ž`± SËÀ~<2Ւx–™kâ°#~1·µáG}êšÚ -æ«þ¦Oaúns°á“Ch?pnª%q ÎÀGXåˆ~ 2˜Lu£àÅ؞Ñ'ÂŒÄðÀÌ@- “É0›_êÏí_0è$ðÜccÇýÏ{ÁS{¶Í -œýê2ËMSÓù úšXâ7ö JÄ,3‹ƒky)Æ¢™Å҄@,Ö/1®//€q`»‰ÙÞX>ФªihÛ":”‚WsWÇJï= ¶³;›K,m‚¢3è" b4©Ûw‚F¦Ê!¾ D?Mß™G¡8‹¡ -U$µ#QA_S[9© æŸÄòFÐû(\‘05Ý”A2uz¨gA»©ÎVÙfªëm •B"(9#TILI¯äšàz<¸üá²pýmiUüú7ßuCâÄvb¦2§¹¸ÀÌZ|æþó^Øh/N›Šá·=7@Îl”Fq…Ï&^?b#ðã˄5ð6KOn?ÕXä‰FŸíÃø,àMé^_ûrÓ)ß×(å |­°næÍÁx\ühûãúyN|d)‹Xá«*ô‰ˆpà:tô..ò'u·Ù'>̀\*Ó tú*_9¯­bӗt,Ä;}ï\¼\,¿Ð7¤àE‘¸!у¹f(˜º€úD|šj·‚•85;á¼:xWöòhúÒÜ4‹ -eaŽ@*Æû Ë[«lö2•…¸÷«ãærú3š‡‹`§í¹­la¿°÷üʞސáVµÓwPØÙá†ß Á<ú³ZôO5ûgQýmEÀy­URNÿ¹¸÷«ãž¦ÿ[V†òbºs¸¡Ì¬ãš·e 9–ùLÜeqGÃÿÒu­Æú$³*˜ò¼îĝøÂIxá §™ÇX„årŸÑv̇#÷jF’yÑ B!ˆÕšá· ª©› WÁm -ØãŒÄY»ÐH¹ôîˆzÑ é´UÜUzÞ³hð&3DãfN=cdG£Ô‡„¤÷йM=Ž¬É%q24ó¥ìv(ïLëI҂…—œ”ëÐÒêù©53Kj•]>nõ„“.†`Èíw¥OMIÑ`Š+‘æ¡øXYË$­ ÇÎéٟƒsZ‚g—£4’DÕøzˆªÇ}@ÌÔÉwÿû+ԁÖ"#œÏZP´Õ‚Ò&3t^f …§Æ, g±)Á­3¾IƤ•W™ľFW -oäQZ&‡1Mà+ÑòI–è“@Œ] .Y€ZqZ\S,6‚¯þÌ´œ|A "ÒtO@ÖÜJ_*Ž¸œÍ[á© |«ZÏÓŽ¹€DwW/W N&ž2Ó%¨(ãIEÌÔÌTœ˜jÔ AEš0Ó•z$•eüd…ìŸòâ‡6mò‘L©9Á[3;o]aæ0²nfîLøZíÙӏ•ÌF$­0ƒ&èqzmÍÇÚ³XB5ĆªÌfBÌlÝ8 æë­f)źôb«„„ z ¸}Ì3é&b qªéJÿ›&1ÈXx•Œ hí|à™arn,?„~yåŠ~¯œl2ô÷À,è5Gʈ0ÕÌb¼~¯lÀ[ey†* ܏Ì^À‚W œd­ÅprÇq„·E¸~46ðÓéƒL -.Rû O´¾&Àµka•)ô A`¼^•Á÷SÔ>ñ¦ˆ³ f(Á…ªU&ó§{Î9£J!Ä!ô[`ÿ¡ˆIsێ^‡œá®1Š"D’J¸¬ûÀè¨i‚òŽ^È0F:ӝHšú`¥nT#üo±‰D…\y½càšíÁýzƒ“ë,•M‘$x¡”é7Ñ*v„)MÆç®!Œ¥ >nÓd4›^S¡UmØdXR#Ka?3=£Lá•øœ âÖx״řñÙèµ%%¤8Äx€~rєŒñØM -}GmTë1±Ár‡kG8– e°³Sa/Z@ÙìoÆЪ0h7p7‘¹uM€¨ ×rÈØT”Õ,ËØKÐa OaMT.MPy^a俞†w|›P¼†1åTŒÖºŠa¶˜0°ÄpF`IÌÏÌÌì”Ìh(\j§gAÝÑj—Ú ¼d}ö ›£ÛK͌5 -ânUC@0¯4wgqyM‚ž¶Nrݱ|O*Uî£{£g5ÆéBoܵ±U…ÐõÀí‡4$ã-<øݘñ^ ÷”©ù΅mLx ±Øìw0ÑÛy¸œ §Â啕 Ðrã2S¿ë~ ûŒÔôxøE«zayâÑâÛÓ=s%¿7HN¥ÞÍÓ¾d å›ÙH;RïaÒr‰2?b!âY} /¤L—=šdx¥Ê´ŠVã½Ó:[µ÷–Þx:í¯,¬’‹à»[F…E®À’êV/~.®ë’—Ád×_É*Å%ù.\hDû¸„€©£½(™s(à ™Á‹MTéœ×x^é½¥sn½axC1/K0>^ Z²²ÓèvUX?Y”•,š–‹Òm™ùëŠéPðЙ}U\ò*zòb7|Mgñ–€‚‡Þ©ÏM‹]xQþYîvå×èŠ×§ùëñi>Ì»íó“{ƒ“Ñ<‡ÜÔ9Ò$a¨h¤ g´ôk5C`*EÊc-'>»3ïHƒ5‹5š=Y\K‰|«0ºoGôm¾–|£/#³“àÕÀ S½-^}¬À¹,èðöߎèÛ}-ùF_Fïn2¸ÂR ex•e#ƒ #L'O£·îõ÷·Iã^ëå`ØçýÆy·ÿÛäìßÿ]r#凱±A.@ÂáRQz«5²Á5|‘Í‹`梙™ÛÿÀD‚IZ²i°Y3a)ÅGË1R$8ie2µgÞÇ5M*8 )æaC|$7BÆIfœ¿ U+ ´h%è½Ü@Œš-ÁF#=ŒÐ4ӚºH"sO#g&³ÏÔ/H›¨„´%T¿½ª4lé"Nƒ -²-àw÷.Tü×·QË3·TºFRÏ\ÊýÐ\l‘ñÀtÕ‰Lú¯Öĕ§$̋ÄpxKo#,MŒ ÿN–L˜4WüŦŠŠŒDŠ²±‰rÍt€vVìŽRÌÐÓ:¤q2Ã}›¨i0GNcôÅ+™BÑfî5A›(ñïbû£¿÷ÀÄÀPß3Fã‚6´C‡GÆw‚3¢ -“0‘1¨“ {°\$Wk˜ˆáX“ ­)(Ì ÚX•Ð¤…,Ö$aæ¶^˜`´sЂÐsÀEÒÆ vÛ ™ß=!ò‹2x¬f¤tÐ N_¦|¿ñ^VÛ'6&K _"õ ©´s¿ïbœ¨n‡Æäd‡g÷Æòn6AIó ˜8E0fê&,ˆix§bÂÁ¾¶L ™>‰Þ"Bj[jqH cށ"sã7ú÷ef¯s$Þ¦,Ë8^/™² ä:0Æx vv†¸ÓÁ\ãö“R^Æǹ>Kø€Wäh¦3+ñ4“Þ¾W éò5H—œálW—·éu%[‰¿é£¹„Ãh}‡ÏÍp9 -ásZ|^‰ÓéçJxb[ÛAÎÎ*üÓ6Wâx˜”¾ -Ï3ë}®g6ÙJ|Ü<%œÀ«ð>Èf®Ëý ¯u†ÿì;ÃÁw³ĄJï-Iœ·ÄZöðò¬,5…F™Ó¥&`êŒ)ãG =و kÀ NÅJaôè‘LÑB]‰8|´„4T‰ =Ŏ”€‚qfaÊfAA/¦Çy´àÔ(¡‰†°™­StñÐàeÆ#7M›tß#(äðÝ*/¡“úTB«pu-³º'à`ÊBï$E«»âøZ.ø2(|`£;Ö=ù~Ð<ìöǺß{{Žz^øËÇ}‰¿¥æ·Ç½‰þ÷Ñé¯Z=֚ ¦,7ö‡“Ñyãa«ßzž†0Ú/ù±a~=hõzÝçÃÖåy·m›>Ք¸Õx2éw{¸ñxܼ5ÓøӆîñÍòG´†XúÌTë{G¯Õ>×Éð½Jõ5Ï |78ïå£q÷lLí:û6*4m˵ZÜžS[;_%x Žï†yw”ßú´Ñ´äÖST$ö{˜¸ÎþT×af‚ÎÃW(ð óÿ¸;œêoqã΃“ý¡^нQuOõ¶:98Ö-““{½ÖøÄ îñ@wêÃmμÈî…s¦?š¸º ÿgÿ»¸Ã+¾¼°HÍËõgüŸù¿·œ¿×Äþýq#.¼½Òðßõ|•í9\n×Á7ÍäzP·ô_ Ø­†M5ñ¶#æ>EàŸøÃ™·Ý?u[†ó}þŠZ7Xñk<óþ ÛPè#X™½RêoâYªEZnhÍ¥Å{˜ÚÌü¦gñxüFOØÇÝú®?xÕÇopÐÞ¼Ó{3µNîÚ¸õ½ž@8®nÝÑgñËÜ5ºu0¸¸èz¯ÛÓCÆçÎ[Ý~Ã41`ãiºeÛ|ý­»£®>.i ’ãq«ý¢’ýÖ¨Û.`^äuPpü©÷hh¬¡ð¡É0?ÉÛ}$vðWÓÐR£QÃJBá­Ãü¬q»ññG›.” n7ðå -4n=n Ç¥£<ô;“î¸Ú£‚±×¢øBÚ8 é‡Q~÷eÞÔ1•Å‘ÄžbÜBûtvÕ7~fMe=mæ“çD{ƒŒUŠJÚ/ËZögh:E{ק”_¹àHRAÈI -‘CúƒTÌܐ›hÕMóZ9ÇÛsÓL0–ֵѯF£ÅÛïåú {g»…øVØ{Á˜<Š…ƒÒÏÜ}·'Ðó#¢(a™¨½l·|'=™žas’Zîùèìl”?Åy™‹âæƒ^o‚úÕ`ØÌ_C%sºÁ­)DF-RôǓáË|8jŸwóS-è~Ñ8҄ݻ{v–¿Ðï¸õ´;^‘‡ß|4´ÊDˆvG—½ÖóõÓ÷ÎèÝÖ7?º=è›NUfG›»»ÞÏéö^øÚxþ<ëڇ?ö¶amëkS &¹«ãîÅeÏVVØHÓ"-~e, Ô³•×ßc½ Ǖº'¯p÷о;éw'ýî¤ßôïR»{‘W;`'Lbê½båGÇÀÛ8 ûš×¿“£ãnûEÞo´N‡qÞOŠÅ“Ú,–ܸ 7!:~2Z°v¶Êkk«|Ší¬g•YRºrõnoâF+ŠDúé\Fh%§`gPÒcúï°Ÿ›ƒ3¼éuñ©‰-Aoj›­îeù©ùä¤äïZýq^ý̄Ô_™Ò™ùdٙy}yY¶ãe;^¶•òȕâF)+Øq£¹Üh¿×šè‘|ŸúÃÖùE¾!NÊ«À–0#3摹Ê)®2›~ëÓ1•äpI“w¶Ïäe2=ñ ó2Y’“ÉÞK[…d”(ÈæmrÅӄc¾5‹2̯„:!ÌÔ1Æ0( Tœq–, ÛVB%I×hè5%¥b©]J±&AT’©Oeði… @ò6H¥ ®›¦àxKˆ5bÊ3, >`]@ ¨‰µ•JU§ ££LQÝM0û£7"—reÄ»$Ë{1®o{ƉŒ1lZÆx£7”‘0¿›§é®¡ßCð&_@é÷ºß³à¢üþD—­]@2‰Ó IÅPÕnMsÞÁ­˜L%æ6Ì*öÍ_:ÉF/.wk§öÚ"MáäãnŽ$Á BìXOØأ段Ùëæƒ,›%`癨£?«ä]"ÄΘ÷~¸ÌJÓ ýAà½â ž4á¾íË´œÚŒ³èúeAD,ÉP‘Ž2ndö,K$·ñ±ÍT+Ú ë -xn®‡<ê¶Ïa(çÃÁÅfòÉ«‚¶81t‰¹}ÎcóMïßÙκùe·?Ê{okQâ{ÿy/’÷Z°ž( -ÒXêñÇ[î/Ä[xî0¿Ô‹tôÈü$é±Ã®î3Ò3D†Eý|d,ÿYñ%†‰Ütúë½|¿hLe7–ÑúV˜r —7ᏈuÕ­úÝö “×1}R£Ú䂊,Ã}__ú¦‰[>-ŽÈÅ©™„òÇ yñé+¢yØ˘>´ê±FC…„ˇ´Ö©²L*ü #cì)˜žAµæúé‹–¡LUºÚ"ü€öE³ßM6¤kŸ/ã§AÓù<ôñY«ÓpÁëu‚¡P9\çc÷Ñàl4F’‚\ôºŸÚÙǽôk|Ycûì“Ïá[}˜Ø}i/ò\°WㄧÉîÈXåÈàè×ü GÆv%8ÔWÅ ‚9/«`E‹k˜›zÞW9ہO՗ß-¢¿ˆìÝs½†äz²¶¶`þãôOÿµ7·ÏsÍYú Ë´&ÿþ¯¼ˆ4hÚYЗؿ®_¸ᰏ&ðý~oðj™Ju8\6ŽÏ[Á«ùjTqý=ŽU­Ä6"Ûd”?>>ÚïM†séuî:ySú¨Ý³ªÔ$$m÷²Õ.šøN©¯¤ížöúfÎYBJÜ7î¾¾li¦ºŸŸ †yãG­“qÎç+Ó{­ç£ö9Ô¦ÛÅÿîøð6óျ¾+F\ÜÿpMei†Ñ4T€[cЈüñ’ÀVgxb¥ÜcNxlv‡bNE¤?ãé’ôWLg¶=w -ž[³ŒµÄ†³—ÍæñpõvÀ%½{™_pjمƦf–.Š¨¢§Ì$!jô†ÌzWpܨš:R¢ÄáŽX»cõF Ȝ) ‘=…R†y*}˜%f—*†û6Ñò$ò0N=f´é"—d#cdÔ´Õ¬û¥øÏ$“b~¹ãgú²¿t/. ´e)Û°ðð£aû¼ÛÉó -»¦‰àûçˆìx _0¬€Ê6œ‹èþ ×1±%KQ¹¦Ùüàõ©›–ö©Eµÿ§Ÿ³méx¼yؚŒÆ“3°È°Æãç53s GŽI. CH’9¼Ö¼2†¢+ù@œ‡UHI& «‹M¼æ È6¤V­pûÿ“Ð"‹Þ&ýq‘ÈXá%µê§¶>¨1TO³8Ó½˜z5ýÁâU¸™AGP+ÖüEɀ§À‡H)ÄÇõ™Ž‡¥pÿ/Hð/pIÏË´|!ðx6•ÉðC¤¤•/¨sÓ7GŒ*—þ×s®™9ŽW¨Ô°W},IsªkÑFÙ.)—æ`“ñôq©UKäÕ\+†‰²ôìeFQǦ?ReÎ`”\”ç_úèJ°‡ d?…dlÕíÔýŸK$P€ã@ÿë¬TÈÌ\ñÀb\ZW‰U¹¨GÓœ¬¡žK›‡šàje¯PµDAHÀTëýü)?=k OÃh—¸fù‚’@IÅ -ý¬ &±“ôy `êS$RdÁ ƒb•• Ü uKÇm(¨@jÓCñXÒ¤Jbk)™«LKY¢L›ž˜iÍ`z¹ÅÂà>R :‘ÁÂa\qؽW•É]‰¹‚ôN#žš[Ý)׳ØŽ«WùmÆ5/¸Ð¸2c‰J¬ðHi£˜KôI3¿äá{¼ïíoÎÊVï -¡£îh\´EÎZÎ|\V©f&¹äcŸ÷qxKѬMÑôhÅ ’X^¢¨þÃô¾ÕŸõþý¿ô0N/ÍÝxO[§G¹n‘ïéOš¿ŸæC¨itroðb2àãÁå—åXÀѼê;À~1*gy¯stìæ@­½ÂÏèÙÖxr1¦ôô½n‰õä u<ÑÍûö:«Nwü¢5ãVw»ý­ÉÙèUë¹ùýñ£c¶÷ôÎñÓ»ðmþÝñÐã T]ýtæÖBK®¤·‹çpОèYëþ·ðÂG€Å¾N]þxëÙãï|ÎÏ·7__ôúºÁž^pÃîédì.c¼ug8l}P4ïè-A;-j©+ïOÝ/I?Ã?cµäÍ?ôG'/[ÃÑí æyØöe«7qá‡Ñœ†4eÛÙތŠ_7žT§Ý~G›U¡”&éq>þiR\aóϯÄ`ûƒþ¼®ÚèíÝ©4Hjú.ÅÛ‚-&Dµ¹î½®•vF•Ù]ûä×g -_¼¬Î íÕXä0ζVW€ý½×%úŨž^8C5£©¾R?ľ9†›A®V¶k+Î^]õ½œ|÷~oÍ܋ÈÅ Íñ«n2+L¹my%·H8d &K‡§õÈç畸‹kz%(—íuµzE´'RµtHo* éÍ’‹¯›;žÓÁX‹GùÙøÑ°«5ÙJÛ}èÊHȏ“a;߇ÈÝ«!FèÓíJôã"·:Z¾zÉÞº3Ÿt¬‘¤Òš Z#ȝû½<ïÀZü1@N‰·ÃÁåaÞ2Ñáe'þôžTà ÆÿãA·?ÆÝ|2éåÂ÷齘Ðü"_õàþ†5ÀûÖ¾×ÀOgAš4£±<¾ó„¸+ã=øÇ÷âIÞ{:xb:`zôx0êBçñgî:UˆM3Š£;Ãñé 5ìæg­I/Tøýš 6HH¢ê4%cw@\¶:O2ó¢ ¬¶^„.ãiX«×%¢ˆÛu.»M:f)¤x`£vMÿ4îLƃƓÖhœ»¿åÓXï<`¬A+ªñ¢¯ÕþÁdÜx>L.·íŽ½Ö8oœBð+å¯ZgËÖe>lŒº“žÏ÷ûš´,ºãê9Œ‡­þè²¥7\ûîW·£ñ¹qH.x:[ƒëÞM*·}>ÌÝ®^Úxè¬#‰”°Iæ5ea–¶ û°´±ïKâ4vMÉèzÐê¿lŽ=¹Xa*óQ>|™7À²Ý¸ÛéŽ[§Ý^wL ùæì^ÅçœMW+_“Ëƽ:ôD#Âq#ÜÐ>Fð0»µˆ+¢ñ$×ëh,Ž8*<òh2¾Ô rÉC¯˜ÙµúÏ'­çyãñàÒ­j¿~¿78mõžä—“ÞÈ#,rÕ§ƒË)¦üødÑðgZÞ/î>¼X5ù -Sîí¨qæfRó€^·Ÿ7Æze”¬²¦#̎ÍlqÆOŽ5;;€5ûpÐqjLñ¬Çºƒ—9žL÷õ?¹× †÷ƒÀý2šnû—^ƒþ_B@¦s›Ãùx÷õØŸñܦy¯ìHq°2¹ëÈfŽïR"Ð]¬ÛÂn:ؔÿ9iÁŒ6Žò—¾b:».[m¿€Í̙hü$ïL-ÂéVšGøEÂfąéæÇíV¯ìJ‚EÕꏻ =¬ÖÈQ?Kق^îûíǐžß´°°æ´{¨wKf¨@˘«D-Z՞šK›CJ¡Æ=.%î¸ådZ6óîÝü•^BZl·úm¿5-ž{­vî ç,jÛbºù|rbóÙ¥)çЛ/_œØ, å"²cÛpyÜd¢5£@.×LõޤףƦ/é_ç SúÞqÞûKk¬×ȇGÉqNÛ£Þ2pªZ‡-ž‚-^]zBí£šQ¸ TVaAÁ”?îµú¹>ÃU5Þ®=f`áYkrZ)]ñ+<è"úüõ½îp´¬‹ÓÏçíAŸÖ‘ʤÞj1KªSXzû§‰Ò8€ÄËpX١ߝëåÒ·ú–GØ3Ï3X*ͳÇRq¢ýå3†a=•é1ÍP2Òº_-Ç`«ˆá**%'óReA.:žœêöÞ ?=ÎY"GMÉ;í^÷RKàà¡y­%ðçz³;½ÌKë…G†(¼î½Ô=Ör»–6f;ï5—$œCüÇ%[¸·(VqucÀ[-.·Èg×ÖmxØ'RNñ¾™DK/irâüàXíÏóNwrÈö¿|äȆÖf)EaT_"î€áõӐވñæóÀÎç“Â|δ}deÝガÍköÔKÏáÒÀ6F¡¹õ£YûÓk¢ÐöÑôXN,Ö¸ûø¸µ õ2rœée/'X±ÝŠ™FIf1Nӌ…†‰þÀï«F·ûÌAÎ2¶d){ZßòÞ[¿N›—ZÑj…sºc3íàÕ­^oI³Ñ‹îå©è‹)n<Ýn˜C¡Êº8\Ò´=èõ<›.Qò§ »CaÑ3ãÑÚ€âßNôύ@bYFqˆ¸÷S~zëÇn'Üz8ÐçÎ/‹GÃÍuÑÐ8ÓýѸ×ì[ŽÂr ‰à9û@`©­òÐeçBÿÜëWï×e§:z,á)[——CÛnA ‘í ñ™lºš›ÓMCçc*X3×°àÅ˚j.Æî…ÞT͞>ŠHçhfKÎГʥ¨‡AGÒH6½K¯¼½ñûÐTN†íóÆÓaÞ=՜VSªÛïb9ˆE3Èún<ûÂö49ç·*Ðr²AhPX€nºÝÌ¢Àfh›]Ân:ù¨û¼šù"ÞqjU qbK´{Ui؝vÇ­Ëê¯81³cï ›ޔ5¯‰Ö* ,ó šºÃHóú6ñzÅK›;ÍÁŠÝ…4×òLŸÖ®ìZ=K›]Z_È…/~Þ\¼m# - äîéf#°9lK¾\2ÒQû²×~³€™FíþŒ~8Ýh¬u™ÐŸ1g”zÊz­Ë -ä°  àòùŋfÞ-~!»†f#WhdéZÆö†¿›¥ÊCzŒ¡(un+c‰ÐVs<Þ¦UyçOÁ±¬Q{8¸\Ö䬮–!–µ m¤ùԒ½bÞ 6êÓÖp´hJý04 ¥ -­ÇḖ5¥òóšC¥“ÑTO*´ö=©Ð8ìIÙÎ:돛ÞŽh]Ïý…ìڍ´Vî ôe³5ÒÃõÖîR¡eÔ<í‚4¹hÒGÍ~þ¼xÄç´jÏuÈÌ4ÔçR ¶k£+†XÎùtÃÑyK‹óù"jA«| fWß_ª¡qµlÏ,;3 -ŠIÎ^h_ÊF è'£üpÐFŸB¹b‡ž UûÐ,$½sþq÷uÞ{œ¡*\È@È÷ol_÷©²33ñ #ÌSG`Lº34OaxÃÌSÅw£Q헙Ç*¼­~€B`$;n½Ìjí»{ÙËïLV–ÚMþ¿ÿûÿüÿ¯Å[¢ÛÑéS·=<þkÁÚ´íځûš¦ÿAÿE²Ãy·uÿÞÛûQë­ÓÄÊÁåؘ ‹¶Ýo§Gæ§ÐJ© *P` ›Îù[û]¢ÀãƒRy˜ÃhñWñçGøù³/úꏷ[Ï>ÿ6þã½ýo†÷/οxÞÿÝ·÷~÷ùÍ?t[ÍÑï“þr7ùä‹o~¸ÿõCñç/ŽþþÇ‡ß 'muï.˜Þ`B|E£Ã_Ÿýþ›Ûÿhþé›/?¿}3úŽßÒ¯ùæöÑï†ÔêÛñþó¿üçÑ7_Šüø ûÕ×íÃfóÏgÞuÔù«~¡:¼wã õ·ûãÃ_ÙÛûüÎÅàh¤ç}|þÙ×É'“{‡â÷?íÿÚûãOú5‡gÑ·§¥Ø~¯²3õãþü÷;Oš?ÎkØî‹_¾ùòŽ_¾ùbÔ¼øìðó“{7ïwÎôk^÷þyòhrxöËOj¿÷MïÙgûçãƒsõ7V È?ÿpØfGÿúæË?ÿñ'ƒHwztðçÿèOø×áƒÎƒßí勵þþÎñÞ'}Ӊg­ÎD¿&ûõægí»mùŸ7ÎÅÉí/ï܈ÿðÙþ÷Ÿÿó³oþøýƒ|ò§¯üö“óÛívë|ê~v÷ìèܼšE·ZjØýý?¿èþãÛÎ~ïƟÿ¸7üìï“;GÇø àÓon{ë×$·üå›;ýö/>ûêáí[êâï_u•º5:‹ï ÛØg/¾`eûðÛяšrꏹú)Ž:_tnµô$³‡_ÝÜû<ßï©Çf =ºñÍÁƒ/?ùéî癄Š‡‡~N>ùZ þñٗ?v~þ‚Ÿ~ò âýºCéëäOŸÀ´üœü”ügHõõþ‹O“=»@ìEì—OÞj}ù‡{¿ûìoCxM?ü±`ýšèôÿx ðËg_ßûÒ~úò§»ß™öŸßý§ÁÆÿÊèü,úìë¯ï~Îÿüü+‹è§¯¾¼Ýùõûàlºk|ö%½F·ÚÿÖuáßvó«'Ð*“¿Û?e‚Îú+’=.OñՁ°æܓ-ó{šÿe֛×mºóÝ3; `—wl_¼¤É¦[_ßfð³S&h¯~ӢӚû2ƒ`¼ÛoJ$æ_{EF¢ •ŽL-Ÿ{PÞOr3ÿ÷[ºûôyä¿gJ·:ÃuøwíŒ#éƝ  ÷¶LÄ3+Ë<LÔZ¶)Np¶`¢ÛCÌÎyËóþ;yO!C[N¡%à¢}ñBxb•Ž_@~Ïy=L·'å,ý4’ž¤âŬ ¼2yò jÊxçqº}îø¹§èe(ÓÀ7©ÃgÔD-¾Qõx²žÝ„B•©(¯ºI¢bّàŸy†¨xæi¢ÜŽPŸ¨Öd |š2à'ø¢A?B_—O=ȳ0,½ö#êOÏ4Åü Ñppêgð5Ò ÿñüfÑ+šßóø=Ža’-Þäd˜ÀŸZFÿ_ž™&jž¡ÐpÓeÞ¢@®æ¹‹±q#§&‡¦ ÿ´fÚôoÆCaú)K4„‹ÆŽè…à2Ô/Ÿêqê—åÕ0BÀ­Á:C 0kŽ0y`~hh@Ó >gÏ.¿Ï­K Š|,Gð×ã†h4z)M«z±¤}•a<þiP;6z88Í/N0HuøÕà^Akî97››XB2´–E#ÜXÖ^;_h4^}AƒF‚1dvxÀínlˆ[Xh4¥ùÔôFꈃ˜Yןy""ÀÁRffÃÊ -„PtrR€¿o1.a‡XÚܾ¥Ðˆ½Š“–GW±ïŒ[]ä&̒.1)À²§êm$`mDHMìe4°yY†¥órhXB"yÀ‰]F`h¥n úÎ×5méÎkeC¦Ì‹°/¾¼ø¹IoÀ©¼¬’“Z?Jêm®ob1‹†µÂih€ž”[¥Þ Ýeög4Nå?W{ufbºKàԐ6£pÇþ&cFÙrK§5I隍’õ;LyvaH½š-‘ì÷¹5ÈU*û >¥Ìx‘nmrõT{t˜cìÏsÆŽL–è ±ǝr˽@=u?Z‡À~Ýå?w&èð:1“Õ“™-s [¾ˆ©rò9 ¡µ¾÷p›.®±»֑5¹ýƒôüàgέ»ÖzOÁ9p´4EÚ-"¤@i5Š4[DPë„ó£ vžå=Zq–Qxí:éuè>­hu¬WΠ͙O*ߚ¡ÔÁû4kqÚ¿`Ð #ž1ãŠïÐð¨d‚f€Á:Ë4SC[¦ùôqB*8Q.xB"¤ÂM Äý‰`ŕ+ý†¦ÊÑôOoŠ¡_×ÕNºÞ­¶ÛT8)[†"i"´±û Y—CÍÁ)·ØPõ\aõ´û¬‡n•OðÉq*ìg‘ˆ=æáíJØFq3šn¯SvðÛå ñ|¶’uoª«ÐfrǶôZùœÞÁʐý~×GÁ Çc†>\`®JfU³ë§ñågf …öÈ(³ò>ë¹g,ÛÑùߚ€KUæYèÁ Ï¿»Øí"G6™ßœ'Þ§È_˜b.‡Ñ=h¡Ïj9Ól¤^kÿï…ê¹ÿ”n¾´_¡©ÏA½Êîd´â»šmì ¦Mô‘ÈÛÆð¾ÜÉ>ÎÿÉíd±mŒnc`…n¿²?ǟ`îË9ºX~ŸEðx.U^ nSsfû<…le^‰zÂúÒÚoœÒ•¾gÎJèçÊË<7ÿ‹8.´<æ¾ÌI"—-(’:·ú„‹rDPgÖÛs º˜˜4©Š wfíjyÜö†ÓE¢/ÝðG~µÏŒ,ìöÍrÁAã F¤Ï e~æüð5$¿‡Èu@áÕ%àªÚ®Íæ ÷j(îË/ò£úl 4–”=_Öü§xOû-‘&†oaJ? ñû ©x²kʕþ~†™ÀkϕnÚËt«c' O…Pf噐ö·'¥ÀP̳;WVmPi¡·€¬Ž·Å†mrl0õs_€d™uØèȕ-V §òкÅòi÷ÍÏ1òû2¶¿qµ‰ÆêÇj똷ۂ_øy×k7ΌR¯ÆӉE]˼ÔOU²• t\NîÅf=Qâ4 öÈEþâÚï×WôÇܬ]ϑ&sý¢Mlr¼÷öØÇvøνÂÒ¼·^m¡—ÏX](¶YWȟ}YÆ~òŽíÀÄdÀ“nȏÂßÉf†ïýR†ÏH”Êa8‚³¥öMé$É`¯}ɾ&Y…æ%*¦rЁJ½o•Ní1µ‘f Â(ü¶CArK¯ƒ lÔJ0øLî‹ñܺàdz-G}î«=ÙfÀßþzz“(mE–ÔM1^}û¹‹Ô¾Ü¸oêÑ|%Ëìpµœ[ܒ:8#g(¡SéÐÇü%÷™¸óƒÅÉ$ iä÷`î]`ÔOo¿ë6¿@]€q £oÞ¹áƒa%K%žƒ>1.‰¬ÒùN:i!}rœûj+”È [DÇZ6ý±$³©e«h|ö”Ò÷*-x‹~%mûM½vJS2ž;aÃrÙ𘊾-–©ðî0Æ\¤<4y¯Õ†– ðRã[0]ɹRú7%^X×þì‰P¡˜Úb}v©„žÿå0tÐ<òkJ½~uÎðD°|ιZsg*úò»Â4wðO'øHn²tHˆÝ·û´·šù‡!/°Й×îïÅh›VèiŠëç\qt<æ32·Ÿº€#ûûÌ_=¸dšæ#8ÑVƒÌ*汉ç -\ǍΛÎ؃Ä׶KǏIá‰ÔWRÃè”ûÚ\"|çèÒ -ƒN=2û•ô]n£ô —!¨z‘ÆÞïá ¬¾s…ÄÓè‘ åþ|Y¸1ÒRš¿AôJ‹^nACâl -LŸÍb ±7 )~Ѿñd|ÀO®RñÄ΀oJF;Ÿæn qt ‚‰®?Ÿ8+M(2Ëψ¸×´iAêAz=]À€‰F’ˆtk[=åõýœÑ¢Vgvq¹C¡*Gþó1ø,ýÌ‡[EÁ)Ú[UdSǾþL&`åÿùz’@5¨!žw 8?oXm#ö–·×Ív@ÑSì0aÞKÔÀ¦¬jÒ%‹ú mMZq-]­-³ Á†Þg_ò‘ uÊ$Žƒ'0єž-Mk:S€óâþ1Dã´Î˼EŽ×î šÁu*Ô[æÓáÂñ£ôNÒRv¾f=Ý¿cl5ýY·¬8êÄþÖ1“Ÿ CCùyN‡g»%vR ÿìD½S[#³vz:…Þ ·ksÊpN@ꕗÑìLN>Îß0=Č,(çÆÑñ ÖÊÃ)µ_n'Ü7`õ»–ôf¶<²¢ŽräýCG#–ƒû -”ÛÑаÿD\óÌú–îtC„†¡`d•ú­‚Éÿ½ñ|Ò“7ppíˆcšˆ¿ì0o*¢WÆïäl?îϸ£_ɤ΄gúáC֒– >³@´þ—ŠVæ3]¯aPwه”ðòÆÔ|gÅb›¾msîü/ÐÏ"Û(:G½ï.?ξÈû“`·>ü¥…M•|—NZO±mþ3h djVëOhSjÚ9G6$ó*Pj¤pµqwöÃˌÿÍçÄXàgäX¦;¹£-¸¯L“ÏÀŒ¶,îá#d¡Øžc³èê9÷ñÓ7 kµ|Y@ÈΠ?)¾fö;5wæJëì›@ ¼Íwi©dÂéÆÀ±Eó§9ÍËw£sbâÚªü¬“pb’‡z•Šâ¹»Ê ‚|0(±É~(Ó'M4?ü:қ¤¾AN,^¸)Þseý >ÅJõb+íug`6 ’V ÃÑr£L,¡hàߝüü´`Ôð¡*%*Ûó5{l@»ì¥Î1ÿ™(:S±®igŒtóCcdùv+B¯¾k„Üߟ'8Êÿàù‰{9tóžÊ²ÏÒz}FۃµäS4{æ.6r䘽;O&N¾Ë B&Q’Û9üüÁËðä2ø™wÓå¢Ä+hQnG¾˜„÷nÏó•Ek±Ä,Aô*sKUú [ÃG «$±ä~LJãÏfþ0ÿ%âY?›ãi}³\lf‹Ÿ¿‡ö]"xØ<€‡‹Ã΀—ðª #Ê3ÍmW(±ÖKÿg±™m 8.ò8hÇxÎ>} àwÿó`k’Ÿ Žäðú¢ÿ{¨Nÿ»=Ÿv‡íò0ýû{øøõÿr=d\¥M;‚QÃ.:¨ÅÆßÿü_ØídCÁ€ÿ£ZþÏÿ·>ý,Ì(Á€Žÿë?‹ÏzÊy3[¬¦tÓÞÉ%Ïð kôŸ‡ŸB³"äôxz[Ìà%@*–›Ú"?l%ºÜ»lñ½ŠQ ‹Á2¼¢+É­×9Lw;îÒ;ñ7ýˆtšºŠÁ2×àa ïÂDÎNwԍx?l Žx5 ª¶Ýl?aW›EnûŸ uûE*¸hٍ¶C$ Dݖïڜè›á ll×?²µ‘¼ÅàÆ^ùaïőªŠº7¼Y¡N„?êìv3NjPåæ ,}Õ67•±Ÿ¿¨.Ùg~Ü¢* -ÿû"_…ñºÒ»ULâ²w e°Óÿb×b '·ÜˆH›Î÷ùo¶™þ¬ÕTô¥"ì^N[·{\ JtðâZo@iNàõ~¥ìöã.óAwù¨!@!ÊîbU‡øÁ'r‘¢Òž¹SQ~þh3 - iG]È­WB‰É€¼ñ =Û²5’¢eE¬äG÷@µà?[À󬖢F§?ÛÙôNØ{ øU \q旟)õ/&ª((1œô%ŒW‘¨u³Ä,=çôóõÃV–I ]å=VâuœâT»8Þ9Z|¥®)…H$xɺæHüZþ/Õ]F뗥ä¾»m•ÖMBXýzž~r +¦šà§„ìD"A®(NHeu÷÷*Éè;í´ŒR¹£¦»mŖ‡¶¥Í'P&…ëlaðÅ£YÖF@…DÔ֝- ¼¸ùó{ûŸâ^‚/ñކ½ %&bpÇtlßEA3?HUªË,qdêþAäÆ¿¯Â³'“=ù:sn{ÍiO~Ÿ|ð“×oF}ìƒ&û =ˆù’S&÷)¬Š†ÖóÆÛìS¯ý¹üÖ[}Åg½Óm†i×z{b×[_½ãû<›|¹ôös´­wÔz9½“¨y ÷s߂ðôYkÓôk`t¹•?YŸ$|™°/ÿ(ûyj¸§Dq¼€+‡Cây–vì^Ê©Jä˜ão.r;ð¿æï"7 ûò9ýüé±¥CÏØ´g¶@X JM˜š’ËWÀ,ÕË·ªÇÃ!vì,Žáö·©‰pc;†ÉÓ«w´]™ˆ¹ÉƒP×9¸‡âÀÃg{¢ 7¡©Sk“[¹ÜÇpÁÞÇ~ÁŸ…5øy?ÇÇú~ø¨½7űB£@´4r‰b_`xU€˜Ãü©žÄ±Æõ–ÃÑótÇÚð¼û½Q‡¦Z±ˆfGÍ)5ðm™šûyq¬~ë»=î]ŠÏõ‘ÁT+Cw·®ŠM— 3•”Ö Á¸9XŸ%°öGùõÒæ°êPõ*‹¸ ›<åqGk¡èíHRØ;Ht&+àÈYž¿®Ð«~x?'ª±õri-}ßpí±¬þíCU‰ µa6 °ã‡ch -ñøðñ½éH`MMƒ!ÒèÅ:JNZRXa^§Ñg‰½‹O7®ÿ8¾-q¬Í¬5±7þUÅ°Úcëh‚à -׆ÏP¶ä UÇêï÷ 2B¼ˆb}$—!cëÏ[ÊRF>>H‰é O«M-+…uJ“Wq¬"m^XB}„ ùdp$i¬}§E@ää‹ÿ™¦pþ}Eò°âD5äô@¬6V€æøX\lƒ­©Ó ‡vB6®S ¬ACh5'GRXsDÍöAX§ ¦[ÚGS¿‡—–(ÖvÌì“ÄZY´}„Vtø‡N¢=¶>ŠM÷øX).^†«Eë«y³”ÄÚþnNf+@s9Ýax­ìââX«¾§.™Š?‹cݕÅ°B ¿Ž ' "ëÄ[²’ÇZKäÇ£æLJ(֏úª„°¢óærº¿ýÀœ”Àú&>Žk§8֗ßÝ_=ö °B4ñ¸äÜHùðÔ¶ë%°ö»Dþç¯,Š5üâ|Ô§>œ¨ÌgnŠî…›ç<i¬3ŸU°y¬ƒêԆ°zÍ K‘?×*1±EÓ«ƒÃ -Ñ@Äîïž9žB¬Ç­é™ÆzJÚsÕ¿O‡V -k¦ï)ñ…¢ãpì&ô @캔P%'š.Àš=]ÈÅâcÂšôTœ¡èØù_¨“ÇgŒf++BC#6ÓÙb%X‡ôbË°qY/Àz üFé“'mº~Ü.&J³íb:ò‡UìšFÛ¨äÓ~Óó÷*õô›(NžÎÜÓ˃âœIâç`Lö,3°ßEHð4öŒ;ôÓã*|¹=ƒ›ïÇžØ ”„l”¢ï’OÃ^[k"ýô{:2sD»|!í5 >%ŸV훤Wúé¬þ㞠-‰4Ô?gE‰Ÿ‡‹¦b¼{¤ž~™÷Áo»öFmýò…¡mÀε°æaEÙvÄ<"?{%±"Û@+0m0â°ÂÙð¦û!‰ùè—Æ -mI¬ 4¾Å§×»ä°V͒X‘¢ÁaER€‡*ÞÒ." ~ô‰^ kv0ÿSóÞèü·áI‰Wƒ†ý(ß«+¾ø¦¹–0ë÷4#:/6ñÄò Ôœ9 ò| åŒ©ì}˜¬éàþIì,ómÓCñDû;k|ǂ´ ‰HÑø‹Æ‘ˆ†9 ĦyˆÚlj)"ÿDÿã¨mi H;f0pZ'˜ßóŽzKà¬20ãþ^äžØZ¸6MûØêìË9ˆ¦€OxRN2(0èn|c‚ºîÙƈÒêiáŒÍ¡aâӐuсåÀÓú²å›ÀŒÖ*R Óøl\sxÍIó» ˆˆêPt~œ3%ÂÃèáSF¿È Ízɵa'‰þ‘\Ff ۏÊkh`ghc8Ml’P¯íÊÐKýn—Ò†‡JzÉ@óØ2¿¤$(Ý?j؞¡WÌ©‰¿8æâÒÞ÷Ú©/Jz ò †¾™úÞÌ R–'="š½øRÈz)…Fy¾òIJ!$ÓdW$ÿ^:à4dÍ£¡‰’Bâäå‘fCYbDŽ¼ƒú‡&Ÿg#N¾¾S/)Ä%·'rà‰N®ÿ¨}r¼c Íϗ|íԔÈ]¨˜èP„èHrvÁ¼xÇ6¯EÃe¢YàB¦æš×­¦)‰ -ÀAÀâëaôe÷#Îî« Œ®—“X*ÇÎ35š‹htŒàJÚÒ÷÷ÖþÌ°ÎÐÈ$Í£š(Dzöβ jð8ºüghÇB¼Ĥ%_[RH4|Uá?`U9ö%ƒ€²"ñ’AêMvLØÀ¨Ùœ -¢cKfG©i¦ˆÅ©ë¾ÐÎ.—3 -köËe™”´3µRh†~hɓJ…6ɽ tœáIò˜‚†‡†E.@²µ+U¢R`^àKmzÕ¶ÜY,3¦S²,}zÖ[ôˆÔèz`LҊ³|Ôé©b#FymCÑ"à-ãæIVÛа†…ÆŠfè µ7*·§*hüFëÀØ`1 ­/oäh™&®íÝN´ñážDãK7Û |6“Ðáº=%ŽWjÎüø QQÌ`”ÒuEÏlo¦÷­W’i˜ö-¾=OÉÇûmÏLooÔfNS‘Ý‹Õ,ˆK•£2ص¨ÿhRk›pZ§@‰#{R+úÄ5Æ¢@<ˆïå¥Jå­@ÁH†¾Œ‚µ\ʽäè¥~³KšE”è¥q³óèÅnvô Ÿ1²rówz͆¿ÙEse_`ÞG•Î9§CYèÈGΑ+t¦ü•ùú½„é¬ìÈ“Ã6Ú=*e˜éPSëáÌ(á`ÊgþI}…#0Ãދ¦D%À\,™úõœ²N"ZO“òëý•aœ¸““F…wP $|;@Au  QžKbÇS³Sg¡š ˜AÚÿÈHhš6¤tE¨fk!­§¡=ɏH­#—ì†Ì¶À­5MGcE %_¹o¢M«üä”ٽ†Üys…{W„RS¢BxR8ˆ ^# -’ݧ€PO»’6cÿ>ãb÷¨”š $8ù”Î%\Í¥gƒ~0ÞeƓBà¼Àwj8Br÷á #rió–_κ×;þáUÕ¡LMÊK+梥 )/-„¦aŠT`ó47‡8ÐÊɟ\¤PßØÔ6&ÂNºu+RPX‹“ƒÂJh-€´„œ_@/ШíXåG͔Êá°ð•Ñ,ʈ½Kx"‹Ò\ÙøÜ~Tqü@h^—öH¡„f“Fmª¨‰)¦Ñ=ÿXJ·ãÊz!ݎ+aP…tw¦dmRû[¥[—“n¬‰«E¿BS–nœ_@!¡]/ݸíYxÝÞAº•“nÚ¥¤]º]z9(@·K7åQ\H&œäÈXØ(Ólxž0üTzÝÊÙÙxR\qñ;Z‚¼N`]xÕáw·†rÙóæ˼—I*5¶,Øñõ“Ø®¦÷ڄ.€öª×$qaÄCJè^™PÁßÕ¯Èâæìר-`å S’ÂF:Å_ -å³€nϪ@P$Ìna _?†¯Ò--Š@Ðîáä¦G0C;R9øç#øÚy‹ö±êô±u¼Ý(콩u~á^ÉóñM“ö¯à¹…Ðn×þß÷b‡£æc ®œv˜È±Ý¢ýcPØÃñ†c ÑþÅ p&® µç£üáH ›÷ýÍç#ïp CÎðõ]R (ÍòbNO^j—Ú!©Œ2˂SÓ¡&„×ëÝâäÆ´[÷960‘M®Ý-C4Uš0³š”ÉÔ¥jÇ˄a³€¤¯¸:xMƞ`L’lAe )î3áI•u9/Ž©¬Ë­ÎöTqRy3½¹d tjœ”_ŒÍ«Žš*6ÙìxÇÔ^M2öù†Ôæñh>c¬R½‹3-¤MïHt„«9v©óÜRÐ$¶}_6ӗb ,Fœ¡jX*Ùâb“1‡4µ‰¹.¨mD zPÝÞq©wnšc½ãu”×;Ó¾¬àˋÕò騋fn/çϵËZ> héêr>ùZ>JBß¡œO+ªåÓI–.j,瓯åÓ᥋·”óÉ×òñÕÁÊùäkùt¼ÒÅÊùäkùt2¥‹šÊùäkùt¨tñå|òïéèªï›Ëù.v0¯–3^´L¥[ÃLŠiâ2™÷ÒÅH‚$cwç”sÅmꊶH¡%}uâmN¨‹8T;ˆ‡9¾ mùðHaN˜r5©b6Ó -ªWÙsߢ¦(mñ»xUò·"…rÐä³¼Ô͐ò*ñ©ž¡ÀÑ%²oÔÞ­}L¢UpXòŽ.¹1‰ï¡ÙhªßS%vò‚ü,kH[×IS~ Ÿ&šb¢ÝÝ,åk¦.6»Ù½Õwä'ÇZkJewü„K­®DŠ¡ÁÂßêi¦Êî¤Â>3J©ìNڈ•Và¢3/›b³_•¬”¼ ŽBÇ+`VŸà幌ø̼{ÅBLuòkJj²Œ©í)eÏ|Ò©ššŠ^u¨ -¯¦²RÙè%çô´K_›’¯qÞ <*à·]ÑÝk‚^IuL² W „õhŠê˜êšÂ³b潆šÂ™býç㒮‘“.‘W³E2ïÍÏß©a¥ÄjF¥×P9ó^uZ¼À÷zŠ®¡NmMaø T“#Ç‚”xín5«.n"Y£š2ãk ß-{+Ñ WÕO““n׍ï/öfz}'?‰ª(Hç׉”©Ss/\ŗv»ç[¾NùÒ= «GÁ!-câyà?Ù}^TarF¡‚=¸,ª¶¥\dB^Cé°Ö:öúuU{W­Ò˜PqÞ0ŠŽøö€ÅvÊÞÝ?²¾lX'aç]p¿\µž wP†"rú ˜’üý,ÌÚ¨Ó0£Ç‹Kêx`EŠ¡KÚ|A"¶­@)Ôê] 鲬“荞VR»÷¹/­§ý–´ù‚¤+þ.’“®&Õ·‚K‚Þ7| Ñ{ÃϾÃòjñ”ÈŒ‰¿«Uk2¤ò«“BJ¼ryžÜ˜.nq üÆTYÔ=¼7eä½¹5 hÉFÞ&R¨P dŒºL·xop¿@ùvï `‘KÑPw÷FwQºx»÷Öà ¼7åV}­ _“÷FÌ®¯Ìã½T¤t^W™wa­IŅ`MÝ -ÿá‘w·ÔKŠŸz)©uªI½|ݪJ½T”ǕïVÕ ‹r.Ô%\*r(²€J@jªX$¡Ðzt‡‚²‹Ü¹Ì{eéëü¤h—ùÕ:¬›DŠµyo»H±6ïC°¥]C½×[ö#Wÿ„»nݏšì58¢2Mr?öwj÷£œªi®Í¦e·;]uŒiÛFâ&.t—ºÌœ[屦Hú¾c©«À¤»/ï;V¼ÎïÍDq'VÇ¥Ë VÁÉßH¥hv³>›/Ïãµi'ج¥nM¾Æ ¡U”µª-’>ÎÔøÊïS$û¾¿S‘,t—"YX·v{‘,„r—"YHÝE×»Y4wmé«`5ç/Y ð÷cïæý((ʓi÷.Ê£êds…îQ”'¾6w/Ê»Á×É'š¼‰¯Åö¼¡(÷§QuyÿJQž˜ûá_(ʓ𧩴àúr#.tøýÐrÕWߒi±jn¿èiY—‚ݤ6 ‚ -¨sBªpë5Üia |۞âú­NªØÏßïɕÝÍݒX ²“‘-ö{ªÿÔ¦RX'2X ΆUXµq·°ìÎßû®²M¥h¹²;K€UÇïSû“*ö  ûàù]ªìn(Wýö§Pì·ít$±šª‹ï¹օBŸÂfOkþeX¤°q㋍¥°BåöbiÁÖ¥'Ž>ÑìUù^Lì=ÚýÀ{Õÿ^UÒomPïчi5(¢¢¾°fT‚<¯…g¬œÏYE~/_¹µoèÙð¢L Óö>ÅE*’a…éž^{cÂck2ÃRʃUJ¡MÜ{¶×k¹¢¹F…/J®½ž6·Ý0§:S¡8“ºáRCî Rg=ùÜAõ\¥ÐYOr†ñ›œŠF+jg¨¢»‚jÂ+õXÞwCS= û¦°îÇ$™Z«¶+Ÿ‚ƒøšÂ¾+}6Z ûĬÆmwÇÂ>µ÷ÙÜXØ'æE¼Ø7·ö‰Uõé®-Ĕ.ìsãK$øßRØÇ# ½y¹HáÝ -ûÄ@é.3¹¢°ïÚCZcaŸXœ‡;=ïVØ'VÕÇó ܧ°O¬ªOm֐†Â>1/=câÞ±°Ol…)ñ] ûÄT^–ê} -ûĪútWëßPØw9¦oƒŒumaŸ˜ÚŠˆvßÂ>±5Kµº±°OJ¹óU…}’Zç} û4í–Â>¨‹û -û®#šæÂ>ùJ¯»öIT}ß»°O DsçÂ>±`‹0óþ…}b‚B`âÞ£°O)°r§Â>çÍ= -ûÄȁ©ê÷*ìS,(»OaŸXUŸxÊHñ.6¢“³1¢ý–´Ý9%ÝÓ첇§ÀŒR]}µWØö<úû·R*Ç ]ü.ÆtBa¢{wñ“Q9ԑêd7k"G'~Â%,UÔ6Tò¯4B'QŽ-5,Á˜Ô -6%3,~lëª1!¢aiêS-7&ñÜ ia#C*™>Õòk|“)é)&“ÏÙ)t„—wå±Çšlÿ¿››ÿé°;ºTêë×4ÿ“6¼þ×NŽ½öM'UP¦®¦OU΅B>4×ÿï¶õ*ôw:5mvdZªšÿ);!!mnnþÇh6òýÿnnþ§£ªðúÿ© ?í*÷¸£Ë—ìzäRCGånéO» -§Ž‹¥ó¨žÜ³U-—J‡‰`Û>Å G%.…}ÐĖwÞ«ªéS“A Ñ(Õ;Jg†¨.v„hd’5$©AI:  ­®ß@m0 KšàU°’³Ö‰Ýj%0*4þ®¬/ã§ZÖRÈAWj@)秩NµÐT&‘ËgR#AxŸBÌÛ#)°×¢Ì­ç ¨¤ª®}šša"jÊèiýûݪէBxwª»íKÞªu…f3;jj†©Ô@Ð}eÝ-¶QÙԝŠrlåº[0&õåØru·´».F5$ŽÑ aí]ñ¹“[y²wù-gX”¡w0—´·;Ïۉ=>¨Ôì½“s¯9ñ˜£"äÆ|Îô'^=àK²…cåUæ4GÃk¿{¶ø­é¢Ùa_¢2Ï*]x8O¢„”6©BÄ ÁjY?¤êß%±ÂÙ<’;Ÿät‰‚aЕÄj.Í\K©ÖtV«Ž-(ãˆÜx1¬ü¹£9dâ:,úE—VKr¸à -Ð@" ;ññJ§ÂBDœÂ•xCkÐðäÉM0Ï­°8o,ƒµ` Jc-4 1¬:Ô /\ä•z -±¶ä:,V^¥±æó]’Ÿ8á ö]z¶=»ù, ñž/KH¾§Ãë=‰‰-šVÒݞòÜÁ fÝ÷ ÕQ6Øø†øçiVƿ̞|*³3]VNÂ5›œŠMÇ5þ,,®Rv¦H—E]&nIŽ 1´ô°²j꫔‹«Žº{5¦A~`¥Æ4jýN9ùÄ-Éåc4Þ°ÚZrÜä -…iÞP§ JÑI÷:®δΐswÃ@Í-(%Æt‘v±oT^S@#7,iÿ²¶1AÑ)Fè"W ºòï ?žés¥€—T\ï­ä¹åïueß© -›ë+¢dÝÒªÃD£ü-Wìê¸ -ɋ{ï®*»ã)ŠªJ¯óHó³TQIâ­·ëŠÝw§“¬[S²j.ﻓ1$üiüT‘`í”ÔÔâAFؐw³¤§ä…°¹6†NÕþImh*è¥Üԏ76aŒ@ÙǧC} -%=0þýEFÂ*|Ю¤Hì`^=飶‚¶Ë>7tª“¯¦ÒiªôŠhºŠ“°þf^ó9+ªê¼1aLèÛ¿ëWFµ¥:üŽ.™ºD¥Ð -kˆòçåR!Õ!h­m³£šR#!óEɯ 4Á)s#Ñ«‰ÔO“½•hŠ-…´­ê—€vQÅ,¦62D»²$Qm=¢Rýr¡šªzD¹”x%‰jëEüÐZJÕÖ#rÉ°W•$ª­G¤ÜÝW—$òøEÆ -½È¹ÕV’¨¶íú’DŽ¤òDǯôÒZ’¨¶‘³¤¯*I”ÓE="/îIèr^·7+Ô©oRwK³B|6ÿb³ÂK÷ÿҬP§Ô¤î>Í -éŠyµåöf…ºžDôÅ»7+¼tÛý+Í -ESï߬P§ª¿ç-Í -yî8¬ ä°h*)U,Kw;”/ŒÑÐðPÞ%¡œm§²á¡º[­nnxˆMî·ZI5<ԘumÃCùn‡bNÈ«Ê»$ ví ÅYPþV«+ª`è{4<”O7á]76ÅSnokxȕ‘‰q$çLÑVrqÑðPž†”r{‡†‡2{î¸ò© }+7<”‡Â*P·6¡€Ëÿ®‘=WÅuЪÿ$ÓZu“óv-øöÝY¼ö¯–Å—ñ-mõç~;­Ê*ºŽ÷¶‹¤e³‡öO‡Ô&ø¢{Iš>K!øô5,•¬çoÃп}_D)€ªMÝNûUﲏRzïrÿjûÌ)‚ÌT2ùõY& -ASëp˜D,‡cø­t4Œ‚³c`6l°•Ÿû³ÛùæòU#LÞ¯ûp|ßÂ|¥Šˆ^ÉklPGҟÍ4»Ù™°Ýæyây²¥SÕ²½9À„O&´6>£^rº¨ÀÒ25/†×A'aÜܤÉë_ž ë¹~k[ËL¹ªþìØù_`B\mƒ*$õi²Óy"Œ‹9åhlù -ýN°ÀäY¬~óÒb“"NŒ‰àSææ䢇ZŒf?ʆbþ0ŒQpfR{ËfòÞN.—´‡+Ü{dÄÐÞ@¯{.Õ_ÔⱯB°°²?JŪúšWúo‹:]y{Ûó¯½"üæÜX»`)±ƒ2ÿþ™V„ûdù ã%—Ý—™ùä± Ÿ3 Ihþ ÙP-2=¥øóÙA ƒkÃø&ëb~IºÉ¼·p‹„=çx:“–b©äq˜¿ÿòŸ«}„p'BV4T8º-ë‰e¦nxðlÇLÙg€†y–urϼ™A7É<(±+8B§±ôÍÐæÅ -„Çvå)T§ìwvîeŠ(Œ\Ÿì3'¨°‹ð;7­6^Xéôç)«AXei÷%»z );Ä1r׀ïH¤“ Øè‹ ã †"1 …^´Èר»!  æ F׃~ä3FþNàÏ¡Ï]k¯|à·»=aˆàS;Ààú#Üý*G˜ †f(8sîiÜ]nÌ]2ž÷ÿ -*PááÐĵ^Fõeår q“ƒÐ\ ’©pG ­åp3.)ó¢“+͟õ´Ôî÷M=̧¹—{èá-0ÃÓ¯ÿb8Ó+i³&b¡Wç#Œx“ÚS.mÆgCD¹`€õúÒ¨Gd*­×W£x„g7ÃÙ ³ØöAžõŽïߞÞñ:Êëµ^Qï ;Æz󮳟œ½3í[èíkUït›_á±^ÕÛö†v¬CQ(á6ÁÕ´0»º¶ac@c°AMw·m´è4‡eN¸Q ×|ËOÑB ”¤E ’ PE„^´¢Â]^ޜshgD'+!HEBòjb=ZB*V:4 -Ä©¸e(ÌNƒÆËä¡ß³à]È×i±D1E±xò£hœù.…„“…^n I‰À¬®Š Ý»,‘+Ç·x¥Îñ÷ˆ`lPœVx¶yÀÊ&(Ù -W±¬NJ¦R2xuÓâ4ôZÌNVé ëü´0àœLEç2®C˳QœE„M@èƒJ+ -:©§µósbþ´Éϟ&\½A­Âã•7Vù(z³™ŸÓIÑw°t0y8Ïð68 H…ÏW›Þ2¦i£ïôÏ}˜}Ñ:Aí´Ë»£z„w)4p-)à+ ÿ(—‚Ñæ7:P‹A GrlöZÿ2!Èø°^Kî+ýÝto£¿[=ÚÁRͬn1çǤ©'ŽîᏧÞlSp4ÙIð1Cc{y9Ré®Ç6«Ž~ M”‘öغû‡úŸõùׅX¸µéé·î<¥ÿ2ý!£úqfl½ƒcÍ_öú†–F´³"ÖSõ‡&H*=s5JÄÀ 7”fà蠉òÙyÝ×' ünFëdG´Âk¡Û%(:äŽm–ïœFn‡u–‚›ZI:øRM‹…¦Ã4Y¿Ì‹‡D ±êñe¹$œ€T´ 2Ö -K‡â‡ëñ·«‚¨ä?Š—CõwgŠ÷ìÁéðY¯I1ƒ™ºƒ¹wÙ0”$ÜÄ5SÅèRL©Ì‘Pi.ØÅAIUÁ9BÃDð|3UuÃD€:ºr V„[n{ÊLĂ¯È5¬mAYC܊à0ÔÁà¨)6–¡“ÑՆaô²·pĐ„œ Bü͍(æÚ3öžœ ÿU+uuëO'î~ÿC°@Ü{×s.ƒ¯æ4pH¸®„AqšÈÞ×Êi81®å4œWÁÀ÷¾— щøàVlß^CM Z–hWÁ°ª¢€X@ƕÒÀn|8›«VÄÊ­ˆäÞç¡£îèŽãiLÀ–ÌMëD¸M¦b"h”ÀaH 1ՃPwHë͹÷& Ã{ñaخܨø!mãØS’òƒ<—¢S†6ü\ºRtÚÔ°§Ü¹d“çMU¢ÓæÍô=%ìϏS´Ìýé3F³*ijø]@[®èÀmïnO½³@“| ·ºŠzGÝê@ö ŒÍ)Ge7²×¤Ñv¹×ŽloÜ1HŽÇŒk®±eŒç6ôrxËe9Hi÷Îêх~Nù΋ˍþ„º…þô»€œ­´qnÞÃËð‹vúϨÅI[æèÏ*RÕ©_~u£'ÚSÌoÎIg¥rxÄf µbÍèìӌ}àÀt=9(‹€oy/Ÿ„‰*†Ð—|ÝehÚ¢H?°âÆ~!Å9RG¸Å_ ÐÅ>CÍÈÁ×UƕU¨”KÓ}‚~œjY<³Ñë9mÚ)ÿçl灤j:YÞ0zÍ ,Sm¢ó½õÌzá7¬¬=x>‹uô' ÷s0ôÐ+×'í¬›Óžz­ÁèœÁÚqQh«1Lx×í§¼#b4©ñj´cIO ]¸@9S.Réèä7Ò-R ,V’À@z܆cÜލ‚‰®ÿ%ú˜[ÐðZm=ãÀr~· @ã3ÆãÊ1h=ÏWÌìß0–ñæŠÏÐÛô梨””<”»*÷YПÖ]/ýé<¡ÝêÍ[§c& Λ÷.áú¾QŽïx‚ .d¿zÇë*Aý||nÑÀ'ÖëPàîØIlþË>ð³Î6“7}îó<3Z™µkiK7>¿ª¹JIßæ&lª{–͐2a™WŒ(ã{:—ؾùpS>9“·ë§€)6 ПrÓf€>ú½×¿´p8õlçƒÌ­?ӭλ9?s¦ÞG ÕsÞÁÓ.HÉ J~‘〼_Q“Sí:¿¢&§¢0ÕJ½_Q“S훫üŠšœŠ(~s•_ 9þï„îŸPÄx@ÿ¸[çõâP?ü,6Ý?1Ý?îtÉãénæ[ò°Xtÿï)·ý<ÿ-6§‡èƒ;ÝΖJá@nñ¹/tð%ÄÊD'=Ú‰‡ÇyžIĈ™ÜW¤°*ZÏÓÜÑO`~KJ‡ÙuöÐý:ð\}Ò;Æó¡Þá%ÛzKñè€ö) - Т¸‹Í[2ç¼½V}ìA䧉L:Ë¿e­”û¸Œ»‹éŒM¾¶Sî±E.:,ÊËFÀ\í"w  œLzküÅÏzèaR¦Þ˜ »õk*¿.ëíÍÇ8Ãø ÝúsÊßO9ó§û0 Q§4PkÓÞýËJÊgzƒ’ÒÀ«4DD¹p(~ #¢˜ª`Œ-ÓÌÁ.ƒ±d°Á0UC]È:ðˆÕÇ^(¹ œŠbïݎ´°Õ~Ïh«¡?ÕFD¹p(•ø÷/ED¹ð%ŒÂÿkQã ùW"¢\8†’þµˆ(Åb£÷ˆráP8›-"ʅCñ}s÷ˆ(…ù¿å¡PtâÑ·žÞú2°ÐBôm@ Ì/k²£·þ¬zç¦ùkF® „^´ç>%öÀæI#GÕ÷‹RhÚ;ú­éÞÉ$“ø-\2 «‡˜áu?{(:í´è„: &:û[•DbNé?ÐÒ#љu9ëý8ÇKîŸÞÉEi?Ž¨å„™–/‹Õûè¥"`ø  Єœœ¥eÚ½Rå¸K©1ÇÙ*³~ܐÇ(´`M8‚U3æk 2H ¥´QÄ0¥?{ -] <³–u¨¥8è`èÒ‰öBiò@ÓI¹ib”$Åäw¡ëE‹þ±cUE\Â,— d;w Sv·°6„Õ¸}g©¬·ü(ÀÆ›B‡ eæ;ñäg¸rÃ^¸5hÐ?eŒ9™xmƍ𐽂%ꨒí -Ç#]Ýý“èæ‘ÆÙ-ØùîuÏ|×?¸ê;gÝ Æã¥hѱ3Ú}¤>»ˆ!"qFÅŸ½T‹‹4‚ðçÐRë¸öĩȵ§:–êÙ±táD@n)šœ`8‚;VᝊXªt •õ³ÊÆäjN–4V:¡-‹ -"<Ÿn ('£“Š@*/ , ¬SåÎ7Dæ©úL²€J¦¼€ÚÜ©Éz µæºe"¨l€ÙZÑ4O¤uk -m‹lOGäd»…µ¡CÑ.ÀM-1 ïÑ©4‘iü…à®=a^²âE'¢’š0QӃ ŌíaÐ؆ß{µÙ[éWÉ_]¤Ý ÍîÓ±ùVNj‹å6N«ú]iN“…1J7sšùÛr§«§©†Qµ;¹€f!à´QÈuˊ@wº[ ä4µ0 -ÕGå}+€Iÿ…š jA(>ˆ‘KœšpT†„âŠÕSqïË ‚ö¹Ý¶"Pᕧ&uÞÈM¤è$µí‘‹A«¤ªß°GŠÉ–Wa‡„ÛƒÒEÿÉՍc0f£§ÛŽ„ÙÒngiÙqÈ bç‘f-Á ) ǧ1伉->Ï.Žš¸èT8špÁ¬èf—„ˆèüL–’øŸÅz -ÿ³ÙM#[ÕK ]“ë݆vê?ý¹¤}Ü˝§…jö£LÏP¾ˆ@ŠñSA— ?€%]ä¡¢ÂCGßApK‘‡Š -8^‘ës­Xñ‘>¬ØñU;[uQÁ«.xƶ[€f—]²ÏP1g¯Õé‡<ÚqâõÉTLE(M`b¢i­¦Xç€×Z$㚣s¼nL— ›Õg.°85Œ‹ÂÇ ¼L·ÏƟü`ހU5ÇÆޏó(E»:ú#ëëôó}¹dˆe™7'mf¡Hzs3à Ÿ}@#öÍÃ8®ÞP<Æ-Þ|ì'? û ‚?”…"¢ŸhõlÙπ`?yðè§wÄ>üAned¼˜¿f6ƒ ë V;ã1gîaÌù ªùLÖ:¤ëø§ÿf¡c£ôüäÅ_­-ýð;¿H¼IN^ûٜ=l%É|핉užþÄb B.u±îí¼©õ&^éJD2Mƒ7ñJW¢îmÞÄ+]‰(uAƒ7ñJW"r?¨ô&na(4½£%gœßÌñ`'øú |Õ^œÎ;ôJ`œY,6Õéà¸ñTa­Í؝>œr?Ÿ§ŸífzøïC}׫U»¥ÜCô~5ö`ƒ!Æà]ð½XÇpˆcÝ?ÄCþÓûĞÞÁÏuð+ì÷|þ ‚A?á"¼!ŒÏåóü`T®ˆ×FzSøCjàØá_eðé|÷ŸñP{~sxØÒý㠄œþpèAþ@ú\¥?{ý®pÈっ÷<¾°+è!ÂìôË_*æŸùYŽ?ËïÓøs»>ÿ)Ð`Gfï ‡ý4!l¶hš>SÐã -€Wà¼!8hŸÇ 80ô=Hô6þ™ý¥Ê´ÿ¦ëµö9\±~Ÿ]lM˜% DИ½èï€ßð=ì¾@ À¿¯7âòrjX±êâë4nLOßj¦YÍЛì)´…œðìyjL—‹Îaú³†{jyœþ?‹‡éf³=MO‹xô°<,Ž§íañpüÞþ~ÄþìÐ:0™þù/Vœ -endstream endobj 7 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 34 0 obj [33 0 R] endobj 48 0 obj <> endobj xref -0 49 -0000000004 65535 f -0000000016 00000 n -0000000176 00000 n -0000046465 00000 n -0000000000 00000 f -0000000000 00000 f -0000175432 00000 n -0000175365 00000 n -0000000000 00000 f -0000046516 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000175639 00000 n -0000175670 00000 n -0000175523 00000 n -0000175554 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000048167 00000 n -0000175755 00000 n -0000046845 00000 n -0000048464 00000 n -0000048351 00000 n -0000047096 00000 n -0000047605 00000 n -0000047653 00000 n -0000048235 00000 n -0000048266 00000 n -0000048538 00000 n -0000048734 00000 n -0000049777 00000 n -0000070877 00000 n -0000136466 00000 n -0000175780 00000 n -trailer -<<5B95C5AE6D270C48854932B225484F55>]>> -startxref -175973 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg b/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg deleted file mode 100644 index 7712f662..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_blue.ai b/net.mograsim.plugin.branding/raw_files/icon_blue.ai deleted file mode 100644 index dcdd0e08..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_blue.ai +++ /dev/null @@ -1,1467 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R 6 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_blue - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T16:33:44+02:00 - 2019-06-22T16:36:14+02:00 - 2019-06-22T16:36:14+02:00 - - - - 224 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Ann5Hfmx9aWHyprs3+kqA mlXkh/vAOkDk/tD9g9+nWlev9oOxuG8+IbfxD9P6/m6Ts3XX+7nz6fqe25yDu3Yq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7aztZru6lWG2gRpJpXNFVFFSSfY ZKEDOQjEWSiUgBZ5PF/Ln5mXPnH84tOhti0WhWaXQs4Dt6jei49dxtuw6A/ZH051uq7JGl0Eid8k uG/Lcbfjm6XDrDm1IA+kXXy5vAUd0dXRirqQVYGhBG4IIztiLdC+m/yZ/NVfM1mui6tIBr9qnwSN t9aiX9sf8WKPtjv1HennvbvY/wCXl4mMfuj/ALE/q7vk9L2drvEHDL6x9r1DOcdo7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kKCzGgG5J6AYq+afzp/NY+YbptB0aX/c HbP+/mX/AI+pVPX/AIxofs+J38M9A7B7G8CPi5B+8PL+iP1/2PNdo67xDwR+kfalf5C/+TM07/jF c/8AJhsyfaP/ABOXvj97X2X/AH4+P3PPc3rrlexvrywvIb2zlaC6t3EkMyGjKymoIyvJjjOJjIXE soyMTY5h9W/lZ+ZNp5z0ekvGHW7NQL+2GwbsJo/8hj2/ZO3gT5r2x2VLSZNt8cuR/QfP73qtDrBm j/SHNnGadznYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/PH82OXr+U9 Cm+HePV7yM9ezW6Edv8Afh/2Pjnaez/Y3LPlH9Uf779Xz7nRdpa7/Jw+P6v1vC87J0T0L8hf/Jma d/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FUx8veYNU8v6vb6tpkvo3ds1VPVWU7MjDur DY5j6nTQz4zCYuJbcWWWOQlHmH1x5D88aX5w0JNSsyI50ol7aE1aGWleJ6VU9Vbv8655h2j2fPS5 OCXLoe8PWaXUxzQ4h8WR5gOS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkv51 fmuNBtn8v6JN/uauFpdXCHe2jYdAR0lYdPAb+GdP2D2N4x8XIP3Y5D+cf1Op7R13hjgj9X3ftfNp JJJJqT1Od8847Ch6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxVkHkjzpqv lHXI9TsDzT7F3ak0SaImpRutD3U9jmD2hoIarGYS+B7i5Gm1EsUuIPrjy15k0rzHo1vq2mS+pbTj cH7aOPtRuOzKev8ATPMNXpZ4MhhMbj8W9bhzRyREo8k0zGbXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwD82vzOt/J+l/VrNll1+8U/VYTuIkOxmkHgP2R3PsDm77F7JOqncv7qPPz8h+l wNfrRhjQ+s/i3yvdXVzd3MtzcytNcTMXmmclmZmNSzE9Sc9IhARAAFAPLSkSbPNSybF2KvQvyF/8 mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVZn+WH5j33kzWQ55TaPdFV1C0B7 dPVjB/bT8enuNR2t2XHV465ZB9J/QfJzdFqzhl/RPN9Y6bqNjqVhBf2My3FncoJIZkNQyn/PcZ5p lxSxyMZCpB6uExIWORRGVsnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8xPP2m+TNDa9uK S301U0+zrQyyDufBEqCx/iRmy7M7Nnq8nCNoj6j3ft7nF1eqjhjZ59A+Sda1rUta1S41TUpjPeXT l5ZD+CqOyqNgOwz07T4IYoCEBUQ8nkySnIylzKCy5rdirsVehfkL/wCTM07/AIxXP/Jhs0XtH/ic vfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV6X+Tn5pyeVr8aVqkjP5fu3FSd/q0jbeov+Qf2x9I9+e7 c7HGpjxw/vY/7Id3v7nZ9n67wjwy+g/Y+n4pYpYklidZIpFDRyKQysrCoII2IIzzsgg0eb0wNrsC XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk/m3zVpXlfRJ9W1J+MUQpFEPtyykHjGg/man0dTtmXo tHPUZBCHM/YO9pz544o8UnyN5w826r5q1ybVtRf43+GCAH4IYgfhjT2H4nfPT9DooabGIQ/tPe8l qM8ssuKSSZmNDsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdir sVdir2j8kPzY+oSReV9dm/0GQ8dNvJDtCx6QuSf7tv2f5T7dOS9oOxuMHNiHq/iHf5+/v7/v3XZu u4f3c+XR9CZwz0DsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLHStOudRvpPRs7SMyzyEE0VfYbn LMOGWSYhEXKTCcxGJkeQfJX5kfmDqHnPWzdS1h063qmn2dahEPVmp1d6VP3ds9O7K7MhpMfCN5n6 j+Ojyes1ZzSvp0Ylm0cR2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f+Jy98fvdj2X/AH4+P3PP c3rrnYq7FXYq7FXYq7FX0N+SH5sfpKKLyvrs1dRiHHTbuQ7zoo2icn/dijof2h79eF9oOxvDJzYh 6f4h3efu+77uh7N13F+7nz6PZs5N3LsVdirsVdirsVdirsVdirsVdirsVYn+bH/kudf/AOYU/wDE hmz7G/xvH/WcTXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv +/Hx+557m9dc7FXYq7FXYq7FXYquillilSWJ2jljYNHIpKsrKaggjcEHAQCKPJINPqH8nvzTi812 A0zU3CeYLRPj7C5jXb1VH8w/bH0jbp51252OdNLjh/dS/wBie79T0/Z+t8UcMvrH2vSc592TsVdi rsVdirsVdirsVdirum5xVjvljztpfmTVNYtNMPq22kvFCbsGqyyPz58KdVXhQN3+WZ+r7PnghCU9 jOzXdycfDqY5JSEeUUL+bH/kudf/AOYU/wDEhlnY3+N4/wCsw139zL3Pj/PU3kHYq7FXYq7FXYq9 C/IX/wAmZp3/ABiuf+TDZovaP/E5e+P3ux7L/vx8fuee5vXXOxV2KuxV2KuxV2KuxVE6bqV9pl/B qFhM1veWziSCZOqsv6x4g9cry4o5ImMhcSzhMxII5h9Y/ll+Ytj5z0b1fhh1a1CrqFoD0J2EiV/Y en0dPn5n2t2XLSZK5wP0n9HvD1ei1YzR/pDmzLNS5jsVdirsVdirsVdirsVeIfnj+bHoLN5U0Gf9 +wKareRn7APWBGB+0f2/Dp407D2f7G4qz5Rt/CP0/q+bpO0tdX7uHx/U7/nGH/eHzB/xltv+IyY+ 1v1Y/dL9C9i8pfB6H+bH/kudf/5hT/xIZouxv8bx/wBZ2Gu/uZe58f56m8g7FXYq7FXYq7FXoX5C /wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXYq7FXYq7FU18seZdU8t61b 6vpknp3MB3U7pIh+1G47qw/zrmNq9JDUYzjmNj+LbsOaWOQlHm+uPJPnPSvN2hRapYNxbZLu2Jq8 MoFWRvH2PcZ5f2hoJ6XIYS+B7w9ZptRHLDiCf5hOQ7FXYq7FXYq7FXlv5z/mqnluzfRNIlB166T9 5Ip/3ljYfaNOkjA/AO32vCvR9hdj/mJeJkH7sf7I/q7/AJOr7R13hjhj9Z+x8zO7u7O7FnYksxNS SdySTnoQFPNPfP8AnGH/AHh8wf8AGW2/4jJnFe1v1Y/dL9DvuxeUvg9D/Nj/AMlzr/8AzCn/AIkM 0XY3+N4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/wCTDZovaP8AxOXvj97sey/7 8fH7nnub11zsVdirsVdirsVdirsVdirsVZL5B89ap5O1xNQtCZLZ6JfWZNEmi8PZlrVW7H2qM1/a XZ8NVj4Jc+h7j+Obk6XUywyscur638v6/pev6Tb6rpkwmtLleSnoyn9pHHZlOxGeYanTTwzMJipB 63FljkiJR5FMMobHYq7FXYqwb81PzLtPJukcYSs2uXakWNsdwo3HrSD+RT0H7R28SNx2P2VLVz32 xx5n9A8/ucHXawYY7fUeX63ynfX13f3k17eStPdXDmSaZzVmZjUk56XjxxhERiKiHlZSMjZ5qGTY vff+cYf94fMH/GW2/wCIyZxPtb9WP3S/Q7/sXlL4PQ/zY/8AJc6//wAwp/4kM0XY3+N4/wCs7DXf 3Mvc+P8APU3kHYq7FXYq7FXYq9C/IX/yZmnf8Yrn/kw2aL2j/wATl74/e7Hsv+/Hx+557m9dc7FX Yq7FXYq7FXYq7FXYq7FXYqzn8q/zLu/JurcJi02h3bAX1sNyp6etGP51HX+YbeFNN2x2THVw22yR 5H9B8vuc7Q6w4Zb/AEnn+t9W2N7aX1nDeWcyz2twgkhmQ1VlYVBBzzXJjlCRjIUQ9VGQkLHJWyDJ 2Ksb8++edL8naG+o3n7yd6pZWgNGmlp070UdWbsPegzP7O7PnqsnBHl1PcHG1WpjhjxH4PkjzBr+ qa/q9xqupzetd3LVY9FUDZUQdlUbAZ6fptNDBAQgKiHk8uWWSRlLmUuzIanYq99/5xh/3h8wf8Zb b/iMmcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdi rsVdir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq9B0X8sJ/MH5 ayeYdJVpNVsbqZJ7UVJmgREb4B/OlTsPtfOmaLP2uMGr8Kf0SiKPcd/sP2Owx6I5MPHH6gXn3TN4 4DsKHYq7FXYq7FXqX5M/ms/lu8XRNXlJ0G5f93Kxr9VkY/aFTtGx+2O3XxrzfbvY3jx8TGP3g/2Q /X3fJ2vZ2u8M8MvpP2PplWV1DoQysKqw3BB6EHPPiKelbwK+UPzw1K+vPzG1OG5maSGy9OG1jP2Y 4zGrkADxZiTnpfs/ijHSRIG8rJ+bynaUycxB6MCzduA7FXYq99/5xh/3h8wf8Zbb/iMmcT7W/Vj9 0v0O/wCxeUvg9D/Nj/yXOv8A/MKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf8A yZmnf8Yrn/kw2aL2j/xOXvj97sey/wC/Hx+557m9dc7FXYq7FXYq+m/+cc//ACX8n/MfN/xCPPPP aj/Gh/UH6XpuyP7n4sU/PL8p/QabzXoUP7liX1a0jH2WPWdFH7J/b8PteNNl7P8AbN1gynf+E/o/ V8nF7S0NfvIfH9bw/OxdG7FXYq7FXYq7FXuP5Gfms0Ulv5S1uUtHIRFpF0xqVYmgt3J7E7R+H2fC nHe0PY1g58Y/rD/ffr+bvOzNdVY5fD9X6nvecU758j/nL/5MzXf+Msf/ACZTPT+wv8Tx+4/eXku0 P7+X46MLzbuE7FXYq99/5xh/3h8wf8Zbb/iMmcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JD NF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+ /Hx+557m9dc7FXYq7FXYq+m/+cc//Jfyf8x83/EI8889qP8AGh/UH6XpuyP7n4vUGVXUo4DKwoyn cEHqCM50GnaPmb85/wAqW8t3ba3pEROg3L/vI1Ffqsrn7Ow2jYn4D26eFfQewu2PzEfDyH94P9kP 19/zeZ7R0Phnij9J+x5bnSOrdirsVdirsVT3yD/ynXlz/tqWX/UQmYXaX+LZP6kv9yXI0v8Aex/r D732fnkz2T5H/OX/AMmZrv8Axlj/AOTKZ6f2F/ieP3H7y8l2h/fy/HRhebdwnYq7FXvv/OMP+8Pm D/jLbf8AEZM4n2t+rH7pfod/2Lyl8Hof5sf+S51//mFP/Ehmi7G/xvH/AFnYa7+5l7nx/nqbyDsV dirsVdirsVehfkL/AOTM07/jFc/8mGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdirsVfTf/ADjn /wCS/k/5j5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0Ub6ytL6zms7yFZ7W4QxzQuKqysKEEZPHklC QlE0QxlESFHk+UvzU/LW78m6vyhDTaHdsTY3J3KnqYZD/Oo6fzDfxp6V2P2rHV499skeY/SPL7nl ddozhlt9J5fqYNm5cF2KuxV2Kp75B/5Try5/21LL/qITMLtL/Fsn9SX+5LkaX+9j/WH3vs/PJnsn yP8AnL/5MzXf+Msf/JlM9P7C/wATx+4/eXku0P7+X46MLzbuE7FXYq99/wCcYf8AeHzB/wAZbb/i MmcT7W/Vj90v0O/7F5S+D0P82P8AyXOv/wDMKf8AiQzRdjf43j/rOw139zL3Pj/PU3kHYq7FXYq7 FXYq9C/IX/yZmnf8Yrn/AJMNmi9o/wDE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv8A5xz/APJf yf8AMfN/xCPPPPaj/Gh/UH6XpuyP7n4vUc5x2jsVS/zBoGl6/pNxpWpwia0uV4sOjKf2XQ9mU7g5 fptTPDMTgakGvLijkiYy5F8j+ffI2qeTtcfTrwGS3er2N2BRZoq9fZh0Zex9qHPT+ze0IarHxx59 R3H8cnktVppYZUeXRjebBxnYq7FU98g/8p15c/7all/1EJmF2l/i2T+pL/clyNL/AHsf6w+99n55 M9k+R/zl/wDJma7/AMZY/wDkymen9hf4nj9x+8vJdof38vx0YXm3cJ2KuxV77/zjD/vD5g/4y23/ ABGTOJ9rfqx+6X6Hf9i8pfB6H+bH/kudf/5hT/xIZouxv8bx/wBZ2Gu/uZe58f56m8g7FXYq7FXY q7FXoX5C/wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/wA45/8Akv5P +Y+b/iEeeee1H+ND+oP0vTdkf3Pxeo5zjtHYq7FUg87+TNL83aFLpd+OLfbtbkCrwygUV16V9x3G Z3Z+vnpcgnH4jvDj6nTxyw4S+RvM3lvVfLes3Gk6nH6dzAdiN1dD9mRD3Vh/nXPT9JqoZ8YnA7H8 U8lmwyxyMZc0rzJanYqnvkH/AJTry5/21LL/AKiEzC7S/wAWyf1Jf7kuRpf72P8AWH3vs/PJnsny P+cv/kzNd/4yx/8AJlM9P7C/xPH7j95eS7Q/v5fjowvNu4TsVdir33/nGH/eHzB/xltv+IyZxPtb 9WP3S/Q7/sXlL4PQ/wA2P/Jc6/8A8wp/4kM0XY3+N4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvy F/8AJmad/wAYrn/kw2aL2j/xOXvj97sey/78fH7nnub11zsVdirsVdir6b/5xz/8l/J/zHzf8Qjz zz2o/wAaH9Qfpem7I/ufi9RznHaOxV2KuxVhn5nflzY+c9G9McYdXtQzafdnsTuY3p+w/wCHX2O2 7J7UlpMl84H6h+n3uHrdIM0f6Q5Pk/UtNvtMv57C/ha3vLZzHNC4oVYf57HvnpmLLHJESibiXlJw MSQeYQ2WME98g/8AKdeXP+2pZf8AUQmYXaX+LZP6kv8AclyNL/ex/rD732fnkz2T5H/OX/yZmu/8 ZY/+TKZ6f2F/ieP3H7y8l2h/fy/HRhebdwnYq7FXvv8AzjD/ALw+YP8AjLbf8Rkzifa36sful+h3 /YvKXweh/mx/5LnX/wDmFP8AxIZouxv8bx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+ MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdirsVfTf/OOf/kv5P8AmPm/4hHnnntR/jQ/ qD9L03ZH9z8XqOc47R2KuxV2KuxV5p+cX5WR+arA6ppkar5gtE+EDYXMa7+m3+UP2D9B26dB2H2w dNLgn/dS/wBie/8AW63tDReKOKP1j7XzBLFLFK8UqNHLGxWSNgVZWU0IIO4IOeiggixyeYIpO/IP /KdeXP8AtqWX/UQmYfaX+LZP6kv9yW/S/wB7H+sPvfZ+eTPZPkf85f8AyZmu/wDGWP8A5Mpnp/YX +J4/cfvLyXaH9/L8dGF5t3CdirsVe+/84w/7w+YP+Mtt/wARkzifa36sful+h3/YvKXweh/mx/5L nX/+YU/8SGaLsb/G8f8AWdhrv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4n L3x+92PZf9+Pj9zz3N6652KuxV2KuxV9N/8AOOf/AJL+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8XqO c47R2KuxV2KuxV2KvGPzv/Kf9IRzeaNCh/0+NeWpWiD++Qf7tRQP7wfteI9+vWez/bPARhyH0/wn u8vc6btLQ8X7yHPq8X8g/wDKdeXP+2pZf9RCZ1vaX+LZP6kv9yXTaX+9j/WH3vs/PJnsnyP+cv8A 5MzXf+Msf/JlM9P7C/xPH7j95eS7Q/v5fjowvNu4TsVdir33/nGH/eHzB/xltv8AiMmcT7W/Vj90 v0O/7F5S+D0P82P/ACXOv/8AMKf+JDNF2N/jeP8ArOw139zL3Pj/AD1N5B2KuxV2KuxV2KvQvyF/ 8mZp3/GK5/5MNmi9o/8AE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/AJxz/wDJfyf8x83/ABCP PPPaj/Gh/UH6XpuyP7n4vUc5x2jsVdirsVdirsVdirxfzj+U/wCjvP8AoPmfQoP9x8mq2balaRja BzcJWVAP91t+0P2T7dOt0PbPiaXJhyn1eHLhPf6Tt7/vdNqNDw5Yzhy4hfze0ZyTuXyP+cv/AJMz Xf8AjLH/AMmUz0/sL/E8fuP3l5LtD+/l+OjC827hOxV2Kvff+cYf94fMH/GW2/4jJnE+1v1Y/dL9 Dv8AsXlL4PQ/zY/8lzr/APzCn/iQzRdjf43j/rOw139zL3Pj/PU3kHYq7FXYq7FXYq9C/IX/AMmZ p3/GK5/5MNmi9o/8Tl74/e7Hsv8Avx8fuee5vXXOxV2KuxV2Kvpv/nHP/wAl/J/zHzf8Qjzzz2o/ xof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+R/zl/8mZrv/GWP/kymen9hf4nj9x+8vJdo f38vx0YXm3cJ2KuxV77/AM4w/wC8PmD/AIy23/EZM4n2t+rH7pfod/2Lyl8Hof5sf+S51/8A5hT/ AMSGaLsb/G8f9Z2Gu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc/wDJhs0XtH/icvfH73Y9 l/34+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/AJj5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0dirsV dirsVdirsVdirsVfI/5y/wDkzNd/4yx/8mUz0/sL/E8fuP3l5LtD+/l+OjC827hOxV2Kvff+cYf9 4fMH/GW2/wCIyZxPtb9WP3S/Q7/sXlL4PQ/zY/8AJc6//wAwp/4kM0XY3+N4/wCs7DXf3Mvc+P8A PU3kHYq7FXYq7FXYq9C/IX/yZmnf8Yrn/kw2aL2j/wATl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+ m/8AnHP/AMl/J/zHzf8AEI8889qP8aH9Qfpem7I/ufi9RznHaOxV2KuxV2KuxV2KuxV2Kvkf85f/ ACZmu/8AGWP/AJMpnp/YX+J4/cfvLyXaH9/L8dGF5t3CdirsVe+/84w/7w+YP+Mtt/xGTOJ9rfqx +6X6Hf8AYvKXweh/mx/5LnX/APmFP/Ehmi7G/wAbx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL /wCTM07/AIxXP/Jhs0XtH/icvfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV9N/845/+S/k/5j5v+IR5 557Uf40P6g/S9N2R/c/F6jnOO0dirsVdirsVdirsVdirsVfI/wCcv/kzNd/4yx/8mUz0/sL/ABPH 7j95eS7Q/v5fjowvNu4TsVdir33/AJxh/wB4fMH/ABltv+IyZxPtb9WP3S/Q7/sXlL4PQ/zY/wDJ c6//AMwp/wCJDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/ AMTl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/wDnHP8A8l/J/wAx83/EI8889qP8aH9Qfpem7I/u fi9RznHaOxV2KuxV2KuxV2KuxV2Kvkf85f8AyZmu/wDGWP8A5Mpnp/YX+J4/cfvLyXaH9/L8dGF5 t3CdirsVe+/84w/7w+YP+Mtt/wARkzifa36sful+h3/YvKXweh/mx/5LnX/+YU/8SGaLsb/G8f8A Wdhrv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4nL3x+92PZf9+Pj9zz3N66 52KuxV2KuxV9N/8AOOf/AJL+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8XqOc47R2KuxV2KuxV2KuxV2 KuxV8j/nL/5MzXf+Msf/ACZTPT+wv8Tx+4/eXku0P7+X46MLzbuE7FXYq99/5xh/3h8wf8Zbb/iM mcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVd ir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/+cc//Jfyf8x8 3/EI8889qP8AGh/UH6XpuyP7n4vUc5x2jsVdirsVdirsVdirsVdir5H/ADl/8mZrv/GWP/kymen9 hf4nj9x+8vJdof38vx0YXm3cJ2KuxV77/wA4w/7w+YP+Mtt/xGTOJ9rfqx+6X6Hf9i8pfB6H+bH/ AJLnX/8AmFP/ABIZouxv8bx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz/wAmGzRe 0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45/wDkv5P+Y+b/AIhHnnntR/jQ/qD9L03Z H9z8XqOc47R2KuxV2KuxV2KuxV2KuxV8j/nL/wCTM13/AIyx/wDJlM9P7C/xPH7j95eS7Q/v5fjo wvNu4TsVdir33/nGH/eHzB/xltv+IyZxPtb9WP3S/Q7/ALF5S+D0P82P/Jc6/wD8wp/4kM0XY3+N 4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJmad/xiuf+TDZovaP/E5e+P3ux7L/AL8fH7n/ 2Q== - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:75FE812EFA94E911B987F622BD994B0C - uuid:717f5cd6-4b5f-4555-8584-c15b50a65740 - - uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:75FE812EFA94E911B987F622BD994B0C - 2019-06-22T16:33:43+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Cyan - Magenta - Mograsim Blue (7,83,235) - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - Mograsim - 1 - - - - Mograsim Blue (7,83,235) - SPOT - 100.000000 - RGB - 7 - 82 - 235 - - - Mograsim Orange (255,83,0) - SPOT - 100.000000 - RGB - 255 - 82 - 0 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 40 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 36 0 obj <>stream -H‰TM -Â0F÷sŠ¹@“ÌL~š­Q\P°.¬ ½?8‰b+L|yùˆ=´Cq¸Ûg'tF8螙ñ5=^N <‘Ðé"”P㠕gÈYǽÙg‡â{#}=ßà -g°E=ã¢÷q[$U:ã‰â*í"a—´Q/ªh¤µ4Ä;~õ‘È_½.¥Ö¯ÎVГ±¦„þKú¼ MÏ!™~òà¿ó`’œ;¥ -endstream endobj 40 0 obj <>stream -8;Z,f;%eL($q1-eQc!eB@rRu>;'_62QH[j`r(36'S"3HHo3X%<%o@Hk2!FU+O9'@A -Vh?='VDRf@#r\p&mleqUMK\/E'E9[l2>lmZC]&"^j -95"(G'%j4=D]?'P$/_8'Cjt\dhLp_Tn>uh2^311(H[bs]?mAGAP!15FM;J6P"GI-O -gBipRN)0DM8H7ZrS4'1QL/FR>IM#j!_u/>@4FEE#&mRh+s,t5QJ+tT\q=:+;q6F)l -*<>sij2C`PIB^T7."CG!'gL> -5C)unqL8tSl2I=;5M^gRs4[,`!7BdB$i~> -endstream endobj 41 0 obj [/Indexed/DeviceRGB 255 42 0 R] endobj 42 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 34 0 obj <> endobj 43 0 obj [/View/Design] endobj 44 0 obj <>>> endobj 39 0 obj <> endobj 38 0 obj [/Separation/Mograsim#20Blue#20#287,83,235#29/DeviceRGB<>] endobj 37 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_blue.ai) -%%CreationDate: 6/22/2019 4:36 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%%DocumentProcessColors: Cyan Magenta -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%DocumentCustomColors: (Mograsim Blue \(7,83,235\)) -%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) -%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 47 0 obj <>stream -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 20907 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C4585FD6DFF7FFF0885FD6BFF5B0EFF0F08A9FD69FF850837FF080908 -%A9FD67FF8508090EFF0F080F0FFD66FFAF090F0837FF080F080F30FD64FF -%AF080F080F30FF310F0F080F31FD63FF310F08310931FF080F080F08095A -%FD61FF3009080F080F30FF310F0F08310F0F5BFD5FFF310F0F0F08310937 -%FF080F080F080F08097EFD5DFF5A09080F080F080F30FF0F08310F0F0831 -%090F85FD5BFF5B0F090F08310F0F0837FF080F080F080F080F080FA8FD59 -%FF7F09080F080F080F08090EFF0F08310F0F08310F310831FD58FFA90F08 -%310F0F08310F0F0837FF080F080F080F080F080F0831FD56FFA931080F08 -%0F080F080F080F30FF310F0F08310F0F08310F0F085BFD55FF3108310F0F -%08310F0F08310931FF080F080F080F080F080F080F085BFD53FF37080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310985FD51FF5B -%090F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F08 -%85FD4FFF5B080F080F080F080F080F080F080F30FF0F08310F0F08310F0F -%08310F0F080F09A9FD4DFF85080F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F08AFFD4BFF85080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F30FD4AFF -%AF080F0F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F -%080F080F080F080930FD49FF0E09080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F30FD47FF300F0F0F08 -%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F -%080F080F08095AFD45FF3009080F080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F7FFD43FF5B0F08 -%310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F -%080F080F080F080F080F080F85FD41FF5A0F080F080F080F080F080F080F -%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F080FA9FD3FFF850F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%37FF080F080F080F080F080F080F080F080F080F080F080F0831A9FD3DFF -%840F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310931FD3CFFA93109310831 -%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 -%0F080F080F080F080F080F080F080F0831FD3AFFA931080F080F080F080F -%080F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F0831085BFD39FF37080F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F -%080F080F080F080F080F080F085BFD37FF5B080F080F080F080F080F080F -%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F0885FD36FF310F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F08A9FD35FF5B080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08AFFD34FF310F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080908FD34FF5B080F08 -%0F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F31FD33FF -%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 -%0F30FD2DFFAFFD04FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F080F5BFD2BFF5BFD05FF300F0F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F08095AFD29FF3031FD05 -%FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30FF -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F7FFD27FF5B0F31FD05FF310F0F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F85FD25FF7F090831FD05 -%FF5B080F080F080F080F080F080F080F080F080F080F080F080F080F30FF -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F08310931A9FD23FF850F090F30FD05FF310F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F0831A8FD21FF -%A90F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310F310837FD20FFAF3108310F0F31FD05 -%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF -%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F -%080F080F080F080F085BFD1EFFA931080F080F0831FD05FF5B080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F085BFD1DFF5B08310F0F080F31FD05FF300F0F0F08310F0F08310F0F -%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F080F080F087FFD -%1BFF5B080F080F080F0831FD05FF37080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F09A9FD19FF85 -%090F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F080F080F08A9FD17FF8508 -%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F0FFD16FFA909 -%0F08310F0F08310F0F30FD05FF310F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F080F0EFD14FF -%A9080F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F -%080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F31FD13FF0E0F0F0F08310F0F08310F0F31FD05FF370F08310F0F08310F -%0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F -%080F080F080930FD11FF3009080F080F080F080F080F0831FD05FF5B080F -%080F080F080F080F080F080F080F080F080F080F080F080F30FF310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F5BFD0FFF300F0F0F08310F0F08310F0F08 -%0F31FD05FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%310931FF080F080F080F080F080F080F080F080F080F080F080F080F080F -%080F080F080F080F080F080F080F080F080F080F08095AFD0DFF5A09080F -%080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F -%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F -%31080F85FD0BFF7F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F -%080F080F080F080F080F080F080F080F087F3009080F080F080F080F080F -%080F080F080F080F080F080F080F080FA9FD09FFA90F080F080F080F080F -%080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F -%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F85FF0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 -%31A9FD08FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 -%0F080F080F080F080F080F080F080F0885FFA9080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F0831AFFD07FFA90F080F080F080F08 -%0F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F85FFFF8508310F0F08310F0F08310F0F08310F0F08310F0F08310F -%0F0831095BFD08FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FFFFFF5B080F080F080F08 -%0F080F080F080F080F080F080F080F080F080F085BFD06FFA90F080F080F -%080F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F -%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 -%310F0F080F85FD04FF5B08310F0F08310F0F08310F0F08310F0F08310F0F -%08310F0F080F087FFD06FF0F0F08310F0F08310F0F08310F0F080F31FD05 -%FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF -%080F080F080F080F080F080F080F080F080F080F0885FD05FF31080F080F -%080F080F080F080F080F080F080F080F080F080F080F0885FD04FFA80F08 -%0F080F080F080F080F080F080F0831FD05FF37080F080F080F080F080F08 -%0F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F0831 -%0F0F08310F0F080F85FD06FF37093108310F0F08310F0F08310F0F08310F -%0F08310F0F08310F0F5BFD05FF0F0F08310F0F08310F0F08310F0F080F31 -%FD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F083109 -%37FF080F080F080F080F080F080F080F080F080F080F0885FD06FFA93108 -%0F080F080F080F080F080F080F080F080F080F080F080F087FFD04FFA90F -%080F080F080F080F080F080F080F0831FD05FF5B080F080F080F080F080F -%080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F -%0F08310F0F08310F0F7FFD07FFA90F090F08310F0F08310F0F08310F0F08 -%310F0F08310F0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F -%30FD05FF310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F -%0837FF080F080F080F080F080F080F080F080F080F080F0885FD08FF7E0F -%080F080F080F080F080F080F080F080F080F080F080F087FFD04FFA90F08 -%0F080F080F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F -%080F080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F -%0F08310F0F08310F0F85FD09FF7F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F080F7FFD05FF08310F0F08310F0F08310F0F08310F0F31FD05 -%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF -%080F080F080F080F080F080F080F080F080F080F0885FD0AFF5A09080F08 -%0F080F080F080F080F080F080F080F080F0885FD04FFA90F080F080F080F -%080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F -%0F080F85FD0BFF5B0F08310F0F08310F0F08310F0F08310F0F08310F0F5B -%FD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F -%080F080F080F080F080F080F0885FD0CFF3009080F080F080F080F080F08 -%0F080F080F080F087FFD04FFA80F080F080F080F080F080F080F080F0831 -%FD05FF37080F080F080F080F080F080F080F080F080F080F080F080F080F -%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD0DFF300F0F -%0F08310F0F08310F0F08310F0F08310F0F5BFD05FF0F0F08310F0F08310F -%0F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F -%0885FD0DFFAF080F080F080F080F080F080F080F080F080F087FFD04FFA9 -%0F080F080F080F080F080F080F080F0831FD05FF5B080F080F080F080F08 -%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 -%0F0F08310F0F08310F0F7FFD0EFFA9080F0F0F08310F0F08310F0F08310F -%0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD0FFF85080F080F080F08 -%0F080F080F080F080F087FFD04FFA90F080F080F080F080F080F080F080F -%0831A9FD04FF5B080F080F080F080F080F080F080F080F080F080F080F08 -%0F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD10FF -%85090F08310F0F08310F0F08310F0F080F7FFD05FF08310F0F08310F0F08 -%310F0F08310F0F31FD05FF370F08310F0F08310F0F08310F0F08310F0F08 -%310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F080F -%0885FD11FF5B080F080F080F080F080F080F080F0885FD04FFA90F080F08 -%0F080F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F08 -%0F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F -%08310F0F080F85FD12FF5B080F08310F0F08310F0F08310F0F5BFD05FF0F -%0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F08310F -%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F -%080F080F080F080F0885FD12FFA931080F080F080F080F080F080F087FFD -%04FFA80F080F080F080F080F080F080F080F0831FD05FF37080F080F080F -%080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F08 -%310F0F08310F0F08310F0F080F85FD13FFAF3108310F0F08310F0F08310F -%0F5BFD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F -%080F080F080F080F080F080F080F0885FD14FFA90F080F080F080F080F08 -%0F087FFD04FFA90F080F080F080F080F080F080F080F0831FD05FF5B080F -%080F080F080F080F080F080F080F080F080F080F080F080F30FF0F08310F -%0F08310F0F08310F0F08310F0F08310F0F7FFD15FF850F08310F0F08310F -%0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD16FF7E09080F080F080F -%080F087FFD04FFA90F080F080F080F080F080F080F080F0831A9FD04FF5B -%080F080F080F080F080F080F080F080F080F080F080F080F08090EFF0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F85FD17FF5B0F0F0F08310F -%0F080F7FFD05FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD18FF300F080F080F080F08 -%85FD04FFA90F080F080F080F080F080F080F080F0831FD05FF5B080F080F -%080F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F -%0F08310F0F08310F0F08310F0F080F85FD19FF300F0F0F08310F0F5BFD05 -%FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F -%080F080F080F080F080F0885FD1AFF0E0F080F080F087FFD04FFA80F080F -%080F080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F -%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F -%0F08310F0F080F85FD1BFF0F0F08310F0F5BFD05FF0F0F08310F0F08310F -%0F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F08310F -%0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F -%0885FD1BFFA9080F080F087FFD04FFA90F080F080F080F080F080F080F08 -%0F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD1CFF -%A9090F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF -%310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 -%0F080F080F080F080F080F080F080F080F080F0885FD1DFF85080F087FFD -%04FFA90F080F080F080F080F080F080F080F0831A9FD04FF5B080F080F08 -%0F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F0831 -%0F0F08310F0F08310F0F08310F0F85FD1EFF7F080F7FFD05FF08310F0F08 -%310F0F08310F0F08310F0F31FD05FF370F08310F0F08310F0F08310F0F08 -%310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F -%080F080F0885FD1FFF5B0885FD04FFA90F080F080F080F080F080F080F08 -%0F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F080F08 -%0F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD20FF -%315BFD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F -%080F080F080F080F080F080F080F0885FD20FFA985FD04FFA80F080F080F -%080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F -%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 -%310F0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF31 -%0F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F -%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 -%0F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F -%08310F0F7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF31 -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F -%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 -%0F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F -%080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F -%0F08310F0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF37 -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F -%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 -%0F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F08 -%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 -%0F0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F -%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F08 -%0F080F080F080F080F080F080F080F080F0885FD26FFA80F080F080F080F -%080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F080F -%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F -%0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F -%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 -%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 -%0F0F7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 -%0F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F -%080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08 -%310F0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F -%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 -%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 -%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F -%080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F -%08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F08 -%0F080F080F080F080F080F080F080F0885FD26FFA80F080F080F080F080F -%080F080F080F0831FD05FF37080F080F080F080F080F080F080F080F080F -%080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08 -%0F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F -%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 -%0F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F -%7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F -%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 -%0F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F -%080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F -%0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F -%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 -%0F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F08 -%0F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F -%85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F0831 -%0F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F08 -%0F080F080F080F080F080F080F0885FD26FFA80F080F080F080F080F080F -%080F080F0831FD05FF37080F080F080F080F080F080F080F080F080F080F -%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85 -%FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08310F -%0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F -%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 -%0F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F08 -%0F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD -%26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F -%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 -%0F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F080F -%080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85 -%FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08310F0F08 -%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F -%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 -%0F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F08 -%0F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD -%27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F -%08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F08 -%0F080F080F080F080F080F0885FD26FFA80F080F080F080F080F080F080F -%080F0831FD05FF37080F080F080F080F080F080F080F080F080F080F080F -%080F080F30FF -%%EndData - -endstream endobj 48 0 obj <>stream -%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%d_²Ý#)ɬ`1¦ó(ÉÌ"‡|™}˜}±ÕïS…fîy›3] ²2Cà 0\ -=>UüÍÿñ«ß|yýÕëßÞ}®†Ý“/þæoo{ýæÇ;’w?}ñâÛ·ïހôƒ_ÿp7ÎWžºþiyjOþÓݛ·÷¯_ý˜¿» -øí-ÞÿÁá÷oîß¾»öjw{÷Rúáî?Äoÿáþ݋;ùýýóׯžþöÅ·wWÏîèMKUÇgïä÷ó¦éGÓ0.»øã0ï~õs>òìÕž½}{ÿç;´ -›Û¿þöÕW÷¯¾Þ¿þŸ?Þ¥y÷e,yñ)â÷ÿë»·=tUÒÂ'¯ŸûòîÕ»_½yýüîíÛÃë¯ß¼ýñîð'éÄϟ}-¿y&]ÿ4=½½q'Ý|ùìÝnœ8&×?§§ûoï_|õ‹o_þöNF`^FÒÃSVôo¥© ÿ&=?ýéK!ýæîÝ;ù0igè¿á ãþúeý„üüõ×ož½½¹ÛˈíþíùïJø»)¤û!Çî×?Ùw/HUWÔcåaJq‘¿—iLóòޚþÏ]÷R÷ô/ß<{õ5žŸRÂCk¹.išåÿú+™¨;¡7ÿ~÷ê¿ÿ°ŽÄ›×߀„Þî¾Lã´Ãÿûí?ܽüæ…Ì>'iJóU’éá_ýõa™>øe¯J^–Ý—s®æyJc¼eñìÆ´\-ÅÞhÓ{÷‡û»?þx÷‹×¯îlB¯ß¼û.«‡Aÿk¿úõ·/îÞüã«ûwòÑ3i‹ÎèÏ_u÷BÞhUܾxƉdÛí‰xöæë»w²_¿øö7MñVdÕüìٟî0Ù£5òËoî^ýÃëâ§~9NsØå1Èä$éÖTvKŠ»±°‘$팳·;¶ÿZí¨ -Õ&2¦îW²ú~ùæþëûW?®ß˜ŸþäÍýWmIæiWô?ìÇUéþ¿ÔÿÛçJçß½»{U¿_¶ÃáçÝâ®~þK´zóê«Ã뗘‡·Ü½wÒ¾¬ ¯¿¶ß¶ø;©âÛo¬$<•iû՛ûW¨øÉ¿Ðߕ§¿zñ­üò'o^ûÍO_ýîõ“/~ ,ìŸîž ›’¹ýj÷ËßþùAÑ/ž=ÿý×w¾»þûWwïîÞîö²o…îÏ -Oúæ‡ï©Xúûæn§¿•wù£üý;üý˜÷w¿Ò*Pêßÿ[Èñŋ»W_þ?ß¾}öîÏ/_õí ùíÍ«?ܽxýÍÝîÙ«¯vÿüìÍ7iâW/ž½zöfÇ_Ôúzw?}õîîͳwÿ‡ÝËgÒ¨<ô³û?ȋÏd|Ղ,§odÔøŸY·öÐݯÕÔ³w¿¦u÷ê«·^ûõ«¯_`¿Þ´1vDŸLõ¿ùÓËß¾~qÿö¥WÞSüߏüRÖW¿|¥ŸüæÛ·¿ßýÃë×/¼æŸ ¯¾{óÍý«·w/6_-\Dßû«jÈ>×6ÏÿMž½xq/çÙ7¿¿~®•ÿf¿ÿÝýÝÙÆ.¼ÿ¨ÕõœSu®Õß|s÷çûg/ζxúÚ_]c¶w7_Ý ï¼À|æ7|öîùïw?»ÿí›goîïÞ³[1Ù¿»õ•|èo¾½w獠38W¾¾{{÷îÏï„A {›‘n»Zõé©7ýqòå—4rÆî_õüäͳ¯îå( í'¯_|%-U·˱™wû¯ž|ñ¯O¾ºÿõq÷7O÷"þ!oÿŒ›2u%X‰Vÿ_ˌÿKóªd/eXVåº+{)+Ç®Ü ·Rãm-«OëÿL] ]‰«’´Èàï<ÎR2ÿ.]YVåzÜ{9xُG)õ§£ÔxoH;Ž·}量ŸWÿ„®Ä®¤iFyò…þ=宔i‘¢ÿ½îÊ^˓/þïósziVÃj^c7»mŽ¥Hužc7Û:»ý,)ø³[Vó¼t3-ÿ•uÎë¬ï}¾õoÌöM?ëò_ý3œóIf Ÿñ ó‹¿1Ø뙥p¶óf¦¯­¬çsŠ¿oXŽ›Ù¬ÍÎe›;«:s‹Í™Ì“Ì©Îæì`åÈrcå¥n3tg3§#g+ÚøŽëž{æ–#4qföqaŽüêѾræê¹ÆZaÛhk -!Ä0‡,ªíöRŽáV¦}Œ!ƘbŽ%.ñ:îã1ÞÄ[Î)…$jlÊiI×iŸé&É>•OeÉÆ9Íó\æe¾ž÷óa>η²(FŒ˜Sž³¨MyŸù˜oeÁŒe*±¤2—\–r]öåXnÊ­,™Ó%,q‘Š–²,Ë~9,7Ë­,Ÿñ:\Çët=_—ëåúúz/åp}¼¾á’š¤ qŸöy_ö‹üj¿?ìoö·²Ìd49èáé ŸpXׇýáp8neٍœŒxLÇù(Ÿw,Çå¸?Ž7ÇۛA¦'Üěù&ߔ›åF»9ÜÈ*¹¹¹¹ÅÒ¸•A»M·ÒÙ[ùüÛk)Òè­¼z»ùÃ98­N»éʱ+‡®ìWåº+K-Rã"Í·’»2¯JêJìJ芬F©qòÒs¶Æ•‡þãoú?ÇU9h‘!Ãßû®\weY•Ò•Ü•¹+ÂÐo’—¸*¡+SWÆ® }Ñaò…M@߁þÏ¡+{-u«®æs=‹ë¹«³¶ž©õìȌH±Ÿ‘n&Öã¿uíÍsTe¼–͘ÚH®Æp=n›ÑZŒ×z\tL®­,,ÅJ¶2³$+‘%X‘uÇÍhgªž -¾jç´±úgÏrmea)Vd³ËæχÙJ²Y‚åÉõ ¾ÚÍé çqÏy+œ§ÄyÁ\ ý#Gûšc›9š‘£7r´n8:{ŽF‘Þeö=F/öêÈ^\ó»3¿2ò«ä[dÙÜȐ„] [+ÂÞfarQ˜Ý$|^¾T–ԍ öA˜áµ°År…A&a”AΛQÎà[™ú£ Ê~¹vZ–,Œ5 ƒ rBrbßʂ8Ê`í… /E¾QXò,¬9– Lz”³ýV–ÊQ†rŸ¯…‰—œ…'aëA˜û(²À­,¢£ ï^Xÿ"G@–ƒ ɁäXgùFYÒ72Ù94®åð(r„Ì)ÉaäPE¾¸•…w”)Ùˁ³ÈÁ“ã,GP”£h’i-p#Ë㠇ԵVòrlÍ!Éä E¢¹•Åz”iÄ1‹ƒGq’£G5ÌsÊ~;؞ijõI>+L~ˆ{ -*PˆˆQ×ƅVYë¨5´÷! L+~q۝Ê)YcIÖ×(këÜʚºc„§þèI5rÃâ´JÜÖõIJ3 '–J"0ÔOÀÙèçâ,K¯œ9ƒŸŒ8¯Ñf}ßeŒ`l®r¥ŒÊ£IÉeëíT`X ã ·^³üLYðX)ØPºúsÔàú„ƒáótMÑæ&œ¬Š˜£‹O*0ª¥‚áâý42šè®Ý¬¢x½©²°¶ZW«‰õp ôý³ƒäßßO¦NäJð Ðd…dY){®™ ÑO²#¤2«ž]µeÕXVϴȶ|ôÏ0³5+{#óéØlåϲ‘÷._×Ò4¦²Ò¥²éWZÒJ3½Lj Æ ôÊü+•x­íÕÓÊuA×&XdWZäzÕ<ð÷²)eSšÆªÿšM—íK<)á¤LgŠý‘û?'ª#vg/ûùßdzEX‹¬Âƒ—½—ë e¹XJÕ0¥Æ¼)ó#KÓ^S_¤ÆÕÏnáhÿ>-áBáҐ§G–sƒ|¦H{òÑÎÚ ->éÏ竱;^GX•~«´¢r[µ…TÛH1Ý»ÚNlßË®V=½îöji[a»·«ì[÷r¿{÷¶««átïf·:ÌV’Û$š]*ô»Õ­ìSù—ÛBšml³7ëî<òhª6–Þƶ?»7÷+ËÜéî¬6œín-++_³ -UËйýê?¯l‡é¤Ä•µñò®\[®¶6Ësûö¡Ý¼Ù«ÜÕ~÷á;úÁ]ýW°?„Þ^½:U°Tj9U°ª¬2Pa¿¡D²˜‚9›L2¹zuÛI%y%•LŠu%‹*֓/Dɂš¥JÔ¬*–*YZTÑ*®hS´ jDÍÚSÑ*´aÉj¤²5r£ÜRÿ>¢ © ˆª¥ÊÔ­IÕ-*\GS¸öT¸ -.¨\`e²vLíº¥. ÅKU/(_…ÊÔ¯Hõk䶺¥ -v  -% jX–fñ¨hZ¢¢*c¢ŽÑtC…ì( -T2(ePË ˜å˜¨šA9 d]´[Óá÷Z„ƒ/”ï áeJy3^ø3RÀjœb°NH“ãTv+TÏP"9xÏ»;®ÝIa՞«÷<¹—¡(/ ¿'²‘sÖ/]I6+®¹â‘²cz™eÃíÎò¹ä‹3òÄã¸ÆEnò™wµ«¢Zz YÿgmìLk;\=s©rŒ¦Ò¶VemóK›2¯Š+Kb^Ù u¬u¹Þ”ý¶˜E³/Ǔrúçö´ÔÕ& ²?ÉÇ3e:[ÂÙR­ˆ§%](óÅâöd©1oJy°,ï)"R¬¬ÚçËþ‘…_j<<²W¤ÆS깩|t‘/ýî#ÿœ9^?º&7 ®µNæDÑ­¨=µÚW³•j]¬˜uVjTkmýSYEÛBuZ*¿­ºu•ú«¥XíƲ¾ižÒ2{©¶æâe±ríe†ga^:áXçxUó#œçN_Zù)V<é7ºÄ…zγ§=è2ïy€ç¬xŒñÚÒ.ó˜3œå}Ej|<‚ƒl8½\Î5>šSt»ÿ"Ÿx$W8åìê‡Ë_pWÙve¸Áî ¶T:Š!‹…({P¹sï…1¨Óx0·1lj®ã"‚guá@–CGȁ"+œÈrÆP­®d8“oèNV‡r€J§2þÀ±|MQÎel&u0ÃÅ ù“næ'_ÐÕ\ •Óݼött§ó R"$N8ž£| déL~qþšN胰sEײcDèŸ(üÃ) ·ô|©,{šj)X˜GÚ*ÕpWCvÏtZQ=º®Õy} sÂF¿¥{p.\ùo引ã6NkÀEÞË5{úü®®æp@¿:hö¸›ä_ó® WQöÎ. ×'<ü›'_üÍÓÇ<»{¦Î«$O¦aWÆ+ÑçËndmW㜗ìÿÅxª€ïTÊå9Mök#ÀZËt†[sŸ\“~Ï JmšÉ Û~Ƌ¢™‹êÎʖ˜†…@ôqòIãZeájNÓ}ÖgªÐ¾n„Ï¢²4)óÅ"üY+ݲh“ðYT&ӗ–Uei–þë>O…Ÿ0—S¾*!,¨ª¤¼|ê„n«;·fíã—åJøüÅ»~ -õì ¿Y!˜`™ÿòåÝ €2í_Rq¬Ìÿâ¬óÖæd¬2™›/c¼6Vxì}¶Æ梡f(bzœ  OyÈQµçávKó‡j3³kd7äpÀSáàÒC뚶­ã4¡"«gDm»j#Æi2öR]ž;IÇ©#ÐÒÅs.£Q{Ëmêì4Ž)"˜G%lÍcÙÐ ŠO0„ d7†Q8$w{>Œ½èÂ]l—~²æ†ïñÍÐÓ»sÇG?­—ê’?úÄA>3¤²R!|”ÅÀW(Aî‚Ô•dD id ”®’õŽÙ½É:ʆjh¸†2Œgƒ»4©9,›Ù+š}lFáGcS…KqOz3«‹zR<‘ሎŽº6ÄP5'C)"hàqsâtÝTK¢zƒKωôL):S’.4^SžÞS–Ù£àtKɺÉÖ -ÅÄ<ª|­v“±)e8Sᙐ³!i‹ÄKi»PÚ®òöq%so¤n“¹±*„“rw•¼e—­eo¬’Å`ŠŽ7îœ(yWˆg/y(yß@䒹WÉ;t’w6©{O©ûH©[áŸMގ¼ YÛ¥m‘ʏ”¸«¼}*q'“¸)s»¼½§ÌM‰Û™•AÞ šÜéN;ý÷ÿ{M5C2qfV6—ÝMsÞÕõ;º¾«‘ºÂŸG7[‡Á·¿ÃêïhŒºB¥“ƒãÕ$.Œq<¾‚ä³ýWéú_u{¶ÿ^¯LïGƒQWùBÅ%ó&n— €:)®T,ØG¡ÁFgקpÐÝÌÁf âÚÍÆ[svSóÈÜA™­t@f©q f>®À̗×g1Ãú¼^¥²²¹‡1¾foͶ¢Óö¾zuý.< -¹ŠeeëJžyT¶õ f§\^]Ÿumßؐ:¹®s)²²uµg[ñ3µÊ1ʓÉÛõ QGªî€îîÇœsfmöå¼Ël:1{Ÿ8œ tXƒîO‚dž„>l@ùç Nƒ ¬/5ž …Èç¼q^ˆDӞŠØE—öЈà³;iß¹[Ú^ê÷S·«N YW‹¥ö‘9Cî‡Ö/Ü£@ýFaa‰¶„K1WÒNä•/OwÖ®ÏU¡>ÊXª­e\ÇB×(èý\ãž[Ìsý’¦¨™Ö©YªT­£š[”xU…šÚÓâ—]¡é˜£¡¼ÖñÊM-9RnjýF¥ïUyÃZ¬Uùó†¦5~£Â›oø»µ¿VäתüZ™/fåÎ~Ê,¹JßÔúªØOžñdèÔûÛNÉ¿q]Îí…WÔÆ۟ÅKñҎµvH'/±©1t¥Åô«Òã®×Ѝ^ƒæ¤ -‡l á°*û“r½)çþˆ@».gví.”¤Æt¡Ä.<ژFã3”Š…8ž!¤²×A¤§ñëPÒuT|oÞYYÝóÊCÛ|´Ç•éuexUo­ûk«ÇöÚç9Û<é¸N›@Žƒ{'—M8GhÆW3¿ÞdY‹d{n…ż–™blõ`«)¶ù°×^ìæ‘)Ëʱ`õfO«€2°uØÇB©%»É6™,ï "ӏ4Ä×@ 9˜1w¢!!*1ÕÀ Q-„Î&‘£jÈ­é+ÊP•ííi¾6#p éGfSè«÷öÕ-áB?7×ó­™kNÒ7<¥â<ÜYƺÍÄ:ŸÓw“'æ3e‰¹ÎѲÄ|çÙm¾ÿêõW¯œ!æ4 —ñ”ÕËý>Óä~¥v­3ÿ8Ï8?C]࢚™¤VùŠøɼvÎs[¡#¥ô–ßN†4Ä~?OY¸¯Á…Á" ͪ7²Õ¬S¸cþ¦9ìdþ6‘Ofš%]Öº -«A-g]¶ÐT`ӓ/Ú´†5¨iLÌ$³&è 37 L8Õ<£ §É”Ÿh†š^0› -U•ª¦§Ô?¦ŒQ-«JZUÚÖÎÆ/³JÐÒ^®‹,€é¤„³%^(i]Lme~Tɗ }×çKù¸bÑà+g´ÉÓbAŸ±|_ã¥':©¢Êo³s•Ú&Jy•5s"-SFPãq“Î -²WiB)—Ì ôy2 ijA/-ÐÉ— léáM¢ÂU e oZ79Àò$¼IA–³‡… ÚwANƙ,Ôi *|Z<%zª¥š5ôÔh¬¦o3¢TÓJ3»´(šf¦·…ˆ§V™/”tRÈ¥Æùb9ã_¹PšÑªvåCʉi]¤Æ÷<ñ¡åÑ5>úÔø™ÿüïQã:ɍÅB$j!×êœòÄo³é5û.ø‰ézÂQÔ2Ô¥¹w¡åÝ:h?­ò©Â·{7ÓyŽRyJ…mŸ ™<ËU*_ÉL ©ÜåzÅYÔ¿å-¿LfÑi\&™éSNëŽÓÔ?m¹®ùÌ -<´…IUŽ£rԊë\â>Ӆ²á@côeŽô>þäEj|à·QæzU¾¯ñ/UãÆE=úσ5®AèáÄΒWÖ!³ 1'g0i©KlÙGyѤv•*7U‡ûlV-ÂUTrbØx Qº¦MëÖå§Hãtï\¿¥ü,`)“‰@! CaO¾ ;]A`-0µ«¿ †@Gz2؎úäàÇUÞ܉ž”7 GÑ?‹›ƒ§w0Gº–ºçëœVVÝb Im‹ {o;ͪלzmh­¿l¥ÛîaяgÊiÎõL–Éò¥?®ÄÇÃ)¿¿Ì-R㣟ýÏTcg&;ž¤ÞËòÍ7I¶ ré-oÚÌ|i3¥íiòšiî-3Ú^֛:×`䂉 æ-¸ÓàJS7šÆ-™ýL£RÍzFW™§—.¹†ð‰DQã“Zz›\ÚÓK·h„'_˜›«º¸ª{+XTÂèN­c›pÝå6kn,º°„GM«gk×Uu\5§UsYõ«ÐœU–Ùr<“Ùrë¦Ú:©.¸§ž|±qP]rO­œS9¦¤Æ Ž©sN©G¸¡4ì±åð˜b÷t¼¿\2hæóü¬å¿ç(ßs”ï9Ê÷åóÕø=Gùž£|ÏQ¾ç(Ÿ¯Æ•›ýÁË?þ—ôÞç)–q¡3=.™PIV!(9'uƏÂ÷ÎüƒÿœÏ9ò?kµÕ§p°1ìÒx5·[yö7¿ò7¤YùÍ<^!ÑÄ.Ä«yìÒm=ðȦ†,§iÞM¸Þ{ÉçjØ>ÒjÈù¡§:aº€G˜€GÁ3¾ÝlØÇ ûb©§Ýõñ¤>¬xM[À5þ<äù9ñRyÌ|ƒÆ ?:0þô -¯roÔY0û[ -s‡‘ëïùìïøܔ¿Úšú”MOÌØìk¶B|vÖ³¶šqævãºb7<‘߸d—ùíN]Šš–f©t –ºôJŸå™5 sQ&•Cµð¶†È|w%Ž¹í†—a:ó P¦ÏW§ÅF§aYdZ/<û€˜ã ÏjHÖ ¸TÐ}ÐÇU`­–Þ|þñùtÖyžqN›½1ç™û²2k°M^ŒK°é#À¢ù,zæº뚐Á+`lá|oÎChWý²k Ž†¿þèè{ÁŒàÇ5 â;Ü`+҂…m¼§…e®Ûh¡!§¼§tÀÄ5Ùþæ/m g÷CØîÖM›¼¿}2=Xn<×oËô›ºëù4+àž),³oÙòùΞÇ÷Úâ}]Óɦ1ÝÏD%4di¡ËmoñÚ75hð¥ÐEbà 'ÂĬñÖð? ªúÆ"¨ƒ)Ýq}|kŸWP÷ç;Úf<êsMD ÄÔ¼G}æ£.Dz Áñ›UjN©8Ÿb|aO>b|fåh²Íöø˜×õ4“‡é?Â8æ€ÐW…¿Íeîó¦ö ~È[Ÿ¼ ËùmX¶)X={`ÍØgì®ðYÛêr8É^!½ ºâ°^çÆÁÀCˆio×÷åO}g•Ÿó`.ïÀ=¶7'w°½äí\¸CõB²­¿à;½ÐŒ¡é#R·é¥Î%˜Ï$˜²äRT€šÊS£K1Ÿ5–Ô¿ÕS„ÊâH+¶t¹²«jlg œZd ·ÝÚIg[›Hyå-6V(m¯#'[Yƒ³DŸ/šG'a%7¼Øjá…Va?Êx™¯v–/™¤]\XµÐ¤Aaü Â.aò\dµ%YuÈʁ˦ö²³ðþ ›ø–‘…×¼D -«Ãï0=/Á=êzØ÷ÝØ Ûûâ궻½ÖeNõû -<´ Ü.qÀ5dÈcYÖÙTG“dZ@ïïAú‹w®V`å3w1<Àk·Ü–iáZE@q>„böþæT×a]ÎڴʶѾñWßòõ™Ö¹èa‹  Ø€ˆ§á¨Ùò:§DµÉðLðԅó#œ FÉÌ•…:{Ø醧H8 L,‚’B!ôÇ¿®¿ïûÓnûÖ ‚ ‰ýè+‚ëíÛßÝ'~ÝJe?L´<ŒÃBËÃ< ¢ä•ì™ˆ¦ âNÿђèû+#>s½&²Æab‚²4#üÉ(ÊSÍjÙ ¸J`:ó¯sž®Qçûoý¬õš±èӌÿµÎñ -Çõçs*lêµqûÝfþ¥q §h˜‹öŸWHœùÇy5á3Õø©*D<«AÄ­?€É°Œ©Ø- ·¼a¡²Nܯpki–ÀÀ5=¹§7v|3à€DÓuK=¾º Úuý…~µO±OwQšìmÑ6WW¤m.G[_ŒÖÃêח¢u×£­²{>|±ãã -îmýÀ;¶ÞWþjtá¦Ç^GšÁ(S …D«h¸÷eÉÿ2ӕì ×Xy=ê!Z:2Oû-_5Ýx„Übz¢Ñ&zÊ<â¦åЩÍk5XB²‰&jv½biìZhXƒ%wŽ mº¹íöLev¾¤³%҂s®Ì[x Øg-^£¯‘–]¯f¬—dèM±5•e¶ÿ/½¦Q‡):x -ö‰›>azÿ_üÝ'¡ºtô}lÀãb>êÏ÷5>öv¯Í Ûó j®uƅίqÞóúfȅeBH„! F^Ë<ðBfȁ½¨ÐžKR`'º$x4xʵÝúP¯P®w¾†ÔëéëmíŒþ²äþ*ùådù{*PÞ&pþrä÷^Ô~þ’ä‹—­ô¥ë5ËD/7ÐËÍm>=$®Xn -ÍLáY)¾­Èl\ÍøîÖ­•á}ß彪†÷šûª7½e Ø4ð`¸q#üѲ™îÍí9±ªY¾˜q¾þéR¾òƧ¾Ä“.”é|áí6çÊø±…×´Öòá5:У¹+z‡EuYŒ'ð -þ(ž ±Ï„!sZeAl×<&ÿá:"s»yˆPð҇­s›¥³½Þð†­K嬤ûžrpÈg+ 5nmˆÿñ‚ôwRãƒ*‰Ôxþ7ç/ 9½è ¿ð€êØ§W‡Ì'™E×ÙEǓ]U÷Ԟ·g_›Ë°ø…5ч-;ÑùüDãæЫ9pún ­Þ€ Çý­|øž~ž>?sþãéOªñ¼b/¨"¦¨Ð~½.'JÎ&×v”kj“«RÂÏkŽðz²iŽq=yT,ÒÔØï©ÀeËþ)NȀ¸5ŒòáÁ2=f—3¯£es„íPÁä°Ân80~•S%Eµª”¸g^D•)šDIòä=Hy×TP ¯¹ïí?^BúO_ãZµ³°oF¶;ɂã›úÿ6%²bŸ‚ßѵVSª³UQ-E5¯T\+Šó‰ãsòç/Tãà -Å¥ûK­P[?½öm{m[¯¹zt2˜T§¤ÆŬýÛê—v×N®]}QüþÖ½eO¬îÌÞ¡ùKó4‡eË`©×O,î®Zgd;0GÒDK.ràu¤~Çí¸ ýI5^P9.ST˜Í`]N•œµÔ)Hç. ý +{ËÓ®•¸éòÁ ž桬0—ܸ½w^]ìyè.õœèøL×z™çµe®«ÖòÉl兎Ç-ä#]I>q‡ÂüÇ ÒßIª$py|H懯¾ºÍÞU©št~£põªXSÐjֆ¦ÆÍæ¯Èír©qñ ꇕcíŨ—<4(ãl> óRˆhmÆ“û´£âãWwinŽgÐtY`oÂÍp…‘Ã᪖‚”ÌÔËn<Úåx5¦Ü;?­uª¥aZ1Æiæ=[ÂLǤy瓫²»Í>¨W%ï¦x•×_òÑU|ª#/uä¥-"÷,Fg{¤=:1pŒ'h-^gìnhF2¯uÚãzkl½áªþ·Ýtº¾+¶Édaûsw¿ëö–×­8 M¤³õ-߶úá UÓ;7Yqe:×·¥·,ü-Äíï¹í®Y<½ dé.H\ßý6ù’‹7‚4þº³}©œº ‰—Sɹ^–7²»&†cˆ´ôøÖmÒÞÛîדýB¸¬’8e{µÔ`E¼à¸ñò'ïÄóàøô=:Bá÷èøïÑñtü¼œÝ‡B>µ5>"jëòu¦0~~ÐúŒzä"|DønY·;«ŽvKs½·ªÝ\Uü檹»G«]4Ì[ºÎœÌ~×ëó£^·Ë9NnîX/ÅK|êªËç±|"‰¹AeZÝçy_÷À5+äõÅø½&ÍçÖu×B5¤u„àq­Î²‰ Ü^Qqò͗£//ìËüuµ¼äُåÚošÇºŠáÜУœjThdAC;e˜—ÅÖ¿qgßÛ Š·»è“+ûN¢ -ÿùîþÿûÿn÷›ç¿ÿã³7ƶÙPþR—Òœšô>òZš'_œ¤-®IÐkÒâ>añÑïÄ\'@¯‰Š˜ÝX’â©Cê¯# ._ÂÐ_Á°ï¢>%BâÐ]«À J²#aÅó†zrÏ­!hcÆù®¯ü91ÿ~ô¥?LTtyÍÔįÉnVÕUÓÒ]W»¥¼†l½0H¢J×7v“ï#ÒèoÒ]›QóAƒæãâRÎ\îñ±‘)ëÄÝåÛÔ Çói&µ&>æB¥ás]©Ô_å+báDf¿"ú»vëz蒠?¸&ޗ}ÝÌÝô$J4Ðvu»¸¥ŽêÖJ·b좂óÉþWiE>ŸD^åò¿`çœjçn‚ÏkŽ'5žr¼3šËÙTÖëDցõä‹OŒÁÊ…Õb°d•}t–¹Böjõ ½#åT—²N"ss>Ìwv§ÖÇXÏުŴُ¶:~±¢kŠ¿cKò'ã­Æ&úó4ÇG%ú[§ù³Ø-‘y>)zK£§ µËè-Ye¿EÄ.P³!uÑÅÞºÝ$ûÉçS}¿&¾_߯‰ï×ăkbì2fæÿúð—¿Só–Pžþâõ«_½¹õîþÕ×_~Ù«îýož|ñ‹oø» ¿ûÕ³wïîÞ¼­þúş޾}mÞþµ[–«ež¸ã<‡ÝãÕ ³³›ÆùJ׬_|­ýËñ÷·úCu þ˟ôçÿ*ÿþBý£ Åîç»ýïÃî«'|ë×x ¶T+Þ½õ¤½ÝÏVäú]?ë«8K\Wð -ÿùÑõ›wÇûçïî_¿zöæO»«QäGûׯ_ÈXüÔÆåéÍW÷ï^¿yºöüßeôžþÃý‹»§¿¾{þ¿ÃÿþãýþÛoµ–£vú—ºV&\{©ÆÐqJ\5QVK±,‘vip©÷^Æ¥ aÙýË3­k=’a¯†0»T®‚( 6PÒÏI*Ú¥åj™l'¬á -µ¥Œ+Šãn*ò¸0ƒ]JW£ìÀÝs¾Vҕlò°KÓՌ[Ñ"®â4—]\®DÀ¥ÉóÕäù®dGNõ½åjÈaÚùmfõ™ÍMå*Mp;”á*-x?_‚õµ¯DŸÙM3BŸ¥µYZ¡t&ý(‚p®]nˆ„l¯ u g'Ó^FY…s¾‘u`A®èT2¹ia -¥vn¤Ö)îâ|…+ªv“ θÈʈã•t ßaO„tý­ñJ¤ÝÑ¿|šÓ•ðɤIóœnž¯âX–ݘdfç¹¾7_-vh¿ÅGż¤ÔW"nƒNAæ‚ÑÀü=éFîËñJøF,”«Aô½]”¡f)ù’yV@®“ì=ú3fëLÖ³àÃeæcâÏ1ã»1óK¹€ Â|w¨EtѲ“F1¢Sˆ:o1] [«óÆ+ùAÖÜ,ã;Jßä}QWæÝe“|tœdf—e7Kc˜b}OVß8Í»<#0¾p(…[/xMÎ0!È^ ¢ídð²ðô¶º&ì © ±Õ»0H—Y%ʄ/;ì.fYœr>ØÌɇ]̓Œ„¬ExÅdU¡9i¦ÈëI†*ÈÂãêΓ.@}OfZ4þÌ(÷ýù39†¯¿ùÓÓ׿ã™ò“7¯¿ýÆ‘ó¯üúgïî¾z*lO›e÷ƒîþåŸ/<²RÒ<V%ÒÉB·í L-ðÄ6•§ÔŸ8Yï«·'–+á[26ØGÑÖr£"=<¾²jB a'|n.…Gá¾|¹–EnÔ…áL‹.X}O¶©V”´z',ö„¾W©ã°Ø‹ö ”q6ŠpF9Ü;Š¾ÁãVʂÖ‡¢ß攥¨\ oVªp nïu?\v'cs díÉ°dáU“Œ¯0—kªH.`i£0Ì(btei#Î$™ûÑú<Ùs{C„}y%N°¶Úˆ“:ÊÄ´Uët{cC·«ÛùSõ›½žM׶[b³Cn øÞ G ½Wr®³¥Ô˜¶(|@þ±D9ãm NrÖÊð -Íp 'c§ØÛ³€Ëá*ìjˆH+ŒK ü ǒEøâa¬ìt.Ž‘§ -˜Ú(|^”ŸÝå .r@ÊV_DØ-r^ˆøaïá°2‹09#v<Gù˜E„%Ñ]„ ¼B–'œe™êé%TÑ®ôÔ)҇ B‘œnXAç‹ ¨°–!ÄúžPã$­Ë! ,Ûí"ãÔ-qÁ{›Q9=†°iiBÚNƒ´ðrMEÇq|K‡SäbÃ2š„âÊòúóslÑÛC"›è*©kË^«T™m†×“1Èqn­U‚½§ŸÔžªßìõlº¶]|ãîú›ÏÀüFH "¬g -F6‚šdÆd¦e©^…‡CÁ’§88ÁxXRù¤=&ƒ9C"òz*Áš³÷*5_AßßµŠDîN²Z{F°÷ì«ü©úÙ^ϦwÝ šÞ¦ƒøöð( 'å‰Ü -ò°$Ìý,³$¢Ú(<_Ža~á˜'laáBYv©ìé›ÅV‡,ºX’É—•/ôՄM&[bd³Œîo’+AšÃ0·§d+‘¿‡P#ˆÔFñgÆ<ŒOÉö£½'UÉ8>„5û90BÉAD~2"ÖO¹8ê B0n”ItôW,¢5Ì/<¡ÌØ.|5;T¿ˆpÚ(úªœÈ"²—îAù̜bäI…¨£ˆö±Œ©¾ZÉd-A$40v9ÉTÉî]1Wõƒe®i9RgH2ÉW!âX’Å9Èq"³ †csÌÝ0MƒÌÕÄMÍ6,oä™flvYy/KwÎrŒ4!πÁ adLCŽÐµä8ϲÕÀ£Ë0Öý$?ÅY>Q”â š…|ªŒ¤ðÔÝ2èlëé±]„+vDS¹JE 1Sº4ƒ»eådî£ðs¤Êi_+±`jڃ“ ÂjeÇUüh†,ŒáPDŒ¬†,iÿ -~Šµ!k”¦¹Ñª!k”Õ›×®ðc.â•!k„fœ·cᨊt¬Ú±F‘Á¹¨Wv,j”Œ«KZ–#\vTµclµÓcŽAMc\Û±œZmPX‹ÉLTãÄ“+3εi.í™fSØúj%•°2.5ªÙ ¼žj¥ª­lYþEí©Ú“Z϶kkv.RT\Û²ÕLPà›aIn£!jËڔž‹ˆªî±AnõTBoZjT³@µŠÌFÕÚëMYþUþTýl¯gÓ»ÿ¥,YŸ`D0ˆ¡Cä3ÕUbdÙê3Žwqȁx­F5ƒS¥TÙPQ¢´ 6³ pÈÀ í)˜µœ< ¬Ì曀I) Ò\u0ˆÆÂm*¦|ø8;ÁüöÕh£ÁàŸ…­—b^JX´àæ£b› 3¾SŽ>aIªqP}xbÔF¥X‹¨/àðþ !vå”{JÔS#DÔâŠC¤(35²0OÑ'¢Z—éؘÀ_³ÚÇEZ˜ÅÆ>ȦíÁ nŒ®*ý¹¶è†ôEuŠADÛ]«Ê§ÐÛ«{±~˜?ØúT+;éåw(#¹â²øqãõƒÚC_Ý~x.LÀ‚W¿ܔfwà™ãOÎv‘!ñfõüòƨ¾@Û8DW¨Ž§êû£؆:ÿp¼Èá<6ïÔ‘¦|©ûʳœíSóÿ÷ñã܈³«³©U Î89; H²Daõƒ¬{ŸKóñAÅI277 0Ciž[²>CM¬Z‚ïTï†û©ƒA蜁°1÷á˜7rkŠSç„.Ê@»?p¤ÀRÉüTÝ¡Ô¸?’«œ[S猖*64 yÚ¯êqæʤ5§ -itg"½‚è¾ú}ª[Êÿ2a¹WÇ †qˆÎ«gÚ҂~V× (øÂDŒqß ðV‘–ê¹Uƒ]8elÞA¾™@©îAvÛ2ªîAÔW²TáþAXH©ï¸‡PN@ðªÉ]„Ó%S¾É}„ØåHïŸ9 a„à2]{ az¢ˆênBh¬Q}wºM/; -ñ·ÙË ¹È1ÀBuÎÁZÂ>¹Ï)kwa÷ ½]Uö³µØ» ÁD¢]šÏº1­ËޞSÖ^ÃîAÿx¯lÛË3ŽC™kù‚1m<‡0òpºnåÎcsåUÂÚuØ3Ÿ`W“S¬Éµó3 `·º ÛŒSפÖÞÃö˜¼×´íå©K˜žùí¬‘uãܤ²ˆß‹Ö‰#w0ŸÔY¨È4{“"œ‘×`µÆ±N3Ô áùæá!jÆ´²J1,¨ó±=ß Õp›„ó;C³¿šJ}UN-¶*¯&"˜h!4œtõTŸ -ÐÐ`™KCwpwäQ%ÔÃ8ìÀˈmàøÀªÓsŠ*½íAaLºc««Q†Ž 5²t„Â\«, -«˜ÆصZ)Ïë¤òëÚsµ^×IOß#}5¼K\k5ìÉ:ÝÕI ¿Âa×®^êQ„'$6njÚ¬ùju@ƒ¯è²sJHý"sr¬‹¬zª§ëú4OµS֞êö`õ@OÜ¡§„Ü­²FÆ´¦Þ73oH6]ëaºì®ž Jãbˆ—2ïink?c«Ù k§u{®ú£[]b®×<‹i"ðÊ dӞW­„µïº{Î;àum{ú¹¯Áфm”æéäªyº-²jžX&4á¬4O°Ñ&×<¡Ÿ‰Ì¹¸æ ۍn+ÕӍˆUõt[`Õ)aÏ0‚®TOè“C§ Â6YÏúóJï¬DW;a6‡©Ë•Iz'E+­¦³ñuþ _Õ:OôŒåjVãÈZëläª*ÒDûcU&ñ:ô×Z'íLÐoڃcå—^™SVZ`G6u±UVUÊÖêJ÷lŸ×ôžyeÛ¾^v†’i>&CÜÀ -õË ‰žÇXš³j$Ømħ¸}žvÖîAˆð#¶Êœb­:c1ò3…ÂX´29µ„ÍÍ]«•âÖ}s®úƒÞ¯lÛ×ïÐ7>aϓª‡v°j¢Œ,yPÆ@™c -4®Ot?äÅ»Ïr á(‹£UdµÐk;ÿ4*oqeâP—ª¼°üÃÒ®…ÂםV˜dGíݒ§+âTuœ`S€µD^Š9Vèw#W+–Ñk‰ŒOFPµàyn[3AGÝs¬}U•`Mڋ• Üjšôlm-NÝaÛ}™?ç_ïum»ù -’S¸@ƒÜ ’N>€pú8*’¡Ô‰ù"!] SuÁ`}•Æ^o¨ºÂ:¿àP_„R:S¾;q+­¶&átÇ"WìTŠ†ØUÝèdHx‡°pۃy©@ÉE›à -U Dz’!ó† N©*˜¬Pz"©ÉœC•SÍÏ']ч)›@a˜e%ig×ÀШß;×ï•h£e°®VŠóŒ¼"«±ÇŒ•Ò6¦•-½R¾Äï…" ]]lj€!Ñ©à[ÔP¼U®öF¸ó`Ú"ˆ&ê”膏 jŸ¤9ÕßTæ’Ç+š7‡IÃQ }ê’:µ*ÙM祩,òXŠfí§A‚ÕbÅÁö¦”°úÜh Hª§4ú"Ÿl±ž.ûSnƒå ܺD«ÝË YŽŸB³‹È1š=ðò-<>"{Y)¶9dÀ3k{PβÔWe?‡ÞNX‰ 7®»®¢`ºkíÅ^ôóýã½²m/;¯ ¬_úß°òy”½Ü5¡~CÏ i²œ'…ç9Å£¢’ºeóNiU™S¬UÕÈY%àVÜ»0´¶V+Å^­Ÿ×ô.xeÛ¾vã Ó³$œË¢N‹ùrMÆ;)w­še0¡°æB‡œ Ä/´ç"Ò †®.§ÔFíU'CT¢ë V@¤˜Ú¦ýlœ£~Z}ªuªVtÒÍ6°ùŠˆW8Õs¨âŽ!9+.Q„75/Q2‡Uv"k¨ãG°›ÀX_Ʉ®MóÜ*ë(Öª½êä ¢`Ùu•Á-RߪQž×¶Ïó½ VÙi_»qpIOŠÖý§ºöœ ›dxpÈažae”éon”çUzIižû ç(]eN©­º0ad3Œ´Ê„«2†Ë5‚9-êÇÕÇZ·jM'ýΌŽêÆaäÈ_ƒÝqžÍÌ;[Ñî8¦æGV…»ÃêŠ;*àª]RŽx6=eZ¼ ò>‰Ð@4Ï1ïP!K9æc¦ž× -zdz!¹É@ï4·Ä96Ô;e"FýUØ;˜nX¶°wô€,ǽÃ7qљãÊàáøº5ôÚPP%Hæ<Õ¯u<ºSžûøãdè4h{WW¥ÔF]¡2r¹¨¬Õ%mM™R`m´R\~L1ôÏy·jUÛ~^Vý? žî¹Éñ®¬¨“ -9Ç“µ´4dºSÌ"böîA¹·ªœ`MڛN–ƒ®«+›9º5š{³µœ?çŸïumûÙq;#„YË¢æV‰“Eî’Wj ˆºãh>Ͼ:Ŷ‰0œ8ÝƒÖòÒÕU µMgY¤Â¤0[« k+.}“•bâ`ý6пß+;éèwhûp¨56æ«È -s4VÖÐìžÈø,6ÊReZƒè~wðèÈHKž¦à4> =W‘ÿØÍ _)˸RŒLn ™Úc(wª^cA`²M@÷(¸úU©àL¥ÐF™a¾ðW,rÐ0•Ò¢Z"ÐÀ£œb’“E ´+øʘh”jÑp¡ËÈã1Ò5H`¢*Ì-H`£¹}o €kD s5HÍ{NEJI§ÆÔ àˆñ j/F“&€ê›ãa€NФcQ˜‡qK ÀYƒ|GU²²8h÷séâpšñ#NWï©%ºè1›#ÂN^nÈ¢ÒáRnGã³çK*P ¾^ˆîoY@W“S¬I{ÓÉcÕ§k]…M}x‚SìÕúmíAÿ~¯lÛÑNi¨èyàØâèQ¤ÜïdÀn §£¤>B¦‘a!#¸À+ƒÄ+@kÕ(öªû»- «Ì)ëVìŸç•y¶}íÆ¡"鱔rtz# sÖÅAù"_ DœWð¾Sœgä߬q­²F±VŸ×%häÑl5­²Áº×Z5Šñÿ<лP+;éë{„æÏ6°†ÄÕ¸GÄyà€CâÎ_£á:²aØ*Ì¿¢Ü<`†ó˜ö˜Et9¥G¦udƒ°µº å֚ìÁpþaþ”ºW´íã%µ¹;açæQíKN†µ"«€–Š~ÒR-=edcF1뎁)÷ - aîërŠ5Ú J–M6ў╙ˆÐµÚ íëês­µ®“žvä“4÷mê-jŠ!ê -È`/7äQƒ“`óÙ(éÄ Aõ‘B£¸±Ç43gçúʜb­>¯–B#î*KRߪQìUÿ<лà•mûڏê'è¬pWY՗”—*Í62ÌiL+ü=Žsàî©B¤Á‡•bš\M£â2B1Í]eb­Ó¯ä…"Ô¼k• %/ôz×V+ÅZ­Ÿ×¬]h•mûÚq«XL6Á…ÍórCÆ(ÊnIɒ»Œ¶ô¾®¥Q¬3€ø”©ò±¯Ì)Öª~N.3A‹µ2ØìJצþl¯ÕO«u}²j¶½ü\{s›Ì -i4pQS/7d ¾h¦À¬21/š $@ê^:JÛ`ó¸zp@œgî+sŠµê6&'SÅmuÁ4»ôm*Áف}[}¬ë•V´íf? Ÿ¢l™ª„ YPèË Àº 1å^R™ã<Ù¹)ÄWŠ)€vìûs¥Â€½®F±FÝ[mä ßkuÁÌ;¥¾M£<¯Ê³}œ?èðº¶=ýÎ),1¢‰ -¼œÕõeĨç\P¢çÌ;(#Eõ/rbûÙú%rbyÝBÄJÉ]-•`m¹æ¯TÙޑ®ûZOÖðôÖZîããý›Œêmõl{Öû~'Õ­„¹ËÓ©2dìÎZj\ VoP0µãJ0¶»¨bìKQT‘Њœ`íÙ{•Še^åaCAh÷öŒàÎbý,¬~x­hÛ¿ïjCòDLo™q•äË ²álF|TPy†I¥¡À4_)Îáæ@+¯?ˆAXúº*ÁÚtþ¦Ô¬÷®¦bQü­ÉÒå:é¾Íôï÷ʶýL¢Çv@§¤Fp -ì°Ê¾\“aсê^ÿP@Ÿh™œ`²*<|1u êÊëjª”Ú¤½éä‰ÝÙµºh- -¥k³RìÕúmíAï–W¶íèw%!ƒ§Î–Ôgt¤K£N†Ì€w0ìQã•õÒHR ¦܊–ûç°íÆ¥¯Ë)Ö¦k“F†³PV؎¥kÔö¦œ?W¿ß«Útó»Y 4ô ԛD|ÈŁØN†Y+©¦&EäzBeœ±aa£Xߘ]9öflj•9ÅZõW<)³h• E´óصZ)>úyíAï‚W¶íëg;„Y -êð øýË5µÔÔ³-$Õ Œkń‘X³-úƒ"œ!TW™S¬Q·÷(Y†ŽùñZeÓ !S­ÕJy^¿W?¯=h=hum:ÚFðsFȽ'ðí3ú7KMí¶‚vâF UEvK·‡<–ìgõ -×]«RªȁH ԝ194»ö˜nÙÂ4rƒt#k'pƎ螑ƒï͘.;6<7Œµt*W87¼#Dß­ÐÜ0€¿Ñ.—–;™O…³‡rK{ÑP‘ܳé(䞁{€¤Çqg ÕÂÒ`Üy‘MBCqSÒÓ[¸aJ6Ԙ¸GZŽ ÄM ,–k7€@Ó`yÙèk„0GÙ¼b¸OfþÄæY`'®Gp7ªՑp3——xúp‚ßÎpOÀøT©Y>±XºSVÔ=”ºQ rÝ*2Tvk¯Go·Ïªù‡[E'ý{èÓ*¢Œ.6¬ ÛN®ÐíYtäçŠÜ†Ïƒ?÷Àmx¸Á*n[¼œ›©Á¶™ˆ¬±GÀgCE¦¢¶Ó¢9û¹‚l˖_U©É;6¹¶XíГ†Ð6Èì¡A²–àª"²'¨;[<6´÷†ÅžìK*Àù°LªlMĤØþJD:þ)ÄŽVË -‚m’¯c¯‰Àø®¡×X©9. y8/xÇhâð:c†»ÆђTa×LQœÒu-Ì'Ìdl k®ùXÅ\—l„äzdþ¨UrÝg…\Ÿ.×îÞ1]+Äu£JšÉ¤:pu®f²Ú+˜RŸ?†x‚anõ4B}nTƒH·Š EÝÚëÑÖþUFlŸmõœô®õ†¾”ÒhݨmVuO#¨!o1Ö"ä2²¦A¬å|žûjœ°XWj…D׊5mÍ­ÁÕöM•Ø>Úª9é[ëv` õÇDR‡Áv -ÂܨuöŠ íÍõiÿ¨úPíI­dÓ³K>xø'æ_A*¹Â è;R.«HI9ÇK.qƒ¨„‹}œs£dëfnx«É +l£S+Ò+ª0Ioo§lßUÉíÛkU§üntšOÊúqñCÒ°ûѯ»çxÿòé¯îÞ<¿{õîé»û“Õw?úé«wgÇ_Ï~ûâN;ð³×Ï»—Ò¥—~õæî÷w|úë×|[ûà"­äÒwñNž¿¿»ÿú÷ï.M}öõ7OeLoß¼~õþ‡v÷»wÃ#]½¿{û!=¼~áÕ ºùáŽþóýWï~qfožèÝN7¯¾²—Ÿœ½ìé¿ÞÿáW=ñoªyŒ–EœoXT…( ²ª§2Ӓõ¯ÕMO7ÿПj“µ†ßZµ«69Ù?ðg}ç©ë*þ¢w>Ñ@.çÉÀ쨩AË)ã4èåÝS½¼;®“ç$ÙFîÈèÙçAEX ²Æ#°‘o&pû ì) ŽÖ‚òQrU¼{bõ¥š†`ƒÈ5¡bT5¼ZŽ -XMР{g$׀éQŽwQÍèì™ÎïÈ0UÒ»3,v=Ãq„015 …>¡\`ãk©1A%Gí#0bè”PB^”¦Ö;½i (€"mÍàízþRÏCÎe훜êK -Ìi±pfEJæÙ úóÌ<Ð"ÍjßzrœG}1ÄE)‰³’S›06 »Wj*‡z -ø\²ð¸¬ÊfŒs=¤¤ÏãÈKؒ»£HBå‹b8~+CìB,"O˜×Ù½fÍ0‹ÇÆ!HIaêš%N4­3·1•ÅZ](!!Òí1·æ ªq„Õ›†>eµ¡Œ‘ׁ8Ð HLúq‘F«Œì° ³ÅÑÁÌÆ ´ÛÕÕÔg:á $-³3À¬  ÜÀè9¤ =å6]–'XŒ…’ôGnÍb›‡”Ù?˜Â0؃‰•±¨P'Š¨‚ƒqÍ#))øUæ*¸BmaFìWàÚ%u"¾÷DbñÏ°vü͈l3¼Ÿ@SûD1Ý™ÙF>¬=dD=¶pÐ]¾ÀGL⠁ºn—IݯÖ â0§î½01åsN“Ö¯‘ƒ@)rܬ?GwËÃë=Ó3ÆžÌE¾n‰–bý(‰(Ì´Ô)d¦ŒZ c0’ž¦[±0#°‚¹OR‡À;ɸD@`ê X†"îm-yó؅‘qÐ@͊iÊR-ë!NsL:ÌÓ{:F#ÍäÔaü)3ü .p9A¨.€Xç‚Æú@Åh^)ú "Å@z‘Ù‚1ÈÕyD*âó {„€‚…g)šèl?Ï>&ƒå@5Øk¢\,ÝkX›Ñ+~^ç€ç‚F0£˜âj4 ‘9):##´=/Êí{£¶—³®Pš…–‘·xM@®Ðz„ü s<'¨Ø|30‘LægšxŽò‹PýkCŽ¬Œ9#¥5Êx(‹¿@½•ŠDc0†å¡fƔ ˆõÍ@eMãD#n(­\iÒì¥3ÐI£:iq"ÍY2Ð*ŒË™ªWrÀiÿFë‘îl@܁\Û¸}΅™äsYÍ†×pæè)!ËVËÒÂ¥ìԔ¿5BÖuˆ -¸¶'ŽêTbFZðE9©•£`ž‹LOÁ‰¼¨{¯@ȋ]±0#¡ß‚!avR;«³-ž‘~{šcâNQVe•"q2Æ?¸·Ô s,ãV1He?œ¨sP6æâÄRlM€©‘€# µÓÍ‹&&£Ž¼¹a1‡ -­˜Å‡Émõ³õ¶'¤²qJ;'«ËdTl LŒŒ8†·1ª£f,šm|žÛ}I;ƒõ nžqÙøʼnybe¤Œ€cTîéí²L¼(]žþSmâúM ‚·KÆè¡è3—‘J~A€€¯Ñä)¸ÅFå×öž0½‚³¨Øi _Ë@ìB;U0áS Ï« çn} ÷

 9PÔþŒˆLŠfp‚þ¡WuL )6 ó<̆ŽÌ•®ÚMF؉L9ꛌ§!EŠ­°‰A&Ñc‡ÑÂ@SŽ7‡}‡Ì‚°åÌÕ(^Ô3d3=×ÚÜâ¡ ñ…T,I˜eE!ÅýÕ²ÇiDì_·F x[9?¾“Z@ƒš>&*ÄíΝ&€YW W™nTãnLp?ÁúÁ«±BåÑÑòxádVVî‰ø<³paƅ©5ӊ¯MQ¶(j®Í ³,yÄðⵑA\¸ji¯Q2£ð4ámªæ,ú‘9êÉ7ŒE«˜€d)sõè1ë ¢³&6Ê0bá€o\¥R‘G˜& -œS“^½Ä©ãákI›ºpYM%”-ŸÌ­˜‰‚€©ÈªœùkzÚ íULÇh5&Þс-f0MÔ¤Ä2Ù¡9wN£fð%×Çs43ë÷"þ‘¾!).•òª½ -Lÿb²IÖìN¡Àô͘:0¿É®þ™RK lC12;i:Љט ‘>ƹwAÃKgcEx£Þ‹‚ã 2ªØTnP( UŸ -3Ϊ!Úçb¢¦©%GexèIZ·¯«Ù¶rîpú\i s°²õUá>I 4)‹ßhOõ ÊI̗M‰–!h‚"«™`Ä n“e}Gš! ÿ±Þ-Š›ÂÙ8«×åyµ¹)›*‚:¥h!ÄÕÅ Œ–‚‡–P3–AÉ´ªñÁ)©Ï9«…«f…»¹T.:ÑP­ÅÈG†B/ćᾃYÃya_°³ eËmË+3™c ¦?ºî! 2b·ÌÙm›qp̨Ѩƒ£Ëa,äYëU©MLœÐ¥Þ4™}±˜×Åd-÷9…­C®_üHƒ[¦¦Oµ,axcV牦ïDìöbÉÌgˆ -ÚUŒØÑÔ²À å1X Ì0ÕѦ+c@ÓZ3àž°:‚ù.ÌWl?—È›ãßØe3Y5j¡¹ÔK[€£*|mn«>Øc—d)DFÍ»ÃÁžNˤÕÞ!yø˜Ö0¨Ù ëšJóÂ+;çÒ$D¨œ³=ø_` u5ØwÆ9¾˜ÞF¬²HŸkú Raê€7 Ú$+²›vÃ5F˜†wÆn_1LÉí WËbNA†ˆdÙª 0&Õdƒ}‹ÄÿŒJ4 /I#ŸÇ¸(ü™»Ï¶?®o™mK¼áÀY†ïŒÉpw%c¿ýÊ4d%†ä„Ê0Hm§V58Í¢&IX–À':û÷ÄÛ;‘6Ð%ÀF§…W½ÑÀ#œH4•ÞæŽéøvFÝpª|VԐìÈÂ=¡÷“@FÆU4 ¼¤ ÂvYÎù±øýº·J´+ȑRšorhA²bF)?’a;‚ @c5Ö!Ä+\v´0èJD‘rUo÷¤h¬¯Á$ƒRG&ˆ²£);`;Uo.‚§Q$ރ['ëá6ˆ*̱9X5ª/ÊÞï'®ù)3ü/T ˜{pãÛô“ŠŽ23—TCÎS1y‰êÌMŸÜä* _ &ød{kÈô”ÑSEz¿¨U½½…i†—çHªÆÏaУ”9-z¯5ž½ › ‡AãAџôêÙý…I߄;˜¬ºð NÊúôBjfŠ@L¡?ÐL\³ês´®i‹³àá¦Yø`J‹ú|iãTJPwï}¡Í¼Bݪ´³2µÂ ª”±Uf¥¥µ -3?jv{¬BÁø“feHöI«¥‰I×<ºJ¥G/8³)ÊÅÒEÑ  8dž{÷]AÓ©b-³Fõ ëmA““ÎK= -AN´¹LFCÓ)¤N>h‚ )Ù×1 £>GÇ)¼œ’?|g§º@§'€§Çª/×d!L/‰#`Kk€À´§ÉÄ;Üö3{ž5nÖX3➄ÝÁ¤§œÔ]Â[í=žY „9´÷H) ŽvÒ,8ÄP½ª©ƒyÊæNÓan¨°ú¤ ÞI.)܂ÌToðÂ÷x}w•YÌÌK»(}˜´«+rS V‚Š H\c.\} I60 ó@ÅÞ6šÿÂpÛ(¨8ÒàÉE¢¬šéx+ö¤V -ü\׈<4ƒ¦Â<©QΞ¢gÙÿQkƒ/ 瞜ŸÄjæðA½[Iíº@à ³M -*ÂÔg˜©ˆ¦ã…!ö3´B‹J „XÓ¢xPž€€ûÙF0¨îў‚T$½E½[NÀƒii¯Ähw¸#Ê¢peÂEŸ<·i\šŸD 7hÉ÷3¼4pÜi¢ï¢CŒ»¦†þ5$ȅ©w²§È«qRœŒÌ‹¾Ö² n»€…gѵÆԐСaD%Ä'UT¢9FԒÌD€X­)$à3¡½N2âdš'ûå= àG F6é4²:[?AÈ-_ã¢þßÉܘyQÇϪQ?“ÙêñÚà3âé қ.˜q&ñ‚ršz‹mVXØۇº#VÂMµ¹AmOaRd”81*ŽÂ q$‘ž|¾ßSAdö¤ „¥{Ç:Ìëš>gPDS³é0¡ÚÎi8CôX`…SC\ä…wS©¿‰CˇžëÞ?À{p–Ñ+EK“©Y€¨¸à{ðµQ„ø’ºŒ™4¦ÃÅfõvSD½ŠjZÔá„ÕÞí GÖLª} @•Œ\˜±¯(Qµ´ö̋8rEv‡Ž¦Á¹ÁP1:ƒÊ¯éJw¢ÂòfÃa•¥¢®”`Œ ZšÔú"£ À!)Y*šüŠ*U ‹éЎT¿àÏr8 w¶:†w'°»Å—À 5x>E[RÔÑþ™§A ¶àÖlvl`ŸTwy =ÍÔN€k'w7Â(q1`#õ'ŠàÀ«ëA¡‡•±P;[uoOIgJbFʓ©"CË™Žå¬D×jèS«~$¸‚6L8zÇ™;Ï©&.Z´. -5ctf=Hà=0—.Á­¦H*Õ64*¼‚Ô2¯ã$Æt¦þxïJ¦V}ÛL/§OqêxE„xŒÒ◘0ë SèáÈ Ó O¦l3…sOL.®Â®†¬cy„‚Ñ•Ghí×IýçCðöÿ'£+%ÌêçéŽKäDì9¸Dt>»Ì0¶ XÏU\20#®+Ì="°pÑ\5+€œ×›Ü°\'ŠQôB¾t*8 2kŽtLòÀÇÔ Û®ú­×yo2pœ€BrZ!x&Ý*šÏb¡³’‡èÁ¥­ ¢Ê™…Ì´U„®Qº¼näAÔ챸Æ(&ŠM3sŠÃõŠïŽn¢Œj;+ eT 0ÒFÃhÃÚc`$#ÙÀ )BB錌Êj'„ldžÂ´£Í’9ü[8xU3µî™¨ -¹"L¶$'.Z$XD @kv^ÙSq¬ðgˆj¼/[‹üÂîUò×(uMfñê 0Œ‘0|‚Ž³çՐӒ7~Òè”}ʄ!PFK$[rtììm÷›ž (B&|‰<õqouîŒbt0qZúuƒ@@UØÍ䌚JíˆaÕ»h鈜Œ)ðZu[·×Š3t'㇠ٳ¼qjQ·¯\Gƈ² з -¯ -Ã}Œìä_Wí(Cʉ‹C´OÈ0KRÅa§DÆÀzÅo^Ôo£Ç¢¹9ʋúπeŒfS2‘)üSè,y ‚ÿa‰ax“†ûüè$,Qe@JŸ*!ÑÒ§¦f;ˆÌr§ÀVxZi,L.¡Î€f⸣lp5pCð¿Í.zá=ˆ Õ×Ó!S¢F QFÙ,‡ØšCêƒV×ÌÃ?›Yۜ'^6¹쿸•' àÄÕqèGÆt@ ½ž÷ˆåL)NcÚÀË ¨4auŠF¦l"/ÝoÚ7ޗŽÝœTà?ŽGÜî³þӏ”ÝèWþ‚ -‘P;úᶃc™ÀΨïaããH|þ - KÞÎôs0§º‰üt16eÅa¥ à6¢Ý ä0m9öèˆ îwë^Q¼ÔêˆlÄb„ @ì®lÒ<9óhk%(*g -’šG•uí½ –k¤«çiÄ&¦eõÙkn¸ÍY9€(›ÜGª%I2%g5Ñ$cc‡ªL°½TZ:çAÏL0•sÀ›“ëÄ f"¡©þãgÂy€q¦0Qžõ”ÞïÏïœUýÇÏTð BVdöÐîLÙìvÃ\T¨£oÐKÂh_H‹:LÔ4GÆlL½Ì00Ç1–„#¯CT„‰ñ°¤,̅<Üà…öÁƒ°x@ ·1€‡"·CT„ÔPO1ëýØîÏcšpÊ90 Rý«9fÅôç`¢™,‹ê]æ›5ôëPßS‘S`$Ô¼Æz1ðÂ[bFE -Ò&×ØFBa ØÌ1äjÆ ¾ysЃd‚}HaÌO®± £†¨€BŽåúžFpåø~J5ðˆd?5ã"1O¡²(®L¢}à‘K6™´S pÇug½ô|!Õ2љ­„Ñæ–X¼cjïÑϬŠQß#º`,IÈü™§±õ.h‚„’ÔþŔӰ¢äjÛóßÅaÖ0&ƒEeÆ˘ÁDm‚¼ÎT€/7ÇPàÄǃª‹Ü¢€ë¥ì>¨øÙG¥»>ž=«—q¶,v—)Ýf<ë®ψLœ&ůix|6ÇìÀ\nVo–“qǬXÇԋZÂUd Êtæ¡7©Ó¤…s0~ !ixŒsIÿ‡ò4 -õ®­1²gïÆ (;RB€®Çz€îí$·×À!ƪ½Ç&„ 0#¯¸‚ÉJ*†Õ‚˜õ®("€ô¢¬‘s@«›KÍ4O Ë܉ /HêK†Ô2µ;igâô#ûÑDM5î™ìÜÅõQ†Öy׀ÿ‡2\êބLÍP“€Öë -³‚NíÒ4¤0¢Öp À[6å{Ex2œÌ³·W „D]4z0ÍH!|ZA|H׌Š‡¨†'zü„•BÚ¦J‚ÏÄ:…6 /‚é¼D]°Ú\ Ö\Tø3…_•×'䈆3‡ˆ%>†Q¨©-Q3KPnfŸHÀÚ3c+F¸;uëÏÈ~ù‘r½½eD³¢/4™àn½¯g4û؅Ò̕&”ÑÇBRðD6dp#,Š±±÷ŒZ’ú&ú$¤z¢° tYÂõ±ø%ÆÄõ#×h@1äR……â"ÃÙ lè9쑾?àá\„ëo™G“ýwY%½)Ã5_tŸYD§ätLº#asÖ8¶:LçðíÖÍ5Žð Õ‰ûo¡ÝüP§ZCøF£ŸC˜ô-Ý9d‹zÛ}8À}CQÏ<»„ùñ”* 3~Jö ^óó‰ŠTæЉŠŸá…£žÌœñTZOlÛc G3bJ±úà$®LŨSŠ¦iªæZ‘ŒCTØÄ8ʨ¸Ì~6^ïˆ[x`‡,a¼ ¨ kts¦>q„é`xCQ$7¯!i",S3G‹‚IÁÄÐK>ÒZŒxAå­?ÄˬþîIÁˆEW )ìg(j_#¥û©÷Yç½&›H{Ê98nôNÄ4êiïÐ#ÂNè!1 ÷Æ·r1^Ó ÷í5€:oÂââÕSCBÌúœ²R¼I,Ò»@|’9S°ŠCºçe‘£¾©¦$@úÀIéÌqY®#e‰E“ÖΓ:ÜGU¦ -°Ð?gÉÄy+‡^39«Šä·B£kغšqMáýö®dfNs`Édœ=b)]`§‘g ÝÅÕůKñD>ÿüªã>e^RÏzGÐ-äa†ùõ® -Êx]~QÅ6ÕkAÌ¥o„¶j€ŽÝ©ª€_{Óöï •ZÉEYJ(¸SPSD„öcí=ÓªjõJ Ÿ¨ÉŒlŽQ ªõI㢦1FO.”·Ô$§½nž÷Ó¨ÿ~ØQ ¬­L×fà´`Î%mŒ¡ƒ >iðܗ´îv ²¤«:P§ò’Ta£j–֏@·¬i;­h¸½°ôÍÁ.žx~h2è6í+‹â-F»¶V_Øÿ¶äµ DlOàJP$¨½UÔ¼X˜ #Øɉ!ƒƒhœhóð×Ìb‰Ì‰aš“áHÑh6Ú¥­Ì;т÷¢a>š ªàýLŸÁà‚¦O¸%0‚ =Óµ01Y䬈Õh6.äf-îÆ8ؔ¾®,ÁXt]O¢d»ªx†öº]O:g3Ü1VÓÂòjÀ>À6Ž"×+ðÀتe QŠÄ¸&…‘yµ¤Úeý=]ÿ©ù²©Œ•?Ñ4f;ëšo–5Îj®é<&5¬ÅÔÉS Æ`ÔQ`^‚]éo‡¦N_¦g ¨ÄXèÃÉ£bl°ž¹Ý69ꁋȞ-\¢,Î c3.óӆ7àœž´wA‚ù)=‚Ä0 Ø䙓l`Ôd8ÜyÉÂþyÄL¹j»|VŒÒӌg¬¤¢ n^# 9Y¬¿Fä9¨~43wCRÄq™,½†½•5\%šÑH~Ô >Ñ2XKžbS7iÀeÔ¨>…c‹Æ[ÞsgÆޔ{3?|:pá£È邁@`hðí€àf5P£>¥qÑÁdð”[sdfÈQ8ÍI4Ô>ÖËÒ'C~C|oƒ²°`¹)ô5Èl™§€¢Ñ‚›# •Ìþäïñ°­„$Z–k4l ‰?wÍÙíᡚiöEDálVG ¶¹ž‹‚KM jæ˜!,õð5¶wfdNn‘¡ƒ9ü¹ ¢ÇAÀUo7¸¾Giü=š™-,„_‘>êÏ‹4gÔõ­D¥Ñd¥ÉÒ1M^V=p.¾1ç ‘ŠÆk’}3š(¾w <¿?~sQÀ‰9 @ É®ÄPBÖÃ>ÌS ‰­±Øõð£e ê4™9Ä{§wÕ,ú¹c½â}ªè«Gå˜Xú&¿ÍºÌÀÌ4%´BåÄÄVˆ«tž¨)Ðæ`1çb1¯#nWD}Ó-ëÒÒKT°ŸýÊAí»Å2{- -ë!a݆þq ˆË¢ Bd:d›º­Èþh`Ò -§!ÙréÉRââu¬³zQybåT³ƒ ŸMšËÁŽ€A{ó #™`^„t=Gõw2ñ8¦ØÊ]"0î P-=íȨ=Uz©SP;µDø½ËK§¯õv:|àÈú:gÍ7ÇNó¦KpÓ¹†QÁ -k.>Ìñ7¸ËY[² ‹FÓ¶{ƒF5ý¹¿byõà),jXþàê?hööЄ…ÅШÅB1év«‘Nƒz^T—lº&¯—ÄHgó03Ñ2~“WÙhr¡äãOá}8©%Ě®„W¯•ió±â‹ñhðN°’T⪓óŠî;l&‡ð"Ƌ;aè fN-5ë2Ì®X€¥Æ»!Wď2õâbv‚b™;H€„Uìjx ó•µì)ƒ\é ői8<ÚËc#Ø{Y‘2 ÇÇ 7H¼|V\#MÐ䞺.‘ð‰Y¸jNžÅ@ˆÌQ΋û&͊‘—ˆC*6#æŠÜjQÕ.ÛÂÂÏÔyہïÖÅÂ@5¤%ûˆŸ™r±8ÔÓÒT™À'¯fC27j>°·ñ\\lûÒã¨B¬LÅÀ/hrta!ó̀yFžbž5kqTîWìÜç{ÑLõ蔋…”û{jP±™I‡ÏAEŒËœ4³¦ÐsCc`‘(Mƒ+£Ê8™u‚ã«FC?X-EȪ-U9À -düô܁½õÓxUÌlN1Ärò&KµEÊb’¥9ál½òžzü@ý‡q¹5TQ«Éꬶ¹¯î[`'g]Y -€¥qjl¢¬‹£ÙS4НûqHŠªâN©Ù*+ÅE6%Ä„Ï&ØME‘ð¥bè*¡JKp¶¨¡‡Y=¨‰çz¬2Ìf6< 3–4´x1Ä=ҍ(λh£z).e‹—ä3 „ ·q¶é v­i' +¯?}ÄD¥Mz‰A¶˜›ªfǀý4—}D H£‹¦œ·l™Q]ºLJDž@«_<ž²ÎŸ£”‘õD“vZ¢>B–lGjÊè`у±F Ô9 ˆ{åi]lM Ã*R`T Ø´?Uüô1^ÁŒªô7ä†az$Í R4”J ƒéuÌÕ, -1jö&LÃ؍?¢vqðAQdvºÐ™ï²8o™PGˆ2ùdF™Å€F[±éðÙ³¿½˜gûcjû«É~šøø#3ŸÜ8k Ý*2v/ðç5ÿñ4k]M £23*öُâΚüWß²fË} ™¨•>õ1ôòŠg>†j‹`šø:ôžUÞc@™òÐÒãg|mÍzŒŸصÊz̗T$ Ù 5çšâ8+ÚyÙd<´àåšð¶\@ 4ßqÀ Û·Kw ì÷ƒg;F´è R¢á¶ÖɎ{*ÓøâÖV`¢=Õq –bw•é8ÖDÌ5ÓñÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc`òÓ% Ðqw.~'3Ó'à,AX -â$:>=Ón cÈA…2ç˜iø^&ça +æ‘Tþ&å˜Íœî>!ÇTÔûq 1Q&8> -MÀ1ÿoxcŸgҍq˜zŸn|Z𶳍Ñ=‰£!ÛlL#mŒ…˜+Ù84­ 6æ'×x¨dn§c­ÐÎÉ4¾àV;‘Ƙ¦ò4æl~>“gÌrµRæÚúòg±¯à‡ˆgŒâ¸ë9'ΔŒì4cxÄJÁfŒÆ@­ôÉ2¾ºbOÊîõ!F¶œýó噴'AÆÈü#S¿qŒQQz©ÿ£I¯¿ÔïÅ—kgc~ aŒã¢öÀc8[¨³ØÆ÷PF4øÅø¨Qsøbœ;¾^ !®6àÅ,ƧðbΈàäoðb͓jddÒõIx±$o¦'¼Š·b¤ñ¥v½œÉ.æßT^Þ lHÊìbÜ~v‚]ŒöSÈx¯èb\v"–RP}د‚\ÌIU6¹XÖ»'`†’‘À²Ccކ.æ{3ÁÅtq 3]veԝ[Œ•Jµ[ ÐUK–Т(Z™ Zü ü;‰Å\;½|É?·e^+¯F|[+~< ­灃¬°b¨0«ŸÁ¡ã2)iõ¸ ©øiúTTÌw_²8ŘLá"o˜bPb± Jñùˆè”âÓø“ R|Z­bÀðÃÁ(ÛZ» Q|:ª„b”<㗂PŒ¿ÑD'²™`‚OLõ|»O ¯~þJ'&¦«Ü 'ÊOšv¤5641KŒG 21¤S¨¿zwÁÇÆ%F¾"à!w©Vº bǽS‰‘0è"s„aè13‰‰¿/ñ®g4'€…A$ffúJ‰{‡xã7›#Fتӈáqøø6ùfV©öØٓR ˆß]¹õ´œ“ø]Ç"FåäGƒ°q²)%ý’µ¬bò4Xߨ€<“„Øñöc§ªŸÕħµ­A Æ/‘øo²ðYÍ[ùÃ,y&¥˜Eͳ‰>Œä9–+|Åøíz’=ŒªvÝ-eªݹƒ‡ÁPÅûeÎðÉ®ÁË_ømÐa@¦1Ks»Ò’‘üÍRՕ8Œä?ÈæW‹ªóÏ7ŒbAÌWA~­¼Hý -Ø0úv6NÖ0rîp5 ñp'³¦áƒX€ 4 ¯Îfp†1Æ0qbÌ0þc£ Ÿ<c ;8î>»€<aF~d§ð7[ÁƨÒw¸0<4òY͆–ßG …¦—d# #ÿÉAX`aH+!å ®pw_Š +LÅѓ* ̓1¢žûR–) ˆ%„læÂgk¢0 ü¸W 0Ts­× -“øyžÉÆߜíVœp}„÷ špUˆ1XÂا;I=/ñn$Œ$6\»à7 \7Œ0rwUlv¾ÄCL¤—wŽ>¦+CxeÛA=7œb„¾ íy#¿Þ^ÂFš‰ =@ïoôàC¾„»‚4ÙÁ‡²©;:ØD»$ãõÉ >8ümÔ`zHc$4êͦ^–ªÉë\,lÈ`€1o$1 ‘>&0ø§iç[û¸`õdWë·‰9U<Ô@s£V')nýî -¾4F%'xˆ ™˜àø{£‡1 ÁbÆÿ‚¿J_iAW;6±‰×οW>pŒ -'7éÀ~å68ðÃÙfÐÔ_œÒAä_PyPà>vêo© ê/UZÕ­±•Á¢në©oÔ_îÊ¢Š aò7øúõ–r‡~(©¿¤åò€†þ",ª8sP_çô—‰:}W¦þ2|$µ©¿ÏëÿÙg£þSÑÎdþ‚?YË5‘¿èNÆ݈¿°2UÀ_n6ÎÉûŁÞa¿t$ë—A/‘÷‹ ᔳã~ŸÇßDÐ~Ÿ"ˆbÂ~‘“PYÉÊúE,ò°*Œ)÷›º›IúÅßµžo ßkÎIù½í2%ä—Y“ëycü¢~ýe"~›S¸±F )«¾!~yÕõ(“ñËÇÇ2›È5E>7ÄL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK -*"Ê+Ü·P pŒ„û*0ïԆZ^Z'ît_jÃmÕTŠ€{$ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿéWÒ}•  ˜ow -ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥ÜÒM¸/»STä)UŒÂ|v¦ûò¾°`pÅûÒ -Ãx_fíì¼/ L]lx_Xƒ -ž@¦nÿ²$À8‹ïy#üŠ+QÎ$übà}MüW~õÜc'üҊ×8¿8úӄü%áN\ᗠü[ˆtãæƒð+Ãè;á¿GÞn~ù•-¿˜<Žkl|_fúÎk$ߗiÒRދêVv"~1Ü9ÏI#C¸ü >GÛù¾0ñÞچÑ}!:†“¹Â}ٕPad†òþÂhämð'F‹ì;®L(éxÎkf/: 3³±p} ɽŸ°AèȾxÞ3þ^±¾i3Ö÷öô¼^0l±¼Ý¨¾×©(undÒt0}ãïé›6}_çAÍb¢ï}¨ÿèÂó½=dÏ÷>4ôÎã¦n4_ìÄå¹i¾·µ.ó½½ÉË÷rƒ£@ù^Éd6/©®½%Ǘ xÈâÝH;l_ñÞÄ㥠†/‚â„ü®ßëprÔßË­i‚àË°x-;À™=œ{ð{ñ ¢„<ø½W4~Xñ½Àr 6Æ:©„÷Ž*aüÊî¥M”cf³±i&÷‚¦tª·]J1ÁkãLn/ò«Èˆ Û æ°Kµ—šGÔóڋŒ±ÚŠÙ{yi¹!{Ùû–¸"ö¯“؋óõ~ãõòdÀ43®wxÕ´^"Ø ‚Za½¬vÃËiV/kâ T2ªwd!õf÷Rƒz££ø‘_·9½ { ÀLï wãw¡°ÇÈ»Az!FãB'6z¸ð -B/‰bH¶­€^QŸàóâÏÁÚdñyo++6]ïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8ížáá°fߢ‡f’Wñ;«Ú~‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Õ½1€"/)¼6"/Uö]ÀWá;HE.Wy…©ÏNä¥ò‘Ú…2•ß 4‘’ §È‹¬Nɋ2+²®UÿË~S;Žʪ¡ï‘®7|ZŒãe”ª«trÂxQwMoŠiƒÆK;Z­5@4’¥'‰"s¾âZ͍—!Á“ðI×Oa‰`›q¼ f•²óxíaõ¤q¼@d=DI4ÂÚ¥ñ'Œ%T}¢x/$e®’(^ÀöﶃxakDÏH×Ïj³~'‡÷òw±ax¡²CþÁ^ü‰¾á…J õÆà½Ü¶'¼¨õL/"9ˆlÞËÁÖà︘GIþîploÃïòDL‰ñ»ÃAÃ ï’ -uíì]6‰êEèÝÁ¨Npw‡3vw˜E¿hP‚ÐOPwqêM Â't—ý«‘´3s—5êåNän·Ôk#îRð\ ÜE I„ž‚· èYßx»XâÜ.ÖhH´]ü '~ƒíBƒð~°v¡ÎBn(P»@Ãö³‹QD·³{¢¾4»Ðâ`Ž!vaDì.»Ðð n \h|Ìɛ…÷gW>$ðº§zŽ.û¼NüÞÙº(¥§Lݐá`uQUCÉö -Ö´?\ÝÓ́«‹Š ,‰7ª.ŒøŠ‚ª{zÒ ¨.ΤΗ)dÞÕ3R Î˄]ø,`*4µÏ™\/×Öêb…„÷6xº¨ª‚kÃé>Ň wf -˜.$Ëäë­0]1ìK—5EOO”.4Øö­$]ŠµÏ3AºCèÁÑÅßñCÉÑebà°`ëRÐ_S¸1º¨uìj£è¢~±·IÑ} S ˆîã8òÆÐEVB¯IIJ‹˜ó¡Å=«Ö¡Kë­&ö‚–mZždè2”÷vƒè²U:bÑżϰ_@ti@œo…è΃(èØørŠƒ¢Ë¢;6Š.\x9”1ƒçEPt3_¼Qt顱·Ò5Ë9#F÷ƒg7ƒbߣû8×µStò= fðˆˆoopMôXi´tQKp¸šêâžhñe~.öc2gÃç²r³Éÿ&=÷ n@q›cŒ}ƒçª2¢×eCôíÂ+ŸôܙhZñ¹ôá©+|.WL,4=—ÃáÒºÉÀeÜp\.p@ðnªÈ!ÅÀw优ð\ÝõSÒsiaߍžË=Xdz./Ӎé¹ù÷FÏe8ø çªžùz’žË¤K+Vz.#ðlx…ïh5è¹t—ñ„6z.-hƒž‹$ë°B`|XX¹ÑsyV­%<—Å6i<—u e7x.­üÚ Ï¥£á¹éP8±ÁséâÜž CÅWð\(°ßè¹\ž6"8˜A…õdàs9lÜÊQM|.—«¸wÏÅ[Κ…Àç*óYŸŸKPzq>WiøR’Ÿ‹$‡›ŸKZJ—`Gc%°‡ˆÛ?Wɍf“ŸKѪ½‚ŸKC/Wí±Oá{W|.|ºçÆçÈEãs±oӆυ>ƒÍíŸË< cÎO€~…C6€.ˆf̤çfp60/@y¾,@ÖNÊ(ºà/с‚.RF Am]à°v ‚. tó‚ K®A—L¤®p5gGA’’ŸË½Xö³òsËiß.ø¹( æ¢$ø¹ê¿Ñs™M+ò‡©dä9w9ꟄƐïoô\Xõc¦çBÚ“ô\ŽÙè¹°v<ð çr3ÞÓsyä"<ô¤ç"9ɱ.è¹x¾Ö>7 ?wZ ÐÅáß2n¡Šº¶ ‹¤.=µÜ¬zÝiXºi €n!( n’ºùbn]fgŸIÐeÁ5òèAÐez­ªôk -iÅÒ.ºL®a] ]fÈhÞº|í±¦%C—ÅÜHA™¡ËÅJtƒè/W: ºLªûj,àÂW¸@t‰j<Š%—>µ3ˆ.?.ç¹×N"^„!ºøs ½].–f©2¬ÌE—÷±%Á‹†CêËÇS•Ê5E—9`¦­ƒ¢ å+wŠ.¸dAÑ%áR#YRt)Cì¼Qt©mÀâ80ºpÿ”Ø Œ.^B¶Û1º0îœ]Zðh£K µyF—Gì·±ª|Ñ ÿco`taaLlÅèÒ7eŠÖ]BÄ®ÓÙ,PÉ!lµbtӘ]NW»ÛêI↱ùà†Ñ…Y¯—1º00|]n"ÙɊѥ™*0ºâ°]ëŠn Ò§¢KE ¥Aхr…ãGbt ¨nÍ>1º ³²;0ºt螅Ë€W¾bt¹ò9¦ñ±H!!ºiغÓj¬ڔD']¾‡|ó?Â*€5Zäx,]ç—èÂÙçj-ø¹C£ÍŽÏŠe$=wHMžðÜ[~ÁÎÎ}/‘r…½UäÜ;ÚU®àܛ\äeŸ‹UWA͵–u§æÞN‡˜š‹f*¢½¸ŸTu*`eæBcŽü®™¹¯!Ú0ÚjÁ×F̅>`s <îÄ增³õF˅]i)Árñ·2R‚åâoԙm¬\R‡ÑiϨ\(îñúäÙ¹IùFÊe>µhJP“³˜ÞEo >üÈN.ôC€Vi°mÿ€ä¶Á†ë+!þ’?ÈeO¾£%°A„¹wx 7þ-d:ÕmîX´‰~ã -ú-TeUxØ ¿ÅE¢%Ø·¸ üŽ E°²¨/á\ì"Â'”%“L§÷;¹·Ãȃ {;ܲ!¨·Q[ÐÛa˜ÂƼeW‹Öy›²&Þ6WuoÄ[(«X˜’B qÓكw‹¸/Ý wK@Gy’v{ºµTÀnOK07Ö-ŒˆYê¼xkAºÅ/“oÓ9ï.+Î-|.ø5¹EEXƒÜRm…·à à;2âwï×F¸…‘]S ¸!aûàÛ6'^6¾mko‹¿2Þ"È°ÑmqKà¬ܶ ë$ miÆlh[Ô@±Ne%ͪâÛ¢Æ -ŸâƵeñöWôQ ¨¶HšŽkgÚV;Á´ÅßnÒ# ½mk×â/¶Ý/x¶' 7œ-2,.)3½P„0[êîsgٞhDvô¬zÃÜ /2H¶ˆ©µšY’Y‹ŒkoÌZļŸY‹÷–í!L¬¥Þ§½k›¼œàÕVÏށ«e-ôÙwZ-t ãJV-ÖĪv¨Öä Uûz½'©öd,±¨Vëž^wP­ÄXïT‹@¥;xKér°4Xè$Õ2ÛÊjx9Dý7 éƒküí½oŒ©——ºIª…p¯P€jƒ[œZ$Ó(]1µXÙÃÅ -J-*ÆáΤöt=âƨÅõH/j–ƒµA¨Åߗþy®>N§àƒO‹Œ%Bþ§%§eôN{ºÀ3‚ÓTaD è,°*ΗM4í]25K#ÖÞ¼*ð ËûK ã%À,ç ü]”ëFÄO”UmTZDÐ1;”uA Ÿy#$óèڐ´÷­•A iÉb½¯d͂ԃycÒ"Šw$Œã–Ô5x´ñ÷†£ cÐh/ÏÃA™…KҍE )#+6ÞE‘Ü Ñæß+ˆ6ŒÁ¡%>÷~C{mlZÈh»Ð´‚0‡Ðr0hIœS߲ҢåqîðYÚð…{öv÷¥`ÏÞî&¾¡g$íOg™¯–³"3´åÙ¸³ÁL -ìì}»1PPgo‘;tœa¼ÁœÒYÈ@Îâïªõ$ÎÒXZg,ŠŒ—ÅêU;ðÜ6Üì3»Ê±ô0ß16˺—rî¬YšªRÏQÖ§BÒ ÍÞ^ î Ù[4­ÄÌ>±è Ê,+ÓÜKgj‘If«³8'VNbµ8§á´1‹$'µÊû¥*ÌÎc¬|Ù;’›ÆËÞNöL6>ù . I§Â‚ËÞEw0‘±W7nC˂¯Bê`X‘òy&W–jéëyÃʂ4°_Pe‰q92q×1«vSÈ|³pWлCþ$ʾ ªd݀²Ã1æʎ#*M]°œ†);bÊópiŠe'ÚQ–bnæÅÊm²GG¤»Bl'ÊBi¯ºje)ÏwÜ·k˜h6S™H3•æƒñèwÀ.éNÑï,ÙÓ‡DÉ"džâ ÉR¶Ä¼óJ’Eb«ŸÉraå­PTKX¥sÌ©þ@ÁTó`mr¯b%FËÅäVŠlǒ½ÔyÇaP]¹²ÝòÄ !‹.‰:s'#óÙwwæó7w˜þž ûw#Ȳ[s€uáÅü˜f -ˆ!ÊõIMË£¤aUtÕB0g¹£y;GOx²~â¶\b<¤#rdÆwÛÀöuª) áU%'>,(«¡ð”.©Ck«{ʵPPtvë:Ü\Œ‹ªzyÏÌÔE% dz«%´¿Ý ioa‘ª÷;_è8¡ÖÇxTt– SèÄßtw4½][‡ÛÈî<ÇåÞ帻êfv¡Ë*Áü^Ã[£¥äÙÂ[dWÎHÁÀ¢°~€dXê­'W’ɀϗ uÖñ)®I‘҇ы´\—6d¼Ã+ KfóÊCóÌô)jhA ±²4"-Y>ÿa–äLZîÑ]xkb7Ӑ)"Bõ{¸Wûv’¸ñœ"×⽐¼ëZo0Í,tÀï _ ŠÖ°g¯GÀ5ȸÇ6G„9ØvÚùK/n¨Žø Œ´0„$aïiá;b”ô3Šžbñè“!P *|©MÍÙ~";ì© o3úøxÙ)+¢ 6ьT᩸:Óΐièo2TðgÉ[t<¢|B“½Ÿ*Œc?T‰3œä#…\üÂð ³Î’çÂòzdqîGù_eñObÁL˜Oqg@Fãø¬ñš`ÙÞ3G3;^U«%Z8Bó±OŒ»ªÔZ¹+«*ifö[ª9.§Ûa¹Õ¢Šrã]«PllĶtX>±KðÃlæF-EYTeUd¼oJ ²,ñæàG•F%‰Ï±Ž‚03™E0;þÔ9`’!ê9ÊÍ`i9s£Ö@w™ñb¤y$®Ý8½<š°8ÏäˆMÀ{¡« &z²EŽy;J…÷–OF¨« ©«c~L„"=z-J æ»P…ðŒùåºMf·êôGÅù¸îûr¹šýŒGøœË¡c$†é*6 d)ÕeµDz(êÁÁ,ì#Ÿ@L€¢(ð։ páA٘«ÖþXË*ùé+`“¹ÂèY\)Šô9n&¾_WÚҙ¤ÜôvÍø÷éuŠ]ÖåÓÐÂGI©X´—ÝÖuµb™Ž*’ -»4èú;"ã 3Å(#pXˆâ†Â oýՓ:fB `a¥È ô×`¡ÜÄۋ]£ú• ñ¢~]Â6ꬳ?˜úàØb¿ët—ÜA[É,,ŒÊ¦˜Â7\é_ž £,íp«51c—¸ênf,ªlM’kŸðáµ™xÓ£4}³Ü5§y²5/‘A¶0ƒ¨ –ÉqªªQUt]©F²£YÅD¸z¾§ù«‹åµ/}i%ðƒâìÚ%Uó=£0‡ ¯@6¹Sî6¢Y ºÀS°Æª#vöm†¬±Dw°‹ƒ”{j¹5oy´'Wc°6Â&ö·ž 'e_êmYû«P zKÍÁþ¸¸ª%——S¾sàÒ÷|+¹M ×á×íð6«™™áj¹«.ƒˆøC¿¡êOvºÕV}Â`9çºáŠFB#†®€·^Ñ{ƒݸá¤×çXrˆý×­«÷Œð@è´Ãñ’m\½âaM…wr–àvŸ©Ôóôr¨´0éW5_‘JåaÄ~ôã%ïÉXæɦ’Ôy`v'z¦ì.ºë܎ÄËÂñýP‡»R%†úünz ïÁõy¥›à_X#‡õc¯¾o£rH÷€ÙÜÁì²\Ÿw×Ê´”bn l‹b]IÙ¹!Ú)r²¼â}<²¥íê㦴­œOÔVtûTŽàD„Ð8ù•#ýU1 -^Cd2dú0#hZ"8țܕAtsš°|êъWJDîXw­¼kxŒTÑ.™Åƒ&AÙ"å~,s7œD·—Z´¦¨{!ð -¤ž¾ƒxK`J_bŽÀ‚òGa>M?”V>¡nD^ï.FÍÓ&€h»* ‘<–¨PVwy×á1“Ú©%G¦<Ÿg‘–¦²rï™f—2ÎË(Z30%-¨ÜH[ü⇟77ô -~)“Ó"AŒ÷ ëiB7مü |ý\9çÛ 4 ¼?ÓKJ5mV£2¤Cn -K²wíœ4—òÖ Gxíè=T9á; Ê–>Y=ªêâáwÏR¯n<(& -`áÚOtŽ‚ °ÑQ§rÿV‘„ÛÉ=f¹"$Æﶻìîs¼ *Rƒ4NŸÚíÖ6KŠðÝxFlðÖb –ÈWñ´xWªØ¹kÏÀXÜp,ï—ÊLi!ϵ£ÔôaW†«Hw™ŸZQñ¡èa |ß^‡Âo£T»^nú :N.[( hl„{Y¬‰GAõËà­w‡©ˆð(XU -‰áÐá*ÁUqÇ!ÔcÇ;ò¦¿-0L½¼nvÊw‘,Uì­þ˜=Ï]U7] ›ß$úŽŒ6ÇaÁÓóx/ì¿úAw‰Þ©à1ˆ¿¢3‘Rš ƒ J–R69gÜ5Žû—839Ç荃ù¨¼1ôQ¨Å8‹)\aæžZà°òœØ‘âל'îêÒê×&P|ßË¥GÎ\J¢Uuˆ—âF4µûÉœ…ðK æ¸oµÚ›Q\`tê5 ¹²‹>}ÞLݜUE÷ÛŸ‘þgX»“cìVҔ§Òëøai0WuÞT!3ċévjÈ~!šçÅd5×­bÒ Äß"6á®å7l¯6ëV*¾3†XƒXËë¥aB¦¶{FNaUhž î,̉ÒB&J½šväsÌ=©¼ßö$œŽ¿Pü7šI7ërGúA•rJD&ð‚ãÞÖê…*®ƒC$¢°œ_tà“á­X§4^•ÙMµ%°æR‰%Ï¢‡ìfI…xˆ4»…´ÜU¾ë´Ì–p€1ú‡#òÈCO½ÒAC€ŒÔ¼Ô3D-üQv8i§& lHçC狱—Ìh”÷tÕ=›ÄTÔ!*‰ÿ W¨¢äN¸†GpíJÂ8¯«ø4k7šâGTW¦—‹®`˜ùž‰íð(çÁg„@A%Šœ—zHTËÝCr3×54#’‹Ú½ íV0ð­çPò”¹'W˜03âÈcA^ ½Xþ(䅲„†¬²9 ¿½(¡Î¨}üÊÁ~ ŸƒÎè|ëBQ4""Š"þJ <ƒ^$K®pøaT4‰dcg2¨L>…Ç¥Ì*XFísOJ¸`e°ÛU~̧ ø‡å-´d߇z¸ç}%GìR@úäç¢æ2ųŸôÚDÄ·Gä2‡eOk†O²bÕš UÛ \ãØrQ{!Y‚þʕY€ÇS:LƒÝ{n)3sO֕TºêŒÇÚIƒÅé.kþ`³g!/xxÈ40!BB1úíÎpÞ¬G©1@ëJqNíÉ2\>Îê;E‰z¦ø/ã$3Éå0\\-„•räÛN‹ÁrΏæ‹Ù[Å<–Âê7§¦âú­=k¾Clö÷ã8=Qçç,ƾ#ÄCc¨t™Õ9æ¹øâCÈ Ðq -ɀR›' kžÿб0ºk”pe‹Dðï-iݝKлh¾›¶ÚǺ/mȸve#Å»ÚR—¯Œð8Þ«ZgtºšE3YŠwZ¡ãTÙ¸Ÿ¨u”ÐñÛ@Â€ûñØÏââÊ*'E §J$X­þ¢Å­¾- åÇ è·™ýHÀ5£§u»n£RÖ\µ!ûÏpv@ Ðó‡Pž+¬'Zì@°ó¨Gõ­‰§¨Ç¾rBÁýL¯§A£†ÃP´Î.î—ç4x”ø͙;jfà*PÎÙP?wiï@¢š6XRL ³>Î["žJAzÓ±ò7éŒAr7rò†( -Š*ñªv×öT"p¿vâ`!¯Ç˜³þýˆÞª§Áþ A‘åÑ@˜å´jnÒ=ñXúbϒ¿£ö³üf— ŽŒÃ8]½w‡™¡p•Ô™0…Á¾Šˆ^åG|ºÚƒ|H춗u×뛌 -Á|³ÙΣÒKb‰9=l¢tߣ”Âܓ-ày=牔GJ¿Ê`Þ£ƒQ‹í]­…Ù-ƆœKŽd†ØAöŽ”ad>á>V žšÀn¡ …Ñé“:‚vULÃÐo7ߣY«Ø¾œˆ‰ç^`òÖTe¿™‘Æ;̓Q˜„ºZ£XŸDËüÕÓ $-5)õðI¢eNeDzá‘n¯HÓo0a[¿«™Ê®Gô°5ýc)‘8ïúd Wâ‡!”z `̽W†~9àTŠ¾_Ÿ:àm*#¿ðY¹- |ÀÂA.wUƒ¢â@œ[¸¹¹Ð‰¹Jŝ»+ ΌÂvkQÎ= -Û-«=£©$~ƒ*X”+S -ÚB±Ë8–Xª¦>Vs¹Ê…li@ήՠԃX1>óZçŽÎÌzc«Þj*O*KpO¥ë¸êÈ×é Ig.ZèDBe£¸ðáqÔÝ´kî*O0pJ”³ÛJs -ÅbF­¿ˆKc:dgl;¥7ÆçJŠãp¬%FÀ5Õ"4Ætx¥LhÞ#=»2Çiþ1Æ 8CA¨XõRkkŽ-¤ Š6TJPÓ¡ -¨[+SäJ†™± 8ÂÒï%ü¦ÄáaQ/\AHRˆ?É!–+ž”ë£@¼ŽÅË°`tŝ¨æ Í@á!f¬Š¡-ѐœb%ŠVyöîp¤Ù•–$Ùµ` ݃r¸VònXüPÔgÆ5‹ºèÆRpFîj³…^3k™‰¬„ØäŽB6Çs(ˆë”²K2a˜tÎɵéÖ°¹é°–“ÂÑîôu«”BäÂ*ìÈÖH½øS…–øTîP"ùË¡T|<”uå¢IGëjxg”ÁZX4•^Rr2©éÍÁÌ©´w_'~‚ïhïáôD–™§¼.a¾’zˆ}Ø¢ kP JÍKw©ž.½ê!@‘:¬Ÿ(G;MLàÐ ÆbïLOf‰_Ñ¿9Nʙ.WlÁ¢Î®MhËÜSz+Úb]¡î®ÕùK -Yc…95æX©¨H¾yZ…n‘ž‘þ¸Â«‡PŬ_ê­ro.θþ®5fƒ&Ÿªš<µeé3ê,a––Ç©¥pB”#¢´¡æ+8Œ»¤ù<¥ª£ð~ÛUý•yø©ÕÀ³ -ðяYÏS­º\'Z¢?ÉçXéW!ÍdQ#´ÅÔª\ªÝWh…¡Êä“.óuY…;:&QhE|“šÊǺWAÁp©•{êX2¬0IïP± žî -WŠoDß-hú8Áª–¥Ju§»üDXÈ¡] õR€˜Êl/»?6)óÓû„‘zÒǽ™˜üàI| g©ºªrW–ÃÌu&3üMlȤ§íÉUqŽ×ªø¸Üˆ,34e˜çOa=;÷BŠ6R)Ú­——]ûjvÁ„$Iqáá7pÜSŠGÕÍ»3Mq(n25ñ@ÏQär¹æ÷‘ÝÑÇxÝÑ8ö#‹]×&ñ6Iu)¬Ò?_& 3LyúUP¯j²2†‹22Ž3!j¶=õM*°T—çã‘Ẩ‹!fº÷ÌÚߊ1QOSٚ¸XÚ5Ë9àkJ=üðG»$í§:&½û­3®ù±Óô^ØëXƒ~ 󭢦'<½KËlZFwŠº‡?‹ö‹ñÉn¿MíÄaÜ>]ÀB]7«ÅÎYdú Ÿ=s"üÕC%ÞL†X™³ ‹›¡æs;ëYó¦µa$‡zß}ŽI9SA.]4.&1“0 |°BÇÍ>g@øà ¸$ÕçÉ]å±¥Êi¤Öþ}×ÃiÕbÑ-§Bñ.-*®|*êe RW ^ΖàŸ1ÃqÝÈ´JXX1J_ì)® -’r\õK®˜ª}üH/•L`Ÿ”KtQÁq¸"-§2ÜõeîJÍÈ°šœ59`±ëG›«Å8·ûB›˜†ôu¡A=¼##€1Žã4F—”õP¼Wd¥4[™'BÝ&u܄¡ŽeÏ>\ñÑôÖ?î’ ‡›nó'—èœkº¾"fÃù: Œ-Š¶šó9×슃ÎWwšBðÅ)ÓZvp¼Qž‘»Š"€&XÊÛH<_Øà€š(ñœ ‰æŽB4slEÃz×"nñÛe^.(U›ƒù œä—dOùæ–°\óonӊ›¤UuãRꪕÕz¤Ñe)ò„W(UDàä\P4f: ù¨>¥²[ÈüÛ©«+ÜƒØ Y$*¿\eôá{öӛªd•WU24Šƒ±';Š•8Ÿærö„È Eµˆd"ñ-9Ç%l4€…m1Ù2ڛ»ŠšgZXèÜ£%õIؕbKXŽ;õ¶0ÉÜ¢ó±¢} á^!ÿ«úîk(Õ¥»Ë¤ê%y»º‡‘G˜S³è Ëv.œàv\A†~´«ê*{\”%ìý“œ{¯A)À£çv¼#]éœàÇ MïyºÃS¤JbF¬‰¹øû6­ßû…5J`±n¢+v’cµ—A”¥J ‚* †rC µùÞæ†,gç²9͏I㕍,•}TÏî7—i¼vf6¼[>Å}vh}»´9Aß°T¯2çÊ(;ùÎØ÷§¨^ôÐnRãï,¿â—¥¿Œ^×a=ŸõA°p°êë臲¬ÇéÆÇXÊ­©S‘ xCòœiø¯‚$Ì®é>]„[ü™‘þÿX‘7Ë"È͘ŒÀYd!w|m=Û3¯”T4’”oÝ!ÍÂPP<%Šô~ïóB•ó§’7$ò&¬û­þRÔX -å\ëPɇ†dulЫR݈ÂQµEUÀóÈgñè÷¸)×å1¡Åp‰|Iñ·|±>}±æt0Ÿzqo?*ªš¤®Òè”g)P㥄¿'qémAü½€2”Èm²/=]afô9 Òt·8\<ë )ÔT:ûÒ@ø9”45‹ïôP[|„h˜Å -•Rc<Ãê”-Ô TW†qWJËj_4ó‘ABˆ1O‚ch¯µ‡ÂÓµ”’ÂTÚÍu¿ª€ç­UKµdr^,¤sòæuãÈR -¿Ü6.{&›J·f‰--3px<‹™êÊ{Ón˜´´éӝæá¢sHŠÔz-?¬¾ý⃅$\>¢8/ºJGٕèT-ŽÈ`²? -ևÌlBuN¶)¹f­ÝÁ®8I7ÚÉ8× ÃJŠ'­ë p~D÷R/•ù¬È¨9‘þé„ m@ä€Ø¢qî­„â7dqN-ÎüQf¤ŠiÆPȍ® -¦KeÊzz [׉lŒ+C”±€`nD¿G—W¥ðP=À³Z¯»›WPUFÃæfê’Ø”XS¹^ô÷®g¤«3èDýć{O4†q•W -bñ£LvGÃfÌÎÍs½­ŒÁ×}̇½gˆ˜èB«gbÈ¢pµ«A@ÿŸa¨ú`Ü»˜ Ë¡²7ìecÆ:A¾º– åçJ”l Vf8,z B´‚Ù›µâ]C¤3B¤»(î³ÃMøÆC¡V–jF©aŽðÌð Õ–Hw7vcªyæ‹Áÿi‡ê”jF1—2°~ÑØ0þ¼t»§Ï¦‘¿©ªEOߌŠ@ѧ‹Iõ@¯qM…äk„ Ñ 0zÙPáE O¸ºv"w%‹™(PÏ@¿Ü†¦BµZR‡2ÎxÔWmª¿¨¼£\”š—Ǽ9|YÄvø¼.“nÆ ‘SVáð÷šœDYk¹UD­$,ä±)£4-"&´­>fêpȸuÝ,9D%°Å<Ö¥ìNŽMvu¡arJuÜK“ŸQÖä¡þszNtƒ&šsºÒîÞ$¨$B¢8ÀD(®œ×l€bæ¾Q‹ØõÇø‰ÝVºW›ÜäaòýÖiÍ=¯;ˁ_P' Çd á³r™–Ùëår×(ðîJ·Ô† •îÜ-÷àgՍöô3Î½¬ðlGéC·€Î•oé@©àX†U&¨Í¢6»ˋX­Å|½³iÃÝ5rO••Â¬¶!ÐËp>“µŸ¸ˆñž—‘1PÖ¨áä(rùªÓU[X@ø™â£d-«+¶¸ápš¤»V›_ü¸Ö”2ªÌ±Á̘C N—Ê,~èÔ ^Ê[ä®ÝÛ©¤¿E_t°ÒO²XŠ<­1gÃfŒY#GuK”®*­"k»1-Ú1-U‚^Ö=—Ëðæ‘[QB ÓYË]ÙÛ"KW¥:eq©vS<Èx—½ŒÖ¯.ƒÜ‡ë!;FG¼õÔÛ§jNx°û;‘vz‹ôÁbæÄ3¾ÄV*LÀÜÝ\Å_Gq~±¿Ä)ï˜:¢¡Wý•#ŽõOLҗh Ý]wjŸªXº†¢«+çšSš!Ϊ‹#}™Þ£ M¬r{T¼NN.e2ìFøé‚ÅלÖ0O³#u‹tgnh3â+‹êN˹V«…×3ф¨¸“˜~GhÖ¼É딃‡Ö"L7µðKXQ—ä…®a÷Žz QINþgÃZC8´V¢ˆž¬cZÎÁ¬¢j¬(y ¹y -(ö /Ëèñev:sˆßnw®ZF»ªúÕÄ–CÅúc -ÔR]ÂBÀC…êJÇ×`Ö}XJü–+”™ºãrÁ*sÀ|Û £ã©né@“øŽÐXwñK<SZ-ÔèôöÙ­)Õ¦y– Ý؅NÌA‰iÊ#w7E‚E©Ð¾¬àð’z ,†“B–²_4§ª i/2éÐ93¥KLso•£ñ¥H -A‘-é !.­l¾7”XwÈEÞ ‚=ŽÝqY’¹VâÏ¥EßùÇ`a½–é“ ei±¾]{äm9Ɔ´pxÂáSâÂÛ@mˆ×Ƹ\RÚ¡h›öŽ“÷†q"¢»/Û±›8Þ H>” ‚n˞#jõ¢WØm?B)as„Å~æ­ÜÄܐ)„S ³¯‹L0ͼ`N}P«_<¹fðnV=uÍ»ßÑÍ fT\ÐBÀS¡…†g÷§ âe<}xCñî·iá¯^e±x×Ë@˜±¸FEføt53Tqx&/ôÚ>.Naä™T+bª‹NV!o¼ÑňµÏIž¡eÖ×¹ï£FMø»F*© óË&ޔŠ€GSÞQêay$ƕÚé¶æ̑™ðŒž;ò—‡%è\?õÊf© B®€o ºtD')ܬÂ*|GŠU:3“þÕbgú±[Á]»“¥êXrWWˆçžÒ ¥ÁŸÃptnØ]4YXlÃ~ØcIóV¶¿@7]Uw–"iE<Ù'¤™g¦xìdEóåÕÛãU$ëO¶ö(j‰ðXVè쐈dǞGzbD¸]ãiTªºk´ãÊ=é -ÀL±7-äo¢éVØƱå‰\x?L+zª,榯CJZ|¥…"–­s;|µ¸½,·¤O…­Ãâ!å2»67Ä샕+ƒÄ㪚a¨öqÖ´±ì¡wÝދ{ºy‹&-–¡²‰%’KaÁ­†Ù¬=oVc°W -tÆÀ:›·ÉUJ¾»ÌP2.€HuU<—’…K N‹{'^fŒ±l-«!Æ?k·÷”+ÁÃ|8ñV¨Æ\µ¹Ô‡ ,ƒË³¨Á¸c˜¬ì„¸íÂ+t„w¬ö%N—Sþ„8»ÕÜ&nRI:h’¿æ”Í ˆ¹ïۊ$䙪çl ƒ`ñ¬.)†Ïvj!š^ÝG¥û"!WÕ9NÁ—š#Š«éóŸìݬÁ¥Rz‡øô­¾Žäè!?¨åÔVÔû ZÎn|ç=™åè¬W[Ëù×Øyå´=Ïĕãõ>'­ü´Ôp‡•Ÿ=à4f•#¬¥ÎŠf•cñx™ì0!½ÌK÷2IåÔÿ••dî˜rô1jæÉcî½ì%£³ø!\øtÃ8ןÆR°Íäã2á@”_þLvBùTœ”£îòz<…"÷Bôó#:ʤg£ˆN¹hÓɃrpò«›³±ÉÑè0õž–×rˆÅiI&ÅÂ&Ç2C~ž¹ä;H–üEk‡’SìÓÌÇààO3ÉÖÇ=¨w"ù=<àaߖ<òË*ÉGþܪÑK9+í8eœÝ@ˆÕÚhäjÒåX‰bDÈ6hä°2³ÓÈK8ÞI#‡…}FNƒ¤°÷ÆÊK‘¿aäX†3„0r¬˜X_´±ÈQß،t™å|Ü.Päìg¢"ñE.3‹ê ‡E³Ë\¿#Ê^W9Ì×B"g§Š€s¯AÕù"Jµà?™³‘ÔE(”mrÌ$ ‚üñ2 äÏúº@kTxD·&M`Çéð@}Á¹úøøE'¡³~.Sð7ôøhá ßg¬B Gõ2—ówLg.ö;~>á—;žÕåuü´žÔÔqKøó¹D}9Væøa¿@ŽŸÆó&r†àUN(ò@ª&6p<ÚÁoœêLêõVÜ8"Åå¯Ô'oƒ5Ž@?S8ky(¾>‡\ímV }še0AãH[±Ò7@ãÝA¨äŒ£ô´ÆtbƑé%¤ô¯Qàá—€ã W@î3ÄÄ£±Þňq¦¢‡>3ʖYÄÈÇÂP¯ŠùâÈfª$Êxq¸v”otñ:f”¦xªK¶øÏqFl­J‡g@‰üFGЭ4-ÿ`–1WŽ‡Ð +NˆLQœ°fP«ËçØâ6RS+&})Žßã‚1@álæxœo@qd_øú„•åYò˜„½EÃá&Ž|Òˆ‰wùJ‰G::–$X9_ÃÀ†ã¬V°8|än8ø¤ˆŸÆ§%D†¨îeî -V„8Ô§9Ýbàr9•@|V~x‚&>üŒxgÐÃÏS¤~FW²`‡O> 'a¾ó0™ ·YÐB\¨ÁáXQ*edn8éˏÂĆã¬Î:¡á`p°~?˜ágwÎlC†ÃªoÓÄpŠ) ±blÒ >iá¸T3Äy)ÝÈÿ`…á$¨ÄŠ -GºXc»Iá=˜À -ï%èó+'¼‡Z'0áÈÅ5s¤k1opÈ Fx·T=á-àñ!¼…ø%áhQ«ºMÂÙ³ÖzˆÉ¯[¼ªYcÂÁ±[ÓafåÞwMç&ƒ# 4XUf0x ±òÊL F󲲸4`ßCm¼w(øҚשUt ¯®ñ¦¸Włç -ïœDðŒâÎî8pWçNxÔ1' üpzg›&9Qà}ß ‡VÞ0àôՆ8S˝½{¥èWÕgW.yc€ß y«VJðC˜±IœÎÙà!úþ7—?þ?©¾ØfûjU{²¿¹™É1J0 ™¨Ý…üíp`‚¿‡jê'÷; ö;­Aý~ê–7c‘嚝fxX¹™ýé$~OÃüNcð¾kV¾î;^ˍöýPÐ?ìk-êá‚õ}0êi¨÷”Ï⋉õ-–C¯“õ}°¹Ýo¬ïƒHLŠS ûþY?³§MûÉA“ðFû†›2ÜVC’µ½=ƒ\ñ õ;S$Aú~èãJ&…oˆ…öéór£# Þ… w²´0êéÅkÙ0ßð ”B Ì÷A8ˆ-ÛT_l”ïFä¨d|fp¿Šµ–*¨’~G|WÓ’ðݪJ3ðÁL꧕ï Q Á-÷nÕéñ {§.±ç -÷®Ñˆ0ØÞÕ­¢í C´Y A 5 ö†x`„ցúâÓ² ë _RúOiX4ëzYIäî¸?íPï´Fùô¬¯¦7¶YA>L»&Ñ»¹+Þ؂KŒ èÝ"¾@Þñéªc`rÍÖÊñV¿¥«L7~l2$oÊY𰑼ññ2¶$ol(lf¼ñà9©o$oZY_¾3š ò†”³ÇP±cꧪŠ2&ț| ±H ò¦,T$ƒ¼IGbáÊò¦™H yóI]cr¼)²axãxSXåLCCRƒËIŽ77á'»q¼afóëäxSt{ô'9ސ ¹q¼©Ù×ÔeŽw!gùz&Ço¨*†6Ž7µÚ.áÈÌ c$Æ[ )#̗>‘Y°oÈ¥B8ãMá3)?ÆfsãM©¹ÆxK;ÇjµãÍ=YUï’ÀËÀxÃÂàݎñƅ]> (í2Æo -¨X'¾R¼Ù9>+… \Þo„9Î^vŒ7Âríœï+¬rMT0z+òDW„÷c¢Y¼«éàã¼Ó»Ÿ;ž®áÝ æ1Èün\'¤ß -¨êŒð”.™ÞMòqS%S»u%è?àÝPäÜÞÓôݽ’»Ñà]m’oûZIíÆ^|o7h7‚T³›GÖ2³›½á‰;ژݼèzhWåÃððnsjBõïÈ¢ì`Û<͵pþÌَݩ%ùv`7¬¬¢ -^7Ž£¸³pÝø5•-´îBÑÄ¡5w -þlàº5Ç8I3qÝ¢ìE[Zv¶#‘âÖÁ„bW‚þ†ë†Yë¦…ô5ãºi¨ªM\7Í,Ç -\7¢'œS0“iOû´ãºØV½jàºY»!A¬›QåmeÖ¤u³^„•>ëF†~=pݼI*5]yÝ% Éëf‡vÆúƒ×Íâ Õ)¬¼n–Ð$ê[NÂå‡àuÓBjâÆ릠–¢‰àu³?—ìÆÜ¥ŠÏ Ø-‰-¥fvsCUßцÞy¤ØMׇ+š vK‹ë {³ µ›»=Ý°Ê-1°›†añYþ&AÃ;±›>ÉMìV?–[‘·ºÝ’`»¹ªRҀ"½ÜÜã€eë°p¨ÞÝ2ßQ°Ú´¡‹y…ì†Aôû ÙÍæ6IJ[ëC¼µ–nÑïdCv«û#a-Fv3¦Ghd7—9A؞Ènjυ¥1³›út}#fvÓ¢aevÓܝùUXð, ‘ÝüQVFnÈnIþ‹Jix¼•õMd·´ü‡{°&²›î#ÃíÆ};Eý0´[aÄ.'GšÝæ@wOíV¨ä4é$¡Ý%ûјٝ–dv38ÃÄçÆìƥʙ f7}E: ¹àÅäËލٍDçÉEû#¬œTKd7Qw|‘6d·"ËϘÈn¼qDü$²»œgÐqd7‹Æ¤† !9²›®¿:ˆ¬Èî’*†@vÓÂÔp »?®–Ff~ç²™È\)ORˆÊ£Âs‘=Ó7d7Ílpfd7~‚ªµDvÉoGvÃL8O"»iQvÒÈnY˜t[‘ÝøQR:ٍ)Å[AìFJQ½ W`73¢$]°ûq.-YÜY±1»¯ùa[ÑÒý1±{ô(RZÝ°Ž|qö´“Àu>…ìsI0œïIX÷ˆ±)6]í¨îáNéIê¯îpt±1´aç<´ºIº¾Ÿi½¯ ™™Ó†Ó=­ætß5Z†¿ 6–ö®˜îët>73g>!ÝiØÝÓ*D÷M Ñ ƒ¯+ ›´ò¶ºåVEœùÜ0hYñÜ؏ó~à¹ïû>üöopî+¨› µ‹4šÀS™›,æ®ï" E—Ãiå*ÆW®XnI¹ *7 Ýe -t]Sn÷dr_ÇTþ1Mz¹ÛU"¹a Îp#ryÇúÈr#ÌJy¹¯ø7uô[F·FôP7­,yØ`Ü´bNµö†Õ(î—A‘µÄ=b}`7B¿êÝfžD’È7 7µ©lóg -7òðŠÂ}y±»3¸Ù$üy&‚{D-t¸qB,9ÚÜ<-Œ›ÁßÆ­æ€ømèݯôí&|›e•ýšìíõ8½]œƒ¼}E+8Û9@làíËzµän_n‘4mUp”ߨÛ÷p@nöpµ˜ÈmÈ©õX‰Û¢‹>¸ çØnß!vÙxÛ°r8 -Þ6ê:˜ÁÜ6¨âª[iÛ¨¢á `ÛXz3ýfÖvþ½¡¶§Õ¤mÐq†[-²‚íŽhÓÆÙ~?˜m,MÝÑ;ºSÁ_Ÿ7Ì6ÌZ E\r¡3Â¥,ô¦.®˜mXj Ì6,¶$f›Ûð fs­ÂâÙ~̖JÊ6–Gjû¾B¶_©Ê—€lóÄx—²MÂHìY=§“אmRؗ Û| ·[tOÈ6+k³ ÙæûÁ!4 Û´(FºB¶Ù,4®Böãv‰!Û½§ÏéYý1!ی@2X¶A¶iVöՐmE&ë5‘ÚŒ8ªy…l3$FuS@¶ñ˜ý†l‡Éfcl㸎یí¹Lƶ¾u7ÄXÁ5úIc›^Á™Ò¡ÈíÎØ.A·IÆ6,7c›%¶·6™ˆm\©DvØÆk(,V ¶áºÔ{ElO8•x_CV"FF‰*§ ±½˜Øf“gf± ‹Tnb›Ä Ʊ]È?/*U7zˆ…9ðlˆm¼ÂVŽ±M‰¡±ç,Ð݆ØF¹éiÁØFݚ8÷.Ig÷¼O;_9¥¢Œ×†Î!%èÚx]äɯtm‘8œ^›A$uB÷B ׬+][V*’Œ×æ±Î€i«<¸zxÙðڌ‹²CIðµñÜsL¾ös}l£ž(Êu™Ì¹ƒ‘xmÖa´']m~úÂֆ”‘”`k£kÇ­´ÆŒ>^Q0dm–/v­h™À˶ì+Wë#!gt¡pÅËYªÅ,¤ƒ°Aµ/·K¦öåâµDjÈÆHÐBÔFC ŽÛÔ¦þãp0®çp°sçi‹Æ]ð´G‹†qÚ©)]=aÚìhEA’YÚ8ÎÒ‘¨Ý8ÚÃx­,D§fÑùcEqʟ­m()c ˆ6’†ü¬‚¡ÝC¸·!´É˜{¤EdlËÐ*;@z/•;pm?ë¿ŸÝC±Ñ³¡Q"˜%àÙÙÝ>Oº~ ;÷7p6J”º07û7( ÙXX±Ðvcfê"0×àClÅ]`¯!ÇýefŸ.AI^öéÌËnÄmî°ìl¸¬ìáXi¢²¡á$¾‘²qü¹eŸÑ^=8Ù¨1S««“} "0ÙgÌiAÉÆ5ã1gnS ƒ#ÁÈÆôtšMŸèt!ގȆӯp‚CF8=¾áȆ.‹Šê•zk…`G}Îh¿h:ö3œÎ^éØ02Ìpì'zš;˜™;û± $É؏ó Ɔ!~n‚±™h9¬ºcè,R!Éņ:-‚U‹}_ÑÃXì'0§AÅ~"¿B±‘êÑK42Pܧ"ÄÚ\<ÑýÛ Ø43ðPìB6qy>%›9 úÜf啂ŠMWñë Í›ÛÜ.˜¥•óˆÆbâüV`±K‰*ü ‹­uÓÓ'›9pºDÅÂh÷¥¯üE53›‰g5‹N`\Í<üÆ\l¸lp¸a±ƒ'¬u¢5û±&lGb?À“ˆ ƒ`b?F/î©Á­fFýù´S«‘9N.xj‚ ©¹¼¢¤ä¶¨7Ót'JÿŽ>Ë-1œ’xhj­ÈDÞÐÔó²åS’©»[¡%˜úr«K}:ѐXêây;¨Ô–ÐîPj•¢ØŠIMbÂóS"©oReމÔ@´°qF©o/G±ù7µõ[É¢¾¢û„QÔ5ªïvõ0°'IÔÖX&ˆšÉ‡jFf¢\·'­„Pãý(®ä›jÔÆMD¼Ü^Âè£áˆ¨åÐ$P7»W ®á'š…ýo'~õC¥¨ô¨°âë™ìéáÞ oìiË×=}2äP&yZK²^ßÈÓÒ¸\m’§¦=Ù!ÈÓÔ§aI­5±!ã0°¨b §?ºìß~Y€¡ùŠ5y §»³|IžP\‚§Ï:á•;€„ØœÆNƒ¢ŽÓ¦NŸQ»A§A¡'Ìi A”†5r†Ë[ÌÒ⧑¦¸+xÓHœF·¢©â9£ôØñzÈ`9¢š"æՑhLÖô]"ë-#q¾½MÒôS‘ØAÓ°r€ Ð4 bí:Ãæ.+Ð7Ìôc(NR¦Qž¦¡7Ã?0è³1¦o—s&cš@åûšèh>8 m„éË$Œ´W£&`: _:¬‰—¾<×'4"e®¥7¸4ÄÅ -ÙzwZzþ¹’¥Ãš`é+4AÁ•¾ººa¥!¸î›ÆDuAO6T†hƸø²Ñs&ÒWè© wN¬n@i¿k2OµVªÅ7NßÑp¿Æ ”¾O;âÁ“¦¡Ž‰“f¼ü8ßhÒñk4LúîÝLš½èÏó% @¦ÒçFICf j„ˆoÃWvtâʂ#(ÌÀHßþzwŠ4Ê·Š;—Fe!+ђ! CuÄ~"¤ŸˆðA­#xѕǑ۸ñ£Ÿµu&¾@ºǘôhd{˜ÚØàѤU·™:ÔKõ*FGß^Äîäè[|»äF?^%6š…”gÛ©Ñ䅳mž¡Ñ8)ú3úi$ïÌèÇP–DF?QÄèõ@}G¦8xÑ·“d ‡Žáa§ECÉËN˜A‹½Tà`@_ѧrcEC¨@RhX‘XP45ö×óƉF‹ñMc¢ñ7+¦L‰¾Ž(6_!ÑȏEŹ8•‡`ˆFªØ!z8¼ž„èewˆNÃƈžVC¢‡YRI(Æ -™Q§ nê£ìÁ -…^Æä¨Ø]¸¸#¢Áë:}3™”éŽÉ‡ÆŠJ W<4–eðãÕ›ê­\`Ö-{ØáЧU$ɆÕIM‹†¦¤Œ©ü‰†V{%šË<ÿ±œYgí§Ü†~\)“ KãäBsñ<®7,4ÚdÄ=ï5 †Bw+Mw&4¸]qîü`"+—Hèw×èó7w¾þïEBôü³Ç?Oÿè/~øËípÀßüö—ÿô×?þòÏøí÷?üô»_þËþ§Þ?ý£þÓï¾²9þï/ÿó_ÿ óúò›ï—ÎŸÛéÏûÃÿøõ¿ÿå_üæ÷Dë¨Þø¹óúýú‘ÿç‡_ÿ׿úÝÏC°cÛßü·_¾nÕ?ûío~úÃùá¿üîo¿5nÏëRýÃßü].ôóoþz^(ªä_ßòÿòBÿݯõ»¿úÙ'û§¯¿þñ?o¿üӟ~åi8aøåŸýæ§?½}¿{½€ß}gû?ù῾®pù—_üɟý7þÛ­û'¿ýïóWy¬ðg?üþ“ÿúTþá/ŽOÿør|ú÷¿ÿşüwüNJý>>ý‹×ý/Ûï?õOÿêÓüOǧ_½öø÷ñ‹?ùîz0ôã~œn{û…¦Ã…‰?oíôe;Ö믟ðÃÿúõ?¯‘‡™¸mB«þ«]”)\ðÒfz-/_k<üÇk´0Bˆ—+@Š‹&êlIæ)«Æ[@²—¯UÃnÄ¢áäH·Ù1”^¯ßØK7ê5¼mçF«p8ŠûÆEá¯í°Ó¸ŸÃbŸ'<»\ÚÇûð:ÂÁM¾Ð? @»×ºž›ø`z&þåݨy-¸ÛÙÂzàáö–ãÓ¿úE<Î ÈcIÁŠï1$MǹÚatMÛËHY{3ZR¡ë[ì]hŽý°ðÆ^¯Ã~6~?_µíÜþš×ÿ4^nÈ?¢ -iÇo«ÝgÂêÅ¡¼1ʛò‚|°‹y¼:>í‡%£}ÚÏÁÆïæÜò´ÿþþCot¿{5Òîf(çµÔ0ێÞñ2Ÿlµ‹ZÞëîx©›Õm¿ßï0ÔXUl§Q¼îÚNx1nW7íË­˜‡]nÚ<‡ýƒ)PÎ÷«ÐúûƒKãÛSžöå•Èî/χûð>f|Çӹčßo/Î}÷~‡3GÛÙ.ÆíÒ¦}¹ó°Ë›ç°ß^üœò}c8µõížÆ·G<íËû‡]ߜ÷᛽À§šz¾l•BüÕþ„ζ‘m1n#ÛbŸ#ÛrØ9²-簍løD!ö/HÞ;û9LûrÂó°Ë¥}¸ßÇ(Šy¦åÃ-Âîå8óÅX~q1n§·Øçµ,‡W½œÃv‹æã^7Îc=ì4îç0íË ÏÃ.—öá>|ÿÑ]!ï:?¸+aß<²s®7¦²Îòúà®`EÆa÷‚n5ŸÚ]ßݕuãéÌÃNã~‹}žð<ìriïÃ7™Lç½ßÞéT,ç0ݏålãvi‹3ïÃâÍ;¶ø Ûí]œŠeãé~,O-oxڗ÷!»¾9î÷šLç4½ßáéW,§1=å„ãvu‹3oÅâ͛¶¸ -Û^üŠeãé,.oOyڗW"»¾<îÃ7yçwoéjLJ°oŸ|s¿ÜÝx¤|7ÐÞë¸öñ¡ZC¾›6¾ëÆ󓟇Æýû<áyØåÒ>އo¿œÙïðü–—Ó˜_ýr‹q»ºe蘷byæM[>Ïí/ßò²ñüê——Æ·§<íË+‘‡]_ž÷á/göÛ;?äåæ'¿œíbÜ.m7æ}X†yǖos»½Ë‡¼läa×7çÃ}˜>jžžd³hó% |ºbó:ãæ¢,öéÏ,‡žÏr››ôñÜf¤åã -Š‡no+(ž„ÖÓÛ^Œ›k¾Ø§¿vzüíãâiûeç¿q¨÷OúÕèý[€Û7û¾G—X/^¼Ÿ³Æî_>q‹ÿŸ‡)ÛrºÅzûõb͙¦*Èh»' I½Œ/監p?—™Fv®þi;,C wý´CçLó\×ÛÆVÁo‡Æýû<áyØåÒ>އo9Ó`ƒ÷;\Œ"ÙNC@ïs?áŸ]Ý´/·bv¹ióö;,÷¦¾m\¥ÒÛ\ߞò´/¯Dv}y>܇o5Ó°Ðåýö.MÚ΁WÙÞ^àŸ]Ú´/÷av¹cóöÛ[ØG|¼mlFÕþÔÒøöˆ§}yò°ë›óá>|ËÀ4/dÛ³„< ³œöï44׫ǰ߮7#Žu­3Û»JlöÃ6é@÷shIÿN?r²±äºñ%ð~ØiÜÏaڗž‡].íÃ}ØB§èíqþ=ߎév”ýãvz‹}^ËrØyÕË9l·Ã}?o»²n?ì4îç0íË ÏÃ.—öá>|›õ|¾'s%4Mv¶W'Ší±…ñýÕY7ηa=ì4žÞܗ)}£ù°æzbšæçó[~zÞ»ý<ç^7ÎG²vϯOžç·âß„°owŠòô7£¯úý¶Æ-Ú»Ç@}b zªo1P=Àõ°Ó¸ŸÃ´/'<»\ڇûð•a¿EóÉ/ǙiùÅŸÞbŸ×²vú>Ä@õB½Å@ûû-ZŒû9LûrÂó°Ë¥}¸ßd@ §Ü>Þ^¤“ [ωg¼çÛÙ.ÆíÒû¼Ëa÷äºÏáCr}?·-¹~Ì+ä4ã—ºÚ}&ã>÷Qw1nCôbŸãùrØ9ò/ç°MÏí[ Óµgñ}‰ömÕ@'ÒéŠi´ù¾Ä×›Án¯\ìïïKŒuã¹j˜‡Æýû<áyØåÒ>އoì–_½ßÞ¹XÎa.–³]ŒÛ¥-ëŽy–e˼c‹o¿ÝÞe!°l<— ËSKãÛ#žöå}Èîo·ûð ƒÝv­÷;<×ËiÌUÃr‹q»ºeé1oŲr™7mqï·;¼¬–çªaypi|{ÊÓ¾¼yØõåùp¾Y°{Døï¾Êø0>„}ûäz«oããtçýa|`㕻íãÃo_&MïcÃÜp~ìó€Ó¸ÿúbŸ§:º\ÔÇ;ðíƒû½_ñró{_Nx1nW· óV,cNܲå³\îíòç†óK_Vߞì´/¯At}a>܁ovØoìüx—s˜Ÿùr¶‹q»´e¬˜÷ajâ~-_ãrc—77œøò¤ÒøöX§}yò ëÛòá|ÿ¿{ý7?ýô—?þð«O×{Üõïzí{÷úIÿuTr¸¿kÏÅB—Õþå͎®ÀÚ~y;ÎÏٗãüäóü6âÜíd¤xžå" £½ `ãëe<@-—ñ<žSƂ:¤Ïq„qtoÜÛýñ6Ä/~‘Çú²¾~êAåÁÎÀmÜq2èø\ªì7v–q4”7ðw_¯›g;|2ýny2¬»õ–ñúÄlD5˜®[2–ëð9¼†˜å*ít÷×þ ×¥ns2ú ¥¯·ãÁ î{W›7}Õå3¨6½–¾ñG©Ëþ¬5ѽÁ³õI]iìçˆËò?°ThË=@/o_AÏ{¾”Ž0ïÁÛsøè…2[Ø—d¯ûmûð³&™,œ"öiÙš¿Úv‰Çq¼Öþ=Ýùýt_±Dæ—ô<÷4¢£6ãŽÛûuåÆÞ´c²ÖAêüÚ̓CsX>ë×!ÆÕ[œ*ëlE;+›ÚYÂøú^lF÷XQª‡0@ŽxC+Ï#ÄÃ=ôìcãø4<š¯^Åú:½NôÖAÚ3–׉E’²£øKÚ{ÚÇïA 2ÆÈýáÈó³4ÞçC˜Üioå±½kȀÅ«~jº¢› Küȱ‰G¹ÚoTÜÇj·ñœ‡ÝÏÁ§GC|£ÐèèpXÇöîo1¡0Æ;ÿà5Ê#ø»{ÎÆBEÛož Psãûʟ«ËÖsÈÓ[¼ ­„U“½BI@;ËÓË©÷é§sv,)m<ütXÍøÁØ<3íóyØ'ÄO§•ïì@ªÙ~i, -x4Ö3ŒO¼ÞBÃW´²°ñŠŸã×ôÕsÈ{D⃛{þö××僿æ¨ë“Œv øúõjã©ŠŸ¤¸¶Ÿ1ƒ|-i,(s]&¦¯Ãúõ±­RL§ùõÍQôô×TÓ:{‹ ÄHÎñ6ÇáZ{ÎGÌå~®Ø8'ˆ·XoÝۅÿø5;ÆÛƗ;üòþCg#{ Ú²?-:@ü|#æÇ×½öþë Á´®15sú1íåòûp6=\uÏõkv^G ãu„pŒxái¯-6¾zl|ŸqØ®ïôã9Lßå’VÈsDKÇ -0§s _Â~âC½`Ïa¬ñɐþÕ#Ï{ùS—í »Ý Ž·®èe{ŽC\oNWÑÆz­ÞßÏ $¶·XÐ÷b£}á9ÿSyŅ³Ïw‡J Ÿ¾zëgAçUÓé#êìwaǚïKØí2À~ç«:Ž;ð _=rþh;ÁCóÝõŽW$ä\ßX¨~Iûѯåù >>ŒÇøôÕ#Ï+=ÁGûʕ‚²6¼:ÖÊMÆtت$i,p’d<Ö×»\§ßŸ§žq„×g÷üìê/1ŸæÜÖ„¸M¿Þ9Û¼½öšm>~ ÿál¼ùßòGÑ:ÿŒ‡ªh‚½ŸÃ^OÍ­°ßüòI‹Ï óxò2¶q=ñ¹^á!œlƒí;>ИW—«æ­É#õöo•‘#úd˜Ã•Œç(~ /w¹ÚH¤Œ=ï8ì=b%7øo6–8ßÏøP8îy„ù¥ °GtOÏ‹Íû9b„ªG Ã~ŽÀ•®ËÙc0bHÆû¬_TyêÙõµk†Í[Öùó±s9Ör{ß0-éU¼¾€ÛÆá!}„¢õfÏø›Ø:zŒÛ‡V¨0Þsï1 íèKØÇçËIԇÃoðk¶ýh<ÏZ瑽2büï‰ój£ùréqÉXJ\Y=çþ¯Û&&Ÿ"ˆœÑáo¨,¯Ã%Ë<¹Œ}^[Ϗ‡ž”ïØÝr*xÂøZ3=˖yäzÄú§\™p=ÞÑûñ£³Q„óž˜yh_ÞÑÃW‡HîS«oZBÅ°K̒€e=n{ñ©#’õø¼Ú­ÛÓáå–øvZyæ^릜ÈÏá_ßz<‹K6€9¯éçS¸÷uáåiĔp{ÎíÏ÷2Æb0SÏظٕX/^§Å£4³å Ò{÷¦£ÆIГñ/¹åÎÖÇ-º“x=u{;;8E¬§ßa|}ee1æŽ#ÐëââÚæì>Hx„à!¹zñ»ÚÇr'Ô>òX¾Q5‘¢݈[ÁH¡·œ/‰C°Ÿ¯»u]ñÂëMC³»|šˆ{ÏO~B¾¾hÝ÷\é×Ýw\[)aôÑ÷>ÁÃ,ÝÆùi=×½¹_ùiōø¹Ãy®q/GèWØÏѼñÌpQâ-Ÿ“UkcaF -c™ÛsՅ·21óåÜXæ—á™Ò'üºï_ÂÞJ ÖLçÉXϸ%ŽŒZ¼1¢ß{Ɠãpâ#¤ÚÇqÍ#‡K⪌g;sªñ qD|€£^úólQ›мyn-ç·¾Õ¤%"½0ªÏJÜ7Dhç‘ëG~äTT!ŠW›DdŒ)~s—`oZÝÁ±~âÜÐ'ÝÞ;Ü(Y _——<Ç©'RÃOÀ¸’~¬5H×ÐĈ~Í aDWèpsO¯ƒeï4·’ª»Æþ¢v9×*wºßK–œÜì«Iž>ù€S(c;âýëWƯq„\ÃÄԏ–f¹ñk,ˆ#Ìt×ý䘄¶W¬žïS1t2îün5ÔUt^‰Wj´\†Ô®ì¡? ó šçÈÍ ±¹RG¢bá¼ã-áZMÆ^îüò½]«ÿ“GèWÞ´3—"PŽŽp¡«‡´Þñ„YsºvòŒ«¸GÎ*°Ï9o𗰷zĸälS‹`¢ö¯4W_rÈ{¬8£˜g^ŸL>47ŠpQ +è=éh“‡ÝïA›üÃَ×r–[^î]À³²Ç¦DNŸ° -7†Q¨kv˜¦¾„½ä͌ùÆú:BHåHpäˆ,óëˆ3(÷ §ÜqDÆ¥üµdækŒúch± -X~©Hz‡(êgU¿hŽ+ìî1£yª…ŽèŽ3<¥RÔÆÎ,×è–^㯞}á<¿d‚*­“Ž^„ãõdò‹¿Ð±=5&v8ž%@ñܚ!ºš±ª;½çM;bœ«ÕQ0Âϟ¼ßü;_òcþ<Ã+Ç=S°qºÏ]âõŒ±›/Yáh1òÖªÀzAÍñíêa Û¯ÔÃ9¦k‰±ÛI¨ÅsãGÓ{1Oá.uCñ{Ûâç{yì{‡} -ñQœlô¢Šýy|ÂX^żKmÅwÿ‹P"Èo-' §œÄ8‡¼4ô¶Œuߘ1™cÈU’®ïµ½GNºOäÎF, XDs3Œ /⠍‰‰¹“ŒQÌ© ã|uËmo¹Pµodã™Ë+—ºôˆ&8xž³ùUñld¾c Mò˜Ž"ž t9ͬ¨Ωj0¨{ŽùÛG@vþΛvÔ8BÆIÎÑÓØsk¹(9V×êF“RO·&± šÝEÎËníåɉ©I<†eב¾ÇÆ)?»ûˆ,;ÞƃӄBcõØc¤Tmš‘d¸—Ì7ãËÊâ݆7}dHÄ¢"|Y±a€v9Â\vø„/‰X§GkcƬø€æ҉bÝJ¦§Š­a.ñșñÀn6ú¶£OYέæç)—g,k‰£?‘b¿®-–ùøñĐú[#y>1"+– -K:÷ñ¦éçžLWÇ Ã‘ o{´'2úg^ÚõœË9ÌeY>£iáˆ7M½çŒ$+]Á#p®¶ñäÆqb¼B‡>êµVcÿâÈÑ8jD&[³²(ÿX‚w, òÖ+ðYH&…¯7MfÒi<¯<ô¬l;¶6ÍWS×Ø%v¤¦-ÒGµ¦Ø’Œ÷ µÇ÷²¦Zd Éº_Ýï<ƒ¢~p­Ä» -n{ܟ>uZ/û‘Áº~¦tðÊo¼Ü#Œçt€;¯ò X2–÷%ìÓ?b±TÚgøªžËÖO*JOß»šyhqä-[H·ÒÅ¢=$°ÂÈ<%6a´6m,9 Û¯ÕþÑø3þmlþë!_FÆæð×ëç씑]ä´åyÞóçØX— Jƚ+‡f‰¶ÌPä¢ D珌öÐņñXe ˆŒ-Cù}„ PIsNjGKcNi­·60eŒ|~ »•£8U 㕏¦gÄ :òa ¯Eº9t{ÿ˜}½CÁmiÕ(Î Öï²çpUŠ® Ƶ<5§¡ÂL¹×ìS ®-oülÜGŠXhì™ñ)çóç}‡ÚŠc’5r·¢çº]Cþæ¼éy…7Dû v {ïK¤o_—žúýšâ›:rT¼GèT°éÈÑ[[$5¨è¡©å$׫o Þ1:ÐuÏã–¿†Ðîç4Ї¯l,Bê‰}„34 #‰4Ö«¤šÛ3ƒ³¥äk‡N&ŽämL5oπi –èm‘3Ål0"hcm›ãÈ=µ”8ò÷Vë¸Âx¦cËd‹P—  "‡/cI}/{V kÎfyi8ÇxCš•f·s‰¾Ý°eæ¸ûÔì߇¼"íÓC& -{*ñý:RoúÝMîÓã3{®¾Hro ()Ô|:•¾͗8ì2r·²œÙík›Z|nw¡5Œ=½åº¡çJºüÿì½év9’0:¿ëœzÎév·««D'¶Df¹«§,yiWËeåZz©ÑPTÊb›"Õ\\v=Æ÷sî9ß¹pͯÛ/sßàû9@H2IfҋDŠ½Xd €@ìpGd–ØKSòDNÆ>Œj÷å£T8óe(é2r¯‹›ÞrîÃgr[OÛÒ®9$¸ÄémÜ•&ÙÏ°Uî€Âñ—Õà1Wªà„!$0$­̉ãóÈw†¡;˜ø>(X{œI -gLJ!óŽuHópÁA¹ÕVЊ*ÚÑ¢Œ( RŠ±Ü¿.$©r))[{­ -WªÇ S’ýx¦‰qi¼Æ×Ï]ÎíB{t–¹£ˆƒa |æÓ~R -[ËEN ΢?ûÆ^ìbN ÒÂނæ${JAh¯´mË!¿¹ðÂQÊ}cÏÁTßK³ø€q -„ûӈûä AÑ·¹“4Ì]y BsëqìRQ®Iæs­¬-cIJpL;“®1Åÿ‚`Z³7i‚³,êƒYÖ^â÷ù.Á#)¤# äEó’Q -·7˺³:¡|¯pt‘˜ªYäÊ۝0³Ë£¬<´%º‘sŸ Ì7è·q|ø¶‘Ñ£¾1Eæ dI®ÃÞø¸òÀ4áš ‰³õ€›\úão®s}yõ4»µÃiâ¡­:¾0FÒg‹îy¹ò,í„ÒÀ¬çÄ•—[ ËÀ-ጘ%º‡üzW‚”"0„ò4×Wª™p}i™J.³Ä^ß䀜D Ò*3YÜn–4 -9s‘%¼¹ }Ž’ò ¥OxÄQzæÃSs"é}ø5¬ÓÜgÿE1³Òºw,t\×7åí҉u-ÙÆ‚•Ø5ےl›‰ujtª"ùˆÇL~LÀ–<¤”PR™²a͎D.þ×ÈéšÞ(Bv–‹ 1RåRz´òA_‰½pաՔT€7ñ…ã ¥Uès–RïпN­ËÒ-¤Á…’ÎO—Ø w¨iᇜâÐeF4ѯðs§­Ï!ñø•ˆO uÈÍÜÉúp“,£×å>·G(I¸s¢'±&ƒ²õl_(¢ÐÐÆ¥œqZ?’r–3Ǒذd'òe”=Šdò2Ÿá†kÑJwiBÑÅæDߔvš³‚HÂô>^å OfV{a;§,;sd0Ò#”&n§T$ð§’v.sVhPœÏ -ºa3²A5}PI¬-ÈQ$!3qÁrVC‘´~˜`¤§%ž˜ÞÛè%JXÂÐÇCRáœ{4Î~D_+™sʂ£ѐeëàšù5¯Hß ,O»9Íx‰'ˆóI>:“šçÄv•Ô”t²©QÍíz Œô3¼É0¥C%¥>ðœs6îƒO§Ä°C‚‹„x)fÏñ@zs-=—YŒYxU”;q4ã”Ó…‹Í÷M:M¹V*` $ä…Zî;¦™çü±yˆû¸óÄ r\ÐJ³LRneZ£ƒ3Rµ—?#Z{^`æѲ,Ìr°÷&. -ç!u6˜0\î"åÑy \êxçZ ;P”³Ðïá{°ƒ¤ÒïPg¸äÅ4sEҐ“ÎT„AçÄ%§}ƒ)‡gš¶-' ´üxd)“0·þÌõ -#ÀsJä¦ÔD@’h¿¹„" £–‘™‰Dפ-*šÍ·‰ Í|gt&½îÞ«¬ôR¦žòŽ€Ä†Yz³W%Öúá z¡r×ÂÛÃÀm*²’ӝò³Âk·À×L:vÉ«,¸êÀ.™{ñã(J ˜­¥Pçd2zt0„$·Ü)Ře”8ƒžöþÆ$øèÊ« Kr1Ñ÷è1;UÝX‚ÁF”‹:€»Ñ¥XÌCQ9g%ÁÆܗýXP#$•t®ØØGë µ=*¥@-ý¼ES$IÇ r²âyd×5w“ÞÚèªAx * g[JŽ^gŠ˜D.íuŒn9øª8’Ú1ôĝʇ;ÃÑÁ``Üõ¥›€!§YÖ΃>lš ›k‚@%hñDµ. ± ³…²pHÜiüÈN—ÃYH<œ -A¢Bþ„¡¸ŒœjÙÚY4fIƐÄÙôÈIÇ!é В¼+¼j -=È©ŠUFS”û¤áĖVpÑxšÄ žø‚4÷rfÜ\ ¿—] p’eu*›8–øœù–r¿RtByCI¸‚Ù'ˆidD æ€A;žzÁ'I2×8÷U ÐÛ¾·¼¼GšøsÙQŒ#E¥8y³Peõ™.žIê›æ>Ã(T¸ ÞÈm’ Dy&T‰SŒ¦§šW™¸*֋íö¨Î(~4É@ö…ÀԗÁs9`Èh˜c^/E¦Ú͝ åJ+9 ’LiŠJ©ÙÐؔD”Dç/»¨Ô‡Ò´›)dë'-ØHž„bg˅<ÇE‘+f>ÀW§¾F\ü³o\FbC„Eæ`\ó¶¥;¬SçÞw¯Só‹*¥˜fî=2ÕÓ\]>DG¶Ñ$ñaÜ҇%4q’Ò¼ âªudŽ±.y×ؗ7sE§°ª¹oÒ§’,ª|“q·5täeWšQÌ»ôÖd …pŠ–¡¢b­¯ï…f)øî]ƒ‰æQŒ»´–ÈžapË'ˆQä>WtXãkCNÁÇVÊòE9rÊ©‚JôÉÉ £l‘AÌ)à‰ç&2dlÀª#¸ Ñs}q0о§ÆÒ{lмéY:Ñcc’‘º-tæ³ ˜Ýìn»BIbB¦G”â-ÐÅÌáûê ŒEVÆĕ Þº ÚSoþ”Ú‡‡C¥Wîí”ÂÚ3—¨ÙD1g#ñìÃ.<—c‰Z¢ÏÿdÞs©œQÀ%~0á÷† <ž…“ dª€±3ð)E§Œ“«OGdîCûŸœÈ€Ûzé{38 ‰Ä9iLD®¨Td„B îO[[bƒcŽÎ[_’ ṯ–sé{,£Â eܤŒLWÂñ̽ÁËô¼öî×$³\Â]Aâ3è¸H›Ë$­éÞÁ™rƒ ¤]–…f)ÍF”sÒ©0Šœv¥½±XOÌCJ`öÕOmyKLG¢dÞÄÖä±ÀP<‡AQU0<¯­l€—–*ï©Å7ùç¥_¦XD3ªAä«,»R L¼'P ên¦u¬µ9̒ʣz0eˆ×qÙ°ìÞCÕW’TU©h-0P_‰“NʈÞ2òªE‚À½FI‚»”6OÙ¢u… èYIL_EqØ*X°ðÉíÜ)RÅ!G¹×®îm™¹SŤO&DòÚ-/¡ú"±”<†PJ äÚU•¡Il³¨Nâ  $‰(— -½XÇ£ZLŠJ¡ØâJ?¥TK“:l’yá4ñz*À…7g‰¯·%½pJe¦RÏ0B)<ÏÉ_ˆ)´‡'úÁÐsOâYèêàè”Ë€Y éÅfM‰*W~-\8Q…=¨:æ0ÄÑ¥ö’–Ôµ PÄV†õÖÚièc´@®œ“cATwàÚïUíj¡iËTÝR`Ô+w'…rµÓ=î…ÇLúÆew» Ïbæp©X$eÚ ¼[ -)ƒ+Ê7N#‰Ÿ*ïÀ4x8ãñúȽ#ŸjZoMô…Ð`nÈ5W,Ó>û0±¥SRá¢|f'žŒþñpJåNʕYl¦ÊÌ(~ÏÜӞ8©+](cƒVJE×ÀæåoB½(Gèy¸dÔ8÷1rd!`ˆêeÜC°qÒ΁¾‡•ç ê0¿AVW ‹N ¨Ÿ˜Ó¥C --¦>žÇ?Ï¢ÍDÛ³Z%Qj⢠-Xý”û2N*¡Ò^¸È<«PXŽ†tS•QéWÃHå-Eæê((ásYƒu€ŠŒuë€áŽ m@!Y­üâuUU•µ±8»œ•T¬—ø¨„±)sÜ€¹ôsAµµQ»h)oxp™P¼½ù–ù¬°F%Y€kE6\b† sy§¦rå¡ì÷váPƒÔÀi’½zD{ω)Önnƒ½¨©]ìք,x´ØÑ8OsG}$¡t“‚К〬}Â{hÐÖM‰h8¡î6(b‘“á[z©(e¹°3…Ù%ÞQÄ­ˆ2J紂(qÚËgÍÛ6æ>+ñåX¡Ø§Eȕ÷™QM'|X¥ }‘‘“Ê>QÍM;ÎàûYr„¾®;I±ì‘¹«2’²¨¢Z–zÓ&bQ§HÀÜ_•´X×¾&–ˆL%æaÙ uê\-Ìò¥S™×½(ÍÏ6vÅASæ/A -e™1‰Ž2çòÔ»z[.(ª‚öCô22‘Zásμ+ßÉޔ¦ÿ _ež˜[îƒLa}xó;jˆ”h‰ŸŽ«ødgå -eª%÷¤øB\$«Ìúê퐫Q`(]† ÄÙrÇ+¸KÉG`T·ÔÙ è -¶q[‚"ðÒÔ`t^`ݒòsâç ¶„µN„îO ¹P®iîk²’X @A9ÅYÐÚUˆªe^tS éúr=™$ Ì|¹P-# Òïg´iZ`¨—@ŽnAL„ƒ8EÆ~b{ƒw؉G•ÖbÚó€ç¡tž]|JÅ5~•›•MŎy !{4ãƒðµ}´S… û’nXmÄc‰XLãÂaÒª›JZñÛí+/*U ÂbÅ®1£jŒÌUƒñ©¯m¨B9xw)%ÄçJÏÿ+Ó³Ö}{Ӗp ^TÁ½f3^Ì#½&¤¼SŒH©@2Þ¸«`©«éÝõü(£Æ!Y9B;3Š*úš'­DLh¼ ¸öÙޒª+Š&B`Jª2ú*CËH3O(CÚñLlLÕt8gm€~ûCã„#¦‚¹ŽùÄb!5a˜E ¶ËÂê…pRøÌs2ô’/€ÞdSœ-ÐÛ±xþÁ<[._—xR¥^WÃ|A¹ŽÔ2 -ì³ …(I'6I^M9% |þu>†Y1¯óÎÐÁ’èwßÁM›÷½ŠVV`/<܇/gNþA 7»¸ -ÊRÈQPþÂ:ÎRŽ¯£È' -fZ¢>r/ڑ -•h¯k¯S.R‚yàšû×yÝK†QÌ)òþÂÁ™””UWC - -ðF\³>ç”{`uBJE^I(‹c f.•²2}æŒìç¡"0jª^Uš:nDùôpžÃèÁ™šþA‘ûÝîBK5=°6¿úº÷"ñ±Ì§bœ’Ý’èòSŸ½RUWÄ_+8SŒÂ_+¨¼€"rPoà¡¢• ¯ ¨4DU™ ÷R°%ùôq:N,ÜW`tk©öª/qº¥u'B‘FáÂêƒ/Î}} ÆâÔÔrßãk´ÊÕöü5Z”ª pEÑ»A4÷q¨àòóu¢ušº¬Cˆ‘õu-¬ ÊEïú£‰¯×7_ñÏuo®j×Áµ)¥ì匲_`v_Ê+ÔHà>š•ùdf(Ó`%¼ÌšÁà™ÊÄ×¹MÈmqtU´$ÃF©1]”²¤ö%]"àj -8`5Ý[p=ReÏ„ó¨€.‡ª0þBÚÄ_oaOd›tãËKS‚ïBŠæ)Éâ.Û:ç‘(KEWæ{6Êt¾~ ó7ö9Ž%½šª>ø{%hV»¢ª,*Eâ/³¨zc|›óÌ#¡3¾ê2ꎡ3¾ÚÂP{a‹*«TuÆ¿4”GǺä+_ª½rîoc¾ˆ˜¿ÌpïAt=Y*ƒºÌâKJ½Š†eÏÂ%¥ŠJv!C%$Äú%Ýf=‡9¼TÚ*Uö§Ôßî«¥µ\Xxæob̼vko°Èýˆ|íÚ¥ÝÕ¼èZc_O`ê[èvj÷†=w“ÐmE®1:ø}†\ø`ʽ‡:ÞxæêKé î ‹Ê+ˆ,H7Ù*_ó, 5˜æúNi¡“‚‡ÃɅ‹{G¡k يJ…°4¬Dãí£Lm¨úH³œ.¶›ëC¼´åқ?/<œyO–úDIÓíóÈ)›•ûêõ<âðÎ܆ÕÚ³2õw_ceÀÜïM¥}f¾R§;gªðV›D1* J%Z=à‰ŠJ-† Ôà9Œîk â,– õ÷хÜAŸ cKF‹àtgt #¦ -Xü૯ÄìÏ=Õ>žLù|!`TQ#9Õ!ÔûSçÜaÂO/Iá®qph»[0­Oju±çû`yŽ0+ë‚àážfLªóA/áŠ\ ©>\€Ç’ÝhUyëög­˜û|ëÞãìøÁàt4Ÿ?ëL&Åh€PÐão‡ƒg£Þ`Ò¼ÜÛsðýâeoÿòé'ß^âo,±?}ÿèa¯oP}úÉÿ¹õ¥ùöã“Ão‡§~¾ßëNzÃAg -endstream endobj 49 0 obj <>stream -ôvÅOw[·ß\ôæÇ=ÓÁQïd:)Ɵµ¾0 ïFÙ6Ýó^ÿtT °oÝy<˜„áŸÉÛ˼Ídrë³Öï½®܃—嶯;ý©küsïtr¾¼õ sa›î¸æ_lÂÐ΋ÞËóIý±Qû«ܽÇÇ÷N^gýN÷|Rü©3˜Oz“£î9,àÁ1«=ðÞ©iºj´ÐèªFºÇLã›ú3øfC†ô¶þÞú±­ê÷ucC²69ƓÓûÅë^ºUŸ2姮jÞOúÓQ큎Šñ´ß€#Qû«ÜÑp:ê÷ú—çú̧ÁöµW÷¢°e¨æ‚QgϊGéxÜë öWÎcÔñåóqÍwÛiîsúöê_ƒ58"N¯ðŒž‹ÉꕶÁ£;Ü0Vñ§o“™D\ÐzºÃþpôåÏç½IÑà”~Û_Ѻ|›³ôM9Œû½É³No•ùbƒOc+K=u.Ï,Ò~&o¢Ê¿†W`ÃfùI1zY]7YòjÌpnÂ$}ÐÎ\ƒŽ`ŒWí~ܹ_œµî~zÝÃÒí k2´M žü½èNö‡ÓÁ©éçþp…tn›¶“qýá–ºª1CHX“¶)ømëBßvoezL¦£“i¿tëûÖíÃuIã_u%Ã[¡!F£L/žv'×E¶?se ºÔ÷0ŸtÆÅÃQñ©™ðË{汫ê`x4éMº+ŽøR4Ñë7™ÔÒCW5TؖÃZp•Bü‹š¬çz«Z[î%k´7Ç"·3Xí”ӝrºSNožrZ?R}§œ^ãÝåôlÔ1êUÿÛao¼êiý͸¹êi}kØN;Ýi§;ít§î´Óvº`í´Ó&ÿýâ|P ŽWW®)òo¢@YŸ£ÎioÚà\¦öWÅ2N{ýNƒüÈMdö7‚+>Ž.χýáËúðŽ-®ÇÓ[tã«O‰[ܱÅ[ÜN¶ø`4<í£Àx#ÆÂÌöŽ1îãŽ16`Œ;‘qûEÆcÜ1Æc¬Åu¦ÿü¯q÷¼ýPôºç¿À?ƒbôb 6‘M~ôº¢W¹åÖ-O¹ÛtïcÓéݦsã«O‰Ý¦ÛmºÕ뉩íól2´]œçFÄyþqØÿå¢3.FÓUõÇ6)Øsm]¸g£!݈€Ï]þyóÉ®Ì,ڔ©CžZwPõÅíë&In.ÙÝ.pe¢™¯#4*N›ÕàÜ4†ø¡+G_áüm+'ÜüËÎúÃá©»9á¤ß龺۲ áe§Û›¼ý2i7‘µ6é2ôÖr“f£Û°}÷–è&o»-O·x‡S{s’/nhҐ™lˆl2>ïœ>ØfF¹åÁ›ÝèT¾ªþlÍ>wU«²~ìiïìl:.š_ñ4÷àõ«å€ o<*=tUc¼×:¹%µµ'àV*çM'í~×í¼IëßuPôÍ·f®…è‘+c»¢>SêüÒ»˜6qTû®jtx×¯ç¸aÝýžÙ×æ"«û–‡lÃ=V»Û5W w“o×¼YJÄÍ:iumóýe»ûDwÚ6 -h;ùìãÈg»‹F7Æk²ýnûa½Î7,]n+< - .³\‘ØÏÎîÂÑ«ÑÆ7åÂÑs´»pô:̍íäs(ï.ݝÉ×äLÞ]~ýÏäÝ%à»3ùšœÉë©Z»sùšœËÛ~ñðîðwŒÞ¨ÙÞݾ­“ôA;³É«eë¯Üi±©wîìn„]8Üͽs§î}4,<®ç(Û¨Ãj;nºètõ«élÔñÐJÜ«>yHí±ãǼ†Ú_Õø™§Ç«ƒÆ6˜Ë¬ÁH7ŒÉ`êۓ{ôzs™›Q èF$šÞ€“}[ªçìÕ×6¥|ÎÞöÕÏyzs’Ôo‚¡qó Îly ç;ì·ÍñNs†øâ#]ï»! -Άñ’íˆi7HuÚ`é?Þrõs[7mÏ­ÅX6lÛm‹üsõãY1zØm¯ èÚ×mö'“DÙ$Ã.oÕwü!¾oh¹-=tÅÌèátÐ}¾É\h{×a[·’ÖÍZ‰v+ñZ®DvÓXâþuBý Šf¼uã³·å\ÃݱåfŸuÓL6ÉâcǸÕâþZ:͆éŸ[aöÁðÉ{ýþÇX‰›¨ž­¹_7l)ovDïêÈV^¬×ä¬ »XOî.Ö[¸Œ¿Û̋õþôÏÿ>ïû£&¡ñ×ÿ^=UnȵzM¶Þ¸Vµø–:§½iƒÍIí¯j¶O{ýNƒ -›¨…nolÏGŠ ¼æ³¶a¥ðž G—çÃþðe}Þy UÍOÜhž¸½JÛÇ Ä|ì8áUÈË[ñ}ÒôšÍa4€êºOֆñ‡ÍëÞúrõÃL7µ@Ò@ÐÝU¨8| ªlq°p“ã`SN¸­½¶h;ê¬(<sŒ†÷©\íE*MÖÝÆĬœÔŸ­ë»zÖW¶Ö`}Wã ¬ï\:8ï Eÿ¨èÝF¶ù'¯j´+ÂÈcïàÚ£òŠµû½ñe¿Ó-.ŠÁäIçr“϶-®Õêñ´æ>²ÒÇÚÃß´r='õmww6896å0¬?[¦lIÉ¡W…npÒñI}£×Æ1;lS˜FýÙº!yŸŠâ—úæè³Þª€ò™`ÃþÕMö`8¨?°N·;½˜®võÇ˟¹ªAŽ -®ëóô´7é½n2JÿÄU±ßú7¼v;ýî“aƒˆ÷艫bý#0žKê÷8–ÚZ~쪆¬V¨±«¼AÛøªÕéÿÜy[`戟tFÍdûÀ•é‰õwR¼l"¸æW¶ë«õÃJýðêFT_? /œêØúJ•¤Î wÑä¨þâCud{jÕìe[¹ÔÝE.mŽjÖ`²6̞³‹\ªsP^m¥úí¿È$ÙÝd²Ä¹©±KÝí]jr lÊ·‹]ºÖç\}x³b—š¬»‰]ênoìÒ6²¾]ìÒ.vi»´‹]úC[°tb—ºÛ»ÔääؔÃp»t½™å͈]ênoìR“¶)LãÊc—6ȅ¶‰¡XM&¸ùš½Ê ^«åu›ž&±ƒ»éùèÓ³µ÷Ùí*¸Vtd+¸ª¤¥êk¨–ϛ(©Ñ#W%ÄÜÐj§ÏzoŠþø²Wô†9lqèù¨¸® -DÞÐÐóÞà´8ë VV/iX—Egr¿I¤kôÈU tc_5Î Œ±_B”ýVÇØ×<1·&Àž5ˆÕÞEØG–«]„ý‡Y-v—'-¦Ì¿IËüÿ®ùlþÞ5?Ô¿Åí<3W§Å­¯~ݤ5}#Lâ'+Mlßæ -á&ng¿"­¨ö mbím¿à®K·¢=®`zÌ#›ñ‘Ͳ$oŵvõíg¯VŽÄ³m¯Là¯?¢^í҈äFŒhÅt–FÄ®Pw©?¢ìüÕróΨ79¿(& ŽªÍ=”›Ê¼›x$oo²ëZ‚Ç ?›7Ñ!´ÞjÞ°‰Þ¹ó+:²sçïÜùµG|­Üù 3:wîü;±˜µsçïÜù»’y;w~µ bçÎß¹ó¯‘;å[pèóän3YwçÂß¹ð¯‰gÓLa;þ΅•,ämÑï®=KýÞËó‰i°×…¼àú36ûܕÉ\õ%®ÞÙÙt\ FÞ4à(s^ÿ±Z&xÔ¬Ré¡+“YꟀÓљQ²üÔUÒ-©­=?tŒÆFLÚ ¹ŸbgUÜYwVŝUñã ±¾Äº=¦ÅÝ];Óâ52-Z-óîËQQ îi¯¸kÎÊÞËáÝ×½a¿˜Ü§w‡£Î`UìÂÎæxåò[Zß,\ôÍ·fÇè‘+ãYýv~é]L'+꒗ÎzàŠÍW÷{hœ8„Ãñ„ ™þ ²tèëMÞ ®_]#厚™æŸ¼:Q£ñp¼¹4 -Ä:à O^V°BMß&céÍ°®ÑâÚeA­oaÛY¢†;KÔε³Dí,Q;KÔÎ5/-ì,Q×ÃåìNÖåÌRhÚY¢6MÑÞY¢Þ—%êêŽÃ«öŽßûڑÓq·ÁÀv#ªÎlk‚ûM0¶¬3Æ KzފÊ3 ªšì*Ï\• TDRy¦Áí*Ï\§ƒ¹q@çÆÊýÞäY§·Ê!·Á'òº•üvgò5æ÷»3ùúhCÎä]5¸ =“×Sµ6í\ÞÞJp%~&obœEóU¼a“¼«Wёm¬wC«£uÏ Òb°»êÌS¥~•¸]åk*z|¤ÊWy0mK‘ŠúwŸ¾mAôöê_ƒ­8dJ#zsu#ž‹ ¬´QqÚlWmç¸ÁÔŠe<Åi¼ÁÚÊ;¬ã ›ê­¸%üFXöw -æ Q0™LnÕ^Ä?÷N›ü¹æWuh2Ñ`hçE£À9ßþʄŸnø0EÓ¯dX{LÕ_§ dó+Í ©õvcÍ7éÎ|³éJØÎ|³12z¶uæ›#ڙo®çؙovæ›-˜êùf«gjg¾Ù<óÍM5LŒ¢3î®°Eݠ耳Q§;éô¿ö¤ ØÇëνÙu¯q6˜^<5ÄxÝ$C>~檆˜´ëW¿:錋‡£âÓbÐm ÁÌÈo@ɲ‚ÍÖT,Û,ÛȂeíú—!N† ô¬áf¨ g£áEƒ£[ׂ>ŒhdÊ$öb::™ö ‹ÛhSê®,R…¢³)™žMTÍ2~¯•¹³970ÅmoÈ`“¡íB7ÂWð}1ú¹7:)úÓÁËã<6)l°ÁJ݌ Áº!ƒ“šBâ†ztêG4m®C'Ùyt ws=:°-?†Oç*Eè~ºÓO¯X?m´ÍvêNCÝi¨; u 4ÔúãNC½ÆºêÖGÖ/š²¹:jý1îTԝŠºSQw*êNEÝ©¨×_E½uï1KŽ N½ªŠ0 ão‡ƒg ^Ž¹çàûpO`ü˧Ÿ|{iñHûãÑۋ“aßti¿8탳¢ -)ú½âŸÿU ö 8ErÖÿçÿîžO_›>š´î}úIÒúñçO?™Òÿ~7ŠÜøSø‡µüïoáÛ7æÓß ìç–l=iýõ§¤uú)kýø~3=JÛI’ȼµ—·.Ì7ø{øé'{þƒn§Js_áð5å -?§­Ó o¥Ø0oùßèl“C+øs^†_¨9| Ÿ)>xˆé—èÅQ—MÛ3ˆ|f½€?ºÍ%5þ•¦üaWá¯ý²šïeöÝæ¯}9|€¹’-ÿˆýu/³ƒÚËì@üoÑ#™#Pf鳓tû»¬¬ÓÖËQf|ÒŸá\íå0ovæèß}3={ 6IXkŒœ·@ç\¶t.eëNjRKΪ[¦ªµß­‹s¿Nž"Nœ…ý}³¿ƒiKÚ:Z„H¨ »ªÊ3°‡SÈLDÛsT‹þúyŠfofbËB»ð°›c‡•f:êAÔ1šæE3ÇëϜAœ2íPYÌÎË«[¦|næãܯ‡“ëòÌáÄÝþ¬õã0Þ{†S%í4—Lz*ÌJ18SL™*)ƒÂÿìÌóà2¼ñŒ‰–ls)îÑ=øÌSX{îG˜bøœ›îᏠY}4? 3šEwˆ#¸ulN°Iùœ¾u|ÛPAgJäYdØØß¿Ñåχ“PÛäÖ1ð÷c×3@K¯¹o¬êXÕ¢fsè–÷–·…JY.ëöö»E¨d[µ˜ àÌɝçE§ÿ¤c0¿F­Ûæ Ï üÑhõ{Ýâ¨Ûé›×>õNÿT¼u/£Ã6jýÜ^ãÉ»ô‚ÎÝ[ÇæûÃa¿ÔôÁ sÒ/M{§NÔ¸uÌç>xs9M"Tn„~A~œ¡ªë0Ô g8é J`¸ß™L/Æ(0 +ƒÄî_”ڊ¥RÃ&5KQæ*þhÃlè„åiÕ»­“v¶@¨`‰—*ì~7¯ãõš$ Ü¥ÚÿÕn¤Z‰TÂËx*ñÓ?ÓA¡áš+UÁ[R{Úïiw>À¹`y?ý%Ö`¤žO¼û"ê |@v¢ÂߥǴZÎìÍ/ÀiU™ËfÀòø؇ZÐDµíÁ¼Ëþ*,I™ãÈ.¢¡ÂéÆ*㱯)š,ém²zÌrõ˜“•cyyÌS;Jføph?"€ÿÀ–<ÍÃÐeõÐQvH 'f¡š2²Ù¥_dFãœd¿ú13•æGî†Ä݈7úËW g!kl<¢XåfÃ.ْG+F¨Ü•!Íý]ºTq„â]ǗΌOÖ_ºb|‚V%£UÉh1ŠèÃ{\•²´*uù©*†&K‹r扊q7 îƓ¸QÐß÷»&åÂ]&í2¹p—-‘r#RnD4/ô÷}®A¹rÉE{L®ÜcUãKÜän™q·î’ð÷=.?Vš.YþAòŠQ±ÒlÍ<1?nÇÂíP;÷çý®<¶h'±E;‰-ÚIÕCQv(V¿i¹ÉpÞç’c ·[´…ØÂ-T5deø—9 ƒþâpˆÕ½—%f%€ŠyqBÕüh艹y±?Ì —˜²«IÙµ%èÏ{]b3C‘3C©Ø-3C‘«†¢ìPœ¬ë&ÃýyKìCÏIl£ˆÌžI;眱 ;Ê Ë9S`‚ÍÁZ;­fΦ˂²¶KhNØA¡º¢­ÊÚóvÂÅxç$¡Exy>7—Õ*=jó ý#nŒJ?^žT*ôÎÌoõúµýy;ÏA¤0s„ô‹yÐaí¥m‰bXÖf*Õ²•µS¥4¸ \£”Zàí¼dª¨öàQ@áæ\v*`4ÂFÀ¨¯Ka½1w|¿Ö|×ÿ< ¢1ˆˆ@xgiw°ÔºgΝè<]iÝ+ù¾NžÝáèÔð·PQ‰0R‘±v*RØm"OÒùMrpïñ#ÇG^œ Gö7Z¦fŸOŠã{ócÓç£ÉÛ~qÞ^^ÍðÚO-›âë˜ `Ó§´%,‹¥yÈ‚„5¨<õ0³Ll#ÝNñˆèîañ¢ @xׁEm>¸•çhÖYÖºGOr»B¥[9aÔÙìž/ÃüÖ" …ÐÒXS¿ÂÂÈfiT×b³d™¸sƒáœÚx ÚðÅ|8({„˜/‡XøTb^Œ,z ϒ¦ïÚ¯ó.©f^ã—Ý&¬³ ·ð ÞQªL)X¹™ŠÎÚÙÍ}@1 šc3ldŽ×”N͈UçÚ,˛ã‹+™e|’.ƒyv<Ç°g9Ö.6Ëì"6K y~9wâÖrÏÖà…z²lJüIƼ-äOøT"=/”1/lø®ý:ï’ræ57ž®pÐÏìðXµ|/Žï=I»Œ¹]–Úï,ì¼tlÙ¯zêp…‡WAòÎ>ãXýQÏzoŠþ³btVt'VA±šÐ+¯WÉv¦u‹ù? 8ìܟ¢®±+WצÝWÅ`VQ› Æ2 ]¯Lf҅ĴYšè ¼ž©NTË+ËR®«ÜœK=­,¸íD©í -ðU~Ähñ¼-†q-:F{çiøl˜¦áiªè0€o ž±Â̪q,Pæ04»›3TöÓ6Úⵀ¬­u*-COrež¬§ÚÿØFóÂsè$¿Ò«öf;³7Ûa8e*Ƶ¿ÏÒf/¦Ü^LU`Öð›>`ì‘ùb:$Œî÷gû“jªD²8¬À¦Aåä)}< ºï~À*¿‡ö|)¿)êDè݁]ÔïxL¯ƒ…Ë\+Ã1Â9©°BL"U@‡Äu;Kr4UÍ=i™” --q$„“kšãOUâ9Z!ćóï²=ÀfÑë÷JˆÁÙÇÂËg¿—‘ò›Þ]/ÜÔ¸¯4Sžæy˜Ú9@x`/`³ßÚJŠœ@f80‡9ËrúìאùÖV\JçÄü7å»PÌ`¯>ðv˅K[2kIC Å,ÆÌ`º¦¸½Á«Îôlüsçe5‡ÿ̝™ÖBKó 9aÖæ”p¿”AP ‹Í¬[-˜„¥‘&ö}è_ –K!Ëd VZbvW–g’!“n3ŒÛ=À×[˜á-If¤1êмOq8cìwn¾cÞ-ðdÂZìl tƒRk¤#ã¹h"SË~r‚­y«Ì ›€­É à9@o‰äAh¤í4–OÀ=¡Ì‘#î\ J ®,—'˜éU -ðx̑âðؗÑwwÜرÈÐŽBßqæÜ2¬8GZ$ðÁìÄ<ÓÇ -#c¨9âkE߁ò®/âújv¤J_¾× †¦)L/=m×RiaY6ÀÁ_"2XI–$ŽsÝ0‘¦ßæÜȔ‹ -· œ¯Ìz^éÑ -Çf¹hjàB¤¾©y‡¡‰Î æ3<@m-3KSÿdê”P¼ Ï"«6ëÖ°-³–…„ø5xKæPò6×Z ô°¨ßôhˆ°Ù—€Y&BÄCñ0Øzu¼ÖÍâç™(íÙè%s؂OɨÖv›_@®Á÷p÷íÄzBËìJ#r¥á»Ä‡ê¦ƒdô‡wšìKÜ÷.*!Ú0-ßÂètij˜N@A€è-¢Ž8Ôϙ¡XÕ<¯U<<ót.ÿ”ù“™ #œôÕ¿•®_ô´ë·ÃÆeÚá1ï ‚áKèiúê±À½žv}+÷ݎgñajZq©ZʈdZ(8V¹JðXÕ*á7ãX}Øë_T§°”ŽÕú‡$:µ¨ -æ܁¿¹ 07Ÿ1ޚ`‡ >[6àž­‚EϞ9¶N’gè‚à°¸/"ئ$³(ÌQ™šƒ´DO.±âKg·Õv ¬Kâ¡ÃšF:U)†g˜sŒ%àvMáÜ4Ò¬$tUk<—¼úYmv‘9)ͳ9F¤[¿­áýif5%iä™ï5Ërfy¥Û‰€ƒ HÅÐ)ËÑÞ¨˜H²ÏrÀÌ1ê ì}øh½.3Ðû”¥MÌéƒ=~H6'æ®&¿ó¤3~5cyCïK@7¯½Ÿ6ߋxÊ©»ñŒûAùGÃÀöàg|ŽfÎ.$M™²2-c ¬4l[*DóºLLÕVhŸ-Sµ­M-<«Ú†Æ+!xRzXDɆCõ¨=5|bBú¾Æ”ôCòφa;ô1ÀSrŽbda3Ï _-¦d t‹¾Í2Úenc˜ŽdrfOÁ^a‰’æc.t´€ DcìBÀC<-0"f Llf¸Cï)â{QâDÔß'¢aNä‡Nœ(N4KµC²ïf%uQ†áX /b™ŠÈÁ€ç¨¼DIÇ\â{DI°ÊŠy!ƒ—‹,Úà%Q2J–€0Ԁž¨zQÒw7"¤Á¨-îø;QqŽZäÛy:CĆÃT‹ŠifNv&Ó2—”æ´L¸.ÑP˜!%""¡h§Ò~=ê@ °@¿Cô˜‰þõñ|7#âù±,ŒÖbŽ¿ñæ¨d‰—ž>"âÅ0aqU¤Afв4+Oہ˜vFnã:>FÓv¦R©æ@´ °@»#ô˜‰ôöˆt¾“éüHÆjÇ߉ts4rg5³^÷˜t1 ÈX8üíæeF0ÍÊ -ø¤,ÓÞ/bv LED»@´ °@»Cô˜‰þõñ¦¥nFÄócñúÑ:ÌÑw"Þ•‚§‘™¿Leº$3æF͜$âUÞ6’EDFúKŒ‹Æðœúf ×Çâ"*e©.I‹ð×ê{5øj´;¤ðýˆDEŒbxŽà1¾þ ‚JŽx$æÄÄ#˜"ÉPžNЊ‰GYL<Ûüs$Øÿ‰çañ"˜"¡öD ÷ÇÄs݌‰GCñÏyæà‰7K¥Y0&ÁüIlòD á*¦Ia1õHVó:aÎcvßcÚ("]ÙñZOzwL9êcL:ˆÐŸPGOºYÍ¥Më`ak¹c:l>'IŤ#‘+& fþAÝ"|tÞK4nà'ÂÑÍ{Š¼–¯¨ŠŠK‰^åD*Cë»‘Ì ªI^ӕV8“fÀ ÜI†¡V8”`Àk¸”*¨·”ÖU¾¦2´¾· RuçýMPei<7ïs*Ck{`Hó~'€®áyª ÚRW¹¤ÊÐúN)šsKpÇD.Í»¦ÊкÎ)м{ - k8¨*h¶\2©ð\•¡õ}Wæ¹ -ïB×ð_áss¬2´¶ ‡4çÅBhs?VÕV…ó®ÚÄÅIۑ‘)¶¹¹"™:26•¡õ]]A̎lN‘”Íš¸»*¨¶œÆ~°ÚĉÓe¯å ‹dæ2×òˆ9ºLãµ¼bT«'C—i¼–Ã,’ŸËD^Ãi¤ä2…×qœE‚s™Âk9Ï*hVOhžáëøÕ"¹Láµ|k‘T\&òZþµHRžáëøØ*èVKJ.y ÷[$!—(¼ž .ƒK^Ï Dã×pÅÍÓ«–X\"î^º —h»†§.¾%º®á­ ²p‰¨kxìæéTK.u gž—K4]á$ÝM›;õ‚ð["鎽y*Õ|K$]Ãç„ÞM×ðûѶDÓ5|AÚ-u ÿß<–uq­Â“‘­È]+#úO£â´7yÕMŠê2#³y°â»°µ ÜÇC[-‰ç¹½&k!1à{[~4§®­­`¿šoæ¦ï.>y„îç¶ZÇà üpˆUŽè×è!‹éÀV7Š^Qî€ë}"LÑHÜlÀ ÔâÀ0™³ù•YñÜýƒN -ÿ¸Ê=.v<ü¼=µgQaÛ¼ÔÁù¯>³Ü6µ¿ ¯©#~k/à¦øÒÿZŠí1*þâÄO:„®ažÊ_ëÕ‚Êìf”+xöôˆí½¸wôâÁ•’PÌT Ár»8¸‘—àí\(E0a^$®/&–À8°ÝÔno,hSÕ TWDGÚ2BðjîëX™ýcÔÂvngs…¥MPt]¤DŒ¶"@`ûÎAðÁÄV9ÄÄèg àâÛû(g±T¡Š¤r :êkæ*'UÁ“XÞz_…+‘¶f£§ƒ2H¶Nõ,j7ÓÙ:ÛL·…Ù¶P)$’3RC…Ô–ôJoH®gÃËï.K×ßVVÅo~ómT7D¤®°³•9íÅvÖDô™‡Ï{q£=‘µ5Ão{n*€œÙ$KüWã -Ÿm¼(~ÄFx~âãð4beX‰>†þ¹o”ëÂo%4=ĺ—ÒGjBBOãA„J€H=‘#® ú讧°Ÿ±>ðE†eÂZxŒ#H‚§ wŸ‰j, D£Ïîa|ðft¯¯{¹íTè‰o”ñ>ŒVX?ûæè \”?ºþø~ÆŸ8Ê"Vø† -}""ø¾‹|AàÉümvà‰Ïr —Î ½ÊW-j«Ùì%KñÎ^ç»/—«/ô)xQ&nLôh.¢Š¦.¢>Ÿ¦Ú¯†h%ÎÌNºgÑSéSz˜•—ÁüŠXV­a±iÑεáa)”ºµQ°Û__úùÑÑÒ[}? â®ª4ÅÛÐs‘Q»…þ a2ŒT®…B³S†:Ü¡ž3´—Z@ìT²4´É%Ôc!½ª‹ ]fÞ ¥ ûB,ЅŒ±ð&t1•ÉvÇ7¢{,³£ê.)¬~çÇ'‡ß=¾ßú²u»Ûuûű8þ¬…Ñ•fêÌæÇòìŠv’14™¦Z -kGIÚ"cfï{ U¹$ÇrÍÚÈg*AH&À—eÛ -ËM2 \Ó+]IÆ,Oà 4áÈ 0 >[ÙÕÐ-UðS%~ã.cΡ´NS§¢™þ° /`ÏÁÀ߂¿ZCôJŠå¶gGs0?@»ÅÍ\1ƒ"vj‰N ß0mó4O`if)ÎÜ\§aãžÌo:è¤L%è´{P¢˜:¸î[ , -n+Ò0(+p5i²õۚàæ! 3åNÌ÷sƒbP¨_´$3œîtg@¼d<ÏUv3”°¬™ÃÌÞgo%ͼ^}æ$s*˜ò‚îĽøÂIxá-¯ÙÇX‚årŸÕvì‡CÿjF’yÑ-B¡ZˆÕ™5á·ª©Û WÑ"m -ØãŒÄY»ÐJ¹ôî„z”Рé´ÕÜWzÞshð&3Dãf^=c‘dG£Ô‡„¤÷йM=NœÉ%õ24 ¥Yìn(ïMëI³’…—œTëÐÒꇩµ3Kj•[>~õē/†hÈÝ÷¥OÍHÑ`Š«æ¡øXUË4«!ÇÎÙÙ_€sV‚o—£´ÒDUq3DÕ£©9 æêäûÿ}ê@‘Îg#(ºjAY›‹—¹ÂBá™5ËBÀ™°%¸µdÖ7ɘrò*“2Ø×$çZã<ÚÈDà0¡ |%F>ÉSs€µ«Á% P+Έkš +øšÏÌÈypÁ!"ƒÀôd]ɝô¥E"Áålß -Oåà[5zžpì$¦»f¹*p2ñŒÙ.Aµ@eO:a¶>`®Ej«Qc0qÂ8L3Tê“ T•ñ“—²ª‹º´É§.2¥áClÍü¼t™ÃȺ¹¹³ákgÏYC±·zVÛ -`œ.ôÆ]+œ*„®î> !oáÁïքŒ÷ùïð Êìw.]cÂë©Ã澃‰ÞÝÈÃÕB>ÏìH€–[—)˜ú}—ð[Üg ¦Çã/ÒZ-Ð ËӀ¿¸žîÙ+y½Ajö+õn‘ö¥(ß̍@¹‘“‘K´ý Ïëcx!e¶êÑ4Ç+UfU´ïÕÙê½·òÆÓYei•\Dßý2*-²xV¬P¿zñsy]—–¼Š&»¼þ*V©,/É÷áB#ڋ -fžö²bΡ 7d/4ՕsÞà½szz­÷Vιó†áu: ż<Åøx#ÉÊN' ¸UáüdI^±LhZ.*·e®+¦*@ÑCgîU¢âUôäÅnøšÍã­E½WŸ›»ð¢"ü ²(ÜíÊoЯ/Š7““bTôºçLJ¯¦ãE¹ç¨sdiÊPÑÈ Îjè 6j†ÄTŠŒ #'þxoё -k& š?Y5\K‰|«0úo‡ôm¾V|£/c»ÓèÕÀ 3³-~þTƒsYÒá¾Ò·=úZñ¾Œßßdp…¥Êð*ËV&˜Nž%) -îª×ß_¦­‡×ÃQoR Zç½Á/Ó³þwō”Çƹ)‡KEè­ÎÈ×ð%./‚Ù‹Tnoÿ &i©¶uÀæí”eM@.ÇD“àd”É̝!xcÒ¶©àp4d˜‡ ñ‘Ü^)ÒÜ:A«ÖèÐ*Ð{¹…X5[F>˜ 4jf4u™&öžFÎlfŸ­_µQ:ˆiJ¨y1zU%hØ*4<EJN‹ -²-àwÿ.Tüã—wQ˳·TúFÊÌ\ÆÃÐ\l‘óÀtՉLæ¯ÑÄu $̋ÂpxGo+,[MŒ ÿ9N–J™²Wü [EE%2CÙØF¹æ¦?@;'v'fèÒ:™á¾MÔ4#„#g}ñZePt€Ù{MÐæJ<Ä»¸> ô÷Øê{îÂh.hK;„yxb}'8#f¡0)@Th؃åÊ ¹ÚÀ¤€cM´¦- 4'èbUB›N0aHÂìm½0Áhç aæ:…‹¤­í6® 2·¾{Beô:XÍH騜¾L‡~㽬R”ÛGX‰#†/‘ú…TÚ<ì;„X'ªß¡‚œìðlÊáÞXžÀÍ&(éb¤§ŒÆL݄…1 -ïTL9Ø7À¶bƒ©!Ó'5[D*#b+#ItÌ{PboüFÿ¾ÊÝuŽ2۔å9Çë%3–ƒ\¦S·`‹¸3ĝ·oWò20>®ÉÍÀðYÁϼ&G³Y‹§Ùôö5¸ZL—˜¯Aºägƒ”¸¦¼Íœ¨kq7óÜZüÍÍÎB›ó8|nŽËhŸ3âóZœÎkµ¹Í•‰ý&ît¦ë03Qçá+x‡ý¿î§æ›hÝ{|¼?2 º_ ŠÃމÙVÇG¦ezü°ß™ÛÁ=šN}Ü¡-˜wÑÃxÎÀÌGW—ãÿÜ—wx͗—©}¹ùŒÿ³ÿ–óÚÞ/Z¢ôöZÃßóUµçp5ú]ß l‘ëAßiсbwZ.Õ$؎˜ÿ”€âcgÑvÿÌouηÅÏÔºÅÊ_ÅÜWø/lCiŽ`m÷lHe¾qˆ#d™i¹¥E²`jsû›™Å£É[3aŸ~rçOƒáÏüíí{ý·ãqçøÑÑg­;ߚ „ãêÎ=s¿.|£;ËˡY {}3d|îà¼Ó´l ¶ž¦;®ÍpÐßù¾7î™ã‘V 9štº¯!ÙïŒ{݆ÑðUÑǟúOGîQÀ † ÃÉó¢;4Gâ)þj:j´Ø@I(¼s¿8kÝm}úIëv„ %ƒ»-|yËÈ­;Ï:£Iå(†ƒÓioRo€ËQÁØQ|)m¼„ôݸxðº<=µ•Å‘ābOýBûl~Õ·þÊÚÚyÚì'Î;…ö%t†JÚO­ËFögh:C{ߧ”¿*rÁ‘ždƒÓ "‡Ì¥™½!75ª;šærŽ·çf¹d,kj£_FË ¶ß/ÌAöÞ(vñ­±÷¢1Kežyð¦èN¡3öGDQÁ2Q{Ùnù^z2;Ãö$uÜóéÙÙ¸˜|†ó²ÅíÇýþõ«á¨]¼Kötƒ[SˆŒF¤L¦£×ÅhÜ=ï'FÐý²uh»÷àì¬xeÞqçEo²&¿ýt:•-Š»ß_ö;oí×Ï>8£÷[ßþ`éöx`;U›mîîú0§ÛYàWÆóY×>þ±· ël[GØèœj1Åe|Xõ..ûá°rÂF– H HŒø•³4RÏÖ^ÏÌ.œÔꞺÆÝC øî¤ßô»“~wÒ¿OíîF^íD€0sˆé~ˆUÏoë`8^ÿ^ŽŽÝWÅ Õ9ÄÅ >)–Ok3¡¸u¶nCtüt¼d3ìl•7ÖVù.ÛYÏj³¤l3äêÝÞÄ=Œ"V"4Dú™\%h%§`g‘PÒcöï5°ŸÛƒ3¾éuù©‰-AoêNڝÞeõ©ù䤭?u“¢þ™ ©¿*£3óùª3óæò²|ÇËv¼l+å‘kō2(V°ãF ¹Ñ~¿35#ù¶Fó‹bCœ”ׁ-aF¦à‰½ÃŠi®s—~Ò1µâpISp¶Ïåe23ñ ó2SU‘“ÉÞK»2 -©$ՐÍÛæšg)Ç|k–ä˜_ uB˜­cŒaP@(‘s–.!ÛVB¥i -×h˜5¥”f™[JÂHƒ ªÈÔ§sø´„BP y ¤³×M[r¼%ę@1åPŽ°.!ÔÄÚJ -eZˆŒaa’kª;`æbÌFäJ-¡Œ|Ÿdù F«۞"Uæ•À½¡Œ„åømaWœ¡»N¥F~Á›| ¥?èüÀ‚‹ð‡]¶v©Td9,‘¨ê¶¦=ïàVL¦S{¦€Š}‹—NºÑK‡«ÝÚi¼v¤Ì28ù8„„Û…£H0H¡;Ö¶ö¨…ëFoöºù(Ëfg Øy&šèÏßy—±3æ}XÇ.³Ê4Hx¯8ƄÉÓ6Ü·Ýb¹‘SÛ"On^DÂÒé$çVfÏóTqÛΌ¢±®çæpÈÃ^÷†rp>^l&Ÿ¼n!hËCW˜Û<¶Øôþ'÷ÀY¯¸ì ÆEÿb-J|¼ìϋ~Á‹!EAZK=þø}gÔ …xKÏÝ/.Í"?µ?)zì~Ïôé#À¢A1¶–ÿ¼üËD==ùûs³|¿lÍd·VÑúNœr —7Ꮘu՝ï½îð´hbú¼AµÉ%ÿ.YŽû¾¹ôŸÌ·zZ<‘ËS3? ՏòòÓ×Dóp—1}lÕã -  -.2Z§Îs¥ñƒJ˜ÀØS0=ƒ>êÌõ³–-C•él½Eøí‹v¿ÛlH×>_ÅO£¦‹yè³³Îi˯7 B„BåpÛGóñI" rÑï]|æf÷Òß“ËÛgw˜”xßêÃÄíKw‘ç’½*Rž¥»#c#ƒ£_ó£ەàÐ\ƒ -漪‚y’,¯anëy_çl>S_~·ˆ>þ"rwÏmôRW“µµó/²÷>ý7ÞtÔ=/ g€,әþó¿ŠA$Òl ehgA_aÿº|á„Ã>Â÷GýáÏ«Tªû£áeëè¼s:üy±UÞGB7Jl#²MÇų£Ãýþt´Ð˜Þ䮓w1¥»}§jAMBÒv/;ݲ‰ï„úJÚîI`眥¤Ô!Ám@qëÁ›ËŽaªûÅÙpT´¾78é×à|¾6<¹ßy9îžCmº]üïŽo3Ž¸ëûbÄåÍӔ_vz–¡yßëbdM|ʛBN;£WåFçÃÑ/Ÿ9DÈõºãQ÷³æ fîlÇÜßsÿ«á­³|NZY1§U² ✿ÿSåYkaQ,Aú`p ]]ÉôY§_˜h‡ñì¤~¿oÿõYg<.Ff‹ƒŸ>C -üø ®üçŸ<ëVQ R“þù_ôsƒ-¼ãçŽÙÆsu%¯ÛÏí·ž'þIÊànQ| ULf-ÒP}óGEÿÄ·O¹NÑ ”ØÐpôÏÿø–ŠéÜÞ¼Öf\ ›¤F -¼í„öËk,a{H0òíyšÛÔY¸.Û]VÇÊíŸt^å»ãain† CÕY®1˜ƒkÎ$¹ÔÒeÙ¤†d3J·a6Ûbý -.2xô•È[û_IȘ˜§S{!šä_!àj íαŽfø°èJ—ö¢ Ã.fn¨õè+žÌ"&R›Ö'=Í´M(Nf—ã ßÙ2J{ôUž”PÂã†Ô˜å¤)v6S©r‰Ésáç PB/™ù×àLbœ–BÂ}Å0-š ›XaÐK?¦fÝæ)ƞ2a&€p*è&ô{ÿ+•œR1áz%X–I‡ÌåhäþƒË ë‘q £@:Š0÷p§qf‰'0tÚ¬{aCî3*gª¡£óNŒ™ÖF©GÌæ »šòDdvÉ+—×­‰Š†n‰Êý*’ Œ8‡N¦¥–)³F6ƒKãû$!N·Ím(·iDˇ[j:” -ç%c£–aW¥êØÂ*Vòƒýfä6gJi®pIq[óÇáÂÎI˜Ž4L‡n!$\? IJ¹f'&©²3 .]‰7}ØÊ°1¾è§ÂžÑf/*Û ³¬ufç‚ѬúaÚ5î0 éGÉX„+“ÓÁò$þI¥º›aajÛ9ŸI—Îw.… ͔Œ®a$ƒHÚU }ãÏÝüpå«q¼twuª"’¦Úrà /eǜ.+¤%Œaޜgý>Gòx²€ûJ¨7Qೂ©#MeÎ2Ëñ…9ÿpMåYŽÑ4T€[Zc0ˆÂñ’ÂVgxbe<`N¹°»CË1g21ŸñtI†ƒKЙíΝÒÁ…çVÄ,…‘ØpöRiØ<®ÂlLP2»—…U§–[hlfö`颉*fÊl¢AoÉlvǍj¨£Jþˆu;Öl´ˆÌ9Â9ÐXjm™§6‡Yjw©f¸oS#O"ãÔcF›.qqI1ÒX £¦­æÜ?(ÅÑ"™<ó«?³”ý±wq¡-+‘¸†¥‡ŸŽºç½Ó¢¨ñ¸o¾ŽÈŽ†æ£¨\ň û§6¶d%*ßÔ"[¼aÀ uÛÒ=µ¬öÿìs®-·:ÓñdzÖzö²¡bftàÈÑ1ɕeiš"‡7šWΐg˜Ågƒã@´cˆÓÃâã°ª#I#Í¥euÂæÁž€lCÕ -pø?  ²(àm*©,eT<µÍA¡z†ÅÙî êÕì‡WãfAG¬Øðs]ž­7g:–Òÿ¿$À¿À%/3ò…ÄãØT®â‰VN¾ ÎÍ~ Ü90ª\æßÀ¸aæ8^©3Ë^ͱ¤ì©nDíN¸´t\ڃM‰ÙãÒ¨–È«¹Q S+d™Ù·ÊŒ¦ŽÍ~ ¤ÚžÁ(¹èÀ¿ÌѕbÈ~?(áÔíÌÿŸK"Q€ãÀü¬LªÜ^ñÀ®?#ÈëÔ©\Ô£Ù^ÖHPς¥ÍcMp½²W¨Z¢ $aªÍ¿a þPœœuF'ñtKÜ°|II ¤bE‚~^’Sá%} ˜æI4Y@pàXådM·HýÒ±BŠ:’ÚÌPK†T©p–’…Ê´Rʴ퉝Ö¦—;, îóA!µ¤Y,Æ%⮘½ªmîŠàÒ;­xjou§\ÏrO8®^¶7¼@áBãÚ -Œ¥:uÂ#¥Fb.Ñ'ËÒcÑ\>¾uÆfJSimÅÈ4S)1O³h\**Ig¹•p<‚Ö~Z´þv[‘‰/̐þö™³·½1XÒ(Ð'›‚" ½(zÃÓQgð7ÔIõ;ªšÙ·<ÛöFoUlveÒao<)Û^ç=˃!>­ªÌ3—LóiÈ?ü4¾•iކj{´æ…P,‰/Tÿb{ßéOÎúÿüßfÇÃ×ö.À“ô(ö̧-ÞLNŠÔp:~8|5ðÙðò»Ëj,àz9þ<ð€ýbrΊþé1бWµöJ?¥g;“éÅ›ÒÓ{}$Öó#$ÔÑÔ4¸ë»N{“WÑïðzмêLÏÆ?ƒ »øôˆí½¸wôâ|ûË´õ°óz8ê™ùk÷¿LÏþùß®åýѪÌ~6wK£#×Ò»Ås؝šYž˜þwð‚K€…¾Î\vyçÇ'‡ßO‹?ßmÝ~sј{fÁz'Ӊ¿|òνѨóQѼ§·DíŒàk¤Ìb0sŸ&ý ÿLÂUš·3¿îŒÆw£ïqÛ×Ãt¨1ü0^ЂÄ\;כqùëƓê¤785Ãfu(eHzTL¾EšÔ WÜü‹k1ØÁp°¨ë¥ö‡f{ŸÖ$5}Ÿ‹âÝ Á–¢Þ\÷àÛZ;£Îì^ùä7g -_¾®Ï íõXä0ήQˆ‡׀ý}Ð%ú帞m8C £©¿R?ƾ9‚›P®W¶k+Ï~¾ë{8ùî9ߚ¹—‰“Z8âŸ{§ÉYcÊ]ËkÁ¸eÊ!ã6]9<£G¾<¯Å]|Ók1@µzhoêmÔk2 =™é•Cz[kHo¯É|<áÂñœ 'F´8,Î&OG=£ÉÖÞüC×FŠ@öx4œŽºÅ>D*_1œn×¢Ťsjä«÷Йü;ó«Sg$©µæ¢ÖòçÆ~¿(Na-~!§DãƒÑðòÞ¨èØhøªvOjð}ã?ˆÿÙ°7˜à€n?Ÿö‹QiÁ‡tfLà~B‘¾fpÁšçg߂kïg³¾#MšÑXžÝ{NܕñÖüzñ¼è¿>·°=z6÷ óø3÷Jê?ÄfÅãñ½Ñäd؝Þ/Î:Ó~¬ð‡5AmDÕYJ -@\vNOÉì‹.°º|6¾Nfa~xˆ&nwzÙkÓ1K!ÔC¥lû÷¸uo:¶žwƓbÔû¥˜Åzï1c-ZQ­W£ö§“ÖËÑpz¹¼mo<ìw&Eë‚})_¿Ô:o]v.‹QkÜ»˜öCî{ؿФã(Ø2RÏyÔ`2ê Ɨ³áºoM¿z§Ÿ‡â’g ±µ¸éÝ´vۗ£ÂïꕍGÞ:’*›dQS÷aeÛ¸+‡>°TdÂ7%£ëAgðº3> -äb¥©|6*ÆÅèuÑËvëÁioÒ9éõ{ZÈ·ç÷*>çmºFùš^¶öÑ`&NZñ†áÿ0‚'ÅøܯE\­ç…YGÓhqˆ¤ôÈÓéäÒ,ÈÉ°bæ;xؼœv^­gÃK¿ª}¼þ£þð¤Ó^\Nû〰ÌU_ /g˜jôãsEãŸiy¿º÷øYgd <Œ87|ðÙhxÖë*ÞÎNH©-dR–»3òÁÅIqZå³û«!_iŠã½´ÎüLÐï ŠÖĬŒŠµSÕtŒÙ@ã¹-Îøñ‘ag°fŸ O½Z 2M<ë™éàe'Ó#³Áö‡ÃÑ£h'ð°ŒfÛþqhVÅpðÇX#PÙÂæp>>x3 ǧXØô è÷£½³)®€V¦–a=0ÙÜñ]Iº{¶Äâa[¸M›òߧ˜ÑÖañÂulg—àée§Ö°™Ÿ§3‹p¶•áa‘°9qa¶ùQ·Ó¯:‡ÒhQu“^Ë «3öÔÏ3¶¤—ûaûñÂ7--¬í^Dê݊*ÑRpêe«:PseÓhHT>Ã8ϕĝt¼LCËfñÂý¾Wül–Û&A7lÍe‹ça§[„BAËZ㶘m¾˜œØ|~iª4Âæ«'6‹H¹ŒìØ6^·™l'í$’Ë S}8í÷é„qéZæ×EÂߌ¾wTôÿؙ˜ÇMŠÑãûã’丠íáÐl8UK­ã/À -¯®<¡öQM(\P:¯± `ʟõ;ƒÂœñªZDoß3Îð¬59«T®ø5ž‹t‘ǃÓâÍÃÞh¼ª‹³ÏÝá€Ö‘ΕÙj‚¥õ),½Äý³T@âU8œì0èÏÍòŠé[Ë#숝ç9,µæ9`©9ÑáêÃ0¦Z„ ˜æ(™Ý/IVcpUÓpU’“©²$MOÌûp8˜ŒŸ笐£fän¿wi$pðм1øK³Ù½^¤õÒ##^÷^›¹ÝH›³]ôšKÎ!þã‚-ü[4«¹º¬1à—_äókë.<Ggxß\bi  9Hq~|ŸXí_Ÿ§½éE$Ûÿñ]#[F›]¦l”… P}AŠ¸RDÐOcz#ƘÏ7ŸÏKó9×ö©“uJ²n²¨Ù‹ =ÇKÛX…æÎ÷vMìÏ®‰RÛ§³K`5±XëÁ³£Ԃ֫ÈeqÖ¤—m¼š`åv (fÕ$™Ã8K3&ð¯Z½îg0yË؊¥h}'Xxïü}xÒ¾4Š&†åÍtl®¼ºÓï¯h6~Õ»<1}5Ígۍ -(ÌY@G+šv‡ý~`ÓJþìdwh2,z&r<:›Pü›áÉãÁÙ°I,«(÷~(Nî|ß;-†wž ͹óÓòÀp D]64Îu<é·O­­Gá ¹‚Dðœ{ ²ÔÖyèòôÂüÜÔï×åi}ô6X"éŒÆ˦4 ÃðÈøPªÑzkUãøPª> 9TvÏô¤FëГãžTí¬³Á¤}Ú_Ám£ËÑÙp°”B»±Ñʽ¾j¶Æf¸ÁÚ])´ŒÛ'=&—Mú¸=(^v"ø‚V݅™¹†æ\¬ÀÖg]tÅЫ9Ÿi8>ïq¾XF-hULÀlàë¹Gnô™–3ÍtÕiðæ²]6P`÷ªšF³^8ôöU5}9×tACwd–ÝNKZ§ÓŠ¦ýÞ2nbZ€·¡SÖ{´^v—ql1^6ýØâtôøÞÄpÙQѺ7=ëÿóÿO/Wè3à -ñÄhj㇠6;›ºËVmäÌ~å¬8Að¡Î`àƒªÕel¶Rûè^IJÖ탡Ñ]O[Ÿ>z~Oä­¿Ý~|ô´Åx*õÿ’'‰„T¹¥úà…‘ -cÙ±J5@¡‹ì‡ÕÈJ×½x»LCZ'ç+5t+®Ví™UgFI1©ÁÙKí+Ùh ýt\ÜvѧP­Øߣ'cÕ>6 ©àœÖ{SôŸ#¨‚3òý[Û×#ªd EòlüÀ҈ûÔ!“îìSÞ0÷Tù]ÖhÔøeö±ok Ɏ:¯‹'Fûî]ö‹{3†••v“ÿïÿþ_ÿïÿµ|Kô¯úcsêvGg£,Y›®]7r_Óô?¼jA–`<ï®Îá³û÷¾7:A礱rx9±&òm÷›áIë©ý)¶RbU§È7‹œówö{D{Ggê~£Å_å¿=ýÍ_?ÿý_ýönçÇ/¾¿yº·ÿõèÑÅù—/ÿúÍÃýâöozöø×éw|þê˯¿{ô‡'òß¾<üÛoŸ|=švõÃüIv‹Iù«$ßÿûý—_$¿þúî´÷õ￸=þ¿c^óõÝÃQ«o&û/ÿøï‡_ÿ^G½¯þнßnÿöåÜ»Oÿl^¨ï?¼õ¥þË£Éý¿ÿ´/ÿ²÷Ž‹ááØÌûäüó?¤¿š>¼/ýÃþßû¿ýÁ¼æþYòÍI%¶_ëüLÿïýÛ½íï¿5n÷åO_ÿþÕß¾þrܾøüþ·¦o?:=3¯Az=üÏã§Óûg?ý ÷û_÷üòlÿ|rp®ÿÂJùÏßÜï²Ã|ýûûí‘éôøà?^þÇÐ|úÍ?î?>}ü¯û{Ùß}ïhïWۉ;§Sóšüï·?ï>調}p.ïþþÞ-ñ›Ï÷¿ýâ??ÿúà·ß=<(¦¿ûÃ÷ßüêün·ÛyŸzŸ?8;<·¯fɝŽõ~ýŸ_öþã›Óýþ­ûíÞèó¿Mïýæ0€Ï¾¾û͹0¯Iï~ÿÓ×÷Ýß^|þՓ»wôÅß¾êi}g|&Ù篾de÷þ7ãï åôo ýƒHN¿ìÜé˜IfO¾º½÷E±ß×Ï.ìþ|xëëƒÇ¿ÿÕ¾ÈTx¼ÿø¯é¯þ †ÿñùï¿?ýë—üäW?!Þ? n™!ý!ýݯ`ZþšþþûHõ‡ýWŸ¥{n~z˜°ŸþÿÚÞk;y½ÿÖâŒÁäÐäh2M6&Ù›d0¶ÉiϞ}±Ÿæ<ù:wÿ;’:©›ŽÀ·fæ7˜nª¤R©TQe¨åܓ¸‰ÔÛûˆ& ô -@CLK~ô‡=AÆéOñ÷|…z?ëȏ)hޞ·8¸K؉¼Ã›K.ži@ïÏñØìïeˆV“1€WÏ4à­L™Â'7å¹ ߚûÑw}&7BäÎ͏I°üûJ·söÜ·»²ÏO&fc&8í4"¯OÝNºžÍ¼æ¾[¿ûÔþ3ºh2þ^{D´œõó#ý-ãï¦ëdîï}”ýý ºcß맙ý¶y ãP¨9Ûríýº’®Wm2gU(ê0´¦¶dÓÎÕ°'ß&{jJ‰`x’ŠµOévùt¾œœ€¸%˜Åèô ¨ØAõ,Œ¡åû³§…wOæò#åC|ÇÉà›ÃžÙF†Âõâ_\f1(öIþψNp68©ÊÕBzTö ¾‰Ûw±1iù®¸ÒD¼Ý÷ZÃ85>E‚çfdNZL;kö'Ø\æíUÉñ+ؽ-6­ü 2j -쮵 LÎ`Í.~òÇPì«ÓL‡úÞwá:¼Wo<à…¼Ó1ˆ-Kd9¯dšt»6³a“ˆä2ÕÞRl¼èUì½B/ô 6OÞKx þÚ%ûœ^Iëë*Fæ}¯=QÃ2unj`^_ßd>e‚Îú’=.Oñ́°æÜã-ówš­3«ÍÛ6Ýþ錊°Ë;¶/^Òä ÒÍï3øÙ§)´WhÑiÍ}›‹A0Þí%óoÝ"#цÊgÛG¦Ï](ïǹ©ÿç=Ýyú:òß3¥›íÁ*ü·rƑtãΈ†{a[&♥e÷KÆ  &êûMÛ' 8[0Ñí!¦ç¼åyÿΝ<‚§¡-§Ð pÞºx!<¶ÇJÇo ¿¿ Œç¼¤[ãr–~ISñbÖ^¿yP5e<ýó(Ý:·ýÜSô2”ià›uêð5QK†oTG=ž¬g7¡Peb ÊËN’¨Xv$øg–!*žYš(÷ž#Ô'ê5ÙŸ&Ìø >€hЏÐ×åSò, K7ýˆúÓ3I1B4\„†ú|`¼Òÿxþ²è -Í_ŽyüˆÇ ɃoðF2HàO-Cˆg¦ ‡ƒše(4Üt™·(ËYîblÜÈ©É¡iÂ?­™ýÛ¾±ÆP˜~Ê ᢱ#z!¸ õ˧zœúey9Hã€pk°Î̚# Â_î›_ Ð$ƒÏÙ³Ëãïs+ƒ"Ëü5Ǹ„!M nJÓª^,i__e?DšԎNó ‚S£ R|¿r¯ µaל›ÍM,€@¡?ZË¢nŠ,k¯œ/4¯¾À A#Aƒ0; <àö 76Ä-,4šÒ|jz#uÄA̬ëϼ?à`) -3³aeB(ºG9)Àß·—°?ƒC¬Î-nßRhÄ^ÅIË£«Øwƃ­ÎscfI˜`ÙSõ6°6¢ ¤&ö2š ؼ,C‹R‰y94,!‘<àÄ.# -04ˆÒ ·‚ýà뚶tû­²!SæyØß^ü\Š¤7àT^TÉq­%õ6×1ŸFÌZá44@OÊ-Sï†Î"û;¥ò_˽‰:31Ý%pz•6£pÇþ.cFÙr §5I隯%ëw˜òì<z3["ٟs³Ÿ«Tö|J™Ñ<ÝÜäê©Öð0ÆØÚsÆŽL–è ±ŝcr˽@=u?ZÀ~Ûå¿mw&èð:1“Õ“™.rs[¾ˆ©ríò9 ¡µ¾p›.®±»֑¹ýƒtýàgέ»ÖüHÁ9ès´4EÚ-"¤@i5Š4[DPë„ó£ vžå=\r–Qxå:éuè<-iu¬[Π͙O*ߚ¡ÔÁû4kqÚ¿`Ð #ž1ãŠÐð¨d‚f€Á:Í4R[¦ñôyB*8Q.xB"¤ÂM Äý‰`ŕ+ý…&ÊÑôOoŠ¡ßVÕvºÞ©¶ÛT8)[†"i"´±û YÍÁ)·ØPçõ\aù4û¬‡n•/ðÉq*집ˆ=æáíJØFq3šn­RvðÛÅ ñ|5“uoª£ÐfrÛ6ôZúœÞþҐýùÐGÁ G#†>]`®JfY³ëçõÛÏÌ4 -í‘afé}ÖsÏX¶'¢³õŠ€KUæYèÁ ϸØí"‡Ÿ6™ßœÇÞ§È:L1—Ãè4áÐWµœi¼¦^½ÖÞú…ê¹÷”n¼´Þ ©Ï‹àñ\ª*¼ ܆æÌ6öy -ÙÊ -½õ„õ/¤µ÷zJWzž+¡Ÿ+/³Ülq0\hyÌ}›“D.[4P$unõ 删ά÷ç@t>6ÍiR_ݙ•«ép[N‰¾tŸùÑði@9SúÔ>3´°GØË}@O€‘<ƒù©»ÿË×lü ×}„W€«j»w˜4Ü«¡¸/?ÏëÓÐXbPö|[ó_vâ#í·D@¾‡)ý€Æï3¤âɎ)WZÿ2·®+Ý°½.ÒͶ,<>C™¥gv@Ú Üž”C0Ïî\iPµA ¤‰Þ²:Þ~¸m2¶È‘ÁÔË}’eVa£#W¶X-œÊC닧%Ü7¿ÇÈcìÛØúÁÕ&««ÍcÞn ~ãç\¯Ý(3L½O'u,óB€¿ýõô&Qڊ,©›b¼úök©}»=pßÔ£ùJ*–Ùáj9=¶¸%upFÎPB§Ò¡ÏÙKî;2vçûó“I@ÒÈßÁܺÀ°—ÞþÔm~ºãFß|pÃÃJ–06J<}b\Y¦óít(ÒDúä(÷Ý8V(‘A¶ˆŽµlúsAfS‹fÑøì)¥#îeZðýJÚö—zk—&dá2DU/ÒØýû%¼åO®xš½#¤<Â_oý# 7FZJ³wh€~@iÑÍÍãChHœíBé³Y¬áÀ!ö4¥ÂÚ7žŒXãÉe*žØðMÉhGàÓ̍Á ŽŽ~0ÑñçÓg¥E†Gˆ½‚Æ9$½mÈib‡Ô#YÝä¿€Ú鲊Иµj$X‡Þkz›þ¾ÿ }%Œ@¸„aJ±ˆÖì¾AºÝ6éUmY9îhx€'°Û›4áM’ ÀZc"ÿÕ;r©ânϼìØB]/H1T¡—Z¡°&R9ìÏå>gÕ PЫJ~fV¡”Yt 5#!ÛŠŽfÔù?°sÅ}µ¢•È¬V»±ÐÎçŸã(î¹þæ§D܌+Ù4È õ ½šÌa¬ÄƒHDº¹­žrŽú~Æ(PË3;rî¼AhLù¯Çà'ä´ÖJ óáfQpÀ„öÅf™Ó±ïµÉ ü¿ _Eh5 ¿ó.1¦¡íVш½çíu³Ðpè;G˜÷5°+F€štÉ¢~OÅW¤•bhVABkÉl@°—÷ٗ|dL0‰c?ÂÉJ4¥gKÃڃæ ôª» Ñ8­î2o‘£•;fp• -uùt¸p<Á½“´”oYOg}ŒÍ£¦5˜uӊ£Nì×´z™üš_ˆÎs:<Ý-°C‰ß~cRJà–ˆ}Ÿç¡ ÞÚrn쬧qNp€&Þ"ÉÔ"µB,pnϔÙ8ˆŒcD h%Ô½{’¯¥[ŽX›…m#`Ðü×ùq”;]¡ª08Ÿ6óŒ9›ß:ŸoáP2[Ìþ fÐ -{Lža®R‰?²ñláÏbäĔOÅ>;@ 5ìPð:ö_@è÷—àþÞ¥›«À;O$Oº©£µû˜«”}Ÿé–!³“®LrÁk?ԝ7à½ìsn>Æç_({[˜I¶='¿h¦de+¦ EË´#ms¼šìÏ©Ðc%9€‘|fC­Ù6^؇NÎh¢³ÙW;êØ^3+§§]èö»°6§ çÿ£^yNÏäøóü3CÌÈxrnmÿŚ§ Z Ã;ßÁÒw,6Óőu<CX>îÐk‡g@ÃÞq3ÿé{ºÝ µù @ -F–©¿*˜üúç愔¿ƒ3kGÓDüe‡9R½2æx;gûuŽJ&v”àŠ˜~:!® -¨Ï,­ú偎•ùJ×+EÏ]ô 1¼¼15ÁY1Ä&ïÛ¿œ;ÿT³Èö7?ì"÷?ΞÈûã`§>ø£…M•üNZO±mþ+h djVëohSjØ>lÊ"h] FšWûyg/¼Èøß}NŒ~‡ŽEº;ڂûÊ$ù ,h °¾â>BŠí96.ŸsŸ¿=b7ÚöÄ!óœAk)¾Fö'5sæJ«ì»@ ¼i©dÂé×¾cËÍ_  àbâš©ü´pb’‡ºõ‰â yºgJ?‚Ü/(§ˆ“ýŒ?-?ÿ9қ¤þ•[>½pS|äÊúo |4Œ•êÅf0ÚíLÁlæ$­;†£åF™X@åÏ -0|PN~6û!5|ªÊ† -DFö|ÍÐî{©}Ì%ŠZÇ´3F:ù1²x?€¡Cß5L·¾Npˆÿ7Á%òörèÆ=•åž¥ÕêŒ -7¶'ÞÿWk©§hÖ,ÌY|͑#öÎ<™X8 ø.3™Ilû𻆗àÉeî3ï¾Nó¯Ea¸mù"Þ»<¿WnÍù°ЫÌíTéƒlå oM¬‚Ä’ûŽ¿›ÙÃì–†SdÿnŽ§9XôÍb¾y˜Î×­º<ð°y燜%/ÍáAG”_šÛ.QB­ 6ÐþÏ|3 Z8@pœ?äqЎðœ}ú@Á9îþçÿ-I~78’Àgè;ˆ~ýPüw{>í°ýÊzýððëÿãzȸJ›*r£†Ý‚Pkõÿü¿°ËɆ‚ÿFµøŸÿouú]̙Q‚ÿÏæ_Kô5”óf:_N6膽“KžáÖè¿¿;…ú -fEÈÉñô>ŸÂËT,7µE~Ù -t¹wÙ¢{£@‚exÅV’[¯}˜ìvÜewâoú%èôtƒe®¿Ãށˆœì¨›ð~ÙÚñ*Tm»Ù~Án6óÜö?êúö‹pÑrm7…Hˆº%Þ)´9Ñ7ÂAøº]ýÊÖDòƒ{嗽GªòO(êÞñd…úþ¨³ÛÍ />•›'`t°@ôWØÜT"Ä~þ¢ºTŸùq“ª$üï‹|õ Ç^èJHì61‰_ÈÞ}”ÁR8Lþ‹]ˆ-œÜr " mÚ?çõt3ù]©9¨èËDÚØ}œ*¶nç8G”hãEµÞ€ÒœÀësüâJÙíÇ]âƒîðQC€B”ÝŪ ñƒOäE¥=-r—¢üüÑf@ӎº Z¯„“%xÓAzºek#EˉXÉî jÁ¶€çY-E N¶ÓÉ œ°sö@ð«¸âÌ/?Sþê_LTQPb8é˯"Qóf‰YzÎé÷û—­(“ºÊû«Äë7Å©vq¼)r´øJ]S)Hðr+t½‘øųü_ª»„Ö/K È}wÛ(*­š„°êõ(<ýäVL5ÁO ى -D‚\1œÊêîíU’ÑwÚi¥2GMwڊ--lK›/ L -×ØÂàŠG³¬*€ -‰&¨ ÜM6l;[xqãçÏö?Å_¼ô^â½ {JLÄàŽéØ~‹‚&~ªTw?XÚÈ<ÔýƒÈ%^}gOÆ!{òmê&ÜöšÓžü9ùà'¯?ވúØ özó%Û§Lî;RX Íç Œ³%ا^ûs3ø£·úŠÏz§Û Ó­õöÄ2®·¾ô#zÇÏ/x6þvéíçhKï¨usz'Qóîçžáè³Ö†ÿè=ÖÀèrK²>Nø2a_8Ø®û(ë¹i¸§Dq4‡•*‡Câyšvì^Ê©Jä˜ãï.rÛ÷¿å}"×'{mò9ýüå±¥CÏØ°g¶&@X JM˜š’ËWÀìÔË·ªÇÃ!vl,Žáö·¨‰pc;†Éӛw¸]šˆ™ÉƒP×9¸‡OâÀÃg{¢ 7¡©Sk“[ºÜÇpÁÞÇþÀŸ…øy/ÇÇúqø¬}4ıBÃ@´4t‰b_ S€˜Ãü­žÄ±Æõ–ÃÑótÇúêùð?z£6+L±b͎šSkàÇ21÷òâXýÖ{Ü»Ÿë#9„)V†ÎnU›.Af*) ¬Aƒqs°>K`í òû¥ÅaÕ¡ªUqA7yÊ£¶(ÖBÑۖ¤°·ŸhVÀ‘Ó<]a9éá㜨BÄÖË¥µô|ƒ•Ç -°ú· U%24ÖW³Y€5XvVŒ¡)Ä£ÃçϦ-55 †H£Gë09nJa…ùœFŸ%ö!>ݸþóhø™7ű6²ÖÄÞ¸®ŠaµÇVч® Ÿ¡lÉ~ª.ŽÕßëd„xÅúH.BÆæÚ[ÊbŸŸ¤Ätƒ†§å¦–•Â:! -Žñ›8Ö‘6Ï-¡ -Љ|28’4֞Ó" ròÅÿLS8ÿ±$yXûq¢rz V›+@s|,ηÁæÄéˆC;!Wý‰Ö !´œ‘C)¬9¢fûŒ ¬ˆÓÓ-í£©¿ÃKSk+föIb­Ì[>B +:ü'ÑYŦ{|¬ç/ƒ¾Õ"ŠõͼYHbmý4ÆS„ ¹œî @¼Uvqq¬UßS‡LşűîʏbX¡„†ˆßF…Ç“‘uâ=Yɉc­%ò£aãóSëg}YBXÑys9Ý¿^`FJ`ýŸÇ•SëËßn]„}¬ B<*97’D><µìz ¬½‘ÿ]—E±†_œúÔ§•÷ÌLѽpóœG¡uê³ -6µ_ØV¯9a)òçZ%ƶhbupX!ˆÀýÛ3gÀóAˆõ¸5=ÓXOI»`®úÉÀJaÍô<%¾PtŽ„¢ˆ]—ªäDÓX³§ ¹X| RX“žŠS ;ÿ uòøŒÑlaEhhÄÆÃa2Ý@¬„ëᐞo6.ëX¿(}ò$£ —€ÂÛù¸Mi6ࠝOFAþ°ŠÓp•|ÚkxÖoROˆâøéÌ=½<€ Ι$~ÖÁdÏ2û›‡OƒaϨM?=.×Û3¸ùy슽@IÈ×RôCòiØkkŽ¥ŸþL†fŽh—/¤½¦þ—äÓª}“ôJ?Ö¿cÜS!т†úã×´(ñópÑTŒwŽÔÓoó>"ømÇþ˨­ßžÇè%Ñ:Órk#ö%ñröåAòéûÓÔ­—~ú‘‹>³Dyaü4 %Ÿþ^wEɧË7o¦Á=½$ÚzI&†R?cjÄ’OË^¢+C´§¯Í´U•ú¹Io*}Ø$ŸæÓµé\òiٛ|ôÈ-­÷­Q‰§"‘¶1³ŽZb‚§öv㘤Ÿf]ñ‹íYl ¶4÷‚ÿèw4ù6Z–˜™YZŸVðéŽ6YÉQ€’B™íñ…úėiޓZ¡Y½³é+ô¯ ÿqÁïH½#×ÌÂޑ‰ÇÚw”´ NšF -½æçW'-݁Ä×ÓŸü²¼F{šBØÎp×Â30v»g gMáwœEhpÿ>O­@P=æç±Ëɓ½˜ûÄ!F¦Ö ÚAq¬þ^_+8Sþ¶:ûr¢)à—“Œ - ºó -¾1A]÷lcDiõ´pÆæðjâӐuсåÀÓú²å»ÀŒÖ2R Óèl\sxÍIó» ˆˆêPt~ž3%ÂÃèáSF¿È Ízɵa'‰þ‘\Ff [Êkh`ghc8Ml’P¯íÈÐKýn—Ò†‡JzÉ@óØ2¤$(Ý?j؞¡WÌ©‰¿8æâÒ>öÚ©/Jz òô†¾™úÞL?R–'="š½øRÈz)…†y¾òIJ!$ÓdW$ÿQ:à4dÍ£¡‰’Bâäæ‘fCYbDŽ¼ƒú‡&Ÿg#N¾žS/)Ä%·'rà‰N®÷¨}r¼c Íϗ|kהÈ]¨˜èP„èHrvÁ¼xÇ6¯ù«ËD³À…LÍ4o[MS6€ƒ€Å×ÅèËîGœÝÇV]7'±TŽgb4Ñ èÁ•´!¤ý™aœ¡‘HšG-41Pˆôx˜Èv¹'¤Ú (¿ûàé9yìžeÔàqt<øÏÀŽ…8.xˆIK¾"¶¤høªÂÀªrìK3dEâ%ƒÔ옰Q³9Dǖ(LRÓLóSÇ}¡]. fÖì—Ë2+(igj¥Ð2 ýВ'• -m’{è8ƒ“ä1  ‹\€d)jWªD¥À¬À—Ú"ôªm¹³XfL§dYúô¬7é©ÑõÀ˜¤=fù¨ÓSÅ2FŒòچ¢EÀ[Æ͓¬¶¡a ¯kÍÐ7@kmT nOUÐøŒÖ±ÁbZOÞÈÑ2M\Û»h£Ã=‰Æ—n¶ølơÅu{J¯Ôœùñ0¢¢˜Á(¥ëŠžÙÞL÷G¯$Ó0í[|{ž’÷۞™îި͜¦"»«Y„—*Gd°k'PïѤÖ6á´N!Gö¤Vô7ˆkŒExß7ÊK•8Ê[‚‘0 }9y j$B­ó:²(l$´%m—8³Eèóh0Ý©Ø&?‰Ëò~§.Ì>• ïç5`pQ/§ÙˆJ‰R’×E¨}£zX†+E@t½÷yz’?©ÕŠ‚' -Tû¤ghVAuÚ«®Hxž¡ìùªù˜wð¯Cƒï÷`­Üɓÿ<8Á϶µŒ$Lw°~|j¹” zÉÑKýf—4‹(3 -ÐKãfçыÝìè>cdéæïô2š ³‹çʾ(À¼*)rN‡²Ð‘+Žœ#WèLY—ùú½„é¬ìÈ“Ã6Ú=*e˜éPSëáÌ(á`ÊgþI}…#0Ãދ¦D%À\,™úõœ²N"ZO“òë­Ë0NÜ»ÉI £Â;( -¾H  :†Æ„(Ï%±ã©Ù©³PÍÌ íd$´ -MRº"T³µÖÓЈžäG¤ÖáKvBf[à֚¦£±"В¯Ü7цU~rÊì^áNC½«B©)Q!<)ŽÄ?¯ÉÎS@¨§]I›‘‚Ÿñ@±{TJÍœ|Jç®æÒ³Á?ï2ãI!p^à;5!¹ûp†Î‚¹´yË/gÝm‰‚ðªêP&€&å¥sÑ҆‡”—BÓ° Å *°yš›ChåäÏ@.R¨ˆolja§Ýº)(¬ÅÉAa%´@ÚBÎ/ hÔv¬ò£ŒfJåpXøÊheÄÞ%<‘Ei®lüFn?ª8~ 4¯K{¤PB³€I£6UÔÄÓ螬 ¥Ûqi½nÇ¥0 ¨Bº‰;S²€6©ý­Ò­ÃI7ÖÄÕ¢ß ¡)K7Î/ ƒ‚Ю—nÜö,¼mï ÝÀʉI7íRÒ.Ý.½ Û¥„r‡(.$Nrd,lȍi6‚¯·hÿ«N›ÇۍÂî»Zçîå<ß5iÿ -ž[ívíÿc/v8j>ÖàÊi÷€‰kÐ-Ú?…=o8Ö í_ -gâJR{>ÊŽ”°ùØß|>òǑ0äL¡_ß%Õ Š"Ñ,/æôä¥fq©’úÁè ³,85jBxÝî-NnaŒ@»uŸcÙä -ÙÝ2DS¥ 3«‰ÐH™L`A]ªv¼L6 Hú†«ƒ×dì Æ$ÉT֐â>žTY—óâ˜ÊºÜêlO'•7ӝIfJ§ÆIùÀؼꨩb“MwLíÐ$c?œkHm?€æ3Æ*Õ»8SÑBÚô‰DG¸š#—:Ï-MbÛ÷d3})¶ÐýÃøþU K%[\l2搦61wÀ%µ¨áA¯ªÛ;.ôÎMc¤w¼ ózgÚ7„|y±Z>uÑÌíå|ø±vY˧-]]Î'_ËGIè;”óIbEµ|:ÉÒEå|òµ|:¼tñ–r>ùZ>¾:xC9Ÿ|-ŸŽWºxC9Ÿ|-ŸN¦tQS9Ÿ|-Ÿ•.Þ¡œOþ=]õ}s9ßÅæÕòq†Çå|òµ|”ž¦\ÎÇK€–©t{5“bš¸Læ½t1’ ‰FŘÄÄ9å\q›º¢-RhI_x›*Æ"NÕâAŽ¯h[>Sï^±Süšš,cj{JÇSŸtª¦¦¢WªÂ«©¬Töz‰Æ9=íÒצäk\†w -ømG4A÷š WAR“,FÃ(a=š¢:¦º¦ð¬˜y¯¡¦pªXcàù¸¤k䤋päÕl‘Ì{óóAjX)±šQé5TμW–0+𽞢k¨S[S>(ÕäÈq„ %B»[Íꁋ›HÆh¦ÌøˆÆwËÞJ4ÅÂUõÓä¤ÛuDãû‹½™nÏÉO¢* -Òùu"eêÔÜ Wñ¥Æîù¦„¯S¾tOCÀòQpH‹À{‡øÏXvŸU؃œQ¨`.ŠªíA)™WÀPºÇ¬µŽ½þC]ÕÞU«4"Tœ7Œ¢#¾=`±²7B÷¬/–ÇIØyÜ/W­'È”¡ˆœ>¦$? ³6ê4Ìèñ¢„À’;© :X‘b迒6_ˆ-E+P -µzHº,ë$zÀ_£§•Ôî}nãKëi%m¾ 銿‹ä¤«Iõ£à’ ÷EhôÞðÆijoà°¼Z<%2câïjǚ ©üjǤ¯\ž'7¦‹[F\¿1UuïMyonMƒZ²Q…÷†‰*£.Ó-ÞÜ/P¾Ý{XäRF4ÔÃ]ã½Ñ]”.Þõpï@¹U_+è×住”U©«‚Õ‚`ã©`hu)‚°I ÁW¤+œ"-“«®F‘ö%;vƒ -ŽÐÉWHî*÷ɍ@km˜ïã“‹Z”2ˆÕÔÃ]™5Ï;o`%›´/JCÛE2„N´tQ©ÄOs‚®H2,*ñS™([⇳ -Ti'Ùûµ°mŒk²é€¯—÷«ÂïTž|Ìl$“žîS™‡ÐÜ#mO¾2O&Š{ÏÊ<Ñ´ë×õ½+ón©ñÐP™'› {¿Ê<äî¾q+ª¨Ìã+ÊIˆ7TæñS­˜™ï]™§Þ¥JçÝ»2 H*f×Wæñƒ^*R:¯«Ì»°Ö¤âB°¦î…ÿðÈ»[ê%ÅO½”Ô:Õ¤^¾mU¥^*JãÒw«jE9ê.•9Y@% 5U,’Ph= ºCAÙEn„\æ½²tƒu~Ò´ËüjÖÍG"ÅÚ¼·]¤X›÷ -‹!،Ү¡îÛ-û‘«ÂÝ·îGMöQ™&¹{;µûQNU‡4×fSŠ²Û®:F€´m#qºK]fέòXS$}ß±ÔU`R‰Ý—÷+^çÆ÷f ¢¸c«ãÒå«àäo¤R4»YŸÍ·çñÚ´lÖR·&_㇆ÐF*ÊZÕÉN§j| -e‡÷)’ýØß©HºK‘,¬[»½HB¹K‘,¤î¢kÝ,š;ˆ6ŠôU°šó—¬N†øû±{ó~åIÈ´{åQu²¹B÷(Ê_›»åÝàëäMÞÄ×b{ÞP”‡ûÓ¨º¼¥(OÌýð/åIøÓTZp=9 -:ü~h¹ê«É´X5·ß ô´¬KÁnR›GAÔ9!U8ž!4éûù´j6W(kLè°RùžÊÜÍÃ@°‹åªka‰ß‡ä>³‚u©ŠÜN†­ôbéu@-@õŸÂêm2Êfç<1¦†d;ñšO¹Ofxíd¨‡Ú­çúùC*] ¶Ëٌë+›Í¸+°íBkǜOO+þ iÿ¿"L¬ú ™Qt¡Ô@º.܈¾âLÆ/»‹}Õk¸ÓÃø±=Åõ[T±Ÿ¿×•+»›¹%±d;#[ì÷Tÿ­M¤°Že°œ «°",j?ân;aٝ¿ûSe›6 -JÑ-rew—«Žß§0¶–*ö  ûàùCªìn Wý¶V(ö۶ےXMÕùÏL -ë\¡Oa£+5ÿ2(HRظñÅFRX¡r{±´`ëÒGŸhvª|/&öí~à½êÿ¨ªé·¾Rïчi5(¢¢¾°fT‚<¯„g¬œÏYE~/_¹µoèÙð¢L¯¦í}Š‹T$à -,Ò=½ö*ƄÇÖd†¥”«”ñ5…}Wúl´ö‰Y ŒÛ}jï³¹±°Őx±on/ì«êÓ][ˆ)]Ø'æƗHð¿¥°Gzór‘»ö‰Ò)\frEaßµ‡´ÆÂ>±8wzÞ­°O¬ªç¸OaŸXUŸÚ¬! …}b^zÆĽcaŸØ -Sâ»ö‰©<¼,Õûö‰Uõé$®Ö¿¡°ïrL?êÚÂ>1µí¾…}bk(–jucaŸ”ræ« -û$µÎûöi Ú-…}Pö;ö]G4ͅ}ò•^w+쓨ú¾waŸˆæ΅}bÁaæý -ûÄ…ÀĽGaŸR`åN…}*Λ{ö‰‘SÕïUاXPvŸÂ>±ª>ñ”‘â]lD'g#bDû+i»sJº§ÙeO¥ºúj¯°íyô÷o¥TŽºø]Œé„ÂD÷îâ'£r¨#ÕÉnÖD*ŽNü„KX$ª¨m¨ä^i„N¢[jX‚1© -l4JfXüØÖUcBDÃÒÔ§ZnLâ¹ÒÂF†T2}ª%ä':Öø&SÒS> -L&Ÿ1²Sè/ïÊc5Ùþ77ÿÓawt©Ôׯiþ')lxýÿ®{í›Nª L]MŸªœ …|h®ÿßmëUèítjÚìÈ:µT5ÿSvBBÚÜÜüÑläûÿÝÜüOGUá)ôÿS~ÚUîqG—/ÙñÈ/¤†ÊÝҟvNKçQ=¹g«Z.•Á¶}ŠŽJ\ - ú ‰-ï¼WUÓ§&ƒ¢Qªw”Î Q]ìÑÈ$7jHRƒ’t -Z]¿1€Ú`–4Á«`%g­»ÕJ*`Tx]_Y_ÆOµ¬¥ƒ®:Õ -€RÎOSj ©L"—ϤF‚ð>…˜·GR`¯E™[ÏP HU\1(xâXë[A¹(³×‰0+WÚ#hªª}%;_«}[›ËjßÖæŽ×BhwéûLq¯Á†f’Ôl‹QS|mpcS.kÛv†E—)Ûò»TÖöü¸¼Oa {³³võâTõ¬JëTSB -¼JG›ÕKŽ¦æޒ!<؋îfƒ‚"›>ªÐ=®1 ÝÚᛂÂlFîôÔԌHP=«XB¡-Xlµ‹ìÇ7%êœ÷7÷ýÓ1õžR­ÿ®Ø"ùÊ2í.}ÿ¤UuºõߍìF÷ýSQ|q¾*òlîÑ÷OÇ6¼}?ÊôýÓñk£ÔT§\Ó÷O'׶þÓÞ÷Oõõí°ëöjߏ=§üHš¸ª«}4eå‡5£”ª}?öWVû^bnõ6Ábǚh6/¥ÐBôÂˁݥÀ´F¨´ÖI×ç - -©XJº– -vÔR}/VHÅ ¯BYá¸ØQ‹Âb¨pƒé˜^x*k©ÔR™Ÿ‡Bk?ÖÔÔRñ§©àpå@qk#YKµ¨*Ÿ—µî¹íµ¨Ùžj -©ÌÏ¡b~µíÙÕTH%™œûJʾÚ4Æ®Ž®,¾¡ @c¹÷±Û£ÐÜ¥î6뒾 Ù7Zûôij†‰¨)£§õîw«V -áÝ©î¶'y«ÖšÍô¨©¦RA÷•u·ØFeS;t*ʱ•ënÁ˜Ô—cËÕÝÒî"¸Ր8BF'„µwÅçvnéÉfÜå÷œa^†ÞÁ\ÒÞj?oÇö øTxE¥†d÷ƒœy͉Çu!0æs¦?ñê_’M+¯2 9Þz¯¸g‹ßš.šô$*ó¬Òõ€‡ó8êHhAI a“*D Œ¡¦õSªðC+œÍ#¹óIN—(úI¬æÒÔµjMgå°ê؂2ŽÈ¯/†•_#w4‡L\‡EŸ èÒjIVbXHda'>^IàDXˆˆS¸•À4<ù_rcÌs+,ÎÉ`-ƒÒX C_ «õ y¥žB¬M¹‹•7i¬ù|‡ä'ŽÄFø‚ƒýDW…žmÏn> H¼çË’ïéðzObl‹¦U€´G·§qKrù͆7¬––7¹@áEš7”Ç)d‚RtÒý£Ž«3­3äÜÝ°Ps J‰1]ä€]ìՄהÐÈ KÚ¿¬mLPtJ§Ñ#ºÈÈ®üGÂƏ„çE:Æ\già%×{+yn‡ù{ÝDÙsê…ÂæúŠ(Y·´ê0Ñ0Ë»:®BòâÞ»«ÊîÄãßxŠ¢ª’Äë<Òü,UT’xëíºb÷Ýé$ë֔¬šËûîd $ ?E$X;!5µx6äÝ,é y!l®¡SµRš -z)7õãM#PöñéPŸBIŒ‘‘° ´+);˜WW:ƨ­ í²Ç êä«©tš*½"š®bÀÆ$¬¿™ä|Ίª:oLX…úÆö¯ÆºÄ¥QEm©¿£K¦.Q©´ÂbüYA¹TH5GÚ@ëDÛìh€¦ÔHÈ|Qò+MpÊÜH4Åj"õÓäG@o%šbK!mD«ú?$ ]T1‹© Ñ®,IT[¨T£\¨¦ªQ.%^EI¢ÚzD?´–’Dµõˆ\2ìU%‰jë)w÷Õ%‰<~‘±B/rnµ•$ª­GDD»¾$‘#©¼Ññ+½´–$ª­Gä,é«J%ÆtQÈ‹{R#ºœ×íÍ -uê›ÔÝÒ¬ŸÍ¿Ø¬ðÒýð¯4+Ô)5©»O³BºbE^m¹½Y¡îŸ'}ñîÍ -/ÝvÿJ³BÑÅû7+Ô©êïyK³Bžû+(9,šJJËÒÝå c44<”wI(gÛ©lx¨îV«›b“»Ç­VR 5æ@]ÛðP¾Û¡˜òª†‡ò.$ ƒ]{ÃCq”¿Õꊆ‡*ú åÓM8G׍  Êîä–ívȜ777<”ŸœÐËquÃCÞH.ºò|·4<”Ÿ’h2ì5 E‹#e¯oWOÕÕ»Œ?í憇ò÷–qöʞ|YêX»CÃCyo²NÓåY2 åíañ´ë+ŠUmr[ðzN4<”‡"ç~ÐÔðP -ŠÜ£á¡|<†s?ÜØðP¾˜W',’½¶á¡ˆŠu;Ä­5(5®nx(؏¿Û!®Ü^QC° •kqïÒðP¾Û!ÇÐ76<”OñƔÛÛredbÉ9S´•\\4<”§!¥ÜÞ¡á¡Ìž;.}*CßÊ å¡° -Ô­ Õ÷)¼©á! Eti.%¹hx(Sr¡œÚ;×ÚðP^͇³¹KÃC©cýM$ y]™ -]Ÿ H*íG¥†‡ò±kAZÂõ ù”×¨ê¢ å¡ày675<”‚¢¶ý®Ê†‡7^1q™¢­EáE‘ìm yñ‹n‡T`å Ùz-ÙÞ«77<”W~¤8MsÃCùn‡º›¯›¢ÞêTÙðPM-îÊw;ÔiîSxUi°Pt^6<¼¾Tëvˆ£¹©áᥠïvÈJèk÷#ÓðP>{Lx¬]ÝðP>‰J聺ºá¡ÈÚ`Ý%‰¦µáá ¾N>Ñ´^Iٞ74<䄘X·ÃëS eÙo~r[ÃCy‘6qoox(_¤ËÒ77<äOSØíðROS} ¿á¡´jDk6 -·p©lx¨N³¹¹á!¾š— ñŠ•+ʟÒIäʟ´.à9.úrº[½#žF"¼뇺Rxz‚¯¥=Âòùþ‚"JK±œÆ…Ï;¼JŸreѸ,¼3ÓµåhC¸ëó KÒžµZ…e>‡ƒ÷ø£ÇLYo¼ ww¢Þ‚U]zc-Qr–Þý5Øù}‡Ÿ2™X}F›Å¹¶š3û Q\¼¤ ûs&¨ÿ˜Ì|àÓ8õNJ¦Z}ß ì—=ØÇ#pù¿Â5²ëª¸ú@µàgšËNrÖªßÚó—ÀþÍ2ÿ6¾§­þÜßc»YYFWñîvž´lö£ÐþéÚ_ôï/I³Ñg)Ÿ¾¥’õücø·ó(#Pµi¢Ón½é]öaJï]ìßìqŸ9E™J† ¿¿ÊD!hjãˆåp ¿—Ž†apz L¯lågÛþìv¾»|ÕÈ#S€÷ç>?¶°_Ä@©ƒ"â„WòëWG‘ôWcÍn¶A&l·y{žléTµ,F/D0ᓠ­Ï¨—œ.*°´LÌóWÃ[¿0nnÒäõ/ΆÕL?ƒµ­e¦\Uvìü/0!®¶A’ú4Ùn?ÆùŒò ¼nù -ýN°Àä^³Xýç¥Å&Dœ%Á§,ÌÌõÉyµÍ~– Åüa¡ -à̸öžÍä½í\.iW¸÷Ȉ¡µ€Þö \ª¿¨Åc_†`aeo˜ŠUõ4¯ôz‹:]yÙóoÝ"üæüºrÁRbeþ'½2­÷ÉóF'J.».3óÉcA>g@“Ðü²¡Zd {J;ð糃638ÖðMÖÅü’t“yo- à {Îñt&-ÅRÉã0ÿ¬ó_Ë}„p'BV4T8ºO-ë‰e'nxðlÇLŒÙg€†y–urϼ™~'É<(±+8B§±ôÃÐæÅ -„Çvé)T'ìwvîeŠ( ]_ì3'¨°‹ð;7­6^Xé´öƒÕ ¬²´û’=Ž¯);Är׀ïH¤“ Øèó 㠆"1 …^´È÷ZwC@@Í=@¯ú‘ÏYŸÀŸŸ»ÖZúÀoÛv{Â7À§v€Áµ&ܽ*G˜1†f (ì;sîIÜ]lÌ2ž÷ÿ *PááÐÀµ^Fõeår q“ƒÐ\ ’©pG ­åp#.)ó¼+͞õ´Ôîu=h]©Ù´½ÜŠx­«‘æ¥ÞÄÏÎ~М"4[LëNÄó4O;nšç§]Â3­–¬àÓÀC3ítèE¶gÉ –l:ñ1Ÿf~ƒ^ßet"ÅüÙuÓ?_æÓÐÃg -½j‚Îræ÷çÔ;ÔûFäÈ:¨xǵý=›å:ˆö¹/ö…có¡õ;û$ë™UØÆÌH¶)5%î*–‚ùÓÀïºØ}Ñ,sž‚'eŸ&æÓÌ˽ôð&˜áéÏ1œÀ鍴Y±Ð›óF<Èqí)—6ã3Ž!¢\°Àz}iÔ% -2•Öë«Q<Âγ›álÐYlû$ÏzÇÏ_WïxæõŽZ·¨w†#½y×ނOΊޙöÍõö•¿ªwºÍoðX¯êm{Ã;Ö¡(”p›àjZ˜]]Û°1 1Ø &‹»[6ZtšÃŒ2'ܨ‚áK¾ç'h ¡ƒJÒ¢I¨"B/ZÑFá‚./oÎ9°3¢“•N¤"!ù 5±.-¡ +âTÜ2 ”f§AãåòÐoYð.äë´X¢Œ˜Œ¢‰X<ùa4Î|—BÂÉB/7¤D`ZWŅ‹î]–È•ã[¼Rçø{H0 6(N+<Û<`e”l…+ˆØ -V'%S)¼‹ºiqz+fÇËôÐuvšpN¦¢sסåÙ(΢FÂ& ôÁ¥ÔˆÓZù1{Úä‡ç/®Þ VáñÊ;«|½ÙöÔÏé¤è;غÆ? œ§¯ð68 H…ÏW›úÞ2¦i£ïôÏ=˜}Ñ Œïé\šcûæÓMùäLގŸ¦Ø @ÊM~™~úè÷ÞÖiápêÙö'™[=~¥›ís~êL½#ª漃§]’A”ü"Gy¿¢&§"$Úu~EMNEaª•z¿¢&§"Ú7Wù59Qüæ*¿"@sü¿ Ý?¡ˆ/ð€þq7Ï«ù¡~ø]ünºbºÜé’ÇÓÙ̶äa>oÏÿ÷)·ý:¯ç›ÓCôÁneK¥p 7ÿÚÎæ:øbe¢“ž í€ÄÃã<Ï$bÄLî;RX ÍçIî›è%0¿%¥ÃìÚ{è‡~x®>é£Ù@ïð’-½¥xtÀ?{”¿†Š–‹hQÜÅfÈÍ™sÞ^«¾ ö òÓDÆ팿åß3ófÊ}\ÄÝÅtÆ&ßZ)÷‰Ø"—åe#`®v‘ˆ;PN&½5þâg=ô0)So̅Ýz‡5•‚_—õöÆ㠜á |„nýå隆ù“}…¨S¨µiíþe¥å³½AIià‚U"¢\8?ȅQLU0Æiæ`—ÁX2Ø`˜ª€¡.dxÄjˆc/”\PNE±ûaGÚØjg´ÕПj#¢\8”Jüû—"¢\øFáÿµˆ(ñ„ü+Q. -CIÿZD” ‡b±ÑûGD¹p(œÍ¿å¡ø¾¹{D” ‡Âƒü_‹ˆráP(:ñˆè{Wo}é[h!zŽ¾B Ì/k²­·þ®zç¦ñkF® „^´ç%öÀæI#GÕ÷‹RhZ;ú­ÉÞÉ$“ø-\2 «‡˜áu?{(:í´è„: &:{[•DbNé?ÑÒ#љu9ëý<ÇKîßîÉEi¿Ž¨å„™–/‹Õûè¥"`ø Єœœ¥eÚ'½Rå¸K©1ŸÇé2³zܐÇ04gM8‚U3fk 2H ¥´QÄ0¥?{ - <³u¨¥8è`è‰öBiò@ÓI¹ib”$Åäw¡ãE‹þ±cUE\Â,— d;w Sv·°6„Õ¸}g©¬·ü0ÀÆB‡ eæ;ñäW¸rÃ^¸5hÐ?eŒ9™xmƍðÝ‚%ꨒí -Ç#]Ýý›èä‘ÆÙ-ØùîmÏ|×;¸ë;gÝ Æã¥hѱ3Ú}¤>»ˆ!"qFÅŸ½T‹‹4‚ðçÐRë¸öĩȵ§:–êÙ±tâD@n)š}œ`8‚;–ᝊXªt •õ³ÊÆäjN–4V:¡-‹ -"<Ÿn ('£¯'T^@YX§ÊoˆÌSõ™d•Lyµ¹S7:“õjÍuËDPÙ³µ(¢ižH'êÖÚٞŽÈÉv kC‡¢]€!šZb@ߣSi"“ø À7Xy¼dŋND%5a¢¦8>Š;Ûà± ¾=öj!³·Ò¯’»H»šÝ'#ó­œÔËmœVõ»8Ҝ& c˜"næ4óå6N#6V)NS £jw(r ÍBÀiÐ떁ît·ÈijaªÊûV“þ 5AՂP|C—85á ¨ Ū§âޗís»mE Â+OM꼑›HÑIjÛ#ƒV=HU¿a“M¯Â  ·?¤‹þ“«Ç`L‡O· ӅÝÎÒ²ãÄÎ#ÍZ‚A0R@8Ž/cÈy[|9Ÿ]5qÑ©p4á0‚YÑÍ.9Ñù•,%ñ?‹õþg£“F¶ª—@º&×» 6ìÔùsIû¨›;O -Õìg™*ž¡|㧂.8@~KºÈCE…‡Ž¾ƒà–"p6¼"ÖçZ±â"'6|X±ãªv¶ê¢‚W]ðŒm·Í.»`ŸyðRÌzi_ðÀ+¶làõ¼È¡l.(ӀH¢B_P°À ð⡍ódþÙÀƒ‰Û ÍyÀøQÚrqÔ¶T¤ð2來›‡&K´ºAÃl„àú0Gfqt bÎ^«Óy´íÄë’©˜ŠP›ÀÄDÓ.ZM±Î¯µHÆ5Gçxݘ.A6ªÏ\`#pz5Î Ÿýð"Ý:óýÙ+¬ªi{86ö~ž‡)ÚÕÑúX_§ŸïëÌ%C,˼;éh# EÒ»›Ùïøô±ïÆqõŽâ0nñîc?ù)ùØ:þìSfŠˆ~¡Õï³e?}‚ýäÁ£ŸÞ!\ìû𹥑ñbþ˜Ùôƒ¬ƒX9ìŒÇœ¹„1çO,¨æ3Y됮ŸàŸÞ»…ŽzÐ𓵶ðÃïü"Qð9~ëesö°•$óµ7&ÖyZˆù4„\êbÝ}ÚyRëM¼Ò•ˆdšo╮DÝ?Ú¼‰WºQê‚o╮Dä~PéMÜÂPh zGKÏ(¿™áÁNðõøª5?wè•À(3_ünª“ÿÎÁqãy þC€ÿÀÿ÷`@þ—xÀ/«SÝ?–Ò×vc}¨ÂZ›‘;}8å~¿N¿ÛÍäð߇(ú®[«vJ¹‡èýjìÁCŒÀ»à{+ -°ŽàGºˆ‡4ü§ûˆ=½ƒŸëàWØï øü„+ƒ~4$ÂExCþŸËç øÁ¨\¯'Œ‡×ø°ZÑ:vÿ7¸Î$èqÂa?œ¶7§êó¸‚!"§ƒ¾ §†ÞÆ?³¿T9ïÖz²Ziž¹Ççc—[fQ„ß‹þø]_ÐÃ~á rðoÆ델¼ÜŸÖ¬:ÿ>^'§5C®fèmvÚDNxú<½Nóöaò»‚»jqœü¯ùÃd³Ùž&§ù> endobj 6 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 50 0 obj <> endobj xref -0 51 -0000000004 65535 f -0000000016 00000 n -0000000176 00000 n -0000047815 00000 n -0000000000 00000 f -0000000000 00000 f -0000177312 00000 n -0000177245 00000 n -0000000000 00000 f -0000047866 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000177519 00000 n -0000177550 00000 n -0000177403 00000 n -0000177434 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000049541 00000 n -0000177635 00000 n -0000048221 00000 n -0000050025 00000 n -0000049838 00000 n -0000049725 00000 n -0000048473 00000 n -0000048979 00000 n -0000049027 00000 n -0000049609 00000 n -0000049640 00000 n -0000050099 00000 n -0000050295 00000 n -0000051501 00000 n -0000072603 00000 n -0000138192 00000 n -0000177660 00000 n -trailer -<<3B853B03CD4D8C4B8BE2F2BA0FBB0695>]>> -startxref -177846 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_blue.svg b/net.mograsim.plugin.branding/raw_files/icon_blue.svg deleted file mode 100644 index 37653cb4..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_blue.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai b/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai deleted file mode 100644 index f036f2c6..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai +++ /dev/null @@ -1,1420 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_orange-blue - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T17:16:24+02:00 - 2019-06-22T17:16:24+02:00 - 2019-06-22T17:16:24+02:00 - - - - 220 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7N+WH5gfpWFdG1ST/clC v+jzMd50HY/5aj7xv45oOx+1PFHhzPrHI9/7XqfaDsXwT42MfuzzH80/qP2PQ837yzsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLLSrCa/vZBFbQLydu58AB3 J6AZVmzRxQM5GgG/T6eeaYhAXIvFv+Vsa5/in9K1P6O/uv0bX4PRr/yc78vHb7O2cd/LeXx/E/g/ m+X6/P8AQ+gf6G8P5bwv8pz4ut/q8v07sIgmmgmjnhcxzRMHjkU0ZWU1BBHcHNNGRibHMPQzgJAg iwXvf5eeeofMdj9XuWCavbKPXTYeovT1UH/Eh2P0Z3PZXaQ1Eal/eDn5+b5p232OdLPij/dS5eXk f0MvzbOidirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i4gtoJLieRY oYlLySMaKqjcknIzkIgk7AMoQlOQjEWS8C/MDzzceZL/ANKEtHpNu3+jQ9ObdPVcfzHt4D6c4XtT tI6idD+7HL9b6b2L2RHSQs75Zcz3eQ/G/wAmJ5qnduxVE6bqV7pl9DfWUpiuYG5RuPxB8QRsRluH NLHISiaIadRghmgYTFxL6F8meb7LzLpYuIqR3kVFvLau6PTqO/Bv2Tne9n66OohY+ocx+Oj5d2r2 ZPSZOE7xP0nv/b3p/me6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVxIAJJ oBuScVeJfmb+YDaxO2kabJTSoW/fSKf791PiOqL28Tv4ZxnbHaninw4H0D7f2PofYHYvgR8XIP3h 5f0R+v8As73n+aF6d2KuxV2Kpn5d8w6hoOqRahZNR02kiJPCRD1RqdjmTpNVPBMTj/a4eu0UNTjO Of8AYe99EeXfMGn69pcWoWLVR9pIzTlG46ow8Rnf6XVQzwE4/wBj5ZrtFk02Q458/vHeEyzJcR2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvKPzU/MAky+X9KloN01G4Q9fGFSP+H+ 7xzlu2u1OeLGf6x/R+v5PbezvYvLPlH9Uf779Xz7nlOcu9o7FXYq7FXYq7FWQeTPN955a1QXEdZL OWi3ltXZ08R25L2P0Zn9n6+WnnY+k8x+Orq+1ezIavHwnaQ+k937H0Jpuo2WpWMN9ZSia2nXlG4+ 4g+BB2IzvsOWOSIlE2C+X58E8UzCYqQROWNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVeffmf5/wD0TA2j6ZLTU5l/fyr1gRh28HYHbwG/hmg7Y7T8IeHA+s8/L9r1Hs/2L458XIP3Y5D+ cf1D7fm8TJJNTuT1Occ+hOwK7FXYq7FXYq7FXYqzD8vPPUvly++r3TF9IuWHrp19Jjt6qj/iQHUZ t+yu0jp5VL+7PPy83Rdt9jjVQ4o/3seXn5fqe9QzRTwpNC4kilUPHIpqrKwqCD753MZCQsci+aTg YkgiiF+Fi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWI/mF54h8uaf6NuwfV7lT9Xj6+mvT1 WHgD0B6n6c1XanaQ08KH94eXl5u87E7IOqncv7qPPz8ngc88080k8ztJNKxeSRjVmZjUkk9znCyk ZGzzL6ZCAiAAKAWZFk7FXYq7FXYq7FXYq7FXYq9E/LD8wP0XMujanJ/uNlb/AEaZjtC7Hof8hj9x +nOg7H7U8I+HM+g8vL9jy3tB2L4w8bGP3g5j+cP1j7XtOdi+fOxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KpD5x822XlrSjdTUkupKraW1d3f8A5pX9o5g6/XR08OI/UeQ73Zdl9mz1eXhG0R9R7h+v ufPWp6le6nfzX17KZrqduUjn7gAOwA2Azgc2aWSRlI3IvqWn08MMBCAqIQuVNzsVdirsVdirsVdi rsVdirsVdir1r8rPzB9QReX9Vk+MUTT7hj1A6QsfH+U/R4Z1XYval1iyH+qf0fq+TxHtF2LV58Q2 /iH++/X83qedO8Y7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql3mDXbDQ9Lm1G9akUeyoPtO5+yi+5zH 1WpjhgZy5BytFo56jIMcOZ+wd7538x+YdQ1/VZNQvW+JvhiiH2Y4wfhRfYVzgNXqp55mcv7H1TQ6 GGmxDHD4+Z70rzFcx2KuxV2KuxV2KuxV2KuxV2KuxV2KtglSCDQjcEdQcKkPb/yz8/jWrddK1KSm rQL+7kb/AHei9/8AXH7Xj18c7PsjtTxh4cz6x9v7Xzvt/sX8vLxcY/dH/Yn9Xd8u5nub15l2KuxV 2KuxV2KuxV2KuxV2KuxV2KsE/Of/AJRBP+YuL/iL5o/aD/F/84fpel9lf8aP9Q/eHhucU+iuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxVVtrm4tbiO5t5GiniYPFIhoysNwQcnCZiQQaIYZMcZxMZCwXv vkDzxb+ZdP4TFY9VtwPrUI2DDoJEH8p7+B+jO67M7RGohR+sc/1h8y7a7IlpJ2N8cuR/QfxuyvNo 6V2KuxV2KuxV2KuxV2KuxVp3REZ3YKiglmJoABuSScIFqknlPzfpnmiDULnTKvaWV49kk9QRKY44 3Mi/5JMlB40r3zL1uinpzET+qUeKu7c7fY0YNRHKCY8gaSD85/8AlEE/5i4v+IvnL+0H+L/5w/S9 Z7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmkatfaTqEN/YyGO4haqnsR 3Vh3U9CMuwZ5YpicTRDRqdNDPjMJi4l9C+UPNdj5k0pbuCiTpRbu3r8Ub0/4if2TnfaHWx1EOIc+ o7ny3tPs6eky8Evp6HvH6+9PMzXXOxV2KuxV2KuxV2KuxV4F+eP5seu03lTQZ/3Ckpqt5GftsOsC MD9kft+PTxr23s/2Nw1nyjf+Efp/V83Q9pa6/wB3D4/qZL/zjV/ygt9/21Jf+oeDNf7Vf4zH+oP9 1JyOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYqm3ljzLqHl7VY7+zNQPhngJ+GSM9Vb+B7HMvR6ueCYnH4jvcHtDQ Q1WIwn8D3F9D6DrlhremRajYvyhlHxKftI4+0jjswzv9NqYZoCceRfLdZpJ6fIccxuPt8wmGXuK7 FXYq7FXYq7FXkH52/mv+hoJPLehzU1eZaX1yh3t42H2VI6SsD/sR7kU6nsDsbxT42Qegch3n9X3u o7S13AOCP1dfL9r5y653jzr6U/5xq/5QW+/7akv/AFDwZwHtV/jMf6g/3Uno+x/7o/1v0BPfzn/5 RBP+YuL/AIi+ee+0H+L/AOcP0vd+yv8AjR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxVknkfzld+WdTEgrJp85C3luO47Ov+Uv49M2PZ3aEtPO+cDzH46up7X7Kjq8dcpj6T+j 3F9BWN9aX9nFeWkgmtp1DxSL0IOd7jyRnESibBfL82GWOZhMVIK+Ta3Yq7FXYq88/N380YPKGm/U rFlk8wXiVt02IgjNR6zg7dR8IPU+wze9idkHVT4pf3Uefn5frdfr9aMUaH1n8W+WZ55riaSeeRpZ 5WLyyuSzMzGpZidySc9HjERFDYB5Ykk2VmSQ+lP+cav+UFvv+2pL/wBQ8Gef+1X+Mx/qD/dSek7H /uj/AFv0BPfzn/5RBP8AmLi/4i+ee+0H+L/5w/S937K/40f6h+8PDc4p9FdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirNfy48+SeX7z6lesW0e4b4+p9Fzt6i+38w+n57nsntM4JcMv7s/Z 5/ref7d7GGphxw/vY/aO79T3aORJI1kjYPG4DI6moIIqCDnbggiw+bSiQaPNdhQ7FWJfmR+YOn+T NEN1JSbUbiqafZ1oXcdWanRErU/d3zZ9ldmT1eThG0B9R/HVxNZqxhjfXo+S9X1bUNX1K41LUZmu Ly6cyTSt3J7AdAANgB0GenYcMcUBCAqIeTyZDORkeZQmWsHYq+lP+cav+UFvv+2pL/1DwZ5/7Vf4 zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCIvnnvtB/i/wDnD9L3fsr/AI0f6h+8PDc4p9FdirsV dirsVdirsVdirsVdirsVdirLrbyNPqPkmPXtPDSXUEkq3VuNy8anZkH8y9x3Hv120OzTk03iw+oE 2PJ0eTtcYtYcGTaJAo9x8/exHNS7x2KuxV2KuxV2KvSfyu/MD6jJHoWqyf6FIeNlOx2idj9hj/Ix PXt8unR9jdqcBGKZ9PQ93l7nkvaHsXxAc2IesfUO/wA/f972TOueCdir5B/NnU7+/wDzB1o3czTf VbmS2tw3RIYmIRFA6Afr3z1LsbFGGlhwirjZ95eR10zLNK+hYjm0cN2KuxV9Kf8AONX/ACgt9/21 Jf8AqHgzz/2q/wAZj/UH+6k9J2P/AHR/rfoCe/nP/wAogn/MXF/xF8899oP8X/zh+l7v2V/xo/1D 94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/5P/8AKGR/8Z5f1jO47B/xYe8vm3tP/jZ/qhiX 5o/l99Skk13Sov8AQ3PK9t1H90xP94oH7B7jsfbpqu2ey+AnLjHp6ju8/c7v2e7a8QDDlPrH0nv8 vf8Af7+fNc5x652KuxV2KuxV2KvYfyr8/NeLHoGpuWukWljO2/qIor6bH+ZQNj3Hv163sXtPjrFP 6v4T3+TwntF2N4d58Y9P8Q7vP4/jy6ZnSPIPjj8yv/JgeYf+Y+f/AImc9W7K/wAVx/1A8drP76Xv LGs2DjOxV2KvpT/nGr/lBb7/ALakv/UPBnn/ALVf4zH+oP8AdSek7H/uj/W/QE9/Of8A5RBP+YuL /iL5577Qf4v/AJw/S937K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8AJ/8A5QyP /jPL+sZ3HYP+LD3l829p/wDGz/VDNZI0kRo5FDo4KujCoIOxBBzcEAii8+CQbHN4T+Y/kJ/L939e slLaPcNRO5hc7+mx8P5T9Hz4jtbsw4JcUf7s/Z5fqfSOwu2RqY8E/wC9j/sh3/rYTmmehdirsVdi rsVZN+Wv/KcaV/xkf/k0+bLsj/GYe/8AQXUdvf4nk9w+8PofO/fLHxx+ZX/kwPMP/MfP/wATOerd lf4rj/qB47Wf30veWNZsHGdirsVfSn/ONX/KC33/AG1Jf+oeDPP/AGq/xmP9Qf7qT0nY/wDdH+t+ gJ7+c/8AyiCf8xcX/EXzz32g/wAX/wA4fpe79lf8aP8AUP3h4bnFPorsVdirsVdirsVdirsVdirs VdirsVe7/k//AMoZH/xnl/WM7jsH/Fh7y+be0/8AjZ/qhm2bl55QvrG1vrSWzu4xNbTqUljboQch kxxnExkLBbMOaWOYnE1Icnz7548m3flrUzHvJp85LWdwe47o3+Uv49c4LtHs+WnnXOB5F9Q7I7Vj q8d8pj6h+n3Fjea52zsVdirsVZN+Wv8AynGlf8ZH/wCTT5suyP8AGYe/9BdR29/ieT3D7w+h8798 sfHH5lf+TA8w/wDMfP8A8TOerdlf4rj/AKgeO1n99L3ljWbBxnYq7FX0p/zjV/ygt9/21Jf+oeDP P/ar/GY/1B/upPSdj/3R/rfoCe/nP/yiCf8AMXF/xF8899oP8X/zh+l7v2V/xo/1D94eG5xT6K7F XYq7FXYq7FXYq7FXYq7FXYq7FXu/5P8A/KGR/wDGeX9YzuOwf8WHvL5t7T/42f6oZtm5eediqA13 Q7DW9Mm06+TlDKNmH2kcfZdT2Zco1OmhmgYS5FytHq56fIMkDuPt8i+d/M/lrUPL2qyWF2Kj7UE4 FFkjrsw/iOxzgNZpJ4JmMvge8PqXZ+vhqsQnD4juKU5iOc7FXYqyb8tf+U40r/jI/wDyafNl2R/j MPf+guo7e/xPJ7h94fQ+d++WPjj8yv8AyYHmH/mPn/4mc9W7K/xXH/UDx2s/vpe8sazYOM7FXYq+ lP8AnGr/AJQW+/7akv8A1DwZ5/7Vf4zH+oP91J6Tsf8Auj/W/QE9/Of/AJRBP+YuL/iL5577Qf4v /nD9L3fsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2Kvd/yf/wCUMj/4zy/rGdx2D/iw 95fNvaf/ABs/1QzbNy887FXYqknm7ypY+ZNKa0uKJOlWtLkCrRv/AM0n9oZha7RR1EOE8+h7nY9m doz0mXjjy6jvH45PnnV9JvtJ1CawvozHcQtRh2I7Mp7qeoOcDnwSxTMJCiH1LTamGfGJwNxKDylv dirJvy1/5TjSv+Mj/wDJp82XZH+Mw9/6C6jt7/E8nuH3h9D5375Y+OPzK/8AJgeYf+Y+f/iZz1bs r/Fcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/7akv/AFDwZ5/7Vf4zH+oP91J6Tsf+6P8AW/QE 9/Of/lEE/wCYuL/iL5577Qf4v/nD9L3fsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2K vd/yf/5QyP8A4zy/rGdx2D/iw95fNvaf/Gz/AFQzbNy887FXYq7FWKef/I9v5k0/nCFj1W3BNrMd gw6+m5/lPbwP05q+0+zhqIbfWOX6nddi9ry0mSjvjlzH6R+N3gVzbXFrcSW1xG0U8TFJY3FGVhsQ RnCzgYkgiiH03HkjOIlE2CpZBmyb8tf+U40r/jI//Jp82XZH+Mw9/wCguo7e/wATye4feH0Pnfvl j44/Mr/yYHmH/mPn/wCJnPVuyv8AFcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5 /wC1X+Mx/qD/AHUnpOx/7o/1v0BPfzn/AOUQT/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKf RXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/ACf/AOUMj/4zy/rGdx2D/iw95fNvaf8Axs/1QzbNy887 FXYq7FXYqwL8zPIA1q3bVdNjpq0C/vI1/wB3ovb/AFx+z49PDNF2v2X4w8SA9Y+39r03YHbX5eXh ZD+6P+xP6u/597w8ggkEUI2IOcY+iMm/LX/lONK/4yP/AMmnzY9kf4zD3/oLqO3v8Tye4feH0Pnf vlj44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT/nGr/lBb7/tqS/8AUPBn n/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRX Yq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l829p/8bP8AVDNs3LzzsVdi rsVdirsVeWfmn+X/ADEvmDSo/jFX1C3UdR3mUeP8w+nxzmO2uy7vLjH9Yfp/W9n7O9tVWDKf6p/3 v6vkwv8ALX/lONK/4yP/AMmnzT9kf4zD3/oL0Hb3+J5PcPvD6Hzv3yx8cfmV/wCTA8w/8x8//Ezn q3ZX+K4/6geO1n99L3ljWbBxnYq7FX0p/wA41f8AKC33/bUl/wCoeDPP/ar/ABmP9Qf7qT0nY/8A dH+t+gJ7+c//ACiCf8xcX/EXzz32g/xf/OH6Xu/ZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdir sVdirsVe7/k//wAoZH/xnl/WM7jsH/Fh7y+be0/+Nn+qGbZuXnnYq7FXYq7FXYq7FXncvkD9Fefd N1nTI/8AcbLK/wBYhX/dLtG24/yGP3Hbwzn5dl+FqoZID0E7+W33PVR7a8bRTw5D+8AFH+cLH2j7 XomdA8q+OPzK/wDJgeYf+Y+f/iZz1bsr/Fcf9QPHaz++l7yxrNg4zsVdir6U/wCcav8AlBb7/tqS /wDUPBnn/tV/jMf6g/3UnpOx/wC6P9b9AT385/8AlEE/5i4v+IvnnvtB/i/+cP0vd+yv+NH+ofvD w3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3 LzzsVdirsVdirsVdirsVdir44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT /nGr/lBb7/tqS/8AUPBnn/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0 vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l82 9p/8bP8AVDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/AJj5/wDiZz1bsr/Fcf8AUDx2s/vp e8sazYOM7FXYq+lP+cav+UFvv+2pL/1DwZ5/7Vf4zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCI vnnvtB/i/wDnD9L3fsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8n/APlDI/8A jPL+sZ3HYP8Aiw95fNvaf/Gz/VDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/mPn/wCJnPVu yv8AFcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5/wC1X+Mx/qD/AHUnpOx/7o/1 v0BPfzn/AOUQT/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq 7FXYq93/ACf/AOUMj/4zy/rGdx2D/iw95fNvaf8Axs/1QzbNy887FXYq7FXYq7FXYq7FXYq+OPzK /wDJgeYf+Y+f/iZz1bsr/Fcf9QPHaz++l7yxrNg4zsVdir6U/wCcav8AlBb7/tqS/wDUPBnn/tV/ jMf6g/3UnpOx/wC6P9b9AT385/8AlEE/5i4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRXYq7FX Yq7FXYq7FXYq7FXYq7FXYq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3LzzsVdirsVdi rsVdirsVdir44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT/nGr/lBb7/tq S/8AUPBnn/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofv Dw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l829p/8bP8AVDNs 3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/AJj5/wDiZz1bsr/Fcf8AUDx2s/vpe8sazYOM7FXY q+lP+cav+UFvv+2pL/1DwZ5/7Vf4zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCIvnnvtB/i/wDn D9L3fsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8n/APlDI/8AjPL+sZ3HYP8A iw95fNvaf/Gz/VDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/mPn/wCJnPVuyv8AFcf9QPHa z++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5/wC1X+Mx/qD/AHUnpOx/7o/1v0BPfzn/AOUQ T/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FUX+iNV/5Yp/+RT/0y3wM n80/Jo/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50 fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHuH5SwTweT 445o2if15TwcFTQkdjnadhxI04BFbl879pZiWrJBscIZlm4dA7FXYq7FXYq7FXYq7FXYq+RPzG0X WJfPmvyRWFxJG99OUdYnKkFzuCBnqHZefGNNjBkPpHV5HV45HLLY8yx39Aa7/wBW66/5Eyf805n/ AJnH/Oj8w4/hT7i79Aa7/wBW66/5Eyf804/mcf8AOj8wvhT7i79Aa7/1brr/AJEyf804/mcf86Pz C+FPuL6K/wCcdLO7tfJN7HdQSQSHUpWCSqyEg28ArRgNts4T2onGWoiYm/QPvk9F2REjEb/nfoCc fnKrN5RQKCT9bi2H+q+cB2+P8H/zh+l7j2WP+FH+ofvDxD0pf5G+45xfCX0TiHe70pf5G+448JXi He70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiH e//Z - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:7AFE812EFA94E911B987F622BD994B0C - uuid:5544eaeb-e005-4a01-bdb2-9e7085444008 - - uuid:e177ff01-74ca-4810-9fb1-85109f60768b - xmp.did:76FE812EFA94E911B987F622BD994B0C - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:7AFE812EFA94E911B987F622BD994B0C - 2019-06-22T17:16:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Mograsim Orange (255,83,0) - Mograsim Blue (7,83,235) - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - Mograsim - 1 - - - - Mograsim Blue (7,83,235) - SPOT - 100.000000 - RGB - 7 - 82 - 235 - - - Mograsim Orange (255,83,0) - SPOT - 100.000000 - RGB - 255 - 82 - 0 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 8 0 obj <>stream -H‰¤‘M -1 …÷=E.0m“ôgfkW£H0 ³p™ûƒiG´ wRèËK×5çfLvûʤlaZÖé¡ÌQìmUOiX9ìƒö@N®iQ¥·¨a¹qt AŒv½îûRÏêª.:å‚Îéô'ÒÖçYå ŒMæÌQàV;ÄðEw¡‹V۞Q“—!ªÜÆ4¹á‘¨ÉÜÅXS-©Ñ¡8$™bÒ.¸·“4šÙ×m䣎þ³ë0ʼö&QZ -endstream endobj 13 0 obj <>stream -8;Z,f9+ln#$q0jV3/j2:`@\UF.%lb@!r5fTjfhE9rL3Fab$V6Oh2lOOPm2G\:+Cm\ -ds[l\O9oeHa:fQI!FKRqdT4*+TIEJ4eQ&n>2sl\[0Gl<%Isho(*Q)51i,km_,!l4n -38[j??3U,:!Rsg'+NrB$,lb(6.cm!C(OjAnM-R]#[<8Irb6tTY3!P7 -`b=946k=it;]qTj= -fmc5HMiYRW(4O[%8["`biP`l'hmR.rohT&^s%6\cs-e9/`QKp+rnH5UIpXgWq%8,I -mJ$8Q)ZJ4a5L"\hIkUi0lSAOrVV`H~> -endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 5 0 obj <> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 12 0 obj <> endobj 10 0 obj [/Separation/Mograsim#20Orange#20#28255,83,0#29/DeviceRGB<>] endobj 11 0 obj [/Separation/Mograsim#20Blue#20#287,83,235#29/DeviceRGB<>] endobj 9 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_orange-blue.ai) -%%CreationDate: 6/22/2019 5:16 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -488 456 -23 -%%HiResBoundingBox: 56 -488 456 -23.5352 -%%DocumentProcessColors: -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%DocumentCustomColors: (Mograsim Blue \(7,83,235\)) -%%+ (Mograsim Orange \(255,83,0\)) -%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) -%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 20 0 obj <>stream -%%BoundingBox: 56 -488 456 -23 -%%HiResBoundingBox: 56 -488 456 -23.5352 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 20612 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45CFFD6EFFC9B4CFFD6CFFCABABABAFD6BFFCABBB4B4B4BAFD69FFCA -%BBB4BABAB4BABBFD68FFC1B4BABAB4BAB4BAC1FD66FFC2B4BAB4FD04BAB4 -%BAC2FD64FFC2B4BABABAB4B4BAB4BAB4B4C3FD62FFC9B4BAB4BAB4FD04BA -%B4BAB4BAC9FD60FFCAB4BAB4BABABAB4B4BAB4BAB4BAB4BAC9FD5EFFCAB4 -%BAB4BAB4BAB4BABAB4BABABAB4BAB4BBCAFD5CFFCFBABAB4BABABAB4BABA -%B4BAB4BAB4BAB4BAB4BBCAFD5BFFB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 -%BABABAB4C1FD5AFFBBBABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4 -%C2FD58FFBBB4B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4C2FD56 -%FFBBBABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4C3FD54 -%FFC2B4B4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BAB4C9FD -%52FFC3BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4CAFD50FFC3BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABACFFD4EFFCABAB4BABABAB4BABABAB4BABABAB4BABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CFFD4CFFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4FD04BAFD4BFFCABB -%B4BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4B4BBFD49FFCFBBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04 -%BAB4BABABAB4BABABAB4BABABAB4BABABABBFD48FFC2B4BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%B4BBFD46FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD44FFC2B4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAC3FD42FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC9FD40FFCAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAC9FD3EFFCAB4B4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BAB4BBCAFD3DFFBABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BBCAFD3BFFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4 -%C1FD3AFFBBBAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD -%38FFBBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD -%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4C3FD37 -%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C9FD -%36FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%C9FD35FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4CAFD34FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABACFFD33FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BABACFFD32FFBBBAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABBFD2CFF7FFD05FFC1B4BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BBFD2AFF -%5B08FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAC1FD28FF850931FD05FFC1B4BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C2FD26FF85080F30FD -%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BAB4BAC2FD24FFAF090F0831FD05FFBBB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C3FD22FFAF -%080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BACAFD21FF0E0F0F0F0837FD05FFC1B4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BACAFD1FFF3009080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BBCFFD -%1DFF300F0F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCFFD1BFF540908 -%0F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BAB4C2FD1AFF5B0F08310F0F0831 -%0931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD18FF5A0F080F080F080F080F -%30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BAB4C3FD16FF850F08310F0F08310F0F -%0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C3FD14FF840F080F080F080F -%080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4CAFD12FFA9310931 -%08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CAFD -%10FFA931080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4FD10FF37080F08310F0F08310F0F08310931FD05FFC1B4BAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4B4B4FD0EFF37080F080F080F080F080F080F08 -%0F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABBFD0CFF5B08310F0F -%08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4C2BBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BABBFD0AFFA9080F080F080F080F080F080F080F080F30FD05FFBABA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAC2FFBBBAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD09FF850F090F08310F0F08 -%310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FFFFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4B4C2FD08FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAC2FFFFCFB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAC3FD07FF850F0F0F08310F0F -%08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4C2FFFFFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAC3FD06FFA9080F080F080F080F080F080F080F080F0EFD05FF -%BBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD04FFC9B4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4BACAFD05FF850F08310F -%0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4C2FD05FFC3B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F080F0E -%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD06FFC2B4BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4FD05FF850F0831 -%0F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4C2FD07FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F080F30FD -%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD08FFC1B4BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABACFFD04FF850F090F08 -%310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4C2FD08FFCABBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F08090EFD05FF -%BAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD09FFCABBB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABAFD05FF850F0F0F08310F0F08 -%310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FD0AFFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACA -%FD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BAC2FD0BFFC9BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4FD05FF850F08310F0F08310F0F08310F0F08310931 -%FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD0CFFC2B4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA9080F080F080F08 -%0F080F080F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BAC2FD0DFFC2BABABAB4BABABAB4BABABAB4BABABAB4FD04BAFD05FF850F -%08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4C2FD0EFFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BACAFD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAC2FD0FFFBBBABABAB4BABABAB4BA -%BABAB4BABABAB4BABACFFD04FF850F090F08310F0F08310F0F08310F0F08 -%31FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD10FFBAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F -%080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2 -%FD11FFBABAB4BABABAB4BABABAB4BABABAB4BABAFD05FF850F0F0F08310F -%0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4C2FD11FFCFB4B4B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA908 -%0F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BAC2FD12FFCFB4BAB4BABABAB4BABABAB4BABABAB4FD05FF -%850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4C2FD13FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BACA -%FD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BAC2FD14FFC9B4BABABAB4BABABAB4FD04BAFD -%05FF850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4C2FD15FFC2B4BAB4BAB4BAB4BAB4BAB4BACA -%FD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAC2FD16FFC2B4BABABAB4BABABAB4BABACF -%FD04FF850F090F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4C2FD17FFC1B4BAB4BAB4BAB4BAB4BACAFD -%04FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAC2FD18FFC1B4BAB4BABABAB4BABAFD05FF85 -%0F0F0F08310F0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4C2FD18FFCABBB4BAB4BAB4BAB4BACAFD04FFA9080F -%080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BAC2FD19FFCABBB4BAB4BABABAB4FD05FF850F08310F0F0831 -%0F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4C2FD1AFFC9BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F08 -%0F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD1B -%FFC9BAB4FD04BAFD05FF850F08310F0F08310F0F08310F0F08310931FD05 -%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD1CFFC2B4B4BAB4BA -%CAFD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAC2FD1DFFC2BAB4BABACFFD04FF850F09 -%0F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4C2FD1EFFBBB4B4BACAFD04FFA9080F080F080F080F080F -%080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2 -%FD1FFFBBBABAFD05FF850F0F0F08310F0F08310F0F08310F0F0837FD05FF -%C1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD20FFBABACAFD04FFA9 -%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BAC2FD21FFBACFFD04FF850F08310F0F08310F0F08310F -%0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD21 -%FFCACAFD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08 -%310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2 -%FD27FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAC2FD27FF850F090F08310F0F08310F0F08 -%310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27 -%FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08310F0F08310F0F08310F -%0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9 -%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08310F0F08310931 -%FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F08 -%0F080F080F080F080F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BAC2FD27FF850F08310F0F08310F0F08310F0F08310931FD05FF -%C1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F -%080F080F080F080F080F30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAC2FD27FF850F090F08310F0F08310F0F08310F0F0831FD05FFBBB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F -%080F080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAC2FD27FF850F0F0F08310F0F08310F0F08310F0F0837FD05FFC1B4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F -%080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD -%27FF850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F08 -%0F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF85 -%0F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F080F -%30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FF850F09 -%0F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F08090EFD -%05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08 -%310F0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F080F0EFD05FF -%BBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F0831 -%0F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4C2FD27FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08 -%310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2 -%FD27FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAC2FD27FF850F090F08310F0F08310F0F08 -%310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27 -%FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08310F0F08310F0F08310F -%0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9 -%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAC2FD27FF850F080F090F080F090F080F090F080F08 -%31FD05FFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BAC9FD27FFA93031 -%303730373037303730373037303730FD05FFBBBAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%%EndData - -endstream endobj 21 0 obj <>stream -%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%d_²Ý#)ɬ`1¦ó(ÉÌ"‡|™}˜}±ÕïS…fîy›3] ²2Cà 0\ -=>UüÍÿñ«ß|yýÕëßÞ}®†Ý“/þæoo{ýæÇ;’w?}ñâÛ·ïހôƒ_ÿp7ÎWžºþiyjOþÓݛ·÷¯_ý˜¿» -øí-ÞÿÁá÷oîß¾»öjw{÷Rúáî?Äoÿáþ݋;ùýýóׯž¾~óìÕ×w_þöÅ·wWÏîè_ 5Ÿ½“ÇæMӏ¦a\véÇã¼ûÕÏùȳWxööíýŸïÐl(luÿúÛW_Ý¿úzÿúþx—æݗ±”]Ä?&þþïï}÷ö¡‡®RHž<¾~þíË»Wï~õæõó»·o¯_¼~óöÇò›ëŸ¦§·÷//Ÿ½ÛGãú§ãôtÿíý‹¯~ñíËßÞIßçe$=<å»ÿøöÙ×ò¥ü7éùéO_ -é7wïÞÉ·¼ýñnè›=Ȉ¿~i­î~ðó×_¿yööþån/ƒ´û·ä¿+á戀þ퇮ÿ³{â—MyfJ O ö̯²ï*•æ®†)Ç4Ê?”â"/Әæå­u/=®å~¥i–üë¯dþîdßüûÝ«ÿþÃ:Zo^Fd÷e§þ?Øoÿáîå7/dQpî¦4_%™5þÕÿP–iâƒ_†ñªäeÙ}9Çájž©4Æ«QÖÔnLËÕRì6ëw¸¿ûãw¿xýêÎ&ýúÍ»ßèj‹qô¿ö«_ûâîÍ?¾º'=“¶è¬ÿüõWw/äVÅí‹gœl–±ýמø‡go¾¾{'‹ôõ‹oßqKoEVÖϞýé b´F~ùÍÝ«xýOüÔ/Çi»<™œ$ݚÊnIq76’¤Ù;µÝ±ý×jGU¨¨6‘1u¿’úË7÷_ß¿úqýÆüô'oî¿jË6O»¢ÿa?®J÷ÿ¥þß>W:ÿîÝÝ«úý²e?ï6Àpõó_¢Õ›W_^¿Ä<¼å¦¾“öe½xýµý¶ýÀßIß~cÝ á©LÛ¯ÞÜ¿BÅO¾ø…þ®<ýՋoå—?yóúÛo~úêw¯Ÿ|ñepÿt÷\˜˜ÌíW»_þöȦ~ñìù￾ûóÝýóß¿º{w÷v·—½-tVXÕ7?|OÅÒß7w;ý­¼ËåïßáïǼ¼ûp™VRÿþßBŽ/^ܽúòÿùöí³w~ùú«o_Èoo^ýáîÅëoîvÏ^}µûçgo¾yL¿zñìÕ³7;þ¢¶Ð×»ûé«wwožýû»û?ì^>“F塟ÝÿA^|&ãû¨d9}#£Æ—ø̺µ‡è~õ¨¦ž½û½0­»W_½õÚ¯_}ý³ø­ð¦íˆ±#úücªÿ͟^þöõ‹û·/½òžâÿ~ä—Ê°¾úå+ýä7ß¾ýýî^¿~á5ÿ\xõݛoî_½½{±ùjá"úÞ_UCþð¹F°yþ—hâðìŋ{9Ͼùýýós­ü7ûýïîïÎ6váýG­®çœªs­þ曻?ß?{q¶ÅÓ×þê³5¸»ùê^xç&ðà3¿ùã³wÏ¿ûÙýoß<{s÷žÝŠÉþÝý«¯äCóíý»;oÁ¹òõÝÛ»w~' ZØ+،¼p۽ЪOOå¸é“/¿|ø ‘3vÿªä'ož}u/G™Hq?yýâ+yøk©ºý[ŽÍ¼Ûõä‹}òÅÐýo¬ÿ‹»¿yº™ñ¿yûgܔ©+ÁJ´’øÿZfü_jœW%{)ò*×]ÙK9X9våf¸•okY}ZÿgêJèJ\•¤EÆçq–’ùwéʲ*×ãÞËÁË~ì‡Ãñp+ËnädÄc:ÎGù¼c9.Çýñp¼9ÞÞ 2=á&ÞÌ7ù¦Ü,7ÒØÍáFVÉÍÍÍ-–Æ­ Úmº•ÎÞÊçß^K‘FoåÕÛÍÎéÀiuÚMWŽ]9te¿*×]Yj‘i¾•Ü•yURWbWBWd5J“—ž³5®<ôÓÿ9®ÊA‹ þÞwåº+˪”®ä®Ì]†~“¼ÄU ]™º2veè‹û“/lúô]Ùk©[u5ŸëY\Ï]µõL­gGfDjŒýŒt3±ÿõ¨ÛhoF˜£*ãµlÆÔFr5†ëqیÖz|d¼Öã¢crmea)V²•™%Y‰,ÁŠ¬;nF;SõTð­P;§Õ?{–k+ K±"›]6>ÌV’•È¬(O®g€ðÕnNo8{Î[á<%Î æbàè9Ú×ÛÌь½‘£uÃÑÙs4Šô.³ïè1z9°WGöâšßù•‘_%ß"ËæF†ô ììZØZö6 “‹Âì&áóò¥²¤nd° ¯…-–ë, 2 £ rތrßÊÔePö˵°Ó²da¬Ilj”ûVÄQk/lx)òÂ’gaͱaÒ£œí·²TŽ2”û|-L¼ä,ì< [ÂÜG‘neex÷Âú9²I„ ÇÂ8Ë7ʒ¾‘É>È¡q-‡G‘#dNI“ ‡Ê(òÅ­,¼£LÉ^œEžg9‚¢E“HƒlY9¤®å°’o”ckI° Ù(Í­,Ö£L#ŽY¼8Š“}8ªažSöۉÀö$ž­OòYÙ`zôC܃€°P€PBDŒº6.´ÊšXG­¡½eZñ‹Ûî$PN±ÈK²¾FY[çVÖÔ#<¥ðGOª‘§Uⶮ'–Y8±äP¡~ÎF?gYzåÌÉüdĹx6ëû.c“`s•3(eÜPÎMÒH.k\o§Ão¸õšågʂÇJÁ†Òíԟ£~×Ç8  Ÿ§kŠ67ádPÄ]|RQE( ïo¤‘ÑDwífśèM•…µÕºZM¬‡¥ïŸ$ÿþ~2u"W‚…Ž +$ËJÙsÍl~x’!•Yõìª-«Æ²z¦E¶å£†™­YÙû™OÇf+–¼wùº–¦1••.•M¿Ò’V:˜éeRc0f Tæ_©Äkm¯žV® º6Á"£¸Ò"”Ы恿—M)›Ò4Vý×lºl_âI 'e:SìÔØÿ9Q±;{ÙÏÿ>ž-ÂZd¼ì½\_(ËÅRª†)5æM™Yšöšú"5®~v Gû÷i  -—†Ô8=²œä3Ej|ܓþsÖVðI>_Ýñ:úÀªô[¥ø£•Ûª-¤ÚFŠéÞÕvbû^vµêéu·W{LÛ -Û½]eߺ—ûÝ»·]]­§{7»Õa¶’Ü&ÑìR¡ß­nÍx`ŸÊ¿ÜÒlc›½Ywç‘GSµ±ô6¶ýÙ½¹_YæNwgµálwkYYùšU¨Z†ÎíWÿye;L'%®¬—wåÚrµµYžÛ·íæÍ^宾ð»ßÑî꿂=øùk¼ ôöêÕ©‚¥RË©‚Ue• -û %’ÅÌÙd’ÉÕ«ÛN*É+©dêT¬ƒ(YT±ž|!JÔ,U² f T±TÉ:ÐꤊVqE+˜¢Uë j֞ŠV¡ KV#•­‘å–ú÷MHET-U¶ nMªnQá:šÂµ§ÂU¨pAå+“µcj×-ui(^ªzAù*T¾ ~Eª_#·Õ-U°U0(aPò4‹GEÓ-PuŒö *dGQÈ ’A)ƒZÅ,ÇDÕ ÊY 먠ݚ¿×"|¡| /SʛñBÀŸ‘VãìƒuBš§²[¡z†ÉÁ{ÞÝqíN -«ö\ý»çɽ EyIøm<‘œ³®xéJ²Yq͏”ÓË,(nw–Ï= _œ‘'Ç5.r“ϼ«]ÕÒ[Èú?k£`gê\Ûáê™K•c4•¶•°*k›_ڔyUDXYóÊÆX¨c­Ëõ¦ì·Å,š}9ž”Ó?·§¥®6aýI>ž)ÓÙΖjE<-éB™/·'KySʃeyO‘beÕ>_ö,äøRãá‘åø¸"5žRÏM壋ÔxéwùçÌñúÑ5¹hp­u2'Š–hEí©Õ¾š­TûëbŬ³R£ZkëŸÊ*ÚªÓRùmÕ­«Ô_-Åj7–õMó”–ÙKµ5/‹•k/û3<ëóÒ Ç:Ç«šáááß<ùâož>æÙýÛ3u^%y2 »2^‰þ8_®pû k»ç¼D`ÿG(ÆS|§R¦(ÿÈi²_kÐZ¦«0¤Øšûäšô{QjӌHÙö3^Í\TwV¶Ä4,¢ÏˆsLïÐ* Wƒpšî³>S…öuó |•¥qH™/áÏZ™è–E˜„Ï¢2™¾´¬*Kðô_÷y*ü„¹œòU aAU%ååS't[ݹ5k¿,WÂç/.ØõS¨gløÍ -Á¼Ëüûû—/ï^”iÿ’Šc…dþg·Æ0'c•ÉÜ|Ùãµ±Âcï³56 m4CÓã\øØhxªÈCˆª=·[š?ôP›yœ]ó »!‡ž -—Z×´mÏ  9X=#jÛU1N“Á°—êò¬ØI:N–À(žûsÚ[nSg qL Ä$8*akˆNP|‚!h »1ŒÂ!¹ÛóaìE‡¼xîbë¸ô“}47|ïˆo®øƒžÞ;>úi½T—üÑ'ò™Áø •• -á£,¦¾Bù r¤®$#Ië kp t• ¬wÌîMÖQ6TCÃ5¬f<Ü-x yLÍaÙÌ^Ñ èc3 -?›ò(\Š{қ1X]ԓ≠Gttìе!†ªq82HAû›§sÜtè¦ZÕ{\zN” gJљ’t¡iôšòôžê´Ì§[JÖM¶V(&æQåk•°›ŒM)ÛÀ™ -τœ I[$^JۅÒv•·+™{#u›ÌµP!œ”»«ä-»l-{c•,ëžNÞ¡[¯7¾n°ïM÷§®ÃS÷ctÀÖiyúSÿ÷öß=-9°¿…rċ°‡Ë ˆ°úw Œ¢þ7ÞÍqÞÅÛ~ï_ûÆ혌¶lå6k÷Ä -*º?ÍmðÐ - 5H¨D$Ã{O±àš*{!;™M<¨~Ãф„µ÷ðÚ½‡™,Ì<ˆÂ¸&î¢êG<òóô`Ô£±Ž~<úYH8yLÊAùä ;*ûò?.{ çʹs:œóÉ*.™7q è¼é|ÔIq¥bÁ> - 6:»>…swåý€îf6±ˆ×n6ނ˜³›š×@æÊl¥2K[0óqf¾¼>‹Öçõ*••Ý€Ì=Œyð5{k¶íœ6°÷Õ«ëwáQÈU,+[WòÌ£²­ç`0;åòêú¬kûƆìÐyÈuK‘•­«=ۊŸ©uPŽQžLÞ®gˆ:RuÜpp8~àœ3k¾°-ç]fӉÙû$Àál Ãtô ëð$ôaÊ?qa`}©ñ\(DÞ88çûór@D šö|PÄøÀ.º´‡Ž@ŸÝIûÎÝÒöR¿Ÿº]ubȺZD( °Ìr?´~áêÿ0 - K´ „$\Š¹ -v"¯”xyº³v}® -ÕðQæyñj\Dt.fHÝV¡vžf7™¯DÒ*Ý÷|tú9a‰°Ð„¼0‡^Ç,Ê:‰¡·% -/íú‘fyuì¬vŸ\“™‚Ê3…¥Ðü%Gq -CF02é[=ËUJRJtf O­êM7¿|óü÷÷_ÝÝÁxãÿ–j¦>¢öjÉÑò5a’óÆ×ʌÑXÆg`ÊÛZdíÍ]}Q“uØ[;{É °H°1 ½…ê#Þ6 ØcßÄØÅùJçÕ4|l8ø¿AŽŽ7zûMqmà{9½JϽܦf#VãÞËoª¾epg(!U'J®÷d×nZhh ñíµ—ÎKeݦvZa¨-PW!« -`½l3H´Pwa”KÕ^Ôf°tZÌÞ$›j9· -Æ2„++¢õBÕ|Y–Tß çRKBµ&ì«üb'Fu¡¨h>ÊÜÌɪM"dÒÞ@t-KÅlZL†¨aWÉ¥%w‡WD”£d)dj ^’—ö'{)^®½ì[‘]i0µ[¨Ç©Ž«ºÂá{òEŽ^Òªœþ)›²œ)"læë“r¸PŽwnÁ0|ÁÙ>|pá‚…búålps oÎà¼o{v\ÇÖîÐ} Õƾ”¨ö„UŒ÷ÜmghþìÅbƒŽÕ-Ö½[›ìÝ:3ƒN]hK½¶•}C»Ör u9Ù*…UmÏ5yäZ¬¾ì‰+ªù±¯éǶy$t¤hõ¬v´Bó>ìh Ն6˜ -т¦~ëŽÖG3øƒ%N·› ‚ùâ64ú«iC{ÈgݼÖKg?;0à6íÃHº¿ZԔµÇz¦*ӐBÕs­úIC5$PÃqˆû‰+ÜOøYNð>+/v‡ïqd)k,OŸ·ˆS¤Î)JðÐáÏárVˆœ‹èœ•r²ŠÊ¾Œý»¤$­:ñ>ð6ðÁRm-ã:ºFA×èç÷Übžë—4E͔°NÍR¥jÕܢī*ÔԞ¿ì -M§À 嵎WnjÉi”rSë7*}¯ÊÖb­ÊŸ74¨ñޔxÃß­Õøµ"¿Vå×Ê|1+wöƒPfÉUú¦ÖWÅ~òŒ'C§ÞßvJþërn-¼¢6Þþ,^Š—v¬µC:y‰­H¡+-¦o\•w½†nô4'U8dc‡Uٟ”ëM9÷G4òØu9{°Óhw¹¸ $5¦ %~páÑÆ4Ÿ¡|T,üÃÑð !•¸"=ˆ_‡’®£âû¸xóÎÊêžWÚæ£=®L¯+ëzkÝ_[=¶×>ÏÙæIÇuÚrÜ;¹lÂ9B3¾šùõ&ËZ$Øs+,æµÌc«[M±Í‡½öb·0L)XVŽ{¨7{Z|ܐ­Ã>J-ÙM¶Édy™~¤!¾‚h(ÈÁŒ¹ë€ Q‰©†hhˆj!t6‰UƒDnM_Q†ªloOðµkØH82›âaJMUIm©ÆìŽgÂ/ Ö0“uÈ°Èz¦±-¨z)l¸•x.„؉OÿœFö]Š%;þvsSn>¦¼3FLMY[Î?Pí i(¢>$Òïbf‚ûÑØ,In7Ú8>âõ´1üã«WÏ^Þ}µûÚH»ö†3ÔÞès.Sr¥ËÂ4^ý×$·5Í€Üná¶ë k ­Âp½‚×N0:9¸v9qk6cI_ÊÇ‹\9£Mž òøŒåû/=ÑIU~›«¨Ô6QrÈ«¬™áh™2‚›tV½JJ¹di Ï“h ž ziN¸l`Ko®-kxÓ:¸Éy–'áM -²œÝ8,üHxÔ¾ r2Îd¡NQáÓ*à)yÐS-Õ¬¡¤Fc5ux›¥šVšÙ¥EÑ43͸-D<µΔx¡¤“Bî(5ÎËÿʅҌVÅ°+RN,Hë"5¾ç‰-®ñѤÆÏüçà(ÐIn,"Q ¹Vç”'~›Mç¨ÙwÁOL׎r –¡(ͽ -ïÖAûi•wW]M¾Ý»™Îs”ÊS*lûLÈäY®RùJfZHå.×+΢6ø-oiüe2‹Nã2ÉLŸrZwœ¦þiËuÍgVà¡-Lªr•£V\ç÷™.” Ú£/s¤÷ñ'/Rã¿ýˆò0×û¨ò}©?0.êѬq B'v–¼²™eˆ99ƒIK]bË>Ê‹Ö µ«T¹©:Üg³j®¢’ÃÆkˆÒ5mZ·.?E§{çú-å§`K™L - -ÓxòÝé -Âk©]ýµ1:ғá0ÀvÔ'?®ò®àNô¤¼I8Šþ9XÜ<½ƒ9ÒµÔ=_ç´2°êkHj[LØ{ÛiV½æÔkCkýe+Ýv ‹~¦Nùýe~l‘ýì¦;3Ùñ$ð^–o¾I²‘K÷hyÓfæK˜)mO“×Ls×h™Ñö²ÞÔ¹#L\0oÁWšºÑ4náÈìg­jÖ3ºÊ<½tÉ5„O$Š—ð˜ÔÒÛäҞ^ºE#<ùÂÜ\ÕÅUÝ[Á¢Fwj»Ø„ë.·Yscх%O±Œ éqɌ€J² -AÉ9©3~¾wæüç|ΑÿY«­>}„ƒa—Æ«A¸Ýʳ¿ù•¿!ÍÊoæñ -‰&v!^Íc—nëG65d©8MónÂõÞK>WÃö‘VCÎçÀ=ýÓñÓ<Ân€ØK=í®'åðaÅkÚ®ñç!Ïω—Êcæ4f0€üсñ§Wx•Óx£Î‚ÙßR˜;Œ\ÏgÇç¦üÕÖÔ§l:xbÆf_³â³³žµÕŒû3ç°×»á ŒüÆ%»ÔÈowêRÔ´4K¥K°Ô¥Wú,Ϭ™`˜‹2©®…¶5Dæ»+q Ìm7¤¸ ә\€2}¾:-6: ÓÈêD ÓzáÙÄtçhxVC²aÀ¥ ‚îƒ>®ký³ôæóÏ§³ÎóŒsú(Øì8ÏܗåYƒmòb\‚MÍ'`Ñs0× Xׄ ^û` ç{sB»ê—]u4üõG@Gß f?®ßAà[‘,lã=-|(sÝF 9å=¥&®9Èö7hc8»Âv?°nÚäýí3éÁrã¹~[¦ßÔ]ϧY÷Lid™}»øȖÏwö<¾×÷èëšN6éž¨x&*¡Ù K ]n{‹×¾1¨Aƒ/….n8&f·†ÿQÕ7A H™èŽëã[û¼‚º<ßÑ6ãQŸóh"²` Þ æ=ê3u8–ýèLŽß¬RpJ ÀùŒã {òñã3+ÿC“…l¶ÇǼ®§™¼8 HÿÆ10„¾*üm.sŸ7µoðCÞúä]XÎoòMÁêÙkþÀ>cw…ÏšØV—ÃI†ð -émЇõú;7:@L{»¾/ê;«üœsyî±½9¹ƒí%o窒mýßé…f M‘ºM/u.ÁÔx&Á”%—¢ÔTž]Šù¬±¤~ø­žú€$TGz\±¥k̕]íTc;kdàÔ"½íÖN:ÛÚô@Ê+o±±Bi{‰8ÙÊœ%ú|Ñ<: +¹áÅV /´ -ûQÆóÈ|µ³|É$í⪅¦Ð µÀ -ãgv “ç"«-ɪCV\6µ—µ˜…÷ÙÄ·Œ,¼æ%RX~‡éy îQ×þ7èÆnØÞ/ÿS·Ýíµ.sªßWà¡àv‰®y C˲Φ:š$ÓzxÒwX¼sÅ°+Ÿ¹‹á^»å¶L ׂ(ºŠó!³÷7¯ ºëìrÖ¦U¶ö—¸ú–¯7È´ÎE[lÅD< ÷è@͖×9õ ªM†g‚§.œéä0Jf–¨D(ԁ¨@ØÀN78E™a`)”´j ?þuý}ߟvÛ·^LHìG_\oßþþë>ñëVè,ûa¢åaZæaˆ%¯dτÄ@4Mwú–D¯ˆ@Ø_ñ™ë5‘5”¥y™àOFQF˜âhVËNÀUәxótµˆ:ßëg­×ŒEŸfü¯uŽW8®?ŸSaS¯ë€Ü¿è¶0ö-CX8EÃ\´ÿ¼BâÌ?Ϋ Ÿ©ÆOU!âY "nýL†…dLÅnY¸å •uâ~…[K³®éÉõ8½±ã3˜$☮[êñÕuÑ®è/ð«}ú‹}º‹Òdo‹¶¹º"ms9Úúb´V¿¾­»m•Ýóá‹WpoëÞ±õ¾ò×P£5=ö:Ò FA˜)$šxXEý§( Lþ—™®ü`½ÆÊëQAÐґyÚÿh)øªéæÀ#äÖӍ6ÑSæ7-‡N5Øh^«Á’M4Ù P³ëKc×BÃ,¹smÓÍm¯°g*³ó%-‘œseþØÂKÀ>kùð}´ìz5ë`½$CoŠ­©,³ýéè5:LÑÁS°OôØô Óûÿâï> ýÐ¥£ïcCðQ¾¯ñ±o´{mٞQp­3.txóž×7C.œ(B"„<i0òZæ2Cì¥@…ö\’;9Ð%Á£ÁS®íևz…r½ó%00¤^O_o³h·`ô—%÷WÉ/'ËßSò6ó—#¿÷¢öó—$_¼lý£/]ÿ«Y&z¹^nžhóé!qÅrShf -ÏJñðmEfãjÆw·n­ ïû.ïU5¼×ÜW½é},ŦÍᏖÍtoÆøkωUÍòŌóõO—ò•7>õ%ž”p¡Lç o·9WƏ-¼¦ý³–¯ÑÍ]Ñ;,ªËb<TðGñlˆ}&D™Ó* b»Îà1ù×™ÛÍC„‚—>Ìh˜Û„,½èõ†7l]*g%Ý÷”ƒ@>[ùk¨qkCü¤¿“TI¤Æó¿9YÈéEý…T§èÄ>½:d>É,ºÎ.:žìªº§ö¼=ûÚ\†Å/¬‰î8lىÎç'7§€^́s ÐpkÐhõ9îoåÃ÷äð³ðô©ø™ó/HRç‹xA1E…öëu9Qr6¹¶{¤\S›\•~^s„דMsŒëÉ£b‘¦>À|O.[öÇH™p¢@ą¨a”–é1¸œy-›#l‡ -&‡åvÁ€ñƒ¨œ*)ªµP¥Ä=ó"ª„HÙÐ$BH‚ÿ ïAÊ»¦‚yÍ}oÿñÒúת…}0²ÝIßÔÿ·)‘ûüŽ®µšºP­ŠjÙ(ªy¥âZéTœOŸ“?¡V(.Ý_j…ÚúéµoÛkÛz5ÈÕ£“Á¤:%5.¦`í7ØV¿„°»Fpê píê‹â÷·î-{bugö͇\š§9,[K½~bqwÕ:#ہ9’&Zªp‘¯#õ;nÿÃéOªñ‚Êq¡˜¢Âlërªä¬• NA:w…ÔèNXÙ[˜v­ÄM—fðœ0e…¹äÆ흸óêbÏCw©çDÇgºÖË<¯-s]µ–Of+/t<h!ézLòÉ°ˆ;æ?^þNj|P%ËãC2?ôxõÕmö®JÕ¤ó…«WŚ‚V³645n6En—;H‹_ðP¯x8¬|k/F½ä¡AgóY˜—BDkƒ4žÜ§¿ºKûps<ƒ¦Ë¨{n†+ŒWý‹°¤d¦\®pãÑ.Ç«1åÞ!øiõ¨S- ÓBˆù0N3ïÙf:&ÍãÃ2„yzÞ;Ç°‹ùJv÷9Ÿ\•ÝmöA½*y7Å«¼þ’®âSyé¬#/m¹g1:Û#íщcò¹¨­ñQ[—¯;0…ñóۀÖgÔ#á#rÀw˺ÝYu´[šë½Uíæªâ7WÍÝ=Zí¢aÞÒuæÌø`ö»^Ÿõº]ÎqrsÇz)^zàSW]>/ˆåIÌ *Óê>ϓøº®ÙX!¯/Æï5yh>·®»ªy$­#ˆ lu–MLàöŠŠ“o¾ xya_毫åý Ï~,×~xÓ<î,xÔU çî€åT£B# Ú(ü,¶þ;ûFØ^P¼ÝEŸ\ÙwUøÏw÷ÿßÿûw»ß<ÿýŸ½ù3¶Í†ò—º”æÔ¤÷‘×Ò<ùâ$mqM‚^“÷ ‹~'æ:zMT| ÀìƒORIpù†þ -†}=ð)‡îZFHP’ýÈ +ž7ԓ{n A3Îw}åωù÷£/ýa¢¢Ëk¦&~Mv³ª®š–îºÊØ-å5dë…AUº¾±›|‘F“îڌš4—rærLY'†è.÷ئ9žO3ñ¨5ñ1* ŸëJ¥þ(_«'z0ûÑßµ[×C—ýÁ5ñ¾Dèë4èfî¦'ùS¢¶«ãØÅ-}pÆzxöV-¦Í~´ýÐñ‹½XSü[’?o5†0џ§ù;>*Ñß:͟Ån‰ÌóIÑ[=m¨]FoÉ*ûèø-"vÒ˜ © Œ.öÖí&ÙO>Ÿèû5ñýšø~M|¿&\ë´`1ë4ÿׇ¿üš·„òô¯_ýêÍý«w÷¯¾þòË^uïóä‹_|Ãßýݯž½{w÷æ•hõ×/þôöí3hóö¯Ý²\-ó´À ç9즯™Ý4ÎW²¸fýâkýë_þˆ¿¿Õªõ_þ¤?ÿWù÷ÿêe(v?ßýëv_=á[¿Æµ¥Zñî%¨'íí~¶"×ïúY_ÅY⺂WøϏ®ß¼;Þ?wÿúÕ³7ÚýX"?Ú¿~ýBÆâ§6.Oo¾º÷úÍÓý³çÿ.£÷ôî_Ü=ýõÝów?ÜýÞø¿ðï÷ß~«µµÓ¿Ôµ2áÚK5†ŽS⪉²ZŠe‰´KƒK½÷2.eËî_ži]ë‘ ãx5„yÜ¥rDI°’~NRÑ.-W³Èd;a W¨-e\QwS‘Ç…ìRºeîžóµ’®d“‡]š®f؊q§¹ìâr%ú.Mž¯Æ ÏÇp%;rªï-WCÓ.Èo3«Ïln*Wi‚Û¡ WiÁûù*À¬¯åx%úÌnšú,­ÍҊ¥»0éG„sí‚tC$d{M¨£h8;™ö2Ê*œó•ˆ¬# BpE§’ÉMS(µsó µNqç+\Qµ›dpÆEVF¯¤Kø{"¤«èoW"íŽþåӜ®„O&Mš‡ätó|DzìÆ$3;Ïõ½ùjn´Cø->*æ%í¤¾qt -2Œ†äïI§0r_ŽWÂÏ0b¡\ ¢ïí¢ ¥0K!ȗ̳°rdïÉÐϘ˜1[g¢°ž.3Žߍ™_êÌltxæ»C-¢‹–4ŠBÔy‹éJØZ·0^ɲæfßQú&2ïæ(˜ä£ã$3»,»YÃë{²úÆiÞåñ…C)ÜzÁkr† Aöj h'ƒ—…§·Õ5aOHeˆ­Þ…Aº´È(Q&|Ùap1Ëâ”óÁfN>ìjd$d-Â+&« -ÍI3E^O2TAWwžtê{2Ó¢ñgF¹ç«Qž/sÂæVùvÏñ½ßé?ê엫‡‚W¸o^®¨²Î¥’Kg)²_d‘¡#bðŸm%É×-2qþì¥ØÕÁkC¾ÔA“e¼ÌxÄj'àÔÚ©„¶dñ5í±Ú ¯hÓ­Öñ0–+á:2–AX€,¯—kjÔdyÊ1AC9 Avã,˺lîd½‰rÚ=µåVQ%X{ö^¥NW¢ËÜyEãU”Uеg{¯~–?V?Ü+Úô¯uýoÿÿýÇ8C~úöéϟÉ1|xý͟ž¾þϔŸ¼yýí7vˆœå×wßÜ={w÷ÕSid{Ú,»üp÷/ÿ|áà‘•’恰*‘Nºmaj'Ž°©<¥þÄÉz_½8±\ ߒ±Á>Š¶–é!àñ•UJ;áss.< -÷åȵ,r£ŽØ( gZtÁê{²Mµ¢¤Õ;a±'ô½J‡Å^œp°¡Œ³Q„3ÊáÞQôÕ·zP´>8ý6§,Eå}³R…qx¯ øá²;›N kO†% ¯šd|…é¼\SErK…aF£+Kq&Éü؏ÖäɞÛ3Ê ìË+q‚µÕFœÔQ&¶ ­ZÏ »Øº]ݾȟªßìõlº¶Ý›E‚pcÀ÷9J轒smœ-¥öÀ°Eáò%ÊoKp’³V†Wn„9;Åޞ˜\WaWCDÂXaÜXb8à9–ä(Âce§ƒpqˆLŠätÃÀŠ ‚<_d@…µ !Ö÷„'i]I`ٞh§n‰ ÞیÊé1„M3HÒv¤…—k*:Žã[:œ"–Ñ$ÌW–ןŸû`‹¦ØÉ@ØDWI%X[öZ¥ÊlË0켞ŒAŽsk­ì=ý¤öTýf¯gÓµíâw×ß|æ7Ba=S0²lÔ$3&3-Kõj,< -–48èÄÁ ÆÒÊ'í1Ì‘×S ֜½W©ù -úþ®U$rw’¥ÐÚ3‚½g_åOÕÏöz6½ëÑô6ÄÏ°‡GY8)OäV‡u ¡p`îg™%ÕFáùr ó Çhjž°ay#Ï|0c³ËÊËxqXºs–Ë`  x ö #cr„®%Çy–­]†±î'ù)Îò‰¢Ñ,äSe$…§î–A?`»XOuè"\±#šÊU*jdˆ™Ò¥Ü-+‡ s…Ÿ#UN£øZ‰SÓœdæ±«Ë Ö¦½édŽ JZW—ˆ³³l£®Q£Ø«þuþ wÀ+Ûö´ Ƹp˜ø&“ú1Ï%aqW²¨Ù"Çc`Y KZQDÌ+“O“±×JÚu•Éñ«ÖªQìÕp5 «ï”h³®2§¬[u²žWæ]ØöµÙ7#Q“C‘–_®©MHØuA‡;âsD”EÝX–•à\ -Y‚ÚcsÑöŠœ`í=¯‹O©AÖ @Ø^Ñd½òöŒ`»¾~–?V?¼V´íß{$½O2pA `ªê Zà~¢P¸= ÊEî´´Æ(қ¨pkƒ$[À7h©ú!«©´ æÊz‹kƒj["LfÐ/e{Õ¢5ÒR"ÕºLÇÆþšÕ>.ÒÂÜ(6†ð‘@6mNpctUéϵE7¤/ªS "ÚîZ5PÆ8…Þ^¥Ø‹õÃüÁÖ§ZÙI/¿CÉ—åÀ¯ÔrøêöÃsa¼úý à¦4»Ïr¶‹ ‰7«ço”7FõÚ¾Àù#ºBu4:c„eÄê:‡!  ‘Føré”+¤ÀÑãL¿=ÜìŽýPΒLï}ÀƒÐÓ4ªÓ\É"û‹|JÁA e2ØA¢Ú³8¥Ê€ºfl®¢Ø×Á(1¹·q‚-€3*4ÊI><ϋºëh—‡%oZÀóDu -Áµkøöq-¾®è´Â$;jÇè–<]§ªã›¬%òṞB¿¹Z)°ŒXKd|2‚¨Ïs#ؚ Š8ꞛ`Í諪kÒ^¬Ô`xàVÓ¤gkkqêÛîËü9ÿz¯kÛÍïPœÀ äNt2ð„ÓÇQ‘ ¥nLÌ éj˜ª ë«Ì0öÂxCÕÖ)ø‡ú"”Ò™òå؉sXiµ…0 §;¹b' ÚP4Äþ¨êF'CÂ;„…ÛÌKJ.ÚW¨b8–• ™7dpJUÁd…ªÐëÙHM†l䪜j~>©èŠ>LÙ -Ã,+I;¸†FýÞ¹~¯üC-ƒuµRœgäY•8F`¬”þ°1­lé•2ð%~/íêbS ‰NÍßò †ªà­rµ4 -ÀÓA4Q§D74xlPû$Í©þ¦2—<^Ѽ9LŽíS–Ô©UɎh:/Me‘ÇR4k? -x¬+¶7¥„ÕçFAR=¥Ðùd‹õtٟr,OàöÐ%Zí^nÈrüš]DŽ‰Ðìo”oáñÙËJ±Í!žÁXۃr–¥¾*û9ôvÂJL¸qmÜuÕÀÓ]kÏ(ö¢˜?èï•m{ÙyeýÒÿ†•Ï£ì冼¨ ðzî` H–å<)<Ï)Ø•Ô=(›wJ«Êœb­ú«FÎ*·Êàޅ¡µµZ)öjý¼ö wÁ+Ûöµ™ž%á\u’X̗k2pØI¹kÕ,ƒ …å0¢8œà` ~¡=‘f0tu9¥6j¯:¢]µ2B ÅÔ6ígãõÓêS­Sµ¢“n¶!€ÍWD¼Â©žCõwäÉYq‰"¼©y‰’9¬²YC¥?‚ÝÆúJ&tmšçVYG±VíU'OË®« n‰úVò¼~°}ž?è]°ÊNûڍC€KzR´–è?ÕµçdØô ÃCó”+£t´Hs£<¯ÒKJóÜ?H8Gé*sJmՅ #›a¤U&\•1\Þ¨ÌiQ?®>ÖºUk:éèwf,pT7“ GþìŽólfÞيvÇ15'8²*ÜVPÜ!PïPè’rÄ;°é)Óâm÷I„¢|6ˆy‡€ -YÊ1ï3õ¼VÐ;ž ÉHz§¹%α¡Þ)1ê¯ÂÞÁtò…½£d9 ŒëtˆÎWÇ?¨Ð­¡ïІ‚*A -4ç©x­ãѝòÜÇ'C÷ AÛ»º*¥6ê -•‘Ë@e­.ikʔk£•âòcŠ¡λU«Úöó²êÿYpðtÏMŽwmdETÈ9–˜¬¥¥!ӝbC°wȽUåkÒÞt²üóv]]ÙÌÑ­Ñܛ­ýãü9ÿ|¯kÛώÛÁx!ÈZ5·Hœ,r—¼ŠPK@”ÐØGóy¸ðÕ)¶M„áÄyì °–—®®J¨m:Ë"&=€ÙZMX[q雬ë·ùƒþý^ÙIG¿CۇC­±±ˆ0_EP˜£±²†`÷¤@Æg±P–º(Ó@÷#¸ƒG@FZò4µð§˜h¤ñí¹Šü‡ÄnùJYƕêddr[ÈÔ#@¹Sõ “mºG ÀÕ¯ªHÿc"(…6Ê ó…¿êd‘ƒ†©”%Ё%à“œ,J =XÁÿS6ÀD£T‹† ]F¯ˆ‘®APanAÍí{k\#j˜«Aðx„lÞs*ºPJ:5¦ '@$ˆ P{ 0šÔ0TßÔt‚&‹À<ŒãXZ˜Îä;ª’•Å @»ŸK'€ÓŒqºzO-Ñ@ÙvòrC•—r;Ÿ=_ºPJðõBt{̺šœbMڛN«>]ë(lêÃœb¯Öokú÷{eێvJCEÏÇG"­à~'{v}8%õ2 Á^$vXZ«F±W Üß=h]eNY·êdÿ<¯Ì»°ík7I¥”£›ÐY˜°.Êøj ⼂÷â<‹ ÿö`h•5Šµú¼.A#f«i• Ö½ÖªQŒøçùƒÞ…ZÙI_ß#4–°5$®Æ 8"Îç‘kHœ‡8$Îcç»5$Σçᎉóø5&Î犫!kLœÇ8&ΣçÀ5&®† 8$Î 珬qî@ôNx4#âºp‚çñŽˆkç+DœG8$®F8"ÎC -V€8)¨x¸Tàp¸V°FÃÕ¸‡ÃÕÀGÃÕЂ5®Æ8®8®F¬‘p^àP8/p(œ¬ p`àP80hî÷c°†ÂÕ GÂy”#á<Ì`„ó8GÂy #áNw燭áñ×H¸Žlð5‡ö;À­F¬p(О«±­®FéiÙl^™£Üj£k4œ\÷œw ÖuÒÓõù@pþ ב ÃVaþåæÁ+0œÇ ´Ç,ª «È)=2­#„­Õe(·Öd†óó§üÓ½¢m/é¬ÍÝ ;Ÿ0j_r2¬Y´Tô“–jé)#3ŠYp L¹PXXs_—S¬Ñf˜P²l²‰ö¯ÌD„®Õ^hh_WŸk¨uô´Û Ÿ¤¹oSoQS QW@#x¹!œ›ÈFI'nª·ˆtō=¦™ùƒ8;çÐWækõyµ9hDpWY‚úVb¯úçùƒÞ¯lÛ×~T?Ag…»rȪ¾¤¼Ti¶‘aNcZàïqœwO" 8¬ÓäjŠiî*kk՘~%/¡æ]«L(y¡×»¶Z)Öjý¼ö`íB«lÛ׎[Åb² (lž—2FÙPvKJ–Üe„°¥÷u-bħLýƒ}eN±Výðsr™ Z¬•ÁfWº6õg{­~Z}¨ë“U³íåçڛÛdnTH£Óˆšz¹!ñE3íf•‰yÑd R÷ÒQÚ›ÇՃâ£#]u2d¼Ë€a¨¬—F’J0•0àV´Ü?‡m7.}]N±6]›42œ5€j´ÊÀv,]£F°7ýãü¹úý^Õ¦›ßÍ¥¡g Þ$âC.Äv2ÌZI…45)"×’(㌠sÐÅúÆìʱp0cS«Ì)Öª¿jäI™E«L(¢Ç®ÕJñ¹ÐÏkz¼²m_?Û! ÌRP‡_Àï_®©¥¦†˜ÍhÉ ©¨e\ûÐ(&ŒÄšmÑá ™ ºÊœbº½GÉ2t̏×*› ™j­VÊóú½úyíAëA«kÓÑ6‚Ÿ3Bî=oŸÑ¿Yjj·´7­*²[º=ä±4`7h<«W¸î‚X•ÒPÝ°@Ì@b îŒÉ¡ÙµÇt˶¦‘¤Y;3vD÷Œ´„x÷€îÄtÙ±á¹a¬¥S¹Â¹á!ún…æ†|¨ø-ˆv‘¸ÌÐ°Ü È|*œ=”[Úӈ†ŠäžMGq ÷ Üì$=Ž;­–ã΋lꊛ’6˜Þ -Ä S²¡Æ Ä=*Ðrl nb€`±\ƒ¸šËËF_#„9ÊæÃ}2ó'6Ï8ñp=‚»QͨŽ„›¹t¸lÄӇüv†{ƧJÍò‰Åҝ²¢Fè¡ÔjëV‘¡²[{=z»}V}Ì?Ü*:éß{@Ÿ†Pet°aÝvr…n/È¢#?Wä6|ü¹nÃà nTqÛÂàåÜL ¶Í|@d= ->*2µm̱ØØÈd[¶üÂШJ HØÁ°εÅj‡ž44€ö°Af ’ ´4W‘=AÝÙⱡ½7,öd_RÖȇeRek"&ÅöW"ÒñO!6v´ZVlCpl|{ LÆw ½ÆJÍqiÈk4Ày©Àk¬8F¯€×¹;0Ü5ˆ–¤ -»fŠâ”6¨ka>id&c]ÃpÍÇ*æºd#¬ ×#ó@­ªë¶8+äút¹žpð®ˆéZ!®ÕPÒL&Ձ«s5“­ÐÖXÁ”úü1Ä s«§zès£DºUd(êÖ^¶ö¯2bûl«ç¤w­ÿ0ô¥”6@ëF­Ðh³ª;xA y‹±!—‘5 b-çóÜWã„5ÀºR+$ºVä¨ikn ®¶oªÄöÑVÍIßZ·ã±;ˆó˵B¡±qù§£¥C´d™+T5lscéžÂÁÑË멄¾¹Q ]ë1 ´7Öéý“êCޓZɶk­×H¿Åd+(u£ø:ö°i€~R˜V"Y ¦?Õ«Ó*rBgnTƒ=·Š ÝÚëÔí³êcþáµ¢mÿZ×a‡‚Ÿ~ž®ÄŠv–ý¢y8+ Æ1æW]§…ñih¬?&¢Ð: ¶VæF5¨³Wd`ho®‡LûGՇjOj%›ž]rðÁÃ?1—ø -RÙȉ@ߑrYEJÊ9^r‰D%\ì㜵 [7sÃ[MNXaZ1^Q…Iz{+8eû®Jnß^«:íäw£Ó|R֏‹’†Ý~}÷ìÜ8Çû—Ou÷æùÝ«wOÿÛݟ¬ö¸ûÑO_½;ó8þzöÛwځŸ½~Þ½”.½ô«7w¸¿ûãÓ_¿þãÛÚÏ™h%—¾‹wòüýÝý׿wyh곯¿y*czûæõ«÷?ü³»ß½{üÓéêýÝÛéèáõ ï¨ÕÍwôŸï¿z÷û‹3{óDïvºyõ•½üäìeOÿõþw¸ê‰SÍc´,â|â*DYè”U=•1˜–¬­nz2¸ù‡ÞøT›¬ 4üÖª]½°ÉÉþ?ëë8O]Wñ½ó‰r9OfG¸H ZN§A/ïžêåÝq<'iÌ6rGFÏ>*ÂZ5 ˆ|3€Û×H`OIp´”’¨à Ü«/Õ4¼D® 렒ШáÕrTÈÀj‚žÝ;#¹Lr¼‹jFgÈt~ïD†©’ޝa±ë9Ž#„‰©a@(ô …à_H *9jq€C§„ò¢„0µÞéMA¹hko×ó—2|r.kßäT_R`N‹…#0+Rr0ÏnПg恞iVû֓ã<ê‹!.JIœ•„œÚ„±Ñ`ؽšP³P9< ÐSÀ璅ÇeU6cœëì!%}G^–4Øý@ò*_Ãñ[bby¼ÖÈî5k†Y<6AšH -S×,q¢iåà¡ólñç D†“’f⬒‰ÆYÍÀ³šº‰©}Ýۤݛ°y´A‚,ÂLR,¨ .¤öj¤&<âÞ¼h¦ô™¹!¨,ÖêB !n¼5Uµˆ ¬Þ4ô)« }à`Œ¼āN¸@bҏ‹4Zed€ýc˜-Žf6v` Ý®® >sÐ¥h i‰˜fåFÏ!Ñè)·é‚´¶<Áb,”¤?rkÛ<¤Ìþ±À†ÁL|¬ŒE…:QDŒkIIÁ¯‚(0WÑÀj 3b¿׆(©ñ}¸'‹†µóàoFd›áýšÚ/ ŠîÔÈÌ~0òaí!#ê책ƒîò&8b Ôp»Lê~°‡9u)Ÿsš´vxåˆÔJ‘ãfý9º[^Θ1žðd.òuK´èGIDa¦¥N!3E`”ÐXƒ¹ô´0݊…Ìýx’:ÞIÆ%S_À2qoÛhÉ;@˜Ç.ŒŒƒjVLS–jYqšcÒa&˜ÞÓy0i&§C°à‡Héœá_pË BuìÀ:4Ö*ö@óJѧ`)ҋÌŒA®Î#R˜Ýs Ì,Ln«Ÿ­·=!•½ˆSÚ9X]&£b[`bdÄ1¼Q5cÑlãóÜîHÚ ¬uËðŒËÆ/N$È+#e£ÂøpOo—Õ`âE©€èòôŸ˜j×h‚Ù¼]2FEŸ™¸ŒTò |&OÀ-6*¿¶÷„éœEÅNKøZbïÚ©r€ ŸJx^Õ=wëc¸ç{1Y""¤Žv+,C}mÎ8Ký¢ä!Á‹6[BþcB‡0œ@ÉƁÇÞâì 3nê~.:ƒ.Ҋ^‘p›GbT{h,òÊ Ù¬jù"’"D…áÙg}>¢šgf'¢×ʔAï ~â Ù6Ìa”õ=j:B Wå{˜¥õ¬´îÉgÉÉ –2`†@X„×Ñ:¯LgR.‚ ^r'èéƄ¨”Ôô¶ð¶b&Û’rá™J¿Š¿Ç¯Ÿ—ڝIA’åOHð=ƒ04y=ëCfçd)š‚¬q\Á” -Øà SќX‡*æs´ÓX“S1•¦ºPÉä"C!x[#Þí=9û0¸Ô'‚¡O‘| y¼%)ã £šbŸ»Q$“« yÑÄ\SÐ-E@ЬÒ#ÕAU'O V|À‹‰ÿ_ô=œ8yÐî›u+ð Ps0xŒÖ¦cĹgsˆX¢ž¡½VÙ¾²01\] xA[“ýÍSÐA"â#[*5nsèeI^%‹·½pǀOàäT˜çcM†ŒpsoZž„F›jæïãNCê¨æóF „<oÁƊõª ‰†£3jÎÂÜ× ÒMNKƒ~.Œ¸ø^rŽE2£ x5ø”¦ˆœ3RÑË8híÂhxá5f©ÿão\s²pP¹A‘„R–Ê’[Ÿö bʁ¢fæ3>5‘01 ꑇ„⣉Ä`wXÈPM1Ç3HYâ”xÛ~;µ˜Éx‹™7†`©#VNÅ6ýÙ´‰Wþ©9Õм‘ÇãîŒ -ÛÕx¦¸•Ê#ÔCIueFƒ¹ÙÔ!‡^$U}ž¢\fÀ@â¤5°2 Ž2 -&ÅáÔ¶…ªG}:ˆ°ÄK&¿àðù{Hȁʠ6ðgDœ`R4ƒô½:¨cbH±Ažåa6”pd®tÕ®h2ÂNdÊÑP—Ød< )Rl…M º0‰;Œšr¼9ì;d„-g®Fñ¢ž!Әé¹Öæeˆÿ(¤`IÂ,+ -)–=N#bÿº 4h€ÄÛÊùñÔâÔô 0Q!nwî4̺j¹Êt£pcÒ¨€û Ö^*Ž–Ç '³²rpOÄ癅 «0.L¨™V|mŠ²EQ«pm`É#†¯ âÂíPK{’…¯  ß8hS5—`яÌQO¾a,ZÅ$K™«GY_µ˜5±Q† |ã*•Š<Â4Qàœšôê%NÇ_‹HÚԅËj*¡lùì@`nÅlLLEVåÌ_ÓãÑ 0¡/Ö/’›r(q<ÎXêY…­çÕ4N¸RQ 2 8`«T?SòœT‡ôÓUw%ò|YªChxˆT®i°œëÏ®ñ:y*…œFrv¨oYFH]ò€ÊJLjv€*Vx /5ÅFðîàHс'×Ý -€ºÄ¨Eæ’O¼±V{Œ"7¡Ó/ó|U=ÙxÄr¨ÿH&­9ûíIÑ4ÙÍSéì‡ ÏiÔ$¨3Æ ”õee€:@‰¼Ú”Á¯èŒp ¦eý*¯VÐ6J4Ê¢yF¢o¶±ÄšÄ.®H ½q“yÀjçl¦~žÚÕPT²ÇIO}%Òû©Áдœ!mv ¦`]Ú(8 ¯(`7†´9ŽzÑÆ8LzòÑi¯b:F«1ñŽl1;€i¢&%–É͹kt5ƒ/¹>ž£™Y¿ñ—ˆô Iq©”WíU`ú“M²fw -¦GðhÆԁùMvõϔZjØ`Š‘ÙIӁN¼Æ‰ô1ÞȽ^:+Âõ^‘QŦrƒBi¨úT˜vT Ñ>ó5M-9*Ë @OÒ¢¸}]õȶ•s‡ÓçJ™«€•…¬¯ -ÿÓðIZ IYüF{ªoQNêØ`¾¤hN´ AÃYÍ#np›,ëû8Ò ¹XøçˆõnQÜÎÆY½.Ï«ÍMÙä¨P)Ô)E !®.e´<´„ú›± J¦UNI}ÎY-\5 (ÜÍ¥rщ†jl-F>2z!> ÷ÌþËóû‚˜-[n[^™É[0ýÑuYÛ¸eÎnیƒ;`FF ÍXc!Ïj\¯Jmz`â„.õ¦Éì‹Å¼.&kñ¸ÏÉ(lrýâGÜ25}ªe ó:O4}'b·Kf>CTЮbÀŽ† –N(Áj`†©Ž6]šÖš¯p°ð¤€ÕÌwa¾bû¹DÞ¿øƘ@(ƒ˜ÉªQ íÌ¥^ÚUáks[=ðAÀ»$K!2jØÅötZ&u×0µ¬öÉÃÀ´†AÍNX×Tš^Ù¹08—&!BåœíÁÿk¨ã¨Á¾3ÎñÅô6`•Eú„\Ó‘ -S¼iÐ&Y‘Ý´æ¨1Â4¼“0vûŠajLîÑÙ¿'Þޙˆ´.6:-¼ê¦áü@¢¨ô6wLÇÏ°3ê†Sås°¢†dGîù ½Ÿ22®¢uà%M¶Ë¢pþȏÅï§Ð½U¢]AŽ” Ð|“Ck ’3Jù‘ Û«±!^á²£…AW"Š”«z»'Ec} &‘”:2A”¥HÙÛ©xsÁ<í ˆ"!ðØ:Y·ATaŽÍÁªQ}Qö~=qÍO™‰ØàŸx¡Å|Ü€ߖ ˜|Tt„˜¹ô ržŠÉKPgnúä&Pù1Á'ƒÜ[C¦§Œž*‚ÐûE­êí-L3ü¸ÃLE4/ ´Ÿ¡úXTÚ¨X Äð˜Ńò 4èØÏ6‚Auö¤"éE(êÝrîLKx%F»ÃQ…+. -øä¹MãÒü¬ b¸AK渟᥁ãN}bÜ55ô¯!A.L½“=E^“ŠàddÖXôµÎ]pÛ,<‹®5¦†„ #*!>¹¨¢Í1¢–`¦ ÄjM!Ÿ Ÿèu’'+Ð<Ù/ï5‡Ôå±*nªÍ j{ -“"Ë@ Ä‰Qq‰#‰ôäó5ø®˜ -"k´'M` ,Ýk<Öa^×ô9ƒ"˜šM„qÕvNâÇ+œªà"/¼›JýMZÎ8ô\÷þރ³Œ^)ZšL͂DÅ߃¯"ėÔe̤1.Ö0«·›"î5PTÓ¢'¬övýl=²fRíªdäŒ}E‰ª¥µg^đ{(²;t4 Î †ŠÑT~MWº–7«,u¥cÑÒ¤ÖÇIÉRÑäWT©XlL‡vì ú–ùó°Õù3¼ <Ý-¾†©Á3ð)Úʐ¢Žö?ÈÄ8 µçp°f³cû¤ºóÈkèi¦v\;¹»F‰‹©?Q^] -=¬Œ…ÚÙ2¨{{J:CP3RžL‚\Ît,g5 ºVC/˜ZÝð#Á´aÂÑ;ÖxÈÜyN5qÑ¢uQ¨+ 3ë!@ïìù»t n5ER©¶ ¤Qᤖy…'6¤3ðÇ{W2Ý°êÛfz9}ŠSÇ+‚ Äc”¿Ä„Yo˜Ò@G^˜ix2e‹˜)œ£xbrqvÍ0dsÈ Œ®ì¦hØþpÕo%¸¶È{“ã’Ó -Á3éVÑ| •5u0ÛAd–;¶’ÀÓ"èHûkt`ar u4Ç} `ƒ«‰€‚ÿmvÑ ïAL@¨¾ž™5ñˆ2Êf9ÄÖR´ºfþÙ̒Øæ<ñ²É…`ÿŅ¨<é`'6¨ŽC?r0¦íõ$¸G,gJ‘pÓ^E¥ «Sü32ey1è~Ó¾ñ¾tìæ¤üq< -àvŸ-ðŸ~t ìF¿òTˆ$€Úї·ËvF}@âó×PµXòv¦/˜ƒ9å@€ÐM䧋±)++·í!‡iËy°GGLp¿[÷Šâ% ÞP—¨Ð@d;  $1bïpe“æəGƒXƒ°(AQ9sPÔ<ª¬kïµ\#]=¯H#61-«÷ȶXsÃmÎÊDÙä>R-H’É(9«‰&;Te‚í¥zàœÕÒ9z†`‚©œޜ\'5 Mõ?ÎŒ3…)ˆò¬§ô~o|&xç¬ê?~¦zà€O²"³‡vŸØ`Êþ`·æ¢Bxƒ^FûBZÔÐa¢¦92f³`êe†96ˆ±$¼y¢"LŒ‡%e1`.ôàá/´„Å à ¸y<¹¢"„@ Î€zÊàɪØÚÜ®:Dº|±Ñ?Pý -0_U•š,xûÑ}ã˜3%Sä:$Z½úO =ÂÆC ,-»¢.Ÿjeg*à¹Až‘î8 †{'m&uΆ40àt˜K•±ßtf"} ò€š‚Z%±ppß Ì¥Y4¼®YCrô~6X›xù­úüh–^¸dfwàú3׉JÑt). ½Ñ&`u„5ÖGñZ&¨¬ üÌp"&6{ݹp³| €ñ(sÿÃݏ~óîÍý«¯w?Øﯟ?ÿöå¯_¿{†‡·qfõ’ˆÑ,ª4¼¬dÅ)ŒC•µ²e˜  MBïY:xMpÑnc§U‚”ÙÚ ’–”ÁÂ~è`k>H½ô‰YïÇvӄS΁‘ê_¥˜È1+¦=ÍdéXTï2?ج¡_‡úžêœˆœ#¡æ5֋Þ3*RîÀ0¹Æ6 -c8¨À¦`Ž!W3æhñ͛ƒ¬ ìC -c~r5Dr,×÷4‚«(‡À÷SªG”0 û¨yp‰y -•Eàpeí\²É¤;®;ë¥ç ©–‰Îlå Œ6·Äêà½S{þxfUŒúÑÕ0cIBæÏ<­wA$”¤ö/¦œ†%WÛ6˜ø.³†1,*0^FÀ &jãäu  „x¹9†'>T]ä=\/e÷Aý0xÀÏ>*½ØõÉðìY½Œ³å`±»Lé6ãYwpxFôø`²à4)~MÃã³9fæ‚ p³ú{³œŒ;fÝÀ:¦^´Ð®"cP¦3½I&-œ˜ƒñKˆˆIÃcœKú?”§Q¨wm‘8ûx7Aّt=Ötïl'¹½1Ví…86!d€yÅLVR1¬ŽĬwE< e…Œœ -X݄Xjþ£yZh\æöN\xéDšP_2¤–®ÍØI;§ُ&jȨpÏdç.®ˆr(0´Î»ü?”áR÷&d:h†š´^T˜tj—¦!……°†ó€ܲ(ß+Âsádž½½¢X $ê¢ÑƒiF -áÓ -âCºfT„<üC5<Ñã'¬Ò6U|&Ö)´X€x9Lç%ê‚Õæb°æ¢ÂŸA(üª¨¼†81 G4 ¨˜qh’‚'²!ƒaQŒ½gԒÔ?0Ñ'!Õ=€m Ë®Å/1&®y¼FŠ!—*,üÎeCGÈaôýç: \óÈÈ<šìè¿Ë*éµH®ù¢øÌ":%§cҁ {˜³Æ¹°Õa:‡o·n®q„‡d¨†H,Ø íæ‡:ÕÂ?0ªý¤oéÎ!ƒ\ÔÛîÃîŠzæÙ $ÌŒ§Ti˜ñS²_ðšÇ˜OT¤2?€NTü (õd挧ÒzbÛ6k8šSŠÕŸ qe"(F ˜úP4åHS-0׊d¢Â~ ÆQFÅeð³ñzGÜÂ38d ã]@]X£û˜3õ‰#LÊ"¹y I‘`™š‰8ZlL -&†^ò‘ÖbÄ *oµø!ÖXfõwO -F,ºZHa?CQû)ØO½ÇÈ:·è5ÙDÚSÎÁq£w"¦QO{‡–þpBG‰a¸7¾•óˆñš½o¯ÔyרžbÖ甕âMb‘ÆØâ“Ì™‚UÒ=/‹õM5%ÒHJgŽËêp)K,š´vžÔá>ªâ0Uh„…vø9K&Î[9ôšÉYU ¿]Ã֍Ќk -ï·Çp%3sš;H&ãèKé;<[è.–à¨.~]Š'òùçW7Àð)ó’zÖ;‚n!3̬wU˜PÆë‚ô‹*¶©žX#ÐÚ`.}³ð ´UtìNU=üÚ˜¶xo°¨ÐJ.hÌRBÁ‚š""´÷hkï™VU«WýDMfdsŒbP-˜¨Oú51zr¡¼¥&9ípó¼ŸFý÷ð{ÀŽZ`meº6§s.ic \ðIƒç¾¤(p·k%]Ձ:•‡”¤êU°´~ºeMÛhEÃ텥ovñÄóC“y@·i_Yo1ÚµµúθÀüï´µ ¯Xð b{W‚"Aí­¢&àÅÂ$ÁNN œ4@{àD›‡¿fKd®H Ӝ7@ŠF³Ñ.meމ¼ óÐUÝïgúÔ°x4}Â-ÈL螬…‰É"gE¬F³q!7klq0ÆÁ¦ôåpe þÀ¢ëzB%ÛU=À3´×í‚xÒ9›áŽ±š–Wö¶q¹^ÆV-kˆR$Æ5)4ˆ„È«%Õ.ëïéúO͗M}`¬ü‰¦10ÛY×|³¬qVsMç1©¹h´`-æ™ã}Ÿj±5Ceԕ?M:Ý¥ ÷€0ªE}Ð =M½!¯-J-ÉõKj ª3N@Íc *­\“ÆP‘@QқpYý4j’7S^TÑv~ü*v.‹™,VÅxõ¡NžZð0£FˆóÌèJ;´˜0uú2ýû8c@%ƚ0€@NÖcãaÒ^7ƒ#à}aÒ>y|¨Vßl 2pïE·VFµ#{£ç=V9èçi„(Ý£´Øk1¡¦ 5zzPk(“¨€‡ã¶ËaèR«pèC ͟Mh ¦Òñ ø3€õÌí¶ÉQÔ°XDölá* epf›Ap™Ÿ6th¼çô¤½£ÌßÈHyì¤ †YÀ&Ïܘd£&ÃáÎKöÌ#Ö`²ÈUÛå³b˜fœ8+`%uó2YÈÉÂ`ý5"ÏAÕ𣙹’zäø#ŽËdé5ì­¬á*É@ЌF"ð£fð‰–Á"Xò›ºI.£FÝð)[4Þòž;3ö¦Ü›ùáӁãEN „C»@€o7«õ)‹&ƒ§Üš#3CŽÂiöHâ ¡ö±^–>òâ+xÔ…ËM¡¯Af³È<æÜi¨Œ`ö'‡m $Ð²\£aMtø¹kÎnÕìH³/" -g³:µÍõ\\jNP3?ÀaÄ¨‡w¨±½3#€tr‹ …<ÌáÏe=®zƒ¸‘Àõ=ªHãïÑ̀ÈÄha!üˆôQ&( X   8£®Gh%*&Ã(M–ŽiÒð²êsñ9gˆT4^“ì›ÑDÑð½áùýñ˜‹NÌíLv%†²öažjHôhÅ®‡-ÃØ`P§ÉÌ!Þ;½«fÑÏëïSE×0X=*ÇÄÒ7ùmÖeŽf¦)Á *'&¶B\¥óDM6‹9‹yqø"ªè›nY—–^¢‚ý´èWjß-–ÙkQX ôë6ô׈k@\Eh"Ó!ÛÔmEöï@+“Vx< ɖKO–¯cÕ‹Ê+§šl0ølÒ\v Ú˜Éó"¤ë9ª¿“‰/pÀ1ÅVîqjé1hGFí©èÐKz„Ú©%Âï=XX:%x5À¨·+ЈàGÆÐ×9k¾9vš7]‚›Î5Œ -VXsñ‘`Ž¿Á]ÎúؒmX4š¶Ý4ªéÏý…Ë«ßOaQÃò—8PÿA³·‡&,,†F-ŠI·#øX}ŒpÔãð -8ð ºdÓ5y½$F:›‡™‰–ñ›¼ÊF“ % -ïÃIE(!Öt%”¸zͨL›_ìŒ@ƒw‚•¤W%˜œWtßùcË 09„1^Ü C1sj©Y—avÅ,5Þ ¹‚ ~”©÷³ËÜA$¬bWә¯¬åØ`7HäJo(Ž|LÃáÑ^ÁÞˊ”8>½AàÅà³âi‚&÷Ôu‰„OÌÂUsò,BdŽr^Ü7iVŒ¼t@R±1WäV‹ªvÙ~¦†ÈÛ|·.&ª!-ÙGüÌ䐋EÀ¡ž–¦Ê8™x5’¹Q󁽍çâbۗÆGbe*Ö~A £ ™g̓0òó¬Y‹£r¿bç>ߋfªG·@ ÄX,¤ÜßãPƒŠÍÌH:|*b\æ¤ñ˜5…žz‹Di\U~Ä Ì¬_5zúÁ:h)Ú@Våh©Ê(nhP ã§ç쭟ƫbfsŠ!Ɛ“7Yª-R3,Í gë•÷Ôãê?ŒË­¡ŠZMVgµÍ}uß;9ëÊR,-ˆSc•`]͞¢î܏CÒPTwJÍVY)Æ(²)!þ |6Án*Š„/CWUZ‚³E =ÌêAM<×c•aÆ80³ái˜±¤¡Å‹!î‘nDqÞECàÕKq)[¼$Ÿi€ ¹³MµkM£8YXyýyì#&*mÒK ²åI‚s—ý!úšÆ:JãÔÐ2ĉ`QÁa‚!ËôÁÜT5;짹tè#j@j]4å¼eˌêÒeR"òÚXýâñ”uþ¥Œ¬'š´ÓÕð²<`;RSF‹>Œ5¥ÎY@Ü+OëbkjV‘£À ý©â§ñªfT¥¿!7ü Ó#if¢¡ä PJL¯c®†`™PˆQ³7arÆnüµCˆ€Š"³Ó…Î|—Åy˄:B”É'3Ê,4ڊM‡Ï.˜ýíÅ<ÛSÛ_MöðÓÄÇ™ñøä¾ÀYéV ±{?¯ù§Y£èjúc•™Q±Ï~upÖäǸú–5[îcÈ´@­ô©¡——P<ó1T[ÖÄÇÐÁ ÷¬ò‚Ì”‡–ö?ãkkÖcüŒÀ®UÖc¾¤"Íf¨9×ÇYÑÎË&ã1 •/ׄǰåJ ùŽfؾ]ºc`¿Ç<Û1¢EEˆ ·µNvÜS™Æ·¶í©Žc°»«LDZ&b®™Ž‘“Ÿ"IMtÍÿÿ³÷.=·$IZî¼¥ú{ƒá—ðˆ¦Ñ6M«u¸ ¡R“•Ðuԙ…ª Jüû³Þ‹™»¯o'Õ »$=©ÊÏvD¬¸º››½öØN:f¦OÀY‚°ÄI -t|z¦Ý@ǐƒ -+dÎ1Óð½LÎ1Â@VÌ1"!¨üMÊ1›9Ý}BŽ©¨÷ãb¢Lq| -š€cþ=ÞðÆ4>Ϥã0õ>'Üø´àmg£{9FC¶Ù˜F4Ú ;1'V²qhZl<ÌÿN®ñPÉÜN5ÆZ¡“i|Á­w"1Må hÌÙü|&Ϙåj¥ÌµõåÏb_ÁÏÅq×sNœ1 (ÙiÆðˆ•‚5̍Zé“e|uŞ6”1ÜëCŒl9ûçË3iO‚Œ‘ùG¦~㣢ôRÿF“^?¨ß Š1þ.×Î0Æ>,üÂÇEí Æp¶Pg±Œï¡Œhð‹ñQ£æ6ðÅ8w|!½B2\mÀ‹Y"ŒO'àŜÁÉßàŚ'Õ:ÈȤê“ðbIÞL3NxoÅHãKí>z9“]Ì¿©¼¼7ؐ”%ØŸýì»í§ñ^ÑŸì&D,¥ ú°_¹˜“8ªl6r±¬wOÀ0 4$#e‡Æ¼ ]Ì÷f‚‹éâ@fºì4ʨ;·+ ”j¶  ª–,¡EQ´2´øAùw‹¹vzù’,~n˼V^1Œø¶Wüx -Z1ÎYaÅP `V1>ƒCÇeRÒ>êqRñÓô©¨˜ï¾dqŠ1™ÂEÞ0Å Äb-”âóÑ7(ŧñ'¤ø´Z1 ŀ;à‡ƒQ ¶´v¢øtT-Å(yÆ/¡¢‰Nd!2#ÀŸ˜êùv'ž^üü•NLLW¹N<”Ÿ 41"ìHklhb–dbH§P:õKŒ|-DÁ%BîR­uÄ Ž{§#aÐE8æ.ÂÐcf_â]ÏhN ƒHÌÌ -ô•÷.ñÆ#n7GŒ°7T;¦Ãã:ññmò ̬Rí±²'¥@¿»r3êi93&ñ»ŽDŒÊȏ„!aãd RJú%kY)Ääi°¾Qy& °ãíÇNUÿ>«‰Ok[ƒ@Œ_"ñßd᳚7¶ò‡YòLJ1‹š f}És,?Vø0ŠñÛõ${Uíº[,ÊTºsƒ¡Š÷˜á“]ƒ—¿(ð۠ÀLc– -æ0þv¥%# ø›¥ª+qɐ18̯U/ æŸ+nł˜¯‚6üZy‘ú°aôíl*:¬aäÜá$j ãáNfMñh^œÍà cŒaâĘaü;ÆF>xÆ0vpÜ1|vy6Â0ŒüÈz€ÞßèÁ‡8| vi²ƒeSwt°‰vIÆ-ê“|pøÛ¨ÁôÆHh0ԛM½,U“×¹XؐÁÿbÞHb0"}L`ð#NÓÎ ¶ö;pÁ(êÉ -®Ön/rªx¨ -æF­NR0ÝúÝ|iŒJNðA21Áñ÷F c@‚ÅŒÿ•¾Ò‚®vlb¯œ¯|à0N8nҁýÊmpà‡yìžl` àÐøàrZ_ïT^¦*ÐÀW½&ø È­Ý;ß«XÖf‡Ÿ½ÖpàƒÄ¥íp`”ÃRæl`øaíJ40Ó繓”„ß`à×{ñ1¹À\·7,0Z$%©Àæ½&£+·”ŽKPÒ¹¥ °ã`àã -,RY™LàÃÀ¾@#xÓ5bV†¦+ó€1ðµá€1á`4`PX(õACµ¶³€«{x̊o¢ ¤Àßð\70ÔÎ+9ÀHv‹Ëdê© ÑJ†ãâYP€q«¥çVBIw6pÜØ!º$˜w…à’E -Q^›C©€Á1ø¿øwKWþos„-ð¿Í5îAÿEþŸ -ª¥¨ndCÌþ@€¤Y£¦¿·’áŸ` -ð/F<ÔwÓ÷D$;¯à_:ûm™÷^À¿ñ÷þM£Á¿'¦Žþ$÷÷Ý͝~0âÑŸ­Ø_5:¹Jr õCæÒsý½Äs9s‘àßí…FþÅvòø½Ô8ßîà_š‹ï£ì‘ì×ÿ–Gžõ ü ‘Æcʯ÷Äíz&÷—–»ÜoÜ_°ž„÷šû+l«©iJÐPéQÇ÷—(øv?Éýލ¼àþe{•öÆý¥™í¿‚û‹ÿ¸¯1±¿üÑÇöW´ßÖ&ö—xßÏÄþòŸŠÿi2Â*jt[ŸØ_&Áø’ö—ˆ<º û‹L•XÃÆþâ^ìÇØ_½PslØ_fèê˜Ô_bf±ê/ۏ¿‰ ý>Eńý"'¡²’•õ‹XäaUSî7u7“ô‹¿k=ß@¿7֜“ò{ÛeJÈ/³&×óÆøEýú9ÊDü26§pc>RW}CüòªëQ&㗏d6‘kŠ|nˆßG5™ü"Æ|ƒ¿øàœ•ï ªhï‹#Ð 2ݗTD”W¸o¡à ÷U`Þ© µ4¼´NÜé¾ԆÛ8ª©9÷Hº/ïôîË>‚JA÷¥1X/§hÀ -y£û*ÿÓ¯¤û*A0ßîè³Ý§ÍnA÷e• -Iƒî‹K¹¥#šp_v§¨*ÈSª…øìL÷å}aÁàŠ÷¥†ñ¾ÌÚ#Øx_˜ºØð¾°x¨Öý]6ð¾40û°â}©Ü¼Î‘x_vwÁX|_Œ&X_í|_i9Ar0ø•›±$Ô|ßR,Ù¿°rÍ€_I>µÙ¥QMZ6¾/Œô6‚ïKB„Á÷¥ ú ð‹‘\ìb~ՇA@_‚aÐ6cÐø…••Ãø-d·¶–€_0ön„_Yï' ¿<«/Mø…ôýðËX°áWe!¨iᗽa«¤“ð«fjgOÂ/úqJÂo!#STÞIø¥Ðû¹J"~K7tو_þÍ÷{EüÒÚk~¥¯Ê#6ßü¿~%/JwPI¶N -#Iø•öû¸wÂ/ý¿³jè“XMèîãu¤»íŒ_˜K3їŒ_X<}™ñKKä;'ã·dÿ #~y¬Èƒj‘Ô0xâ*g,¿œ¬éAâë/7Ä/µYœE¢­ V8j`kÂ/nÆÅÆ á"}£‹MøÅ;vŽvNÂo9½ÄÚ ¿,¢+„_ö^S¢Ø„_:ïj°~K¤á“ðKËe}<LÝþeI€qßóFøW¢œIøÅÀûšø¯ üê5¸ÇNø¥¯q~qô§ ùKÂ/ œ¸6Â/ø·+"èÆÍáW†ÑwÂ/~¼Ý üò+9Z~1y×Øø¾Ìô×H¾/Ó¤¥$¼#Ô­ìDüb¸sž“F†p? ø|Ž¶ó}a< â½µ 3<¢ûBt 's…û²+¡ÂÈ å!ý…ÑÈÛàOŒÙw\™P Óñ2œ×Ì^tffcáú’{?aƒÐ‘}ñ¼gü½b}Óf¬ïíé9x½`Øby»Q}¯SQêÜȤé`úÆß+Ò7m&ú¾Îÿ‚šÅDßûPÿхç{{Èžï}hè œ/þÆMÝh¾Ø‰ËsÓ|ok]æ{z“7–ïåGò½,’/ È l _R]{KŽ/ÿð,Ä»‘vØ(¾0⽈/þÆK _Å ù]¾×á䨾—[ÓÁ—añZv€/2{8÷à÷âD yð{¯hü°â{åm*$ŒuR ïUÂø•ÝK›(ÇÌfcÒ MîMéTo»”b‚;ÖƙÜ^äW‘¶Ì1`—6j/5¨ç5´cµ9³÷òÒrCö²÷-+pEì^'°çêýÆëåɀif\ïðª1h½D°AµÂzY톗Ӭ^ÖÄA©dTï<ÈBêÍî¥õFGñ#¿nszA÷@€˜Þ+@ïÆïBa‘wƒôBŒÆ…Nlôpá„^Ől[½¢>Á纃µÉâóÞVVlx^Ñx‰ç…ºñû ó7Œauƒó¢nâàՈ͋Õ+w¸z:þ^ɼi3˜´œAPMJâ¹`Ù°¼Y;AåŲNÍi­€ %‚+ý•Ê «Ú (&F!Êy'•—«Nÿ+•—È)6ê ?äu©¼Ü‚tÿ•Ê‹ÉŽ¡â òÂ#­â8²¬«h<üÉ‹e¼â`òòœm¥úhø·)º³`>Æ©;À î…š‡„ ÅWۙ¼ò0êL^8Ü“—6;X™¼tÓxòfòD:˜¼•ÏéÃü1™¼ Ö¡(bcòÒÊ,¢™¼ -áÕ+¼ ̱teò2îÙL0yÉÍàáÅä}ºÞ ɋKçê?¼¹ÂŒZVDØHAِ¼jŒ)O‡H^pÚ=ÇCa;EÍþ$¯âwþVµý&6"/#Xx?ƒÈËÖnAäesÉFäM×ÒD^¾5ˆ,@Ÿ‰³•È»Z«{c0D^R20xmD^ªì»€¯ÂwŠ\®$ò -RŸÈKå#µ e*¿h "/%N‘5*X’eVd]«þ—ý¦v/”UCß#]oø´ÆË(UWéä„ñ2¢2îš4ÞӍ—v´Zk€h$KOEç4|7ĵš7/C‚'ᓮŸÂ:Á6ãxÌ*eçñ"ÚÃêIãxÈzˆ ’h„µ#JãO/J¨úDñ^HÊ\%Q¼€íßmñÂֈž‘®ŸÕfýNïåïbÃðBe‡üƒ)¼ø}  •&êÁ{¹mO x/$Pë™^DrÙ¼—ƒ­Áßp1’üÝáØކß䉘ãw‡ƒ†Aß%êÚÙ»lՋлƒQàîg7ìî0?(Š~Ñ ¡Ÿ îâԛ„Oè.ûW#igæ.kÔ˝ÈÝn©×FÜ¥ ๸‹’=o ѳ¾ñv±Å'¸]¬ А*h»øNüۅ -áý`íB…ÜP v†í;g¢ˆnf÷D}i2v¡ÅÁŠ{CìˆØ]v¡áAÜ&@¹Ðø˜“7 ïÏ®|HàuOõ]öyø½³uQJO™º Ã!Á 뢪†’í¬ h~(¸º§›VAXoT]ñU÷ô¤P]œI3œ/Sȼ#ªg¤.œ— »ðYÀThjŸ38¸^®­ ÔÅ - ïmðtQU ׆Ó}Š>îÌ0]H–É×[aº0bØ –.kŠžž(]h°ì[IºkŸg‚t‡Ðƒ£‹¿ã‡’£ËÄÀaÁÖ¥ ¿¦pctQëØÕFÑEýbo“¢û¦ÝÇq䍡‹¬„^“ˆe1çC‹+zV­;C—Ö[Mì-!Ú´<ÉÐe(îíÑe«tÄ¢‹yŸa¿€èҀ8ß -ѝQЇ1ñåE—E vl]¸:ñr(cÏ -Š èf¾x£èÒCco¥k–rF -ŒîÏnž1F÷q®k§è"ä{̆aß(Þàšè±Òh'袖àp74ÕÅ=ÑâËü\ìÇdΆÏeåf“ÿMzî܀â26ÇûÏUeD¯Ë†èۅW>é¹3Ñ´âséÃSWø\®˜Xhz.#†Ã¥u“Ë¸á¸\8à€àÝTBŠ?îÈy1á¹*ºë§¤çÒ¾=—{°,Èô\^8¦ÓsóËp22ðAÏU=óõ$=—I5–V¬ô\FàÙ:ð - Þ!ÑjÐsé.ã mô\:ZÐ&=IÖa…Àø°°r£çò¬ZKx.‹mÒx.ë0Ênð\ZùµžKGÃs9Ò¡pbƒçÒ?Ĺ<†Š¯4à¹0P`¿Ñs¹;>— ôâ -|®Òð¥$?I7?—´”.ÁŽÆJ`· ~®’ Í&?—¢ T{?—†&^®ÚcŸÂ÷®ø\$øtύÏ%(ŠÆçb Þ¦ Ÿ }›Û>—y@ƜŸý< -‡l]͘IÏÍàl`^ €.ò0|Y6€.¬”QtÁ_¢]¤Œ‚Úº$Àaí]èæA—(\7‚.™H]ájΎ‚$%?—{±ìgåç–Ó¾]ðsQÌEIðsÕ~£ç2›VäSÉÈsîrÔ? !!ßßè¹°êÇLÏ-„µ'é¹4 ³ÑsaíxàAÏåf¼¦çòÈExèIÏEr’c]Ðsñ|)¬ |n6~î´ ‹Ã3¾dÜBum;@I]zj¹Yõ(ºÓ°tÓÝBPÜ$tóÅܺÌÎ>“ Ë‚käу ËôZUé×Ҋ¥]0t™\ú&ºÌ!м1tùÚcMK†.‹¹‘‚2C—ÿŠ•èÑ%^ ®t@t™,T÷ÕXÀ#4„¯pèÕx)J.}*jg]~\Îs¯D:½Ctñç@z1 º0\,ÍReX™)Š. îcK‚ ‡ԗ§*•kŠ.sÀL[EÊ;V î]«®‚šk-ëNͽ15ÍTD{q?©êTÀÊ̅Æù]3s^C´3`´Õ‚¯˜ #|Àæ"x܉ËE=f덖 =ºÒR‚åâoe¤ËÅߨ3ÛX¹¤£ÓžQ¹PÜãõɳs“ò”Ë| .`ƒsïxÜf½DÒq!G7kB`@ˆa‡ãŠ+ظÍÍ ’ÛšTY;·=ÔÉŒ‹$-¢êñÆ Î6+·?֘ŠËPÛÓŠ‹ ×È+q>‰¸¨ºÑü,%Í°`lãáÂHÁ”q¸Ø‰bhÓpKyvîi±V°pO7& îÑB…^†Ñ{ƒp!á@@,8¸ð(ñqn\„]™k3:ƒg2pQ#‹5ó†ÀEž¾öàâO8‚‹}ðnü[ÈtªÛܱhý:Çô[¨Êªð°~‹‹D1J°oqø9Š`eQ_¹ØE„O(K& ˜Nïwro‡‘öv¸eCPo£¶: ·Ã0…yË®­'ò6 dM¼m®êވ·P"V±0%…@㦳ïq_ ºŽò$íötk©€Ýž–`n¬[³Ô-xðւt‹_*&ߦsÞ]Vœ[ø\ðks‹Š°þ¹¥>Ú -3nÁAÁwdÄ-îÞ¯p #»¦p B&ÂöÁ·mN¼l|ÛÖÞ#d¼-þDa£Ûâ–ÀY ¸mÖIÚҌ9Øж¨b=œÊJšUŶE>ōkËâì¯è£@Pm‘4×δ­v‚i‹¿Ü ¤-þFz#ÚÖ®Å_m»_ ñlO@o8[dX\Rf{¡7`¶Ô1Üçβ=шìèYõ†¹^dlyBôa#Ù>,»/dÛrKŽí¥Þ;ÆöTx=)¶Åsª!¶·ôÒÃVu%¶7ßæI°½IÊx؂=Aø½ùµ·JL¯½¥zc×Jö“èÚËb“k«ë£vrío$Áµ–Å&·–"æwl-Ã}Rk5³$³×2ޘµˆy? ²ï-ÛC˜XK½O{Ö6y9Á«­ž½WËZè³ï´Zè@ƕ¬Z¬=ˆ' TíP­Éªöõ zORíÉXb P­Ö=½î Z‰)°Þ3¨Jwð–Òå`i°ÐIªe¶ÿ”ÕðþrˆúoÒ×øÛ{ßS//u“T á^¡Õ·*8µH¦Qºbj±²‡‹”ZTŒÃ HíézčQ‹ê‘^Ô,kƒP‹¿/ýó\}œNÁŸK„üOKNËè;ötg§¨ÂˆÐY`Uœ/›hÚ»dj–F¬½yTà –÷—ÆK€YÎø»(׍ˆ- ž(«Ú¨´ˆ cv (-ê‚>óFHæ!ѵ!iï[+ƒ@ҒÅz_ɚ©óƤEîHÇ-©kðhãï GÆ Ñ^ž‡ƒ2 *–¤‹ -RFVl¼‹"¹A¢Í¿WmƒCK|îý$†ö:%ÚØ(´Ñv¡i)$a¡å`В8§¾e‹yª˜-´—Õ9Á›Å«Þ´ÓŒ4á -)]àgGdO0Óg!Ûêm6ù³â5Å&âàßu$}–1ËãÜá³´á öìíîKÁž½ÝM|CÏ2Hڟ Ï2+^-gEfh˳qgƒ™ØÙûvc  ÎÞþ"wè,8Ãx‚9 ¤-²œÅßU!êIœ¥±´Î>X/‹Õ#ªvà¹m¸Ùgv•céa¾cl–u/åÜY³4U¥ž£¬O…¤Aš½½ÜA³·hZ‰™}bÑ”YV¦¹—ÎÔ"“&ÌW3fqN¬œ Ä,jqNÃi'b1HNj•÷KU˜ÇXù²w$7—½ì ˜l|ò\’N…—½‹î`"c¯n2܆–_…ÔÁ°"åóL®,ÕÒ×ó†•i„a¿ Ê=ârdâ®cVí¦ù:fá® w‡"üI”}Tɺe‡cÌ ”GTšº`9 +RvŔæá$ÒËN.´7¢,Å6Ü̋ ”ÛdŽHw…ØN”…Ò^uÕÊRžï¸!n-Ö0Ñl¦2‘f*ÍãÑï€#]ҝ¢ßY²§‰’EŽ ÄA’¥l‰yç•$‹Ä&V?’åÂÊ[¡¨–°Jç˜Sý‚©æ;ÀÚä^%ÄJŒ,–-ŠÉ­َ%{©óŽÃ ºr3d»å‰B]uæNFæ)²ïîÌçoî0ý=AöïFe·.æ1ê‹ù1Í C8”ë“š–GIê誅`ÎrFóvŽžðdýÄm¹Äx,HGþäȌï0¶ €íëTS«JN|XPVCá)\R‡ ÖV÷”k¡ x̄¢å6ËÍeOsߝnIûiä±jRÍ_Ì+e1$L£œÂ ¼ª;‘3ùäõ©[KÔÃÑ0q ovWìéxÚ%Oçb®Šr«Y”ÔA „‘`ieٕbÓâ: ÜÆk^HöO5ÁD üΦ X°Y*å XAþ¨C2¥¨xÄÐg°[qÊÀVâ*ù) Xí¥ÞÇXUŠ£ax±³=6hkÝ8‚ƒÚÐúšÄXögâò0¥\|©„®Õ%Q„VS– ÞÃã¿)§e‘íÜO,8‰jő ð‚…+%þ$û3Â2¢NN=Ś~’…T|èìÖu¸¹Uõòž™©‹J6ŽgWKhºÒÞÂ"U1"îw ¾ÐqB­ñ¨è,A§Ð‰¿éîhz»¶·‘ÜyŽË½ËqwÕÍìB—U‚ù½†·FKɳ…·È®œ‘‚Ea%üÉ -°Ô[O®$“Ÿ/êxðþ T^ïFc[È»júD[ÈEãr;Ž¦6×øÈ¢ä™-®vîv1|<¬ãS\ ’$"¥£i¹.mÈx3 †W–Ì敇æ'˜éSÔ $Ђ@cei2>DZ²|%<þÃ,É™´Ü£»ð×Än¦!+RD„ê!ö ¸ø…áAg7œ+$υåõÈâ܏ò ¾ÊâŸÄ‚™0-08žâ΀ŒÆñYã5Á²½gŽfv:¼ªVK´p.„æ b žvU©µrWVUÒÌì 4¶Ts\N·Ãr«7DåÆ»V¡ØØ -ˆmé°|b—à‡Ù̍ZŠ²¨˪Èxߔ@dYâÍÁ*5ŒþJŸcaf2‹`vü©sÀ$C Ôs”›ÁÒræF­'€î2ãÅ"HóH\»qzy4aqžÉ›€÷BW.Lô$d‹óv” -ï- žPWAR VÇü˜EzôZ”@#Ìw¡ -àÿòËu›Ì,nÕ鏊óqÜ÷år5ûð9—CÇ0H< ÒUlÈRªËj‰ôPÔ‚‚XØG?˜-DQà¬Aàƒ²1W­ý±–TòÓWÀ&s…ѳ¸R#è%rÜL| ¾2®´¥3I¹éíšñïÓ뻬˧¡…’R±h/»9¬3êjÅ2T$viÑõwDÆfŠQFà° Ä …AÞ.ú«'#t̄@ÀÂJ9Aè¯ÁBÿ¸‰·»Fõ+âEýº„ßy-Õ Xg0õÁ±Å~×é.¹!‚¶’YX•M1…o¸Ò¿<-FYÚáV'jbÆ.qÕÝÌXTٚ$×>áÃ/j3ñ§Giúf) ¸kNódk^:"ƒlaQ,,“ã6TU£ªèºR 6ŒdG³Š‰põ|NóWË-j_úÒ,JàÅÙ´Kªæ{4Ga^lr§ÜmD³t§`UGììÛ Yc‰î`)÷ÔrkÞòhO®Æ`l„Mìo=NʾÔÛ²öW¡@õ–šƒýq5pUK./§|çÀ¥ïùVr›®Ã¯Û à!mV33ÃÕrW]ñ‡~C՟ìt«¬ú„ÁrÎuÍ„F ]o½¢÷ºqÃI¯Ï±äû‡/[WïáÐi‡ã%Û¸zÅÚ -ï -ä,+À!í>5R©çéåPiaÒ¯j¾"•ÊÈüèÇKÞ’±Ì“M%©óÀìNôLÙ]t×¹‰—…ãû¡ w¥J 1ôùÝôރëóJ7Á¿°FëÇ^}ßFåî³¹ƒÙe¸>ï®!”i1(ÅÜØ'ĺ’²sC´SädyÅûxdKÛÕÇMi[9Ÿ¨­èö9¨%À‰"¡qò+Gú«b¼†È2dÈôaFдDp,7¹+ƒè"æ4aùÔ£¯”:‰Ü±îZ+x×ð©¢9\2‹+M‚²EÊýXæn8‰n/µhMQöBàH=}ñ–À”¾ÄåÂ|š~(­0| B݈.¼Þ]Œš ¦MÑvU"x,Q¡¬îò®Ãc&µ R JŽLy>Ï"-MeåÞ3Í.%dœ—Q´f`JZP¹‘¶øÅ?onèý,R&§E‚ïÖӄn² ùøú¹rηhx~¦—”4jÚ¬F/dI‡Ü–dïÚ9i.ä­ŽðÚÑ{¨rÂw@•/,}²zTÕÅÃ=^ÝxPLÀµ žèAa££Nåþ­" ·“{ÌrEHŒßmwÙÝçxT¤iœ>µÛ­m—,á‡:ñŒØà­Å@,‘¯'âiñ®T±sמ €±¸áXÞ/•™ÒBžjG©éî W‘î2?µ¢âCÑÃø¾½…ßF©v½Üôtœ\¶P@-ÐØ÷²X‚ê—Á[ïS'àQ°ªá'†CU0‚«âŽC¨ÇŽwä?L![`˜zyÝì”ï"YªØ5Zý1{ž»ªn. »@7¿Iô7lŽ‚§çñ^Øõƒî½SÁ/b1~; Dg"¤4A•,¥lþrθk÷/qfrŽÑóQxcè£PŠqS¸ÂÌ=µÀaå9±#ů9;OÜÕ¥#Ô/®M ø¾—Kœ¹"”D«<ë/?čhj÷“38 á!—Ìpßjµ7£¸ÀèÔkre}ú¼™º9« Šî· &>#ýÏ°v'ÇØ­¤)O¥×ñÃÒ`®ê0¼©BfˆÓíԐýB4ϋÉj®[Ť!ˆ¿El \ËÿnØ^mÖ­T|g =°"±–×KÄLm÷ŒœÂªÐ<Ü9X˜¥… -L”z5íÈç˜{Ry¿íI8¡øo4“nÖ äŽôƒ*唈Làǽ­Õ U\‡HDa9¿è:Á'Ã;Z±Ni¼*³›jK`Í¥KžEÙ'̒ -ñ*!iv i¹«,|×i™-á côG䑇žz¥ƒ†',©y©gˆZø£ìpÒNMؐ·Îÿb .™Ñ(ïéª?7œÑù (2օ¢hDDDü•@x½I–0\áðèh8 -ÉÆÎdP™| -K ˜U°ŒÚ瞔pÁÊ`!·«ü˜OðË[hɾõpÏûJŽØ¥€ôÉÏEÍeŠg+>é+´‰ˆoÈeËžÖ ŸdŪ4A;«¶A¸Æ±å¢öB0²ý•+³§t˜»÷ÜRf枬+©tՏµ“‹Ó]ÖüÁ2fÏ0B^ðði`B„„bôÛ)œá¼YRc€Ö•âœÚ“e¸|œÕwŠ;õMñ_ÆIf ’/Êa¸¸Z+å4È·9œƒåœ7̳·*Šy,…ÕoNLÅõ[{Ö|‡ØìïÇqz¢ÎÏY.Œ;|Gˆ‡*ÆPé2«!sÌsñŇ ‘ ã’ÿ¤6O@Ö<9þ¡bat×(áʉàßZ"Ò0º;!— wÑ|7m'´ Žu_ڐqíÊFŠwµ¥._áq¼Wµ<Îèt5‹f²ï´0BÇ©²q?Q;ê(¡ã·$…÷㱟ÅŕTNŠN•H2°ZýE‹[}[ʏÐn3û‘€kFOëvÝF¥¬¹jCöŸá6ì*€ 3æ¡^OƒF ‡¡&h]Ü/Ïið(ñ›3wÔÌÀU œ³ ~îÒÞ!„E5m°¤˜f}œ·D<•‚ô¦cåoÒƒänää Q:ZUâUí®í©D -à~#ìÄÁC^1fýû½UOƒý9‚#Ë£0ËhÕ Ý¤{â±ôÅ4ž%3FígùÍ.1† pºzï3Cá*©3` -%‚}½Êøtµù<Øm/ë ®Ö7‚ùf³G¥—0"ÄszØDé¾G)…¹'+Z0ÀózÎ3)”~•Á¼G£Û»Z+ -³[Œ 9—É8 ±ƒì)ÃÈ|Â}¬<5!ÜB -£ Ò'uíª˜†¡ßn¾G³:þV±}9Ï5¼À†e­9¨Ê~3#wš£0 uµF±>‰–ù«§!HZjRêá“D˜ʎeÃ#/Ü^;¦ß`¶ -~ V3•]èakúÇR"qÞ5ôÉ®ÄC(õ(À˜{¯ ýrÀ©|¾>uÀ5Ú&TF~á³r;[ø€…ƒ\îªy¨Vâ 7 «äLÐ/ý辔X–˜ -z®Ì_o¶–¬ø:”b§AX$Ká BÀðÅ5T*é½HtÇÐ#çŒbþ÷åî=°pÎã&×õÌ=j™«M8g(ë:ÔvDöp,K&ìê>TM3jò°%¹ ‚ óEwyŽ= ·ŠS Ÿ¹Þ“‰CêAáˆHÆ9"Ð+õ^=nÐ£ï– =•–Bôgr’Á,)!ŠÒ¨1¦úÁ"8äJéOÀ, þpͅÒp­Ï ™Kcø8ôD½ëi¥4öŒsöë@¿¢l·I!a°Ïe¾çÜîÁà% -‹úÓBPI ^Z ÓÅÄG€%ùD‹8Q¯iðÍmNÌí\÷‚g§ÂÁ´04Ÿø…iîžO—óö…SÙó^ÕʵVYë"äÁW\8cÞ¾û糆™nwfFèzx;I±ÀU"ªû¶U–ŒÒß ç2ødh3ñŒ¹ @ò ŒÀ4L¸¹zR89u.Šø->_–¤Q[À z¢ÄiÁÚ¨*†!…ÊP;4E˜6ÊeÞsa bBZÙ(ZÛ)÷ F -ӟäª5®*¡p¬žÈ*ô&e\ -i1:Ìäž -Ù1t}Ç·N -e\&¤ö¶Uý䡆ZLq0zùàºk~+‡Ã@ šLG¦`Æä‹bu°´uW76hêDÐ4%iÐZ…°Y¥˚`îPԛ£iläÍ(YÉÙG» -ÅÅ·/Õ ˜½¡´P»cE;{Å$ˆ§çP–’xœsü€…µïã™ÔŸ3÷ÑöéZ°4'`ôò®Ç*ËýuSöM¯—Þ¥Ý臔e@ ƒ®”Y®SvÔT©xÞ_ÂW)o1#;-Rºûèä†O nH7»¬â¡þ…x®sŽbâ±@î§Ñ¨¹•R3g㉬NÌü¹g3~W¬†ÇÎ)¹½ŒQ¢Ó·Éq +úyù¹\öbK‰þM«¡ºãCFl~¬ReߙÇagf³€n¡ð‚e¼Q‡iàTƒa®oGQ‹.‰uB%θl¹ ‡ÈˆÂÀ¶Î%Ãò3ƒmú"ÛR ïÎ,¨ÿa(˜A¡R‰ -Œ\ìXRsMÿ|OFæI%£dm2Êë¤Zê±’äÝfx™ŽXq ܳ]âifΛ•ý 3y0´(xZ \`ð>=h¸“T÷4½[4°¡zŠâØáï´@¡Ÿù£‡»Sõ#:F*AP¬þ>øbŸÓOûcr™åTd{Ƚþ1ÍT0ŒaƒŸÇ°ª¨9ÌÉaÉ¥.±SÏÒÇ.®¢Fà:µÄÓ;®NöÜt›&NŽsÉ ì}DŁ8·pss¡s•Š;wWœ…íÖ¢œ{¶[V{FSIüU°(W¦´…b–q,±TM}¬æ.r• ÙҀœ]«A©±b|浆O™õÆV½ÕTžT–àžJ×qՑ¯Ó’Î\´Ð‰„ÊFqáÃ=⨻i×ÜUž`à”(3f·•æ:ZŠÅ -ŒZ—Æ6tÈÎ(ØvJoŒÏ• ÆáXKŒ€kªEh$ŒéðJ™Ð¼Gzve2ŽÓüc<Œp†‚P9°ê¥ÖÖ[H8m:©” **&¦CP·V¦ȕ 3cp„¥ßKøM‰Ãâ^¸‚¤;~’C>,W.<)Ö/Fx‹—aÁèŠ;QÍAšÂCÌ2X;B![¢!9ÅJ­òìÝáH³)*-I²kÁº äp­äÝ°ø¡¨ÿΌkuЍ¥àŒÜÕf ½fÖ2Y ±É…lŽçP×)e –dÂ0霓kÓ­`sÓa-'…£ÝéêV) „È)„Uؑ­‘zñ§ --ñ©Ü¡Dò—C©øx(ëÊE“ŽÖÕðÎ(ƒµ°h*½¤ädRӛƒ™Siï¾NüßÑÞÃé‰2,3Oy \Â|%õ û°EAÖ ”š—îR=](4zÕC€"uX?QŽvš˜Àÿ ŒÅޙž -Ì,¿¢rœ”3]®Ø‚E]›Ð–¹§ô W´ĺBÝ]«ó—²Æ -sj̱RQ‘|ó´ -Ý"=+"ýq…W¡ŠY;¾Ô[åÞ\œqý3\kÌ:M>U5+xjËÒ fÔYÂ,%>,-RKá„(GDiCÍWpwIóyJUGáý¶«ú+óðS«; €gࣳž§Z t¹N´D’ϱÒ¯BšÉ¢Fh‹©U¹T»¯Ð -C”É'] æë² -wtL¢ÐŠ -ø&5•u¯‚‚áR7*÷Ô±dXa’:ß¡b=Ý®4߈¾[Ðô):p*:ƒU-K•êNwù‰°C»ê¥þ1•Ù^vlRæ§÷ #õ¤{31ùÁ“ø,ÎRuUÿä®, †™ëLf -ø›ØIN/ړ«â¯Uñq¹YfhÊ0ϟÂzvî…m¤R´[//»öÕì‚ I’âÂÃoวŽª›wgšâPÜdj⁞£ÈårÿÌï#»£ñº£q2>ìG»®Mâl’êRX¥¾Lf˜òô« ^Õde edg0BÔl{ê›T`¨8.ÏÇ#…™CÍt¿c¢ž¦²5q±´k–sÀה,zø7àvIÚOuLz÷[g\óc§é½°×7°"ýæ[EMOxz—–Ù´Œî*uíã“Ý~›Ú‰Ã2"¸}º€…ºnV‹³ Èô>{æDø«‡2J¼™ ±2g;6C-ÌçvÖ³æMkÃH4õ¾û;’r¦*>‚\ºh:\Lb&a@ø`…Ž›}΀ðÁpIªÏ“»ÊcK•ÓH­ýû®‡ÓªÅ¢+ZN…â]ZT\ùTÔË:¤®¼œ-Á?c†ãº‘i•°°b2”¾ØS\$å¸ê)–\1Uûø‘^*™2À>)—è,£‚ãp;DZN?d ¸ë=Êܕ<2š)a59krÀb׏6W‹qn÷…61 éêBƒzxGFcÇiŒ.)ë¡x¯ÈJi¶2O…º3Lê¸ C˞}¸â£é­Ü%. 7݄!çO.Ñ9×t|EÌ:†óu[m5æs®Ù9œ ®î4…à‹S §µìàx£<#wEM°”·‘x¾°Á5Qâ1 8Í…hæ؊:†õ®#D:Ýâ·Ë¼\Pª6ó'>8É#.ɞòÍ- `¹æ;ßܦ7I+ªêÆ¥ÔU+«õH£ËRä#¯PªˆÀɹ hÌtòQ}Je·ù·SWW¸±²H,T~¹"ÊèÃ%*öì§7UÉ*¯ª,dhcOv+q?Íå(ì ‘ŠjÉDâ[rŽKØh ;Ûb²e´7w5δ°Ð¹G Jꓰ+Ŗ°wþêma0’¸EçcE1ú½BþWõÝ×PªKw—IÕKòvu#"0§fÑ–í\8Áí¸2‚* ýhWÕ3Tö:¹(K†…Y!ú'9 ö^ƒR€GÏíxGºÒ <8%ÀšÞót1†7¦H!•ÄŒ -X sñ÷mZ¿÷ k”ÀbÝDWì"$Çj/!‚(K•U å†@kó½Í Y,(ÎÎesš“Æ+Y2*û¨žÝo.ÓxíÌlx· |ŠûìÐ -úvi%r‚¾a©^eΕQvò1°ïOQ½è¡Ý$¤ÆßY~Å/#J½®Ãz>#êƒ`á`Õ×Ñe'XÓ-Œ±”[S§"ð†ä 8Óð9^I˜]-Ò}º·ø3#ýÿ±"o–E‘› 0³ÈBîø0Úz¶g^)©h$)ߺCš…¡ x4Jé5üÞç…*çO%9nHäMX÷[ý¥¨±"ʹ֡ -’ ÉêØ W¥º…£õâÞ~TT-4I]¥Ñ)ÏR Æ#2J OâÒۂø{!e(‘Ûd_zºÂÌès¤+ènq¸xÖR¨©tö¥ðsxä2«}(ijß顶øÑ.0‹*¥Æx†Õ)/Z¨¨® 㮔–Õ¾ &hæ#ƒ„c>žÇÐ_!k…§k)%…© -´›ë„UÏ[«–jÉ -ä¼XHçäÍëƑ¥~¹m\&"öL:7•nÍ[Zfàðx3Õ;•÷¦ Ü0-hiÓ3¦;ÍÃE琩/ôZ~X|ûÅ I¸|Dq^t•Ž²+Ñ©Z‘+À d¬™Ù„êœ: lSrÍZ»ƒ5\q’n´#’q®!†•OZ×àüˆî¥:_*óY‘Q=r"ýÓ ڀ(ȱEãÜ5Z ÅoÈâœZœù£ÌHӌ¡]L—Ê2”õô¶®ÙW†(cÁ܈~.#®Já¡z€gµ^w56¯ ªŒ†ÍÍÔ%±)±¦r½è'î]ÏHVgЉ ú‰÷žh â*¯ÄâG™(쎆͘›çz[ƒ¯û˜={Ïÿ0хVÏĐEájVƒ€þ?+ÂPõÁ¸w1A–Ce nØËÆŒu‚|u-Êϕ(Ù@­Ìp"Xô„h³7kÅ»†Hf:„H# vQÜg‡›ð‡B­,ՌRÃá™áª ,‘înìÆTó̃ÿÓÕ)Ռb.e`ý¢±aüyévOŸM "SU!‹*ž¾¢O“ê^ÿ>⚠-É×¢`ô²¡Â‹žpuíDî*J<3! P" ž~¹ M…jµ¤eœñ¨¯ÚT'~QyG¹(5/ysø²ˆíþ:ðy]&=܌"¦¬Âáï538‰²Ör« ‰Z HXÈ'bSFiZDLh[} ÌÔáqëºYrˆJ`‹y¬KÙœ›ìêBÃä”긗&-. ->£¬ÉCýçx¨ªëÂ%0D•H©;¼L¹ƒè½.‹{i™œ5f\b §¾˜"–n„Í<ªb'3–z³?AUYË$<$í25†–åM*Ž~Ö\­7q}ôœèM4ç.t¥Ý½?8HPI„þ&Dq€‰P\9¯ÙÅÌ}£±ëñ#º­t¯6¹ÉÃäû­Óš{^v –¿ N@É@(Âgå2-³×Ëå®Qàݕn© A*ݹ[îÁϪíég{YáÙŽÒ‡:o+ßҁRÁ9° «LP›Emv–±Z‹ùzgӆ»käž*+…Y%lC —á|& j?q)ã=/#c  -¬QÃÉQä òU¦ ª¶°€ð3ÅGÉZVWlqÃá4Iw­6¿øq­)dT™cƒ™1‡ -œ.•YüЩ¼”·È]»·SI‹¾6è`¥Ÿd±yZcΆÍ ²FŽê–(]TZ#DÖ8vcZ´+bZª½¬{*.—áÍ#·¢„@¦;²–»²·E–®J;uÊâRí¦>xñ.?z­7^]¹×CvŒŽxë©5¶O՜ð`÷-v";ì ô%èƒÅ2̉g|‰­T˜0€¹»¹Š¿Žâüb1~‰SÞ1/tDC¯"ú+FꟘ¤/Ñ@»»îÔ>U±t EWWÎ5§47BœU/Fú2½GA›Xåö¨xœ\Êd؍ð1Ò‹¯9­ažfGêé:ÎÜ.ÐfÄW՝–s­:V ?®g¢ Qq'!1ýŽÐ¬y=’×)­E˜njᗰ¢.É ]Ãîõ¢’œü)Άµ‡ph­D=YÆ´þœƒYEÕXQòr3òPìA_–ÑãË.ìtæ=¾Ýî\µ(ŒwUõ«‰=,‡ŠõǨ¥º„…€‡ -ՕŽ¯Á¬û°”ø#,W(3u Æå‚Uæ€ù¶AFÇS Ü Ò&ñ¡±îâ—x:9¦´Z¨Ð7èí³)ZSªMó&,º° &˜ƒӔGînŠ‹R¡}YÁá7$õ@X '…„-e¿h8NUÒ^dÒ¡sfJ—˜4æ>Þ!+GãK‘‚<"7ZÒB\ZÙ|o(±î‹¼{»ã²$s­ğ#J‹¿ó;ÀÂ"z,Ó'AËÒb}»0öÈÛrŒ iáð„çą·Ú¯q¹¤´CÑ 6í-&ï ãDDw_¶c7q¼|(3ݖ=GÔêE¯°Û~„RÂ,æ:‹ýÌ[¹‰¹!S§:g_ÿ>™`šyÁœú V¿xrÍ>àݬ(zêšw¿£›̨¸ …:§*þB 9 ÏîOÄËxúð†âÝ=nÓÂ_½Êbñ®—&0cqŠÌñéjf¨âðL^èµ}\œÂÈ3©VÄT¬BÞx£9ŠkŸ“®Ï=¥@Jƒ5>‡áèÜ°»h²°Ø†ý°Ç’æ­lnºªî!,EҊx²OH3ÏLñØɊæË«·Ç«HÖ žlíQÔᱬÐÙ!Ɏ=ôĈp»ÆÓ¨Tu×hǕ{Ò€™boZÈßDÓ­,°cÝy{˹ð~˜VôT2XÌM_1†”´øJ D,[çvøjq{YnIŸ - 8Z‡ÅCÊevmnˆÙ+W„‰ÇU5ÃPíã¬icÙCﺽ÷tóMZ,CeK$—‚[ ³Y{Þ¬Æ`¯Z茀u6o“«2”|w™¡d\‘ê:«x.% —œ0÷N¼ÌcÙ[VCŒÖ(n;ï)W"‚‡ùpâ­P'¸js©AY —gQƒq1Æ0!1XÙ qۅWèïXíKœ .?¦ü qv«¹Mܤ’tÐ$Í)›sß·I$È3UÏÙþÁâY]R Ÿ%ìÔB4½ºJ÷EB®ªsœ‚#.5GWÓç?Ù»YƒK¥ô3ðé[}ÉÑCxä(Ë8¶ü ÉûÜç‚úˆû¸<ô%h8ݗõ§Tõ½¹`Ÿ¿¹“÷÷Hó¿Ò< -'v¢9¢o¬7 9ç5ñå컨ʆ3os¿A3¾_G7Ì2ù™Ë•©w“#”y´K’9–{)o sb ;jŽyu¯ìĘÃÀÁgØs¿¢Jüpø+‘å·ºâ=ñwû’s„›x €9Z ßMóÈä—Gǡėw'A_Þ­šÛéåÓjxywGÕd—ÿH¦Î†. -þX¢Ë{‹fVŽßtëvt93ž†Gs(AAUÚ&—Ÿ1%¯ärHx×v0 -†®äã¼,wèÒ8%©àŒ,h`ËQ7Î|~PË©­¨÷´œÝøÎ{2ËÑY¯¶ –ó¯±óÊi{ž‰+Ç1ê}NZùi©á+?{ÀiÌ*GXKÍ*Çâñ2ÙaBz™—îe’ʇ)ÿ **ÉÜ1åècÔ̓ÇÜ{Ù7JF9fñC¸ðé†q®?¥`›ÉÇe(¿ü™ì„ò+¨8(GÝåõx -Eî…èçGt”IÏFrѦ“å:áäW7;fc“£%Ðaê=#,¯å‹Ó’L‹…LŽe†üHޔ7²àa#yããel!IÞØPØÌ yãÁsRßHÞ´²¾ xÜzÝkO’wa5îYßHÞxßc»½ã0aZ oþ}›},0|g4ä )g Ž¡bÇÔOUeL7ùb‘äMY¨H,y“ŽÄ• äM3‘@ò擺ÆäxSdÃðÆñ¦°&Ê=˜††¤—“onÂOvãxÃÌæ×Éñ¦èöèOr¼! rãxS³¯©ËïBÎòõLŽ7ÞPU mojµ]‘ ˜ÆHŒ·@SF˜/}"³`90ސK„pƛÂgR~6Œ7Ì -æƛR9rñ–vŽÕj+ƛ{²ª&0Þ%—ñ†…Á»㍠»|@QÚeŒ=0ÞP±N|¥x³ÿr|V - ,&¸¼1Þsœ½ìo„åÚ9!ÞVX嚨`ôV䉮ïÇD³$x?VÓ'ÀÇy§w?w<]ûÌc9øݸNH;¿PÔ'á)\2½›äã¦J¦„w#êJÐÀ»¡È¹½¦é»*z%w£Á»"Ú$ßöµ’ڍ½øÞnÐn©8f7#Ž¬ef7{Ãw´1»yÑõЮʇááÝ.0æԄêߑEÙÁ¶yškáü™³»S-$J>†síÀnXYE¼nGqgáºñk*%Zh݅¢‰C%jî$üÙÀukŽq’fâºEً¶´ìlG"Å­ƒ Å®ü × ³*×M ékÆuÓP-T›¸nšYŽ¸nþDO87¦`&ӞöiÇu#°­zÕÀu³vC‚X7£ÊÛʬIëf½+}׍ - ýzàºy“TjºòºK@’×ÍíŒõ¯›ÅªSXyÝ,¡IÔ·œ„Ë%Á릅Ôč×MA-EÁëf(.؍¹KŸ°[[JÍ ì憪2¾£ ½óH;±›®W4Aì–×öfAk7w{»a•[b`7 Ãâ³üM‚†wb7#|’šØ­~,·4<"!nu»%Á$vsU¥6¤E$z¹¹ÇËÖaáP½!»e¾£`µiCó -Ù ƒè÷²›Ímˆd·Ö †xk-Ý¢ßɆìV÷GÂZŒìfo˜m˜µŠ¸åBg„KYè5L]\1Û° -Ô˜mX(lIÌ6·á!Ì6æZ…ųý˜-•”m,Ôö}…l¿.R•/Ùæ‰ñ.d›„;Ø³zN'¯= Û¤ °/A@¶ù@o·èžm>VÖf²Í÷ƒCh@¶iQŒt…l³Yh\…ìÇíC¶?zOŸÓ³úcB¶d°lƒlÓ¬ì«!ۊLÖk"µqT ò -ÙfHŒê¦€lã1û7 Ù“/ÌÆØÆ=p·Ûs™Œm}ënˆ±‚kô“Æ6-¼‚3#¤C‘۝±]‚n“ŒmX$nÆ6Klom2Û¸R‰ì±×PX¬@lÃ+t©÷ŠØž>p*+𾆬DŒŒUNb{1±Í&ÏÌ<b©Ü6Ä6‰Œb»^T:«nô sàÙÛx…­1b›C5&6bÏY » ±r=Òӂ±º5qî]’ÎîyŸv¾64rJE¯ 7œCJеñºÈ“_éÚ "q8¼6ƒHê„î1„®YWº¶¬T$¯ÍcÓVypõð²áµe‡’àkã¹3æ˜|íçúØF=Q”ë2™s##ðÚ¬/*ÂhOº6Úüô…­ !(#)ÁÖF׎[i}¼¢`0ÈÚ,_ìZÑ2—mÙW®6ÖGBÎ8èBኗ³T‹XHaƒj_n1–LíËÅk‰Ô‘ …¨†@·¨MýÇá` -\Ïá`çÎӍ1ºài! ã´ RSºz´Ùъ‚$³´qœ¤="Q»q´‡ñZYˆNÍ¢óÇ Šâ2”?[)ÚPR0Æm$ ùYC»‡poCh“1÷H‹ÈØ6 – Ý/EUv€6ô^* vàÚ~Ö>»‡b£gC£D0KÀ³!²»}žtý@vîoàl”( tanö)nP@³±°b¡íÆ̆UE`®Á‡ØŠºÀ^CŽ%úË -Ì>]‚’¼ìÓ=˜—݈ÛÜaÙÙp)XÙñÒDeCÿÂI|#eã"øsÊ>£½zp²Qc¦VW+&û @E`²Ï˜Ó‚’3jÆcÎÜ<¦G‚‘éé24›>ÑéB¼‘ §_ᇌpz|Ð ]Õ+õÖ -Á8ŽúœÑ~Ñtìg8½Ò±ad˜)àØOô46v03w4öcAH’±ç!Œ CüÜc3ÑrXuÇÐY¤B’‹ uZ«&û¾¢†±ØO`NƒŠýD~…b#Õ£—hd2 ¸OEˆµ¹x¢û·A±ifà# Ø…lâò|J(6sô¹7*6ÌÊ+›®â×Aš 6·¹]0K+çÅ†Eù­Àb—Uø[릧O,6sàt‰‹- -„ÑîK_ø‹jg,6ÏjÀ>¸š3xø¹Øp9ØàpÃb?*O(6XêDk&öcM؎Ä~<€'Á Ä~Œ^ÜyجncⰟ`ZåšÑK&A76¡$Wç†àp²«kగLÞÊÃæºBDÌÃæªî‡Í¨êp]çdZ3¶J}wà°yv­M6ýóö´¯ì©œeаi?ôŠÚ–ê²›‡ÍB•ž‡ÍK¿ˆ¨7;-{ò`6>T€‡ ¬«dgÅaÃÜÔFõ -¥¨‰Ã¦×ÎGµá°éԑ]8l€.Tù'6·à£ÛpØ<¹Ö& »®”L6«`8*¯4lZ5˜†MËp +Eaŝ†M—´º.¡i)âÊ¥¤aâʌ ‡ÍÅt3÷DãK«4Ë: *”mðè„ŸÅk¥bs)ªŒÎÄaK ú´‰ÃæÙ3ñ8lÄÆTú±á°aöOv¯žÎ(†3›+V6ÌF”‡Íít7ŒÃæÁ5b­8l®È] 6ž¼D‘æaOÃÄ^Ì&bã'´ Ð5ÃP¡s_°5-\ÂÜ°ÆDìŲ±§9ˆØ\JT`"v¾»;›éñgAb@C ±™Ô¬.GœúOšù®›YM¾M‚b31ɨÄŖ(ÿz&›¥! J›Ûpí¼Q±¥¸¾Æ¤bϾdAÅfì¾Ï7*6qªêYa*6SQlÑTl~!>X»)ŸTlx “ŠÍ˜;]lTlFœØ^-°Ø´h¢›‰"V,6ƒ:=ï;£ñµ±Øˆ+¨ÐuÃb'ÖݑQå?H³”>°ØõÕmXljQ¨¡ -.6œM7ÿ0›¢]6.6Ì\À'›>¬àbÓ¢ö‹+›G¤ (¸Ø Ǩ ý‰kumÓÎŦ/Ì´yp±ÉæcÏÀàb3ƒ¡†š+{šƒ‹Í9­ƒ‹ÍÇþ fwÞq -i½‚‹Ím¨áÚ¸Ø4ó™[¨Ã«L06‘ã ‹M'+Ћ Íǚäb37TÝ©er±#'« ¸Ø¬j~VÜ5¼ŽKmW.öcIZ³¹R RÓ°A±§ÕÜ/ô?Š®å|'?¬þëÞ÷ãü´#±ïrù”Dla”Š0ûµ²¬]@—$kŠœ`bv²s¬Gt} Œur‚b=P¸A¬Ù%§i…é,ìöÄÙ\°!¬¡Aå¤k•™ð €õi¾ÐƯ&À±?ã«Ï`‚½ú )•ùÁ®Նñ¿@Wã×J²¬ëü~: -p5|:R7‚[͌úói§V#yÂÈ_@«Á âgÌêf¹ÐŽ¬nÙÈÑÄjÔ¥pj`u‹Õ¬NäSðªaÐÄèä Œ”l¸êý‚V ºGƒ€U'¬}cU£ÂNu˜.Ij–¢›T]‡?ß T]CEœê -ŠÀTÃùפºÚIH5 âŠQ]£oꆨ~yZœ&¡ºÇûe@õÉìO}rœ\ðÔ,RÿryEIÉmQo¦éN”þ}–[b8%ñ8ÐÔZ‘‰¼¡©æe˧$Sw·BK0õåV;—út¢!±ÔÅóvP©-¡Ý¡Ô*E±“šÄ„ç§DRߤʼ©haãŒRß^Ž:bóo0j뷒E}E÷ £¨kTßí(êa`O’¨­±L5“8ԌÌD¹&>nOZ ¡ÆûQ\É7!Ô¨#š"ˆ:x¹½„ÑGÃQË¡I nv¯@]ÃOþ4 û ÞNü4êÿ†JQéQa=Ä×3ÙÓýAßØӖ¯zúdÈ¡Lò´–d½¾‘§¥q¹Ú$O#L{²B§©O=’Z-j.bCÆa`QÿÄ@OtÙ¿ý²Cókò@Owgù’< ¸OŸ5tÂ+w ±9;D§M>£,vƒNƒ BO&˜Ó@ƒ( kä4 —·˜ ¤3ÄN#LqWð¦‘8nESÅsFé±ãõÁrD5EÍ«#ј¬é»DÖ[Fâ|{›¤é§("±ƒ¦aå iÄÚu† Ì]V o˜éÇPœ¤L£â×h˜ôÝ»-˜4{џçK€L¥Ï’†Ì4Ô߆¯ì éĕG:Q˜‘¾ýõîi”ow.ÊBV¢%C†êˆýDH?á ‚4(ZGð¢+#·qãG?këL|„u1éÑÈö0µ±Á£H«n3u¨—êUŒŽ¾½ˆÝÉÑ·øvɍ~¼:Kl4 )϶S£É gÛha„ 8.9V€7LÔْÌSV;Œ·€d/# -0^«†ÝˆEÃɑn³c(½^¿±–nÔkxÛÎ!Œ:Váp÷‹Â_Ûa§q?‡Å>Oxv¹´÷áu„ÿ‚›|¡€v¯u?<;6ñÁôL8ü˺Q5òZp·³„õÀÿÂí-ǧõ‹xœÇ’‚ßcHšŽsµÃ蚶—‘²þöf´¤B×·Ø»Ðûa፽^‡ýlü~¾jÛ¹ý5¯;þi¼Ü~DÒ(ŽßV»Ï„Õ‹Byc”7#äù`;òxu|ÚK:Gû´Ÿƒßÿ̹åiÿýý‡Þè~÷j¤ÝÍPÎk©ÿ`¶½ãe>Ùjµ¼×ÝñR7 "3ªÛ~¿ßa¨°ªØN£xݵðbÜ®nڗ[1»Ü´yûS œïW¡õ÷—Æ·§<íË+‘‡]_ž÷áÿ|ÌøŽ§s‰¿ß^œû8îýgŽ¶³]ŒÛ¥Mûræa—;6Ïa¿½ø8åûÆpjëÛ <oxڗ÷!»¾9îÃ7{O5õ|Ù*…ø«ý; <m#ÛbÜF¶Å>G¶å°sd[ÎaÙð#ˆBì_¼v÷s˜öå„ça—Kûp¾QóL?ʇ[„yæhoÇÁ”ÒùÉ,¿¸·Ó[ìóZ–ÃΫ^Îa»E˜/D>·ASÀ*o;ì4îç0íË ÏÃ.—öá>ä-šwoŸÖçã^¦õùb,ÓúbܦõÅ>§õå°sZ_Îa›Öçã^7Îc=ì4îç0íË ÏÃ.—öá>|å-ÚoÑ|ÜËq拱üâbÜNo±ÏkY;¯z9‡íÍǽnœ/ÆzØiÜÏaڗž‡].íÃ}øþ£»B"Þu~pW¾y dç\o>LeåõÁ]Á ŠŒÃîÝj>µ» -6¾»+ëÆÓ™‡Æýû<áyØåÒ>އo2™Î9z¿½Ó©XÎaºËÙ.ÆíÒfއÅšwlñ¶Û»8ËÆÓýXžZßñ´/ïCv}s>܇o5™Îiz¿ÃÓ¯XNcz Ë /Æíê7fފŠš7mq¶;¼øËÆÓY\ߞò´/¯Dv}y>܇oòÏïßÒÕ>Žaß>ùæ~¹»ñHø>n ½×qíãCµ†|ÿ6m|֍ç'?;û9,öyÂó°Ë¥}¼ß~9³ßáù-/§1¿úå„ãvuËÐ1oÅ2ờ¶|žÛ^¾åeãùÕ/.oOyڗW"»¾<îÃ7^Îì·w~ÈË9ÌO~9ÛŸ]Ú2nÌû° ;óŽ-ßæv{—yÙx~òËSKãÛ#žöå}Èîo·û0}Ô<=ÉfÐæK@øuÅæu,ÆÍEYìӟY;=Ÿå67éã¹ÍHËÇÝÞVP< ­=¦·½7×|±O?~9ìôøÛÇÅÓöË:ÏãPïŸþô«=Ðû· -·oö |/±^¼x?gÝ¿|<â þ?S6¶ät‹õöëŚ3MUÑvO@’z_Î7#Fá~.3ì \ýÓvX†îúi;‡0Ι湮·­‚ß;û9,öyÂó°Ë¥}¼ßr¦Áïw¸E²†€Þç~‹q»ºi_nÅ<ìrÓæ9ìwXîM}Û¸J¥·?¸4¾=åi_^‰<ìúò|¸ßj¦a¡Ëûí=\š´¯²½½À‹q»´i_îÃ<ìrÇæ9ì··°øxÛ،ªý©¥ñíOûò>äa×7çÃ}ø–3h^<ȶg y@f9íßih®Wa¿]oFëZg¶w•Øì‡mҁîçВ>þ~ädcÉuãKáý°Ó¸ŸÃ´/'<»\ڇû°…Ä@õTßb z€ëa§q?‡i_Nxv¹´÷á+Â~‹æ“_Ž3Òò‹‹q;½Å>¯e9ìõ9|ˆê…z‹ö÷[´÷s˜öå„ça—Kûp¾É€@O¹}¼½H'$¶žÏxÏ·³]ŒÛ¥-öy–ÃîÉuŸÃ‡äú~n[rý™WÈiÇ/uµûLÆ}î£îb܆èÅ>Çóå°sä_Îa›&>žÛ·.¦kÎâû#ìÛªN¤ÓÓh'ò}‰!¯7ƒÝ^¹Ø?ÞÝ{ߗëÆsÕ0;û9,öyÂó°Ë¥}¼ß,Ø-¿z¿½s!°œÃ\2,g»·K[Öó>,˖yÇß~»½ËB`Ùx.–§–Æ·G<íËû‡]ߜ÷á»íZïwx®–Ó˜«†å„ãvuËÒcފeå2oÚâÞowxY ,ÏUÃòàÒøö”§}y%ò°ëËóá>|³`÷ˆðß}•ña|ûöÉ3ôVßÆÆéÎûÃøÀÆ+wÛdžÿÞ¾LšÞdž¹áüØç§qÿõÅ>Out¹¨wàÛö{;¿âå4æ÷¾œðbÜ®n4æ­XƜ¸eËg¹ÜÛå Π痾<¬4¾=Ùi_^ƒ<èúÂ|¸ß8ì°ßØùñ.ç0?óålãviËX1ïÃ2ÔÄýZ¾ÆåÆ.nn8?ðåI¥ñí±NûòäA×·åÃøþ3öúo~úé/üáWŸ®÷¸ëß-ôÚö4îõ“þë¨äpמ‹….«ý˛]%€µýòvœŸ³/ÇùÉçùmĹÛÉIñ<ËE F{ÀÆ×/Êx€Z.ãy<§ŒuHŸããèÞ¸·ûãmˆ_ü"õe}ýԃʃÛ¸ãdÐñ¹TÙoì,ãh(oàï¾^7ÏvødúÝòdXwë-ãõ‰Ùˆj0]#*¶d,×ásx 1ËTÚéî#®ýA¯KÝæ"dôAK_oǃÜ÷®6oú:«ËgPmz- |ãR—ýYk¢{ƒg듺ÒØÏ—å`©Ð–{€^Þ¾‚ž÷|)aރ·çð9Ñ -*d¶°9.?"0È^÷ÛöágM2Y<8 :Dì?Ò²4´íãx­5ü{(ºóûéþ¾6b‰Ì/éyîiDGmÇ·öëʍ½iÇd­ƒ2Ôùµ3˜'‡æ°|Ö¯CŒ«·89TÖيvV6µ³„ñõ½Øxð¦Ä¯ÜqjMÐNهnRTÆɈÊׯžÁßæIýöE–âáFöÑâYÕ>üdº_pðçÆý×Å~ MoïëeË1‘íý±ž¨*²1Gv{†‘ý¼%¹_Ÿóød%{ÇÆ(Z²ñŽo}`ç!Œ1αeêW¯bÞUG•xk -ý1íÇ9Â^ž¸«øœ‡åSôÑÁˆâYïq_a<‹ß¶øøü3¿8ÇKíÅûórÔFÜíYë8Ô­WÆZ†%†8ûò™÷êV±´7¾No|Œî±¢Ta€:ñ† WžGˆ‡{èÙÇÆñiã°]ßéÇs˜¾Ë%­çˆ–Ž`N=æ@¾„ýŇz-À8žÃXã“! ü«Gž÷ó§.Ûÿv»o]ÑËxæÈBϖ?¯¼'à@8Âsþ!§òŠ gŸï0;•$>}õ*ÖςΫ¦ÓGÔ!Ùï>Ž5ߗ°Ûe€ýÎWuvàA¾zäüÑv‚‡æ+ºë¯*Hȹ*¾±Pý’ö£_ËòA||ñé«GžWz‚ö•+emxu¬•›Œé°?TIÒXà$Éx¬¯w¹N¿?O=ã¯Ï*6îùÙÕ#^b*>ÿ̹­q›~½s¶y{í5Û|üþÃØx;ò¿å¢uþUÑ{??†½žš[a¿ùå“Ÿæñäelãzâs½ÂC8ÙÛw| 1¯6.WÍ[“G8êíß*#G$ôÉ0‡'*ÏQü^îrµ‘0H{ÞqØ{ÄJnðßl,q¾=6žñ¡>pÜóóK`èžž5›÷sÄU†ý?€+]—³Ç`Ä ‘Œ÷Y¿þ¨òÔ³ëk× ›·¬óçcçr¬äö ¿a,Z*Ò«x}·*ÂCúEë͞ñ7#°uô·­Pa¼çÞ7bÚЗ°;Η“¨1†ßà×lûÑxžµÎ#{eÄøßçÕFóåÒ㒱”¸²zÎý_·)LL>E9 ¢ÃßPY^/†K–3xr?ú¼¶ž=)ß±»åTð„ñµfz–-óÈõˆõO¹42á2z¼£÷ã Fg£ç=1óо¼£‡¯‘Ü;¦Vß´„Ša—˜%=ÊzÜöâ%RG$ëñyµ[·§ÃË-ñí´òÌ#¼ÖM9‘ŸÃ¿¾õx—&ls^Óϧpïë<ÂËӈ)áö2œÛŸ=îeŒÅ`¦ž±q³+°^¼:O‹GhfËA¤÷îMG“ 'ã_:sË!œ­[t'ñzêövvpŠXO¿ÃøúÊÊbÌ#G> ×ÅŵÌÙ}ðÁC>rõâwµå*N¨'|ä±|£j"Eº·‚‘Bo9_‡a?_wëºâ…×›†fwù(4÷žŸ&ü„|}Ѻï¹Ò¯»ï¸¶ RÂþè£ï3|‚‡YºóÓz®{9r¿òӊñs‡=ò.\ã^ŽÐ¯°Ÿ£yã™3à¢Ä[>#&«ÖÆ<ŒÆ2·çª o8d0bæ˹±Ì/Ã3¥Oøuß¿„½•¬™Î“±žq+JyŠ’É’_ rsjùűãUkÊ0·Çé5/_# Ç]ûå#ƒæ;âóÏù2^Âîéq8 Û>y¯yßH±qu#ÑX[I_®ðq¼vGø§ä› \ØÙŽ¢+kŽãŠ[Ó8GŽóµ†šG_cè¨Óù¼JÎҘÓ~¦«ùôÒgõgœØ^ÃEŠ -¿Ä¼ª"gêï!’²ŸãåÊ'ûhÔDԜ-´ñˆÉã¸â ol­o"£_Â>GY­°yGùʵø¹×üÆG2t„øH^óHýsPP‹ÛÅ<ó:³šã -öÏìÙsj\ÁÆg,‡âÛc¯ä¹2Ì¡Ýw­¼¼‹¸;ð¾†_åçVL4sRÆCqßóêPóSÛsÜq„#‡Ø³=w!—¸¯ˆYÍhÏqnV¾„}´x'bD¾÷Œ'ÇáÄGH/´ãšG—Ä TÏvæTãâˆøG½ôçÙ¢6' yóÜZÎo1|«IKDz`TŸ•¸oˆÐÎ#×3ŽüÈ©¨B¯69ˆÈSüæ.ÁÞ´ºƒcýĹ¡Oº½w¸Q³@¾./yŽSO¤†Ÿ€q%ýXk$®¡‰ÿüš9@ˆ®Ðáæž^ËÞ3h>n=$UwýEìr®Uît¿!—,9¹ÙW’<}ò§PÆvÄûׯŒ_㹆‰©-Írã×XG˜é®ûÉ1 m®X=ߧbèd&ÜùÝj¨«è¼¯Ôh¹ ©]ÙCæA5ϑ›Abs¥ŽDÅ<ÂyÇ[µšŒ½Üù!åz»Vÿ'Ð¯¼ig.E áBWh½ã ³ætìäWqœU`Ÿs&Þà/aoõˆ5pÉÙ¦ÁDí_i6®¾ä÷XqF1ϼ>™|"hná¢VÐ{ÒÑ&»ß)‚Ü7_7#ø‡³¯å,·¼Ü»€geM‰œ>an £P×ì0M} {ɛó9Œõ=t„>Ê‘àÈ3Yæ×gPîN¹ãˆŒKùkÉ +Í×õÇÐb°ü R‘ô#PÔϪ~ÑWØ+ÜcFóT ÑgxJ¥¨X® Ð-½Æ^$<ûÂx~É<UZ5&½ÇëÉä;¡c{jL"ìpmK¸Bæ”àiLœÞÆ]!P§$û¶*0v|ĝj`ÌÞU‡*8að"Fˁ9aüqøÎ0tÇ#nƒ† q„ñǙ¢pvŒaq2v¬Ã1”[mÕ­HBF;š”…CB1±ä×å1IªR)ŠÃNY«Â™Ê҄d?™¥Ä¸R¼Æ—Ç.—î—G¬T§=Ò۽¯WØàþŽ‘'tö#±™]\áÄ»¹\ü=ÜñCͦtvdXÁ>T* |2qÎmIƜ݅“¦¶9vHy'K!Y‚`9Ö '6ՙ -±ÎÞ3¬h<%6Êa¦¡C–‚*vérP…â³™å¡P8•ÌŲã$vg3,Ü»tp[ Y› ©; ÷Oñ¾+9Ž çÍ7è·q8|ÛÈèAۄ&s²$×`6¾©˜x!<Cäl=à&W¼àÍu®mq^=ÌnîHš§¸is‡¶/Œ‘äÓ"±d^®Ycƒ©Ñ10ë9±@Ír œ2pS8#f‰î!žï:&¥(ö|y’§WšŠØµA%ad*¹Ì"{}“J1H¨<ÉâV³¢^è Ï™‹¤(áÍmèsp(JòGì%3™PŸ#åHÏá׸±fLr>ýÄÌ*ëÞ±pÐq]Û4Û¥#ëZ²…)+²ÔlI²mFÖ©yBЩŠpä#Œ™<üx[p¤„•iÖìHä⍜žÒc:+‹ 1RíŽô¤šƒ¾"{áªC›Ò¡¼‰Ïo ÍB>³”°CÃküibX–nþX\(éüt‘ *q›Zs—#Rœº¬“CJôÁ+üÜnËgHX`¿ñ ´ñÖ,¬7É -z]Îg{b­ƒtNô(ÔdP– ¶‘í EêZ$ü±eGÎ$ÍEg–3ŽãˆlX²ù2:=Šdb Ÿpùh¥»$¢Âèbs¢oB«ÍY^$öaú@V9ȓ„'«YØÎ锝Ù2é:%n§u ð'ŠV®pVhPœÏ -šaOdƒjàÛ £PZrF‘„ÌÈËY EÑü± =-bb²·Ñ)Jt` COI…sîÑðô#úZ‰ÈRÒ)8: êOÙ:x*xÎkÒ÷<ËKݘf²ÄâƒàC>i¦R*œÛÕ*¥Cwþ45ª¹]Æ Hï ¡1Û ÚTjƒÌ¥d´aø8%ž;%x/Å bÂ̤7W’¹„ÊBÌ1«¢Ò‰£™¤3]8Ù¸mÊùh"8k¥=@ü¹P@+¹a©àÞ1çÍC’ãÎ#ä2¸ •F™¤ÜÊc.HՊÜù1_ÑÚýÒ3F+2?ÊÞÞ¹(<,œû£³Þ„áÎ.Ò9:Æ U®\ tŠv¶1ò*ˆY°;H¢x…:ÃML.Q\Žƒ®µ(Ýx 9rê\0èæ±°gM¨cšä"智´ÇàwY•¨ˆÝ’™¸2 ƒ…§-:òdB„Ÿ&OœLœ§»ÅUͼÊgÃd±° 2„×9»„¹ðZÆ#kþâN¬ <¥côîT¾ŽÛàäÜÃYìƒH ˆù‰ÁÈ»œ=WŸÎw…­Š‚› ›Nž’ É !µÁBn÷sÎՇ9£Ý&5"STŸ\py@’‚‹×'Sž,ÐYÜq„rfÉ'˜÷†1ä )¾«•Ùèp»„ˆ_gt>ÆÒ{ü 4Ì3÷ÈNj¥D2é<~9¼çzV““؃#äR%äÖïlÄ¯s›H×­L?SsH¬å¦C»YÎg9œ…„áäPð¢à†â2rÊdsdAŸC"gÓ $‡¤7@Kòn̪)´ §,V Q·†#›ZÁEã¥$nȈҜå&$ l£QÄa܊CÈ"¸¥± àãªÓÀc]ò®0§7sI§0«9—ôǧ¢,È|“I·4ÒÀË®SA1É …pŠ–¡¤b-ç÷B³” |g×`”Ê Æ]ÙKdÏ1apÓHPä¾Ô´YãkCNÁÇVÊâ¤9©‚JôÉÉ £m’A¡ú)»_£Ìr t 9ˆÏX sà"müY&eM÷.´+ì¥Ô²0À,¡ÑNÆ@áœw:í{‘ÓŠ£co"Ôs$0söS›Þ#ÑaÞÈæä±@Ÿ<‡ASV0ܯ­l€—<° /µ§¿ Ð÷ãP†”0ãFé–xf£ë,GJ$%s»êw|vò`',cG1¥7óSX»¤ éÏùAf3«Ëas5§G#Þç!ÌIPè·ÕeDyp #>H焄@c· ë"Ò1uƒJæ¿~€eDüUA˂eÌ'éÄ&(™RžL<[ã1VïárO Ԃô%Ô-Ð%/@CŸ¹äÝlrÂSÜ»œ•.PÐÎg¤T鎪<¡¼‚YÊtsPÎÄ I “.i-Og -!á,Í`Êìa€)§eÃÓ3¤”¤7Ú°ºCHLEhÝ TÂyZKÿhL­eÏb’Z’»MҀ²8…GW_ SœÜ«18Gx(Õ¹n­l+ÐyèH r˜5ņآÔ6Ϟ30HBë÷Nå÷T©IDxÎGk5O5Ê{"5Åa y›”:X²èÊw½K¬…ÙÎ!ÍÇ~Vúm*O’#ÝTLhÍv@Ö¾˜=4h릃h8 î6Hb‘“á[±T”ˆ€Î2¶#…§KØQ$­ˆ:ÎiQâ´ ¦Ïðš·-,ùüVÄéX!ه¤I(5ûÌ('>¬Rˆ‰¾ÈÈIiŸ(ç¦í§÷ý¬¸"Ž9 ®ÛI1í‘í¹Ë2’ˆ £Z–°ibQ§@À³3œ•´X†§œ“ËD¦sQlÙ ñyê\-<Ä©Së^tÌÏvÉAÁ— ù´ÌxˆŽNÎå »<8`Ii´ðÌÂ)ÁSîcYûX†):ç#ۚpBQ¦´: gÈÈâ„ÐÆ|æŒ]ùNö¦s`©óã†ÁY批åd -óƒÍï¨!ÒA{<øé¸ -vÖ.Q¦^qO -'â" XgÖWo»YÊ}ê2<ÐqBœ-w¼Bº#ù ò–:;]Â6iSPx^špFç%Ö­è¼sNüÄ?WýŽÀý 4ÚÍ9'+‰ÕŒéLqæµví£j‹n$]Nד)ªŒÓ…¦*À x=£MÓ}¾rtkb"´Äé0h2öÛsR瀝‘¸ÕQj-‘2ïxîSçÙɧu˜ãW»áÑAÚTlcð§G3ÉbÎí“:UØ%§tÃl#ŒÁ„Äd$SVÝÔʊßn]±¨U5“»Â‚²1 -—= rÄ'œÛPûtðîR6éSˆ/¤žÿÌL/ZIìõL[Á†z]gÍ*f²˜z?òN1"¥ÉxàQ¨‚%.§w—1p/ƒÂþ°r€v®'”ô5Oš‰x ñšà)ŸöV”XS4R•ÑWéKšyD'¤ÏÄ”MGJÁhäå…#šŒxÌ5ŒÇ*% s½ðLí´°z!ì<‚yN†^òŐí@öˆ³²M“çŸ,b°é‚ðu :a] Sðyå:PË(°Ï(´@Eš8Ù°Hòj"e\ _Ç1ÌZ°Î;GK¢þ nÚ|È*ZY½f8‡/gNþA ›‡]\U)äÈ+þg)Ç×Qä3­P%‹väŸB%š5ã”uÊeJ°L<<•ü:Ö½”ïł"ÏÎIYw5dL|ÂHk–ÏœJVH©8WâÓâ؈y ;JYy|æ’ìç>#0jª×^•š: nDùôt žÓàÁ¹œ|‰`œójw!‰¥œ˜›ß9ï}q,3Â)‚¤ÃnQpù)Ÿ^©Ê+Â× -Î%£àk5 (qÎõî3ªQz1r~€˜RCT¥¹p/[§íÄÂ9[L·–¦¬ú§[™wÂ'iŒ]X=bàä !óKM-·í4¼F«œm¯Ñ¢£Ú×½ëEsŽC—ç‰N“ĝ:„YÎkamP.z—sŒFœ¯o1ãŸkÞBÖ®k‚§ÜS:²— :ý£q*/Ÿ#Ar4«àÃ̐¦ÁNJx'šÁà™Êœ„×¹E(mqpe´$ÃF©0]”²"÷%]"àr -8`=Zr=ReËü€Ë ®„¬0|!mÄ×[ØÙºáôÒtÀw)Eó„’dIwÚ:—(KIW[àÊtœ?Pð}Žc)Vó|Ö¾WAÓmÒlהC©Hø2‹ª7†·9ÏUñá¬Ë¨;úÆp¶ „;`ÊÂeV©j ¿Ô§GǼäk_š²rÎ7€ N"Ɨ.à= ®'K”W—ExI)«h˜öÌ_Rª)e2TBB¬_ÑmÖ ˜ýK•ÍReJøvßTY˅…g|cÆÚ­½À"çqîڕÍöÙ¼èZã4¼žÀÞCUÕ6ßìÄ® »ïF¾Ùš\c´ñs‚†<æ3Àtöè°ñÌå— Š î‘Ò+Äþ° Ýd«9çYäs0-´-ܜB§bé7'.ΎBWز5¥4òai˜‰†·–”£Lm¨r¤YNÛ-´ÁK^©åŠÍŸ× ìáÉ>(išíc%f•C­^Dìߙ۰Z»W&|÷5fÌymÆÁ±ÏŒ3åHºs¦ -gµQ#¡}· U¢Õ£é Õ¢:@át žÓà¾F/ÎbšP¾ÎŸäÓ06etìî‚naÄ£?øê+1ó¾ )Ǔi¾ÁF59’SB@Ùœ8玈mòô’î -{‡¶»Ñò¡V—{± ^VçOe]Üßӌ‡ê8èÅ_‘‹!Õ§KðX²­*oÝû¶õ˾óàivþhØ;Ï&W/:Ói1"TôüÇÑðŸ?œö‡¯Žü¸x݆¿|ýՏ7ø›ˆìg??yÜT_uŸ¿·¾7O¿<;ýqÔ+ðûà -endstream endobj 22 0 obj <>stream -~wÚ ;ãk~ú¡uïýõ`h~<2 ÷/fÓbòmë;SðÁxܙ/Ó½êzãbˆ%dëþÓáÔÿ¦n -üñžPÑ7߶îÿ4ìw üÌà¾.—}ÛÌ\áwýÞôjuéaçÚ6Íqſۅ®]ý×WÓú}£òÛê܃§ç.^—ƒN÷jZü¡3œÏúÓ³îLàṨÝñ~Ï]×[(´­žÉÃø¾þ¾ß‘.}¨ß¥Ü·uí¾mlHÕ&ÇdÚ{X¼íw Yõ)S®µ­q¿ÌƵ;:.&³AŽDå·Õ¹³ÑlÜ- n®:õ™Oƒ!ìkÏîe«:P̓Æ^O:³É¤ß¯Ç á«Ç㖯¶^îÓû°½É× G ¶ˆÞ÷ˆÑå夘®Ÿi;Ì1±ÃcÏqøv™I @À­§;ŒÆß¿»êO‹»ô‡ÁšÒåí‹oMS¨ß¯›¢;tÆ'£ádj„î]\¨¹µÞF»ûèýÍhXlÒ]_s[ÝÕõ{;_vºÅY·Óhî–jm«—@ïç³5tØ+>j¯¸mÚ¨‘æŸÚTùµ>Q~Ý¢n¬›ôiGô}Ñh >‹Æÿ¹£þpzÚÈxöÝçk͙ÛvNð²ËØ:.t|tSŒ;ÓQ}¥4¨±[öل³ËÃ~|[ú·cêÛÉèúf4Y«ñÜnR_­y×(»­YW}³Æ"Tê‘Ú‰­ÎRÄ.(Óo0ó7[äåqzu]Lûݽސ›³ô]ٌýé‹Nùb‡wc+K=wn®LÒ;¾'ï¢Ê¿W`ÇFùY1~]]wYòjÌpî }ÖÆ܂†`ŒWívÜX\¶~øú¶‡‡EûÖ¤k»6ºøkѝfÞiçñhta›²ÓIýî–*m«ÏÖ¤} -~ۻзCà[™ÓÙøb6(†Ýú¾u[¹.iøU[éÞ 1èÕpvý¼;í¼-°°ÎÖ&t;ªïa¾èLŠÇãâßffÀLï¹jÛêêpt6íO»k¶øRÕ4ÔR¥mu–å—°lSˆU“õÜnUkϽd&âîX䫃rzPNÊéÝSNëGª”Ó[Ü¡;¡œ^Ž;F½ü8êOöS=­¿wW=­o ;h§íô ´ÓƒvzÐN—¬¯ƒvÚDâX\ ‹áùšàÊ Eþ](ëSbÜéõg öe*¿-–Ñë: ÎGî"³¿\ñÙh|s5Œ^×€lq3¶˜Ø¢ë_}JØâ-Øâ~²ÅGãQ¯_Œã 3ÚÆx`ŒÆ؀1DÆýŒñÀŒ±c|ҙýíß'Ý«büǢ߽úþ ‹ñgŠ1ØE6ùÅóŠnsÉmšžò°è>Å¢K‹Îõ¯>%‹î°èÖÏ'¡÷7γI×qž;çù»Ñà×ëΤÏÖåÛ¥`Ï#±wឍºt'>iøÍ'‡T0ó\hW†yjÝNÕ·o›$¹»Läp»ÀÖD3Î#4.zÍrpîCüܙ£·8~ûÊ wÿò„ËÁhÔs7'\ :Ý7?´,htÓéö§¾ÚMd­]ºL;½·Ü¤YïvlÝ=†)ºËËnϏ[|Ä®½;‡/îhҐ™ìˆl2¹êôFïNö™QîEzðf7:•¯ƒª?Zóõ¶5+ëƒíõ//g“¢ùO o_-lxãQ©Ò¶úx7®urSjowÀ½TΛÚgÚünÛ~“Ô¿ë ˜§f®… ÊÖØn\Ÿ)u~í_Ϛ8ª¹Â¶z‡yý|Ž;&Ñ=ìãž}k.²zhyÈ>Ücu¸]sMwwùvÍ»¥DÜ ¡“f×>ß_v¸Oô  í£€vÏ¾Œ|v¸htg¼&ûÑè¾o֛ôqǎËí…G¡Áe–kö‡£s¸pt;Úø®\8Ú`ŒŽÞ¦¹±|g6åÅ£‡=ù–ìɇKÀoÿž|¸ü°'ߒ=y3Uë°/ߒ}yß/>Üþ‘QÀ;5ڇ»À÷u>kcvy¶ìý•; â#võΝÍ°K»»»wîÔ½f‡…ÇÍe;µYíÇ­B׃®~6ÚZ‘û·êCj÷¿6à5T~[ýbjO֍í0—Ù€‘î“Á£oÏj¬ÑÛÍeîF2 ;qÐôììû’=稾î°+ésŽö/Îó»sHý.w?á̞Çp~ÄzÛï87 ‹¯¾Ðõ¾;¢àì/ُ¨‘vƒ£N;,ý‡K®þÙÖ][s1–[vû"ÿÃXýrYŒ÷Çûkº5›Àmýiç¢QvÉ°+[õH…ŸZnK•¶ÌŒφݗ»Ì…öw¶ÓVÔº[3ñÉa&Þʙ(îK<¾ !B¨ŸAҌWãÎprÙග[¸:öÜì³é1“]²øØ>¿‘N³cúç^˜}0|òÁ`ð%fâ.ªg®×›Ê»Ñû™²—ë5¹kÇ.ÖS‡‹õ–NãŸvób½?üí?®Åñ¸Ihüí¿WOן§;r­^“¥w'®Õí¾¥N¯?k°8©ü¶F»×td€ÜE-tc{¾P\à-µK…÷l4¾¹ F¯ëóÎ[¨jxâNóÄý PÚ?NØ æãÀ ·!/ï]Ä÷EÓhv‡=|ÖªÛ>X;Æv?¬{ïÓÔ3ÝÕlQA÷  Nàð-È°ÇÁÂM¶ƒ]ÙáööÚ¢ýÈg°&ñdÈ1Þ§²Ý‹TšÌ»‰Y¹¨?ZÖ·}ÖW´6`}ÛñÖw.\u†ÃbpV Šn#ÛbÍmõvMyèܸ·‹5·¼­=ìOnnq] §Ï:7»¼·íq®Ÿ§µðU”¾Öîþ®¥ë¹¨o»Û¹Í°Áα+›aýÑÚ1=`OR5¸*t‡_Ô7zíÓh°Âv…iÔ­;r‘÷å¸(~­oŽ¾ì¯ (Ÿ 6lo°‡£aýŽuºÝÙõl½«?ì^Xg[(\×ïg¯×Ÿöß6é%×ØVýaÑ©Ãk·3è>5ˆxjl«‹õ·Àp,© ?b_jh¹Ú¶º¬×¨¡«¼A[x[ê Þu>Ôï˜Ù⧝q3™ÀVؚžX¿sÅë&r+¾µéX_­5PêGÛëQ}ür<ºn°«cé­*IaÿºÉVýÝçjÈþäª9Êö.r©{ˆ\ÚÕ¬Á`í˜=ç¹Tg£Ün¦úý¿È$:Üd²Â¹«±KÝý]j²!ìÊwˆ]ºÕû\}x·b—šÌ»‰]êîoìÒ>²¾CìÒ!vé»tˆ]ú ][°tb—ºû»ÔdçؕÍð»t»™å݈]êîoìR“¶+Lcë±K;äBÛÅP¬&Ü|Îns€7JByۆ§Iìàax¾øðìí}v‡ ® ÙÇ ®:jéúª%ÁË&JjPe[BÌÍvú¢ÿ¾LnúÅà¼a˜Ã‡ž‹ëѺ@ä =ï{Åe¸6ƒ|Iú):ӇM"]ƒ*Ûêè!ƾªŸ;c?¹(û½Ž±¯¹cîM€½h«}ˆ°,W‡ûÏ3[ⵄ6£–ùÿóÝ|þ`~¨‹ÛGxf¶§Åm¯~Û¤µôN˜Ä/֚ wØ(¾Ï ÜÁ>¾%­¨öíbí}¿à®K·¢=Ÿ­az;Ì#›ñ‘ݲ$ïŵvõígoÖŽ„£e·&ð×ïѯv©Gj'z´f8K=[Ô]ê÷¨;³EnÞ÷§W×Å´ÁVµ»›rS™w·äý=캑àqÇ÷æ]tm6›wl îüŠ†Üùw~íß*w~ÝwþÁ¿\Ì:¸óîüCʼƒ;¿ÚqpçÜù·Èò-8ôeôC3Y÷àÂ?¸ðo‰g×LaþÁ…¿Mò¡ FïjÒ ÿújj -uá\pý›¯·5™«¾ÄÕ¿¼œMŠ“ÑÐÈÃe¡âíï«e‚gÍR •*mMf©¿ÎƗFIlØÉr­mõÒM©½Ý?wŒÆN Ú¹Ÿâ`UKï†u&×áÔ涃%jt°D,QKÔÁu°D,Q‹ÒÂÁu;,QÎîd-QÎ,…©ƒ%j×íƒ%êSY¢¶·nÛ;~WìkgNÇÝ۝È:³¯Üe“>îØ¡ç½È<Ó «É!ó̶d ú=ڑÌ3 Æèyæ6m̍:wfSô§/:ýu¹ޑ7Íäwؓo1¿?ìÉ·¿G;²'²Áí螼™ªµkûòþf‚k,yÜñ=yã,šÏâäC¸Š†ìc¸;ší¬{eÃÃUgL•úYâ™7n©èñ…2olscڗ$õïþî}hAôa{“¯AÖl2¥½ß^F——“b -3m\ôš­ª]ã·!˜ús±Œç8ŒwX[ùˆy¼cC½·„ß ËþAÁ¼# -¦PÑ7µ'ñ»~¯IÀŸ+¾­MSÄ ºvU4 -œãò[~î¸aàó$MßJ·Ž„®?OÈæ[Íu©õagÍ7ÉÁ|³ëJØÁ|³32z¶wæ›=:˜onç8˜oæ›=êƒùf¯Gê`¾Ù=óÍ]5L¢3é®±EÝ¡è€Ëq§;í ~õ°ÕëŽ=¿ì¶ç8ޟb¼mrB>¬³­.FíúÙ¯.:“âñ¸ø·Y1ì6Ð`æªm«§ÃÑÙ´?m°|'XüUÐdLK•¶ÕÕn}Cå®i5ÝÏ^yÛGë<‰TqHYvHYvHYöYúxR–5lö&cÙ!aÙN&,k׿ q:j gvC¹®lõXº¦ôy @$ û\&±W³ñÅl`XÜN›Ri‘*]9éÙDÕÙ-ã÷F' 6禸ý lÒµCÈàNø -~.Æïúã‹b0¾>_“Ác—ÂÌÔÝlС;28­)$î¨G§~DÓî:t¢ƒGgIww×£ËòKøt¶)BôӃ~ºeý´Ñ2;h¨ õ ¡4Ô=ÐPëKŒ õwèNh¨{uX?iÊîê¨õûxPQ*êAE=¨¨õ ¢Þ~õ›OEtþhØcUa@ç?Ž†/ ¼óÈÁážÀ𗯿úñÆâQödz×£iÒqÑëÃËbЃŒƒ~ñ·/†Gœb0½üíu¯ŠçoM›¿ŽZ¾þ*jýòîë¯fôß?π"þþˆV„ÿþòž~o¾ýÕÀÞµTëYëO‰Z½¯E뗗ð›iQҎ¢Hå­£¼umžàóô믎øKÚNt*cx„ÿà1‘¿'­S o%X0oñoTËäP ->NýËðŠÃ£ÿŽH±â)~Ò/Á‹ƒ&›²—ÐÓùÌT½†´-"­RüT¦üaSáÓö‰~9òŏ2ûnói__àG©U‹«Ø_2Û©£Ìv„ ªdŽ@™¥Ïñ Ò½Ÿ†0³z­×ãŒø´‹cu”øّ£¿ÇfxŽ"èl‰Ö‘0¥ly@šKÕJs¥Z¿\—JJQ]2Ñ­ãn]œÇõpÊqâ(›Éø [ÔNƒIˆ„º¶³ª<G8žÌD´#Gµà“Ç)½¹-ør¾²c‡•F:hAÐ0æe#'돜A%£2í4P9ž9‘W—LäÂÈ-Çy\§LË#‡wïÛÖ/„þ>0œ*j'¹Ê`ГØÌó!…Ú|ÑYœøÁÿÿKg‘÷—‘íLf"n©¶T±À5zßesÏýC ßsÓ<üQ ‹ ¯æ§Ø €æѝb¾97;Ø´¼Os~ÏP!ÍtœgaãøøD—¿M}n“o΁¿Ÿ»–Zz͵cUê:[@·ºµ²ëDäªnkZ†JµuKÄôž`Lî¿,:ƒgƒù=jÝ3Qüҍ‡ùÙ ß-ꝁyí“q¿÷‡âƒ{m¶Aé—fóšLÇؤW´ï~sn^q< JE ;ƒâɬßs¢Æ7çrá£÷7£ñ4@åzÈòËtU߆®z9ÃIUÃÃÎtv=AaT!Dvý¢<ÐÖ"Q),R3U®Ã/Qj¸¢€‰<©úb—uÔΖ"b©Â®w³ñ:^Ÿ’$«4åÏÔ-ƒ4Õq¢àe2Qšx‡iŸi`œÂ.§Rë -ޒØÝþ(uûì –÷Ó'±#õ|­áÝ×Acà ²í?WnÓz5³7¿§Õe.›?Èã#`zIݶóJ,Çë°DevŽ=»º -_”ë« -û¾¡h²¢µÑú>«õ}ŽÖö9ÎË}žÙ^ -»ÉÀ—Sû%&ð±ªçIî»®ª»Ž²C-1ÕüɨËfA”~Qõs±Êqu•xn(͏ÒuIºE®ô)×uçH klÜ£PˆË%̂]Ù³U+z¨]µë!}®œªØÃøcû—ÌõOÕï_²¦1ÍJA³RÐdŒƒ/ŸpVªÒ¬LË?(]Ñ5Uš”s5*z$]‡¤ëOäzAŸŸvNª¥«L-[ejé*[Ò#íz¤]h\èóSÎAµv©ekL­]cUý‹Ü”nšI7ï"ÿù §Ÿ( —*ÿ dE¯Di´æj,vFÚ¾HەÈöÀ}|ڙ'–­$±l%‰e+©º+ÚvÅê7-7îãSN9±t ‰eKH,]BU]AVvŸÂIô‰Ý!V÷I¦˜•*ÆÅ U‹½¡ ãbXè N1mg“¶s+¦O:Å溢æºR±Z溢ÖuEÛ®8Y× †ûø„SìsIh£̞Q;—Rˆ ʋȥÐ`‚ÍÁZ;­‘$©zíXf¢‚03ëA‹bh³šÕ-*ûI[Æ©ÅkY;Mez”kS#í]|—m ^T0"{Ÿð/Ÿ.#5ä7­º^»¡q4R)Ԗ¹Ú€¯pä±Ù§¶VqN ÓÃ\d9}ç9džÚZ*%`ŸX|ÒÜ$b»õ Û-—n"i©¬¥ %´°3ƒéN˜âõ‡o:³ËÉ»Îëjÿ˜»0+¬…–,Á9ÖæIžÊ (úÉfæm S#3Líûо@"W±.“ ˜i‘Y]YžYH†Lº-0n÷_oa†·D™uPŠQ‡æ}ZÂcŸ¥y6Ƽ;Æ*Èbk±³-$ÐiJ¬‘Ž`B¦ÈE#•Xö“klÍ[UfØìhM6 õ½%ƒÐH·“ X>bm6Œqç1¢$ŠáÚry‚™V%ÐÆc¶‡Ç¾ŒžÝvcû¢| 8 -=c̾eXqŽ´ˆà‹Y‰y–ÆØWè™@}È?Õô ”wmq×V³"Ul ôã{Mg`ZÀðRm;—J˲ þ’8ƒ)eQä8§Ñ #eÚmöL»¨p Âñʬ番V€›å¢‰ÇqÂEÍ; MÒ b>}mj§*³4嚨S±–% ¯‹¬ÚÌ[öÌ\ŽįÁ[2‡R¶ešÆÈ#´›ªV€›} ˜UÇaWKÏ 纙ü2‹Kk6xÉ6ïS2ªµ]Çækð=Ò½'uâ=¡eV¥¹ÿ¬pÅ¡ºé ½ÆaÀ‚¦û÷ÜE%$5L‹K.I Óñ(¼…@Ô‡ƒÚ9׫ šú©»gjçqĵÌGfŒpÒ#¿•®]TÛµÛa÷ý2åp›wXàK¨6=2v¸·Sm׶rÛm–o¦¦”Tº¥H–ƶU©#ÜVSÉ»±­>°”¶Õú›$:µ¨ -f߁Ïܘ›ïoM°Ó_â4·lÀÕ­‚u/NK'Ê3tAH˜Ü× lSJXf«LÌFZ¢š+¬øÊÙ-TµÝBëR¸é›¦Æc€ÀèÃ3Ì>&"p»&°oé V -šš¦¸ÆRÉ꺩YEf§4usŒH·~[Ãû“ÌjJÊÈ3KÞk—åÌò:mG1œ1¸†£i"r´7jGْº0KŒz{V­×dzŸ¶±´‘Ù}°ÅÉÆãÄÜõÁä÷Ÿu&oæÌ!O‡o‹ñ´èͯ¡“AÿæÆ,ÆyøÃþV•ÿå7ðwðP˜YÅ÷ü„ëãegb“›ö‰Ö/O¬Í­xÛÇ{Å>´~ù âYp„qaøç/ ÛÅÀ?~¹ZQ@¶ ý/ æ•jaÀ¶élÐÃδó½Ym2ûú«_ž~õwýÏÿþÏ¥ÿüoø}ùÏÿùŸ_æ÷% ?ü~øýïnÃü\ýûºõõqÿ_0;;päh¿cöe žyý¸TöñbGÞz<ûõ×-à³eIâ›säÊ^ 8ÿå¿:)È%åýœ9ìˆø|¥eoXêzA"BWBè ˜—CæJ8¦þÏ3Û2ˆË]à¹ýxÐEÉä›ó*Ù$€†’ˆÇP -a¸´h”È#Ë¢â˜òÍ9*ÐÇÆ¢Š‘%7V¾9ÿqå›óX¾9ÿ‘¥nÃ+…–oÎÛd=wÖC¿\`ásûFxxð´õ`6µì’ìÿZxŸÐ¢wíùŤ¿-zçF‘8·¥&ååcÆûÁp4lå2·3~> - -ÜQœ‚ÓÊ|1j™iþ g*°XÍ64ˆšœÄYŠ±aR暴nFp Ó|f‘]™5™)¿àÄÉìQ¬<ðÔ¥P*¬j&”5 ö€mpÈP¶Œèé0N1¤Ð›/ÖÄ­ bü*„9 í”¯Êýfô[qRE3Rf8Œð(…Ó€‰òõ®ç€=xà…›`ToòÃƛ՞'YVn=˜·Àå«æm‘¦i !Üzô­/ݸ:ôÌ÷Ú⟉Š Ô"ßfœ'sD aØMm°èffg*)sIevËH¦%ƦKQ0n' -Žý2ê@ô0O¿]dÌD~}@éhäöja½î!éBvP¿ùÛÅ+Œ`š•7ð3(U¦¼?Ù%40‰څ¢‡yڅ0è"c&ðëÃEKÍ ˆÇ}áŠÜ[‡9x&â-PÉ{j™ù:KK2cnÑÌI(^åm#Yd^d¤çPb$X(0úzNèó˜€^Š‹¨”%iIZ„O«ï9Ôà«IÝ&…ï'@ *(”}="cö|ýI•ñHÌ ‰G0î"ÉPL'h…Ä#,$‰m\;ÆL€x ˆÀl 5ÞÏ53$u…ë1s`âÍSiN ‰G0î"‰ML®Bê‘Rd5®è„9ÆìžCÚ( ÙþZ¦½;¤µ1$u„+r÷ u`ÒÍÓhNø+-ZóKËmÓ~ñ9I*$‰\!éH0ãŠ$º1j„ÄcX@½fûH¨™ -ôþÒªuí,-[׿l‰¼l=À/Û9:•¥½€z’ie{Hr‘€d§€t,c¤cIŒ`,«b¤ó0Oº†ýcÔD~@:jf@9ê ¤'$⠞‰lóô)‹wÕD#ˆzOBS@5’­¢‘üE ’Ï+=c'XÂ~Vê7½8 5/ õ€@Üi‡5x&jÍÓ¥,ÏÔ"õ+ãÂö›ä¤€ZNš -ˆEH #¤ô‹AžX»EX©Ûî½­¨q­2ÏêÄ]vHƒg¢Õ¶ -ºÕ’’KDÞÀýHÈ% -oæ‚ Äà…7sÃyѸDà \q‹ôª%—ˆ»—΋Ä%Únà©ó‚o‰®xë¼,\"ê»E:ՒƒKDÝÀ™Ç2p‰¦8ô¼¤[¢is§ž~K$ÝÀ±·H¥Z‚o‰¤øü¼Ð[¢é~?/ږhºïÏK»%¢nàÿ[¤ÓJ¢.ÏUøeAdkΎnt"úã¢×Ÿ¾éŒ§Euš‘ùsŸ1ã&»°¹ Ü×S›-Iæ¹½&s! àƒ½­ ¿š]×æV°æÉìÂôìÎ`Ã7Fè¾Hi³%I ÎÀ/§˜åˆ~ *YL'6»QðŠr\Ëèa -zâ:xbf †Éäxš_›/Ý'tø{â2÷¸ØqÿóQPëȢ²y©‹|²Üµ¿¦ÇÄ¿uäqÓ|i‚Ÿ–bG‚’¿p°¦CxâZáÇ©üX/džw#]Á‹çgâèՃ³W¶”HA2P%b‘ÛÉ!¼cÕÎcmC ›©痈WÀ$°ÝÄ.oLhªh»$:ʦ‚WKÎce֏éP ˹•-5¦6AÑt‘1ڌTå»ÁŠ‘Írˆ/ÑÏÀÅ·E¶*$g±T¡Œ¤rê!iÐÖÌeNª‚ùš˜ÞZ_…+R6g#ÓM@$›§‡Z”›kle–¶c³l!SH)gT -B›Ò+¹# ¸^Œn~º)][™¿ùÍ·Aސ8q‰„ÍÌi/.°£ߥÿ~:Š³v*ðéHÁMpf6Ê"~t1®ðÝƋâW,„û'V‡ÚˆU`6&úzêÛçž2HׅO%4=ĺ—žÒW*BU¡¥a§O|&@$ÈQœ#®kúꮧ°ß1>ðã ӄµð6Gwé¾ÕDä‰Fß]e¬ x3º××½Ü6Ê·„ e²…•Ñ -Ëý°oÞ ãòW×nçi8ð‘£,b…GßUhá„tú).ò'ãÛìÀŸå@®47 tþ*_½¬l*æ/éX‰wþ:ߥx¥Z¡oHÁë2qC¢cŒP0tõ‰ø4Ô<‚™87:Ḡ:ùWöÊhþÒÜ,--uiŒ@*Æû «K§ùâe*+q×Ç-õüf4×ÁJ;â¥,a?±ü̞_áRuÃwRZÙá‚? -'Á2ú‹FôOê5&ûQý]FÀe¥Ó¤šþKq×Ç=OÿÌ éÅLãpAÙQÇ9ïÒJLó™1œOqG…ÀéºV"V~Z,YžX$øêJ\cL©O©²(OƒÅ±*ZÃdÓq;O K Õ­‚ÝÿüÒ/ÏÎVÞêû¸pU' ކžÇc·0à †‘ÊÓX£Ù)CîPÏÚK- ‹v¢DâËäÎÊX@¯êâ. 3oPʆ}!hB&„ºx”É6‡ QƒË|¯º+«ßÿåÙéOO¶¾oÝëöÇÝAqŸÛÂèJ3t¦‚ù±<ºq;ÊšL“TÅ֎µãL˜µÏ@«r)‰éšS#Ÿéu _Vm³ kL7)pc^åR2fy¥)ŎܐÓ೙] Ý ?EâW éNÌY $€N“Ä©h¦="à Øs0ð·à3M!z%ÁtÛó½9Yì ]âf¬„Av;1 -ŒB'LÚ2É#˜šY‚#w×iظ'ó[šÄè¤Lè´G¢X:¸æ[ L -i3ÒHãlJÉÖos‚›_âSnÔÉb;×0(‰úã–†óÀî胗Œç¹Îî†ö™õ/³™Ùãì­¤ëUÁ×ØìdNÅSž×$‹/’„ÙbýËV¦Ë|VÛ±_NùՂ$Ë¢1Z„B·«33¦dH„ßrȦn+@«‚>Ú°3ÜƉ³V¡•réݵ(¢NÓ7(›JÎô|äÐàMfˆû-X=dG•QêCBÒ{hߦGÎ䒰 -üEiû‰ëÊ'Óz’¬$Gá%'Õ:OUÉjg Î -}§ªä2m§t×O@³ë2-Yú]ò5Ò81ˆÂ¥a^˜vzœ„¥ê M­Z;²¤V¹éó'ôp2]î~*}jNŠS\…4ÉǪJ&Y 9žpΏþœóü'»¥•D ªÆwCT=›™ b!O>ÿ÷VÈmDF؟ è²emçè¼Ì5& -ϬYÎb›‚;UÂú&…ÐN^JEûå2MñFžÔÈDà0¡ |%F>ɳ€µ«Á% +Έk©ˆ­àk¾ #çÁ_„ˆ Ӑu•tÒWG -\Îö­P+ߪÑóŒ€c/ 1Í5ÓUƒ“IfÂ6 ²jëxJ#aóæiœØlÔ AE†0Ó•$UøÉK§ª“ºc“Ï]dJÆؚÅqè#‡‘u cgÃ׏ž©V1~‘´ÁÚ Çù1t9bÕª2?Ù±£õÍy0^5J楇ÛTùðG¸ ’ÛÇ2×þÀD¬!N"msêÛÑ$ ¯’Q-£]¼´LŽûòSè—O99á—ñÊé¶@Œ‚™±Õx´ŽdKÛyŒ×ïᕠx«¬ÌQeû‘¥Â Xðj#…ƒl´Nî8Žð¶¢(׏Á~:³‘i%UæêÈÄèk -\»6ÜfYŠ¾!Œ7³2x>±ù@í#l«8Ïa„œ¨FeJaüLË¥”)‚8”y ¬?rmoÛ1óP -\5VQ„HR —uŸX5KPÞ1YÃÆHgº3I³@¿Ìԍj„ÿ-¶‘¨pVÞ¬¸f„@Gp¿„YàäºKe[% ^èiúmCŒŠá‘&ës7!²«»c2†M¨¯©0ª6,²L©‘g°ž…Q‘â•XψN–Ig<€kÚâÜúlÌÜÒŽ8Äx€yrÕÖBȘ…žQ5zLìA0ÝáÚ‰)H¬ìL¹‹P6;Á›1Œ* Ú ÜMdo]S êµ:¶e ˲ötXB-̉jÀµ -²•à•Fþ›AxÇ· Õ9Ák3IÉh«FK( K,g–$üÈ,ŒÞIňÖð€Â¥vfÔä­w©ÂKÖ÷°%º½6ÌØð•BÜmÚRÌ«íÝYRߑà†W‹ÓÂ4¬82ß*•ûhÅÞêYm+€IºÐWmìT!t=H÷å Éx >[2Þ ÄÏPQgöY*W˜ð2 qØÜ3˜èݍ©Ï͈]xQ~‚, -w»Ê;tÅë«âýô¢ýîÕùãћÙd™Cî%êY’T42ˆ„³Zzƒš¡ð(E&c#'þò`ٖ -k>´¸³¦p-%òIÌÂÈO§ôtDOô0±31 ^ :3ËâÝ×)8—mÞþ锞Žè±â‰&Ÿn -¸ÂÒex•e+‡ #oÄéL½ -^‡Ø6àvpfg~‡Ç67âxx(}žgçû&\Ï.²ø¸y*8€7á}pš¹)÷ƒs­ üdß¾› x ¨ôޒ„½%β‡—gå™M4*X7F”†€ ¨36Ìç*¶¬Op¦¢FUO­`Šê*°€\ÅaÕ -Ò0M\è)6¤Tđ…![­˜ïçéŠ]£‚&RÀl£‹‡/³¹yÚРùA%0 ‡oV%°T½‚NXjS­ÂÙµÎꞀƒ)o)³6’ ­î©Ä×J%¿Aá Ý1'èù£á‹q85í>:rpÔóÂ_¾þêÇü-³¿½ÌÌßç5ê±ÑñÈrëx<›\µžu†×Ÿõ|Ü£ýš[öדÎ`Ð=îÜ\õ»®è+C‰û­—³a¯uԊ[/¦íû …¿m™ß«®b4ÄÊ:s¥[ƒN÷ÊTÒa3Kž ¯Jþ0º“iÿrJåzÇ*íL-ŒZ<|]PY7^x-Ž?Œ‹þ¤¸ÿm«íÈm†¨LìÏ0p½ã¹¦Ãȍ‡GHð û ÜNÍSÜzðôüxl&ô @§ý ³¬ÎOÎLÉäüñ 3=·{12ú²][2îУÇá˜@˜¯6®.ÇÿÜ¿«¼áËK“Ô¾Ü|ÇÿìÿÞrþYû÷Ç­¸ôöZÝÿÔãUµæp6òªƒ'Ã[äzHï·è_ Øý–;jâmG‚¿EàŸø’ÝY¶Ü¿å¥NÝù±xG¥[¢ü/<¿° •Ù‚S»¶`Ajó$!ŽPdF¤•–ÑRZ|†¡ÍíofϦ̀}ýÕý? Gï†øí½ƒ“IçüÉÙ·­û?š„íêþ³¿-¸Ðý“ÑõÍÈLÐÇýé2Ö;¹êô‡-[Ă­§é¾+ólô÷îOúf»D¤H֝î›FHŽ;“~·„aÅî#¾ Ö^Ð'be§LGï‹î cD,µ—]à–Ÿ¤%ó#lwRÇ=Ÿ_^NŠé·8.KQÜ{:ÌP¿ÛÅ{ȱdw7¸5…ÈhDŠát6~[Œ'Ý«~qaÝï[§†°G./‹7æ÷_õ§òð{ÏgӉQق±‡ýÉÍ óÁ>~ûÙ=/}ûƒ¥ÛÓ¡mTmv´»«ëóìnŸe‚oç/³®}ùmoæÙ¾ö°Ñ>ÕZªp³:ë_ß üf儍,‹áAdį\$z¶ñü{aVá´Vóô-nZÀ;ýa§?ìô‡þSjwŸ1òê D€¹M,ýì›XõÖñð¶NFã¡áõŸdëxÔ}S [‹±A\ Ýbõàˆ¶ˆµ´.ÃÖ=ˆŽŸMV,†ƒ­òÎÚ*?†bëYm–”í†\}Xû¸†QĊâ"ýÌ©#´’Ó°³(Hé1ÿy ìçvã oz]½kbIЛºÓv§S½kþΤ­?t†Ó¢þž GuF{æËu{æÝåeù—xÙ^Ê#·Še¬àÀ–r£ãAgfzòc1Ž;W×Ŏ8)o[™±ŒìV"•iîŽßú㘩–pI“w¶/œËfàžËLtřLñ©XÚÖ(¤£$…Ó¼m™Ê,‘xÞZD9ž¯„̝ÆsG©,ƒOBH¸8šƒ±c>akZ:oÒݞ7_dÚ,ÏDýù÷FA>„8ó>¯c§Yå18þ ð^qŒ ‰•LÚpßvKäFNmÇyt÷NAD"ÉQ‘Žrieön.'S$‰"Èõ ý­}\KNo,ŸÃfRâ9r¯7·.ÝEž+ÖjœÈ,9l›lýš_dËدÍU1È`.«2˜GÑêæ6Ÿ÷m>í çòË&їŸDîžCz;§¶ö`üãì“ÿ7u¯ -ÃY† Ëtfû÷bˆ4;h:XÐ×Ø¿n_¸á°Ïgðüd0z·N¥z8ݴή:½Ñ»åjTyý9ŽÓFۈl³Iñâìôx0/5¦7¹ëäcLé“îÀ©Z“´Ý›N·lâ» ¶’¶{1Ú1 )uHpPÜzôþ¦c˜êqq9­ŸNzÄ-؟o Ot^OºW›îÿ{àÃû̇îú©qyñ4eÁ7¾ehlâ{[Œ­‰O³)¤×¿)ºýÖ!B®×Œ»ß–0ï0sæþ‰˜ûŸ ošéÓûËڌ9­’mÇü“øŸ*»,ZK“ê` -ÒGÃ^€t}&ӝAaV íƋ‹úí¾÷§É¤_›%V ÿò-Rà—_tå¾þêE·ŠJp4éoÿN?7XRÀ;ÞuÌ2fÌՙ¼î½|rÜz9šò+¢DÀÝ¢X!ÑBe-ÒP¹ø“bpÁå™&hôJ¬/8þÛ ¹¤ino^k ©c{HÃ÷*œ|èøò«s,ay8`Äåe’Û£³p]¶»¬N”Ë?ë¼6Êw‡«ˆ$7݅®¦Yžb0‡L¥P˜ä2Uî”M’aH¶ ã6ÂÆa[¬¿‹ žü&Î[Ç¿Qړ12µ{!š’ -_ÃÕڝcÍðaҕ.íE†]:ÌÒPëÉodf0ÇI0©)ã 'YjG‘°Ó€‚ñcnl¥=ùM•PBuCj<å% 66Ӊv“ÂÏÀ£„V -ó×àŒBœ–±‚ûŠaXRۃ½ŠñÇÄÌÛ<ÁØS› œš í>þÎ=N¥EìZ‹,S™;£‘ÇðN/$,#“@Æéû±‡;3K¼C§Í¼mÈ}FéLShè"Fc†µ„QÃÑ#aÏ Åv6åQœÙ)¯Ý¹î”¨hèéœg‘Š Ç942ñ(S•kd3¸Rœ#pŸ$Ä鶥 å6…húHKM‡Rã¸dÂ`L•_UI ylak8òƒíMÏí™)JSJڜ?6NÁp$~8L‡pñı‚뇁€˜6׬Ä(Ñv¤Á¥«ð¦›6Äý´_3©Y‹Ú6ÃLë4³c!hT¹›vŽ;L±â^ -àʔÂã`y”a۔N5º›ab¦¶q|’.Yl\ ZèÔ3º† ’ "eg1´MJ¿Ü²TÇH'-Å&ÔÀÝM'i‚戚“ežø¹YM– h…ˆb•+{voîä,ßÜù"tꇗڗÔ -;ª¨yÈëÍš%ˆëRi‰H€ŠhMÄ)­ \ÀXÀ?â篖ØÃP„[m¹ÅRbйò ‚ìá*·&"X¸f€ }~hU®5¶Ä ÇÀXn‘í¹=üð*âƒî„/·”˜¶P~¹^±w©Œpnˆ’ã$ɓ£5Úfø҈ç‹Ð™A]Ïö"Ì ´ÄT¹´7ÁfpaœBtìÁ“Ò¶’Ù‹$ZæQ¸§xËl¹ÓBñ{ˆeÊNsª´…Ä8,Rø­Rf°>Í"W¿Ù•ÝôSš3 ì2@KßOCZ˜Ï®Œ€j†+\˜ml'¶éN–$³™. EÖ¢`&ù¡Ð°ŠXá -NnÛ¡4ÔB1Àß.AÃ÷rdø¼ÙÑ—6;Ã`³ƒAμpŸv0RñšÁȝÙÊâcèÆGjÎÆaðfÐ`\ՉHš¤–fx);žé²BZ$ž›cÖϧq”  ¸¿¡„Npy> c¤©ÊEf9~lö?œSy–c4 %àV–A "¿½$°ÔîX™ô˜ÛՑª1g*2ßqwI€ú+¦=Ûí;¥ ÷­€YÆFbÃÑK”aó¸¹Æf9à%³z…Ÿ°k¹‰&æF¦.Š¨b†ÌB4è-™Íª¸P u´F‰ƒ·X·bÍB Ȝ),‘=UšZ晚Í,±«4¸n#O"“ÔbA‹.rqI1Ò8FFMK͹PŠÿ®E2y æW;~æ+”ý®} ¡-k‘¸‚¥ÊÏÇÝ«~¯(jT碉àÇWˆìld^0®Ê\ŠèÉhг±%kQqQ‹lyðz€ƒÔmIWkUîÿùz®,m÷žŒ;³Étv Ñzñº¡bf7tàÈÁ6)µeI’ ‡7šW.g˜Égƒã@´_ˆÓÃä“0«I#ɕeu±=ox² mT+œÀþAdÑÀÛ´ß.§¸ai£zà®m6j Õ3,Î6/¦VÍqxS\Ì #¤+6üE-€§À—(MŸ4{:n–Šÿ/Ið¸¤çeF¾P¸=›Êuø%Jµ“/¨qó_·DŒ*—ù빃4Ìû«Ò̲W³-i»«Ñ&u;\RÚ.íƦãùíÒ¨–È«¥Q +d™Ñ·ÊLJ ›ÿBHS»£ä’zþe¶®[(@öKñ‹Žºñÿ4Y"…læ¯W°2¥s{шqþA>MœÊE-šÿ²F„zLmj‚›¥½BÕ!Cmþú%øÇââ²3¾W ›â†å+:J*V èç%)0‰Yҗ€iv‘(% .«œ,’°!-Rž:VhC± ¤6ÓÕ·%Cª$v–’¥Ê´ÖÊ´m‰Ö†W:,îóA!µ¤Y,ú‡M1k5µgWb™ÂñN+žÚ[Ýé¬g¹%goꗙ4¼@ãD“©„HÒÄ tl4s‰>YÆòÙèõ¸30SJCh+F&™NˆyšI㎢’t–[ ‡´Ž³¢õç{éwYüéҟ¿uö¶÷¦+ -yúd`SÐd!£ox>î _CuC@U¿£ª˜}ˋcood«b³+“Nû“iÙöºè)X ñuUfž…Ã4_ûó‡_‡·2-ÚPm‹6¼JDá¥ñ€êïlë;ƒéåàoÿËtã|ôÖÞøªsqZ˜őùæ¡ÅûéE1†NçGof¾ÝütS\/½Ñ»!Ž ˆÉ¹,½s c¿j•*?§ºéìz‚E©öãþ‰õò u63Ňîú®^ú¦3žâ^úÃ7ÙåäØ ±‰ÏÏÄÑ«g¯ÁÓ¿ÎZ;oG㾿ÖUøëìòoÿáJ>Ï Ëì· ·4:r­ ½›<Gݙå©i/¸$Xèáqî²Ëû¿<;ýqÔ+–üüCëÞûëÁÐ82nÜ¿˜MùòÉûÆãÎEó‰Þ”3‚¯‘2‹áÜ}šô3ü™ú«4ïýãprþ¶3žüäx˾í¦C…á‡É’‚$æʹÖLʏ;Oª‹þ°gº-êPʐô¬˜þˆ4©A®°øw·¢³ÃÑpYÓKŒÌòîÕê$ý”“âã !V¢ÞX÷áÛZ+£Îèn}ð›3…ïßÖg PövLrèg×(Ä£ë[Àþ>ëý~ÒÏ6졆Ñԟ©_bݜÁM(·«=ûµ”'—ïnÁüÞN>{Î÷fìUÄqRK{ü®ßƒ“œ5†Ü•¼Œ[%ªmþÏÖvÏ葯¯jq.z+:¨“µ]{_o¡Þ’©lýh}¨Õ¥·¤KO¸´?£©-N‹Ëéóqßh²µº·XéÖHÈÏF³q·8†HåOÆ)÷EC|ñ㩏Æםe<§DÏËþ XYº<3Ââ·bD?—:8íŒ_S#OUgòôa­n.VÚ'+Âz®1w†“›ŽÁØ­ÇËnËÌXÓËáèØ{OFƒÑ¸V/Ëv¤——/]Ó>â ߊÞÝû‡ÇøONvÝl,¯wo$ûC36ƒN·æX†ÅoÍþ½~{ú² -w™Óߊ&n¦ýëþ¯˜UãV5Ìèð·¢×Å´ÓëL;Ÿ 1ùG7æzÎTkM¥iÑ[…äxP=¸“ps2Ý<{æ¯Jà˜çV)DøáÄÿbd˜vèÞËÙ —ÄzŸ´ÓÔ<£óL¦sÿŠ7» ¯%sÛþA}yñà%éB¶ŽàoÅËbðjôÒ6À¶èÅh҇ÆãϒÕ¯$曧“ãéŨ3î=,.;³AèÖðs‚Ê !‰ªó”ŒY ¾éôzždöE×x‡N6¹MçaAŸ8mJû@ï¦ß&c Æ~²¬†|¥!×vÔºä‘4<`Э©™s§ªèϝyˆó ÂtPÑ»)À!COú•MÃÔ/%?°ZߧìM;ƒúuŒˆ65È`~>” -ÏÿZÂ(ˆ§y ADåƒÎ°x5º ¥ñer*—Ç|D¸ÎI6Ë5… ê6ܧÃ^ñþqz{àÆW©š77cWnE k™HsÝæ{j拆ì™ílYÁR$xÞN—bìƒÒ˜ ‹„êv¾¦ðtÄn´L¯E=’EºíëËÛØaŠ‡³q÷ªõj\ô/ §5”êû˜BuÕ²a‰/¾°;OÎ奮æ4®eÈF¡»fºùr “‹¡ç{ »é“þëa¨oÊU¼ãÂ<¯Ä‰%Ñ«X§`grџ^wnês¼òÀ,ö}0n_{Gá²"F÷€Tº*±ªCP”7#Ãë»ÄëSYY|Ük%rTVèðó%/ÍnÍ©zѧ\YìÆEš¬œøâ×íՓÑ¢£‡t>_l^6ƶ¶àÛ5=toÝy íb¡îpA‹œ/45O-²¤—o!ðð¦9\ÁU¸y}ý¦] ÁG²’]C± 'ç];—±¼åïÁb©Sɬ‚)$’¦Æ´¥®d‰PÖp<ÞæUuã/ÀÛ³®Pw<ºYW䬾‘!֕=nbøԚµbß îš‹Îx²jH}7  7¥¥§a¿Ö7¥êýŠCvàÉ\Kj”ö-©Q8lIÕʺNÛ½ÁŽh ݌/G‹ö·ùr£»søCÕhMLw},A¥Ð2i_ôAš\5è“ö°xÝ â —”ê. wY(hö¥álÑEÛ%u°šó™‚“«Žç‹UԂRÅŒ |'`¤8Wr®XZµ¼¿i—Íؼªbãñ|ŒÆRU}½PtIA·e–ƒzV´!=kŠú«¸‰)±²Þ»¤ä覻Šã`‰Éªáǽ™×ãûSÃeÇEëÁìrð·ÿg2¾^£Ï kÄ£©Mjl&Xìr6쮚5¶3#ðÌY³ƒ`¥ÎpÈ!¢Õê2[«}t¯CYëÞÉÈ讽ÖãçO^>ˆó֟ï=={Þ2Qé‘ü^F‘‚tK+õÁk#†²c•8j -BX« ‘-¯{ýa•†”M¯ÖjèV\­Z3ëöŒ’bRƒ³—ÊW²ÑúÙ¤x8êbÄFµbÿ€j†ª}hÒÞqñ¢ÿ¾¼(Æp“BÈ@(²ÒÚ¾žÐmhpтÎ\ik‚1éÁØÖÂàхZåwY£Qã—Ùj5ÞÖ<ü34ÂvÞόöÝ¿æ +kí&ÿßÿýþ¿ÿ×ê%ѾLÌ®Û_ŽÿmÅÜtåºAp ÿÓá›dš -ÇÝݕñâá㣟Nй(@¬„“£Rú´ß.ZÏíO¡•3ƒÖаXàn½Ü' -<8;yú4Ó è-þªþÇóüÓýoüÍ?ýÐùå»ßÇÿøüèø·ã'×Wß¿þýïÿýw÷þé¤ßiOþKòÓï%ÿðýozòߟ©ÿñýéŸÿéÙodznúø‘|–}#”ú‡(š<üëÃ×ßEÿå·?üíþíûîfòÛÉä}óšßþpú÷c*õûéñëßýÏÓßþ7Uœôóß»Ûíz½ð®ÓÞ¿˜¦ó}ú¯O¦ÿú—cõ¯Gß=øÿk{¯ítzäQôþ[‹w0“sN&Ódc“ƒÉ`ŒÉiÏöÅ~šó çêÜí;’:©›N„oÍÌo0ÝTI¥R©¢j³+ÀºŸÍQŸæB¤=ÚVòo­o4éGa"Mëþø›_½ïD=ekŠcÅß õã‘я‡N¶9my»†ìì Aô"FÃÊ%ýÓoù“ëøºúIþžS¿þ®“C‘‘.=u–ñHLß"AŸRƒÅ`>ééü,¯NZÚDْͪƒhg€&øg0O3Sï—!õë†#‰7·Îœü°ŒÌñ”¾A¤æS´YÐü†§Óñ -~Zš3?¥_µÓaûKí(´fÉõ[Lo=š¿/‰RMw€0ÆÅ_7@ã 7ûñÄvªß˜ßËa»óý¾ôûí§wâ8Í;Í«“9MNM@9¿~îo¹³Ð2eƒEv–ß VË<¹önÈ9tJoñT>¢ie,A/ì’Î÷|š¨?µ˜#ÍY/äšhúntû¦õ™4pYz¾–ïk IM®Œ>+Å ÍYÉáìkÊiû8¢#Ôæî¢ñÁ½Ð8&¯yúÃ%"Ô§H+S$ßOY2#š«ãÊn;ÌÑhÆâJÇï Ö{$<ûû ÕdF àU’^ x+Y`†Ðg‡à4¼Wá[súΫN¦‡ˆÜéù)æñu}ÓD=ýgNÿ؋‡Ìx¬×&}“ÆWðó­ÝHTRÉÏôOmyˆú¡@“ôtêC’ ]߬›:Íͤ§¨é¿Ö0µüóÙÃ?›·‘ú19 £#¿¿:Û±µÃ¦˜¨”LE"mœIêд&·dóÞöeŽ5ÇrJQ_`×ϯ‰zá|¹ž¸%èÅhÕ4¨ØA•Œ´eº³·…k‰¥Äw܍ø 2ŠiÀ#&‹9¹ øëÅ%.¾¸ôbìû=]àlpRJÙÄ°àD|1ïÃ#ÂðS´%‘z×eÔ"äH¸ñ]ªÁ9aÐ퍩__u•1—l˯`tvHØÔ23Ȩq°»6:091µø͜üái£šðw]-þ:|æÖMð×lÆj™…–%¸šSM¢^ž™°‰ÓÉRg%4^ô*ö^¶ãÿ›'ãr¸²žò5ûœ? ãç:L¤½]—9šÁ«Ù©yMˆLÚëOú¬•&’=6g®iAXÓöÑޔü;Ï6Éõ¶¹KÔÛZ£hfì3–݇‹ÐYý½DõçW~Ö×%}æÒ/%:é}ÎÆ»û%Eb¦ÙÎÑ`(öën"¾xoCy?JO<¿­Dãmz⾧KTë½uàom éƞ  û®àˆ$W†ý’ˆdLÔw«¦1Np¶`¢Ûé˜\2†÷C‹=yxO!CÎþà¼võB`dçO?@~O5Þ¤ó²î%j£BŠzLŒâ‘\Ê^5<(é’Îîe˜¨]êö)zÊ4ðÍ&~œ†tä’áÕR‰Ä*©­ß_k…U#æ(öøg–t³„£Ðy’ŸÈÆX|Óà'ø¢A?B_Îmȹ0 í(ö#òOç8Nÿ Ñ°pògð1øIýãüK¡WH4iúð#j½Zä‹3’^j@ü› =M8 Ô,I¢a§K¿E‚\ÍÒWccGNNMþiLÖ¨ßvµešÂÔS†h…Ñ Á¥©_8W"ä/ «^„€}š@`Ö,aþBWÿÑP€ÆI|ÎÎ}Ÿ]†$ùŽà®9Æ%4Ñ(µã7­êՒvÕ%šñ¸C¤X@éبáà4¿"89:À ¥ÞÏ'û -ZfÍÙÙ<Äú“¦µ$þö éÀ°öÚúA¡q©³444ˆ½ÓÀvß°cCÜÂ@£(Í¥¦+XADϺòÎù–¤0=FV „‚{”•Ü}‹q ó38ÄÒìXc÷-‰FèUœ´º -}Çc|0ØÒ<=¢—tI†=o#k#š@jb/£Ù€ÍË0´Ð(嘗EÃÉVìÒ¢Cƒ(Ms+XÐo®®iJԛÅ-×ÏëÀ¾øqáçR0±§ò¢DŒÊ¡6Ù~óI(@«V-@ô¤ô*ÞÒ4©å`ÏLWyfbº‹÷ü)nFá:Ž¹%aF™Ò «1Fꚟyã7{˜rì<‡&ÞÔ‚©ßKµ›.I|JÉáß áY3ˆÓþƒñ´—û††G1éÓ ÆIò+Þ3%¿Þúg¤‚; -Y§_€T¸ „¸?ê+ÚÒù?ÿ˜G9Šþ‰m2ts]ª'*"`{°Mùƒ³eH’F}>³²ÉµoÑãÙ¬r‹ u^IgWos°Ï¾"Э2Ÿ,çìþu šÃž.ܒˆmÑ#¬‰Ú:n¿]ç´«¸â u2“ë¦9 ×Ê#ãtpuWšÔï·:=Ò,з ۊÉUÙ ¬ŸÏ=HдGɕë]Í>cØÞšmÖ¸TŽ…îK‘Ì·Ùn~bÐ7iˆÌö2r½7’¹,Z{  ø§¥Bòë3þé2v6ÔP/·Ä×G­ M}úAëÏMqÄNçð¯.“OGio[gO•ùQ5@#„ýqÔ4[ñãñ·¡r+†0„±ð–)ÇO0•Ç€WöÉ\ÒsI:œ–ÆIÍY‡Þ  ­Ìƒºç`[&Àӌ%~|-ä“Ñâh€èjÃÊ2ۂãªJC£úN׏LÛxëˬ ýškKp ÿ»c²úʅ’³¦ GӈÇ4”ƒVg¢ä«ÌNæ@Ë}+ÙÆ._BG‰œm éëìfýŸìNÚÆØHà6Vèî'µ<-}ékèb™C -Áã¸Tx0¸_jp˜ÓÛØí̦ŠkôJÈPÆÎç9Qì8gŒ„~/~ÌÒ³MÐBs¡á5ý£9Ò©œ†$©u§ŽÚHGyfµÞ½¡ùH7§H•û´'׶ªÀ­mY]$ôÑô3ÃÁ[t¦,ÔñCr``Ž°_†û€ öiß1‚yx-2{wÉÕlüî!×u„—€«Êû{˜4ì«þˆ;3Ï *“!ÐXÂPöü3S³ã;á1¿€4lHý€ÂïÖÄ#±†.ß,{Io³mK|™>‰jÝLdß²}r圑ö·'©ÀÌ»=ï•LP©¢·€¬ŽÔ„†¨ë´5b¨ÑuÒ?€dÉu@kI F«òPºÅâm÷Íò| ÿhk¿¸ÚDaõ€cµzʘM¾ü¼ƒëµ&ñ¦ö|fP—À2/Ô¾s‰¨&½u›•}@²€^íÈ÷² -sä"qùïç'´Ô•®gIéNÎ$49Î{^s¸¿ë}³¯Ð‡4ç­¦Éÿ1 Wx€Âóq…üy¡Ex™±ìºN &½ÎDÍKô³›³Ißû#… —‘H•CsgKù—ÔIb¾v6õ‘jÆ…â%2¦rT÷€J}¨‚•Ž0µ‘b ‡ P¸µGAžrK­ƒ lÔ¢Ï÷Nr‘ôºäedj-uú§6Ú¥–¯Z/àoO%±æwKj'¯²›îƒå»î›J(SŒ‡“{\-§Æ1ďÖàJèxÂߟ}¤‚#{¦;?ëx$ þõu  :‰ÝoÅÄ㨠ÐnaôÍ7;|0¬Xc£è»Ï-Ä%ÁU"SOøƒU¤OÓ?_§")2¨Áæб–JôD*¾¨æ´ïÎ|"h_%xoQ¯$Lñf=?&"é36 —5¯ñPk¾ˆöÇ!æ"å É¸Œ&´d€—>yӝ+©ÿ±#P"ÙuycŽú³¹ø¡î0K…$ôl“9ÁÐÁà‘?]¼ùS¿`À£¾Â%m«Î¬ñÐÇß -ÓÜÁ?uß+±MQ!!fß®RrCN` Ó¯í¿óÁˆ&7¥ÐSÉU.éÜàtJ[&D&bÔ¾5GvÉM%ê½fš¯Wp¢­ºÉUØiÏ󸺝7õ#°?l+æOýQöPãGÍàœþÙm|çèƒNm"õs_o£¾ú„  T½mûoépyW¿élômôŽ ôO›Ý7Lò³4@¿¡´h§ç‘4$.f¾Àt› ƀ÷nM)û‡ö3éÖxlD÷|SÒÚø4³c0'K×mx2 ¯µøE†“½‚Æ9 \uÈiB‡Ô+QÚf¦Þ-@mµè¥Oøke¬Cç3±Kü\‰ˆ¾@ \Ã0¥Ê±•Íî^¢^שmY)îh8€‰8Î`;×· ‡+F|Ö92ÓÎћŽçöúeËêz>’¡²ø…5‘Êa~/tY«®‡‚^%¢Ÿ\ûãZdiPVŒxøM(:ª!ëOäÈÌ÷U”sFGr½Þøv>÷GqÏÍr’™8"z\ɦ@úȉõxc%Dr$ª»Ò9m©f´µº0#gÏ„F—™¾úúÓjkõ‘Ȫ9Þã?äª%dN‡6:0ðÿ|\‰§”üÎ؄˜†²oE#Üʘ+z3 áÀ*tŽÐïEË`?µ5a“D݊Gք‘dhFAçC«Il@°—©LpD0ÑS7ÈÊJ4¥w×±ÍèU·/5¡¥îÒoõݦo÷·™D {:ý•0¬Í”³±9…ç!Ý̺jÄQGJ½ŒMçW¢ó’Lö ì@â·û5Î%pçÿ\æG¾ ޙÒv쌧qŽïà ր&^#ˆø"¾F,p©ÏäÙ؇ŒcD h%”µ\@I‰”5K¬Í´å1hfzy&VÛ+dh *úxLΧí<éYÍf¾f£ß øc©\ê·7{…VØk<ò夋ÅÈ+Ïæÿ,LŒu™x¸ßê¨ÿË u—å0B¿»ÇðÏ>Q]{[‘¼lÁ{©÷ôÂë{X.ßK(¢S˜I¦!¦S2²ŠS´„¢dډ²9>uæ÷¸ÿ5’ÀHú)m¶‹d÷ځ•5AšÐl6­‡\cÓgrmuÖ³ín{ Öæœdýä+ƒÉ…õ/¿03DŒ'ëÖR÷\­¹ãX:Åd"`ÉÃÑ-y:!®ò¨O/¥úe€Ž•œ&*ÅŒç.:.Θ¾^ÁY1ï…Ç­Ý_ڞùªYp·Ì ÚÈýďµ#ðþÈרôþ(aS"¾EÆsx—™úŒÞdÙh\ú·ù/3χMZ_@(zÀÕÚnÆÚ ,’ž–ÛŠ±Àr`Y$êé“Éw(ŽcïÀ‚6ë+âä"d ˜ÞÓÐê=Ý_v4ˆÝ(Û„ÌpmÄ`¸¿R¿ñ™5_§Z<5ÀáúúÖ†b2øìZvìüyº.&–ÐLõf&õŒ—“Ô]¨OäfÈÓM;SºAä~A9E¬ì§ýi™ñèϒØÆԟÄÈÐwÁMñ.¨Ø)àÃA8_ÉU}¡vcf3'(Ý0%7 -ŽTþŒÃ7éäg²|!M_Q6”784gÊæ ؀f ØKõSfÍh Ý^ldzÚà¢uËA‡¾m¨ÿNÏpˆÿ'Ê&röÒè>c…åžùõú‚ -7vG+ÛÇôöROÁ¬Y˜³ø™&†ÌÄ)°pð]z ’4Øúq¹W KeîÓï~Žó<§Ef¸ué"λI<¿WjÕù°Ыôݟ‰£då gU¬‚Đ^ÎO/§åvö2[ÂÒp’¬óåötžƒEß.æۗÉ|¹y©íÑÕÌÇí x8?¾à,xi/`<¡üÒôn…jm/Íùñ?óí €¨àÁiþ’ÁA[^Àsæé ç´ÿ¿ÿlk»ÜâH^v3ò;ˆ~óRÿww9…ïfóòðëÿm{IÚ^òÛ4*r£†§Q{ÖÍÿýa§Ü- þŒjñÿ¿õy¹˜Ó£:ýïÿ̧+ô9”Ëv2_·°.ýt¶I3<͚ýô¸ÜËÔWÐ+BŒOçÖ|¯VT°ÜäY2èRï2E÷ -FîÆKrŠ­D·^ý8ÞïÙ«„…ßô JPéé -K_.Œ-8¼a95ޓ÷ /™Úá*Ty·ÝMaGäyz÷Ÿ-Ùð*\°Üæ¶ûDD DÞA ƒ=@Ý· Eàçn½”¬‰ä,;öⒹ5G¬ò/êZx²L}wÔ©Ýv†ŸJÍ0:X êQln -b?ÿP\ªOÿ¸JVþ÷Cºú†e/t%¤Mýº•ï’7Ëú$°dãÿb—1c 'µÜYˆH›úïe3َ—k%u™Hýº ŽÔÖmœæˆu¼¨Ö啛x}Ž_ .¹ýØ«~ÐM?JP²»Pµ!~ð \O-·§nª–ž?ڌ<Ü´£®äÖ%"‚„dºù-1Ù1µ‘‚åDŒäG÷@µà?;À󌖢D'¦ÇÝd|'ìœ9<Š®0óKϔ»úW•”Nêjë»HT}Xb恞s^þ,™Š2‘¡+¼åJ¸~S˜jWǛ,G ¯Ô=%<‰¯ÀB× _ëÏý¥²+þ=’”€Ü÷´¢Ðú H«^OüÓOŠa…Tü”œ(O$HÃñ©¬¬+‚œŒ~ÒNKʕ9ÞÔ1@hy(a‹®™¼Z` ƒwHM16**$¯.p?Þ25îL9àÕ}ê¿»ÿä–xé½È{[溱ÖÌf¶`“±³‡}‚ ´îÏêsÀìRNìlæR&ovà <Ÿ®…ƒ€m"HNDö?çÊ»sø¹øáÜðËã|º(֏Òõ´”öøªêN–/¢KÍá=Â"U3çÂ4ü9ïªÕ°€«# }šùà0³Ñë%è[§s˜"z i@?TýƒÿJ¸îÑõŽüæXsbwØÍe«9ö{vÃO.Oä+äf|1ŸÐƒ°;V?'Ó?Áì*§©¾a„3ʱ “S²¹KA˜|ýVét<†Ou€Å’wØ=5r"ìØNâÜt v+c¦s"Ôî±ï8EðÀÅͪuhêäÚ¤W6û)õá?ðgv ~ÞIs±~ûåï/a¬YÿÀÊl‚XÚè]æ!f±ú–Åì›0ֈÚp<9ߎÂX?ßžWWÈÄbhXÄ'½¥lÁêý5ŒõŒ0VñÛq-„çúJ `r›¦±_—„¦ë ’ŸVŸF»=ßE°vâç£ÆbU¡zaqVÑ9 ú ÖlÎU¥°«­VÀ‘“ w]a!ïñû-AÄÆë¥5tܽµÓ°zvW Ur$)¬Ÿz=«×»îY¬C“ˆ‡Çþï¶.‚5>öù ­Së 6ªŠa…™´Z·!ü-<݈ºÒüΫÂX¿RÆèA») a5‡×¡(‹® —¡L±n¼"ŒÕÓé8ˆ ãCë+±ðk«WE+ŠÊôû„Èt}š·Õ¶œÃ:vd-£¦0Ö¬#¡Ÿü„ áù¬±Ä(¬«Gä؇睢pæ{Ep°v#Ž’ßê„XM<¬Íé57ßùªc« öïùl\êuÇ"X}ÿjF Ä°¦eS?ˆ°"NãM7ÅÿŽUA¬µ°Þ-Šµ8¯¹BXÑAàéYµ¡ñUhº§×bnþÑë ‚X›úíBkí÷k4AXšëéö²ŽfqÆZr¿5ˆxä]ë¾ð*„Jhˆ¸9̾žEˆÜ«8Z±bZk9š¾ú}A¬ýÊ*°¢óæzºïŒÁúpôOk«0֏¿ý¦ ¸yX!„x˜·nE‰||«™Õ"X; Gf¹)b |X_Õñ¾VÍt¡ó\†þ!…uâ6ò6±[›V—>jÈqçZrŒL¡Äja±B41€ûw Ï€÷#ëi§{§°žcfÞ\Õß㞑Ěì8ó\¡h9žQ5DÛ®%Tފ¦ °¦ÎWr1÷ê#±ÆœE+O(ZöžòäqkC©"ŠÐPˆµÇãx²…X<¬Çcb¾£Ù¸ æa=yÿBÔÉ }Ùx~ÝÍGuR³í|<ôq‡•k軐èÓΗsÓ{úëȍÞ.ìÓëƒâ´Näç`tæ=°¿¹Ÿ÷ÔpëÔÓÓ*p½=}Ûß׶Р¤„ü̇¾EŸ\¦êHüéïx g‰výBÂ¥ëNEŸ–ÌۘKüé¤òfŸò‰æÓT^§“œÈÏ9].Ò8‘Oô‡ ï· ó’V[œ¯¡k¢5&…ÚVèRâ¥Í«£èÓÖÛÄ®ú½3Dxaô6ðkEŸþ?÷9ѧ«¦+ùÅ>½&ÚfEDb?cú -{EŸ\žh[‚hoÓí¤Vû¹N­Ë›DŸfåÉ\ôiÁ{uJ-¡vi!‘§Þœ#ón¢g2„yOÍõ¯SŒzš²E®¶g®>ʚì ž“ÇRåÚh)ÇLßKQ¢hô¶†O÷”ÉJ ½¤JîNä'®LsµÐ -M©­…`X¡uø ~G¨-éj -þÓB&cߑ҂B8®&i)x|uéß?­”tvWO‹jÜzðËÂíh -a;Ã^lõÀØm_€œ}Õ„?¡Æ¾|Ÿ zÍ/#›•#{0ëŒEŒL!¬> ´ƒzÂX=®(Vp¦ü9ùz>]d -‰b…gàT ë Çê©AKCøHÖ0¬3NÃbE¶ƒÕÍ£0´ ˜¹f׬Æiââˆ9D~w‰bE¶V`2Û`Àb…³áL·/ŠùäÇ -mQ¬ 4~…§QÛ¤°–ô¢X‘¢ÁbER€ƒ*uÎÒ΃4~ô‰Z cª;Û(yopÙl9R@äUŸæ0È´+²ïy)î£äFÌú;A‹Î«M<2l ª˜3'J\Ž”œÑÕâ¼½sd-ì?ѽaV§lz(ž(¿@toŒì#ÌiÿÐ8¢Ál/ „Ø8Q»Y1EáfÞ¨,å…iÇ4Vë#ó{ߓoñœU@&í¿óôóOצ)[…y9 Ñdñ  -1ÚÝøßè ®{1Ñ"µzJ8csøÔqiȸèÀˆïÛú²e‹gF kÌ󆅏ixÑ.[\ú˜ó»ñˆˆêPtö/É¢áá?ÔðI£_`†zµè áÚ0“Dÿˆ.#½†µWù5Ô034ќ&4I¨×6$è¥| wˆK)ÃC!½$ 9MÉ?B”ê%lOÓ+l½‰¿XæâÒ$e¿·S_ô@åéÒ ý0õ]Én° MzD4zq¥ñZ - 2\)ä•BH¦I®Hæ;ÄiÈ šCC)…„É7È Í†"²Èˆ, ùE>çV˜|«ZTˆ‹nOäÀœ\çõöÉqŽ54?w¬Y/ˑ;[ÔQ¡Á‘¤Í¼yqŽ5l^óO›Žb+™šhš»›¦$(l‹¯Ñ—ُ8»Œ:0ºvZd©,{çX«Ï¡AP1‚;iã?¸wæwš}p†F ahN¥Ð„@!Òãa"ÓõJ7 ôçøµ}‘\PÓÒpZà?=3â¸â & ™¢Ð’B¢á« -ÿ«Êz°¯̐‰× RùbƄ ŒœÍ9+8¶hvr›fÜ1?7ìWÚÙõ²`FaÙ|½,³¬œv¦T -­Ð-zR)Ð&ٗŽÓ;‹SÐð¸a‘³,¹Û•*A)0Ër¥¶½Ê;ö,–Ó9V?=+UjDJt=0&qE^>òôT°ŒA­´¶!kp–qû&©mÜ°†ÙÏ Šbè Õ¶ -·§"hÜæց1Áb -ZGÚȹeš¸¶÷8цÇg+Ýn؞ç³ùWÖí9zºSsæÆoÀˆrB£˜®+xf»’í_µœLôoáíyŽ½>o{&Ûímæ4Ù½ZÍŒ¸”Xê ƒývu^uJmVëä(zbNjYƒ°Æ˜ã‰á}#¿Tѓ´È ÍÐ׃‘‘ŠFÂ×:ï#‹ŒÀFBYÒf‘3k‘ƒ>ïÞ ¦;Ûäæ/±YC®þibÃ\áàSò~æ "î "ª¥4AI"²QòÒº¹oKs§(à‰N¸÷úç7é“Z©(ȳ¢@±_@|†zT§¼ê²„ç(òž¾šyÿò04Øzk¥ÏÎLÿ”ee7ÛNÐ21ÝÁøu+åR:è%E/å›]Ô,"Í(@¯7;‡^ÌfG¿pkƒ+;w§Ðl¸›]Ð8—÷Eæ}UèL‘r:øŽ\þp¤¹|gʦÀÕïELgyG.˜¶¡h¸Ù£R€™e¥Ž֌â¦pážÔw8B3\hJdÌՒ)_/Þ)+â$¢ô41¿Þ¦ãĝ‡œD0 -¼ƒ<¡ âہò)chLˆr\{Žš¿ðÕlÀ âþGZB+д!¥‹|5ûòQzћôˆ”:"ܱ†_Ïc ÜZ»éh,ò´ä;÷MèË(=9yv/²§!{ÞÜáÆÞù¡Ø”ÈžÇâƒ÷ˆ‚XãÍË×Óî¤ÍPÆ¿O{ ˜=*¦æñN>¹s Ws©Ù`‡Œwéñ¤8/ðŽÝ}8C§Àˆl·y˯gÝ® ¼ðªâP&€&æ¥rÑR†‡˜—B»a -T`ó4‡8ÐÊIŸl¤P×ؼm8t„ôèV$¡0' …‘зºý dýÐ8ÆێUn”QOªWM¡ŒØ§„'R(͕‰ßHíGÇ„æ²Ý)Ñ,`Ò¨I51Å4tàk|évZ¯¤ÛiÅ*nÂΔ Müð¨tk°Ò1qoÑïùÐä¥ë‰AAh÷K7v{f›»'H7°rBÒív)Ý.Ý®½$ Ç¥„ò„(.$N²$ LȎi6O~*5wRv6V\<–*/¯EW^uøÝ£¡\æ¼ùÑÄE’B-v|å,´«)çýmB@kªo’¸0â!&tïL¨àîê&²¸¹û=j X9^”¨°‘¤Lñ…Búl Ç³*³›ȗčá+tK …"´g8¹ÉÃÌ]É;Á×ÖG´ŒUǯÕÓãFa»¥Ôù…{9DÏÇÖMÚ¿ŒçB{\ûÿ>Ž7kpån÷€ kÐ#Ú?…98Ö í_ -kâŠRz>JŽ¤°ù><|>rÇ!?äL¢_?%Õ Š"Á,/úôä¤f±©¢úÁð(±,85-JBxíö#Nn~Œ@{tŸcØä2ÙÝDS¤ Ó«‰Ðˆ™L`AmŠv¼D6HÚÄÕÁ{2öxce 2kHvŸñOª”ÍzuL¥lve¶§‚“Ê•lÏD3ÅSãÄü`l.eÔT°É&§'¦öh¢±Ö5¤4@skÃÅÒSœ)€hþÛô‘DG¸šC›2Ï- MdÛw$3}I¶PýCûþ K![\m2ú&71{ÀE½å­ áA­ªÛ;-ÔÖí×Pmi2jkÂ=€|¡Z>yÑÌãå|ø±v]˧â-Ý]Î']ËGJè'”ó‰bEµ|*ÑÒÅËù¤kùTxéâ#å|Òµ|\uðr>éZ>§tñr>éZ>•DéâMå|Òµ|*Tºø„r>é÷TTÕ÷Ãå|W;˜SËÇ–óI×ò‘zš|9'Z¢ÒíSOiâ™÷âÅH¼$cv§åsÅMʊ¶¾%}wâmš¯ 8;ˆ{i®pÛòá‘Â4? änR…M¦åU¯2ç¾AIQÚüoޔó·ð"…RФ³¼”͐ôÊñ)ž!ÏÑ%°o”Þ~û˜«"à°¤]Rc*ÞC³¹©~O‘ØÉðòK°¬¡ÛʸÎ7å—Pùi‚)&·»›Å|ÍäÅf»·:VôäkM®ìŽ›py«+‘dh°ðzšÉ²;±°ό’+»7b¥£¸èÌH¦˜pìW9+%ë£Pq -˜•Aã&x9¯#>×A¶S™ü7YÆäö3Ž'nñT͛Š^U¨ -¯¬°RÞè%gõ´k_›œ¯qØó<*à· ÁÝ{‚^YQuL´ W øõh²ê˜âšÂ‹læý 5…Ùú ÇÇ%^#'^„#­f dÞëß5bÊ ՌŠ¯¡|æ½â´„Y–ëõ\C•ÒšÂÀQ®&GŠ#x)ñÚÓjVlÜD´0æhòŒѸnÙG‰&[¸ª|š¬t»h\±+ÙîX¹IT9^:¿J  L™š{å*¾¶Ã˜=_ñuJ—îñ`ˆX½òi#×À ÿIîóœ{5 -eìÁEN±=(à*òr÷¸€µV1×(«Ú»k•†ç ­èoXl'ïPý#éˆåq"vÞ÷KUëñr%("¥Ï€)IßÏB¯2 3tº*!0¤Ï -¨ŽVÄú/›/HÀ–¢(™Z½+$^–u<àïÑÓòJ÷>»ñÅõ´¿üm¾ ñŠ¿«ä¤»Iõ+㒠öAÜè½áŒ‰cßÀa¹nñ”HŒ‰»«k¤ò(“LJ¼|yžÔ˜®n±ñüÆdYÔ3¼7ä½y4 hÉZÞ:R(S ¤ Ùtxop¿@áqï `J¹¡îïêªtñqï ¬‡ãyoxÊ­òZAÏMÞáAAA²ê X-6ž†V–"›”8¸Št‘U¤%rՕ(ÒîXìQÀ*é -É}ñ9¹hmB_úçx€ÀäB¹ b%õpwfÍsÎXÉ&¡Œí*B%Xº(Wâws‚®@2,*ñS˜(Y⇳òTŽÓNŠ’÷kaÛ×:%Ó?¯ïW…ß)<ùèو&==§2¡yFڞtežD÷™•y‚iן›gWæ=RãqCežd2ìó*ó»ûÁ­¨ 2 ¬È'!>P™ÇMµ¢¤vežŠ—*Yœ÷ìÊ<, )˜Ý_™Ç z)H鼯2ïÊZ‹ Ášº'þÃ#ïi©—7õRTëT’zÙÜ)J½”•§•ûQÕ …r.”%\ʲȲ€B@JªXD¡Pzô„‚²«Ü©Ì{yéëüÄh×ùÕ*¬›HŠµþ`ºJ±Ödƒ·Å]Cíæ#û‘­ÂݏîGMòA™&º;{¥ûQJU‡4¿Í¦d·']uŒÝ¶„M\è)u™i»ÂcMø}ÇbW‰%v_ßw,{כ͋⎌–k—¬‚“¾‘JÖìf|6?Î×{ÓN°Y‹Ýš|B*(kUZ$;~(ñ-Ȕ>§Höûð¤"Yè)E²°níñ"Yå)E²²‹®yv³`î Ú(âWÁޜ¿d´Ò,Àݏí‡÷#¯(OD¦=»(¬#ÌzFQžðÚ<½(ï_'—hÒ&þ-¶çEy¸?¬ËûWŠò„ÜÿBQžˆ?M¡בÒq¡ Âª¾úM‹Urû=OOKÙdì&¥yd”W™RãB¿ŸïVÍæê -å[#*¬T¾£0$uó0ìBg †F¾êš_â÷-zÿ¬`\ªÇ»“a+=‹BjP Ðhå7»nŽ‡iÍì’!‚Úø€¨G?3qûY¢ówP»õt7sŒ'r¾z!•´MS©¤½Û.Ôöôùô¶æšòOq+„ªßEJõÄ à_¡OœÉ¸ewái¥Œ;­1¬Þ_Ó[D½S‰ûy:m©²»™]«ƒ¨'%‹ýÞ*ËòX ëHkÖÄ°ò+ÂBæî¶ã—ÝyÚ¿%¦i#¯íÕ Uvç´ñ°ª¸} -ñb?ŸFsð]¾ÅÊîzRÕo™b¿]½.ŠUWšÿÎÄ°Îeú~µÅ±f>zYQ -k·îðP +Tn¯–l]jâèÅî!…ޣܜW=ß%E =ÆOò=ê0-ùTÔƌŠ—5ÿŒ•ò9+Èïå*·æ-5N”éS·{Nq‘‚dX¾ƒE¼§×AÁ˜ðؚİäò`å’G(÷™íõ„Z®¨n€Qà‹’j¯w›Û®—Vœ‰)SœIÞpyCî \g=éÜAå\%ÓYOt†Wñ›´‚F+Jg¨ »‚bÂËõXáß÷@S½öMv.ޏI4µViW>ñ=…}wúln-ì²h·Ý û”Þgó`aŸñjß<^Ø'TÕ§º·S¼°Oȍ/’àÿHa‡0Ôæe#…O+쥒¹ÌäŽÂ¾{é û„â<ìéù´Â>¡ª>Ž_à9…}BU}J³†n(ìòÒÓ&î û„V˜t?µ°OHåád©>§°O¨ªO%rµþ…}×cúÕH(P÷ö ©­ˆhÏ-ìZC¡T« ûø ä;0ßUØ'ªu>·°ï¢=RØÇuaRaß}D»¹°OºÒëi…}"UßÏ.ìÑ<¹°O(ØÂϼBaŸ à™¸Ï(ì“ ¬<©°OÁyóŒÂ>!r`ªú³ -ûd ʞSØ'TÕ'œ2’{ŠhemDŒhùÛîœïivÝÓgF)®¾:Èl{ý=;1•ã.~Wc:£0ѳ»øI¨ÊHu6ëo"K'nÂ%,•Õ6ò§4B%RŽ-6,ޘ” -&%1,nlë®1!¢aÝÔ§ZjL¹âÂF‚T}ªEä':Ö¸&SÌY8ñL&·6¸—é/íÊcŽ5Éþ7ÿSawt)Ô×ïiþ'*l8ýÿîsí›J¬ LYMŸ¢œ ™|h¶ÿßcë•íìUJÚìH:µ5ÿ“wBBÚ<ÜüÖl¤ûÿ=ÜüOEVáÉôÿS~ÚŸqG—;ÖpJ/ä 5ŧ¥?틬:.”ΣxrïF¥\*&‚mûd3å¸ôA[Úy¯¨¦OI5D#Wï(ž¢¸Ø¢‘Hn¼!I HÔYÈcheýÆjž_Ò¯‚µJèV+±€Qössg}7Õ -°–LºâT+J>?Mqª€¦0‰\:“ Âçb>I½%n=§Y@! E=p… à‰cµglEåªÌ^%XÀ,_i )ªöí|Á¯ö­m¯«}kÛ'^o¡=¥ï3Éi`¼J~˜‰R³.DMáµÁM©¬mÓut^§lKìbYÛóÓê9…1ÌÍη«× JEZ§’RðàS<Ú¬\ -4njî-ƒ½èÖ1H(’é£7zÆ5$ G;|“PèÍȞž75#âUÏʖPÜ,6šöcSA …2çýÃ}ÿTt½§Xë¿;ö£@¾†¼L{Jß?qUjý÷ »Q}ÿ_<£ïŸ‚<›gôýS1 ߏ}ÿTÜÚ(%Õ)÷ôýSIõŅ­ÿnïû§øúvX‚õxµï÷U~DM\ÅÕ¾š¼òØQrվ߇;«}¯ -1½z›`±cY°N›Rè!zåå@€žR`Zv(´Öd‰×çò -©J¼– -v¼¥ú^¨Š^…²ÂrµC™ÅPàSѽðÖR))¤Ò¿øÖ*~¬)©¥âNSÆáʂb×F´–*dPT>/iݳÛ3dP²=•Réß·|ÅünÛ³}S!•hrì+)qøÞ¦1¶UTeñ]x£À½í‰æ)u·)›ø¥hȾ¹µOßMÍ05%ô´ÎónÕê!¼'ÕÝvDoÕºC³™œnj†)×@Ð~gÝ-¶Q™Ô•‚rlùº[0&ååØRu·”».FÉ/ŒÖ aí]^9SI{¡•ÖÌ Ð;˜Ž™kõ÷ÝÈ쟲Ÿ¨Ôh3—>úš&"äÆ|ÎÔ'N=àG¬ŠcåTæ4'M³ó‰{¶¸­éB©^G¤2Ï(^x¼ŒBNž„æ•:Lb…ˆ>Ö_5öÅê¿E±ÂÙ¼{·ètYM·!ŠUŸŸØb­éŒ,VSPÆùÓë°rkäNz¿Ží°èæ] ±ÞZ+@‰ÌïÄÇ) ó q -#Ÿ"X}š7ÏGz„ynùÅyC ¬Y­OköKÓªB½ð9N©'kUªÃb±)Ž5“iÜÄ1€X _°0Ÿ¨ªÐ‹éÝÎe‘÷Ü)‡è{*¼ÞÓ12… -@šC»s†=8Á¬;¾:Ê{h×÷>êS(êñ®2VãíJŠˆÁæՏ1ÞVÐvÝÇãNuÒÕTª›*½‚7]ŀ‰_3ËJùœeUuΘ° -:ôíßëWZµ¥*üŽ.‰ºD¹Ð2kˆògYùR!ÅÁk­l³s4¹FBú«’_ h¼SæA¢ÉV)Ÿ&7ú(Ñd[ -ÝF´’ç[ÚU³ÚHíΒD¥õˆrõ7ò…jŠê¥Râ”$*­GðCßR’¨´‘M†½«$Qi="éî¾»$‘Ã/VèUÎím%‰JëÑî/IdI*-ATÜJ¯[K•Ö#²–ô]%‰"cºªGäÄ=É]Ïëñf…*åMêiVˆÏæ_lVxí~øWšªäšÔ=§Y!U±"­¶<Þ¬Põϛ€¾øôf…×n»¥Y¡`Šâó›ªõ÷|¤Y!Çý‡åE%¹Šeñn‡Ò…174<”vIÈgÛ)lx¨ìV«‡b“{Æ­Vb óº·á¡t·C!'ä] ¥]H"ûí …YPúV«;*`èg4<”N7a]6<”-({’X²Û!}Þ<ÜðPzr|/ÇÝ 9#¹êvÈñu>ÒðPzJ‚É°÷4<,Ž”¼¾]9mWïÒþ´‡Jß[ÆFØlx(yò¥Ècí ¥½Éª›.ϒhx(m §]ßÑðP¨j“Ý‚÷s¯á¡4)÷ÃM ¥¡ Á3JÇcX÷à ¥‹yUü"Ù{ -(¡X·CÜZƒRã¼ýèàv;ĕÛ;ªcLÃCùZܧ4<”îvÈ2ôƒ ¥S¼1åö±†‡l™G²Î”ÛJ.®JӐTnŸÐðPbϝVn…¡où†‡ÒPêц‡Êû>Ôð"¸n.%¹jx(Qr!ŸÚ;¿µá¡´šg󔆇bÇzS y_™]Ÿ HÊíG¹†‡Ò±k^ZÂý ¹ç”÷¨ê‚ ¥¡ày65<ƒ¢´ý®Â†‡^1qr[‹Â«"ÙÇr<âWÝÉÀÊ2õZ’½Wnx(­üˆqÚÍ ¥»ª¾nŠjxø¨wPaÃC%µ¸Ohx(ÝíPusŸÂ»Jƒù¢óºááý¥úX·CÍC ¯]Ðx·CFBß»醇ÒÙcücíÒIT|ÔÝ Öëv(J´[>àëäíöÂ+1Û󁆇¬êvxŠ"¯á¡$[àÍOkx(­1R&îã ¥‹téCúᆇÜiò»^ëiŠoáâ6<W(ÍFæ.… •i67<ÄWó:$\±rGÃCé³B<‰üƆ‡Òg¥ ØŽ‹®”îVi§‘ðoÄú%o‡äŸžàkq°t¾?¯ˆ’ÃR §±áŸèû¯Ò']Y.çÌ´íXÚ8앹!éÇZ-Á2ŸãÑuúUƒc¦ 6÷>´{{å'߂U]jm9š·9 [µ}ÚÛ{ÜÇß]÷ƒ_ “Áº1꓇¤#·øHh—¤Oý=ž¹Á§QüÍçtåÊ¡ê=¬:°‡ßkóLe¢m+ڎjo)ë%««FlV+ûZ¿õù‡÷Ð4Ì´­„Ñ“þ{­W‹«Ð:ÒÞÍc†íaè?¼ã[߇ºõÓk݆¬ïí§—Ï/¿šžg÷=ÑRU›FõZSm3âj×âÐ4GÜú¸ƒH“âgZpd}ºêñ8 -Ž§@+Ò |““wÒûd*?ëæw»µes—‚¯tޟýxúÞÁ|A © -ˆNÉk¸[Ó¯=4»™™°Ýæeä|3%⥂½9À„Ï:´6n­Ztº¨ÀÒ0ÖÏ?5Ín=ªÝí„ÎåY\4ë™zk[ t¹ªúbÙ{>`B\y‹*$Õ ¢^shç3Ò/ð¹ã*ô{Þ6“ûLaõ{¬—›qB”ˆúÞR0w0Ý%æmÔb4Õ/hr™c/2DÀÉQ¹•Jf\õt:fÙ÷ˆ ¦v€š.Ù_Ôà4¯ü°°²3ˆ‡Kê#šWb³C (¶ZCs¦ÙÎÁO`Οk,%¶æÔÛ9"ÓÊa?`~ÃðLÊe»×¦§?9 Èç hâ߂?ý&T‹ dO~þ|·ÂF£ÇZï¾IÙè_v"ã*ܜܶ¼]C.ŸwZô¿›Ìtu:ìQ¿ Ž®ï4¥œáÔrlw‚ïfìÁX›zhèg)+û̕ì6bôƒ<ƒ°ˆ#´jó¿4m>Œ@xìVÎléuÌ|gf_†¡ˆìÀ6ežY1@Ù}È¿³Sj“÷Ã+6Μ¯äƒU–fw¬¡Âñ3nb†8Dîðat2}ž¤ÄP$ Ð ‚Vù>+vȨyè³áD?rkƒ›3ø³ç¶—k+7ømÝlŽj"øÔ 0Ø6{§Äf„¡ŠøºÖ´}х[}ƒˆd<¼ -Tx8|áZ/­ú2r9†¸M ÁhîIW¸#ÆBà+Èqý¼žÎÏÞՔÔh]ÉÙÔ]슸Œë¡†â¥ÎØÃÌ~ Мƒ[L*VÄóOvŠç'm‡sRÊÁ§ž“bÚÉÀ…lϼ ,Ùdì¦?Í<µ¾«*iEŠ)ø³m§~¾ê9èO'3œ 8ôJQj8«™ߞ×@íCc¯è•oÔlVÚçîdÀÏƟԯ¨$×M3#™>¤ä”ØÈX -æO[¼mcF4¥Xæámp@‘ -\H®Öu]LÓFß©ß;0û¢z†Úiƒs%FéïRøÄxw€;ßې&. £Æmtì%ƒŽÄPï2n’~Èø°^ Ü-Fê»ñÁD}·z5ƒ¥šxÝbƍI“ NÝÂ6·Lcp4™ ð1Ãçîúr ¤Ò[ lmFí#M”–æðºñ‡ú -Ÿu¸×…صi«wö ©ÿ“­úq¢­~ƒc͓å÷ú†–F´‹"V“õœz:H*5}5JPÃ7”&à蠈w›9Ý×G4h$E†¹¾íõ¯¡€Èä?’—ý•{gŠëâÄé0­”ŘAOށAŽÜµøâ1”(ÜÄՓÅèbL)ϑPiΚ…AJEÁ9↉àùz²6ꁉuteç­»ìö”˜ˆ_‘{Xۀ²†ØÁa(!‚ÁRSh" CÇB«- ÃÄëeo`‰!1)A…ø›&š#—®M˜{r¶ÜWä=Pä­?õ$³ú>oØ÷îç4\ßÍià°Ý ƒä4½+§áĸ—ÓpbÜßû"\‚D'ãŠ[±}{5 h9¢ÝèˆbwJc ³ñálîZ#»"¢{Ÿ„Š¼£‹?ŽG¤1 [R0 D´['Ân2Aƒ ¥CLˆ)„²CZ­OQ0\§†é΍ŠÒ&–=E‰!=Ñs‰':%ˆaÂÏ¥;E§I {JK&iÞT$:M®dǙÇþìŸCöO·6”*’!žùßÚr9 n›¸Np{ª­…`šä]µyjË©-£ك0B4#m¤ÝÈ\“FÙå.3²½qÇ 1Ò®¹Ïm<× —ÃiY,¢ÈAJ¹wV¯6ôsÒwæ0ØìèOh¡¨OsxÁIÎHçú¼ ?g¦þ ¬”eŽþ,!UüåO#t¦<5ÀüfݑŽÜ$ßFŽ§Å±ÑC-šp#:õ6aXð 'IÒ"àZދwa´„!tǚû$E›léFÜØÏÆYGê·ø³„z ˜g¨9øºD»²²éÒԆޠçƒ\çdðÆxN¿Ì¤ÿs²wBR}YÞкôQ,SýBç zkêK¹à7XY{tNsô'wÚí9©•ëfÆÍiAO]F_hFc­ÛH4£6àp­koKÐ8hâaGSkƒžFªpt¦\¥ÒQÉo¤]¤<*X¬¤é´kNs#|ôEž„¿?3 -à2vkjځÙcýn#€Æ­DF¤cÐx™­èÙ·0–q¥sïÐÛÔ²‘TJwóNÒ]•žV¼Ô§uÃE}ºôh·º2ÆñNƒse\ ¸¾-Òàvãd׆ìW×p]r?^ªð‘±Í8Ô»¸;vžý1<Œs`ͨ¥NÁ}†gF5¹¶-L‰ÏéO)]Ì«klÀ„IuO1R:,óŠö%Ýo—üÛ7};é“Ó¹RèÂ=/õ)=^Ò컩÷š›8•T½O¤×¯ÓDµþ­ÏL¬ñò(¡Z`Ö;xÞûHDÊ/bè•ö+ÞäT„D»Ï¯x“S‘Ÿj¥Ü¯x“S훻üŠ79Qüæ.¿"@sú?QÕ?þ Ûû‚þ±W/ëù±r\.–ۋ꟰ê{"ït6¶³qœÏëóÿ9§wÓËf¾=¿„^ì‰Z*ŸxÓóén6±PÁ?#­ÔL($çx&#&Ó?Áì*§©¾Ó?ŽNó[’:̾~€pèׁçê›Ú2œõÔQSr' ü³CúkÈh¹`€Å]Lšôü˜¼dÌåR‹·‘Ÿ&8ªgaü-ÓJΫqûi±ç]›lÖâö³c‡\:TX”“€¹Ú"î@A8ëÔÆȇ‡ñÐäLµ6°«-Æx~]P›¿^?à ?àƒtëÏH?éÌx,D™Ò@®Mmÿ/+ (Ÿè rJ¬º!"ʆCñƒœÅTmx‘ ðvŒ%ƒ †© -êlʂG¬8ölÞå4PÛßf¤}€­öwA[ ý©4"ʆCÉÄ¿)"ʆ/aþ_‹ˆ²ðhOÈ¿eá0”ô¯EDÙp(}~D” ‡ÂÙükQ6Šï›§GDÙp(<Èÿµˆ(…¢ˆ¶ÚjãG×@ ÑKè -X`~cuµq¹Žª­Û¯o(Xƒð˜Ð2puh$Ô¢½wH±6O9ÒȾ_¤BSÛSoV:™Äc`“I=D¯û9@Ñi¦D'Ôa0ÑÙÙÙÈ$}\ÝGKDgÊfAV¬«‰äíËöÙFjKKȌr€LË„êá]ôQä±|ÐhüGVÎR2­Omž”E9.@À’jLÿ4Y%ׯ[ÂiøçŒ ç`Ԍσ RF)m¤1@êÏÎlÃϬEj)*ºð@¢}š<ÐtâvJ#†)I1ùm¸Ðb€ÌXU›0ËfÃÙÎȤÝͯ a4n^ßY2ë-3ð2±Ã/¾Ã…4ó­xr(^Å0φãó:†iÊÚ<¹Ä†•î˜Vœp«µŒ…[ ÁŽ›nõiÔoImZ"^›´cœD;ëD‰‡*²d;I ÀñHW·/£ Ò »E»Óß5ôw£}YٚYë1'E‹ŠQî#™ðÙU ‰32†øî ¤:mlì  á…ÏX‡–R÷ ϵ'HE®=űT瞡Ã'rKQDèâDÃáÝA° -ìÄRÅ©ŒŸU2Ž åP³2t °R …hYáýüh@9ú<+¤rÊüÀ:Yîü@dž¬Ï (dÊ+¨Í²AP™¬×0Pk®G&‚Êè­Eíæ‰4Bö›BÛÛÓ<›amèP4óÐDSJ è{´ÊMdù`¸{kg€S£ƒ¬xÁ‰(¤&LÔt"§×l.ifz˜4¦ÞÑ}À^Í&FêUâÏihwB±ûx¨”Ó€ÚbxŒÓJ @œÓ$a ⎇9MÿkxŒÓ[£§)†Q2[d¹€fÁ㴁ßöȊ@wº]ä4¥0²¥Wù}+ €Nÿ…š bA(<ˆM˜špd†„ìŠÕSvïK ‚ò¹=¶"Pᕦ&yÞHM$g%nÛ#Wƒð•œHU`äbU—Ì ŽQ»?¤sž³­Á`Lo “…ÙÌҒãÄÞ)ÎZ¼AÐR€?Ž©Öo}ˆ-¦ÖwKM\tÊM8 _Jp³‹B@tNcùþg®Çÿüj$-ê%®ÉönCƒ XÕSO:f¶Ó—q¶”êÈâÒáÓ~*è€ä°Ä‹<Tx¨¨;)òPPágÃ)ò`|®E#þ xf‡E3þ dfª.ŠxÕÇضóÐìS æ™/ÕH —ö¼aË^?ðÀ+€LpàÀæ‚2 ˆ$2ô ÜNÊ8UáŸ_8p°ã q¿(s0~ˆ²\,婼 ¹ïËN…CcyÊýEÁl„àº1Gfnx$cÎ.£Õy´nÅëbñ°‚P“ÀDGÓ®ZM1Η1GDnŽÎqº1]ƒü*½³ ïùS;Ïö»E¢vÑ.3ÝÙ'¬ª©;Y6võ/ƒ8åêè ܌¯ÓÃõu¦c~†eZV*ú•‚"©e§7@ Ÿô¡ÛrҎ«ŠGÀ¸EËÍ|ò2áüÙ%Í(¢Õï2e?]óɉG?]&¸ØuãÒ+-íÅüóÒ³éú±|؏9³ÿðcÎ},¨æÖ+®}ðO§e b£NôüäÂ_-/<ð;@ü‹5;©´9`$ˆL¹IÇ:ϯc> ù —Ú÷G—rÞû•zït%"™vƒ7ñNW¢êŸÛ¼‰wºQê ÞÄ;]‰Èý Ð›¸ƒ¡Ð0ôŽæÎaf;Ýàë7ðUm~¾ìÑ+Þar¾XnKãÿÎÁqã|!ÿãÿÿïò€*ü¯ãÅ ¿,MTÿòÓÝÖøR‚µ6C{âxN/§çån;>þ÷%„¾k—K|ú%ôB½~1€Á8†à]ð½X‡Î{r·[ÃG5¢õ’ùŸýîx~Ay©ï^Rµš‚›ËÓr²žs'?TýãxIÀÚÿóJìáç -üÇa 8ÍüÏævy=p††ònqŸ–›—Êq¼]Ì_¾ €–€Ûâø6ÑËíÿªƒiC$Áÿ ÿ*€Oà»ÿ¼8/å—^ßñ2S‡™Ûë³y_¬ž€ü°Û<^/ûw‰ùÛå±üN'ü†ú…Ó°ùœŽö󣉂åK.Ããrñ{NwëËFl))‚*žtñ¸½n ˆ/àõù<ä,m—ßãÅèd ºœ^_#Wr}ÄòCR¹Ü^œæn·ÌÆç´yÉ! \~˜°ÛióùA8ô˜š*|ÿÌü|ñ£`ÞµÍx½¾}æ³–Óí&fèeç?ÂÅõÑ \èo¯ÇæuûœÌn? ¸--ãrm.öO -”’Ù—æ?çáçøü«dÒ¥$%G€XA{Ò -ß·Ïñb^?Ž—k(V§ñÿš¿Œ·ÛÝy|žïÁ£—Åq~:ïŽó—Óïî?ðø#æ@HU€Õøÿƒõè -endstream endobj 6 0 obj [5 0 R] endobj 23 0 obj <> endobj xref -0 24 -0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000046800 00000 n -0000000000 00000 f -0000048544 00000 n -0000176906 00000 n -0000046851 00000 n -0000047214 00000 n -0000049206 00000 n -0000048840 00000 n -0000049019 00000 n -0000048727 00000 n -0000047479 00000 n -0000047982 00000 n -0000048030 00000 n -0000048611 00000 n -0000048642 00000 n -0000049279 00000 n -0000049475 00000 n -0000050711 00000 n -0000071518 00000 n -0000137107 00000 n -0000176929 00000 n -trailer -<]>> -startxref -177122 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg b/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg deleted file mode 100644 index 88b7d364..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_orange.ai b/net.mograsim.plugin.branding/raw_files/icon_orange.ai deleted file mode 100644 index 948fe6a9..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_orange.ai +++ /dev/null @@ -1,1448 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R 6 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_orange - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T16:34:14+02:00 - 2019-06-22T16:35:26+02:00 - 2019-06-22T16:35:26+02:00 - - - - 220 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7N+WH5gfpWFdG1ST/clC v+jzMd50HY/5aj7xv45oOx+1PFHhzPrHI9/7XqfaDsXwT42MfuzzH80/qP2PQ837yzsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLLSrCa/vZBFbQLydu58AB3 J6AZVmzRxQM5GgG/T6eeaYhAXIvFv+Vsa5/in9K1P6O/uv0bX4PRr/yc78vHb7O2cd/LeXx/E/g/ m+X6/P8AQ+gf6G8P5bwv8pz4ut/q8v07sIgmmgmjnhcxzRMHjkU0ZWU1BBHcHNNGRibHMPQzgJAg iwXvf5eeeofMdj9XuWCavbKPXTYeovT1UH/Eh2P0Z3PZXaQ1Eal/eDn5+b5p232OdLPij/dS5eXk f0MvzbOidirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i4gtoJLieRY oYlLySMaKqjcknIzkIgk7AMoQlOQjEWS8C/MDzzceZL/ANKEtHpNu3+jQ9ObdPVcfzHt4D6c4XtT tI6idD+7HL9b6b2L2RHSQs75Zcz3eQ/G/wAmJ5qnduxVE6bqV7pl9DfWUpiuYG5RuPxB8QRsRluH NLHISiaIadRghmgYTFxL6F8meb7LzLpYuIqR3kVFvLau6PTqO/Bv2Tne9n66OohY+ocx+Oj5d2r2 ZPSZOE7xP0nv/b3p/me6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVxIAJJ oBuScVeJfmb+YDaxO2kabJTSoW/fSKf791PiOqL28Tv4ZxnbHaninw4H0D7f2PofYHYvgR8XIP3h 5f0R+v8As73n+aF6d2KuxV2Kpn5d8w6hoOqRahZNR02kiJPCRD1RqdjmTpNVPBMTj/a4eu0UNTjO Of8AYe99EeXfMGn69pcWoWLVR9pIzTlG46ow8Rnf6XVQzwE4/wBj5ZrtFk02Q458/vHeEyzJcR2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvKPzU/MAky+X9KloN01G4Q9fGFSP+H+ 7xzlu2u1OeLGf6x/R+v5PbezvYvLPlH9Uf779Xz7nlOcu9o7FXYq7FXYq7FWQeTPN955a1QXEdZL OWi3ltXZ08R25L2P0Zn9n6+WnnY+k8x+Orq+1ezIavHwnaQ+k937H0Jpuo2WpWMN9ZSia2nXlG4+ 4g+BB2IzvsOWOSIlE2C+X58E8UzCYqQROWNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVeffmf5/wD0TA2j6ZLTU5l/fyr1gRh28HYHbwG/hmg7Y7T8IeHA+s8/L9r1Hs/2L458XIP3Y5D+ cf1D7fm8TJJNTuT1Occ+hOwK7FXYq7FXYq7FXYqzD8vPPUvly++r3TF9IuWHrp19Jjt6qj/iQHUZ t+yu0jp5VL+7PPy83Rdt9jjVQ4o/3seXn5fqe9QzRTwpNC4kilUPHIpqrKwqCD753MZCQsci+aTg YkgiiF+Fi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWI/mF54h8uaf6NuwfV7lT9Xj6+mvT1 WHgD0B6n6c1XanaQ08KH94eXl5u87E7IOqncv7qPPz8ngc88080k8ztJNKxeSRjVmZjUkk9znCyk ZGzzL6ZCAiAAKAWZFk7FXYq7FXYq7FXYq7FXYq9E/LD8wP0XMujanJ/uNlb/AEaZjtC7Hof8hj9x +nOg7H7U8I+HM+g8vL9jy3tB2L4w8bGP3g5j+cP1j7XtOdi+fOxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KpD5x822XlrSjdTUkupKraW1d3f8A5pX9o5g6/XR08OI/UeQ73Zdl9mz1eXhG0R9R7h+v ufPWp6le6nfzX17KZrqduUjn7gAOwA2Azgc2aWSRlI3IvqWn08MMBCAqIQuVNzsVdirsVdirsVdi rsVdirsVdir1r8rPzB9QReX9Vk+MUTT7hj1A6QsfH+U/R4Z1XYval1iyH+qf0fq+TxHtF2LV58Q2 /iH++/X83qedO8Y7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql3mDXbDQ9Lm1G9akUeyoPtO5+yi+5zH 1WpjhgZy5BytFo56jIMcOZ+wd7538x+YdQ1/VZNQvW+JvhiiH2Y4wfhRfYVzgNXqp55mcv7H1TQ6 GGmxDHD4+Z70rzFcx2KuxV2KuxV2KuxV2KuxV2KuxV2KtglSCDQjcEdQcKkPb/yz8/jWrddK1KSm rQL+7kb/AHei9/8AXH7Xj18c7PsjtTxh4cz6x9v7Xzvt/sX8vLxcY/dH/Yn9Xd8u5nub15l2KuxV 2KuxV2KuxV2KuxV2KuxV2KsE/Of/AJRBP+YuL/iL5o/aD/F/84fpel9lf8aP9Q/eHhucU+iuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxVVtrm4tbiO5t5GiniYPFIhoysNwQcnCZiQQaIYZMcZxMZCwXv vkDzxb+ZdP4TFY9VtwPrUI2DDoJEH8p7+B+jO67M7RGohR+sc/1h8y7a7IlpJ2N8cuR/QfxuyvNo 6V2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKsx2AA7nEmkgWlfl/zFY67Fdz2NWt7W5a1WXtIURGLr/k 1eg+/MXS6uOcSMeUZV7+Tma3Qz0xjGf1SjxV3WTt9jGfzn/5RBP+YuL/AIi+a32g/wAX/wA4fpdx 7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmkatfaTqEN/YyGO4haqnsR3 Vh3U9CMuwZ5YpicTRDRqdNDPjMJi4l9C+UPNdj5k0pbuCiTpRbu3r8Ub0/4if2TnfaHWx1EOIc+o 7ny3tPs6eky8Evp6HvH6+9PMzXXOxV2KuxV2KuxV2KuxV5J+af5g+q0ugaTL+6Wq6hcoftHvEpHb +b7vHOU7a7Uu8WM7fxH9H63uPZ3sXhrPlG/8I/T+r5p1+SX/ACit3/zHSf8AJmLM32d/uD/XP3Rd f7Wf4zH/AIWP91JW/Of/AJRBP+YuL/iL5L2g/wAX/wA4fpYeyv8AjR/qH7w8Nzin0V2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2Kpt5Y8y6h5e1WO/szUD4Z4CfhkjPVW/gexzL0erngmJx+I73B7 Q0ENViMJ/A9xfQ+g65Ya3pkWo2L8oZR8Sn7SOPtI47MM7/TamGaAnHkXy3WaSenyHHMbj7fMJhl7 iuxV2KuxV2KuxV51+aH5gfo2J9F0uX/cjKKXU6neFGH2VI6Ow+4e+c/2z2p4Y8OB9Z5nu/a9X7Pd i+KRmyj0DkP5x/V97xfOOe/e2fkl/wAord/8x0n/ACZizs/Z3+4P9c/dF899rP8AGY/8LH+6krfn P/yiCf8AMXF/xF8l7Qf4v/nD9LD2V/xo/wBQ/eHhucU+iuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2Ksk8j+crvyzqYkFZNPnIW8tx3HZ1/wApfx6Zsezu0Jaed84HmPx1dT2v2VHV465TH0n9 HuL6Csb60v7OK8tJBNbTqHikXoQc73HkjOIlE2C+X5sMsczCYqQV8m1uxV2KuxVh35iee4vLtl9V tGD6vcr+5XqIkO3qsP8AiI75qO1e0hp48Mf7w/Z5u+7D7HOqnxS/uo8/Py/W8FlllmleWVzJLISz uxJZmJqSSepOcPKRJs830qMREUNgFuRZPbPyS/5RW7/5jpP+TMWdn7O/3B/rn7ovnvtZ/jMf+Fj/ AHUlb85/+UQT/mLi/wCIvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYqzX8uPPknl+8+pXrFtHuG+PqfRc7eovt/MPp+e57J7TOCXDL+7P2ef63n+3e xhqYccP72P2ju/U92jkSSNZI2DxuAyOpqCCKgg524IIsPm0okGjzXYUOxVj3nXzhZ+WtLM70kvZq rZ21ftMOrHwVa7/dmB2hr46eFneR5B2nZXZc9Xk4RtAfUfx1L571HULzUb2a9vJDNczsXkkPcn9Q HYZwOXLLJIykbJfUcGCGKAhAVEIfK212KvbPyS/5RW7/AOY6T/kzFnZ+zv8AcH+ufui+e+1n+Mx/ 4WP91JW/Of8A5RBP+YuL/iL5L2g/xf8Azh+lh7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdi rsVdirLrbyNPqPkmPXtPDSXUEkq3VuNy8anZkH8y9x3Hv120OzTk03iw+oE2PJ0eTtcYtYcGTaJA o9x8/exHNS7x2KuxV2KuxV2KvSfyu/MD6jJHoWqyf6FIeNlOx2idj9hj/IxPXt8unR9jdqcBGKZ9 PQ93l7nkvaHsXxAc2IesfUO/z9/3vZM654J2KvnT8wb67u/N+pm4kMnoTPBCD0WONiFUDPPu1Mkp aidnka+D6r2JhjDSw4RVxBPvLHc17tXYq7FXtn5Jf8ord/8AMdJ/yZizs/Z3+4P9c/dF899rP8Zj /wALH+6krfnP/wAogn/MXF/xF8l7Qf4v/nD9LD2V/wAaP9Q/eHhucU+iuxV2KuxV2KuxV2KuxV2K uxV2KuxV7v8Ak/8A8oZH/wAZ5f1jO47B/wAWHvL5t7T/AONn+qGJfmj+X31KSTXdKi/0NzyvbdR/ dMT/AHigfsHuOx9umq7Z7L4CcuMenqO7z9zu/Z7trxAMOU+sfSe/y9/3+/nzXOceudirsVdirsVd ir2H8q/PzXix6BqblrpFpYztv6iKK+mx/mUDY9x79et7F7T46xT+r+E9/k8J7RdjeHefGPT/ABDu 8/j+PLpmdI8g+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f/ ADHSf8mYs7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf8RfJe0H+L/5w/Sw9lf8AGj/U P3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8AGeX9YzuOwf8AFh7y+be0/wDj Z/qhmskaSI0cih0cFXRhUEHYgg5uCARRefBINjm8J/MfyE/l+7+vWSltHuGoncwud/TY+H8p+j58 R2t2YcEuKP8Adn7PL9T6R2F2yNTHgn/ex/2Q7/1sJzTPQuxV2KuxV2Ksm/LX/lONK/4yP/yafNl2 R/jMPf8AoLqO3v8AE8nuH3h9D5375Y+bfO3/ACl+sf8AMXL/AMSOed9o/wCMT/rF9a7J/wAVx/1B 9ySZhOwdirsVe2fkl/yit3/zHSf8mYs7P2d/uD/XP3RfPfaz/GY/8LH+6krfnP8A8ogn/MXF/wAR fJe0H+L/AOcP0sPZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/k//wAoZH/xnl/W M7jsH/Fh7y+be0/+Nn+qGbZuXnlC+sbW+tJbO7jE1tOpSWNuhByGTHGcTGQsFsw5pY5icTUhyfPv njybd+WtTMe8mnzktZ3B7jujf5S/j1zgu0ez5aedc4HkX1DsjtWOrx3ymPqH6fcWN5rnbOxV2Kux Vk35a/8AKcaV/wAZH/5NPmy7I/xmHv8A0F1Hb3+J5PcPvD6Hzv3yx82+dv8AlL9Y/wCYuX/iRzzv tH/GJ/1i+tdk/wCK4/6g+5JMwnYOxV2KvbPyS/5RW7/5jpP+TMWdn7O/3B/rn7ovnvtZ/jMf+Fj/ AHUlb85/+UQT/mLi/wCIvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FX Yq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3LzzsVQGu6HYa3pk2nXycoZRsw+0jj7Lq ezLlGp00M0DCXIuVo9XPT5Bkgdx9vkXzv5n8tah5e1WSwuxUfagnAoskddmH8R2OcBrNJPBMxl8D 3h9S7P18NViE4fEdxSnMRznYq7FWTflr/wApxpX/ABkf/k0+bLsj/GYe/wDQXUdvf4nk9w+8PofO /fLHzb52/wCUv1j/AJi5f+JHPO+0f8Yn/WL612T/AIrj/qD7kkzCdg7FXYq9s/JL/lFbv/mOk/5M xZ2fs7/cH+ufui+e+1n+Mx/4WP8AdSVvzn/5RBP+YuL/AIi+S9oP8X/zh+lh7K/40f6h+8PDc4p9 FdirsVdirsVdirsVdirsVdirsVdir3f8n/8AlDI/+M8v6xncdg/4sPeXzb2n/wAbP9UM2zcvPOxV 2KpJ5u8qWPmTSmtLiiTpVrS5Aq0b/wDNJ/aGYWu0UdRDhPPoe52PZnaM9Jl448uo7x+OT551fSb7 SdQmsL6Mx3ELUYdiOzKe6nqDnA58EsUzCQoh9S02phnxicDcSg8pb3Yqyb8tf+U40r/jI/8AyafN l2R/jMPf+guo7e/xPJ7h94fQ+d++WPm3zt/yl+sf8xcv/EjnnfaP+MT/AKxfWuyf8Vx/1B9ySZhO wdirsVe2fkl/yit3/wAx0n/JmLOz9nf7g/1z90Xz32s/xmP/AAsf7qSt+c//ACiCf8xcX/EXyXtB /i/+cP0sPZX/ABo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/wCT/wDyhkf/ABnl/WM7 jsH/ABYe8vm3tP8A42f6oZtm5eedirsVdirFPP8A5Ht/Mmn84Qseq24JtZjsGHX03P8AKe3gfpzV 9p9nDUQ2+scv1O67F7XlpMlHfHLmP0j8bvArm2uLW4ktriNop4mKSxuKMrDYgjOFnAxJBFEPpuPJ GcRKJsFSyDNk35a/8pxpX/GR/wDk0+bLsj/GYe/9BdR29/ieT3D7w+h8798sfNvnb/lL9Y/5i5f+ JHPO+0f8Yn/WL612T/iuP+oPuSTMJ2DsVdir2z8kv+UVu/8AmOk/5MxZ2fs7/cH+ufui+e+1n+Mx /wCFj/dSVvzn/wCUQT/mLi/4i+S9oP8AF/8AOH6WHsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdi rsVdirsVdir3f8n/APlDI/8AjPL+sZ3HYP8Aiw95fNvaf/Gz/VDNs3LzzsVdirsVdirAvzM8gDWr dtV02OmrQL+8jX/d6L2/1x+z49PDNF2v2X4w8SA9Y+39r03YHbX5eXhZD+6P+xP6u/597w8ggkEU I2IOcY+iMm/LX/lONK/4yP8A8mnzY9kf4zD3/oLqO3v8Tye4feH0Pnfvlj5t87f8pfrH/MXL/wAS Oed9o/4xP+sX1rsn/Fcf9QfckmYTsHYq7FXtn5Jf8ord/wDMdJ/yZizs/Z3+4P8AXP3RfPfaz/GY /wDCx/upK35z/wDKIJ/zFxf8RfJe0H+L/wCcP0sPZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdi rsVdirsVe7/k/wD8oZH/AMZ5f1jO47B/xYe8vm3tP/jZ/qhm2bl552KuxV2KuxV2KvLPzT/L/mJf MGlR/GKvqFuo6jvMo8f5h9PjnMdtdl3eXGP6w/T+t7P2d7aqsGU/1T/vf1fJhf5a/wDKcaV/xkf/ AJNPmn7I/wAZh7/0F6Dt7/E8nuH3h9D5375Y+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/U H3JJmE7B2KuxV7Z+SX/KK3f/ADHSf8mYs7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf 8RfJe0H+L/5w/Sw9lf8AGj/UP3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8A GeX9YzuOwf8AFh7y+be0/wDjZ/qhm2bl552KuxV2KuxV2KuxV53L5A/RXn3TdZ0yP/cbLK/1iFf9 0u0bbj/IY/cdvDOfl2X4WqhkgPQTv5bfc9VHtrxtFPDkP7wAUf5wsfaPteiZ0Dyr5t87f8pfrH/M XL/xI5532j/jE/6xfWuyf8Vx/wBQfckmYTsHYq7FXtn5Jf8AKK3f/MdJ/wAmYs7P2d/uD/XP3RfP faz/ABmP/Cx/upK35z/8ogn/ADFxf8RfJe0H+L/5w/Sw9lf8aP8AUP3h4bnFPorsVdirsVdirsVd irsVdirsVdirsVe7/k//AMoZH/xnl/WM7jsH/Fh7y+be0/8AjZ/qhm2bl552KuxV2KuxV2KuxV2K uxV82+dv+Uv1j/mLl/4kc877R/xif9YvrXZP+K4/6g+5JMwnYOxV2KvbPyS/5RW7/wCY6T/kzFnZ +zv9wf65+6L577Wf4zH/AIWP91JW/Of/AJRBP+YuL/iL5L2g/wAX/wA4fpYeyv8AjR/qH7w8Nzin 0V2KuxV2KuxV2KuxV2KuxV2KuxV2Kvd/yf8A+UMj/wCM8v6xncdg/wCLD3l829p/8bP9UM2zcvPO xV2KuxV2KuxV2KuxV2Kvm3zt/wApfrH/ADFy/wDEjnnfaP8AjE/6xfWuyf8AFcf9QfckmYTsHYq7 FXtn5Jf8ord/8x0n/JmLOz9nf7g/1z90Xz32s/xmP/Cx/upK35z/APKIJ/zFxf8AEXyXtB/i/wDn D9LD2V/xo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/5P/8AKGR/8Z5f1jO47B/xYe8v m3tP/jZ/qhm2bl552KuxV2KuxV2KuxV2KuxV82+dv+Uv1j/mLl/4kc877R/xif8AWL612T/iuP8A qD7kkzCdg7FXYq9s/JL/AJRW7/5jpP8AkzFnZ+zv9wf65+6L577Wf4zH/hY/3Ulb85/+UQT/AJi4 v+IvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/ACf/AOUMj/4z y/rGdx2D/iw95fNvaf8Axs/1QzbNy887FXYq7FXYq7FXYq7FXYq+bfO3/KX6x/zFy/8AEjnnfaP+ MT/rF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f8AzHSf8mYs7P2d/uD/AFz90Xz32s/xmP8Awsf7 qSt+c/8AyiCf8xcX/EXyXtB/i/8AnD9LD2V/xo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7 FXu/5P8A/KGR/wDGeX9YzuOwf8WHvL5t7T/42f6oZtm5eedirsVdirsVdirsVdirsVfNvnb/AJS/ WP8AmLl/4kc877R/xif9YvrXZP8AiuP+oPuSTMJ2DsVdir2z8kv+UVu/+Y6T/kzFnZ+zv9wf65+6 L577Wf4zH/hY/wB1JW/Of/lEE/5i4v8AiL5L2g/xf/OH6WHsr/jR/qH7w8Nzin0V2KuxV2KuxV2K uxV2KuxV2KuxV2Kvd/yf/wCUMj/4zy/rGdx2D/iw95fNvaf/ABs/1QzbNy887FXYq7FXYq7FXYq7 FXYq+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f/ADHSf8mY s7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf8RfJe0H+L/5w/Sw9lf8AGj/UP3h4bnFP orsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8AGeX9YzuOwf8AFh7y+be0/wDjZ/qhm2bl 552KuxV2KuxV2KuxV2KuxV82+dv+Uv1j/mLl/wCJHPO+0f8AGJ/1i+tdk/4rj/qD7kkzCdg7FXYq 9s/JL/lFbv8A5jpP+TMWdn7O/wBwf65+6L577Wf4zH/hY/3Ulb85/wDlEE/5i4v+IvkvaD/F/wDO H6WHsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxVF/ojVf8Alin/AORT/wBMt8DJ/NPyaPzOL+dH5h36 I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/ AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h7h+UsE8Hk+ OOaNon9eU8HBU0JHY52nYcSNOARW5fO/aWYlqyQbHCGZZuHQOxV2KuxV2KuxV2KuxV2Kvnbznpmp SebNXeO0mdGupSrLGxBBY7ggZ5/2hhmc8yAfqPR9U7K1GMaXGDKP0DqEm/RGq/8ALFP/AMin/pmH 4GT+afk5/wCZxfzo/MO/RGq/8sU//Ip/6Y+Bk/mn5L+Zxfzo/MO/RGq/8sU//Ip/6Y+Bk/mn5L+Z xfzo/MPZfyZt7i38r3STxPE5vpCFdSpp6UQrQ52Hs/AxwGxXrP3B4H2qnGWpiYm/QP8AdSXfnKrN 5RQKCT9bi2H+q+Ht8f4P/nD9KPZY/wCFH+ofvDxD0pf5G+45xfCX0TiHe70pf5G+448JXiHe70pf 5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe//9k= - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:76FE812EFA94E911B987F622BD994B0C - uuid:7e67434c-0358-43b8-a083-32c919d418ed - - uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:76FE812EFA94E911B987F622BD994B0C - 2019-06-22T16:34:12+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - Mograsim Orange (255,83,0) - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - Mograsim - 1 - - - - Mograsim Blue (7,83,235) - SPOT - 100.000000 - RGB - 7 - 82 - 235 - - - Mograsim Orange (255,83,0) - SPOT - 100.000000 - RGB - 255 - 82 - 0 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 40 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 36 0 obj <>stream -H‰¤M …÷œb.P`føëV4®ª1¡‰vaMLïŸ8Pc»7$<Þ0|ó‚¹f0C¶p8fP& ã°Œ/eÎb‹zKÁÊB`´r²³ªµYõ½È³Š ¤õb,°K:¥zžÔ]ÝVt.]òåO¤mד*ޑ8 -Íj‡6VºhµM,ošcòÒD ´3kЍ‡Ì@»T]Œmn՚ ŠC’.&í‚û:¯™}ӏ:úü4È/ã’IÅ -endstream endobj 40 0 obj <>stream -8;Z,f;%eL($q0Q6V0qA?>c.p\KFl@jR6%I"`b"&5enRg,EA4tSL@q4UW+U\jLhRhO -$!?/HJNpuMSaa;s1Mu:O%#RsUT3XVG\S.mgLV[5@nXj_deJ\:_"I?4%4s]&jBDJ\C -fW'sM)t]R&hqS7cr8-,.@%e0[.tO0S1H8uq^,@s-$biG&"I\K@?RI6iLu7[j3lh"P -?:F],:I6?OrHF3DL@U8dhD*7##3=`=kp=/?FS.:9%.i#!!QpbTR?K:N'u'dRs(a\> -^3Cadn.WrG]ghke-bK -endstream endobj 41 0 obj [/Indexed/DeviceRGB 255 42 0 R] endobj 42 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 34 0 obj <> endobj 43 0 obj [/View/Design] endobj 44 0 obj <>>> endobj 39 0 obj <> endobj 38 0 obj [/Separation/Mograsim#20Orange#20#28255,83,0#29/DeviceRGB<>] endobj 37 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_orange.ai) -%%CreationDate: 6/22/2019 4:35 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -488 456 -23 -%%HiResBoundingBox: 56 -488 456 -23.5352 -%%DocumentProcessColors: -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%DocumentCustomColors: (Mograsim Orange \(255,83,0\)) -%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) -%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 47 0 obj <>stream -%%BoundingBox: 56 -488 456 -23 -%%HiResBoundingBox: 56 -488 456 -23.5352 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 20610 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45CFFD6EFFC9B4CFFD6CFFCABABABAFD6BFFCABBB4B4B4BAFD69FFCA -%BBB4BABAB4BABBFD68FFC1B4BABAB4BAB4BAC1FD66FFC2B4BAB4FD04BAB4 -%BAC2FD64FFC2B4BABABAB4B4BAB4BAB4B4C3FD62FFC9B4BAB4BAB4FD04BA -%B4BAB4BAC9FD60FFCAB4BAB4BABABAB4B4BAB4BAB4BAB4BAC9FD5EFFCAB4 -%BAB4BAB4BAB4BABAB4BABABAB4BAB4BBCAFD5CFFCFBABAB4BABABAB4BABA -%B4BAB4BAB4BAB4BAB4BBCAFD5BFFB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 -%BABABAB4C1FD5AFFBBBABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4 -%C2FD58FFBBB4B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4C2FD56 -%FFBBBABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4C3FD54 -%FFC2B4B4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BAB4C9FD -%52FFC3BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4CAFD50FFC3BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABACFFD4EFFCABAB4BABABAB4BABABAB4BABABAB4BABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CFFD4CFFCABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4FD04BAFD4BFFCABB -%B4BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4B4BBFD49FFCFBBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04 -%BAB4BABABAB4BABABAB4BABABAB4BABABABBFD48FFC2B4BAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%B4BBFD46FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD44FFC2B4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAC3FD42FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC9FD40FFCAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAC9FD3EFFCAB4B4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BAB4BBCAFD3DFFBABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BBCAFD3BFFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4 -%C1FD3AFFBBBAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD -%38FFBBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD -%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4C3FD37 -%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C9FD -%36FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%C9FD35FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4CAFD34FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABACFFD33FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BABACFFD32FFBBBAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABBFD2CFFC3FD05FFC1B4BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BBFD2AFF -%C2B4FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAC1FD28FFC9B4BBFD05FFC1B4BAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C2FD26FFC9B4BABAFD -%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BAB4BAC2FD24FFCFB4BAB4BBFD05FFBBB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C3FD22FFCF -%B4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BACAFD21FFFD04BAB4C1FD05FFC1B4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BACAFD1FFFBBB4B4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BBCFFD1D -%FFBBBABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCFFD1BFFBBB4B4BA -%B4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BAB4C2FD1AFFC2BAB4BABABAB4BAB4 -%BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD18FFC2BAB4BAB4BAB4BAB4BABA -%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BAB4C3FD16FFC9BAB4BABABAB4BABABAB4 -%BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C3FD14FFC9BAB4BAB4BAB4BAB4 -%BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4CAFD12FFCABBB4BAB4 -%BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CAFD10 -%FFCABBB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4FD10FFC1B4BAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4B4B4FD0EFFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BA -%BAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABBFD0CFFC2B4BABABAB4 -%BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4C2BBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BABBFD0AFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAC2FFBBBAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD09FFC9BAB4BAB4BABABAB4BA -%BABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%C2FFFFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%B4C2FD08FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAC2FFFFCFB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAC3FD07FFC9BABABAB4BABABAB4 -%BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FFFFFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAC3FD06FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBB -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD04FFC9B4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BAB4BACAFD05FFC9BAB4BABABA -%B4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4C2FD05FFC3B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD -%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD -%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD06FFC2B4BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4FD05FFC9BAB4BABA -%BAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4C2FD07FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05 -%FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD08FFC1B4BAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABACFFD04FFC9BAB4BAB4BA -%BABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4C2FD08FFCABBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBA -%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD09FFCABBB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABAFD05FFC9BABABAB4BABABAB4BA -%BABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%C2FD0AFFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD -%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BAC2FD0BFFC9BAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4FD05FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD -%05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD0CFFC2B4B4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%C2FD0DFFC2BABABAB4BABABAB4BABABAB4BABABAB4FD04BAFD05FFC9BAB4 -%BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4C2FD0EFFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAC2FD0FFFBBBABABAB4BABABAB4BABA -%BAB4BABABAB4BABACFFD04FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BB -%FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD10FFBAB4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD -%11FFBABAB4BABABAB4BABABAB4BABABAB4BABAFD05FFC9BABABAB4BABABA -%B4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4C2FD11FFCFB4B4B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFCAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABA -%B4BABABAB4BAC2FD12FFCFB4BAB4BABABAB4BABABAB4BABABAB4FD05FFC9 -%BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4C2FD13FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD -%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BAC2FD14FFC9B4BABABAB4BABABAB4FD04BAFD05 -%FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4C2FD15FFC2B4BAB4BAB4BAB4BAB4BAB4BACAFD -%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAC2FD16FFC2B4BABABAB4BABABAB4BABACFFD -%04FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4C2FD17FFC1B4BAB4BAB4BAB4BAB4BACAFD04 -%FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 -%BABABAB4BABABAB4BABABAC2FD18FFC1B4BAB4BABABAB4BABAFD05FFC9BA -%BABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4C2FD18FFCABBB4BAB4BAB4BAB4BACAFD04FFCAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4 -%BABABAB4BAC2FD19FFCABBB4BAB4BABABAB4FD05FFC9BAB4BABABAB4BABA -%BAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FD1AFFC9BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD1BFF -%C9BAB4FD04BAFD05FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FF -%C1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD1CFFC2B4B4BAB4BACA -%FD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4BABABAC2FD1DFFC2BAB4BABACFFD04FFC9BAB4BA -%B4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4C2FD1EFFBBB4B4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD -%1FFFBBBABAFD05FFC9BABABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1 -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD20FFBABACAFD04FFCAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BAC2FD21FFBACFFD04FFC9BAB4BABABAB4BABABAB4BABABA -%B4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD21FF -%CACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BA -%BABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD -%27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BA -%BABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FF -%C9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BABABAB4BABABAB4BABABA -%B4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD -%05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1 -%B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BA -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFC9B4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%C2FD27FFC9BABABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27 -%FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BA -%B4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA -%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BA -%B4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4C2FD27FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05 -%FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA -%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BA -%BABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBB -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4 -%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABA -%BAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA -%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA -%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABA -%B4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BA -%BABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD -%27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA -%B4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BA -%BABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA -%BABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FF -%C9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BA -%BABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BABABAB4BABABAB4BABABA -%B4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA -%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BAB4BAB4BAB4BAC2FD27FFC9BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BB -%FD05FFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%B4BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BAC9FD27FFCABBBBBB -%C1BBC1BBC1BBC1BBC1BBC1BBC1BBFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4 -%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA -%%EndData - -endstream endobj 48 0 obj <>stream -%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%$ûíIÉÎ -c:’Ì,rȗهÙ[ý>U(`æG±9ӕ +34ÌÃ¥ÐãSÅßü¿ú͗×_½þ·»/ÃÕ°{òÅßüÍáÍݳw¯ßüxGòî§/^|ûöݐ~ðëîÆùjÀS×?-Oíɼ{óöþõ«ówW¿½Åû?8üþÍýÛw÷Ï^ínï^ÊC?Üýà‡øíoïß½¸“ßß?ýêéë7Ï^}}wõìþ‡Þ¸Tv|öNž˜4M?š†qÙŇ´ûÕÏùȳWxööíýŸïÐb(lpÿúÛW_Ý¿úzÿúþx—æݗ±”]Ä?&þþïï}÷ö¡‡®RHž<¾~þíË»Wï~õæõó»·o¯_¼~óöÇò›ëŸ¦§·÷/î¤o/Ÿ½Ûâú§ãôtÿíý‹¯~ñíË»“nÏËHzxÊwÿáí³¯åKùoÒóӟ¾ÒoîÞ½“oyûãÝÐ7{Á~ýÒZÝýà篿~óìíýËÝ/9L»ýÁ”ÒߕðwÿþöëŸì»W¤²«aÊ1ò0¥¸ÈßË4¦yéêÚ¿ø5eÔ3…d5ýŸ»î¥ÇµÜ‘4Íòƒù•ÌΝŒÑ›¿{õßXÇâÍëo@Bw_¦qÚáÿƒýö·w/¿y!SΙ™Ò|•dNøWÿC}X&~Æ«’—e÷凫y¤Ò¯FY1»1-WK±7ڜÞýáþî?Þýâõ«;›Òë7ï~£k)ÆaÐÿÚ¯~ý틻7ÿðêþ|ôLÚ¢súó×_ݽ7Z·/žq*YÆö_{â·ÏÞ|}÷N–àëß¾ã^)ފ¬›Ÿ=ûÓ¦{´F~ùÍÝ«ß¾þG~ê—ã4‡]ƒLN’nMe·¤¸ IÒÎ8{»cû¯ÕŽªPQm"cê~%ëï—oõãúùéOÞÜÕežvEÿÃ~\•îÿKý¿}®tþÝ»»WõûeC~Þ-ïáêç¿D«7¯¾:¼~‰yxË-{'íË -zñúkûmû¿“*¾ýƺAÂS™¶_½¹…ŠŸ|ñ ý]yú«ßÊ/òæõ·ßüôÕï^?ùâʹþñî¹p'™Û¯v¿ü·ÿ!?ÿùųç¿ÿúîÏw÷ÏÿêîÝÝÛÝ^v®ÐýYaDßüð=KßÜíô·ò.”¿‡¿óþñîwÂCZJýû 9¾xq÷êËÿçÛ·ÏÞýùå믾}!¿½yõ‡»¯¿¹Û={õÕ½ùæ1MüêųWÏÞìø‹ÚB_ïÞݽyöïïîÿ°{ùL•‡~vÿyñ™Œï£ZåôŒ_â3ëÖz ûÕ£šzöî÷´î^}õÖk¿~õõ Ìâ·Â›¶#Ǝèó©þ7zùo¯_Ü¿}é•÷ÿ÷#¿T†õÕ/_é'¿ùöíïw¿}ýú…×üsáÕwo¾¹õöîÅ櫅‹è{U ùÃçÁæù_¢‰Ã³/îå<ûæ÷÷Ïϵòßì÷¿»¿;Û؅÷µºžsªÎµú›oîþ|ÿìÅÙO_û«kÌÖàîæ«{᝘ÀƒÏüæÏÞ=ÿýîg÷ÿöæٛû»÷ìVLöïî_}%ú›oïßÝy#è Ε¯ïÞÞ½ûó;aÐÂ^Áfä…Ûî…V}z*ÇMœ|ùåÍœ±ûWý#?yóì«{9ÊDFûÉë_ÉÃ_KÕíßrlæÝþ«'_ü˓/†îcý_ÜýÍÓ½H„ÿEÈÛ?ã¦L] V¢•Äÿ×2ãÿRã¼*ÙK–U¹îÊ^ÊÁʱ+7íÔx[ËêÓú?SWBWâª$-2ø;³”Ì¿KW–U¹÷^^öãQJýé(5ÇҎãm_úáãçÕ?¡+±+išQž|¡O¹+eZ¤è¯»²×òä‹ÿûüœ^šÕ°š×ØÍn›c)RcçØͶÎn?ËE -þÆì–Õæ[Y0c™J,©Ì%—¥\—}9–›r+ Gæt K\¤¢¥,˲_ËÍr+Ëg¼×ñ:]Ï×åz¹¾¾ÞK9\¯o¸¤&éBܧ}ޗý"¿Úïû›ý­,3Mz8ÄC:È'–Ãõa8Ž‡[Yv#'#Óq>ÊçËq9ãÍñöfé 7ñf¾É7åf¹‘Æn7²Jnnnn±4neÐnÓ­töV>ÿöZŠ4z+¯ÞnþpNN«ÓnºrìÊ¡+ûU¹îÊR‹Ô¸Hó­ä®Ì«’º»º"«Qjœ¼ôœ­qå¡ÿø›þÏqUZdÈð÷¾+×]YV¥t%weîŠ0ô›ä%®JèÊԕ±+C_t؟|aÐw ÿsèÊ^Kݪ«ù\Ïâzîꬭgj=;2#Rcìg¤›‰õø¯GÝF{3ÂU¯e3¦6’«1\Ûf´Öã#㵓k+ K±’­Ì,ÉJd VdÝq3ڙª§‚o…Ú9m¬þÙ³\[YXŠÙì²ùóa¶’¬D–`Eyr=„¯vszÃyÜsÞ -ç)q^0GÿÈѾæØfŽfä荭ŽÎž£Q¤w™}GÑˁ½:²×üî̯Œü*ùY672¤ag×Â֊°·Y˜\f7 Ÿ—/•%u#ƒ}fx-l±\gaIeóf”3øV¦þ(ƒ²_®…–% cMÂ`ƒœP£œØ·² Ž2X{aÃK‘o–< kŽ%“ål¿•¥r”¡Üçkaâ%gaçIØzæ>Š,p+‹è(ûֿȐå Hr 9ÆY¾Q–ôLöAk9<Š!sJr˜9TF‘/neáeJörà,rðä8Ëå(šä@d ÜÈò8È!u-‡•|£[sHr€9ÈF‘hne±eqÌâàÅQœäèÃQ óœ²ßN¶'ñl}’ÏÊӣ℅„ -"bÔµq¡UÖÄ:j í}(ӊ_Üv'rŠEÖX’õ5ÊÚ:·²¦îá)…?zRÜ°8­·u=±ì̉%‡’ õp6ú¹8ËÒ+gNÆà'#ÎÅk´Yßw#˜›«œA)ã†rÆh’FrYãz;Èxí×,?SÆá`ø<]S´¹ '+€"æèⓠ-Œ*B©`x x#Œ&ºk7«(ÞDoª,¬­ÖÕjb=(}ÿì ù÷÷“©¹<(tY!YVʞkf#hôÓì©ÌªgWmY5–Õ3-²-ý3ÌlÍÊÞÇÈ|:6[ù³lä½Ë×µ4©¬t©lú•–´ÒÁL/“ƒ1ý£2ÿJ%^k{õ´r]е ŕy „^5ü½lJٔ¦±ê¿fÓeûOJ8)әb¤ÆþωêˆÝÙË~þ÷ñlÖ"«ðàeïåúBY.–R5L©1oÊüÈÒ´×Ô©qõ³[8Ú¿OK¸P¸4¤Æé‘åÜ Ÿ)Rããž|ôŸ³¶‚OúóùjìŽ×ÑV¥ß*Å­¨ÜVm!Õ6RL÷®¶Û÷²«UO¯»½ÚcÚVØîí*ûÖ½ÜïÞ½íêjE8ݻ٭³•ä6‰f— -ýnukÆûTþ嶐fÛìͺ;<šª¥·±íÏîÍýÊ2wº;« g»[ËÊÊ׬BÕ2tn¿úÏ+Ûa:)qem¼¼+ז«­Íòܾ}h7oö*wõ…ß}øŽ~pWÿìÁÏ_ã¡·W¯N,•ZN¬*« TØo(‘,¦`Î&“L®^ÝvRI^I%S§bDÉ¢Šõä Q² f©’5k Š¥JցV'U´Š+ZÁ-¨ZQ³öT´ -mX²©lÜ(·Ô¿hB*(¢j©²ukRu‹ -×Ñ®=®B… *X™¬S»n©KCñRÕ ÊW¡òõ+Rý¹­n©‚¨‚A ƒ–¥Y<*š–¨hÊ˜¨c´ÝP!;ŠB• JÔ2(f9&ªfPÎY×@íÖtø½áà å;Hx™RތþŒ°g‡¬Òä8•Ý -Õ3”HÞóîŽkwRXµçêß=Oîe(ÊKÂoã‰läœuÅKW’ÍŠk®x¤ì˜^fAÙp»³|îùâŒ<ñ8®q‘›|æ]íª¨–ÞBÖÿY;SçÚWÏ\ª£©´­„UYÛüҦ̫"Àʒ˜W6ÆBk]®7e¿-fÑìËñ¤œþ¹=-uµ ƒìOòñL™Î–p¶T+âiIÊ|±¸=Yj̛R,Ë{Šˆ+«öù²d!Ǘ,ÇÇ©ñ”zn*]¤ÆK¿ûÈ?gŽ×®É Dƒk­“9Q´D+jO­öÕl¥Ú_+f•ÕZ[ÿTVѶP–Êo«n]¥þj)V»±¬oš§´Ì^ª­¹xY¬\{ٟáYG˜—N8Ö9^Õüç¹SǗV~ŠOºÀ.q¡žóìiºÌ{à9+c|†¶´Ë<æ gyG‘ä#à NA/—sæÝî¿È'ÉNùÀ»úáòÜÕd¶]nE°;¨-•ŽbÈb!ʁpîÆ{a ê4Ìm Çq¢ë¸ˆàYÝÇG8åÐQr È -'²œ1d«+Î亓ա …Ò©Œ?p,_ST†s›IÌp1Cþ¤›ùÉt5Håt7ï…=Ýé<ˆ”‰Žç(Y:S„_Dœ¿¦ú ìãÆ\Ñõìú' -ÿpJÃ-=_gªK瞦ƒZ -&äő¶Ê@g5ÜՐÝ3ÖET…®ku^Ȝ°ÑoéÆœ Wþ[9o帍ӏ~[¹k㪕›6>Ú¸g㚍[ö<òhjçŠ+nØxàZ&ë¹ÝšÃÉÀ/kœmÍË6ÜëŒdtʟz™ç¼\s‰ël¤’¾Hp‘÷rÇžþ¿««9Яš=î&ù×¼+ÃU”½³Ëèõ ÿæÉóô1Ïîߞ©ó*ɓiؕñJôÇùr…ÛYÛÕ8ç%û?B1ž*à;•2EùGN“ýZãð€Ö2]…!ÅÖÜ'פß3ˆR›fD2ȶŸñ¢h梺³²%¦a!}FœƒücÒx‡VY¸„ÓtŸõ™*´¯›᳨,CÊ|±ÖÊD·,ÚÀ$|•Éô¥eUY†¥ÿºÏSá'Ì唯J ª*)/Ÿ:¡ÛêέYûøe¹>qÁ®ŸB=ûcÃoVæXæßß¿|y÷ Lû—T+$ó¿8ë¼5†9«LææËƯ{Ÿ­±¹hh£Š˜çÂÇFÃSEr@Tíy¸ÝÒü¡‡ÚÌãìšÙ 9ðT8¸ôк¦mëxM¨ÈÁêQۮڈqš †½T—gÅNÒqê´ôFñܟËhÔÞr›:ûcŠH &ÁQ [óX6t‚â ¡@ٍaÉݞc/:äÅ£p[Ç¥Ÿì£¹á{G|sÅôôîÜñÑO륺ä>qÏ Æ©¬Te1ðÊ_» u%HZYƒ¥«d`½cvo²Ž²¡®a…Œ0ãÙànÁÍcjËföŠf@›QøÑؔGáRܓތÁꢞOd8¢£c‡® 1TÃɐAŠxÜߜ8;à¦C7Ւ¨ÞãàÒs¢=SŠÎ”¤ M£×”§÷T§eö(8ÝR²n²µB11*_«„ÝdlJÙÎTx&älHÚ"ñRÚ.”¶«¼}\ÉÜ©Ûdn¬… -á¤Ü]%oÙekÙ«d1X灢㍃;'JÞâÙKÞJÞ7¹dîUòäMêÞSê>RêVøg“·c'oCÖvi[¤ò#%î*oŸJÜÉ$nÊÜ.oï)sSâvfe7ƒ&w`AºÓNÿ}ãÿ^S͐Lgœ™•ÍewӜwõ_ý߀îïj¤®ðçÑÍÖÁaðíï°ú;£®Péäàx5‰ ãDÜA¯ ùlÿUcºþWݞí¿×+ÓûÑ`Ô$O œªºÁ¨ƒ™ögRÏæ¸U@¾ðށ§Ûþkû.P²Ýs\:žùcîô:÷ïõñtòÝz½ñ}tƒ}oº?užº£;¶NËӟú¿·ÿîiɁý-”#^„=\E„Õ¿aõ§¸qhônŽó.Þö{wøÚ7nÇdì°mdÛ(·™X»'VPÑý¨h6hƒ‡V`¨ABõ @ "Þ{Š×TÙ ÙÉlâAõŽ&$¬½‡×î=ÌdaæAÆ5qU?⑟§£õpôãÑÈzDÀÉcRÊ'_ØQÙ–ýqÙ9×PÎ5˜ÓáœO¾Pqɼ‰[@ç%Hç NŠ+ öQh°ÑÙõ)œ»+ït7s°ˆE„¸v³ñĜÝÔ¼2wPf+Yj܂™+0óåõYÌ°>¯W©¬ìdîã¯Ù[³­h紁½¯^]¿ B®bYÙº’g•m=ƒÙ)—W×g]Û76d‡ÎC®ë\Š¬l]íÙVüL­ƒrŒòdòv=Cԑª;à†»€ûÀñçœYÛð…m9ï2›NÌÞ'gÖ û“ Y‡'¡PþùˆÓ ëKçB!òÆÁ9oܟ—"Ñ´çƒ"ÆvÑ¥=t"øìNÚw—úýÔíªCÖÕ"Bi€}dΐû¡õ ÷(Pÿ‡QXX¢m $áRÌU€´y¥ÄËӝµësU¨†2ÏˈWã"¢s1C‚üè¶ -µó4»É|%’Vé¾ç£«Ð/È1K„…&ä…94ðò8fQÐIü ½-Qxi׏4Ë«cgµûäšÌT†8˜),…æ/9ŠKhé2*€‘I‡ØêY®RR¢3}jUhºùå›ç¿¿ÿêîÆÿ·T3õµW³Hƈ>¯ “ž5¾VfŒÆ2>SÞÖ"koîꋚ¬ÃÞÚÙKf€E‚aè-Tñ¶YÀû&Æ.ÎW"8¯¦ác+øÀÁÿ rt¼ÁÐÛ¿hŠkßËéUzî%à>05;±Â÷^|Sõ-ƒ;C ©:Qr½'»vÓBCkˆo¯½´p^*ë0­°Ó -Cmº -YUëe›A¢Õ€º £\ªö¢6ƒ¥Óbö&iÜTËA¸U0–!\Y­º¨æ˲¤úN8—Zª5a_å;1ª EEóÉPæfÎHVm!“ö¢ÓhY*fsÐb2D »J.-¹;¼"¢%K!SK𒼴?ÙKñríeߊÔxèJƒ ¬ÝB=Nu\•Ðߓ/rô’VåôOٔåLa3_Ÿ”Ã…r| ¸s †á Îöრ´(Óç(gƒ›[xsöç}Û³ã:¶¦p‡î[¨6ö¥ì@µ'¬bt¸çn;û@óg/tì¬n±îØÚd¿èþ8Й9xt²@èB[êµ­ìÚÕ°–­ËÉV)¬j{®É#×bõeO\Q͏}M?¶Í#¡ #¸@«gµ£š÷aGƒL¨6´Álh‰4õ[/îµ>šÁ,q¢¸Ý,hÌ·¡Ñ_MÚC>ëæµ^:ûف×°ißFÒýÕ¢¦¬=Ö3U™†ªžkÕO"¨!ˆFÜO\á~zÄÏr‚÷Yy±;|#{L\cyªø¼Eìœ"uNQ‚‡x—³Bä\D笔“UTöeìß%%iÐ‰ð—°–jk×±Ð5 -ºF?׸çó\¿¤)j¦„uj–*Uë¨æ%^U¡¦ö´øeWh:æh(¯u¼rSKN£”›Z¿Qé{UÞ°kUþ¼¡éDß¨ð¦Äþn­Æ¯ùµ*¿Væ‹Y¹³„2K®Ò7µ¾*ö“g<:õþ¶Sòo\—ópkáµñögñR¼´c­ÒÉKlEj ]i1}ãªô¸ë5t£× 9©Â!C8¬Êþ¤\oʹ?¢Ç®ËكF»ËÅ%©1](ñƒ 6¦Ñø å£bᎆg©ìÀuéiDü:”tßÇśwVV÷¼òÐ6íqez]^Õ[ëþÚê±½öyÎ6O:®Ó&ãàÞÉeΚñÕ̯7YÖ"Àž[a1¯e¦[=ØjŠm>ìµ»…ydJÁ²r,ØC½ÙÓ*àㆠlö±PjÉn²M&Ë{ˆÈô# ñ5DCAfÌ]„hHˆJL50DCCT ¡³Iä¨$rkúŠ2Te{{€¯Í\ÃFúÀ‘ÙSj‚¬JjK5fw<.x)`°†™¬C†EÖ3méDÕKaíÄs!ÄH|úç4²ïR,Ùð?°››ró1å}˜1bjÊÚpþjgHC­ð!‘~3$؏ÆfIr»ÑÖÀñ¯ á^½zöòî«Ý×Fڍ°7œ¡öFŸs˜’«(]¦ñrè¿&¸­ h&äv ·]çHXm €ë¼v‚ÑÉÁµË‰[³K≂U¿¾&/h}ØöbϬXG7<6ãÃÐaYÞ«úê½}uK¸ÐûjäÍõ|k暓ô d©8w–±n3±ÎçôÝä‰ùLYb®…s´,1ßyv›ï¿zýÕ+§Fˆ9 Èe®X4øãÊmò´XÇg,ß×xé‰Nª¨òÛì\E¥¶‰’C^e͜G˔Ôxܤ³‚ìUšPÊ%3H}žÌ@ñlÐK trÀe[zx“¨phYÛÖÁM΃°< oRåìÆaáG£ö]“q& uˆ -ŸVOɃžj©f ý#5«©Ãی(Õ´ÒÌ.-Š¦™iÆm!⩕p¦Ä %rG©q¾XÎøW.”f´*†]ùrbAZ©ñ=O|hytþ#5~æ?ÿ{ÔøGNrc±‰Zȵ:§<ñÛl:G; ~bºžp”µ u@iî]hy·ÚO«¼»êjªðíÞÍtž£TžRaÛgB&Ïr•ÊW2ÓB*w¹^qµÁoyKã/“Yt—Ifú”Óºã4õO[®k>³maR•ã¨µâ:—¸Ït¡l8ÐÆ}™#½?y‘øíG”‡¹ÞG•ïküKÕøqQþó`kz8±³ä•uÈ,CÌÉLZê[öQ^´©]¥ÊMÕá>›U‹p•œ6^C”®iÓºuù)Ò8Ý;×o)? XÊd"PäP˜Æ“/èNWX Líꯈ!Бž ‡¶£>9øq•ww¢'åMÂQôÏÁâæàé̑®¥îù:§•U·X@RÛbÂÞÛN³ê5§^Zë/[é¶ûcXôã™rš³F=ÓÃe²|é+ñ1ÅpÊï/óc‹Ôøègÿ3ÕؙɎ'é„÷²|óM’-ˆ\ºG˛63_ÚÀLi{š¼fš»Fˌ¶—õ¦Î5¹`â‚y î4¸Òԍ¦q Gf?Óh…T³žÑUæé¥K®!|"QÔ¸„Ǥ–Þ&—öôÒ-áÉææª.®êÞ -•0ºSëØÅ&\w¹Íš‹.,áQÓ*ÇÙÚuUWÍiÕ\V½Ã*4g•e¶Ïd¶Üº©¶Nª î©'_lT—ÜS+çÔCŽ)©ñ‚cêœSên( {l9<¦Ø=ï/— Z'…ùFè韎G˜.à&àB‡GðŒo7öqľXêiw}<)‡+^Óp?y~N¼T3ß 1ƒäŒ?½Â«œÆuÌþ–ÂÜaäú{>û;>7寶¦>eÓÁ36ûš­Ÿõ¬­fܟ9‡Ý¸®Ø O`ä7.Ù¥F~»S—¢¦¥Y*]‚¥.½ÒgyfÍÃ\”Iåp-¼°­!2ß]‰c`n»!Åe˜Îüã”éóÕi±Ñi˜FV'™Ö Ï> ¦Ã8Gó’5.tôqX럥7Ÿ|>užgœÓGÁfo Àyæ¾,‡Ìl“ãlú°h>‹žƒ¹nÀº&dð -Ø[8ߛóÚU¿ì¨£á¯?:ú^0#øq ¨ø7؊´`aïiá@™ë6ZhÈ)ï)0qÍA¶¿ùË@ÃÙý¶ûÁ€uÓ&ïoŸL–ÏõÛ2ý¦îz>Í -¸gJ#ËìÛÅG¶|¾³çñ½¶¸G_×t²iL÷DÅ3Q ÍYZèrÛ[¼öA |)t‘ØpÉ01k¼5üˆª¾±ê`@ÊDw\ßÚçÔ}àùŽ¶úœG‘ñ5ïQŸù¨ À±ìGgBpüf•€SjÎg„_ؓ‡ŸYùš,d³=>æu=ÍäÅa@ú0Ž9 ôUáos™û¼©}ƒòÖ'ïÂr~–m -VÏXóö»+|ÖĶºN2„WHoƒ®8¬×ß¹q0ðÐbÚÛõ}ùSßYåç<˜Ë;píÍÉl/y;îP½lë/øN/4chúˆÔmz©s ¦Æ3 ¦,¹ ¦òÔèRÌg%õÃoõÔ$¡²8ÒãŠ-]c®ìj§ÛY#§èm·vÒÙÖ¦R^y‹JÛëHÄÉVÖà,Ñç‹æÑIXÉ /¶Zx¡U؏2žG櫝åK&iV-4…©FP?ƒ°K˜<YmIV²r಩½¬Å,¼?È&¾edá5/‘Âêð;LÏKpºö½A7vÃÀö~øŸºín¯u™Sý¾-¨·KpÍ2ÀX–u6ÕÑ$™ÐÃû{¾Ãâ+†XùÌ] ðÚ-·eZ¸DÑPœ¡˜½¿yÕuXg—³6­²m´o¼ÄÕ·|½A¦u.zØb(6 âi¸Gj¶¼Î©Qm2<Ô+”ë/!õzúz›E»£¿,¹¿J~9Yþž -”· œ¿ù½µŸ¿$ùâeë}éú_Í2ÑË ôróD›O‰+–›B3SxVŠ‡o+2W3¾»ukexßwy¯ªá½æ¾êMïc(6 <nÜ´l¦{3Æ_{N¬j–/fœ¯º”¯¼ñ©/ñ¤„ e:_x»Í¹2~lá5ퟵ|xôhîŠÞaQ]ã ü£‚?ŠgCì3!BȜVYÛuÉ¸Î€ÈÜn"¼ôaFkÄÜ&déìE¯7¼aëR9+龧òÙÊ_C[â¼ ýÔø J"5žÿÍùËBN/:è/< :E'öéÕ!óIfÑuvÑñdWÕ=µçíÙ×æ2,~aMtÇaËNt>?Ѹ9ôjœ¾€[ƒF«7 Èq+¾'‡Ÿ…§OÅϜÿxAú“j<¯XÄ ªˆ)*´_¯Ë‰’³ÉµÝ#åšÚ䪔ðóš#¼žlšc\O‹4õðÁæ{*pÙ²?Fʄ2 .D £|x°LÙÀåÌëhÙa;T09,‡°ŒDåTIQ­…*%î™Q%Dʆ&B„üyRÞ5Èkî{û—þÓ׸Ví,ìۀ‘íN²àø¦þ¿M‰¬Ø§àwt­ÕԅêlUTËFQÍ+×J§â|âøœüù Õø°BqéþR+ÔÖO¯}Û^ÛÖ«A® &Õ)©q1k¿Á¶ú%„Ý5‚SkW_¿¿uoÙ«;³wh>äÒ<ÍaÙ2Xêõ‹»«ÖÙ̑4ÑR…‹x©ßqû.HRTŽ Åf3X—S%g­u -Ò¹ (¤F¿pÂÊÞ²À´k%nº|0ƒç„y(+Ì%7nïĝW{ºK=':>Óµ^æym™ëªµ|2[y¡ãñ@ ùH×c’O†EÜ¡0ÿñ‚ôwRãƒ* \’ù¡Ç«¯n³wUª&ß(\½*Ö´šµ¡©q³ù+r»ÜAj\ü‚‡zÅÃaåÃX{1ê% Ê8›Ï¼"Z¤ñä>í¨øøÕ]ڇ›ã4]F؛p3\aäp¸ê_„¥ %ó0år…v9^)÷ÁO«Gji˜Ḃqšyϖ0Ó1iÏ–i$ÌÐóޑ8†]ÌW°»Ïùäªìn³êUÉ»)^åõ—|tŸêÈKgyi‹È=‹ÑÙiN ã Zg‹×»š‘Ìkö¸Þ[o¸ªÿm7®ïŠm2YØþÜÝﺽåu+N@Bél}Ëw…­~8hÕôÎMV\™Îõmé- ÿE ¤qû»@n»kOïYº ×·D¿ D¾ä⍠M£¿îl_*§nƒEgâåÃTr®—å̓쮉á¢-=¾u›´÷Ã߶ûõd¿Ð.«$NÙ^-5ØcQï8îG¼üÉ;ñ<8>}Ž‡Pø=:þ{tü_?/g÷¡ÏEmˆÚº|݁)ŒŸß´>£¹‘¾[ÖíΪ£ÝÒ\ï­j7W¿¹jîîÑj ó–®3gƳßõúü¨×írŽ“›;ÖKñÒŸºêòyA,ŸHbnP™V÷yžÄ×=pÍÆ -y}1~¯ÉCó¹uݵPÍ#i!ø@\`«³lb·WTœ|óåhÀË û2]-ïyöc¹öÛæqgÁ£®b8wô(§YÐÐ@æe±õoÜÙ7Âö‚âí.úäʾ“¨Âº»ÿÿþß¿Ûýæùïÿøì͟±m6”¿Ô¥4§&½¼–æÉ'i‹kôš´¸OX|ô;1× Ðk¢âf7–¤xêúëH‚Ë—0ôW0ì»èO‰8t×*0B‚’ìGÆHXñ¼¡žÜskژq¾ë+NÌ¿}é]^35ñk²›UuÕ´t×UÆn)¯![/ ’¨ÒõÝäûˆ4ú›t×fÔ|Рù¸¸”3—{|ldÊ:1Dw¹Ç65Èñ|š‰G­‰¹Piø\W*õ×@ùŠXE8уٯˆþ®Ýºº$讉÷%B_§A7s7=ɟ ´]Ç.néƒãºµÒ­»¨à|²ÿUZ‘Ï'‘W¹ü/Xã9§Ú¹›àóšãI§ïŒær6•õ:‘µE`=ùâc°²Faµ,Ye…e®½Z=hïG9Õe£¬“ÈܜO#óÝ©õ1Öó·j1mö£í‡Ž_¬èŚâïؒüÉx«1„‰þ<ÍßñQ‰þÖiþ,vKdžOŠÞÒèiCí2zKVÙGÇo± ”ÆlH]`t±·n7É~òù”@߯‰ï×Ä÷kâû5ñàšX§û€ŒY§ù¿>üåïÔ¼%”§¿xýêWoî_½»õõ—_öª{ÿ›'_üâþ.èï~õìÝ»»7¯D«¿~ñ§·oŸA›·í–åj™§nà8Ïa7Åx5Èìì¦q¾’Å5ë_ë_ÿüGüý­þP¨ÿü'ýù¿Ê¿ÿ‡Pÿ(C±ûùî_þû°ûê ßú5¨-Պw/A=io÷³¹~×Ïú*Î×¼Â~týæÝñþù»ûׯž½ùÓîÇjùÑþõë2?µqyzóÕý»×ožîŸ=ÿw½§¿½q÷ô×wÏßýp÷wxãÿ¼ßû­ÖrÔNÿR×ʄk/Õ:N‰«&Êj)–%Ò. .õÞ˸”!,»~¦u­G2ŒãÕæq—ÊU%ÁJú9IE»´\Í"“í„5\¡¶”qEqÜMEf°Kéj”¸{Î×Jº’Mviºš`+ZÄUœæ²‹Ë•è¸4y¾ƒ<ÕìÈ©¾·\ 9L» ¿Í¬>³¹©\¥ n‡2\¥ïç«C°¾–ã•è3»iFè³´6K+"”î¤Bε Ò ‘í5¡Ž¢áìdÚË(«pÎW"²Ž€,ÁJ&7M L¡ÔÎ̓Ô:Å]œ¯pEÕn’ÁYq¼’.á;쉐®¢¿5^‰´;ú—Osº>™4i’ÓÍóU˲“Ìì<×÷æ«E¸Ñmà·ø¨˜—´“úJÄmÐ)È\0X’¿'ÂÈ}9^ ?ȅr5ˆ¾·‹2”Â,… _2Ï -Èu’½'C?cbÆl‰Âz|¸Ì|Lü9f|7f~©3°!ÐáQ˜ïµˆ.ZvÒ(Ft -Qç-¦+akuÞÂx%?Ț›e|G雼/êʼ›£L`’Ž“Ìì²ìfi S¬ïÉê§y—gÆ¥pë¯É&Ù«A4  ^žÞVׄ=!•!¶zéÒ"  D™ðe‡=ÀÅ,‹SΛ9ù°«y‘µ¯˜¬*4'Íy=ÉPYx\ÝyÒ¨ïÉL‹ÆŸåžg¬Fy¾Ì ›gHXåÛ=Ç÷~§{ü¨³_®J -^á¾y¹¢Ê:C–J.¥È~‘E†ŽLˆÁ¶•$_·ÈÄùC²—bW¬ ùRM–ñ2ã«AVœh€Sk§ڒÅ×´Çj/¼¢M·ZÇÃX®„ëÈXa²¼^®©QXå)ÇxAå,ٍ³,ëJ°¹“õ&Êi÷XԖ[E•`íÙ{•:]‰,sçWQVAמì½úYþXýp¯hÓ¿Öõ¿ýü÷>à ùéÛ§?&Çðáõ7zúúw–1ÕW+™¬%Ȃ„Æ.`#'™*ÙÀ!  #æª~°ìÃÀ5-Gê I&ù*DK²89NdvÁ°qlŽ¹¦i¹šø ©y†å<óÁŒÍ.+/ãÅaéÎY.ƒq€&à0Ø4ŒŒiȺ–çY¶xtƺŸä§8Ë'ŠRD³O•‘žº[ý€íb==Ö¡‹pŎh*W©¨‘!fJ—fp·¬‚Ì}~ŽT9âk%LM{p’A˜Ç®.'X›ö¦“e8‚(i]]"ÎβºFb¯ú×ùƒÞ¯lÛÓ6ãÂa -\àCšLêÇ<—„Å]É¢f‹d-,iE1¯L>5NÆ^+i×U&dįZ«F±WÃÕ$¬¾Pd ÍºÊœ²nÕÉþy^™waÛ×ndßpŒDMEZ~¹¦"4!a×îˆÏQbu#`YV‚s)d jÍEgØ+r‚µ÷¼.>¥Y/a{E“õÊÛ3‚íúúYþXýðZѶï‘ô>ÉÀ-t€©ª7hû‰Báö,( ¸ÓjУHo¢Â­ ZlE[Ü ¥ê‡¬¦jЂ˜+ë-® Z¨m‰0˜A ¼”íU‹ÖHK‰ð•E‹ì<±š´¤ûW0­»I „I>heѧ °T‹Øo˜d ªE‹œ3¿²h‘±Â~e-*Ã~œ;qvu6µêÄ'Çcç C–€(¬¾Ñ`cuïsi>>¨x"Iææf(ÍsKÖg`¨‰UKðêÝp_ u036†â>óRnMqê܁ðÀEh÷ŽXê ™?ª;”÷Br•skê‚ÃRņæ”#OûU]‚#Î\™´æ¤E#îL¤WÝW¿Ou Bù_&,÷êÄ0љbõ R[ZÐÏê_øˆ1îÞ*ÒR=·ªsp¢ §ŒÍ;È7(Õ=Ãn[FÕ=ˆúJ–*Ü? )õ÷Ê (^µ#¹‹pš dÊ7¹p»éý3'!Œ\¦k/!LOQÝM5Ê ïN·éeG!á6{¹!9ÆX¨Î9XKØ'wâ9eí.ì¤7°«Ê~¶{—!؂H´KóB7¦uÙÛsÊÚkØ=èï•m{yÆq(s-_0¦çF.B÷ÑM£œÃyl®¼JX»ÛcæìjrŠ5¹vb¦ìVt›qêš4ÂÚ{Øó÷š¶½üO"u Ó3¿]€5².pœ›Tñ{Ñ:qä擃: ™foR„3’â¬Ö8#Öi†º!¶á¤:n“p~'chccöWS©¯Ê©ÅVåÕ!ÀD-„†“®žêS,sièîŽ<ꡄº`‡x± ØB•bzNQ¥·=(Œ©@wlu5Êб¡F–ŽP˜k•EaÓ»V+åyT~]{®vÀë:éé{ä¡Ï⢆w‰Kbí£†=Y§»:©áW"ìÚÕK=ŠðƒÄÆMM›5_­hð]vN ©_dNŽu‘UOõ”b]Ÿæ©vÊÚSݬ艻"ô”»UÖȘÖÔû¦qæ ɦk=L—ÝÕDi\ ñrCÆá=ÍÍaíglõ";aí´nÏUt««Q¬Ñµãšg1M^„lÚój£•°ö]wÏy¼®mO¿3÷58š°²Ñ<\5O·EVÍ˄&œ•æ ö":Ãäš'ô3‘9×TôC9K2½÷BLÓ¨Ns$‹ì/ò(W5”ÉÐ(wL[ÑDÝÐà±Aí“4§ú›Ê\òxEóæ0i8 -´O]XR§V%;¢é¼4•EKѬý4(àA°Z¬8ØޔVŸ Iõ”f@_ä“-ÖÓeÊm°<ÛC—hµ{¹!ËñShv9&B³¾Q¾…ÇGd/+Å6‡ xcmÊY–úªìçÐÛ +1áƵq×UCLw­=£Ø‹þaþ ¼W¶íeç”õKÿV>²—ò¢&TÀo蹃"MX–ó¤ð<§`cTTR÷ lÞ)­*sŠµê¯9«Ü*ƒ{†ÖÖj¥Ø«õóڃÞ¯lÛ×ndz–„sYÔIb1_®É8Àa'å®U³ &–Ã\ˆâp‚s€ø…ö\DšÁÐÕå”Ú¨½êdˆJtÔʁSÛ´ŸsÔO«OµNՊNºÙ†6_ñ -§zÕCܑ#$gÅ%Šð¦æ%Jæ°ÊNd •büvë+™Ðµiž[eÅZµW"%¸!¨Þ"ÒAh7ö˜fæâìœC_™S¬ÕçÕRhä Á]e r@ê[5Š½êŸçz¼²m_ûQýîÊ!«ú’òR¥ÙF†9iE€¿ÇqÜ=Uˆ4à°RL“«iTüAF(¦¹«¬Q¬Ucú•¼P„šw­2¡ä…^ïÚj¥X«õóڃµ ­²m_;n‹É&8 °y^nÈeCÙ-)Yr—–Þ×µ4ŠuŸ2õ@>ö•9ÅZõÃÏÉe&h±V›]éÚԟíµúiõ¡®OVͶ—Ÿkon“¹Q!N#jêå† ÄÍ´˜U&æE“HÝKGilWˆóÌ}eN±VÝÆädª¸­.˜f—¾M%8;°o«u½ÒŠ¶ÝìôS´€-³S• ! -}¹!X4¦<ÐK*sœ';×#…øJ1Ў}®T°×Õ(Ö¨{«œa¸w­.˜y§Ô·i”çUy¶ó½^׶§ßÙ"…%FÔ!Q!—³º¾Œõ<ƒ Jôœye¤¨þENl?[¿DNÌ"¯ûCˆX)¹«¥¬-×ü•*Û;Òu_ëÉžÞZË}|¼“Qý£­žmÏzß鷺õ‚ wy:U†l˜ÕYKkÁê ê¦v\ ÆvUŒý1`)Š*Z‘¬={¯R±LÀ«¼"l(íޞÜY¬ŸåÕ¯mû÷]mHžÈƒé-3®’|¹!C6œ-Àh‚ -*Ï0©ô1˜æ+Å9Ühåõ1K_W%X›ÎߔšãÞÕT,Š¿5Yº\'Ý·ùƒþý^Ù¶£ŸIôØè”ÔNVٗk2,:pcC݋ã¢à -èM8“LV…‡/¦î±A]y]M•R›´7<±;»V­E¡tmVŠ½Z¿­=èÝòʶý®$dðÔْúŒŽtiÔɐð.†=j\ ²^I*ÁT€[Ñrÿ¶Ý¸ôu9ÅÚtmÒÈpÖªÑ*CÛ±tÁÞôóçê÷{U›n~7 ”†žz“ˆ¹8ÛÉ0k%ÒÔ¤ˆ\OH¢Œ36,ÌAcë³+ÇþÁÁŒM­2§X«þª‘'e­2¡ˆv»V+ÅçB?¯=è]ðʶ}ýl‡00KA~¿¹¦–šb6£%ƒ¤¢”qíC£˜0k¶EP„3d‚ê*sŠ5êö%ËÐ1?^«l4dªµZ)Ïë÷êçµ­­®MGÛ~ι÷¾}Fÿf©©ÝVÐn@Ü´ªÈnéöÇҀݠñ¬^ẠbUJCuÃ90‰º3&‡f×Ó-ÛB˜FnndíÎØÝ3ÒbâݺÓedž熱–Nå -ç†w„軚ð¡â· ÚEâ2CÃr' ó©pöPniO#*’{6ŁÜ3p°“ô8î ´ZXŒ;/²©Ch(nJÚ`z+7LɆ3÷¨@˱¸‰‚År âh,/}æ(›W ÷É̟Ø< làÄÃõîF5£:næÒá²ONðÛî Ÿ*5Ë'Kwʊ¡‡R7ªA®[E†ÊníõèíöYõ1ÿp«è¤ïq}BE”ÑÀ†tÛɺ½ ‹Žü\‘Ûðyðç¸ 7¸QÅm ƒ—s35Ø6ó‘5ö(øl¨ÈTÔvZ´1Çbc` WmÙò C£*5 9`ÃF8׫zÒÐÚÙ=4H6ÐÒ\UDöug‹Ç†öްؓ}IX#–I•­‰˜Û_‰HÇ?…Ø@ØÑjYA° ÁAB²ñuì50ß5ô+5Ç¥!¯Ñ祯±âM¼^çbìÀp× Z’*ìš)ŠSÚ ®…ù¤‘™Œ t Ã5«˜ë’°‚\Ì?µªB®Û⬐ëÓåzÂÀ»"¦k…¸nTCI3™T®ÎÕL¶B[cSêóÇO0Ì­žFè¡ÏjéV‘¡¨[{=ÚÚ¿Êˆí³­ž“ÞµþÃЗRÚ­µB£Íªîài5ä-ÆZ„\FÖ4ˆµœÏs_ÖëJ­èZ‘£¦­¹5¸Ú¾©ÛG[5'}kÝŒÇî Î/WÔ -…ÆÄ城–ђe®Pհ͍¥{ -D/¯§VøæF5t­Ç€ÒÞX§öOªyOj%Û®µ^#ý“5® Ôjàg èØæúI=`Zˆd˜þXT¯N«È =œ¹Q öÜ*2dtk¯GP·Ïªù‡×Š¶ýk]‡ -~úxº+ÚYö‹æᬀhǘ_uœƧ¡±þ˜ˆBCê0ØNXA˜Õ Î^‘¡½¹2íUª=©•lzvÉÁÿÄ\â+He#W$}GÊe))çxÉ%n•p±snԂlÝÌ o59a…mtjÅ@zE&éí­à”í»*¹}{­ê´“ߍNóIY?.~Hv?úõݳswàï_>ýÕݛçw¯Þ=ýow²ÚãîG?}õîÌãøëÙ¿½¸Óüìõóî¥té¥_½¹ûÃýÝŸþúõßÖ~¸ÈD+¹ô]¼“çïïî¿þý»ËCSŸ}ýÍSÓÛ7¯_½ÿáŸÝýîÝãŸÆðHWïïÞ~HG¯_xG5¨n~¸£ÿtÿÕ»ß_œÙ›'z·ÓÍ«¯ìå'g/{ú¯÷¸ÃUOü›j£eçU!Ê@§¬ê©ŒÁ´dýkuӓÁÍ?ôƧÚdm á·Víê…MNöüY_Çy꺊¿èO4Ëy20;jÄEjÐrÊ8 zy÷T/ïŽëä9Ic¶‘;2zöyPւ¬ñìAä› ܾF{J‚£µ |”œ@ÕoàžX}©¦áØ rM¨X•„F ¯–£BVôèÞÉ5`z”ã]T3:{D¦ó{'2L•ôî ‹]ÏÁp!LL B¡O(ØøÚ@jLPÉQûˆŒ:%”%„©õNo - €ÈE[3x»ž¿”AàósYû&§ú’sZ,€Y‘’ƒyvƒþ<3ô„H³Ú·žçQ_ qQJâ¬$äÔ&ŒÃîՄš…Êၞ>—,<.«²ã\g)éó8ò¶¤Áîè’‡Pù¢ŽßÊ»‹ÈæµFv¯Y3Ìâ±qÒDR˜ºf‰M+•˜g‹?g 2œ”4g•L4ÎjžmÔÔMLíëÞ&íÆ8؄ͣ d†`’bA]p!µW#5á÷æE3¥ÏÌm Ae±VJHt{ ä­9¨ªEÜaõ¦¡OYmècäu t“~\¤Ñ*#{ìÃlqt0³±ívuõõ™ƒÎp(EIKÄì 0+((70z)ˆFO¹M¤…°å c¡$ý‘[³Øæ!eö¦0 ö`âce,*ԉ"ªà`\óHJ -~D¹Š®P[˜û¸6DIˆïÃ=‘Xü3¬3"Û ï'ÐÔ~QÌp§Fföƒ‘kQg-t—/0Á“8h .€ÛeR÷ë„5¨8Ì©{/LLùœÓ¤µÃ+Gä PŠ7ëÏÑÝòðzÏÄtƌñ„'s‘¯[¢¥@?J" -3-u -™)£„ÖÀÂ̅¤§…éV,̬`îǓÔ!ðN2.˜ú–¡ˆ{ÛFKÞÂP±šWŠ>ƒH1^d¶` ru‘ŠøÀ<èž!`†`áYŠ&º›ÄϳÉ`9@ öš(K÷ZÖfôŠŸ×9à9‚ Ì(¦x† CdNŠÎÈmϋòpëÞ¨íå¬+”f¡eä-^+´!ÿÂÏã *6ß L$“ùف&ž£ü"TBÿڐ#+cÎHi‡2 -Åâ/ÁP¯G¥"ÑŒay¨™1eb}3PYSÄ8ÑƈJ+Wš4{é tÒ¨NZ‚HóE–ƒ€ ´ -ãrcf ê‡pÚ¿Ñz¤{ w Ç6nŸsa&ù\@c³á5œ9zJȲ²´p);5åoÐ„u¢®í‰£:•˜‘|QNjå(˜ç"ÓSp"/êÞ+òbW,ÌHè·`H˜ÔÎêl‹g¤ßžf瘸S”UFY¥HœŒñî-5èÜËøǀUL#R™Ç'ꔍ¹8±[`j$àHBítsÇ¢‰I„À¨#onXÌ¡Bc+f`ñar[ýl½í ©ìEœÒÎÉÀê2Û##ŽámŒê¨‹fŸçvß@ÒNÀ`=¨[†g\6~q"AžX)#àƇ{z»¬/JD—§ÿÄT›¸þ@Ȇàí’1z(úÌÄe¤’_0 àk4y -n±Qùµ½'L¯à,*vZÂ×2{‡ÐN•LøTÂóªè¹[Ã=܋É!u¤Œ°[aiêksÆY²èÇ%ñ^´Ù2ð:äqó + õL8À£»ŸeÅÏ|kô£òsÎZ¨™ñˆ!LSå#Í`+ƒî1ÔôáBH6<ögqS÷sÑt‘VôŠ„Û<£Ú@c‘WNÈfUË‘!* Ï>3èó°ðÕ<Ó0;‘½V¦ 2¨xoðË_8ȶa£¬ïQÓ¹*ßÃ,…¨g¥uO>KNf°”3Â"¼ŽÖye:“rlð’;AO7&D¥¤¦·…· 3Ùΐ” ÏTúUü=~ý¼ÔîLz‚,B‚ï„¡ÉëY×2;'KÑdãŠ¦TÀ‡L˜ŠæÄ:T1Ÿ£ÆšœŠ©4ՅJ& -ÁÛ:ñnïÉهÁ¥> }Šä[Ìã-I¡gÕû܍"™\eȋ&暂Þh)‚f•y¨ªòøkD8áxJ°â“^Lüÿ¢ïáÄɃvÏØܨ[…šƒ)ˆÀc °6Û&ìÈ%8›C Äõ èµÊö•…‰àêJ¸ÀÓښìož‚þ˜ÇÙR©© p›C/Kòº(Y$¸í…;|'? Â<k0d„›û{Óò$¬0ÚT3w‚TG%0Ÿ7¢!äù{ 6V¬W€L4Qs価x”ÆhrZôsaÄÅ÷’s,šˆmÀ«Á§t0E䜑‚Œ^ÆAkFà ‡¨1ÃàHýçx㚓…€ƒÊ Š´Ø0 ”š°T–Üú´S53Ÿñ©‰„‰ HPœ8$M$†»ÃB†jŠ9ž¡@ʧÄÓØöØ©ÅÔHÆ[̼1K±r*¶é϶ M¼ò‡LͩրFà<wgTØ6¨Æ3Å­T¡âHª+3Ìͦ9ô"©êóå2'ͨ•Yp”aP0) ¶-ÔP8ê+ ÐA„%^2ù‡ÏßCBTµ?#â“¢œ èÕACŠ Âð,³¡„#s¥«vE“v"SŽ†ºÄ&ãiH‘b+lbЅIôØa´0ДãÍaß!³ l9s5Šõ ™ÆLϵ6·x(Ã@üG!KfYQHq¿Dµìqû×m @$ÞVΏï¤Р¦O€‰ -q»s§ `ÖUÈU¦Õx„“FÜO°~ðj¬Pyt´<^8™••ƒ{">Ï,\X…qaêDÍ´âkS”-ŠZ…k3è¬K1¼xmdn‡ZÚk”Ì(|MøÆA›ª¹‹~dŽzò cÑ*& YÊ\=zÌú‚¨Å¬‰2ŒX8àW©T䦉çÔ¤W/qê8FøZDÒ¦.\VS eËgs+fc¢ `*²*gþš–… }±~‘Ü”C‰ãqÆRÏ*l=¯¦q•ŠêdÀؐYÀ[¥ú™’ç¤:¤Ÿ®º+‘çËRBÃC¤rM{„å\võˆ×ÉûCP)ä4’³C}Ëú3Bê’TVbR³T±Â}©É(6‚wçGŠ.„8¸îìVDÐ%F-2—|⍵ŠØc„¹ ~™ç«êÉȆÀ›0 –CýG2iÍُhOŠ¦ÉnޘJg?yN£&A1^ ¤0¨/+ÔJäÕ  ~Eg„5-ëWyµ‚¶Q¢QÍ3}›°%ք$vqEZ荛ôÈV;g3õótЮ†¢’=Nzê+‘ÞO †¦å i³ã°h0ëÒFÁaxE»Á°0ì =Èqԋ6Æaғ6H{Ó1Z‰wt`‹ÙL5)±LvhÎ]£Ó¨|ÉõñÍÌú½ˆ¿D¤oHŠK¥¼j¯Ó¿˜l’5»S(0=‚G3¦Ìo²«¦ÔRÃÛPŒÌNštâ5&H¤ñFîÝ@ÐðÒÙXÞ¨÷¢à8ˆŒ*6•JÃ@Õ§ÂÌ°£jˆö¹˜‡¨ijÉQ^Dz’ÅíëªG¶­œ;œ>WÈ\¬,d}UøŸ†OÒMÊâ7ÚS}#ˆrRÇó%E“p¢e† Èj&qƒÛdYßǑfÈÅÂ?G¬w‹â¦p6Îêuy^mnÊ&G…J N)Zqu1(£¥à¡%ÔߌeP2­j|pJêsÎjáªY@án.•‹N4Tck1ò‘¡Ð ña¸ï`Öð_žGجÀ,hÙrÛòÊLæ؂鏮{ȂŒØÆ-svÛfÜA3j4j`ÀàhÆr yVãzUjÓ't©7Mf_,æu1Y‹Ç}NFaëë?Òà–©éS-KޘÕy¢é;»½X2ó¢‚v#v4µ,pBy V3Lu´éÊÐ´Ö x€ƒ…'¬Ž`¾ óÛÏ%òæøÅ7öÀBÄLVZhg.õÒਠ-_›ÛêöØ%Y -‘QóÀ.Æp°§Ó2©»†©eµwH>¦5 jvº¦Ò¼ðÊ΅Á¹4 *çlþXÃ@G öqŽ/¦·‘«,Ò'äš>ˆT˜:àMƒ6Ɋì¦Ý0G¦á„±ÛW ScrçA;ÈÕ²˜S!"Y¶êŒI5Ù`ß"ñ?£R'MãÃÄKÒÈç1. -æî³íë[&BÛ¯B8p֟á;c²Ü]ÉØo¿2 Y‰!9¡2 RÛ©U N³¨I–%ð‰Îþ=ñöÎD¤ t °ÑiáUo40Àç@¥·¹c:~†Q7œ*Ÿƒ5$;²pÏ_èý$‘q ¨/i‚°]…€óG~,~?…î­í -r¤Ôæ›Zc¬˜Qʏd؎ ÐXuñ -—- ºQ¤\ÕÛ=)ëk0‰Ä Ô‘ ¢ì(EÊØN•À› †àiA ÷ ÀÖÉz¸ ¢ -slVê‹²÷ðë‰k~ÊLÄÿÄÀ (æãÞÜø¶}À䣢#„ ÀÌ¥ՐóTL^"€:sÓ'7¹€ -Ȉ >äÞ2=eôT¤€Þ/jUooašáÇå9’ªñsô(eN‹ÞkͅgoBÄ&èaÐxPô'½zAvaÒ7áæ«.<€“²>=€š™"ShÁ4׬ú­kÚâlxøF…i>˜Ò¢>_Ú8•ÔÝ;E_h3/€P·*mÁ¬L­0ƒ*el•Y)@i­Â ÂÏ£Z‡Ý«PA0þ¤Yم’}Òjiâ_Ò5®RéÑ ÎÆlŠr±tQ4ˆA(αá^ç}WcÐtªXcËÀ,Q=Èzg[Ðä¤óRBmn “ÑÐt -©“E„àBJöµ@L¨ÏÑ1G -/g„äßÙ©.Ðé àé±êË5YÓKâHØÁ 0íi2ñ·}ã̞g›5֌¸'aw0é)çu—ðVD{gaí½R -¨£4 1T¯jê`ž²¹Ót˜ª¬>)¨w’K -· 3Õü€ð½^ß]e3óÒ.J&mÁ*ÀŠÜÀ¨• bט WC’ ȆÈ((pHJ–Š&¿¢JÈÀbc:´cÕ/ø³ȝ‡­ÎŸá]à ìnñ%0H žOÑV†u´ÿA&Æi¨-8‡ƒ5›Ø'՝G^CO3µàÚÉݍ0J\ ØHý‰"8ðêzPèae,ÔΖAÝÛSÒ‚’˜‘òdªÈär¦c9«ѵzÁÔê† ®  ŽÞ±ÆCæÎsª‰‹­‹BÍXYxgÌߥKp«)’JµM  -¯ µÌ+Ä8É°!)€?Þ»’é†Uß6ÓËéSœ:^!£´ø%&ÌzÔz8òÂ4HÓ)[ÄLáÅ“‹«°k†!ë˜Cž¡`teçZEûuRÿù¼=ÄÿɨÁÊC ³ú¹Dºã9{.OÆ.3ŒmƒÂs— ̈…ë -s,\4—EÍ - çõ&w,׉b½/ -ˆ Àš#“<ð1µ@Ãö‡«~+ÁµEޛ ' œVžI·Šæ³Xè¬ä!zpi+¨¨2Gf!3m¡k”îoy5{,®1Š‰bÓ̜âp½â»£›(£ÚNãÊBÕŒ´Ñ0Ú°öÉH60CŠP:#c†2€Ú !™§0íhó…dÿdÕL­{&ªB®“-ɉ‹– VQКWöT+ü¢oÆ˖Åb¿°{•ü5J]“Y|@ z c$ŒŸ ãìyµFä´äŸ4:%EŸ2aT…ÑR#ɖ»{[ƽÀ¦g$Š‡ ŸF"O}Ü[];£Lœ‡ÖƄþcÝ Pv39£¦E†R;bXõ.Z:"'c -|€ÖÁAÝÖí5‚â ÝÉø¡DBö,o܆ƒZÔí+‘1¢ìô­Â«Âp_#;ù×U;JÀrââí2̒T±@Ø)‘1°^ñ›õÛèq‡hnŽò¢þ3`Y±d§YÁ”Ld -ÿã:K¨àGb˜žÄ¤á>?: KT„Ò§JH´ô©©ƒÙ"³Ü)°•žAGÚ_£ “K¨3 ™8îÃh\MÜüo³‹^xbBõõtȔ¨ˆG”Q6Ë!¶æ:À Õ5óðÏf–Ä6牗M.û/.DåI8±Auú‘ƒ1h¯'Á=b9SŠ„Ó˜6ð2(*MXâŸ‘)›È‹A÷›ö÷¥c7'xàãQ·ûlÿô£e7ú•¿ B$Ԏ¾D¸íàX&°3ê{ØøxŸ¿F€¨Å’·3}ÁÌ)„n"?]ŒMYqX)(¸h79L[΃=:b‚ûݺW/õ†ºD…"Û±X!ˆ{‡+›4OÎ<Ä„E ŠÊ™ƒ‚¤æQe]{/¨åéêyE±‰iY½G¶ÅšnsV Ê&÷‘j @’L@ÉYM4ÉØØ¡*l/Õû笖ÎyÐ3Låðæä:1¨™Hhªÿø™p`œ)LA”g=¥÷{ã3Á;gUÿñ3Õ|‚™=´ûÄSö»Ý0êhÄô’0ÚÒ¢†5͑1›S/3 ̱AŒ%áÅÈëab<,)‹s¡7x¡}ð ,hÁmÌà¡Èí!uÔSOVÅÖævÕ!Ò刍þêW€ùªªÔ`Áۏîǜ)™"×!ÑêÕí602X`iéÜåuùT+;SÏ òŒt·ÀY0Ü;¹h3©ûs6ô¤§Ã\ªÄˆý¦3ëDé•ÔÔ*‰…ƒû^H8`.Í¢áuÍ’£÷³ÁÚÄËoÕçG³°ô‚À%3»ן¹NTŠ¦K¹pYè6«{$t¨±>ŠwÐ2Aeõåïd†€1±Ùë΅›ýàKŒG™ûî~ô›woî_}½ûÁ~ýüù·/ýúÝ3<¼3«—Ü@œˆfQ¥Éàe%+Naª¬•-ÃÄhmÊzÏÒÐÁ‹h‚‹v;­¤ÌÖ‘´¤ öC[óAê¥OÌz?¶ûó˜&œr ˆTÿ*ÅDŽYñ0í9˜h&KÇ¢z—ùÁf ý:Ô÷TçDä 5¯±^ ¼ð–˜Q‘‚t†É5¶Ñ€PÃA6s ¹š1GˆoÞô`™`Ró“k,Ȩ!* c¹¾§\E9¾ŸR <¢„ÙÏ@̓øHÌS¨,Š‡+“hxä’M&íÜqÝY/=_HµLtf+a´¹%VïŘÚ{ôÇ3«bÔ÷ˆ®†K2æil½ š ¡$µ1å4¬(¹Ú¶Á¼Àwq˜5ŒÉ`Q™€ñ2f0Q‡ ¯s ÄËÍ18ññ ê"·èàz)»ê‡Á~öQéÅ®O†gÏêeœ-‹ÝeJ·ϺƒëÀ3¢Ç“§IñkŸÍ1;0d€›ÕߛådÜ1ëÖ1õ¢…–pƒ2yèMê4iáÄŒ_BDDHã\Òÿ¡<B½kkŒ¬ÀÙÇ»1ʎ” ë± {g;Éí5ð€Dˆ±j/ı !ÌÈ+®`²’Šau„ f½+Šà½(+däPÀê&ÄRóÍÓ@ã2·‡pâÂK'҄ú’!µŒpmÆNڙ8ýÈ~4Q“@F „{&;wq½@”C¡uÞ5àÿ¡ —º7!ÓA3Ô$ õú£Â¬ S»4 )Œ€(„5œ$À0à– À@ù^žƒ 'óìíÅ!QL3RŸVÒ5£"äáªá‰?a¥¶©’à3±N¡ ÀÄˁ`:/Q¬6ƒ5þ BáWEå5$À‰9¢a€@ŌCã!b‰ajjKÔ À”›ÙçR°öÌ؊QîNÝðê3²ŸE~¤\ooÑ,‡è M&¸[DïëÍã>v¡4s¥I#eô±<‘ Ü‹blì=£–¤þ‰> ©žèl]–p},~‰1qýÈã5P ¹TaᇸÈp6(:B{¤ïx8×áú›GFæÑdGÿ]VI¯EÊp͝€ÄgÑ)9“îdØÜ5΅­Ó9|»us#<$C5@bÁþ[h7?Ô©ÖþQÅèç&}Kwä¢ÞvpßPÔ3Ïn a~`<¥J̟’ý‚×<Æ|¢"•ùt¢âg8@á¨'3g<•ÖÛ¶ÁXÃь˜R¬>ø‰+@1jÀԇ¢)Gšj¹V$ãö1Ž2*.󀟍×;â˜Á!Kïê‚ÀÝßÀœ©Oa:ÞPÉÍkHšˆËÔLÄÑ¢`cR01ô’´#^`Py«Å±Æ2«¿{R0bÑÕB -ûŠÚ×HéÀ~ê=FÖ¹E¯É&ҞrŽ½1zÚ;´Äˆð‡:BH ýñ­œGŒ×4è}{  Î›°¸¸FõԐ³>§¬o‹4Æ.ŸdάâîyYä¨oª) >ð@R:s\V‡ëHYbѤµó¤÷Q‡©B#,´ÃÏY2qÞÊ¡×LΪ¢ù­Ðè¶n„f\Sx¿=†+™™ÓØA2§@XJØiäÙBw±GuñëR<‘Ï?¿*À¸†O™—Ô³Þt y˜aþc½«Â„2^D _T±MõāFÐs雅¡­ cwªêàמÀ´½À{ƒE¥€VrÑ@c– -îÔ¡½GãX{Ï´ªZ½è'j2#›cƒjÁD}Ò߸¨iŒÑ“ å-5Éiçý4꿇ßvÔk+Óµ8-˜sIcèà‚O<÷%­@»]ƒ,éªÔ©<¤$UGبڀ¥õ#Ð-kڎ@+n/,}s°‹'žšÌºMûÊ¢x‹Ñ®­Õ×pÆ槭ymĂÛ¸ jo5/&ÈvrbÈàÄ Ú'Ú<ü5³X"sEb˜æ¤@¸R4švi+óN´à½h˜„&¨êx?Ó§†ÅC0¸ én @†`BÏðd-LL9+b5š ¹Yc‹ûƒ16¥/‡+Kð]ׂ(ٮꞡ½nēÎÙ wŒÕ´°¼°°£Èõ -<0¶jYC”"1®I¡A$D^-©vYO×j¾lêcåO4Ùκæ›e³šk:IÍE£k1ÏïûT‹­*£®üiÒé&(½„Q-êƒnèiê yhQjIæ¨X"PcP‘pj«XPiåš4†ŠŠú“Þ„ËŠè§Q“¼™ò¢ŠÖ°óëàW±s±XÌd±*Æ«uòԂ‡15B˜—`FWúۡń©Ó—éßÇ*1քúp²Æ¨“öºï “öÉ£àCµúfK{/ºµ2ª-Ùó=ï±ÊA?O#Dé¥Å^{MŒ 5 ¬±ÐӃZC™D<·]C—Z…CjhþlBc0•ŽOÀŸ¬gn·MŽz †Å"²g W( „3ÃØ ‚Ëü´¡Cã 8§'íE`þFFÊc 1Ì6yæÆ$5w^²°`±“E®Ú.Ÿ〴À4ãÄY+©(¨›—ÁÈBNë¯yª†ÍÌݐÔ#Çq\&K¯aoe WI‚f45ƒO´ Á’§ØÔMp5ê†OáØ¢ñ–÷ܙ±7åÞÌŸGø(rº` Ú|; ¸Y Ô¨Oi\t0<åÖ™rN³G µõ²ôɐß_ÁÆ ,,Xn -} 2›Eæ) h´0‡àæHCe³?ù{âg&‡\,õ´4U&°ÀÉīِ̍šìm<Û¾4Æ8ª+S±ð Z€@XÈ<3`ž„‘§˜gÍZ•û;÷ù^4S=º%Æb!åþ‡TlfFÒásPã2'Ç¬)ôÜÐÃX$JÓàʨò#N`fàøªÑÃÐÖAKѲ*GKUÎ@pCƒ?=w`oý4^3›S 1†œ¼ÉRm‘²˜diN8[¯¼§?Pÿa\n UÔj²:«mî«ûØÉYW–`iAœ›¨ëâhö tç~’†¢ª¸Sj¶ÊJ1F‘M ñá³ vSQ$|©º -@¨Òœ-jèaVj⹫ 3Ɓ™ OÌ% -^ qt#Šó.Ǩ^ŠKÙâ%ùL!Èmœm:¨]kÅÉÂÊëÏc1Qi“^b-Oœ»ìÑ×4ÐQ§†–!N;ˆ - Y¦榪Ù1`?Í¥CQRãè¢)ç-[fT—.“‘'ÐÆꏧ¬óç(ed=Ѥ–¨†åۑš2:XôÁ`¬(uÎâ^yZ[SðŠ(6íO?}ŒWE0£*ý ¹á_˜I3ƒ %…RÂ`zs5˄BŒš½ “Ã0v㏨BÜ|P™.tæ»,Î[&Ô¢L>™Qf1 ÑVl:|vÁìo/æÙþ˜Úþj²‡Ÿ&>þȌÇ'÷ÎH·J€ŒÝ üyÍ<ÍEWÓè̌Š}öã°¨ƒ³&?ÆÕ·¬ÙrC¦j¥O} ½¼„♏¡Ú"˜°&>†½g•÷d¦<´´Çø_[³ãgv­²ó% h6C͹¦8Ίv^6­x¹&<†-PÍwœ0ÃöíÒû=Æàَ-:(B„€”h¸­u²ãžÊ4¾¸µ˜hOuƒ¥Ø]e:Ž5sÍtŒœüIj¢ãh¾øu¦czú4áìÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc a)ˆ“èøôL»Ž!VȜc¦á{™œc„4"¬˜cDBPù›”c6sºû„SPï7Æ1ÄD™âø(4Çü{¼ái|žI7Æaê}N¸ñiÁÛÎ6F÷$r<Œ6†l³1h´1vbN¬dãд&Øx˜ÿ\㡒¹jŒµB;'Óø‚[5îDcš>ÊИ³ùùLž1ËÕJ™kë˟Å4¾‚"ž1Šã®çœ8cP2²ÓŒá+k˜1µÒ'ËøêŠ=m(c¸×‡ÙröϗgҞ#óLýÆ1FEé¥þŒ&½þ~P¿cü]®aŒ}Xø-„1Ž‹ÚŒál¡ÎbßCÑàã£FÍmà‹qîøB6z1„d¸Ú€³DŸNÀ‹9#‚“¿Á‹5Oªu‘HÔ'ጼ™fœð*ފ‘Æ—Ú}ôr&»˜Syyo0°!)K°‹qûØ v1ÚO!ã½¢‹qÙMˆXJAõa¿6 -r1'qTÙläbYahHFˍyº˜ïÍÓŁÌtÙi”Qwn1V(Õl1@T-YB‹¢he6hñƒòï$síôò%Xüܖy­¼bñm®øñ,´bœ²ÂŠ¡À¬b|‡ŽË¤8¤}Ôã.¤â§éS P1ß!|Éâc2…‹¼aŠA‰ÅZ,(Åç#¢oPŠOãO6Hñiµb@ŠwÀ£lhí6Dñé¨ZŠQòŒ_ -B1þ>DÈBdF€ >1ÕóíN<1¼ -øù+˜˜®r'œx(?hbDؑÖØÐÄ,15ÈĐN¡þ:têÝ—ùZˆ‚K „Ü¥Zê2ˆ÷N%F ‹pÌ -\„¡ÇÌ$&þ¾Ä»žÑœ‘˜™è+$î]âGÜø&´ç üz{ @xh&N|0ô½¿Ñƒqøì -Òdʦîè`í’Œ[Ô'7øàð·Qƒé!‘Ð`¨7›zYª&¯s±°!ƒþż‘Ä`$Dú˜ÀàGœ¦líwà‚Qԓ\­#Ü&^äTñP̍Z¤`ºõ» (øÒ•œà!‚db‚ãïƀ?Š ÿ þ*}¥\íØÄ&^; 8ÿ^ùÀa <0*œpܤû•ÛàÀóØ=ÙÀ@ À¡ 4ðÁå´¾Þ©¼L%T ®zM4ðA‘[»w40¾W±¬Íþ?+z­áÀ ˆKÛáÀ(‡¥Ì%ØÀðÃڕh`¦Ïs') 1¾ÁÀ¯÷†ccr¹ooX`´H[±¿jtr•äþê‡Ì¥çú z‰çræ"Á¿Ú+ -ü‹íä ð/z©q¾ÝÁ¿43Þ%$FÙ#Ù¯þ-,<ëø"Ç”_ï‰%ÚõLî/-w¹ß¸¿8`= ï5÷WØVSӔ ¡Ò£Ž7î/Qðí~’û‹=yÁý%Êö*íûK3Û÷ÿq_cbù£7ì¯h¿­Mì//𾟉ýå?ÿÓd„UÔè¶>±¿L‚ñ% ì/ytö™*±†ýŽ:؏9°¿z æØ°¿ÌÐÕ1©¿ÄÌbÔ_¶x˜è\©¿ø…ûd›ASqJ‘AýåAûØ©¿¥V0¨¿TiU·ÆV‹º­§¾Q¹+‹*‚†ÉßàëÔ_XÊú¡¤þ’–Ëú‹°¨âÌAýe|qœoÐ_&êô]™úËð‘PÔ¦þ>¯ÿgCœú LE;“ù þd-×Dþ¢;Ot#þÂÊTY¹Ù8'ïz‡ý>nБ¬_½TDbÜ/.„SΎû}Aû}Š Š ûENBe%+ë±Èê0¦Üoên&é×z¾~o¬9'å÷¶Ë”_fM®çñ‹úõs”‰øelNáÆ1|¤®ú†øåU×£LÆ/?Èl"×ùÜ¿j2 øEŒù~ñ7À9+ß6TÑÞG dº/)¨ˆ(¯pßB5À1î«À¼Sjixi¸Ó}9¨ ·qTS)rî‘t_Þ- èݗ1|•‚îKc°^NрòF÷Uþ§_I÷U‚&`¾Ý)Ðg7º/N›Ý ‚îË*#’Ý—rKG4á¾ìNQU§T1 -;ðٙîËû‚ÁïK+< ã}™µG°;ð¾00u±á}a *ðP­û%ºlà}i`öaÅûR¹y#ñ¾ì ø¾M°¾Úù¾Òr‚ä`ð+7cI¨ù¾¥:Y²~aåš#¿’|j³K£4š´l|_émߗ„ƒïKôà#¹ØÅüªƒ€¾àm<Æ  ð ++‡ð[Ènm-¿4`ìÝ¿²ÞO~y V_šð éûá—=,°` ¯ÊBPÓ.Â/{ÃVI'áWÍÔΞ„_ô!┄ßBF¦¨¼“ðK¡÷s•Dü–n貿ü›ï÷Šø¥µ×$üJ/^•Gl¾ø#üJ ^”î ’„mF’ð+í÷qï„_úgÕÐ'±*š(ÐÝ Æ/êHwÛ¿0—f¢/¿°xú2㗖ÈwNÆoÉþFüòX‘Õ" ¨a&ð6Ä/.TÎX ~9YӃÄ/< Ö_nˆ_j³8‹D[¬pÔÀք_܌‹6Â/DúF›ð‹wì휄ßrz‰µ~Y$DW0¿ì½¦D± ¿tÞÕ2`!ü–HÃ'ᗖËúx™>ºý˒ã,¾çð+®D9“ð‹÷5ñ_AøÕkpðK+^ã üâèOò—„_8qm„_&ðo!VDÐ9Œ›¯ £ï„_üy»AøåWr´übò8®±ñ}™é;¯‘|_¦IKIx/F¨[؉øÅpç<' á~ð;0ømçûÂxÄ{kfxD÷…èNæ -÷eWB…‘ÊCú £‘·ÁŸ-6²ï¸2¡@¦ãe8¯™½è,ÌÌÆÂõ%$÷~¡#ûâyÏø{Åú¦ÍXßÛÓsðzÁ°Åòv£ú^§¢Ô¹‘IÓÁô¿W¤oÚLô}ÿ5‹‰¾÷¡þ£ Ï÷ö<ßûÐÐ8_ü›ºÑ|±—ç¦ùÞÖºÌ÷>ô&o,ßË Žå{Y$_ Ø@¾¤ºö–_þ-à!#Xˆw#í°Q|aÄ{_ü—&¾Šò»"|¯ÃÉQ#|/·¦ ‚/Ãâµì_döpîÁïÅ'ˆòà÷^ÑøaÅ÷Ë5ÚTHë¤>Þ;ª„ñ+»—6QŽ™ÍÆ>¤AšÜ šÒ©Þv)Åw¬3¹½È¯"#.l/˜cÀ.mÔ^jQÏkh/2Æjs(fïå¥å†ìeï[VàŠØ;¼N -`/ÎÔû×˓Ó̸ÞáUcÐz‰`ƒj…õ²Ú /§Y½¬‰ƒRɨÞy…Ô›ÝK ꍎâG~Ýæô‚î0½W€Þß…Â#ï配 ØèáÂ+½$Š!Ù¶zE9|‚Ï‹?k“Åç½­¬Øð¼0>¢ñÏ u?â÷AçnÃêçEÝÄÁ«›«W6îpõtü½’yÓf0/h9ƒ š”ÄsÁ²ay³v‚Ê‹ešÓZAJWú+•VµPLŒB”óN*/W+œþW*/‘SlÔ~ÈêSy¹éþ+•“CÅAå…GZÅqdY%VÑxø“Ë.xÅÁäå9ÚJõÑð/nStgÁ|ŒSw€Ý 5 )Š®¶3yåaÔ;™¼0p¸ &/ lv°2yé¦ñäÍä%ˆt0y?8*ŸÓ‡ùc2y¬CQÄÆ䥕YD3y«W"x˜c9èÊäeܲ™`ò’›ÁËÉût½’—ÎÕ ys…µ¬ˆ°‘‚²!yÕSž‘¼4à´{†‡Âš}‹šýH^Åïü­jû98LlD^F°ð~‘—1¬Ý‚ÈË æ’È›®¥‰¼|!-jY€>1g+‘wµV÷Æ`>ˆ¼¤d`ðڈ¼TÙw_…ï ¹\Iä -¤>;‘—ÊGjÊT~3ÐD^gpp½\[¨‹ÞÛà颪® §û .|ܙ)`º,“¯·ÂtaÄ°,]Ö==QºÐ`#Ø·’t)Ö>Ïé>¡GÇ%G—‰Ã‚­KAMáÆè¢Ö °«¢‹úÅÞ&E÷1L1 ºãÈCY ½&Ë.b·Wô¬Zw†.­·šØ ZB´iy’¡ËP:ÜÛ ¢ËVéˆ5Dó>Ã~Ñ¥q¾¢;6¢ câË)Š.‹ìØ(ºpuâåPÆ ž;AÑÍ|ñFÑ¥‡ÆÞJ×,äŒÝžÝ Š}cŒîã\×NÑEÈ÷0˜ Ã""¾Q¼Á5Ñc¥ÑNÐE-Áánhª‹{¢Å—ù¹ØÉœ ŸËÊÍ&ÿ›ôÜ'¸ÅelŽ1ö ž«Êˆ^— Ñ· ¯|Òsg¢iÅç҇§® ð¹\1±Ðô\F ‡Kë&—qÃq¹pÀÁ»©" #„ܑóbÂsUt×OIÏ¥…=|7z.÷`Yé¹¼pL7¦çæß=—áddàƒž«zæëIz.“j,­X鹌À³uà¼C¢Õ çÒ]ÆÚè¹t´ M z.’¬Ã -ñaaåFÏåYµ–ð\Û ¤ð\Ö-`”Ý๴òk7<—Ž6†çr¤CáÄÏ¥ˆsx. _iÀsa À~£çryÚˆà`֓Ïå°q+G5ñ¹\®âÞ>o9kŸ«Ìg}v|.AèÅø\¥áKI~.’n6~.i)]‚•À"nü\%4šM~.E¨ö -~. M¼\µÇ>…ï]ñ¹Hð鞟KP ÏżM>ú 6·|.ó€Œ9?úyÙº š1“ž›ÁÙÀ¼]äaø²l]X;)£肿D"ºH1µtI€ÃÚ5º0ÐÍ ‚. P¸n]2‘ºÂ՜IJ~.÷bÙÏÊÏ-§}»àç¢,˜‹’àçªüFÏe6­È¦’‘çÜå8¨CB¾¿ÑsaՏ™ž[jOÒsi@8f£çÂÚñÀƒžËÍxLÏ呋ðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ…*êÚv€.’ºôÔr³êPt§aè¦5º… 4¸Iè拹!t™}&A—×È£A—鵪ү)¤K»`è2¹†uM0t™!C ycèòµÇš– ]s#e†.ÿ+Ñ ¢K¼\é€è2Y¨î«±€Gh_áÑ%ªñ(R”\úTÔÎ< ºü¸œç^;‰tz†èâρôb@ta¸Xš¥Ê°2S]Üǖ/¨/OU*×]怙¶Š.”w¬Ü)ºxà’E—D„KdIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±ßƪòEƒüu¼Ñ……1±£Kߔ)Zct »N;ªÀèŠÃv¬+º‚HŸvŠ.” -EÊŽ‰Ñ%ü¡º5ûÄè2<ÌÊîÀèÒ¡{>.?^ùŠÑåÊç˜ÆÇ"…„è¦acèN«±FhStù~ðÍÿ«Öh‘ã±tUœ_  gŸ«µàç6;>w(–‘ôÜ!5yÂsoù;;÷e¼DÊôVIt’sïhW¹‚sor‘—}.V]5×Z֝š{;bj.š©ˆöâ~RÕ©€•™ 9ò»fæ"¼†hgÀh«_1Fø€ÌE,𸗋zÌÖ-zt¥¥ËÅßÊH –‹¿Qg¶±rIF§=£r¡¸Çë“gç&å)—ùxÔ¢)AMÎbz½øð#[8¹ÐZ¥Á¶=ü’Û®¯„\øHþ —=ùŽ–|\ÀæÞñ¸Íz‰¤ãBþŽ0nքÀ€ÃDž3V°q››$·5©²v4n{¨“%IZDÕãA:œm0V,n,¬1—¡¶§%A®‘W&.â}qQu£ùYJšaÁØÆő‚)ãp±ÅЦá*–òì0ÜÓb­`ážnL(Ü3&¢…„ ½ £÷áB€XppáQâãÜ0¸»2×f -.tÏdà¢Fkæ ‹<}í Àş qÿûà-Üø·éT·¹cÑ&úuŽ+è·P•Uáa'ü‰b”`ßâ&ð;r4ÁÊ¢¾„s±‹ŸP–L0ÞïäÞ#6ìípˆ ÞFmu@o‡a -ó–]-ZOämȚxÛ\Õ½o¡D¬baJ -ÆMgÞ-â¾t7Ü-åIÚíéÖR»=-ÁÜX·0"f¨[ð:à­é¿TL¾Mç¼»¬ 8·ð¹à×æaý rK}´f܂ƒ‚ïȈ[ܼ_áFvM1à„L„íƒoۜxÙø¶¬ ¼-þFÈx[ü‰ ÃF·Å-³pÛ6¬“0´¥s°¡mQÅz8••4«Šl‹+|ŠזÅØ_ÑF!€ Ú"i:®i[í Ó#¸H[ü,ôF´­]‹¿Úv¿@âٞ€Þp¶È°¸¤Ì4öBnÀl©c¸Ïe{¢Ùѳê s'¼È Ù"ò„èÃF²}Xv_&ȶ+ä–ÛK½vŒí©ðzRl‹çTCloé¥7†­êJ"lo¾Í“`{“”ñ°{‚ð{óko•,˜^{K3ôÆ®•ì'ѵ—Å:&×V×GíäÚ!ÞH‚k-‹Mn-EÌïØZ†3ú¤ÖjfIf-2®e¼1kó~d-Þ[¶‡0±–zŸö¬mòr‚W[={®–µÐgßiµÐŒ+YµX{O¨Ú¡Z“7Tíëôž¤Ú“±Ä Z­{zÝAµS`½gP-•îà-¥ËÁÒ`9 “TËlÿ)«áýåõß4¤®ñ·÷¾1¦^^ê&©Â¼Bª nUpj‘L£tÅÔbe+(µ¨‡;ÚÓõˆ£Ô#½¨Y - Ö¡_úç¹ú8‚>-2–ùž–œ–Ñw:íéÏNP…1 ³Àª8_6Ñ´wÉÔ,X{ó>¨À, ,ï7.-Œ—³œ'ðwQ®[@xUw"gòÉëS·–¨‡£aâ@ßì4®2ØÓñ´Kž:ÏÅ\9*äV=²(©ƒ@ ;#ÁÒʲ+ŦÅu0¸ Ö¼ìŸj‚‰øM° -`³TÊ°"‚üQ‡dJQñˆ¡Ï`·â” €­ÄU*òS$°ÚK½°ªG?Â,ðbg{$lÐÖºqµ¡õ5‰±ìÏÄå+`J¹øR']«K¢­¦,¼‡ÇSNË"Û¹Ÿ 1XpՊ#Aá WJüIög„eDœzŠ5ý$ ©øÐÙ­ëps1.ªêå=3S•0lÏ®–Ðþ -t3¤½…EªbDÜï@|¡ã„ZãQÑY‚N¡ÓÝÑôvmn#¸ó—{—ãم.«ó{ o–’g o‘]9#‹ÂJø’`©·ž\I&>_.Ôñàý¨¼<ߍƶwÕô‰¶‹ÆåvMm®ñ‘EÉ3[\?ìÜíbøxXǧ¸$IDJF/Òr]ڐñf ¯,,™Í+ÍO0Ó§¨AH ÆÊÒd|ˆ´dùÇ: -ÂÌdÁìøSç€I†4¨ç(7ƒ¥å̍ZOÝeƋ=Dæ‘¸vãôòhÂâ<“#66\˜èIÈ=8æí(Þ[<5¡®‚¤¬Žù1Š<ôèµ(F˜ïBÀ3þå—ë6™YܪÓçã¸ïËåjö3ás.‡Žax¤«Ø,¥T—Õ顨< °°~1Zˆ¢À X'‚À…dc®Zûc-¨ä§¯€Mæ -£gq¥(FÐK丙ø|e\iKg’rÓÛ5ãߧ×)vY—OC %¥bÑ^vsXgÔՊe:¨H*ìÒ<¢ë'Ì£ŒÀa!ˆ -ƒ¼]ôWOFè˜ €…•r ƒÐ_ƒ…þqo/vêW.ċúu ¿óZª°Îþ`êƒc‹ý®Ó \rCm%³°0*›b -ßp¥yZ$Œ²´Ã­NÔČ]⪻™±¨²5I®}‡_Ôfâ5NÒôÍR8pלæÉÖ¼tDÙ ¢&XX&Çm¨ªFUÑu¥lɎf áêù -œæ¯.–[Ô¾ô¥Y”ÀŠ³h—TÍ÷h4ŽÂ6¼ÙäN¹Ûˆf5èOÁ«ŽØÙ·²Æ ÜÁ.Rî©å6Ö¼åў\Á"Ø›Øßz6œ”}©·e=ì¯Bê-5ûãjખ\^Nù΁Kßó­ä6-\‡_·ÀCÚ¬ff†«å®º "âý†ª?Ù èV#Xõ ƒåœë†+ ºÞzEï t㆓^ŸcÉ!ö_¶®Þ3¡ÓÇK¶qõŠ‡5ÞÈYV€CÚ}j¤RÏÓË¡Ò¤_Õ|E*•‡øя—¼$c™'›JRçÙè™²»è®s;/ Ç÷CAîJ•bèó»é%¼×ç•n‚a֏½ú¾Ê!Ýfs³Ë:p}Þ]C(ÓbPŠ¹5°-Nˆu%eç†h§ÈÉòŠ÷ñȖ¶«›Ò¶r>Q[ÑísP9J€EBãäWŽôWÅ(x ‘eȐéÌ i‰àX orWÑEÌiÂò©G+^)u¹cܵVð®á1REs¸dW še‹”û±ÌÝpÝ^jњ¢ì…À+zú - â-)}‰9#Ê…ù4ýPZaø„º]x½»5L›¢íª,DðX¢BYÝå]‡ÇLj¤”™ò|žEZšÊʽgš]JÈ8/£ hÍÀ”´ r#mñ‹~ÞÜÐ+4úY¤LN‹1Þ3¬§ Ýdò'ðõsåœo/Ð0ð:üL/)iÔ´Y^È4’¹),ÉÞµsÒ\È[7áµ£÷På„ï€*_Xúdõ¨ª‹‡{Ü=K½ºñ ˜(€…k<Ñ9 -‚ÂFGÊý[En'÷˜åŠ¿Ûî²»Ïñ2¨H Ò8}j·[Û4.=X(Âtâ±Á7Z‹X"_=NÄÓâ]©bç®=cqñ¼_*3¥…<ԎRӇ]®"Ýe~jEŇ¢‡1ð}{ -¿Ríz¹é7è8¹l¡€Z ±îe±& Ô/ƒ·Þ¦"NÀ£`U)$†CO ‡ª`WŇPïȘBþ¶À0õòºÙ)ßE²T±k´úcöȊU?h‚vVmƒpcËEí…`dú+WfOé0 vï¹¥ÌÌ=YWRéª3k' §»¬ùƒe̞a„¼àá!ÓÀ„ Åè·S 8Ãy³¥Æ­+Å 8µ'Ëpù8«ï=&vê=šâ¿Œ“Ì@$_”ÃpqµVÊios8-Ë9?n˜/fnUóX -«ßœ˜Šë·ö¬ù±ÙޏãôDŸ³\wøŽUŒ¡ÒeVCæ˜çâ‹A"3@Ç)$þImž€¬yrüCÄÂè®Q•-Á¿?´D¤atwB.Aï¢ùnÚNhë¾´!ãڕïjK]¾2Âãx¯jyœÑéjÍd)Þia„ŽSeã~¢vÔQBÇoI4 -îÇc?‹‹+#¨œ=&œ*‘d`µú‹·ú¶,”/ Üfö#׌žÖíºJYsՆì?ÃmØU-@gÌBy®°žh±ÁΣÕ·&ž¢GøÊ ÷3}¼žCMÐ:»¸_žÓàQâ7g«@9g@ýÜ¥½C ‹jÚ`I11Ìú8o‰x*éMÇÊߤ3ÉÝÈÉ¢t.´(ªÄ«Ú]ÛS‰ÀýF؉ƒ5†¼c -Ìú÷#z«žûs$F–Ga–ЪAºI÷Äcé‹iø>|}ê€k´M¨ŒüÂgåv¶0ð ¹ÜU òP­ÄnVə _úÑ})±,30ô\™¿Þl-3Xñu((ÅNƒ°H–>ÂA„€á‹k¨TÒz‘莡GÎÅüïËÝ{`áœÇM®ë™{Õ2V›pÎPÖu¨íˆìáX–LØÕ}¨šf4<ÔäaKrAæ‹îò{@n§@>s½'‡ÔƒÂ‘Œ?,rD Vê;6¼zÜ Gß-z*-=„èÏä$ÿ‚YRB¥Qc8LõƒEpȕҟ€Yüᚠ¥áZŸ2—Æ*ðqè‰z×ÓJ?hìç"ìׁ~EÙn“BÂ`ŸË|Ϲ݃ÁKõ§„ ’@¼´¦‹‰.Kò‰p¢^Óà›Ûœ ˜Û¹îÏN…ƒiah>ñ ÓÜ=ž.ç7ì 3¦³ç½$ª•k­²>ÖEȃ¯¸pƼ}÷Ïg 3Ýî̌Ðõðv’b«DT÷m!ª,¥¿AÎeðÉÐfâsAäAi˜psõ¤pr.ê\ñZ|¾,I£¶€6ôD‰Ó‚µQÿT #B -•¡vhŠ0m”˼çÂĄ´²Q´¶S?ÉUk:]UBáX=‘UèMʸÒbt6˜É=²cèúŽoʸLHíl«úÉC µ˜â`õò À;t×üV‡@4?˜Ž>LÁŒÉ Åê`ië®nlÐÔ‰ iJÒ µ. -a³J–5Á:Ü¡¨7GÓØțQ²’³v>Š‹o_ª"0{C/þh¡v'ƊvöŠI OÏ¡,%ñ8çø kßÇ3©?gî9¢íÒ-´`iNÀèå]U–ûë¦ì›^/½ J»Ñ)ˀ])³\§:쨩Rñ¼¿„¯RÞbFvZ<¤t÷ÑÉ Ÿ@ݐnvYÅCý ñ\çÅÄcÜO£Qs+¥fÎÆY˜ùsÏfü®X Sr{£D9§n“ã:Vôóòs¹ìŖý›VCuLJŒØüX¥Ê¾3ÃÎÌfÝBáËx£:ÓÜ)Á©Ã\ߎ¢]ë„JœqÙr-*‘9„mK4†å!fÛôE¶¥Þ5œ+XPÿÃP0ƒB%¤¹Ø±¤æšþ;ùžŒÌ“JFÉÛd88”×I5&´Ô-b%É»Íð2±â.¸g-ºÄÓ̜7+ûf,ò`hQð´¸Àà}zÐp'©îiz·h`5BõűÃßiB?óGw§êGtŒT ‚ Xý}ðÅ>§ŸöÇä23Ê©Èö{ýcš©`Ã"8?aUQs˜“ 2’K]b§(ž¥]\;EÀuj‰§w\í¹é6;Mœç’ØûˆŠqnáææB'æ*wî®083 -Û­E9÷(l·¬öŒ¦’ø ª`Q®L)h Å,ãXb©šúXÍ]ä*²¥8»VƒRbÅøÌk Ÿ::3덭z«©<©,Á=•®ãª#_§'$œ¹h¡ •â‡{ÄQwÓ®¹«<ÁÀ)QfÌn+Í5t´‹µþ>".m萝Q°í”ÞŸ+)ŒÃ±–×T‹ ÐHÓá•2¡yôìÊd§ùÇx3à ¡r`ÕK¬­9¶2p(ÚtR)AT KÁ¹«Ízͬd&²b“; - ØÏ¡ ®SÊ,É„aÒ9'צ[Àæ¦ÃZN -G»ÓÔ­R‘S«°#[#õâOZâS¹C‰ä/‡RññP֕‹&­«áœQkaÑTz9HÉɤ¦73§ÒÞ}ø ¾£½‡Ó dXfžò¸„ùJêA öa‹‚>¬@%(5/Ý¥zºPhôª‡Eê°~¢í41ÿA'‹½3=˜Y$~Eÿ>ä8)gº\±‹:»6¡-sOéA®hˆu…º»Vç/)dæԘc¥¢"ùæiºEzVDúã -¯B³v|©·Ê½¹8ãúg¸Ö˜u š|ªjVðԖ¥̨³„YJ|X[¤– QŽˆÒ†š¯à0î’æ󔪎ÂûmWõWæá§VwÏ*ÀG?f=Oµèrh‰þ$Ÿc¤_…4“EÐS«r©v_¡†"(“OºÌ×e<îè˜D¡ðMj*ë^Ã¥nTî©cÉ°Â$u¾CÅ.Pq\žG -3'.†<6šéÞ3k+ÆD=Mekâbi×,瀯)YôðoÀ풴Ÿê˜ôî·Î¸æ7ÆNÓ{a¯o`E ú1Ì·Ššžðô.-³iÝU(êþ,Ú/Æ'»ý6µ‡eDpût uݬ;gAé3|ö̉ðWe”x3beÎ6,vl†Z˜Ïí¬g͛ֆ‘hê}÷9v$åLU|¹tÑt¸˜ÄL€ðÁ -7ûœáƒ7à’TŸ'w•Ç–*§‘Zû÷]§U‹EW´œ -Å»´¨¸ò©¨—u.H]%x9[‚Æ Çu#Ó*aaÅd(}±§¸*HÊqÕS,¹bªöñ#½T2e€}>R.ÑY4FÇávˆ´œ~Èp×{”¹+yd4S ÃjrÖä€Å®m®ãÜî mbÒ;ԅõðŽŒÆ8ŽÓ]RÖCñ^‘•Òlež< -ug˜Ôq†:–=ûpÅGÓ[ÿ¸K.,\@nº CΟ\¢s®éøŠ˜u çë$0¶(ÚjÌç\³+r8\Ýi -Á§@NkÙÁñFyFî*Šš`)o#ñ|aƒj¢Äc@p&$š; -Ṉ̃u ë]GˆtºÅo—9x¹ TmæO|0p’G\’=å›[ÀrÍw¾¹M+n’VTՍK©«VVë‘F—¥ÈG^¡T“sAјé0ä£ú”Ên!óo§®®pb3d‘X¨ürE”чKTìÙOoª’U^UYÈÐ(ƞì(Vâ4~šËQØ"/Õ"’‰Ä· ä—°Ñ<v¶ÅdËhoî*j>œia¡s”Ô'aWŠ-a9îüÕÛÂ`$#p‹ÎNJbô-„{…ü¯ê»¯¡T—î.“ª—äíêFDaNÍ¢3,Û¹p‚Ûqe<UúÑ®ªg¨ìurQ– ³BôOrì¼¥žÛñŽt¥xpJ€'4½çéb oL‘B*‰°$æâïÛ´~ïÖ(Åº‰®8ØEHŽÕ^BQ–*-ª$Ê Öæ7z›²XPœËæ4?&W6²dTöQ=»ß\¦ñڙÙðn9 ø÷Ø¡ôíÒJä}ÃR½Êœ+£ìä;c`ߟ¢zÑC»IH¿³üŠ_F”þ2z]‡õ|FÔÁÂÁª¯£ÊN°§[c)·¦NE2à Ép¦ás¼ -’0»Z¤ûtnñgFúÿcDÞ ,‹4"7`2g‘…Üña´õlϼRRÑHR¾u‡4 CAñh”(Òkø½Ï UΟJrܐț°î·úKQc)D”s­C$’ Ô±A¯Ju# -GyÔUÏ#ŸÅ£ßã¦\—Ç„Ã%:ð%AÄkÜòÅúôŚ[ÐÁ|êŽý¨¨Zh’ºJ£Sž¥@Gd”þžÄ¥·ð÷BÊP"·É¾ôt…™Ñç$HWÐÝâpñ¬/¤PSéìKáçðÈe.VûPÒÔ,¾ÓCmñ¢]`+TJñ «S^´P'P]Æ])-«}ALÐÌG !Æ|< Ž¡5¾BÖ -O×RJ -Sh7× ÿ>ªž·V-ՒÈy±Îɛ׍#K)ürÛ¸LDì™tn*ݚ%¶´ÌÀáñ,fªw*ïM¸aZÐÒ¦gLwš‡‹Î!*R_èµü°"øö‹’pùˆâ¼è*eW¢Sµ8"W€AÈþ(X2³ Õ9uئ䚵vk¸â$=ÜhG$ã\C4 +)ž8´®'ÀùÝKu¾Tæ³"£zäDú§2´Qb‹Æ¹k´ŠßÅ9µ 8óG™‘*¦C!7º*˜.•e(ë è%¬Î Aôî=ÑÄU^)ˆÅ2=PØ ›1;7Ïõ¶2_÷1{8öž!þa¢ ­ž‰!‹ÂÕ>¬ýV„¡êƒqïb‚,,‡ÊÜ°—9ëùêZ -0”Ÿ+Q²Z™áD°è5Ñ -fo֊w ‘Ìt‘F@좸Ï7á…ZYª¥†9Â3Ã/TX"ÝÝ؍©æ™/ÿ§ª7RªÅ\ÊÀúEcÃøóÒíž>›Dþ¦ªBU<|3*EŸ.&Õ½þ}Ä5’¯&D7ÀèeC…-<áêډÜU”x,fB@ D@=ýrš -ÕjIÊ8ãQ_´©Nü¢òŽrQj^óæðe9ÛýuàóºLz¸'DLY…Ãß?jfpe­åVAµ°OĦŒÒ´ˆ˜Ð¶ú˜©Ã!ãÖu³ä•ÀóX—² 896ÙՅ†É)Õq/MZ\|FY“‡úÏñPUׅ/J`ˆ*‘Rwx™rÑ{]÷ -Ò29k̸ÄN}1E,Ý›yTÅNf,õf‚ª²–IxHÚej -˛Tý¬¹Zoâûè9Ñ šhÎ]èJ»{p ’ýMˆâ¡¸r^³Š™ûF-b×ã'Ft[é^mr“‡É÷[§5÷¼ì@,~A€“P„ÏÊeZf¯—Ë]£À»+ÝR‚Tºs·ÜƒŸU7ÚÓÏ4:÷²Â³ ¥uÞ:W¾¥¥‚s`V™ 6‹Úì>,/bµóõΦ w×È=UV -³J؆@/ÃùLÔ~âR Æ{^FÆ@X£†“£Èä«LTmaágŠ’µ¬®Øâ†Ãi’îZm~ñãZSȨ2Ç3c- 8]*³ø¡S7x)o‘»vo§’þ}mÐÁJ?Éb)ò´Æœ ›1dÕ-Qº¨´Fˆ¬q ìÆ´hWÄ´T zY÷T\.ÛGnE Lwd-weo‹,]•vê”Å¥ÚM}ð ã]~ô2>Zo¼º r®‡<ìñÖSklŸª9áÁî[ìDvØAè-JЋe˜Ïø[©0aswsÅùÅbü§¼c^舆^EôWŒ8Ô?1I_¢vwÝ©}ªb銮®œkNin„8«.^Œôez‚6±ÊíQñ:9¹”É°ác¤ _sZÃ<͎Ô-Òuœ¹] Íˆ¯,ª;-çZu¬~\ÏD¢âNBbú¡Yóz$¯SZ‹0ÝÔÂ/aE]’º†Ý;ê-D%9øSœ k5áÐZ‰"z²:Œiý9³Šª °¢ä-äfä) Øƒ¾,£Ç—]ØéÌ!z|»Ý¹jQ=îªêW{Xë)PKu ª+_ƒY÷a)ñGX®PfêŒË«ÌómƒŒŽ§¸A¤Mâ;BcÝÅ/ñtrLiµP oÐÛgS´¦T›æMX&t`:M0%¦)ÜÝ ¥Bû²‚ÃoHꁰN - [Ê~Ñpœª&¤½È¤Cç̔.1i<Ì}¼=BVŽÆ—")yDn´¤'„¸´²ùÞ PbÝ!y3ö8vÇeIæZ9ˆ?G”=~çw€…EôX¦O‚–¥Åúva쑷åÒÂá ‡O‰ oµ!^ãrIi‡¢AlÚ;ZLÞƉˆî¾lÇnâx' ùPf ,º-{Ž¨Õ‹^a·ý¥„YÌu: û™·rsC¦N%tξþ},2Á4ó‚9õA­~ñäš}À»YQôÔ5ï~G7/˜QqA uOUü…ržÝŸ6ˆ—ñôá Å»{ܦ…¿z•Åâ]/M`Æâ™=âÓÕÌPÅᙼÐkû¸8…‘gR­ˆ©.:Y…¼ñFs#Ö>'y†–Y_缏5áïf©¤60Ì/›xS*ELyG©„å‘Wj§Ûš3GfÂ3zîÈ;\f– s=þÔ+›M¤‚¹¾1èÒeœ¤p³ -«ð)Vé<ÎLúW‹éÇnwíN^”ªcÉ]}\!ž{J;€”k|ÃѹawÑda± ûa%Í[ÙþÝtU ÜBXŠ¤ñdŸfž™â±“͗WoW‘¬<ÙÚ£¨$ÂcY ³C"’{é!ˆáv§Q©ê®ÑŽ+÷¤+3ÅÞ´¿‰¦[Y`Ǻóö–'ráý0­è©d°˜›¾b )iñ•ˆX¶ÎíðÕâö²Ü’>p´‹‡”ËìÚܳV®«j†¡ÚÇYÓƲ‡Þu{/îéæ,š´X†Ê&–H.…·f³ö¼YÁ^5´Ð#ëlÞ&We (ùî2Cɸ"ÕuVñ\J.%8a,îx™1Ʋ=¶¬†ÿ¬QÜvÞS®DóáÄ[¡OpÕæR‚² .Ï¢ãbŒ`Bb°²ⶠ¯ Ðޱڗ8\~LùâìVs›¸I%é IþšS6' æ¾o+’Hgªž³ý- >‚ųº¤>KØ©…hzu•î‹„\Uç8G\jŽ(®¦Ï²w³—JéfàÓ·ú:’£‡ðÈQ–'pmù’÷¹Ïõ9öqyèKÐs'ïï‘æ7¤yNìDsDßXo@sÎkâËÙwQ” gÞç~ƒf|¿Žn˜9dò37–9*Sï&G(óh5–$s,÷(RÞ@æ(ÄvÔóê^ى1‡ƒÏ†1ç~E•8 øáðW"ËouÅ{âïö$;æ71ðs´¾›æ‘É/ŽC‰/ïN‚$¾¼[5·Ó˧ÕðòÉ.þ‘L ]$ü±D—÷ͬ¿éÖ1ìèrf< æP‚0‚ª´M.?cJ^Éåð -®í`: ]É?ÆyYîÐ¥qJRÁYÐÀ–£nœùü –S[Qï7h9»ñ÷d–£³^mA,ç_cç•Óö<WŽcÔûœ´òÓRÃV~ö€Ó˜UŽ°–:+šUŽÅãe²Ã„ô2/ÝË$•SþT>T’¹cÊÑǨ™'¹÷²o”ŒrÌâ‡páÓ ã\KÁ6“Ë„Q~ù3Ù åWPqPŽºËëñŠÜ ÑϏè(“ž":å¢M'ÊuÂɯnvÌÆ&GK ÃÔ{FX^Ë!§%™< ;˜Ë ùyæ’?î XòG­JN±O3oÿƒ?Ídh$[÷ Þ‰ä÷ð€@r`4†}[òÈ/«$wùs«F/i䬴ã”4rv!Vk£‘«IH—c%Šý!Û ‘ÃBÈÌN#/áx'öý 9 ’ÂÞ+/Eþ†‘cÎFÀȱbb}ÑÆ"G}c3ÒYdZ”óq»@‘³Ÿ‰ŠÄW¹Ì,ª70EÌ.sýŽ({]Yä0_ ‰œ^(νUçˆ(uRԂCþdÎFRg¡P~´QÈ1“,òÇˀ$?wèëV9¬Qáݚ4~§Ãmôq4çê;àãO„Îú¹LÁßÐãO …ƒ<~Ÿ± -1xÕË\ÎoÜq0¹Ø ìøù„_fìxV—oÔñÓzRSÇA.áÏtäõåX™ãg„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆ—¿"P;œ¼ Ö8ýLál¬qä¡øújrµc´Y€0ôi–Á#mÅJߍw¡’3ŽrÐÓӉGF¤—Ò¿F9€?†_Ž0\¹ÏÆz#ƙŠúÌ([fc ` C½*æ‹#›©’(ãÅáÚP¾ÑÅë˜uRj˜â©.Ùâ<DZµ*ž%òYE@·Ò´üW€eXÆ\q8B7¬8!2EArÂV˜A­.Ÿc‹ÛHAnLq¬˜ô ¤8~ ƅ³™ãq¾ő}áëV–g=Êcö ‡wš8ò=J/&Þå+%Jé@êX6’8`å| Ž³ZÁâð‘»áà“"~Ÿ–q¢º—¹gD(XâPSœætSˆËåTñiXùáQšøð3âA?O vxø]ɂ<ù0œ„møÎÃd‚,ÜfA q¡‡cE©”‘¹á¤/?zŽ³:넆ƒÁÁúý`†ŸÝ9³ «¾MÃa(¦\0Ċ±I3ø¤…àRÍç¥t#ÿƒ„“ +*ébí&…÷`(¼— Ï¯œðjÀ„#×\̑®ÅT¼AÂ! /8áÝRõD„·€Ço„ð◠„£E­ê6 gÏZë!&¼>nUxðªf ÇnM‡™•sxß5› Ž€Ò`U™Áà-ÄÊ+0ÍÈÈâҀ}µñÞ¡à#Hk6\§VÑ-¼ºÆ›â^ œ+¼sÁG0Š~8k¸ãÀ];iàQǜ0ðÃIènšäDô}'^XyÀÓWzàL-wö_UŸ]¹ä~3ä­Z)!ÀaÆ&üq:g€‡è?øß\þLø7þ¤úb›í«UíÉþæf&Ç(Á€f¢v7ò·Ã þª©ŸÜï4lØï´õûq¨#XތE–ktšáaåfö§“ø= ð;Áû®Yù¸ïx-7Ú÷CQ@ÿ°o¬µ¨‡ Ö÷Á¨§¡ÞS>‹cH,&Ö·X½NÖ÷Áäv¿±¾"1)N1ìû;dý̞6í$MÂínÊp[ IÖFôö reÄ7Ô7VìL‘éû¡+™¾!Ú§7Î7ʍŽ€z$ÜÉ:Ш§¯eÃ|ÃR -10ßáü!¶hlS}I°Q¾‘£’ñi˜Áý*ÖZª BJúñ]MkHÂw«*ÍHÀ73©ŸV¾7D-·Þ»U§Çƒî œºÄž+Ü»F#Â`{W·ŠN´7 Ñfu&q4Ô,ØâZê‹OGÈ6¬7|Ié? ¤aÑü­ëe $‘»ãþ´C½Óå?Ðk°¾:˜Þ¼OöÚfQù0íšDïæ¬zc .16 w‹øb𼡒`ñxà¼q–ÐÌOÂúï2aÞíñà,ïå­(o¨è8€É…!¬ -D7˜L¼ÜäÍõI[¬#X ŠMÃFòžV“¼ÏÇqúypħ«ŽÉ5[+Ç[ý–®2AÞTø±É|¼)odÁÃFòÆÇËØB’¼±¡°™Aòƃ社‘¼ie}Að¸õº×ž$ïÂjܳ¾‘¼ñ¾=Æv{Ça´@Þüû6-úX`øÎh&ÈRÎCŎ©Ÿª*ʘ oò1Ä"1ț²P‘X ò&‰…+țf"äÍ'uÉñ¦È†9àãMaM”{0 I .'9Þ܄ŸìÆñ†™Í¯“ãMÑíџäxC2$@äÆñ¦f_S—9ޅœåë™o¼¡ªÚ8ÞÔj»„#03Œ‘o¦Œ0_úDfÁr`¼!—:á Œ7…Ϥülo˜Ì Œ7¥r äã-í«ÕVŒ7÷dUM`¼K/㠃w;Ævù€¢< ´Ë{`¼) bøJñfÿåø¬.@XLpyc¼æ8{Ù1Þ˵sB¼¬°Ê5QÁè­È]ޏ‰fIð~¬¦O€7ŽóNï~îxº†w3˜Ç sð»qœv~7* "¨O0ÂS¸dz7ÉÇM•L ïFԕ ÿ€wC‘s{#LÓw TôJîFƒwE´I¾ík%µ{ñ½Ý ÝRqÌnFYËÌnö†'îhcvó¢ë¡]•Ãû]`Ì© Õ¿#‹²ƒmó4×Âù3g;v§ZH”| çځݰ²Š*xÝ8ŽâÎÂuã×TJ´Ðº E‡JÔÜI(ø³ëÖã$ÍÄu‹²miÙَDŠ[Š\ ø®fU<®›Ò׌릡Z¨6qÝ4³+pÝü‰žpnLÁL¦=íӎëF`[õªëfí† ±nF•·•Y“ÖÍzVú®úõÀuó&©Ôtåu—€$¯›Úë^7‹7T§°òºYB“¨o9 —K‚×M ©‰¯›‚ZŠ&‚×ÍþP\°s—*>7`·$¶”šØÍ Ue|Gzç‘vb7]®h‚Ø--®7ì͂ÖnîövÃ*·ÄÀn†Ågù› ïÄnFø$4±[ýXnixD>BÜêvK‚IìæªJmHŠHôrs–­Ã¡zCvË|GÁjӆ.æ²Ñï7d7›ÛÈn­ ñÖZºE¿“ ٭µÙÍx˜¡‘Ý\æa{"»©=–ÆÌnêÓõ˜ÙM‹>†•ÙMswæWaÁK°€DvóGY¹!»%ù/*¥uàñVÖ7‘ÝÒòîÁšÈnº ´÷íõÃÐn…E\»œiFt›Ý=ý´[¡’Ó¤“„v—ìGcfwZ’ÙÍà Ÿ³—*g.˜Ýôé€ä‚“/ x7f7'폰rR9,‘ÝDÝñEڐ݊,?c"»ñÆñ“ÈîržAÇYÝ,#:<6„äTÈnºþê ²"»KªÙM SÁìþ¸jXV™ùoÈnd"Sp¥<H!* -gÌEöLߐÝ4³Á™‘Ýø ªÖÙ '¾Ù 3á<‰ì¦EÙI#»eaÒmEvãGIéLd7R¤o±)Eõ.\Ý̈’tÀîǹ´dqcdMÄÆì¾Zä‡mFK÷ÇÄîÑ£HivÃz8òÅÙÒN×=ú²Ï%Áp¾'aÝ#ƦØltµ£º‡;¥'©¼ºÃÑuÆÆІóÐê&éú~¦õ¾‚ffNw6N÷´šÓ}×hfü6ØXjØ»bº¯ÓaøÜ̜ù„t§actO«ÝW4% D7@ ¾®€nÒÊÛèF”[qæsàidÅsc?Îûç¾CftîûðÛ¿Á¹¯h ln0pÔ.Òhn_8Lmdn²˜»Bx¼‹4]§•«_¹b¹a$å2¨Ü0t—)ÐuEL9¸Ý“É}SùÇ4éånW‰ä†:ÃÈ äë#ȍ0+Yää¾âC^xÜ@Ö ÓnÝÑC9hÜ`´²äaƒqÓjˆ9ÕØOV£¸_EÖ6÷ˆõAÜýªw›yI"ß0ÜÔ¦²ÍŸ)ÜÈÃ+`÷åÅîÎàf“ðç™îµÐAàÆ ±ähpó´0n·šBà·a w¿Ò·˜ðm–Uök²·×ãLôvvqòöy¬àl籁·/ëՒ»}¹UDÒ´QTÁQ~£nßÃU¹ÙÃÕb"·!G¤Öc%n‹.úLà6 œc¸}‡ØeãmÃÊá(xÛ¨ë`#pÛ Š«6n¥m£Š† €€mcéÍô›YÛù÷†ÚžV“¶AÇnµÈ -¶;¢Mgû üT`¶±4uGïènL}Þ0Û0k%q=ʅΗ²Ðk˜º¸b¶a¨50Û°Pؒ˜mnÃC,˜m̵ -‹fû1[*)ÛX©íû -Ù~]¤*_²Íã]È6!w ±gõ œN^{@¶IA`_‚€lóÞnÑ=!Û|¬¬Í6d›ï‡Ð€lÓ¢é -Ùf³Ð¸ -؏Û&†lôž>§gõDŽl3É`ÙÙ¦YÙWC¶™¬×Dj3â¨ä²ÍÕMÙÆcöo² &_˜±{à:n3¶ç29ÛúÖÝc ×è'ŒmZxgFH‡"·;c»Ý&Û°HÜŒm–ØÞÚd"¶q¥Ùb¯¡°XØ†WèRï±=}àTVà} Y‰%ªœ6Äöb6b›Mž™yÄ6,R¹mˆm3Äv!ÿ¼¨tVÝè!æÀ³!¶ñ -[9bÄ6%†jLlÄ6ž³@wbåz¤§cukâÜ»$Ýó>í|mh䔊2^n8‡” kãu‘'¿ÒµDâpxm‘Ô Ýc-\³®tmY©H2^›Ç:¦­òàêáeÃk3.Ê%Á×ÆsgÌ1ùÚÏô°z¢(×e2çFFàµY_T„Ñžtm´ùé [BPFR‚­®·Ò3úxEÁ`µY¾Øµ¢e/Û²¯\m¬„œqЅÂ/g©°ÂÕ¾Üb,™Ú—‹×© #A Q 8nP›úÃÁ¸žÃÁΝ§ ,ctÁÓ-BÆi¤¦tõ„i³£Ifiã8 H{D¢vãhãµ²šEçÅe(¶R´¡¤`Œ1 ÚHò³ -†váކÐ&cî‘‘±m8,@»_Šªìmè½TìÀ9´ý¬ÿ|v=ÄFφF‰`–€gCdwû<éúìÜßÀÙ(QèÂÜìSÜ €fcaÅBۍ™ «ŠÀ\ƒ±t½†Kô—˜}º%yÙ§{0/»·¹Ã²³áR°²‡c¥‰Ê†þ…“øFÊÆEðç”}F{õàd£ÆL­®VLö€ŠÀdŸ1§%gԌǜ¹yL5 Ž#ÓÓeh6}¢Ó…x;"N¿Â áôø† º,*ªW>6ê­‚qõ9£ý¢éØÏp:{¥cÃÈ0SÀ±Ÿèilì`fîhìǂ$c?ÎC$†ø¹ Æf¢å°êŽ¡³H…$ê´VM,ö}E; c±ŸÀœû‰ü -ÅFªG/ÑÈd@qŸŠksñD÷oƒbÓÌÀG@± ÙÄåù”Plæ$èsoTl˜•W -*6\ůƒ4lns»8`–VÎ#‹ ‹ò[Å.%ªð7,¶ÖMOŸXlæÀé[£Ý—¾ðÕ<ÎXl&žÕ<.:}p5gððs±ár°Áá†Å~T žPl°ԉÖLìǚ°‰ýxO"6 ‚ˆý½¸ó°Y=ÜÆÄa?Á´Ê5£—L‚n4lB1H®Î ÁádW×Àa/™¼•‡Íu…:ˆ˜‡ÍUÝ5&›QÕáºÎÉ´fl•úîÀaóìZ›4lúçíi_ÙS9Ë aÓ"~èµ-Õe7+›…,*=3›—~QovZ66ö4äÁ8l|¨ '.XWÉΊÆ¹©ê"JP‡M¯jÃaÓ©#»2pØ]¨òO4lnÁG·á°yr­Mv9\)™4lVÁpT^iØ´j 0 ›–á,V<ŠÂŠ; ›.iu]BÓRĕKIÆE•›‹éfî‰Æ –Vi–uT((ÛxØ\^רwW”£yä¶RÎø§‡ÍxL1÷BK ¬¯8„›P:ŽG›  Iª Ä&”N-> ÄVŠ¦KÉ9Ø¿ðß Ä¦¡=Ô!ï4–{åa#—êç1‹e¨ÁÃÆ6ºm›Ëè]¡Ü’®ŠÔ?ÂzÝوØ$˜QGšžÁÇ "6֞z“6"6ÃÚ›ˆ ×T®I ±P mCb‹ u׉ĦŽQ_eLï°PÒ¼!±¥ m"±…›@l³ˆÍØ|àÑ ->‹×JÄæRT‰Ã–ôi‡Í³gâ)p؈©ôcÃaÃìŸì^=Q g6-W¬8l˜(›Ûén‡ÍƒkÄZqØ\‘»8lˆØ‹e%bOs±¹*”¨ÀDì|ww&6ÓãςÄ&8€‡@b3©Y]Ž8õŸ4ó] (6³š|›Åfb’Q‰ Š-QþõL(6KC” -(6·áÚy£bKq}IŞ}ɂŠÍØ}ŸoTlâTÕ³ÂTl¦¢Ø¢!¨ØüC|°v-R>©Ø0ð&›13vºØ¨ØŒ8±½Z`±iÑD',6 E¬Xl>u:{ßwFãkc±WP¡ë†Å&N¬»#£Ê*f)}`±1ê«Û°ØÔ¢PC\l8›nþa.61D»l\l˜¹€O.6-|XÁŦEíW.6HAQp±ŽQAú×êÚ¦‹M_˜ióàb“ÍǞÁÅfC 5W.ö4›s [›7Žý6.6Ìî¼ã,Òz›ÛPõq±iæ3 .¶P‡W™`l*"Ç›:OV š#Ž5ÉÅfn¨ºSËäb3FNVAp±YÕü¬¸kx—Ú ®\ìÇ8’´fs¥@¥¦aƒbO«¹_è]ËùN~X üÖ¼ïÇùiGb7Þåò)‰Øxؤh%{x8ÚyØÃá—Äa‡¦“†}Û×ØaØ·£ ´v‘ÿDaßñn$ì[½–Ý„/N öí⚃}GÂÈl¾/g -6Ô.ʏ¬ì`'4ŽuÁ•®ómlÝ4)¨ãžük&³žö†¿®#’y¦_Ãð¸K®†Ç¡¾;üšXq¬‚ľF¯*ÔòŸXK¯èkÔkÐá òu°¨’|Ý¢Qø¾†ü éÀ^SýÜÛ¤^UõìÈëv†ßiâu‹NμfŠë¸ßx×-.»Fƒ×»nƟl´ké¢캅r1`×H‹±¯÷ƺF-ÐS'éé - ü*¡â†u6ÎuLVÌ5ƒ‡O›”ëÊÔ rÔQ&â’Òõ‚p=¬Ü×˂ä[c?âo3þ·Ñ­Ï+§÷gtc ¶õé9lG[£Ýad3u‚æ溂w‹~ðœ7®5jJV -k‹@C­/£fv¦5֎ŽßӍâZ²+;@_»ñ-݀ÖådÁkŠ»µ‰³†\PSæJ³Æ÷we”‚šS|Â(aökeY»€.IÖ58ÁÄ4ì0dçXèúëäÅz pƒX³KNÓ„ ÓYØ퉳¸`CXCƒÊI1Ö*3áëÓ|¡_M€ bÆWŸÁ zõRÜ ^ + òƒ] ª のƯ•dY×ùý(tàjøt¤n·šõçÓN­Fò„‘¿€VƒÄÏ.˜ÕÍr¡Yݲ‘£‰Õ¨KàÔÀê)ª XÈ§àUà‰ÑÉA)ÙpÕ-ú­t?Ž«NXûƪF…ê0]’Ô,E7©º¾¨º†Š08Õ5©†ó1®7Huµ'’jÄ£ºFßÔ Qýò´8MBu÷ˀê“#Ø;Ÿúä8¹à©Y2¤þåòŠ’’Û¢ÞLӝ(ý;ú,·ÄpJâq ©´"yCS?Ì˖OI¦în…–`êˬv.õéDCb©‹çí R[B»C©UŠb+&5‰ ÏO‰¤¾I•y'RÑÂƤ¾½ uÄæß`ÔÖo%‹úŠîFQר¾ÛQÔÃÀž$Q[c™ j&>p¨™‰rM|ܞ´B÷£¸’oB¨QG4Euðr{ £†#¢–C“@Ýì^€º†Ÿüiö¼øiÔÿ •¢Ò£Âzˆ¯g²§‡{ƒ¾±§-_ôôɐC™äi-Éz}#OKãrµIžF˜öd„ OSŸz„%µZÔ\ƌÃÀ¢þ‰žþè²ûe†æ+Ö䁞îÎò%y:@q ž>kè„Wî4bs; vˆ:N›:}FYìA„žL0§QÖÈi.o1Hgˆ œF -˜â®àM#q݊¦ŠçŒÒcÇë!ƒåˆjŠ4šWG¢1YÓw‰¬·ŒÄùö6IÓOQDbMÃÊ6@Ó0ˆµë ˜»¬@ß0ӏ¡8I™FyšB„Þ ÿÀ ÏƘ¾]Ɍi•ïk¢£Aúà4´¦/“0Ò:\š€é4l|é°&^úò\ŸÐhˆ”¹–ÞàÒ+Ddë]ÜiLhéùçJ–k‚¥¯ÐWú -èꆕ†àºlÕu=ÙPi¢ãâËFϙ@J_¡§ -$Üu:±º¥üb¬ÉíˆOš†:&Nšñòã|£I|įÑ0é»v[0iö¢?Ï7–4™JŸ% ™i0¨"¾ _ÙA҉+ Žt¢0#}ûëÝ)Ò(ß*î\•…¬DK†4 Õû‰~"ÂiP´ŽàEWGnãƏ~Ö֙ø ëcÒ£‘íajcƒGVÝf6êP/Õ«}{»“£oñí’ýxu–ØhRžm§F“ζy†Fã¤XèÌè§I¼3£CYýDeP£×M`ô™âàEßN’%:†‡ %/;a-ô6Rƒ}EŸÊ ¡I¡aEbýY@ÑÔØ_Ï'y,Æ7‰Æ߬˜2%ú:¢Ø|…D#?çâT‚"©6`o„èáðz¢G”Ý": #zZ ‰fI%¡+dF6D4º¨²+z“£bwá⎈¯ëôÍdR §:&+*5.\ñÐX–ÁK<4Voª·rY·ìa‡CŸV‘$T'5-6š’2¦ò'zXí•dh.ó\üÇzpBfµŸrúq¥L.t,“ ÍÅó¸Þ°ÐXh“÷¼×€" -Ý­4ݙÐàvŹ󃉬\"¡ß]£ÏßÜùú¿ ý5ÒóÏÿ<>ý£¿øá/·ÀóÛ_þÓ_ÿøË?ÿá·ßÿðÓï~ù/øŸ>zÿôþùO¿ûÊæø¿¿üÏýƒÎëËo¾_v:n§?ÿíÿã×?üþ—ñ›ßÿM­£zãçÎëÿýõëGþŸ~ý_ÿêw?ÁŽmóß~ùºUÿì·¿ùéoüå‡ÿò»¿ýÖ¸=¯Kýõów¹ÐÏ¿ùëy¡¨’}ËÿË ýw¿þÕïþêgŸìŸ¾þúÇÿ¼ýòOú•w¦á„á—ö›Ÿþüõöýîõ~÷íÿä‡ÿúºÂå_~ñ'ößøo·þíŸüö¿ÿÍ_å±þÁŸýðûOþëSù‡¿8>ýã_üÉñéßÿþòßñ+öûøô/^ÿõÿ½l¿ÿÔ?ý«Oÿñ?Ÿ~õÚãßÿÅ/þä»ëÁЏÿùqþu¸ííš&þ¼ýµÓ—íX¯¿~Âÿë×ÿ¼Ffâ´ ­ú¬vQ¦pÁK˜éµ¼|­ñð¯|ÐÂ! -p\r¬).n˜¨³%™§¬voÉ^F`¼V »‹†“#ÝfÇPz½~c;,ݨ×ð¶Cu¬Âá(î…¿¶ÃNã~‹}žð<ìriïÃëÿ7ùBÿ4í^ë~xvlâƒé™pø—;t£jäµàng#ëÿ…Û[ŽOÿêñ8/ %+¾Ç4çj‡Ñ5m/#eýíÍhI…®o±w¡9öÃÂ{½û9Øøý|Õ¶sûk^wüÓx¹!üˆ*¤Q¿­vŸ «„òÆ(oFÈ òÁ.väñêø´–tŽöi?¿ÿ™sËÓþû7ú½ÑýîÕH»›¡œ×Rÿ9Àl;zÇË|²Õ.jy¯»ã¥nDÌÃ.wlžÃ~{ñ#pÊ÷áÔÖ·xßñ´/ïCv}s>܇oöŸjêù>²U -ñWûwx:ÛF¶Å¸l‹}ŽlËaçȶœÃ6²áG…Ø7¾ y?ì4îç0íË ÏÃ.—öá>|£(æ™~”·óÌÑގƒ)¥ó“Y~q1n§·Øçµ,‡W½œÃv‹01^ˆ|nƒ¦€UÞvØiÜÏaڗž‡].íÃ}È[4ïÞ>­ÏǽLëóÅX¦õŸMë‹}NëËaç´¾œÃ6­Ïǽnœ/ÆzØiÜÏaڗž‡].íÃ}øÊ[´ß¢ù¸—ãÌcùÅŸÞbŸ×²v^õrÛ-š{Ý8_Œõ°Ó¸ŸÃ´/'<»\ڇûðýGw…D¼ëü஄}ó@ÈιÞ|˜Ê:Ë냻‚‡Ý ºÕ|jwl|wW֍§2;û9,öyÂó°Ë¥}¼ßd2sô~{§S±œÃt?–³]ŒÛ¥->̼‹ 4ïØâ'l·wq*–§û±<µ4¾=âi_އ<ìúæ|¸ßj2Óô~‡§_±œÆô@–^ŒÛÕ-n̼‹4oÚâ*lwxñ+–§²<¸4¾=åi_^‰<ìúò|¸ßäžß¾¥«}¾}òÍýrwã‘"ð}Ü@{¯ãÚLJj ùþmÚø>>¬ÏO~v÷sXìó„ça—Kûx¾ýrf¿Ãó[^Nc~õË /Æíꖡcފeä™7mù<·;¼|ËËÆó«_\ߞò´/¯Dv}y>܇o¼œÙoïü—s˜Ÿür¶‹q»´eܘ÷avæ[¾Ííö.ò²ñü䗧–Æ·G<íËû‡]ߜ÷aú¨x>z’Í - Í—€ðêŠÍëXŒ›‹²Ø§?³vz>Ë9lnÒÇs›‘–+(º½­ xZ{Lo{1n®ùbŸ~ürØéñ·‹§í—užÿÆ¡Þ?ýéW{ ÷onß ìø^b½xñ~λùxÄ-ü¦llÈéëí׋5gšª £íž<€$õ2¾œoFŒÂý\fÙ ¸ú§í° %ÜõÓvaœ3Ís]o[¿v÷sXìó„ça—Kûx¾åLƒ Þïp1Šd; ½Ïý„ãvuӾ܊yØå¦ÍsØï°Ü›ú¶q•Jopi|{ÊÓ¾¼yØõåùp¾ÕLÃB—÷Û{¸4i;^e{{ãviӾ܇yØåŽÍsØooaññ¶±UûSKãÛ#žöå}Èîo·ûð-gмxmÏò€ÌrÚ¿ÓÐ\¯Ã~»ÞŒ8ÖµÎlï*±ÙÛ¤ÝÏ¡%}ü;ýÈɃëƗÂûa§q?‡i_Nxv¹´÷a yœr ·[Äù÷|;§ÚQö_\ŒÛé-öy-ËaçU/ç°Ý"8 ÷ý¼mìʺý°Ó¸ŸÃ´/'<»\ڇûðmÖóùžÌ•Ð4ÙMØ^p(¶ÇÆ÷WgÝ8߆õ°Óx~xs_¦ôæÚë‰išœÏoùéyïöóœ7zÝ8ÉzØiyžßr@ˆ_|¾Ý)^ÈÓߌ¾ê÷Û·h?ìõ9|ˆê©¾Å@õ×ÃNã~Ó¾œð<ìriîÃW„ýÍ'¿g>¤åãvz‹}^ËrØ=êsøÕ õíï·h1îç0íË ÏÃ.—öá>|“žrûx{‘N&Hl=$žñžog»·K[ìó>,‡Ý“ë>‡Éõýܶäú52¯ÓŽ_êj÷™ŒûÜGÝŸ ы}ŽçËaçÈ¿œÃ6M|<·o5\L×:œÅ÷%FØ·UH§+¦ÑNäûC^o»½r±¼»÷6¾/1֍çªav÷sXìó„ça—Kûx¾Y°[~õ~{çB`9‡¹dXÎv1n—¶¬;æ}X–-óŽ-¾ýv{—…À²ñ\2,O-oxڗ÷!»¾9îÃ7 vÛµÞïð\ ,§1W Ë /ÆíꖥǼËÊe޴Žßîð²X6ž«†åÁ¥ñí)OûòJäaחçÃ}øfÁîá¿û*ãÃøöí“gè­¾ŒÓ÷‡ñW ÿ½}™4½ sÃù±ÏNãþë‹}žê<èrQïÀ·>ì÷v~ÅËiÌï}9áŸ]Ý2hÌ[±Œ9q˖Ïr¹·ËœÎ/}yXi|{²Ó¾¼yÐõ…ùp¾qØa¿±óã]Îa~æËÙ.ÆíҖ±bއe¨‰ûµ|Ë]>ÜÜp~à˓JãÛcöåȃ®oˇ;ðýÿfìõßüôÓ_þøï>]ïq׿[èµìiÜë'ý×QÉáþ®= ]Vû—7;ºJkûåí8?g_Žó“Ïóۈs·“’ây–‹@.Œö -4€¯_”ñµ\ÆóxN ê>ÇÆѽqo÷ÇÛ¿øEëËúú©•:·qÇÉ ãs©²ßØYÆÑPÞÀß}½n6žíðÉô»åÉ°îÖ?ZÆë³Õ`ºFTlÉX®Ãçðb–#¨´Ó9ÜG\ûƒ^—º!ÌEÈ胖¾ÞŽ/¸ï]mÞôuV—Ï ÚôZøÆ¥.û³ÖD÷ÏÖ'u¥±Ÿ#.Ë7þÀR¡-÷½¼}=ïøR:¼oÏás<¢"TÈlas\~D`½î·íÃϚd²xp tˆØ¤e?hþhÛ%ÇñZkø÷Ptç÷Óý}mÄ™_ÒóÜӈŽÚ4Ž;nìו{ӎÉZe¨ókg0OÍaù¬_‡Woqr¨¬³í¬ljg ãë{±ñàM;‰_¹ãԚ ²ݤ¨Œ“•¯_=ƒ¿Í“:ûí‹,ÅÍì£Å³ª}øÉt¿ààύû<®‹ýšÞÞ×˖c"Û9úc=QUdcŽìö #û xKr¿>çð5È6JöŽQ´dãßú:ÀÏ 8BcœcËÔ¯^ż«(Ž*ñÖ@[úcڏs„½ñz? o\ÑÊÂÆ+~Ž_ÓWÏ!ï‰w lîùcØ__—þš£®O2ځàë׫§>(~’â~Ø~Æ ~𵤱 Ìu™˜¾vë×Ƕ6H1æ×7GÑÓ_SM?è<ì-‚@#9ÇÛ‡kí91”û¹b㜠ÞN`½uoþã×ìo?_îðÈûì1hËþ´èñóAŽ˜_wôþÙû¯3ÓºÆÔÌièÇ´—ËïÃÙôpÕ=ׯÙy-Œ×nÀ1Ⅷ½¶Øøê±ñ}Æa»¾Óç0}—KZ!Ï-+ÀœzÌ€$| û=ŠõZ€q<‡±Æ'CøW<ï æO]¶ÿ1ìv38Þº¢—ñÌ1… 4ž-~^yOÀxÎ<½Ü¸æx{Oc©1b{hõÏaÔô‘[‹sèñuÜð¾zóÑD븖_ü1íǜã^÷DÆñĄ¥†W܊§ÝyC½\m¯#6®éÃꕄ En¶éöõԾ䔂Žy‡ýú#?†½Åkú™6¶æoý:j£†ô™+ùªÂ^Ób‰ŽŒÝ³°oWýôÕs؝ÊøEúì9q½9]Eëµz?7ØÞbAK܋ö}p„çüCNåÎ>ßav*1H|úêU¬ŸWM§¨C²ß}„k¾/a·Ëû¯ê8"ìÀƒ|õÈù£íÍWt×;^UsU|c¡ú%íG¿–äƒøø0ãÓW<¯ôí+W -ÊÚðêX+7Óa¨’¤±ÀI’ñX_ïr~žzÆ^ŸUlÜó³«G¼ ÄT|þ™s[?â6ýzçlóöÚk¶ùø-ü‡?°ñväËEë8ü3ª¢ ö~~ {=5·Â~óË'->/ÌãÉËØÆõÄçz…‡p² ¶ïø@c^m\®š·&pÔÛ¿UFŽHè“98`OT2ž£ø1¼Üåj#a2ö¼ã°÷ˆ•Üà¿ÙXâ|{l<ãC}à¸çæ—6ÀÑ==k,6ï爪% û9~Wº.gÁˆA"ï³~ýQå¨g××®A6oYçÏÇÎåXÈ9ì@~ÃX´T¤Wñún#T„‡ôŠÖ›=ão6F`ëè1nZ¡ÂxϽoÄ4´7> /awœ/'Qb ¿Á¯Ùö£ñpÈ`Ä̗sc™_†gJŸðë¾ {+1X3'c=ãV”82ò%“%¿äæ,Ôò‹9"bǫ֔`nÓk^¾FŽ»öËGÍwÄç!Ÿóe¼„ÝÓãp@¶;|ò^ó¾5bãê$F¢±¶’¾\áã yíŽðOÉ7¸°³…EW2ÖÇ·¦qŽçk 5¾ÆÐQ§óy•œ¥1#¦ýLWóé¥/ÎêÏ8±½†‹A6~‰'xUEÎÔ5&ÞC$e?ÇʕOöѨ‰6¨9[*4hã“ÇqÅÞØZ7Þ:DF¿„}Ž²Zaó Žò•kñs¯ù?Œ:eèñ‘¼æ‘ûç  ·‹yæuf5ÇìŸÙ³çÔ¸‚ÏXÅ·Ç^Ése˜3xòÄó㉍ãN¯RSUcïŒ8,Šp|„C»ïZyyqwà} ¿Ê%ݘhæ8¤Œ‡ -þâ¾çÕ¡æ/¦¶ç¸ãG±g{î8B.q_?³ -šÑž1âܬ| ûhñNĈ|ïOŽÃ‰^hÇ5.‰¨2žíÌ©Æ/ÄñŽzéϳEmN@óæ¹µœßbøV“–ˆô:À¨>+qß¡G®gù‘SQ„(^mr‘1¦øÍ]‚½iuÇú‰sCŸt{ïp£4f|]^ò§žH ?ãJú °ÖH ]C þù5s€„]¡ÃÍ=½–½gÐ|ÜzHªîû‹Øå\«Üé~C.Yrr³¯$yúäN¡Œíˆ÷¯_¿Ær S?ZšåƯ± Ž0Ó]÷“cÚ"\±z¾OÅÐÉL¸ó»ÕPWÑy%^©ÑrR»²‡þ 4̃jž#7ƒÄ6æJ‰Šy„óŽ·„k5{¹óCÊ#ôv­þO¡_yÓÎ\Š@9:…®>ÐzÇfÍéØÉ3®â9«À>çL¼Á_ÂÞêkà’³M-‚‰Ú¿Òl\}:È!ï±âŒbžy}2ùDÐÜ(ÂE1¬ ÷¤£Mv¿S¹o¾nFðg;^ËYny¹wÏÊ?š9}Â*ÜF¡®9Øašúö’73æsë{è} •#Á‘g ²Ì¯#ΠÜ3œrÇ—òגAV4š¯1ꏡÅ*`ù¤"éF ¨ŸUý¢9®°W¸ÇŒæ©:¢;>Îð”JQ;?°\ [z#¼Hxö… ðü’yª´jL:zŽ×“É/þvBÇöԘDØáx–ÅskB„èjƪîôž4íˆq®VGÁ?ò~óï|ɏùó ¯÷LÁÆéB>w‰#Ô3Æn¾dy„£ÅÈ[«è5Ç·«‡q80l¿R瘮%Æn'! ύMc8ìqÄt~<„»Ô Åïm‹Ÿ;ìå±ïYö5´ÄG=r²9Ћ*fôçñ cyó.µßý/B‰ ¿µœ,4œpãòÒÐÛ2Ö}cÆdŽ9 WIº¾SÔö9é>‘K8S±,`ÍÍ0v& ¼ˆ74&&æN2F1§64ŒóÕ-·½åBÕ¾‘g.w®\RèÐ#šàà=zÎæWų‘qøŽU44É#`:Šxb$Ðå4³ -£:§r¨Á î9æoÙù;oÚQã'9GOcÏA¬å¢äX]«MJed<Ý~˜Ä.hv7b9/»´—''¦&ñ:”]GúO§üìî#²ìxN -Ôc‘Rµ=hF’Aâ^2ߌ/+ˆwÞxô‘!‹ŠðeÅZ„ÚåsÙá¾$b­³âšGH'Šu+™œ*¶†¹@Æ#gÆ»ÙèێFÜ4™I§ñ¼òг²eìØÚ4_M]c—Ø‘š¶H՚bK2Þ3Ôß˚Zh‘&ë~u¿ó ŠúÁµï*¸íqúÔi½ìGëú™ÒÁ+¿ñr0žÓ>î¼jȃbqÈXޗ°OÿˆÅRiŸá«z.[?©(=}ïj^ä¡Å‘·l!ÝJ‹öXXÀ -#;ð”Øx„ÑÚ´±ä$l¿VûGãkÌø·±qø¯‡|›Ã_¯ŸC°SFv‘Ó–çyϟco`]2<(k®š%rØ2C‘‹6?2ÚCÆc ”58 2¶ EdäCö2@%QdÌ9©-9¥µÞÚ< ”1òù%ìVvŒâTŒWfB]2€Š¾Œ%õ½ìY1l¬9›å¥áã iVšÝÎ%ú>jt֙ãîS³òŠt¶O™(ì©Ä÷ëxH½éw7uºOÏì¹ú"ɽ- D¤PóéTúR4_â°ËÈÝÊrf·¯mjñ¹q܅rÔ0öô–ëv„ž+éâ)ò>Ô4ŃP¡=ÿ?{oºÝFŽ$ŒÎï:§ÞsºÝíê*щ-‘Yîê)K^ÚÕrÙc¹–^j4•²Ø¦H5—]ñ½Àœ{Îwî#Ü_óëöËÜ7ø~ÎE’L’™ô"‘b/DF ;È؇QíC¢|” -gƒ Œ%]FCîuqÓ[Î}øLnëi[úÀ2‡ׂ8½»B Ò$û¶ÊP8>â²<æàªCœ0„†Ä£õ9qüqùÎ0tÇß bã3IáìÃâ0dÞ±i.8(·ÚªZ‘@CE;Z”…CJ1‚û×å‚$U.%Åak¯UáJõtJ²Ï41.×øú¹Ëy€‡í!¤ŒàtƂCÚeй=øz™ îאFžRîGj+»¸Æips¹ø{¸ã‡ºM tvdØÁ!TJG>‘û>°4óœÝ…“jÛ{ h’i(–À¼ëÐS[êLƊ˜†Ü{σ™W4®‰ú0ÓØ!KÁ¥wéú „3és2ËC¡±æž‹§è'ÂåfXxpéà±@²6(´Ë…€û§ü¹Ë}¹–‘­Ÿ «pÁ}Cŧ¢]hƒÎ2wôb q0 ”Ï|ÚOJak¹ÈiÁÃYôgß؋]Ì)AZØ[Ð܁dO)핂¶m9ä7^8J¹oì9˜ -á{i0¤…pqŸ¼!(ú6w²‘恹+/Ahn"Ž]*Ê5É|®•µe,I@ Ž)0pgÒ5¦ø_ RBkö&Mp–E}0ËÚKü>ß%x$…t¤¼Hb^2JáâöfYwV'”ïŽ.S5‹\yx³“Æ#bvy”•‡¶D· rîä‚ùý6ƒß62zÔ7¦Èœ,ÉuØ_W˜!\³€!q¶p“KœàÍu®o"¯žf·v8­S<4¢µCÇÆHúlÁ=/W^cƒ¥P˜õœX òr d¸%œ³D÷_ïJR$†@žæšâJ5®2#SÉe–Ø뛐“ˆAº@e&‹Û͒F¡¢1g.’¢„7·¡ÏQR´ô 8JÏ|xJcN¤#½¿Æƒ5#`šûì¿(fVZ÷Ž…ƒŽëú¦¼]:±®%ۘB°› f[’m3±NÍ€NU„#ñ˜ÉÏ Ø2‚‡”J*S6¬Ù‘ÈÅÿ9]ÓEÈÎÒ`±!Fª\JV>è+±®:´š’ -ð&¾p¤´ -}ÎRêAãש5bYº…´"¸PÒùéTâ5-üRœº¬Óƒ&úà~î´õ9$^`¿ñ ´ù£™;Yn’eôºÜçö% wNô$ÖdP– ¾‘í EZÂBÂØ¢”3NëGRÎræã8–ìD¾Œ²G‘LCæ3Üp-Zé.M¨1ºØœè›Ò®CsV‰C˜>ÐÇ«äIÂÌj/lç”egŽ Fz„ÒÄ픊þTÒÎeÎ - *ƒóYA7lF6¨¡*‰Õ¡9Š$d&.XÎj(’ÖŒô´ÄÓ{¢D KúxH*œsÆُèk%"sNYp” ²l\3¿æé{åi7§/ña`>ÉGgRSãœØ®’š’îB65ª¹]‘ÞABc†7¦t¨¤ÔžsîÑÆ}ð锘vHp‘/Å bÂì9Ho®¥ç2‹1 ¯Šr'Žfœrºp±ù¾Iç£I ×J $€„¼P@Ë}Ç4ó£óœ?6qwžxA.ƒ Zi–IÊ­LktpFªVâòÇBcDkÏKÌ5”A¯âtrҖÊ"=5qiøYfCjÂÖñ˜³ŒRÓàiËžíé é·ä;I"æ-#c{jü°l‚çdx'9•bÉçðI(€y€óž%Ñ|úø„kѓüIês3ÉÓË(_±÷EùTPJ`J«Ò¦, §'a”ƒŒ‹Ùc0›CÍõ!÷Jp69ðI’—%D[x…/AP óÇò8ÙЙª±d†gNIap¡ÀÈéÂüº¶;|Iyç¶ʏØû0óR[K ­Ê€AQÁ ÜÁñ–¤ŠÚ;·'×]ytéQ.&ú=fg" ªK0¸ÀˆrQp7Ú£‹y(*â¬$ؘû² j„¤’Îûh½¡Ö¢G¥¨¥Ÿ·hŠ$ âØaANV<ìºæ®cÒ[]5A¥álKÉÑël@“È¥½ŽÑ-_ÇÀCR;†žX Sùpg8: Œ»Þ¢t0ä4ËÚ¹`ЇMsasM¨-ž¨Ö4¶a¶PÖÉC‚;ىǬ÷<Æ:¾À¿®¸oÉ#ÌÊW¶À°Ù)Àw‰«p­ºU·¨…R3ª Áͯ‰n”ph=ƒ§…­¬@àuM!ƒf„H”z~âæÁ©Z‰ÖÞº q !i[kß8£jR ¬Rš¸L¼Ð†´2¥t¾Q¸LºQÈr!üJ]:`p€»ªJ”ÄnÉL\Y†ÁÂuF›Ž<™áá³ÉS'ç:b·¸«=† òÙ0Ylì‚ áuÎ.a.~/cʚq+הFï²âðu¾N¾Á3܋} ”x~âDpúSÎ&¤‰êì|×ت(x˜xÓ À5 šž!h,äN?Gá,RáP p˜3:ý`QQ'2Iϓ *pRpQ`ðϓ‹À)Oè,î8C9³„ä¬{ã1ä))¾>V+³Ñáv ¿Î(?æ2xü 4,0÷$ċi"w¿Þà×zV““؃3äJ%äÖïlÄ¯s[H×íÌ°Rs(¬å–CêO³Üçr8 ‰‡“C!HTˆÂŸ0—‘S [› ‹Æ,É’8›9é8$½Z’w…WM¡9U±ÊhŠrŸ4œØÒ -.O“¸Á_à^nŒÛC‚+á÷²‹N²l¢NeÇŸ ‚3‚ÁRîWŠN(o(‰W0ûÄ1ŒÄ0¡Qb'ÀS/ø$Iæç¾ -zÛ÷–—÷H.û!ŠÑa¤¨Ô'oª¬>ÓÅÀ3I}ÓÜg%‚ -wÁ¹M„(τÊ#qŠÑàTó*÷A¥Âz±ÝÕŏ†"Ⱦ˜úÒ#x. ísÌKÂà¥ÈT»¹”b¢\i%‡A’)MQ)5›’ˆ’èœâe•úPšv3…¬cý²ɓ0PìLb¹Çà¸(rÅÌøêÔ÷Áˆ‹öËHlˆp¢ÈŒkÞ¶t‡uêÜûîuŠb¾qQ¥Ó̽GB¦šbš«Ë‡èÈ6š$>Œ[ú²„&NCRš—B\µŽÌ1Ö%ïûòf®èV5÷-CúT’E•o2Ž¼ìJ3Šy—ޚ샡NÑ2TTÌ¢õõ½Ð,åß½k0Ñ<Šq—6ÂÙ³ nùá1ŠÜçŠk¼cÍaÈ)øØJY¾(GN9U°C‰>9t”-2ˆ9<ñÜD†Œ Xu·!z®±/zÂ÷ÔXz š7]#K'zl,P2R·…Î|³›Ý­`W( BLÈôˆR¼º˜9œc_½±Èʘ¸€Á[÷aA;`ê͟Rûðp¨ôʽRØ@{æ"›(æl$žýa؅Çàr,QKôùŸÌ{.•3 -¸Ä&üÞ”g³p„L0v>¥(ã”qr•à‰âˆÌ}hâ“p[Ï# }Ïa§!‘8§3‰È•ŠŒP(ÁýikKl0pÌÑyëK’!<÷UÃr.}eTø/¡Œ›”‘éJ8~b€¹7Ø sù€ž×Þýšd–K +ÈA|Ɲir™¤5Ý;8S®q”´Ë²0À,¥Ùˆ2c qîO:F‘ÓŽ£´7ë‰yHÉ̾ú©-o‰éH”ؚ̛< -a¢€ç0(ª -†çµ• ð’oÂÓ6ûÛÃ(0ÅaЄJ·Å3]g9Rʩؘ;P¿ó¹ÃP;õ2v"¨¼YXÂÊe<dÈóƒÊfV—Ãî*_x_€xN‚B¿}œ'T‘'2ñ‰tNHˆ4v[°.!½K78 ÷ü7L0Oˆ_£*hY0O¢õĝØ-5ÕÉÄܚ€yõ.÷´@ÅH_BMÑ]ñ4øœ(ÞíMN˜…áG—{¥ ddtò)•»t@™§TW0Ӟn.ʙ dÜ­±í)§ -ÎÒ -¦Ê¨}Y6Lœv˜¡¤$½Ñ†% Ð% 1%¡u¨„ûeÍAþ£9µ–iÌÅ$µ$w‡¤eBÄ£{^F K<¨18 {˜”ê\·V¶åè#¿ †YÌ×¾¬¦°rYÀ¤«Ã&“@2O#4T÷®’E^0æjŽIFekp6BÁÅbfeÉ©2î×Ny¾¤9 <:±°ç!ÁƒÁ.Ë]1zÍÖU'ñÝÜo ¨‘ã«ñ&ÊÊtôj1 1so¹Ï¥ßž¦1Y£lü(‚BPÖDz@å=µø&ÿ¼ôË‹hF5ˆ|•eW -€‰÷*AÝÍ´Žµ6‡YRyTïF  ñ:.V‚}À{ˆ¢úJ’ªÊ ­ê+qÒIÑ[F^µHP¸×(Ip—Òæ)[´®=+‰é«([+~"¹;åCª8ä(÷ÚÀ½-3wª˜ôɄH^»å%T_$ր’ƒÇJ‰âáo\û¢ª2#´" ’mõ!ÀI<´‚$å²£¡¥ëxT‹IQ #[\駔jiR‡-P2/œ&^O¸ð¦â,ñõ¶¤N©ÌTê™F(…ç9ù 1…öàáÄ@?˜zîI<Ë]}r0k!½Ø¬©1±Båʯ¥‘ 'ª°UǼ†8ºÔ^rÒºŠØÊ°>ÀúC; }ŒèÕsrÌ"ˆêŽ\û½ª]-4m™ª[ -Œzåî¤P®vºÇÀ½ð˜I߸ìn· AâYÌN¢#‹  A;ƒw+¡%ÅcpE9âÆi$ñSå˜/g<^¹wäSÍ#@뭉¾Ì ¹FãŠeÚg&¶´££cJ*A”ÏìēÑ?N©ÜI¹2‹ÍT™ã‚ŏãY¢‚{Ú'u¥ elÐJ©èؼ|àM¨7å}"—Œç>FŽ,D Q¡Œ;`6NÚ9Ð÷°ò|ACæ7Èê*¡âaÑ)õsbºt¨A¡ÅÔÇóøçY£™h{V«$ªBM\Ta«Ÿr_ÆI%TÚ ™g -Ëѐnª2*ýêc©¼¥ˆÃ3ªIã„«b¡/2rRÙ'ª¹iÇ|?Kî€ÂÁu')–=²#wUFRUTËRoÚÃD,*ãé˜;ã«òëáÚ×äÁÂò‘©Ä\",»$¡N+£…@¾t*óº¥ùÙÆ®8hÊü%H¡,3&ÑQæ\žz—g - –TF s ®ýubíc)¦(y˜Š~BËP|5óšHê¢êÝø%-Ú¨p©«4 萫J̡ǖrÔPJpÀÜWwz3úBÍGokÂE•BÐ~耾BF&RB+|Ιwå;ٛòÀ´óãá«ÌsË})¬o~G ‘í1ñÓqŸì¬\¡Lµäž_ˆ‹$`•Y_½rb5* ¥Ë0¡ã€8[îxw)ùŒê–:;]Á6nKP^šúŒÎK¬[R¾sNüĖ°VɐÂý 4Ê5Í}MV«((§8 Z» -QµÌ‹n -$]_®'“”™/ªe„AúýŒ6M õÈÑ­ ˆ‰Ðb§Ã ÈØOlÏaÐáλ"ñ¨£ÒZL{Þð<”γ‹O©¸Æ¯rÓ£¢²©Ø1!dfÜc¾¶vª°r_Ò «x !‹iX`T8LZuSI+~»}å%@%£ªAX¬Ø5fT‘¹êaP#>õµ U(ï.e㡄ø\éù?cezÖºObo`Úԋ*¸×¬b`Æ+€y¤×„”wŠ)HÆÛ÷b,u5½»ƒeÔ8$+GhgFq@EÿQ󤕈 ×>Û[R`EÑDLIUF_ehiæ eH;ž‰©šçÌ£MÐohœÐbÄT0×1ŸX,¤& 3£ÔvYX½N -?ƒyN†^òÅÐہlŠ³z› Ï?˜Ç`Ëáë/@ªÔëjX‚/(בZF}6¡Ð%iâdÃF É«)碄Ï¿ÎÇ0+æuÞ:Xýî;¸ió¾WÑÊ -셇ûðåÌÉ?ôæaW@Y -9 -Ê_¸CÇYÊñuùDÁLKÔGîE;òO¡í5cíuÊEJ0O\sÿ:¯{É0Š9EÞ_88“’²êjHA>ÃH‚kÖçœr¬NH©È+ eqlÄ,Ð¥RV¦Ïœ‘ý–áT S²[]~ê³WªêŠøkgŠQøk•PDîê Nlj…û -l‚n-Õ^õ%N·´îD(Ò(\X=bðÅb ¯/ÁXœšZîÛa|V¹Úž¿F‹Rµ®(z7ˆæ>\~¾N´NS—u1²¾®…µA¹è]_c4ñõúæ+þ¹îÍUíº ¸ö#¥”½œQö ÌNâKy… ÜG³2ŸÌ e좄—ùB3DZ¤WóBÕ¯‚¢mÒjWTƒE¥HüeUoŒosžy$tÆW]FÝ1tÆW›@¸j/lQe•ªÎø—†òèX—|åKµWÎý `Ìó—Îá=ˆ®'KeP—Y|I©WÑ°ìY¸¤TQÉ.d¨„„X¿¤Û¬ç0‡—J[¥Êþ”úÛ}µ´– ÏüMŒ™×ní͹‘¯]»´Û¡š]k¬ãë ì=TU} ÝNíÞ°çnº­È5F¿/А ŸL¹÷P@ÇÏ\}IÀ ½Á=aQy’é&[åkž%¡Ó\ßâÃ) !tRðp8¹pqï(tƒ![QI£–†•hüÑ¢}”© µ±@i–ÓÅvs}’—¶|@zó煇3ïáÉRŸ(iºb9e³rC½žGޙ۰Z{V¦þîk¬ ˜û½)¢´ÏÌWÊátçLžÀj“(FB…aA©D«Gº;è³alÉhœîŒnaÄT‹|õ•˜ý¹ ÚǓ)ƒ/Œ* -r$§:„€z?pêœ;LØâé%)Ü5mw &¢õI­® ö|‚,#Ïfe]<ÜӌIu>è%\‘‹!Շ ðX²­*oÝþ¬õãsŸoÝ{œ?œî¦ãógÉ¤ ªzüípðlÔLzƒ—{{¾_¼ì â_>ýäÛKü%öÇ£ï=ìõ ªO?¹ã?·¾4ß~|røíð´ÀÏ÷{ÝIo8èŒÞ®øénëö› -endstream endobj 49 0 obj <>stream -‹þÀü¸g:8êL'Åø³Ö¦á½Ñ¨3Û¦{Þ럎Š¶à­;“ð#ü3y{Yà·™Ln}ÖºóÝ ×5ð#ƒ{ð²Üöu§?uîNΗ·t.lcÓ×ü‹MÚyÑ{y>©?6jUƒ»÷øøÞÉËâ¬ßéžOŠ?u“âIorÔ=‡<8fµÞ;5MW]ÕH÷xƒi|SßlȐÞÖÒ[?¶Uý¾nlHÖ&Çxrz¿xÝë@·êS¦üÔUÍûI:ª=ÐQ1žöp$jUƒ;NGÝâ^ÿò¼SŸù4˜ÂÞ öê^4¶lÕ\0êìYñ¨3{ÁþÊyŒ:¾|>®ùn;mÀ}Nß^Ýâk0¢GÄéžó³q1Y½Ò6˜c4b‡Æ*žâôm2“胀 ZOwØŽ¾üù¼7)œÒoû+Z—gl~ešBýq]Ýi¿3:Æ#t7âܓW6Ú¤ñp¼¹Šu†ž¼ªáªú£ŽÎ:Ýâ¨Ûi´vKO]Õ(ÞO§+&hwV¼ÓYqÝ8´Q#ÍjSå—úDùå -ucÕdL¢ï³FõA4þ%è<ö“ÃFƳ/>\oŽÜ±s脗MÀVq±hàÃËbԙ ë+¥Ñ›e/àM8;ߝÇ×e|¦¾ /.‡ã•Ïõf õ՚W¢þì@Û«ZuõÏÐW+,B¥ɍъé,ˆm‚2ýª3u…¼¼3êMÎ/ŠI¯»Õrs–¾)‡q¿7yÖé­2_lðile©G£ÎåyƒEzÃÏäMTù×ð -lØ,?)F/  ë&K^ÎM˜¤ڙkÐŒñªÝ;÷‹³ÖÝO¯{xX²½áaM†¶iáaÓ¿ÝÉþp:85ýÜ®°“Î-cÓv2®?ÜÒCW5f‰kÒ6¿m]èÛ.ð­LÉtt2íƒn}ߺ}¸.iü«®dx+4ÄhTƒéÅÓî¤óºhÀvâg®lA·“úæ“θx8*þ15Þ`yÏPŒÁ&²É^Wô*·Üºå)w›î}l:½Ûtn|õ)±Ût»M·z=1µ½qžM†¶‹ó܈8Ï?û¿\tÆÅhºªþØ&{î±­ ÷l4¤ð¹+Ã?o>ٕ‚™åB›2uÈS몾¸}Ý$ÉÍe"»Û®L4óu„FÅi³œ›Æ?tåè+œ¿m儛yÂY8hg6yµlý•; â#6õΝݍ° ‡»¹wîÔ½fƒ…ÇõeuXmÇ­Bƒ®~5:Z‰ûoÕ'©=vü؀×Pû«ÿ#óôxuÐØs™5é†1L}{Rc^o.s3Š݈DÓp²oKõœ½úºÃ¦”ÏÙÛ¾ú9OoN’úM04n~Á™-á|‡ý¶9Þ)pnÀ_|¤ë}7DÁÙ0^²Q#í©N,ýÇ[®~në¦í¹µˆm»m‘ÿa®~<+F{£íµ]›CàºÍþ¤sҀ(›dØå­úŽ?¤Â÷ -·¥‡®˜=œºÏ7™ mï:lëVÒºY+ñÑn%^˕ÈnKÜ¿!B¨ŸAь£Î`|Öගk¸;¶Üì³nšÉ&Y|ì·ZÜ_K§Ù0ýs+Ì>>y¯ßÿ+qÕ³5÷ë†-å͎èý@Ùʋõš\€µaëÉÝÅz —ñw›y±ÞŸþùßçýbÔ$4þúß«§ê¯Ó ¹V¯ÉÖ»×ê±vßRç´7m°9©ýUÍöi¯ßiPrµÐííùHq×|Ö6¬ޓáèò|ؾ¬Ï;¯¡ª¹ã‰Í·7@iû8aƒ˜'¼ -yyë"¾OšÞ@³9ìáƒP]÷ÉÚ0þ°ùaÝ[_ ~˜é¦VHº»ju‡¯A5€-nrlÊ ·µ×mG=ƒ…'cŽÑð>•«½H¥ÉºÛ˜˜•“ú³µc}WÏúêÏÖ¬ïj<õKçÁ èý¢ÛÈÀ6ÿäUvEyì\{´óO^ñ±v¿7¾ìwºÅE1˜<é\nòٶŵzB=žÖÜGVúX{ø›V®ç¤¾ínãÃ'Ǧ†õgkÃô€-)9ÔàªÐ N:>©oôÚ8¦Ñ`‡m -Ó¨?[7ä"ï³QQüRß}Ö[P>lØ¿ºÉ õÖév§ÓÕ®þxxñ3W5ÈQÂuýqžžö&½×MF韸ª1ö{ƒ¢Sÿ†×n§ß}2lñ=qUC¬ÆsI}øÇR{Bˏ]ÕÕ -Õ v•7(a_Õ :ýŸ;oëÌñ“Ψ™L`¸2=±þàNŠ—Mä×üʖc}µ~Ø@©^݈ê àg£áEƒS[_©’Ôô.šÕ_|¨ŽlO­š½lë"—º»È¥ÍQÍLֆÙsv‘KuÊ«­T¿ý™$»›L– 75v©»½±KM„M9ãv±K×úœ«/oVìR“u·1±KÝí]ÚFÖ·‹]ÚÅ.íb—v±K`h+–nBìRw{c—šœ›rîb—®7³¼±KÝí]j²Ã6…i\yìÒ¹Ð61«É7_³W9Ák¡¼nÓÓ$vp7=}z¶ö>»]׊ŽlcW•´T} Ւày%5z䪄˜ZíôYïMÑ_öŠþqÃ0‡-=ÃUÈzÞœg½ÁÊ -ò% ë²èLî7‰t¹ªîbì«Æ¹1öãKˆ²ßêûš'æÖس±Ú»ûÈrµ‹°ÿ0ë±Åîò¤Å”ù7i™ÿß5ŸÍß»æ‡ú·¸½ƒgæê´¸5âÕ¯›´¦o„Iüd¥ rƒâÛ\!¼ÑÄíìãW¤՞¡M,£½íÜuéV´§ÓLoƒyd3>²Y–ä­¸Ö®¾ýìՊÀ‘xv í• üõG´Â«]‘܈­˜Î҈Øê.õGԀ¿ºBnÞõ&çŤÁQµ¹‡rS™wäíMv]Kð¸ágó&:„Ö[Í6Ñ;w~EGvîü;¿öˆ¯•;¿aFçΝ¿sç/³vîü;W2oçί6AìÜù;wþ5rç£| }žÜm&ëî\ø;þ5ñàlš)lçÂ߹𯒅¼-úýáϵg©ß{y>1 öº\ÆfŸ»2™«¾ÄÕ;;›Ž‹ƒáÀȃeîÁë?Vˏš•@*=te2Kýp::3JbÃA–ŸºªQº%µµ‡à‡ŽÑ؈I»!÷S쬊;«âΪ¸³*~¼!֗X·Ç´¸»‹cgZ¼F¦E«eÞ}9*ŠÁ]#íwÍYÙ{9¼ûº7ì“»£âôîpÔ¬Š]ØÙ¯\~K뛅‹¾ùÖÌâ=re¼3«?ÂÎ/½‹édE]òÒù@\±ùê~‡p8^ƒp!ÓT–Ýa½É¤ÁÕãË¢k¤ÜQs#Óü“W'j4îƒ7—FXg¸áÉ«Ó -V¨éÛd,½Ö5Z\»,¨õ-l;KÔpg‰ÚY¢v–¨%jg‰ÚY¢æ¥…%êzX¢œÝÉZ¢œY - R;KÔ¦)Ú;KÔû²D]ÝqxÕÞñ›b_;r:î6ØnDՙmMp¿ ƖuƸaIÏ[Qy¦AU“]噫’êhC*Ï4˜£]å™ët07èܘC¹ß›<ëôV9ä6øD^·’ßîL¾Æü~w&_ÿmș¼«·¡gòzªÖ¦ËÛ[ ®±äqÃÏäMŒ³h¾Š7l’wà*:²ànhu´£î¹AZ vWyªÔ¯·«¼qMETyã*¦m)RQÿîïÓ· "ˆÞ^Ýâk0¢‡LiDo®nDó³q1•6*N›íªMã×!˜úC±Œ§87X[y‡u¼aS½·„ßËþNÁ¼! -&“É­Ú‹øçÞi“€?×üªM& í¼h8çÛ_™ðsà ¦hú• k©ú봁l~…¢y£!5P Þn¬ù&ݙo6] ۙo6FF϶Î|Ó`D;óÍuã;óÍÎ|³S½3ßlõLíÌ7›g¾¹©f€‰QtÆݶ¨p6êt'þ·Ã^ƒtûxݹ÷/»î5ÎӋ§†¯›dÈÇÏ\Õ“výêW'qñpTücZ º 4˜™Ç®j¤ƒáѤ7i°}ÇØüE¯ßdNK]ÕP»õ •›¦Õt?hxåuŸ­]ñüRÅ®dÙ®dÙ®dÙã (YÖ@°ÙšŠe»‚eY°¬]ÿ2ÄÉ°ž5Ü äl4¼hpÔcëšBЇ1­Q€ìC™Ä^LG'Ó¾aqmJݕEªPt6%Ó³‰ª³YÆïµ2 w6禸í l2´]ÈàFø -¾/F?÷F'E:xy¼¢‚Ç&… 6X©›4Ø`@7"dpRSHÜPNýˆ¦Íuè$;Î‚án®G¶åÇðé\¥½ÓOwúé맍¶ÙNCÝi¨; u§¡n†Z_bÜi¨×x@7BCÝú¨ÃúES6WG­?ƝŠºSQw*êNEÝ©¨;õú«¨·î=fÉñƒÁ©WU¦tüípðÌ`ÁË1÷|î Œùô“o/-itNúÅ£iïԉ·Žù<Âo.‡£I„ʍÐ/ȏ3Tu†ä 'T ÷;“éņa…`Øý‹ò@[±Tjؤf)Ê\Åm¸"ƒ °<­ú`·uÒÎ,ñR…Ýïæàu¼^“$»Tû¿ÚmƒT+‘JxO¥"Þaúg:(4œ"Bs¥*xKjOû=íÎ8,刺ÄŒÔó©‚w_DÈNTø»ô˜V˙½ù8­*sÙ ø1CŸûP š¨¶=˜—bÙ_…%)³sÙE4Tø ÝXe<ö5E“%½MVY®s²rÌ"/yjGÉì!íAðز‘§yº¬:Ê ôÄ,TóOFC6¢ô‹ÌhœóìW?"f¦ÒüÈݐ¸QâÆAùªáì1dG ¢ÜÂlØ¥#[òhÅ•¡r#¤™¢¿K—*ŽP¼ëøҙñÉúãKWŒOЪd´*-F}x«R–V¥.ÿ UÅÐdiQΡčQéGÃËÓáσJ…Þ™ù­^¿¶±?oç9ˆfŽÐ‚~1:  ½´-ñC ËÚL¥Z¶²vª”7k”R  —LõÕ< -(<М+ÐNì’FØõu)Ìc£7殑ïÀšïúŸD4Fï,í–Z÷Ìy §+­{%cëηÃÉó¢;žà**æO*2ÖNE -»MäI:¿Iî=~äøȋ³áèÂþFËÔ¬âÓáIq|ïq~lú|4yÛ/ŽÃÛË«^ûã©eS|slú”¶„e±4YX°•§f–‰m¤Û)þàÝ=,^´â:°¨Í·òüÍÂ:KÃZ÷¨àInW¨tk ' €:›Ý3àe˜ßZ¢¡ZkêWXÙ,êZl–,wn0\ÀSûàï/A¾˜eóÅà ŸJÌ«X’EáYÒô]ûuÞ%ÕÌküá²Û„u6áïžÁ;J•)+7SÑY;»¹/(fAslb†ÌñšÒ©1 jà ƒ/å7E½;°Ëúéu°p‚ka8F8ç"VˆI¤Êè0€¸ngIŽ¦ª¹'-“R¡%Žä"€prmCsü© -@€LX‹í!cPjtc\#MdjÙO®@°5o•™ap" 5Ù<è-‘<ô¢fÀò ¸'”90rĝ DIÕåò3½J¡9Rû2úîŽ;:à`ÀQè;Àœ[†çH‹>˜˜gZàXad õ!G|­è;PÞõÅA\_͎”Â@é«À÷šÁÀô …饧íZ*-,Ë8øKDK"ɒÄqN£&Òôۜ™rQá„ó•YÏ+=ZòØ,M \ˆÔ75ï04ÑÄ|†§¨­efiêŸL@Š—€áYdÕfݶeÖ²¿oÉJÞæZ ä‘õ›­6û00ËDˆx([Ï Ž×ºYü<¥=½d[ð)ÕÚîcó È5øîÞ£ø£@Oh™]iD®4|—¸ãPÝtŒ^ã0àAӃ}‰ûÞE%D¦å[.M Ó (½…@Ô‡ƒú93« šçµŠ‡gžÎEâŸ223a„“¾ú·Àõ‹žvývØøL;<æD0| =M_=v¸·ÓÓ®oå¾Ûñ,>LM+.UK‘L Ç*W «Z%üf«{ý‹ê–Ò±ZÿD§UÁœ;ð7wææ3Æ[ì0‚Á¡sËܳU°èÙ3§ÓÁÖIò ]÷E۔d…9*SsV€èÉ%V|éì²ÚnÁuI²6·âuï{Ûúñ[€üÕ¯‚=Œ Ã~ÝNÿøñ|I#نöY´®d °O·°C÷;“Ηf·ñìÓO~|üÉ¿¼óþÏÿ,üÏÿßÿü?ÿóq~_ÐñÝï»ßÿå:¬Ï忯Ú_ïöà æd®€폞}h`^ß.”}‚Ø‘·Nùåm ølY’¸uŒ\9Ç?~î¤ W”?BthôsÏaï"âãy”–½q`©«‰] ±7`V™iá˜ú禮g—§ÀSûç%Bç%“[ÇU²I%‘€¡ZÂpfÑÌ (4’G –y!%#1åÖ1*0ÆÆ¢Š‘%×Vn¿‹¸rëø]–[Çï ²Ôíx¥Ðrëø¡]AÖsg=ô‹Ÿ·o„‡{[÷¦“aËnÉÞ/Eð Í{מžŒ‹ÑëâôØ(Ƕո¼}Ì|ß ­œçvÅφ¡%‘›#œVæƒQkÌJ  8S‚ÅjöoCƒ¨É©È4Ɔqž+Òº=0„Ló7KìȬáÈ,iü…NfO„ ÀC äLÊøQ³ ¬I€°GìƒC怼Í`Fg€BcH¡7¬%È÷‚ ˆùW!ÌYì Â£~Ü}Á^Tь”F¸§!0•á¹‹ Ex¦â.՛AB~Üy³Ûó4Ëʽó¢Â£y›i­E„>†øÞ`è} èæÕ¡÷Óæ{O9u7žq?(ÿh¸ÃüŒÏÑÌم¤i"SV¦e ´ƒ•†mK%"‚H`R—‰©Ú -í³%bª¶µ©…gUÛ°Àx%DOJ‹(Áp¨µ§†ïALHßט’~HþÙ0l‡>xJÎQŒ,læô«Å”ŒnÑ·YF»Ìm ӑLÎì)؋à",QÒ|̅Ž°hŒ]øcˆ§eFȁ‰Í wè=E|/Jœˆú[âD4¬À‰üЉE€À‰f©vHöݬĠ.Ê0«áE,S9ð•—(iøK|( VYQ"/dðr‘E¼!JFÀ@ɆÐ5B/"JúîF„ôc"XµÅ'*ÎQ‹|›"OgˆÃp˜Ê`Q1ÍÌÉÎdZæ’Òœ– ×% -3¤DD$íTBÚ¯Gˆ€èÃ`ˆ3ÑÀ¿>"žïfDÞ´Ô͈x~,þA?Z‡9úNě£RðÔ 2ó—©L—dÆÜ¢™“$P¼ÊÛF²È‚ÈHßc‰‘`±ÀžsB_ÀìôúX\D¥,Õ%iþZ}Ï¡_v‡¾Ÿ‘¨H XR Ï<æÀ×TPɏĜ˜xóC$ÊÁ Z1ñH ‹‰Gb›Ž;™1ñ<,"^³C$Ԟôþ˜x®›1ñh(þ9OÂ<ñf©4# ÆÄ#˜"‰Mž$\ÅÔ#),¦ÉjþA'ÌyÌî{L;E¤ ;>Bë)@ïŽ)G}ŒIGñúáêàI7K£᯴i,l-wL‡Íç$©˜t$rŤ#ÁÌ?H¢›GM€˜xQ/‚Ù1jOzi׺~–¶­LضD¿m lÛ:•¥½ˆzÜÓʎä""ÉN鼌‘ÎKbó²!ö€ˆtHÃp|5QÀ¿?"u3¢„@<ñF߉l³ô)‹wÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(æA`ÇEXiÜôâˆZÔ½ˆZ4ùA;¬Ñw¢Ö,]Êò\D-Ѹ2PØq“œQËIS±Hà" d„”¾GÄò @¬„Ã"¬4l÷ވVÔ¹ˆVY`õòCvH£ïD«Yª”¸ˆV¢a‘Èã÷£‹"Z‘ô‹$,ÿ”“À¹ŒO®gô昧«ü93àód•Oǀ×õêà£ó~pÏnηƒÐµ¼;U4\:•nŸpǏy´Êõƒàuœ?øàœû§ mà‘ͻ€¼–¨Š‚Ë ^åš7ñ™G«˜Ø*‡ø‚ý,\|[b…â,–*T‘ÔADG}Í\å¤*XxËAï+@ p%ÒÖlôtcPÉÖ類Eíf:[g›é¶0Û*…$PrFj¨’Ú’^é )ÀõlxùÝeéúÛʪøÍo¾ê†ˆÔvb¶2§½¸Àʈ>óðy/n´'²¶fømOÂM3›d‰ÿêb\᳍ŏØÏO|žF¬ «1ÑÇÃÐ?÷-ƒr]ø­„Æ¡‡ØC÷ÒCúHMèQèi<èƒP  ²'rÄuAÝõö3þȰLX oƒqIðtáî3Q%hôÙ=ŒÏތîõu/· -=ñ2ÞÂ‡Ñ -ëÇaß½‹òG×ßÏÃxâGYÄ -_ÃP¡OD„ß¡Ã÷q‘/<™¿Í<ñYäÒ¹a ³WùªEm5›½¤c)ÞÙë|âårõ…¾1/Êč‰ÍE4CÑÔEÔ'âÓTûխęىç-êÐÁû¸²—'³—æf¹°´T¥9©ï'¬n­óùËT–âÞ¯›«Ù Ìh.¢¶ç·Z´…ÃÂÞ +{vCÆ[ÕMßAigÇ~/^‹èÏÑ?MiÔXìŸ%UôwµÖi5ýâÞ¯{–þïX5ʋ™Îᆲ³Žkޕ1äXæ3ópŸÅ8 ÿK×µò± ËbÁöÄ&ÑG×â,šc*}J³ò2˜_ËÊ¡5,6-Ú¹6<,…R·6 -vûëK??:Zz«ïT<àÂU•¦xz.2Jc·0Ã$L†‘ʵPhvÊPG€;Ôs†öR 袀J–†6¹³„z, Wu1¡ËÂ̤´a_ˆº1ÞD€.¦2ÙîøFÔaevTÝ%…Õïüøäð»Ç÷[_¶nw{£n¿8ǟµ0ºÒLyÀüXž]ÑN2†&ÓTKaí(I[dÌì}´*—äX®YùL%¨Éø²l›CXa¹I&Á€+pz¥+ɘå ”¦q"¹¡¦Ág+»º¥ -~J Ä¯bÜeÌY €ÖiêT4Ó–áì9ø[ðWkˆ^I±Üöìhæh·¸™+fPÄÃN#Ñ ä¦mžæ ,Í,řۃë4lܓùM§”©vJ3C×} „EÁmEEb®&M¶~[Üü"t¦Ü©ƒù~®`P -õ‹–d†óÀî 胗Œç¹Ên†öõ/s˜Ùãì­¤™×«¢ÂœdNÅS^Н¸_8 /¼åõ/ûK°\.à³ÚŽýpè_ͨ@2O £E(T ±:3£&C"ü–C5uûô*C¤M;Ãcœ‘8ËaZ)—ޝP4}‚¶šûJÏ{ Þd†¨qÜÌ«g,’ìèa”úô:·©Ç‰3¹¤^†fá¢4‹ýÀ å½i=iV’£ð’“j§ªeµÆ³g…¾SÕr‘¶Sºë'¢ÙE™–^ú]ð1žÒñ¶y3”âB5*“†ù3=çœQ¥âæ-°ÿPDȕ½mǬCÎp×XE"I\Ö}`uÔ,EyÇ,d #éÎ$Íý°R7ªá7a#Q!WÞì¸f„@{p¿„ÙàäºKe[¦)^èeúmGŒŠ`J“õ¹cYŠ»4Ã&dŽ×TU6Ù–ÔÈ3ØÏÌÌ(Óxå>gD'˂¸3À5m"·>³¶”‚÷˜W!§‘mÅ~Rè;j£FË®áX‚”ÁÎΤ»he³¼è ÝÀÝDöÖ5 ¢.\Ë¡„­(kX–µ— ÃžÂš¨6\Ù  û¼2ÁÈ3 ïø¶¡:x cÆ©­sÃl1ia©åŒÀ’X˜™¹Ù;¨˜ÑP¸ÔÎ̃º£õ.µ“xÉúü¶@·W†#5ÄÝꖄ`^eïÎâê†7¼èœ¦cŞùT©Ü'k(öVÏj[ŒÓ…Þ¸k…S…ÐõÀ݇4$ã-<øݚñ^ ÿT™ýÎ¥kLx= uØÜw0Ñ»y¸Z§â Ðrë2S¿ï~‹ûŒÔôxüEZ«zayÐâ×Ó={%O¸7HÍ~¥Þ-Ò¾T囹(7Òàa2r‰¶?b!ây} /¤ÌV=šæx¥Ê¬ŠÖཱི:[½÷VÞx:ë¯,­’‹è»_F¥E¯ÀŠêW/~.¯ëҒWÑd—×_Å*•å%ù>\hD{QAÀÌÓ^VÌ9”á†Ìà另ºrμwNO¯õÞÊ9wÞ0¼N‡¡˜—§o#Ù@Ùéô·*œŸ,É+– MËEå¶ÌÃuÅô@(zè̽JT¼Šž¼˜Ã _³y¼ è¡÷ês3b^T„A…»]ù ºâõEñfrRŒŠ^÷üøáðÕt¼È!÷uŽ,M*DÂY­½ÁF͐˜J‘qaäÄï-:RÁ`̈́áCó'«†k)‘ObFÿ퐾íÑ׊oôelWb½tf¶Åϟjp.K:¼Ã·Cú¶G_+¾Ñ—ñû[€ ®°4B^eÙÊáBÂÓɳä#EÁ]õúûË´õ°óz8êMŠAë¼7øezöÏÿ®¸‘òãØØ  åp©(½ÕÙà¾ÄåE0{уÊíí`"Á$-Õ¶ؼ²Œâ£ ÈÀå˜hœŒ2™¹3ïcLÚ6Ž† ó°!>’Û !Eš[ç/hÕÚZz/·«f+°Ñ¨Át€F͌¦.ÓÄÞÓșÍì³õ ²6*@1-@ 5/F¯ª […†‡ H ÀiQA¶Üàî߅Šüò.jyö–JßH™™Ëxƒ‹-r^"˜R :‘Éü5š¸”„yQïèm…e £‰qá2ÇÉR)SöŠ?a«¨¨Df(Û(×ÜôhçÄî$à =£CZ'3Ü·‰šfƒpäL /^« Š0{¯ Ú<@‰‡x×'þÞC}Ï]­Àmi‡0 O¬ïgÄ,¦`"¨“ - {°\$W˜p¬)Ö´”æ„]¬JhÓ & I˜½­&í´ Ì\§p‘´5C ÝÆ5ƒAæÖwOˆÂ¢Œ^«)5ƒÓ—éÐo¼—UŠÒà`ûk"q$Àð%R¿J{‚‡}‡ëDõ;T“žM9Ü˸Ù%]̃”`â”ј©›° ¦Aᝊ)ûØVl05dú¤f‹HeDleÄ!‰ŽyJìßèßW¹»Î‘@f›²<çx½dÆrëÀt*ðlw†¸ÓÁBãö­ãJ^ÆÇ5¹>+ø€×äh¶3kñ4›Þ¾W‹éó5H—œãlה·™u-îfž[‹¿™£¹‚ÃYhs‡ÏÍq9­àsF|^‹Ó™ç*xb[ƒÛAÎÎ:üÓ6×âx˜”¾ϳë}®g7ÙZ|Ü<œÀëð>ÈfnÊý ¯uŽÿì;ÇÁw³ĄÊà-I½·ÄYöðò¬<³…F™×¥!` -êŒ-ãG 3ù–5`§f•0zôÐ -¦h¡®‚ È¥ˆ­! uêBO±# èAœY˜²yPԋÙq.95*h€1\fë ]4z™õÈÍÒ&‚FÝ*9B·*¥Ç+耥>UÐ*^]«¬î)8˜ò–4{#ÍÐê®9¾–Kþ‘ -ÙèŽ5A¿žzƒ‰é÷ޞƒ£žÿòé'ß^âo™ýíYjþ}zòw£MS–[û£éø¼õ¤3è¼,F­§£S0Ú¯ø±e=èôû½—£Îåy¯ëš¾0”¸Óz>œ¶öZ¢õlÒ¾3×ø³–éñíêGŒ†XùÌLë‡G¿Ó=7©ø³Jž ÏKüixÞ/ƓÞلڝî[بԴ3ù¥0jñàeAmÝ|Uàµ8þ4*zãâÎg­¶#·™¢2±?ÀĝîÏtf&ê<|…Ïà0°ÿÀÝ!àÔ|­{÷GfA÷ DqØ;1ÛêøàÈ´Lö;“c;¸gCÓ©;´ó#zÏ9˜ùhãêrüŸûïò¯ùòÒ"µ/7ŸñöÿÁrþA; ÂûEK”Þ^køï{¾ªö®F¿ëà›á€-r=è;-ú/PìNË¥šÛóŸðO|Ìá,ÚîŸù­NÃù¶ø™Z·Xù«˜û -ÿ…m(ͬíނ ©Ì7q„,3"-·´HÒâLmn3³x4yk&ìÓOîüi0üy€ßà ½}¯ÿv<î?:ú¬uç[3p\ݹgÎâׅotç`xq94 ôa¯o†ŒÏœwzƒ–mbÁÖÓtǵùú;ß÷Æ=s\"Ò -$G“N÷U#$ûq¯[Â0¾*š àøSÿéÈ= -XcáÐa8y^t‡æH<Å_mCGV( …wîg­»­O?iݎp¡dp·…/où uçYg4©åÁpp:íMê p9*{#Š/¥—¾^ƒ§§¶²8’8Pì©_hŸÍ¯úÖ_Y[;O›ý¤Ày§ÐÞ „ÎPIû©uÙÈþ MghïûԀòWE.8ғLbršAäù 4³7ä¦FuGÓ¼QÎñöÜ,—ŒeMmôëÑh9Áöû…9ÈÞÅî ¾5ö^4¦€bé Ì3ÞÝ)tÆþˆ(*X&j/›À-ßKOfg؞¤Ž{>=;“Ïp^¢¸ý¸ßŸ¢~5µ‹7Pcɞnpk -‘шƒÉtôº»ç½âĺ_¶ a÷œ¯Ì;î¼èMÖäᷟN'c£²Eb÷{ãË~ç­ýúÙgô~ëÛ,Ýl§j³£ÍÝ]ætû üÊxþ"ëÚÇ?ö¶amëS-¦¸Œ«£ÞÅe?VNØÈ2 ‰¿r–FêÙÚëï™Ù…“ZÝS׸{hߝô»“~wÒïNú÷©Ý}ÀÈ«°f1ýÁ±ê£ã9àm GÃëßËÑñ ûª´:'#ƒ¸Ä'ÅòÉam&·.ÃÖmˆŽŸŽ—l†­òÆÚ*߅b;ëYm–”m†\½ÛÛ¸‡QÄJ„†H?󁫭äôì,JzÌþ½ös{pÆ7½.?5±%èMÝI»Ó»¬>5€œ”¢õ§Î`RÔ?3!õWetf>_ufÞ\^–ïxَ—m¥#=cdP4(ÆÖòŸ—_b™È£§'n–ï—­™ŒâÖ*Z߉S.áò&ü±Î¢ºóݠמ BLŸ7¨6¹¤â_Â%Ëqß7—þ“YâVO‹'ryjæ'¡úqB^~úšhî2¦­z\¡¡BÁåCFëÔy®4~P { -¦gÐG¹~öòe¨2­·?¢}Ñîw€ éÚç«øiÔt1}vÖ9mùàõ&AˆP¨®óqûhx6ž I$A.ú½‹ÏÜìã^úû`rÙ`ûì“Ïá[}˜¸}é.ò\²WEʳtwd¬sdpôk~”#c»š«bPÁœWU0O’å5Ìm=ïëœíÀgêËïÑÇ_Dî^Cêj²¶¶`þEöÞ§ÿƃŽºç…á,e:ÓþW1ˆDš ´ í,è+ì_ׂ/\ƒpاSøþ¨?üy•Ju4¼lwN‡?/V£ÊûèoBèF‰mD¶é¸xvt¸ßŸŽӛÜuò.¦ôq·ïT-¨IHÚîe§[6ñP_IÛ=é윳””:$¸ (n=xsÙ1Lu¿8ŽŠÖ÷F'=âœÏ׆'÷;/ÇÝs¨M·‹ÿÝñámæÃw}_Œ¸¼yš²àËNÏ24oâ{]Œ¬‰OySÈigôªÜè|8úå3‡¹^w<ê~V¼Á̝í˜û{bî5¼u`–ÏéO++æ´J¶Aœó÷âª2k-,ªƒ%H N£¤«+™>ëô ³í0žÔï÷í¿>ëŒÇÅèÂl±bðÓgHҕøô“gÝ**AjÒ?ÿ‹~n°¥€wüÜ1ÛØc®®äuûù£ýÖóáÄ¿"IÜ-Š¤ŠÉ¬Eªoþ¨èŸøö)×)$ƒŽþùßßR1Û›×ڌ+a“4ÂH၃·Ð~y%l F¾=Os›: ×e»ËêX¹ý“ÎK£|wü#,ÍÍpa¨:Ë5sp͙Ä"—Zº,›4ÐlFé6ÌÆa[¬_ÁE¾ykÿ+©ótj/D“\â+\퀡Ý9ÖÑÌ]IàÒ^ô€aØ¥ÃÌ µ}Å3ƒY¤ÑDjÓZध™¶ ÅIÂì2 `|á;[Fi`¾Ê“Jxܐ³’4ÅÎf*U.1y.üœ!Jè%3ÿœIŒÓRH¸¯¦E3a+ z)ðÇÔ¬Û<ÅØS&ÌN݄~ï¥ò€S*&\¯Ë2鐹\Àpy!a=2dHGæî4Î,ñ†N›u/lÈ}FåL5tt#É1ÓZ¨ õˆÙ$aWSžˆÌ.yåòº5QÑÐ-Q¹_E2çÐÉ4 Ô2eÖÈfpi\#pŸ$Ä鶹 å6hùpKM‡Rá¼dÌ`Ô2ìªT@[XÅ -R~°¿ÂŒÜæL)Í.)nkþ8\Ø9 ӑ†é0ÂÍ#„„뇁€X6×ìÄ$Uv¦Á¥+ñ¦[6ƗýTØ3ÚìEe»a–µÎì\0šU?L»Æ&!ý(‹peRb:XždØ7©´Bw3,Lm;ç3éÒùÎ¥°¡™ÒÑ5,dI»Š¡oœ‡í–i%NŠ§Ò›P#w7eÒDÝaº“eø¹ÙM– (‰H„Ì¥ÍÁ›;}•ïî|aJ‡é¥þ¥µÄJêòz3ƒf ⾔Š#RF P í a‘ÒžÀ-Œü#aý*Ž]1 …¹Ý–ÛUÌ9ËÀP!8À&W¹=‘ÀÆ5ý S+s¥°'†9ÀvKìÈmò_Ä«ˆº 7¿Ý41m&Ãv3¼ -0âè4Opm°Šã"ÉÓ£5Úfútâ× S™ACÏ#öÂÌ -´Ä”9·7Áfpad!:öHi{éÙ 'ZæI|€k¼e6‹Üi£„3Ä2e§€5U:BN gá¨äìO³É%GÆoNci}Mk&…ShÆiH ë9ÝQÍ°s‰Ó va›ábI3[é"µPd-VR˜ -ç'w°Ž¸©°Si¨…b€!¾Ý‚†ïåÈðýaG'€(v†Àa“œExá>3`"â5“‘!:s”KÄçy ›®|5ƒ7ƒã®NUDÒT[n˜á¥ì˜Óe…´„1̛ó¬ßgãHOpC •â& -|V0•c¤©ÌYf9¾0箩<Ë1š† -pKˀ` Q8^RØê O¬ŒÌ)vwh™ æL&æ3ž.)ðÀpp :³Ý¹S:¸ð܊˜¥0Î^* ›ÇÃU˜í€ Jf÷²° -àÔr ÍÌ,]"QÅL™MB4è-™Í®à¸Q u”B‰Ã±nǚ‘9RX"K­-óÔæ0Kí.Õ ÷mjäIäaœzÌhÓ%..É"F dԴ՜û¥ø/Z$“Gb~µãgö²?ö.. ´e%×°ôðÓQ÷¼wZ5÷MÁ÷ÏÙÑм`T•k¸Ñ£aÿÔƖ¬Då›Zd‹ƒ×# ¤n[º§–ÕþŸ}ε¥ãñö£Qg:žLÏÀ"ÃZÏ^6TÌì9:&¹² !MSäðFóÊò ³ølpˆv¬âqzX|Vu$i¤¹´¬NØ(¤–t"‹…øDܳWµÍ]\Cz§Oí­î”ëYî ÇÕ«Ã6ã†(\h\[±T§Nx¤´ÑHÌ%údyXr,šË'×£ÎÂLi* ¡­™f*%æiKE%é,·ŽGÐÚïO‹Ößnë/2ñ…Òß>sö¶7¦Kúd`SPd!£Eox:ê ^Âã†:€ ©~GU3û–gûÁÞ譊ͮL:ì'eÛ뼧`y0ħU•yæ’i> ù‡ŸÆ·2ÍÛPmÖ¼Š%ñ¥ñ€ê_lï;ýÉYÿŸÿÛ ãxøÚÞø¢srX˜Şù Å›ÉI1‚NLJ¯¦c>^~wY\/§ÃŸ°_@LÎYÑ?=:ö - Ö^éá§ôlg2½cSzúa¯Äz~„„:ššæw}×ioòª3šà^zƒWéÙøg°AbŸ±½÷Ž^<€o™¶v^G=3­óÞà—éÙ?ÿÛµ¼?šB•ÙÏænitäZBz·xî»S3ËÓÿ^pI°ÐÃיË.ïüøäðÛái±àç»­Ûo.úÓ`Ï,¸Qïd:ñ—OÞ¹7u>*š÷ô–¨|”Y fîÓ¤ŸáŸI¸JóöoããםÑønTã=nûºc˜5†Æ B˜kçz3.ÝxRô§fج¥ IŠÉ·H“䊛q-;u½4ÐþÐlïÓZƒ¤¦ïsQ¼;!ØrBԛëÜc[kgԙÝ+ŸüæLáË×õÙ´½‹ÆÙ5 -ñðâ°¿ºD¿wÀ³ g¨a4õWêÇØ7GpÊõêÏvmåñÙÏ×`}o'Ã=ç[3÷2ñqR Güsï29kL¹ky-·LeÛü?[9<£G¾<¯Å]|Ók1@•®ڛzõš hOf«gëm­!½½&Còñ„ Çs2œÑâ°8›<õŒ&[kxó])ÙãÑp:êû©|=Äsº]‹~\“Ω‘¯ÞCgòwî̯N‘¤Öš‹Z#ȟûý¢8…µø}„œFÃË{£¢c£á«NüÙ=©Á÷ÿ þgÃÞ`‚ºý|Ú/F¥ҙ1û EúšÁýkžœ} ®½ŸÍúŽ4iFcyvï9qWÆ[{ðOèÅó¢ÿbøÜvÀöèÙp܃ÎãÏÜw*©ÿ›eÇ÷F““agtz¿8ëLû±ÂÖµABUg))üqÙ9= $³/ºÀêòeØør8™…uú=â!š¸Ýée¯MÇ,…P]”²íßãÖ½édØzÞOŠQï—bë½ÇŒµhEµ^ ŒÚ?œNZ/GÃéåò¶½ñ°ß™­ö¥|ýRë¼uÙ¹,F­qïbÚ¹ïaÿB“Ž£`Ët|H=çQƒÉ¨3_v̆ë¾5ýê|~ŠKž-ÄÖâ¦wÓÚm_Ž -¿«W6yëHªl’EMY܇•mã>¬lúÀR‘ ߔŒ®ÁëÎø(‹•¦òÙ¨£×E ,Û­§½Iç¤×ïMh!ߞ߫øœ·éåkzÙzØGg€™hD8iÅ:„ÿÞãs¿qE´žfM£Å!’Ò#O§“K³ W<$ʙïàagðrÚyY´ž /ýªöñúúÓNÿyq9íÂ2W}1¼œaªÑÏA¦åýêÞãg‘-ð0þáÜðÁg£áY¯_ü©x;;!¥¶]dHYîÎ<Ê'ÅiM”Ïî?¬†|¥)Ž÷vÒ:ó3ix@¿7(Z³2*ÖNUÓ1fç¶8ãÇG†Àš}2<õjÊ4ñ¬g¦ƒ—žLÌ?~ØG¢ÀÃ2šmûÇ¡YÃÁc@e ›ÃùøàÍ$ŸbaӃ¢ßöΤ¸JX™Z†õÀdsÇw%èîÙ‹‡má6lÊŸv`F[‡Åk×±]J€§—nXÀfL4~^œÎ,ÂÙV†G„EÂæąÙæGÝN¿êJ£EÕLz-3¬ÎØS?Ïؒ^î‡íÇS_Ü´´°´{©w+f¨DKÁuª—­ê@͕M£!ePù ã¢pAé¼Æ‚‚)Öï -sÆ«j½}{Ì8óÖä¬>R¹â×x.ÒEN‹7{£ñª.Î>sTt‡ZG:Wf« –Ö§ °ô÷ÏRmp‰Wáp²Ã 7>7Ë+¦oý-8°#vžç°Ôšç€¥æD‡ªg Øj2`š£dbt¿$YÁUMÃUTIN¤Ê’\t4=1ìÃá`2~œ³BŽš‘wºýÞ¥‘ÀÁCóÆHà/Íf÷zYÖKŒPxÝ{mzläv#mFÌvÑk.I8‡øK¶ðoѬæê²Æ€wZ\~‘ϯ­»ðpHá}s‰¥A&<4ä Åùñ}bµ}Rœö¦‘lÿSÄwAŽlmv™²Q&@õ)âHA?é`>Ü|>/Íç\Û§NÖ=*ɺɢf/‚ô/ lcš;ßÛ5±?»&JmŸÎ.ÕÄb­ώP Z¯"—ÅY“^¶ñj‚•Û- ˜mT“dã,ÍXl˜ þjõ¸ŸÁä-c+–r õ`á½ó÷áIûÒ(š–7Ó±¹vðêN¿¿¢ÙøUïòÄ ôÕ 7žm7* 0g]­hÚöûMW(ù³Ý¡É°è™Èñèl@ño†'gÃV$±¬¢xDÜû¡8¹ó}ï´Þy24çÎOËGÃ-uÙÐ8×ýñ¤ß>µ¶>…'ä -ÁsîÈR[ç¡ËÓ ósP¿_—§õÑÛ`‰ðHÕz¸¼¹vK:\HˆÏUÛםm;3ÉÚÙ¢†%/^ÞÖ 1ö.̦j÷ÍQD:G;_Ñx2ô†žL­D=Š:’%ª\zÕí­ß‡¦âþtÔ=o½½Ãi ¥zƒ–¿X6C€lPâÆó/ìΒsq«-— Æ…%èfÛÍ- -l†¶Ùìæ´÷^bó/_Æ;Nœ³j)Nl‰v¯: ;ã“Þä¢sYŸã•'f~ìýQû"˜²51Z”Acþ²AS^ß%^¯yeóÑi{8‚â~1Mµ<3§µ/³‚VÏÊf—βtaà‹_¶—/F׈ÂÆ"¹{¶Ùì@Ûʆ¯WŒtܽìwß.ac¶Qw0§Î6š]&ög,¥™²~ç²9\Ãe¸|yñª] @‹_Ê®¡ÙØVY¹–±½åïÑf©óÙ(DϪX"´5„·FUÝù°G¬jÔ /Wµ9«gdˆUí@C>µb¯Ø÷‚ú¤3/›Ò0 Ã#ãC©FëI<®UãC©ú<‚æPÙe<ӓ­COj4Ž{Rµ³Î“öiG´.GgÃÁRvíÆF+÷úªÙ›ákw¥Ð2nŸô@š\6éãö xى<â Zu:dæšsi°[ŸuÑC¬æ|¦áø¼cÄùbµ U1³¯ç¹ÑgZÎ4ÓU§Á›ËvÙ@Ý«j6ÍzáÐÛWÕôå\Ó ݑYv;-ihN+šö{˸‰iކNYï]ÐrxÙ]Æq°ÅxÙôc‹ÓiÐã{ÃeGEëÞô¬ÿÏÿg<¼\¡Ï +Ä£©k&Øìl:è.[5¶‘3#ø•³âÁ‡:ƒb¨V—±ÙJí£{ËZ·†Fw=m=|úèù=‘·þvûñÑÓã©Ô{üKž$Rå–êƒF*ŒeÇ*qÔ4….²V7"+]÷âí2 =j9œœ¯ÔЭ¸ZµgV%Ťg/µ¯d£%ôÓqqØEŸBµbžŒUûØ,¤‚sþYïMÑVŒ  -^Ì@È÷om_¨’5ɳñK#ìS‡`Lº7²OaxÃÜSåwY£Qã—ÙÇj¼­y€Bd$;ê¼.ží»wÙ/îÍVVÚMþ¿ÿûý¿ÿ×ò-ѼêÍ©Ûþ±dmºvÝÈ}MÓÿxðªY‚ñ¼»:‡Ïî?ÜûÞ蝓ÄÊáåĚ ˶Ýo†'­§ö§ØJ‰U"khÜ,rÎßÙïî<~œ©ûŒ•ÿöô7ýü÷?|õÛ»¿øFüæéÞþ×£Gç_¾üë7ÿõ‹Û¿=èuÚã_§ßýñAú«/¿þîÑžÈûòðo¿}òõhÚÕð'Ù-&寒d|ÿï÷_~‘üúë»ÿÑþÝ׿ÿârüõøOüŽyÍ×wÿuD­¾™ì¿üã¿~ý{Yô¾úC÷~»ýۗsï:<ý³y¡¾ÿð֗ú/&÷ÿþÓ¾üËÞ÷.†‡c3ï“óÏÿþjúð¾üõûïÿöóšûgÉ7'•Ø~­ó3ýý¿ÿõo÷^´¿_üָݗ?}ýûWúúËqûâóû_ܚ>¼ýèô̼éõð?ŸNïŸýôƒÞïÝÿñ˳ýóÉÁ¹þ +Qä?s¿Ëÿñõïÿí·?XD¦ÓãƒÿxùCóé7ÿ¸ÿøôñ¿îïeÿõ½£½_ l'~ìœNÍkò¿ßþ¼û «þýöÁ¹<¾ûû{·Äo>ßÿö‹ÿüüëƒß~÷ð ˜þîßó«ó»Ýnç|ê}þàìðܾš%w:zÔûõ~ÙûoN÷û·þí·{£Ïÿ6½wxô›À>ûúî7ç¼&½ûýO_ßt{ñùWOîÞÑûª§õñ™¸7ê>fŸ¿ú’y”Ýûߌ¿7”Ó¿-ô"9ý²wp§c&™=ùêöÞÅ~_?»°cøóá­¯ÿþW?<ø"WPáñþ㿦¿úƒ>þÇç¿ÿþô¯_ò“_ý„xÿ0¸e†ô‡ôw¿‚iùkúCúï Õö_}–î¹úýéaÂ~úՓûw:¿ÿÍÿ_Û{m§Ó#¢÷ßZ¼ƒ1˜šM¦ÉÆ$›`“ Æ69íÙ³/öӜg8WçîÿbGR'uÓøÖÌüÓM•T*•*ªH½½€h‚ðÁAA¯4Äô±äGØdœþÏW¨÷³Žü˜‚æíyK€ƒ»„=‘È;¼¹äâ™ôþÍþ^†h5ÙxõL€AÞʔÙ!|rCðXž›ð­¹}Ðgr#DîÜü˜ôûÁ¿¯t;÷gÏ}»+ûüdb6f‚ÓN#òúÔí¤ëÙÌkî»õ»Oí?£ €&ãïµGAûÁY??òØß2þnºNæþÞGÙß¿ ;ö½~ZÙo›Ð01…š³-‡0ÜÚ¯+ézÕV!sÖY…¢Ckj @8í\ {òm²§¦”†'©Xûô˜n—OçËÉ ˆ‹Q‚YŒîAπjTÏÂZ¾?{ZxÇñdŽ ?R>ÄñqœÌ±9ì™md(\/>qñÅeƒbŸäÏñŒègƒ“ª\-¤Ge⛸}“–ïŠ+MÄÛ}¯Õ8ŒS#áS$xnFæ¤Å´³f‚ÍeÞ^u‘¿‚}ÐÛ"aÓÊÏ £¦ÀîZ›Àä Öìâ' ž:Ít¨ï}®ÃkqõÆþXÈ;ӈزD–óJ I·k3;6‰H.Sí-ÅƋ^ÅÞ+ôBß`ó佄·à¯]²Ï镴¾®bd.Ð÷Ú…1,Sç¦æõõMæsP&謿!ÙãòßkÎ=ÞÙ2§Ù:³Ú¼mÓퟮÀ¨ØY»¼cûâ%MÎÐ Ýüþ1ƒŸ}š2A{õ‡ÖÜ·¹ãÝþP"1ÿÖ-2`¨|¶}djñ܅ò~œ›úÞӝ§¯#ÿ=SºÙ¬Â+gI7î\€h¸¶e"žYZv¿d¼à±`¢¾ß´Mp²€³ÝbzÎ[ž÷ïÜÉ#x -Úr --À筋Âc{¬tüòûËÈxΫAº5.g駑ô8/f]à•ñUSÆÓ?Ò­sÛÏ=E/C™¾Y§_QµdøFuÔãÉzv -U&¢¼ì$‰ŠeG‚f¢â™¥‰rï9B}¢X“MðiÂ<€Ÿàˆý}]>u ÏÀ°t؏¨?=“ó'DÃÁEh¨ŸÁÖÈ+ýç/‹^¡Ðüå˜Àèq ’·",1(ò±Á_sŒK¢Ñê¦4­êŒöõU†ñøC¤Y@íØèáà4¿ 85:À ÕÁ÷+÷ -Zv͹ÙÜÄú“¡µ,áö èÀ²öÊùB£ñê 44ˆ³ÓÀnßpcCÜÂB£)ͧ¦7RGÄ̺þÌû–¢03VV „¢{”“ü}‹q û38ÄêìÐâö-…FìUœ´<ºŠ}'`|0Øê<7f–tI–=Uo#k#š@jb/£Ù€ÍË2´Ø(•˜—CÃÉNì2¢Cƒ(Íp+Xо®iK·ß*2ež·}ñíÅÏ¥HzNåE•×zQRosýói4̨N#@ô¤Ü2õnè,²¿ÃQ*ÿµÜ›¨3Ó]§Wi3 -×qìï2f”-·pZ“”®ùZ²~p‡)ÏÎ# ©7³%’ý97û¹JeŸÁ§”ÍÓÍM®žj S`Œ­=hìÈd‰¾«QÜ9&·Ü ÔS÷£u à·]þËÑvg‚¯3Y=™é"7·å‹˜*×.Ÿ#aZëû×±éâ °‹¡aY‘Ûo1@×~æܺk͏4˜>gA‹@³Q¤Ý"B -”V£H³EµN8?Ê`çYÞÃ%g…W®C‘^‡ÎӒVǺå Ҝù¤¢Añ­J¼¿A#°f§ý  2â3®ø J&h¬ÓL#5°eOŸ'¤‚å‚'$B*ÜBܟV\¹Ò_h" Mÿô¦úmUm§ë -`{°M…ƒ‘²e(’&‚A» -™Up1Øœr‹ u^Ï–Os°ÏqèVùŸ§Âîq‰Øcþ>ܪ„m7#¬éÖ*e¿]ìÏW3Y÷¦:úm&·ms@¯¥_Áéàí/ ٟ} z4bXàÓ&ìªd–5;°~^¿ýÌl A£Ðf–Þg=÷Œe{":[¯¸Tež…̐ñü‡‹Ýn!røi3ùÍyì}Š¬Ãs9Œî@}U˙ÆkêÕkí­_衞{OéÆKë šú̃÷?Í[Zž§¯DuçZŽõùA5@#†ývÔ [’©Ã᧝ÑÚ{aˆÉØ–Yâ;’-aÀë»L1ã?g£sÔóÖa0LGb'û íß»~Óàiޑ:<–‹¤Íêð4@t½ÃÊ1ۀãªI’#«þNחŠO‡›Ô{ÃnŠþØ[¿à@Œü!vÇdõ… ¥è̕¶±€ih)­Ï'¨Wٝ̃VüP³½Á´‰>yÛҗ;ÙÇù?¹,¶±‘Àm ¬Ðíwö÷øÌ};@Ëï³Ï¥ªÂˀÁmèÁaÎlcŸ§­¬Ð+QOXÿBZ{¯§t¥ç™±ú¹ò2ËÍÖŖÇÜ·9Iä²EERçVŸpQŽêÌzDçcӜ&Uñ՝Y¹š·µát‘èK'ü™ Ÿ”3e¡Oí3C {„ý°ÜdpÐøˆ)Á3h‘Ÿºû¿|ÍÉïrÐGxu¸ª¶kq‡9@ýŠûòóü°>%eÏ·5ÿe'>Ò~K¤¤á{˜Òhü>C*žì˜r¥õï xëºÒ Ûë"ÝlÛÉÂSá3”Yzf¤½ÀíI)0ÔóìΕUÔ@šè- «ã-±á‡Û&c‹L½Ü7 Yf6:re‹Õ©<´n±xZÂ}ó{Œ<ƾ­\m¢±úÁ±Ú<æí¶à7~ÞÁõڍ2ÃԛñtbQWÁ2/ôÁS•lfm—“{@±€YO”…8 ƒ=r‘¿¸ö÷ýý57j@×s¤É\¯h›`=ö¹|p¯0‡4ï­7[èå+VŠÍ‡Ö%òçE_±ß¼cÛ÷1ð¤[ò³°>ÙÌð½?JØð‰R9 Gp¶Ô~($ì²/Ù·$«ðѼDÅTúP©÷M°Ò©=¦6ÒlA¸…ßw((#PnéupZ ŸÉ}1ž[Uœ‚L¯åРÏ}·ÆÛìï£1øÛ_Oo¥­È’º)Æ«o¿v‘Ú·Û÷M=š¯¤b™®–Óc‹[Rgä %t*úœ½ä¾#cw¾??™$üÌm  {éíOÝ&ਠ0naôÍ7|0¬d c£ÄsÐ'Æ%‘e:ßN‡"M¤OŽrߍc…ô`‹èX˦?d6µhÏžR:â^¦oѯ¤m©·viBÆs'l8@.SÑ÷ù"ÞF˜‹”‡&ïµÚВ^zýLWr®”þǍB‰Vµµ=*Sû~¬Ç.’гuþC À#¦ÔÛwûŒOË眫9s¦¢/KLsÿ´ƒä&K‡„Ø}»O{«™58 y€Î¼rÿ̇c†Ü´BOS¤X?çŠÃã1瘒ù¸ÕøÔÙÛgÖõDà’iàD[ö3˘Ç$žÿ (pm7:oÚ`ßkl+–ŽŸã©¯¤†á)÷½=¸Dø6Îхºdö;é»ÜFŸ!è.C4Põ"Ý¿_ÂXþä -‰§9Ð;"AÊ#üõÖ?²pc¤¥4{‡è”ÝÜ<>„†ÄÙ.˜>›Åbï@S*ü¡}ãÉø€5ž\¦â‰ߔŒv>ÍÜ âèè>pVPdx„hÐ+hœCÒۆœ&vH=’ÕMþ+°¨.«½ÌéP«F‚u车·éï ñÑÒWÂdK T‹hÍî¤Ûm“^Ֆ•ã~€†·ØxqÛ¹½IÞ$Ù¬5&ò_½C —*îöÌˎ-Ôõ‚Cz© -k"•Ãþ\îsVݽªägfJ‘¥AZƒ0ⲝ¡èhFßñ;WÜWQ+Z‰Ìjµ í|þ9Žâžëßi~JÄ͸’Mƒ RÒ«ÉÆJ 0ˆD¤›Ûê)ç¨ïgŒµ<³#ç΄Ɣÿz ~BNk­ô2nLh_lV‘9û^›LÀÀÿ òU$VPò;ïcÚ¾aØ{Þ^7Û ‡N±s„y/Qû±b¨I—,ê÷T|EZ)†ft!´–Ì{yŸ}ÉGÆÔ“8ö#œ¬DSz¶4¬=h¾@¯ºû׍Óê.ó9Z¹ƒ@`W©Pw‘O‡ Ç Ð;IKÙù–õtÖÇØçàcÜqþø…R ±·å™dۓqò‹fJVV±bŠ‘P´L;Ò6Ç«Éþœ -=æP’Ég6ԚmㅝqèäL€&:›}µ£Þ‰í5³rzڅn¿»ksÊpþ?ꕗáôLŽ?Ï?03Ȍ'çÆÑö_¬9qš :¼ó,}ÇY`3]YQÇ9ô®Ñ©ˆåƒð྽vx4ì=×8󟾧۝P‘²¤`d™ú«‚ɯßynNHéñ;8³vÄ1MÄ_v˜#Ñ+cŽ·s¶_÷WÜÑ«dÒaG ®ˆéW âꠀúÌѪ_èX™¯t½R„ñÜEÃËSãœóAlò¾ý˹ó@5‹lóÃ.r?ñã쉼?vêƒ?ZØTÉIà¤õÛ濂Ö@¦fµþ†6¥†]àæ,‚Ðj¤pµ±Ÿwö‹ŒÿÝçÄXàwèX¤Û¹£-¸¯L’ÏÀ‚¶ë+îá#d¡ØžcÓèò9÷ùÛ3 v£mO 2ÿÁ´–‚ákdR3g®´Ê¾ ÔÂÛø0–J&œ~í;¶Üüº.&~¡™ÈOÛù'&y¨ûPŸ(ΐ§›q¦ô#Èý‚rŠ8ÙÏøÓò“ñŸ#½Iê_ɱåÓ 7ÅG®¬ÿ&°ÒÀGÃX©^l£ÝÎÌfNÒº#`8Zn”‰Tþ¬Ãåäg³‚Qçªl¨@ddÏ×ì°í°—ÚÇüW¢ uL;c¤“#‹÷X:ô]Ãtûçë‡ø\b ?a/‡nÜSYîYZ­Î¨pc{pâýµ–zŠfÍœÅ×9bï̓I…Ó€ï2ƒIdÀ¶¿kx ž\æ>óîëd1/ñ -Y†Û–/"ὛÁó{åFќ/ðKнÊÜN•>ÈV¾ðÆÑÄ*H,¹ßùñáø»™=Ì~ai8EÖùïæxšƒEß,曇éüwýÐÚ¡Ë›ðp~xÀYðÒ^tDù¥¹í%Ôº`íÿÌ73¢€ÇùCíxÏÙ§œãîþؒäwƒ#y|†¾ƒè×ÕÉ·çÓîÛ¯¬×ÿ¿þ?®‡Œë¡´É¡"G0jØ-µÖXÿÏÿ »œl(ð`T‹ÿùÿV§ßŜ%ÐñÿügþµD/PC9o¦óådƒnØ;¹äžaM€þëð»S¨¯`V„œOïó)¼üGÅrS[䗭@—{—-ºW1 -t!X†Wl%¹õڇÉnÇ]v'þ¦Q‚NOW1Xæú;lÁáx€ÈÙɎº ½¯‚a@Õ¶›íìf3Ïmÿ³¡®o¿H-·ÑvSˆ$¨[òàB›}#¯ÛÕ¯lM$o1¸±W~Ùûp¤*ÿ„¢î/@V¨á:»ÝÌðâS¹yF D_q…ÍM%Bìç/ªKõ™7©JÂÿ¾ÈWßp셮€´Án“ø…ìÝgA,…Ãä¿ØuØÂÉ-w"Ò¦ýs^O7“ß•šƒŠ¾L¤ÝÇ©bëvŽsD‰6^Të (Í ¼>Ç/®”Ý~Ü%>è5(DÙ]¬Ú?øD.PTÚÓ"w)ÊÏmF4í¨ 9À õJˆ 1P‚7¤§[¶6R´œˆ•ü辈@ üg xžÕRÔÈàô×a;œÀ ;g¿*+Îüò3å¯þÅD%†“¾|ñ*5o–˜% çœ~¿ي2‰¡«¼¿J¼~SœjǛ"G‹¯Ô5%‰/·B׉_<Ëÿ¥ºKhý²”€Üw·¢Òú I«^ÂÓOŽaÅTü”¨@$Èà ©¬îÞ^%}§–Q*sÔt§­Øòж´ùʤp}€- Þ¡x4ËÚ¨¨h‚ºÀÝdÃÖ¸³å€7~þlÿSüÅKï%ÞÛ°7 ÄD í·(hâ©Ju÷ƒ¥ÌCÝ?ˆÜøWâÕwöD`²'ߦnÂm¯9íɟ“~òú㍨}Ð`?¡1_²}Êä¾#…eÑÐ|žÀ8[‚}êµ?7ƒ?z«¯ø¬wºÍ0ÝZoO,ãzëK?¢wüü‚gão—Þ~Ž¶ôŽZ7§w5/á~îYþ€>kmøÞc Œ.·ô'ëã„/ö…ƒýຏ²N›†{JGsX©r8$ž§iÇªDŽ‰p1þî"·}ÿ[þðÑ'r}²×&ŸÓÏ_[:´¡ÑøŒ {Öik„Õ Ô„©)¹|ÕÌN½|«z<bÇ6Àâ(n‹š7¶c˜<½y‡Û¥‰˜™<uƒ{ø$Žq<|¶' -zš:µ6¹¥Ë} üá}ìüYXŸ÷r|¬‡ÏÚGCk!4 DKC—(Ö¡ñú8ˆ9¬ÁßJáIk\o9=Oq¬¯žÿ£7jã°Â+ñÑì¨9%°~,s//ŽÕoý°Ç½ ñ¹>’C˜beèìVU±éd¦’’À47ë³Öސ ¿_ZVªZeôq“§Î‰*Dl½\ZKÏ7Xy¬«{ÁPU"Cc}5›XõhÇaÅšB<:|þlÚXS“`ˆ4zD±“ã¦V˜ÏiôYbâӍë?†ŸySk#kMìëªV{lMpXáÚðʖì§êâXý½AFˆQ¬ä"dl®½u1¬(6ðùIJL7hxZnjY)¬¢à¿‰c-ióÜê!¬È'ƒ#Icí9-"'_üÏ4…óK’‡µ'ª!§bµ °4ÇÇâ|lNœ^€8´²quПH` BË9”š#j¶ÏŠ8M0ÝÒ>šú;¼4E±¶bfŸ$Öʼå#Ä°¢ƒÀ?p­‘õQlºÇÇJqþ2è[-¢Xß̛…$ÖÖOc?E±~֗%„7—Óýëf¤֏0ñy\9ű¾üíÖõHØ'À -Ñ Ä£’s#IäÃSË®—ÀÚëùßuYkøÅù¨O}:QyÏÌÝ 7ÏyÑX§>«`óXûՉ aõš–"®Ubl‹¦!V‡¢ˆÜ¿=s<„X[Ó3õ”´ æªÿ˜ ¬ÖLÏSâ EÇáØIè!€Øu)¡JN4]€5{º‹ÅÇ …5é©8Bѱó¿P'ÏÍVV„†Fl<&Ó ÄJ°éù–aã²^€õø‹Ò'O2Úp (ü¸Û”fÚùdä«Ø1 ·Qɧ½†gý&õô‡(ŽŸÎÜÓ˃âœIâç`Lö,3°¿yHð4öŒÚôÓã2|¹=ƒ›ŸÇ®Ø ”„|-E?$Ÿ†½¶æXúéÏdhæˆvùBÚkêI>­Ú7I¯ôÓiý;Æ=-h¨?~M‹?MÅxçH=ý6ï#‚ßv쿌ÚúíyŒ^­3-·6b/P/g_$Ÿ¾?MÝz駹è3K4‘ÆOÐQòéßéuW”|º|ófÜÓK¢­—db(õs0¦F, ù´ìõ'º2D{úÚL[U©Ÿ›ô¦Ò‡Mòi>]›Î%Ÿ–½ÉG ÑÒz¯Ñ•x(ùg3ë¨%&xjo7ŽIúiÖ¿ØžÅö¸`Ks/ø~G“o£e‰™y¥EÑøiŸîh“•()”Ù_¨O|™æ=¡šÕ;ˑ°BÿÚðüŽÔ;rÍ,üç™x¬}GI ᤙa¤àáÑk~~uÒÒØA|=-að™Á/Ëk´G )„í w-¼1c·{röÑ~ÇY„÷ïóÔ -Õcþp»œ<Ù{€¹Obd -I`  4Çêïõ%±‚3åÏ#ÔÓðé"SH+<¿¤°Îp¬þ´¤1Äá—L Ã:3™ Vd°X} -CۀkaÅÃjíQ&.Ž˜Gäg¯$VdH`&#° †V8Þt?%±"ýÒX¡m ‰ æÁøtãz—ÖªY+R48¬H -ðCE£Í[Úy„Á>ыaÍögk5ï Ïë O -H¼4ì‡ùn]ñ½ÀÍ}´ÜȀY¤Ñy±‰Ç–5$Psæ$Èó–3¦VJ°÷a¦¦ƒû'±³ÌÚ´MÅíHì¬ñ ҂`$"EãG"R䀛ä!j'¦hü‰üý£¶¥1 í˜ÁÀi`D`~Ï;ê-³ -ÈÀŒûgž{bÿiâÚ4íc«³/ç š>áq9Éx À ;¯àÔuÏ6†@”VO gl¯&> Y1Q<=¡ [¾ Ì(±a-#%Á°ð1ÎfÀÁ5‡×œ$0¿›Àˆ¨Eçç9SQ"<ü‡>eô‹ÌЬ—œ!\v’èÉedÖ°õ¨¼†v†6†ÓÄ& õڎ ½Ô¯áq)mx¨¤— 4-óGJ‚Òý£†ízŜšø‹c.þ!MñWác¯ú¢¤*OŸa蛩ïÍô#eyÒ#¢IЋ/…¬—Rh˜çK!Ÿ¤B2MvEò¥NCvÐ<š()$N¾ai64‘%FäÈ;¨hòy6âäë9õ’B\r{"žèäzÚ'Ç;ÖÐü|É·vM‰Ü…Š‰EˆŽ$g̋w¬a󚿺L4 \ÈÔ<@ó¶Õ4%Qa8X|]Œ¾ì~ÄÙ}l5ÑusKåØy&Fs ‚Ž\IBúàþÙڟöÁy€Ä¡yÔB…H‡‰l—pBªÝ€ò»žž“ÇîYvA GÇã€ÿ ìXˆã‚7€˜´ä+bK -‰†¯*ü¬*çÁ¾d0CV$^2H½ÁŽ 5›SAtl‰Âô(5Í1?uÜÚÙå²`FaÍ~¹,³‚’v¦V --ÃÐ-yR©Ð&¹—Ž38ISÐðаÈH–¢v¥JT -Ì -|©-B¯Ú–;‹eÆtJ–¥OÏz“‘]ŒIZÑc–:=U,cÄ(¯m(Z¼eÜ<ÉjÖ°ðºæ@Ñ }´ÖFÅÀàöTÀh,¦¡õä-Óĵ½Û‰6:ܓh|é¦q`;Ïf:\X·§ÄñJ͙¿#*ŠŒRº®è™íÍtôJ2 Ӿŷç)ùx¿í™éîÚÌi*²{±šEq©rÔA»võMjmNë(qdOjEƒ¸ÆXˆñ}£¼T‰£¼( ÃЗƒQªF"Ô:¯#‹‚ÀFB[Òv‰3kQ„>ïӝŠmò󗸬!ïçqêÂ\áàS ò~^ ÷Põrš¨$‘Ø(%y]„Ú7ª‡e¸RD'Ü{Ÿ§'ù“Z­((q¢@µ_@z†fT§½êŠ„ç)ʞ¡šyÿJ04ø~Öʝ<ùÏc“ül;QËHÂt[àǧ–K™ —½ÔovI³ˆ2£½4nv½Ø͎~á3F–nþN/£Ùð7»¨q®ì‹Ìû¨Ò™"çt( ¹ÂáÈ9r…Δu™¯ßK˜Îʎ\09lC1, Ù£R†™5µŽΌ¦|æŸÔW8B3ì½hJTÌŒ©_/Á)+á$¢õ4)¿Þº ãĽ›œD0*¼ƒ¡ áہ -ªchLˆò\;žš: ÕlÀ ÒþGFB«Ð´!¥+B5[ ùh= èI~Dj¾d'd°n­i:+-ùÊ}mXå'§Ìîî4äΛ+ÜØ»Šð ”š“âxÀAücðQì<„zڕ´)ø÷»G¥Ô\@ Áɧt.áj.=ìðƒñ.3žç¾SÃ’»gè,‘K›·ürÖݖØñ'¯ªehR^Z1-mxHyi!4 »PÜ › ¹9āVNþ ä"…Š€øƦ¶á0v -Э[‘‚ÂZœVBk¤ý äü"ÐxFmÇ*?Êh¦T‡…¯ŒfQFì]ÂY”æÊÆoäö£ŠãBóº´G -%4 ˜4jSEML1îùǚPº—Ö év\ -À*¤›¸3% h“Úß*Ý:œtcM\-ú½š²tãü -1(ízéÆmÏÂÛöÒ ¬œ˜tÓ. íÒíÒËAº]ºA(wˆâ"@2á$GÆÂFÜ˜fÃó„á§ÒÛVÎÎÆ#âŠ‹ßÑäu£è«¿»5”Ëž7ßæ½´HR©±eÁŽ¯ŸÄv5í¼×&t´7½&‰ #RB÷ʄ -þ®~C7ß`¿Fm+'H˜’6ʀÔ)þ’P(Ÿ t{V‚"av ùʀø1|•ni±P‚v'7u8‚¢Kç#øÚy‹ö±êä±y¼Ý(쾫u~á^Éóñ]“ö¯à¹…Ðn×þ?öb‡£æc ®œv˜È±Ý¢ýcPØÃñ†c ÑþÅ p&® µç£üáH ›ýÍç#ïp CÎðõ]R (ÍòbNO^j—Ú!©Œ2˂SÓ¡&„×íÞâäÆ´[÷960‘M®Ý-C4Uš0³š”ÉÔ¥jÇ˄a³€¤o¸:xMƞ`L’lAe )î3áI•u9/Ž©¬Ë­ÎöTqRy3ݙd tjœ”_ŒÍ«Žš*6ÙôxÇÔ^M2öù†Ôæñh>c¬R½‹3-¤MïHt„«9r©óÜRÐ$¶}O6ӗb Ý?Œï_Õ°T²ÅÅ&cijs\"Pۈô: º½ãBïÜ4FzÇÛ0¯w¦}CXÁ—«åÓQÍÜ^·k—µ|:AÑÒÕå|òµ|”„¾C9Ÿ$VT˧“,]ÔXÎ'_˧ÃKo)瓯å㫃7”óÉ×òéx¥‹7”óÉ×òédJ5•óÉ×òéPéâÊùäßÓÑUß7—ó]ì`^-gxÜXÎ'_ËGéiÊå|¼h™J·W3)¦‰ËdÞK# ’hTŒIÜAœSη©+Ú"…–ôՉ·9¡b,âDPí äø€¶åÃ#…9aÈÕ¤ŠÙxL+¨^eÏ}‹š¢´ùßüMÉß"ˆÊA“ÏòR7CÊ;¨Tħz†G—ȾQOx·ö1‰VEÀaÉ;ºäÆ$V¼‡f£©~O•ØÉ òK°¬!me\'Mù%t~šhŠ‰vw³”¯™ºØìf÷VÏiŸk­)•Ýñ.µº)† «§™*»“ -ûÌ(¥²;i#V>Z‹Î¼lŠ Ï~U²Rò‚: -¯€Y4~‚—ç2â3õî 1Õɯ ©É2¦¶§”q<õI§jj*zÕ¡*¼šÊHe —X`œÓÓ.}mJ¾Æex'ð¨€ßvDt¯ z$Õ1Éb4\Ö£)ªcªk -ϊ™÷j -§Šõ7žKºFNºG^Íɼ7?ÿ¤†•«•^CåÌ{Õi ³ßë)º†:µ5…áƒRMŽGRâ!´»Õ¬¸¸‰daŒhʌ¯h|·ì­DS,\U?MNº]G4¾¿Ø›éöœü$ª¢ _'RP¦Nͽp_ÚaìžoJø:åK÷0$,‡´Œ±wèÿŒe÷yQ…=È… -öࢨÚ”p‘ y ¥{\ÀZëØë?ÔUí]µJ#BÅyÃ(:âÛÛ){#tÿÈú²ayœ„wÁýrÕz‚ÜAŠÈé3`Jò÷³0k£NÌ/J,¹“ -ªã)†þ+ió‰ØR´¥P«w!€¤Ë²N¢ü5zZIíÞç6¾´žöWÒæ ’®ø»HNºšT? -. zßXTðFï oL<ûË«ÅS"3&þ®Vq¬ÉÊ¯vL -)ñÊåyrcº¸eÄ%ðSeQ÷ðޔ‘÷æÖ48 %Uxo˜H¡B1ê2Ýâ½ÁýåÛ½7€E.eDC=Ü5ÞÝEéâíÞX'ðÞ”[õµ‚~MÞñAYEºê X-6ž -†V—"›”|EºÂ)Ò2¹êji_²c7¨à|…ä®rŸÜ´6цù> 0¹¨E)ƒXM=ܕYó¼óV²Iû¢4”±]$CèDK•Jü4'èŠ$â?•9²%~X1«@åИvR‘½_ ÛƸÖ)›øzy¿*üNåÉÇÌF2éé>•yÍ=Òöä+ód¢¸÷¬ÌM»~]ß»2ï– •y²É°÷«ÌCîî·¢ŠÊ<.°¢œ„xCe?Պù‘ùޕy:á]ªTqÞ½+󰀤òav}e?è¥"¥óºÊ¼ kM*.kêîPø¼»¥^PüÔKI­SMêåÛVUꥢ8.}·ªY”s¡.áRC‘TRSÅ" …ÖÓ ;”]äFÈeÞ+K7Xç'í@»Ì¯ÖaÝ|$R¬Í{ÛEŠµy¯°‚Í(íê¾Ý²¹ú'Üýpë~Ðd¯Á•i’û±·S»åTuHsm6¥(»ÝéªcHÛ67q »ÔeæÜ*5E@Ò÷K]&•Ø}yß±âun|o¶ Š;¶:.]^° -NþF*E³›õÙ|{¯M;Áf-ukò5~hm¤¢¬Um‘ìäqªÆ· PvxŸ"ُýŠd! »ɺµÛ‹d!”»ÉB@ê.ºØÍ¢¹ƒh£H_«9ÉêdX€¿»7ïGAQž„L»wQUG ›+t¢<ñµ¹{QÞ ¾N>ÑäM|-¶ç Ey¸?ªËûWŠòÄÜÿBQž„?M¥דÓq¡ Ã«¾ú‘L‹Usû½@O˺ì&µydT@R…ãB“¾ŸO«fsq…²ÖȄ+•ï©ŒÉÝ< »Øˆ¡Q®º–ø}H^à#<+X—ªÈqÁídØJÏ!†^Ô4Qÿ)¬Þ&£œavΓcjH¶¯ù”ûd†ÙN†z¨Ýz®Ÿ?¤ÒÅ`»œÍ¸¾²ÙŒ»Û.´vÌùô´âšöOñ+ÂĪߐEJ ¤ àè+Îdü²»ØW½†;­1¬ÛS\¿ÕIûù{]¹²»™[+A¶3²Å~OõßÚD -ëXkÁÁ° -+¢ö#Ýù»?U¶i£ íÑ"Wvçq °êø} -ck©b¿ Á°ž?¤ÊîrÕok…b¿m»-‰ÕTÿ̤°Îú6ºÒXó/ƒ‚$…_l$…*·K ¶.=qô‰f÷¨Ê÷bbïÑîÞ«þª*~ë+õ}˜Vƒ"*ê kF%ÈóJxÆÊùœUä÷ò•[û†ž /ÊôjÚÞ§¸HE2¬ÐÁ"ÝÓk¯bLxlMfXJy°JÉ#´‰{Ïözb-Wt"7À¨ðEɵ×Óæ¶äTgb*gR7\jÈTê¬'Ÿ;¨ž«:ëIÎð"~“SÑhEí UtWPMx¥+ÂÛànhª§aßæÒý˜$SkÕvåSp_SØw¥ÏFkaŸ˜•À¸íîXاö>› ûļˆûæöÂ>±ª>ݵ…˜Ò…}bn|‰ÿ[ -ûx„¡7/)¼[aŸ(Âe&Wö]{Hk,ì‹óp§çÝ -ûĪúx~ûö‰Uõ©ÍÒPØ'æ¥gLÜ;ö‰­0å ¾kaŸ˜ÊÃËR½OaŸXUŸNâjý -û.ÇôcQ ®-ìS[Ñî[Ø'¶†b©V7ö A)w`¾ª°ORë¼oaŸ¢ÝRØ'ua¿SaßuDÓ\Ø'_éu·Â>‰ªï{ö‰€hî\Ø'lfÞß¡°OLPLÜ{ö)VîTا⼹GaŸ90Uý^…}Še÷)ì«êO)ÞÅFtr6"F´¿’¶;§¤{š]öð˜Qª«¯ö -۞GÿVJ帡‹ßŘN(Ltï.~2*‡:RìfM¤âèÄO¸„E¢ŠÚ†J>à•Fè$ʱ¥†%“Z¡ÀF£d†Åm]5&D40,M}ªåÆ$ž›!-ldH%Ó§ZB~¢co2%=å£Àdò#;…Žðò®<öX“íÿwsó?vG—J}ýšæ’†×ÿïÚÉ±×¾é¤ -ÊÔÕô©Ê¹Pȇæúÿݶ^…ÞN§¦ÍŽ¬SKUó?e'$¤ÍÍÍÿÍF¾ÿßÍÍÿtTžBÿ?uá§]åwtù’üBj¨ñ¨Ü-ýiWáÔq±tՓ{¶ªåRé0lÛ§˜á¨Ä¥° šØòÎ{U5}j2¨!¥zGéÌÕŎLr£†$5H Ig¡€¡Õõ¨ faI¼ -VrÖ:±[­¤F…×õ•õeüT+ÀZ -9èªS­(åü4Õ©VšÊ$rùLj$ïSˆy{$öZ”¹õœa•€TõÀƒ‚'Žµî±”‹2{h³r¥=‚¦ªÚW²ó…°Ú·µ¹¬ömmîx½!„v—¾Ï§ñªløa&IͶ5Å×76岶m—ÑaXx™²-o°KemϏËûÆ°7;kW/.AUϪ´N5%¤àÁ«t´Y½èhjî-ƒ½ènÖ1((²é£Ýã -Э¾)(ÌfäNOM͈Õ³Š%ڂÅV»È~|SQB¡Îysß?Sï)ÕúïŠý(’¯¡,ÓîÒ÷OZU§[ÿÝÈntß?Å÷èû§"Ïæ}ÿtlÁÛ÷£Lß?¿6JMuÊ5}ÿtr}qaë?í}ÿT_ßK°n¯öýØsʏ¤‰«ºÚ@SV~X3J©Ú÷ceµïE!fàVo,v¬‰Öió¢Q*]!D/¼Ð] -Lk„JkMt}® ŠU ¤k©`A-Õ÷b…T¼ð*”Ž‹ýµ(,† -7˜Žé…§²–JM!•ùy(´VñcMM-š -W·6’µTQ‹ªòyYëžÛžQ‹ší©¦Êü¼*æW۞]M…T’ÉI°¯¤Ìá«McìêèÊâº4F‘{»= -Í]ên³.éKѐ}£µOŸ¦f˜ˆš2zZï~·jõ¨ޝên{’·j]¡ÙLšša*5t_Yw‹mT6µC§¢[¹îŒI}9¶\Ý-í.‚‹Q ‰#dtBX{W|n疞lÆ]~ÏæeèÌ%í­öóvl‚O…WTjHv?șלxÌQòc>gú¯ð%Ùıò*óš£á­÷Š{¶ø­é¢ÙAO¢2Ï*]x8£„”6©BÄ ÁjZ?¥ê?$±ÂÙ<’;Ÿät‰‚¡ß‘Äj.M] ©ÖtV«Ž-(ãˆüðbXù5rGsÈÄuXô Š.­–ä`%† Dvâã•N„…ˆ8…+ñW ¬AÓÿ%7Æ<·Â⼑ ւ1(µÐ0ôÅ°êP/¼p‘Wê)Äڔë°Xy“ÆšÏwH~â@l„/8ØOtUèÙöì泀Ä{¾,!ùž¯÷$ƶhZH{t{Ês'˜uÏ/TGÙ`ã⟧Yÿ2{ò©ÌÎt XQ8 ×lr*4U×ø³°¸Jٙ"]u™¸%9&ÄÐÒÃʪ©¯R.®:êî՘ù•Ó¨õ;åä·$—ÑlxÃjiÉq“+^¤yCyœB&(E'Ý?ê¸J8Ó:CÎÝ k5· ”ÓEØžQMxM9`Ü°¤ýËÚÆE§t=¢‹<\èÊ$lüHx^¤cÌu–^Rq½·’çv˜¿×M”=§^(l®¯ˆ’uK« ó·\±«ã*$/î½»ªìN<þ§(ª*I¼Î#ÍÏRE%‰·Þ®+vߝN²nMɪ¹¼ïNÆ@’ð§ñSQD‚µRS‹aCÞ͒žÂæÚ:Uû'µ¡© —rS?Þ؄1eŸõ)”ôÀø÷ ËðA»’"a°ƒyu¥cŒÚ -Ú.ûxÜЩN¾šJ§©Ò+¢é*lLÂú›YAÎ笨ªóƄU0¡olÿj¬K\UԖêð;ºdê•:@+¬!ȟ”K…Ts„  ´N´ÍŽhJ„Ì%¿2Ч̍DS¬&R?M~ôV¢)¶ÒF´ªÿCÚE³˜ÚÈíʒDµõˆJõ7ʅjªêåRâU”$ª­GñCk)IT[È%Ã^U’¨¶‘rw_]’Èã+ô"çV[I¢ÚzDD´ëK9’ÊK¿ÒKkI¢ÚzDΒ¾ª$QbLõˆ¼¸'5¢ËyÝÞ¬P§¾IÝ-Í -ñÙü‹Í -/ÝÿJ³BR“ºû4+¤+VäՖۛêþyÑïÞ¬ðÒm÷¯4+MQ¼³Bªþž·4+ä¹ం’⩤T±,ÝíP¾0FCÃCy—„r¶Ê†‡ênµº¹á!6¹{Üj%ÕðPcÔµ 廊9!¯jx(ïB’0ص7<gAù[­®hx¨‚¡ïÑðP>݄stÝØðP± ìN~`Ùn‡ÌyssÃCùÉ ½W7<ää¢Û!Ï×yKÃCù)‰&Ã^ÓðP´8Röúvõ´Q]½ËøÓnnx(oa¿±á¡ìɗ¥Žµ;4<”÷&ë4]ž%ÓðPÞO»¾¢á¡XÕ&·¯ç4AÃCy(rîM å¡ Á=ÊÇc8÷Í å‹yuÂ"ÙkŠ(¡X·CÜZƒRãꆇ‚ýHð»âÊíÕ1ÛðP¹÷. å»r }cÃCùoL¹½­á!WF&Ƒœ3E[ÉÅEÃCyRÊíÊì¹ãÒ§2ô­ÜðP -«@ÝÚðP}ŸÂ›²PD·‘æR’‹†‡2%Ê©½s­ åÕ|8›»4<”:ÖßD’ו‘©Ðõـ¤Ò~Tjx(»¤%\ßðOp¡Ayª.ÚðP -žgsSÃC)(jÛïªlxxã— ÚZ^ÉÞÖðç¿èvHVîÐð­×’í½zsÃCyåGŠÓ47<”ïv¨»ùº)ºáá­ÞA• ÕÔâÞ¡á¡|·Cæ>…W• EçeÃÃëKõ±n‡8š›^º ñn‡¬„¾v?2 å³Ç„ÇÚÕ 哨„¨«Š¬ ÖíP’hZÞàëäM{ᕔíyCÃCNˆ‰u;¼>EQÐðP–-ðæ'·5<”×i÷ö†‡òEºÌ!}sÃCþ4…Ý/õ4Õ·pñJ«F´f£p —ʆ‡ê4››â«y¯X¹¢á¡üY!D®±á¡üYAën‘ã¢/§»Õ;âi$±~¨Û!…§'øZÚ#,Ÿï/(¢ä±Ëi\ø'ñ¼Ã«ô)WËÂ;3][Ž6„»>²$}áY«UXæs8x?zp̔õöÁ‹‘pw—!ê-XÕ¥7Ö%aÙèÝ_ƒßwø)“‰Õg¤Ñ±Yœk«9³ÏÅÅKÚ°?g‚úÉÌ>SOp¬hªÕ÷ÍÀ~ك}™ÐÚøŒzÉé¢KËÄ<5¼õÛ ãæà&M^ÿâlXÍô3XÛZfÊUõgÇÎÿâjT!©O“íöaœÏ(¿À떯ÐïÛLî5‹Õïq^Zlr@ĉQ"|ÊÂÜÁ\ŸœwQ‹ÑìgÙPÌñªÎŒkïÙLÞÛÎå’öp…{ŒZ{èmÏÀ¥ú‹Z<öeVö†©XU@óJ¯·ˆ¡Ó•÷÷‘=ÿÖ-ÂO`ί+,%vPæ"Ð; ӊpŸ,0¿at¢ä²;à23Ÿ<äs4 mÀŸ!ªE²§´>;(ac0ƒcmpßd]Ì/I7™÷ÖÂn‘°çOgÒR,•<óÏ:ÿµÜGw"dEC…£ûôزžXöwâö€ÏvìÁĘ}h˜gY'÷̛éw’̃‹°‚#tK? m^¬@xl—žBõqÂ~gç^†¡ˆÂÐõÅ>sb€ -»(¿sÓjSà…€•NkO1X Â*K»/ÙÑáøš²±C!w øŽt@:ـ>Ï0b(ÃPè…Aë€|¯u7äÔÜôÚñ ùŒ‘õ ü9ð¹k­¥ü¶m·' q|j\kÂÝ«r„chƀ"Á¾3çžÄMÑÅÆÜ!ãyÿŸ  \ëeT_V.GÀ7Y1x͕ ™ -wÒZ7"á™2ÏÛ¹ÒìYOKí^׃֕šMÛË­ˆ×ºh^êMüìì'Í)B³Å´îD <4ÓN‡^d{–¼`ɦóiæG0èõ]6H'RLÁŸ]7ýóå€`> =ìp¦àЫ&èá,g>|{N½C½oDŽ¬ƒŠw\Û?ѳY®ƒhŸû2a_86Z¿³?A²žY… ǎdûRSâþ¡b)˜? lñ®‹ÑÍ2§!á)xRðiâa>ͼÜ{@o‚žþüà œÞH›5 ½9aăמ"pi3>Óè"Ê{¬×g@]  Si½¾Å#ì<»ÎÅ¶Oò¬wüüuõŽ·a^ï¨u‹zgØ1қwí-øä¬èiß\o_ù«z§ÛüõªÞ¶7°cŠ@ · ®¦…ÙÕµ #ƒ j‚°¸»e£E' 9Ì(sJ ¾ä{~‚Ö:X $-Zd€*"ô¢m.èòòæœ;#:Y éD*’ŸPëÒºP±Ò¡Q NÅ-Ó@‰`vtp0^ ý˜ïB¾N‹%ʈÉ(šˆÅ“FãÌw)$œ,ôrIJ¦xpU\¸èÞe‰\9¾%À+uŽ¿‡Ó`ƒâ´Â³ÍV6AÉV¸‚ˆ- `uR2•’Á»¨›§¡·bv¼LÏ]gG ‰çd*:—qZžâ,j$lBŒPZ1PÐI8­•Ÿ³§Mîpxþ2áê j¯¼³ÊGћmOýœNŠ¾ƒ k €ñ“Àyú -oƒŠTøLqµ©ï-cš6úNÿ܃ÙÍÔN;¼+1ªGx—Â+ °%…|¥Áš2q)-~£ãµ”p$Gf¯u AÆ·€õZp·Xéï&{ýÝòÑ–j`u‹?&Mm,8qt?×x<õn›€£ÉN‚ˆ^·——c •Þaázl³êè'ÒD)`­:/p¨ðY]ˆ…[›®~ëÎSúß!Ó0ªÐ§Ææ8Öüa¯oh9`D;ë!b=EPÿq`‚¤Ò3W£D ÜppCi -Žš)Ÿ×}}ÌÁïf´NvDK¬±º]‚¢CîØbéðÁiäöØyPg‰ ¸©ÅÁ ‘¤ƒ/Õ°Xh:L’õ˼xH«_–K"ÀÙè@õñ@» c­°t(~ºÿ:*˜Jþ£x9T_rw¦xÏœ_õš3˜©;0¨‘{ CIÀM\3UŒ.ŔÊ •æ‚]l”P5œ#4LÏ0SµQ7L¨£K·`E¸åටÌD,øŠ\ÃÚ”5Ä­C 1 Žšba:]n6A/{ G ™AÈ *Äß Ñˆb®5eïÉÙð_µR÷@Q·þ´3ìê÷> Ľw=§á2øjN‡„ëJ§‰ì}­œ†ãZNÉq |ïKp 8Œ nÅöí5Ô´ å`‰v «*Jˆ$`\)1ìƇ³¹jE¬ÜŠHî}n:êŽ.á8n‘ÆlIÁ,Ñ´N„Ûd*&‚AI†”S=u‡´ÞœûhÐ0¼Ç!†íʍŠÒ6Ž=%‰!?ÉsI :eˆaÃÏ¥+E§M {ʝK6yÞT%:mÞLÏSÂþüc4[¡B<ó¿9´åŠÜ6ñáöÔ;ˑ>4Éûzû—«¨wÔ­dÂьr´Qv#{Mm—{íÈöƃähĸæ^·Œñ܂^c±H )íÞY>ºÐÏ)ßaq¹ÑŸÐB·ÐŸþæð‚“¢•6ÎÍ{x~ÑNÿµ8iËýYEª:õËïNôD{j€ù͹#‰â´ÔEŽƒØŒ™¡Vl¸}š²øƒŽ‡"eð-ïÅ3ƒ0QÅú’o» M›BéVÜØ/¤8Gê·ø ¤z Øg¨9øºÊ¸² -u‚ri£OЏóB-‹g:|b=§ ;åÿœî<T 'ËF¯9aeª tÞ ·¾‚Y/ü†€•µÏW±Žþ¤á~õzåz¤us:ÐS¯51XÛ. - a5† ïªõ”wD¬C€&#ތv,éil¡ (gÊE*ü@ºÅ@ŠÁ£ƒÅ*@HÛpŒÛ;±C0Ññ¿¤CŸ3 Ú^k¿¥g˜Îï6h|Æx|L9­çْ™ý;Æ2Þ\ñz›Þ]•rý’‡rWå¾êúÓªã¥?C´[½yëdĤÁyóÞ\ßwÊàõSd߅ìWïhU%¨ŸÎMøØÚeê}Ü;ŽÍþØ~Ö90åÏfü®ÏÂ}ƒgF3³r-léׯïj®RÒ·¸€ ›êže3¤LXæãÊøžÎ¥9¶o>ݔOÎäíø)`Š ô§Üä—৏~ïm§žm’¹ÕãWºÙþ0ç§ÎÔ;ò(¡Z`Î;xÚ)DÉ/r÷+jr*B¢]çWÔäT¦Z©÷+jr*¢}s•_Q“SÅo®ò+4Çÿ›ÐýŠøèwó¼šê‡ßÅïæÁ¡û'¦ûǝ.y<ÍlKæóöüŸrÛ¯óz¾9=DÜéV¶T -ró¯ílþࠃ/!V&:é™ÐH<<ÎóL"FÌä¾#…eÑÐ|žä¾‰^ó[R:Ì®½‡pèׁçê“Þ1š ô/ÙÒ[ŠGü³Gùk¨h¹h€Å]l†Üü9çíµê»`"?MdÜ.Àø[þ=3o¦ÜÇEÜ]L÷alò­•rŸˆ-réÐaQ^6æj‰¸ádÒ[ã/~ÖC“2õÆ\Ø­wXS)øuYoo<¾À¾ÀIè֟Qþ~ʙ?هñXˆ:¥Z›Öî_VP>;Д”.X¥!"ʅCñƒ\ÅTcl‘fvŒ%ƒ †© -êBցG¬†8öBÉå4P»v¤}€­öwF[ ý©6"ʅC©Ä¿)"ʅ/aþ_‹ˆrðOÈ¿å¡0”ô¯ED¹p(½D” ‡ÂÙükQ.Šï›»GD¹p(<Èÿµˆ(…¢ˆ¾wõ֗¾…¢çè+°Àü²&Ûzëï*¡wnP°Fà1adášÐHèE{îQblž4r¤Q}¿(…¦µ£ßšìL2‰ßÂ%“°zˆ^÷³‡¢ÓN‹N¨Ã`¢³·uQI$æ”þ-=Y—Y±ÞÏs¼äþíž\”øëˆÚQNiù²X=<°‹^*€:MèÀÉYZ¦}Ò[A eQŽ °”óyœ.3«Ç éq Csք#X5c&°Æ ƒÔPJåA Sú³§Ð±À3kQ‡ZŠƒ†.üh/”&4”›Öˆ€!FIRL~:^´à;VUÄ%ÌrÙ°@¶s2ew kCX[Ðw–ÊzËlì°!t¸Pf¾A~…+1̓åÈÂx½ŒaÚ -.1½fB¥[¶…/Üê¬aáVK¤çã…[ƒýSƘ“‰×fÜÙ-xP⡎*ÙÎÐp<ÒÕÝ¿‰Ni ÝˆÝ™ïÞöÌw½ƒû·¾±sÖ b<^Š;£ÝG -᳋"gT ñÙ+Hõ¸¸Ø@#Ÿq-µîAkO,Š\{ªc©žK‡!N䖢‰Ðlj†#¸ƒ`Þ©ˆ¥JRY?«lAΡædé@c¥ -Ѳ¨ Âóéրr2úzRHå”…uªÜù†È·ÛV*¼òԤ鉝¤¶=r1ˆ`ՃTõöH1Ùô* âp{ðCºè?¹:q Ætøtۑ0]Øíì!-;™Aì<Ò¬%#„ãø2†œ7±Å—óÙÅQ -G#˜Ý쒃_ÉRÿ³XOá6:idK z ¤kr½ÛÐ`ÃNý—?—´º¹ó¤PÍ~–©âÊH1~*è€ä°¤‹ö“Ÿ­ƒàÏ>eF¡ˆèZý>[öÓ'ØO<úé²Áž[/æ_€™M?È:ˆ•ÃÎx̙ûGsþĂj>“µéú þé½[èبý?yñWk ?üÎ/oã·^6g[I2_{cb§u€˜O£AÈ¥.Öýѧ÷!µÞÄ+]‰H¦ið&^éJÔý£Í›x¥+¥.hð&^éJDî•ÞÄ- …Æ w´äñŒò›ì_?¯ZóÓy‡^ Œ2óÅï¦:ùï7žê?øüoTቇü²:Õýc)}m7և*¬µ¹Ó‡Sî÷ëô»ÝLÿ}ˆ¢ïºµj§”{ˆ>ЯÆ,`0ļ ¾·¢ëq¤û‡xHúÿØÓ;ø¹ÿ!\aO8ì Ñ€ÿ¹|ހŽÃRÛ.“ãïú¡~˜ló‡ ¦#ìsV+z¹û¿!„æÍ`ºE 0Âÿ¿ÊàÓøî?â¡ö0ø$f:ð ó‚®ÀƒÓÿ֕?àþ®²{ý®pÈãßпðø® ‡c_±?šª ræw1:ü.~N£¯íê¼V 8 2X9Ÿ/=® ­7cóy\Á˜Ñ`hTðmü3ûKðÅ·Š!¶Ö“ÕJó =>…Œ/À~„T D~/ú;àw|Aû…/D¸‚ADCÆ델¼ÜŸ4(5c¯Î¿O£×ÉéG͐«z[]†6•žFO¯“ż}˜ü®à.['ÿkþ0Ùl¶§Éi¾‡ùñ´=ÌŽ?ÛÿÀoàØ€=[FÔÿ> endobj 6 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 50 0 obj <> endobj xref -0 51 -0000000004 65535 f -0000000016 00000 n -0000000176 00000 n -0000046761 00000 n -0000000000 00000 f -0000000000 00000 f -0000175934 00000 n -0000175867 00000 n -0000000000 00000 f -0000046812 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000176141 00000 n -0000176172 00000 n -0000176025 00000 n -0000176056 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000048487 00000 n -0000176257 00000 n -0000047167 00000 n -0000048963 00000 n -0000048784 00000 n -0000048671 00000 n -0000047428 00000 n -0000047925 00000 n -0000047973 00000 n -0000048555 00000 n -0000048586 00000 n -0000049037 00000 n -0000049233 00000 n -0000050430 00000 n -0000071235 00000 n -0000136824 00000 n -0000176282 00000 n -trailer -<<0F2930700671ED40AEE68045EC3FA770>]>> -startxref -176470 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/icon_orange.svg b/net.mograsim.plugin.branding/raw_files/icon_orange.svg deleted file mode 100644 index f6b73f82..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_orange.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/net.mograsim.plugin.branding/raw_files/icon_tests.psd b/net.mograsim.plugin.branding/raw_files/icon_tests.psd deleted file mode 100644 index f81e5905..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/icon_tests.psd and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/icon_white.ai b/net.mograsim.plugin.branding/raw_files/icon_white.ai deleted file mode 100644 index de2631e8..00000000 --- a/net.mograsim.plugin.branding/raw_files/icon_white.ai +++ /dev/null @@ -1,1225 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[7 0 R 6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_white - - - - - Adobe Illustrator CS6 (Windows) - 2019-06-22T03:02:05+02:00 - 2019-06-22T03:02:05+02:00 - 2019-06-22T03:02:05+02:00 - - - - 224 - 256 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FX//2Q== - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:A71F418A7C94E91197BDD9C8DFBF9319 - uuid:aabf7faf-1f61-4e96-a376-801cfa691496 - - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:A71F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T03:02:03+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 512.000000 - 512.000000 - Pixels - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 10 0 obj <>stream -H‰|SÛj1}×WèVž‹®` ö6.B)Ý·úВ”?´ýèh$e×n¡]æ\4»û8ÛÝý öôn¶mý~=™ÝûÏ`Ÿ~›Ÿ’‚|h9$KÁ~»˜š_L)2½ÔÉGrHE°ì³ã\ãæÑ|ÚÞç$5ÀyĸV™"Ú)ƒÌrG3¦ ‡HËm’ÛzÈ|ÅgJI ÕYy” IN19}ÏÞ1-O!¹^‹ß݋»f6CN‹ipՓ™¾Öpy4EIÑeáÞe„åböpG?ËHËð²†$#Èþ¬±8Ãay6Á„`§èRNdûÔW%H¢Æ3;âB¦–öYƱAjŒ­l…™+Z v¶æXdp‹}i{!ô<ô¼ÓÕûQâs_ç†b¥< oä£ïRs¯ñ+t‡£õ宏 G9ɽ€+?ÅO½fîùدqYה÷¼±·Û:]ÛKÙ; -, -Þa‘>l2ÕA% øØöÔÎt-UéÆI羞þ–4¤T+4ïõÇ}Z®OZeT»§ê»O3‹ïÒ~¾ŒÿÓsC…î[>ØTàažœ¥¬†Mò¢Å{;‘X’ƒ]¾›/ûëÑA­Ã^¥tõGg©Œ¼vÙxÓ]ÇësoÕX±»´ß°á·n–æniÿùY=ý -endstream endobj 13 0 obj <>stream -8;Z]L!=]#/!5bE.$"(^o%O_;W!8uZ9(]Y: -endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 7 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 5 0 obj <> endobj 20 0 obj [22 0 R] endobj 21 0 obj <>stream -H‰\“Ûjƒ@†ï}Š½l.‚§=$ Bb*xÑMûÆS¡®²š ß¾ëþ!….(|̎ÿÇ0†EuªL7³ðÝ͙fÖvF[š†›mˆ]èڙ N˜îšùNþÝôõ„®ù¼L3õ•i‡ ËXøáŠÓlötÐÅ6Aøf5ÙÎ\ÙÓWqÞ°ð|ÇêÉÌ,byÎ4µîC/õøZ÷ÄB߶­´«wó²u=7>—‘Xâ9†L3hšÆº![›+YäNβҝ< £ÿÕS‰¶KÛ|×Ö_OÝõ(J¢ÜÓ´ ½§8• ô¥è‹9( PR ځh’ž’tZ)N}BZ Æc_Ï äIäqäIäq JAH—HçH—HçH—÷„H0 ‰IpLBb¼ž¬å O O™IÌL`f -3°V°°V°°V°°V°°V°°V°ðTÞ3Ù˜ òJx¿÷ XWÄm2{ì_s³Ö­ž_w¿së¶u†Ä8ŒÌu­Oð+ÀøJÏ -endstream endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <>stream -H‰š a{ Áÿç÷  J `Já«Øå -endstream endobj 26 0 obj <>stream -H‰\U P•×þι÷"ˆâ‚ˆŠ>|î< *QD À`•ˆ¨Ñ -¢êŽ5&ÑZ·£iâh´".5“¦:‰TLB÷b\f´©ÖFF¤1Þ{@§múîüï?÷üg»ßY.@VC!jâäç†uŽÌÙ#œSòxf–-rlŸß ž@› %³‹§íÉmø_Î.ZZP÷hÑ! Ã`dsa~K/Íý…Âð?B5²ÿ@ö} ‹-¹¸í£e²ÿ+*š?3WõɜäG±‹s—”tÎiû°[‹¼s^nqþ¿Bc}²ï+þ›Jä—=2 8Ðð?¥ëi,øY;­áeØÓ·ÊEw²,n£Ú2[¬õ 1§±$I¬¶•iIN$Âišõ}{•œ¥‚g'‚Œ1¢§·´xG°¾ÝCÞ½Tzæö³çë­–ï¶Ï¾ÖbòÙóô—!ë7­ÿ”öôY¸ŠblÆÛÂNçQ!tþU(e![ñsü ™æ[á†c/ÍQ(46:¢6­Ä^b°hÅà -ò±‰ãT„na0E©JZƒH±’íÁ±8ØøËþ8‡qœheàœšáç6Qæ;:­kMöP7è#¨ÃCê£a¿f֛]æ]´Ç÷*ÌwÆ 5Å¢• c…D°²9ž?5oJLYC9>Â9ŠÐÐtÂ+"ýKìÀÇøðîQH«é -]µà«±kÌ8“gæ#/#«åkõ£1œ£rÔauÍ÷ûŽé%¶3P†%XŽ_c*q ×q“ûsgªÃèxä OÐÜ*1U ·É¢)–i-â2­|5RÓÁ‚`j+ú›±K0݇£¨ÁE\›ß -¦ŠB)‚2i­¤×i#m£}tˆŽP£ÎWJ©_èÏt£Ý`üÍNS!~{ §ÔÆ ÉL &H>ëñ@Î7˜Üô]æv+Òí|¶=ܼdÊÍYs . Ùx$˙Ó0U¢^Š×pŸ‰n=Îã¯ø‡ ¤ÈŸ: NrÑ+4™K‡é1ù¸«ä/†‹ø_Uª^OÕG|'ì`û˜ýØ6¦ÒxÍSךßâ'I2ð*J°°5cŠŸ³¸‹oðD|8¨·ÄšJãå¼;Äþmj–ròãU|ˆŠW›T­Õ;ì—íb{‡}ÜD›4©-%ŠhY±RM™ÈÛkͽ8(™9.ÕӀGԍzQ£)”E*¤ùTB¥´œVªt‚NRݤG¬ÙÁÁ‚SÏä5¼•Op 7ð]5Ye©Rµ\mU'ÔEõ7¤Ý:J§i^ª—Y°”£«_]sHs±/Ï·ÓwÆb'Û?³×ÛÕvƒýµ 0Ÿš{p JbÌÆl‰q¥œ-6â}©ƒãŸq’óï Em©»DÜ»5oIwšD>•²©@V!ÍüWS%£Stšª©–ÎÑeºE™$ú!²FKdrœa'W²—¯ËzÂÿTý•[ SÃU‚òÈiÖ©7ä›ÿ òSu\­Tv#•zÀ—9ŽVrýŽÃ¨Z¼…©t•ÎI<L'¥Ê‹Ñ¥Í.G¸#œ» ¨§Å¿Ã‘jªî¯Úa‘ô8‡×²ûéš8U*­LÕónž¡vé-:®¡\|‚éŒÁJÜ]A©d(RÕç[,Z~ªÙ*æ@³Nß·X]–9O¬¾¤zHéÜUÐÍá’}=”÷8éÀëRùÓTÄè;jÿ„o -¯[©ZÎxE|’öH^b¤P:½«†b• -£0—·¡—p©çLüÖP°tn“ä¦/@«@ž‰«œ-Y¿Hx­’:-Æzz nòÑiÔñfŒ |õIs¨o SóCªR©¨¢&]«kY‹¥jA3J¦G¢TÈ^™™Ò™áª¿TM ,vKý¿*p:òZÁE˜C;Ô7´Ç`"òÕBKÛí'zŒ.ˆýA¦I’c”¬8+LGë–;$Aªq¶Ü1…ú¶µ¦…VWÔ÷&ۄÛ3¬öö-,tReº­—^JÅ êJÓi’6<^3•|Tß2!ԎÂqÉH‡ÙRõ5N*54I*|º£Â÷Ž^¯_׋õ -¹›šdj®ÅìÄå6ù@î­‚ãAsšÌž9rGDaž—Ó%àE™Jãä[:¦È<õȔ,À<”Êäý-¡Jn¨ñ‚ÇtÑ+À\á/”j9VIÿ¯Ã™Û±—ø ¿¯Âù >Ëe<7pC}®i -®ê7u9&£/&Qgñ¶©ëŠß{ígûÙ/ö{/þz~Žóž_b'qB$ä£ ~MHF¥ã#e6!•C@@7:R[ÚI„MPú`ÒÖ?¦}HÕ j7UzNYê„QåI¨Cýkü±ibSÖ±ªžV(+8Þ¹ÏNJ¤iÚÍËÉù¸¿{ι'÷š¾”Õ Y˘Ž!Ói-£¡»Aç•|ë¢q¡À£ý¹w@;0µ/cÚ¦²t !ën3C¯,…¿arq(óÚãVÙf ‡(T4Œ×óâÎÌãV•Òl怱¤q$gŒÀÒÀ‰£»XœÉfL|–TèNè®*û;¨ SMîyÅdµAí°ñ|B1L´ë¤:‰èóåÛ(2¬ãM5Ó²–ÚÍû‘±ëä{’®Hë-m­y^¨86ïõU®æqæàšÍâ¬î”ݵæYLiOAB˜Ê´H2쩇’ƒ=ȘînвF™ "GLv(gð}TOǛL#¯)Æ= ?]¯™ªjü=DYš'k©öUÞL¥Ì–š"Î!ˆ)`ÜjÉ]m­/Èí¯ÀpÚ¾ÊöµƒûU•ø|AGûA0gvf*²‚ö˳HoOeM’£–ÅUKàYj™Yµ¬ ÏiÉW}fLWbíóñÁÚáÃ}&þóÁŠ}t·6ºsoF6rUߎŽ¯“*öž5[•3k‡26™T9"Û,+$å¾µÎTÈp¦½>‡•Ô -Nd¥¥ÁʈÉç¶WhÖ­ªÿç Bù_t”õçËaU˜f_j½üÄ:y<ΰ`{‚ŒŽï5 ÷:ÛT Ãє#gLÊ3û5…׌y¸‚$ŒcùՈÊ çesäB6q÷A¶4˜×ð¹yŸÛ½73ÏÃsçÜxf.7C¹Ál¾l™y!ÝÒª¥J*(T@£}®Ž´¿<¯#4cYí–Â’§ Y:ת£é©èøÊB k!.¯Ó{Å¢¯ö¶ƒÎUÑÍTz7U{»ÀÂSËÜ{àJC•F«ÆÐxæñ|°™U0ÀbbÍ|U{YÍà ó[ÚI‹1Lj ô2§£YÃPàGƒù§÷d*Üoâ J­Ïš0¿iQ˜;K‹¼9³&0ö{5jHÌRQ©TôF³Ö ‡Eá0Àfá6`?ÄÀ9ÑHÞá,`î -성SƆܘ9›DX'ÕÍa$¹¾új8õ ¿Ü?Vꆿß?ƗúQº¿ÔO7vlT¡QÔCvôH±->Òô)öE„ÉäÊ#¸»ý^.;ôd3×Â&ä­u‹A‡ƒáCÁÚÀÖZfŒek/zâž½±€ÆÒºâäXi¹Ÿ/òK°\º_{{1%;ð$îÅî-›7Áÿ['\ëý"ýÏëÐâÉIÉþ_$9¯(9_x’èåßÖñݘà]š',¸¹+…K—W -×9· yâøé„qÛÊ#rªŠ¶™%lD"RÄN³¢#ä u»4àõÁu‚ HÝ¥<¶Š÷>Å»€-¸ëÐú qºDWg÷±«“$ô¡ $§þ+ÚÏN¬”Wލs ½Ž·_ºŒ·ß´aO|eТË_³}·ÕûX6ˆ%ÖփzÙü;Á~}¿Ì¾îzý!þ1{¿ÃΡ9ü[|ýþÿƒ½°!‹=ü»_Ù<[Ñ[À³ºO¸®µÛ°í–PÀWó¿§ ¥ârq µa#Ç''á-WÙÞRq¿íviŸ ’›üÜã÷ -ÓðE¦QòqæíWòyÀM+ÿÕv‡¡o¹vüî{"qk å»ÈV^žms5?ÉßT^FÉòç(¿òçsQ/ëuyÉBùâËwgë¼mtDKù®®53Qo½7.uÅ¢"ڀ“LM\óªbë#2LMdȇs¼RǛ ØáiµÒi¬È߇ؤ!£ŠŽÐ[‰ÐÐI}/ÙÀ'ÂRH -JÉ/1Ž¨\'ÇäzÙîH&š͉–„ÝááÜ˹8'Ç8l‰¸Ð #¥6¢ã”£QGmövk>UDz$Áµêh’‚†)Iµ@KF=Ն{oPÙõ€«•Òþ˜J ”c11/”ê:0IT"ó@$7­Q’ôk€bóC?[Lô¤ÛÜ@‚”«óK*äS=ŒÏª§£êÓÄÍ [C”TЭovx+o“ øººxëȅ‚ð9;A“LhqøA7o»lwNüÉÓßÝP7ì 7ú ±m|p|¨EjêýÊ÷.¥ÂM½Û/\$üh峟}û‰.õ='>Â<åãoôï9õÒï4I[¹½8ÿÒ́¸Ô€ÕEÙ¾%ëŽýœÍü¬è’ åºOp +ëòq‡lg} äÄáŸê,Ïq>þÖE¨†ˆ†à\Õë¹S”ý 伪½ÖÅIÄ•œF -‘›º|ñ˜¿FŽ¡(z߬dœïb?_*òËÖ/áx‡z_{ÛØ¿·ü›uÂÆ4iEYP7YÅI[§^˜ÕRÐM¾•X$+}ƒR¬¬üÓÏú$·K²?x¸/T+†ÃbmÈÞ±Ç! ¾ žø%x✥îΓL*£óÍ5B£=î–eÿ@œñ0ðڝ@nÔ^úpsº¸¹bìØ(ÏÃÑú³Þ*7tn÷½â=›<Ût¶ù­¦·š¯rWZØÑìâzZìÍZK,åOƚ4Îï¡ #}"ƒ_ˆ¥ ½ÉÕÔ"†ŸMYtÕ¹z¿ê[æ^B,òਤWXÖÍE -øßW(&tA½ë/Â@ã“5ä›ð 6ý=ä(jÅ?X=¨üýezN€›‹Å4¸|‰/âªgõ,¤+8m´¾A •D@ ë¨Vtª÷ëXlR=t§OW ÇÇSÙnÕª½Á@@íjèÞJº:!‹NGµ@W˚ã?|Wkp×¾ww%­´’vµ»zìZ¯•%Y’eËÆØ ‚DE8!úÙWÏ0HYüwÝì®·¨õ‚ ›¨N§–÷Á›‹#á,>ß/(eÆbû×îøFΚ®ƒýFFÓ#ˆ ”Ø“Ô°Ãá'òRÇk0{  3\ŠŒ>+¬¬j¢Ð©°¥3Ø1=âcn[„ªI5ˆŽás‚Lð3÷wÕo=síýÕ+fêQà^ÛûÒÑë×m`*î'˜d6åځ }'¾®ŽLÑ\¢"þò£·_xïÁã¢Ê°¡'EÈ® -|RŒ*p¯n-ÉáÉ!©_óGò7Ê_ÒíÕL-;ƒidg3-¬1 Þù Žï¡Â^<9œÍŸÖ-p‡o‡Y[¾ù Ã0¬ÌÈl”‰² iºÔ(µJˤ5R—Ô”úÂg¹³âU›Äak -£ -F´¶àBm¶&¶*µ²b_h0ñ™õ’å²UlaA\‡”ä€Óïò¹Ác ¡°Íá¢\‘¢Ê“@SqSiÂà6ÚmáJ葞¾²zš6eñݨ— %õf›çoÆz”ÁDE‚I¢þ„&¡0#+µ£?T_aÇv¥rOÅën[‡t!¤Ñô(XÑ`%RëaReB¯d -í$ƒ# ¼ƒyÚhµq6ʘd:J¡,~Ww¢¨4ø¬ o`–ÒVdMž²×ÆYêk½Èæ9Eõ1Í"†/¦Ä‘ïø‘’ ¥€oˆŸœPÄÂ/¡¿qÇTÞ*h"ý2¹ÞSý¹dåN¹%ÉMqÔEúŸLT|½^µ„ýÛÅÒfÎlâZ$ 2›Ìœ©•BÀ¨à™!¦Œ4/ÀÆXÍ¿Cºq€¦Á>(º3ˆvÓ¸n§_¤iZ•à×xüóÃÂåt))µiÔ3¬B›»§ ÀsöòRxvO! >ãñRܶËÔ"œ”]¹“¹“0¯("“ÏUºí¢GŹŽ"ðýn˜(ÑÆü3‡î@1TƒÕì5mô–ÓQS$P˾qÞPFè̺֧Y8¾Á™Íßԓ|è<ùKÉÅÀEíjäJ‰)ì,q};Øi*™LGZJ–ñ˔¥‘ç+x“¯ôU’iˆ àDm‡-n´ôá)NŽ{eÙçՂ¬GËgZYdƒîüÚodU Až%Pê$½ -£¶àBYØ_ µ£6¯ìï.ˆµ››Ä}¹%³?i|±PüFȽìƒÇ˜ »àéӞŒ º4OcÄLùâ<Ð¥ -y«rÇ?éÓ³¤IFÉìlð(ӆx'¤œ=MÊVh"æû¿øáΝn½sÔouõý„<sR™e薲=ü©çþÏV}Аíä|\⋽ƒcCÀÕ÷`—I·::núÁë'Þ«Kº$·›+]ä+o#rücï«¿8y)ˆø=AXW e–ýzD·/²µÛ^¶ï-é´wÙϼSp³€õÒ.ÆÞÇqSVL”€’h=GZ1¤m=@×ý)wV¾FDZ£¡‚àU©¸ÈG24‹Bâ~­ -ê0¤yDwÄE]Ü,^­¢T¾ýAðú4w4nžÂ–Daa<¡E9Öä½8Z‡ƒe4Î̯Y‘–L~­*Åãpy¼¤¼¼´D«j4²FóóÑqWVŠciF•†|ՉzV5RKz ˜èížÝüÜõ±—8ÃQäãïa÷c?“þOøÕ/IظñŒÿ¦[žU†²ÌÝ.·¿ uyφäü²"#²MR€Ÿ -˜–DžDJá'‹9>rVµ+‚™~ž­Xn£ œÊ¨“Ö5s,õ_óÉhñ¢Ž•m¯´¬R$Iû.«^ÞÞÒß°‹b̐ÆjÃÙ(.knúÞÂô?'ýkY¹«Hݑ~01aF%äÞ_!5xln‚ì=¦I¥’.-–ÖHÛ¤ïHT¶ƒ[. Kڙå6›f÷¤#"ʱ–wa8|.@:ì,.‚Õèï!jCœV«M -@ržÙcB§T.mœRmý—Ï€n:ç=Äpyö ¦…&6|i˜‡?wڇ?%˜÷EPö+6÷G=óðói¤BY3ÿ"údÒ¹hÕËÚÄ­âË"‚…}9f<¢úrLtÞ'q»5@NÕÍq ¹^ÎÂIÒôÕã…?aՏ]ñ¡G×û9^ïD©Ÿvh­"Zk/bh -ÆôZW¥«Ê9ÛUíªuÍqé®FWÃçÚ+ìgä®Bk¨pi j l£¶lTi ‰j -,¥l ºrŽá¾¡jPª«®žS§UŠ.<Ty°ˆ¿Îßå?ã­Ïñ:oáSNžw951¢Æ&4NƒZ*¨iJP‹T$ÌÉ$—„ÉT<™LĵŠ”Ž'× 5‚ÆT}c£^¯ÅÉ`nqQ~N€T¬R¯!Rd,dñ‡ÆBUVTD""ëpª^®”'<íèy˜›Tórñ8·=æ>¬#âj}n<‰ºÞº:KÔ;å›Ö㠇‚ÚÉ: ìt“ÖõµÃîLÇÉÏ&ãî'ŽZ·<Îü$2¿Ç0ÿLd( æG}k·Ú²"Qkžl¤Äzo‹)Àg÷c* ,pµ˜ ˆ ­­r ,ÁŽJXы¿þ×m›µlilA+ ð -üudyÇ+éBwc 5[Ä(ñ©s -(aƒ$S Ï$Ë̞ëÏë74´…ª¶V¯¬hnÆJ}í«Éâ¯5¤ŒÇ…%E…sé?à‹ùKÛÒ­M©TSÍüé³XÍ𘾤i]ú†ñ|¨qYNt­9˜ -HåÊ—!•W}zå-ò /‘—hx‚î"»h˪‚k¨µôZÙòšü ¿¥tƒ3ÐP^P ¬‘_Í$*"S’(ú$ŸYƒÜYf rgŠu:³XÍmÖ Žˆp8£9ÊSf!*­©"Áp—PQ’²R¨&ñ¼›eXÕ?$ —#Î(G¨I¸M!.S‰Lq¦GP¢ø_*ÏÿW‡9`£)š¤!°!ÁÉtŽY‹bF-š[ׯúØ&Î;|ïs¶ïlŸïîõù3¾;;‰“æà $Äé™ø)kÕ]VRHéPéšÐ* ƒM6ÖIãcPV í†(S骕ŒP jÆ`0Æøк…­‰U…‚(C*YaŠ¶J«íýÞ³C-ӒÜÏ÷Þ½Îïóüžçù©¾zñ­0.ЫŒ®nPÜiÅ ø9vÜÉ¢ÏÙÑcó7w=9'µÀâÃe"s³~ðÜ£+û'»Q‘+kºÚ«¢Ê~2áF]«fþ0{ë.‚€m)' á)?zÐLIŠMÁ~…9ƒÎðïÑï—|`g—Ú{Dz ½ÄÖãèázÝϊKä§ýŸÎº“áv—N‘~‚ëÓã·>M·¯i…¼T=õ$˜Õ0½Î H:kÂ6ք=}ìQv„ý½É–°ÃèʁHÐxÎkÍv÷‹…¨AtÇ -…üíP¨@(Äù±ƒ^ìÁþCù+”œ¿rÀ£ùN´µÉ+ØÎ`RÄáü¿LYˆfx ÅÁA±“Ïo˜¥Ÿ±c^‚—P,ú[1)20Ùq”à†ã\^ø&šÔ4ª&ê0ù§ ajbžš<•¦s£ÇOäþ¤ǑÜyy×®ËäBƒÇr7‘xôs7÷³‹—v¾úá%À¦r>éÞrjÍL'´$àjª‹:én÷S0a—º—£U÷-«ãÏã.Ø/8ÿ–¸Ðpýˆs™f•}³`X%bµl0Y FJcJÁ¥xéô–4#–,ºrW%Ã1€©ž¤ÎsU:Úf³SªQÎVè‚9BSk(Jç”.*í+µ•§<±y"ô“M“Ø?M[ÿ‹òþ½»ñ®A`¥«þ ^ ¨W»Ü"¨7ä?x+¿¹…8¦Ðed ÷l©IРûX±ú¯ßÌe\ÞôŽÕRÖ¸Öo\ô‘ü%&ÝԎn™ëq&2ƒ–¡º¨žöm ùç©wä3måóÊùÖ÷Û>–¯6^oûLkü´MâeV)iu¶©²Oñµ†Û6Æ^nüÀ?&?žêIõ+Sß36¤6¯ãý˜Ûl ©ô\GuU¼¢Áœžn Ýçj¡§ÔÇmuӏ‹á(F Ó§ë¢>“FM­Õ £WÌHÅ4]§ {g‹>'º(Úe¢¡Y _‰U>Ý$Šª€vš]}U¨*øÀL;ÃVp:ÿÄ÷ =G&² "ðÎCÕ£ÞìU«ù²ÙQŠ`Ü %+¶$I÷À·#œßÂ\j±Ì-ÕÜ&i‘r¹ÜßêS)#Ü¢¢f ŠÔK%P) uúý¥i𽐑N©ÓT -Ï­ØEL¸PPA-?Gÿ ¹Èáüß)þ՞¿±¿7ƒäˆ)éHj¢»ûad³’X -ôØ ÕÀPRD^¬ ´9nÇ Àí˜2òàdȦ·‰ aR&É18A£E¶q¶%¬|æ£#¿&0K^65¶Â;" M‰Š² -‹…S˜ÕdÐ ÈÀ)65oÝ Ƭúµƒí_[ôçS§Ö8|n"RÐßÞ·{×Üy¹Së9·m/S] -L}1R‚éDª¥º)]ä@|õƒKßXÞPôW@__ZŸYÙޑLjÏ¤Ÿ]C&”­à̆m+UC1ËþFîp(Lï憸ãÜ»ÜU®ä[žµž—=¿ðœäÏó¬ßìDAlh™ésØlvG y±Ó' -^QÂ%AWÕ0zÍ£FY™Ý@ˆb]zÇëmÃè—&®©q8µ -ý$ñF´È7"G#%à¨%Cè*ˆ¤­«TAÁa¶´FÉbÐ]‚ ,ò„Âχœ*Ņ]*EÂp n4Þá¢%ºÍ…£¶N~¼Ý§!€hxÚâԊþΓÍØí ¸µ÷oۻà -Ê f1iîì_Zò(j€týË"&‰&§(MÆX–±,!Š#^ –öcpN6nàaÔkò2m$Ō8(2â!ÔKÉÈiºM ÕK}Ò.é¬d“Ž A`T9ÒÁëŸVŒu÷_ëõŽ)Ò£¤·È_&L®+©«^÷Ýëêä#@9n³àVwH1i}×òî×dMt°¡žÄ£n=ŽŠÐ›1Ž¦Þý„Þ·9÷ÆW ²È u#j,Gu›¬i5T;7AØüK…i"PÄ:•ÏÛ^¬+™s_¥’ð¯eÞT^÷Ó¿Vúí¥×(?V•ß*—”œâØEïû/ãUÅq…ßìÏííýíÞþÜîžíóÞÞÚ·¾ßù8[v𶍥U Ń¹(?NH„µª•4ÅRA•Phƒ#¨”–¶4IEՒ@Š\‰ÔRhPKAj*ᤆ¤ -V‘J¢4ôLß®m~’ -uG;oæíÌìjç½o¾z‹¢ƒLPÕ]u¨&ÆQ³ZÓ¦.g–«k˜5J¯Úkô:[Év¦_ݦm3¶9O2CêÄóڋÔæeõöu’Uj¯¯;gÐÞNœ×þ‘˜ÒòáDM"Oåym—±ËùUâdb‚Pþ–xŸ¼¯}LÝH|¬Åûñ…5ëÇ6?¾°•ýxł"Š²bE5õ\ l¶i»6}Ík²ÏÙô€=lS¢½Â¦lû cÛYÇJ; xšâwò{yZàëùnžþ'O~Ïó—<áùƒ,ÏX+Â2fҏۺº‚QW—4,ÓÐG¨„fŽÞ|À-© m*,ت¢àqæ`XêF¬AŠ&¦®aÕEhSMàˆ5N&QÚ}ãm7G%“n†Bè&”íH';L¹#舤M3vèD?mQò¬ÛÏn±Õp|Ùp²XÕ¥°2’X ñ²Ñánpˆs’¼„ZE#ϸZb5嶴—)o卣\1^¦FÉKn”57¨D=­0Ï)ø›÷j±Õ3ÇÚÚË~7?ÛÅ×øWð-Î÷-.æYWJheÖU[w²{Y -Øn–bO‘w¡éŽœú¨R¹uöOOâT%)V½NU¿bˆÕJRŸž}xýŠ÷ô.Š=–ä³áëâ”רN{9|J|­~»áÙÙ¬Ìçõ{äa¡R© ~Ö÷Yç­ü¼­p_s‚Fo“"òxš£é,=Ës™*ˋdùS>zwÿØhÿ¯›¼t}Ï«¶Û<º÷‘TM²þŠGœBÕV§È9¼•RªW©ݙÇ#¨>`—0d>¯ƒ.éV>šÖZIk¼;êj7ä[a^þ’ü€ÕOúãCòµ[ÞmÅOÉ'¬ 뢳t^øÂêŒ_ƒŸX±YàvßD*Iñ’< á©h´p »k¬ÔpŠ¤Z)”£5V&߂CŽ7}¢¬¹áRssKÉʗdžòӓe–¥ˆÅH*~þhEhYÓÙJÊ¥œíyËf ™lÖÎX¹Œ%—JfÆR2+.I&$H HqÁ+ñÒ×Ô(É$"=å!½Ý‘kéÈçs1H­HQ©ÉÔ5¦—W°X‘5Ùv’½ÆXcQî„’xøÃl×à-ÅuÖû4Jkßlγs¡…æ^õÿâÿ|Wüôh.(v;É­C!=‡ÿ·Cˆ»b*€gÄ]Ú,M=:ó„‘JFÕÄ/ÂÉòUŸ\®OŠJsõêw}êVëFšUy?Ôº©WfÃ,šànüޗi²¬a4ÕT?ýe–…&83&=2ãåXDñ­»0,uñŽálÉÌÔb²¡¨š£6­Ìnmoäb¦^¿ þ±7ßÌ^Ž¥ª¯¥9—‡Å!‹a*é*Ï3`.@“¹°,E¸žl,ÖV–Ý·Nb‘X<ÜõÈÖÝRÝÓ¿ ~Zˆ„¹ø—u‰.­êl‰2υš¿9tcª8ð ?‰™Û‹J×Bíðш7']A·Ë_#«„Íd“0!°¹Qôñ £ì˜ »ÁÞ±Dª,x»G¶Ñ+ˆeۍØå Á-¡‡å!m 9`9‡Éaá89.L á<ÿWá|òOöUaʖ{øžðf~s„ÉÔ¥D°Ä&Èԅ{šÒªÊq™t]Øxފ5¦»1uS/ê+ô ú€¾O?¤ŸÓ'õ®§biš^2ã -kŸ5nÑփß×ó…Ê äE¨[as*º|RÂv¼Ž‰È©;;ñ—Ïã>Tòl#åÇsÉWªÈÆýž¤*€ÿùœÕ*—æ6C¥˜±sk8v몍¤57°räüÌô˜bær=çÞ~ùឥI¸C§†jµùÑo͜é!ã/ìY?ó¯gªdfjéR²ãҋ/\>Š¨ÙLw ¢fés—wsÝ|w¨;̸¢w%Waº¸.¾+ÔfŠb1^”Š -Sà -|!T3‡°®çêùú°)šqS2•Dc5é㐱8³Ö5©BM*U[c™Šµb—Ô-QÒzA’DÁRTÃs¶h…¤¦IKm¨5Óf ÀqH1Bш é&;É8¹DX̚bòP’J.£Uð6÷ǯ`öõ¥Íÿ–/÷P6•{÷(¦/Rñ/Ü긷³F­e(é»zϤ=}j ­m杶¶uÕêÚööT<è¡÷à­.ËáEÍÛ‚:î@àƒ§ŸX÷¹¶‡„΃|¼ëç +7zöBá{ÂMî“}̍`»<Ž÷fàøeõ îüٛÜÍuÌ ß{çE3ga›×@ëMø€„à$Lá=CÞ¡*d!¼ ûHN³p.ã“#p.ÀD‚?Ã{D&gIl‚-°ŸÈpâ°v¡~ðgµØÒ¡#ðÞ½0{aˆÐ+àëðê>ø;éĕüöÁBœñœqž‚Õp -ŽÃ8~ -ÂðÙ0>} ~}¨ÜÚð­#0MF¨N²ÇıìÄõ½7­Â•n—#8o¶œ˜+Þjó¥o®ü‡¬Ä¯ø6ì%;ü¯ö 9Iºð=~ëc¸Ò&؏÷:8 -ÿe½Üƒ«ª®0¾Ö¹ i ¤!DÒ  $\Áˆ”Jkr­`‹TD åph-A‰dìXƒ01 --CIÐ OK•«Ž¼ ´„‰ Òœ–Øê` /iUŠ·¿µï=—K þèùf}û±öÚk}{í2D~+iPóäfó”œÖ2ÏŲ]Æ2³ -ڙN%Hº,œgþ'õ²æÒÏKh^Œå;I©7NRåër Ké+9˜a½(JÆ:ìÒc†´Àݬ»´Pc½ Œ¹Ë4ÉY/¹,ÏÓû Œ—Ïê¥ê3:^‹c+nëRNŸV»‚yš<iñ³ÚÉjÞ/3z¥“JzöåìfR‚ÕŠhgbý,cELÆbE´pRÁ 'c¯íš-µòžÌ‹´h:Ï©âi¹/v—W±Õ*©örÌA½/ÇîQñ/-ç¯ÕvW[Ïm_ÞtÿtÉ¬wž€§Ãä-fé1¿5Ú½¿Æªð™õÚÍ?OŸÐ'ä |Ãlä[ηRÔRåq)ÅwKå»Øyw‚ì¡Å6Ã"ÿ–þ‘ãò©‹ÔDZÉEé$¬a1úkô˜†ß4 C1#äHˆ¿Å2•U[¢»e¢vûu‚,‘­^W$÷Koð ½o”ùÒWÐj)­OöÀÛdpä+6‡¥Œ\K„’¯èd:ÉÇ«{¡À|Ù¤‡ñíÕÚ]6ÈZ-ÓXݝÉZm“}°ÆBâïòCž?•/å/²^ÈkrXÖ²Ê ù»Wþ#hõ_ˆœœ¥Þaìeòžƒßót-Hèw¡ëÓzŒ÷G«ù÷¥¼æ}O«ôQí«õ \ò*mÖ¤Y7 zRÿ¤Ó`¶ÏØ?Çé·5I;i?Y©çå´7RéMÑ~šÆÊ^‰¿F/à©Ðõ$„a}RÄ·:ªâ{¹®Jg¹ÉÕì†vUcy‹-»’]›`ÊO¤ù„Z«‰€&ÆÓÑï5º@›Ðüm¤~ë0 ^úÏÿ‡ Ýë4YM« ¢­×ϝžŽ,xŽÍOé/âsõ¿ÅæzM¹Zǘ8˜ÜµM¼l}u‰Ù'VjOÖ7¡ôm‹÷žpå6âÝþ'ÉÏ]¹E·¸ï_áÕö~]íb>n.›ä÷>/ë¤&A¼›YmüB~*£°ÇI|#؀%¦È­Ò‘uhM¬ÆþÚ(uR§ÿЋz‘ø.Õíú™žÒ<¯«½IÜ “<ý/§ôœþŽb…ÕŒõ>yûrDgè,4<"õè—ãiro¯åEøc‘Noƒz}QÿzÅÚq+˜§˜sœ?ˆŽErAþ¬Ÿ³^ïòÉøÞD‡UZ« úŽîƒà¹;u‘‘¥?ÖïÊåk¿F÷èot¿î‚‘8°@âûÜGm$¾Þ¨$îדXÉö w¸Qi½s$J±Ë;¢b:Øm´Ñš!¸~΀Gç8)Sio2Ͼ nµýî>t¦/ü¡Jѐ—ïån(sQdžè{c«(ºÑ²Íhk' -¯+5ÈK ږ´ŽÜv"øšˆm¯´ˆö¥#°ËgÍX”_SúlÚNg‡6JŸ-Ú+ãö„UÈ:/¸gJäP|]ے®DiŒMcëe"+'Ga;§‰"v•}º–ž‰¿%ë9/¦Ù§3õ°Î¯Ë Ç -çt_ëUð­“oqÖ °Ó×ÉŸç…þË-ôÒ½ltX*_hŠËEj\®Ò<(Cöѱ,:“¿ùN¬F˜üؾTÊv"õi†­ä<ҝh:岻ݰ`w¾Zf"º2i·Õev äN+`V˗CDÙ=Ô²LyÃI²‘|n…äs¦9#q¢HÉè“D¼vɌEäêÀxèçœ6²Ïë¤ -_‰¶µÉh`Ùfkî‰rÌ®«2PŸüì> ¢9í"9ã4ö{±ˆ^Å?Æ-%œáú» lOvž{Øíð%òKPÂò2udzM—=䒖!ïæT™†åºÇ¬W@‡Ùe–ËL‡0jæ¾åœe8†vv|‹õ°3á0ÞÎr2«’×ñ°mH˜Qç1ªÍ`§üŒÌ®ÒýIŽajüéUN“éàIÍ×þ _þÆn¨äFœÚô²—ê¥rÞêNse®7„¥ž{ˆ}ªÞöW£Ö!„§ê`}H'é]:”÷§?ììv/±S¨!Z7Q#7p³ë+ÚÙ+½Ù\­ ùü.=îÆìm½¹–œm7–Ìý4íBºI{é~O¯=ƒôždíðª&zŒîo3tG,€úñv§ŽÖ<í¡wk€•8† -ÙîŠÎA6+Èrù&{µ­uë° åDPÅ®l+õ•ÙØz''‘ýX;LÆ~†•îüSÂý |'È{q¾’¼ünǟivâ‚oc_±òY"2‡…Ô“Õ5éE~?T~B» fj­+èsVy)^Š(ÒïDyÜEn®|‹­v;Wòþ4LM$¾í· ÞílëW™´Ä÷»>œ'Jc°Yr Y¸E}ì|®…³;Øø&~DIðÝLF{/’g)ž#<;ñìm"¡ù(P»ó¤c´V­òeĞYð" áG -ð&86Ho"¸<6ˆV'ÙïÀŸb;Ié ùYàUàŸì€Jû؟Øß±æ¡oÒÛHÝX“"ºë<?FÍð *r\0Ë|ƒ~=ûT§Oÿì7¯ü>‹ž° 8y¶výŒd§Ù·ŒØÉá$…ïm~Î&Økì5ƒ%{‘îØ×Õ;ö ;C7}ÐÎÅÜÿ¯¹ˆb­' >ó³ ïÎ"ÜHG€*£&¼w¾›mÁyú)b¼"DK‹°w í­éB¼Ðê A·“¾HWa1¹°ògØ)´ÿUVϾ„_‚ñ®r«óºÑy7Ùҙá„} -»÷{DÄ_¿×g^§·P²;ønýOâ´Âc=Œ^Hëp~£?‡w‚|·ÖÁ‡È´˜RwGÝÌÙ´'ŸRþ:õ¥|nÄX©ÎÂËthfzfF•-ÇØdŸo%FY€™ŸN{tËÒa%]·¼9¤gNí]Æ^§=¹Ÿ}kú`aìÞaõ'zx‡–²z:˖Z£ Ý>ä•ÕþMÖq<“Nå|:‰¹G‰æÀ,[ÿ .þï‘÷µw`ÃIZˆ[®ày„XÙEMD‹'‰îl'ZòÑ]÷Ì¢bÌ]\%*yŒ¨´)‰å؉òÏUü‚hUÑêz¢µÙIÔîÑÐxïp÷IÖ;44444Þ/Ô½­¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ñ®Áˆò§ø£ÔBS6ô!ª¢n"þç9]”…<ŠéÛ  c‰¤JΡrLå‰åY2§EüIK΂ü¼%gC>aÉ9TÇ…š,+mgÍ·dF+³+,Ù ü쭖̡÷Zr佖œ ù˜%c<ٗè9TCÕ´–ê y¨ŸLð-¦§aŠ(M#rQȒz¡¨kP⢠’ èvàÿ8ÅTÎ7Q{¨_ÕÌCjF®Z“vCãV­‡ÐoªŸÍh}m¡vÃh3@>È>È”EÓýˆôè«©Ҋt®Ž*Õ¼h!‚ºýzяlÃGVÝVäú¡•¥Cc,='¹5à-ÇÓ§ÖBÐFä{Q"µ^µ7Î1ÙNؚ©P½ ¡Ô§æ+s}h{7þ*ÍjùÕÊ èSûт1ÉÕ ¨ÿBjm7¨ÿMUäAô)WÚ¯¨°F”ª+”>\¿Hzߙ‡,cüÃ*4Zã Xci»a>^5:i ~Õ·ý€šgß»±£çDMõÚ:áé7Ŗp(Ž˜¢1„£Þx Z#\Á èìèÇD‡3£»Lÿ‘—×löFÍÝÂ1CùÏfïpx(.‚áŸð…#ÃQùÍW׊’ÕUŠo0Ò/š½!_Ø7mk¸?$š‡ü1ٓ§?ÁÙíô…£bc 7ðyƒÂêuÂèTÄÂCQŸ Öß퍚b(ä7£".çÑâ›>337ˆ˜i -s°×ôûM¿&µÂoÆ|Ñ@DNPõá7ãÞ@0¶ÆÝÚ±±«sU#š˜Ñ6swûÖ-žÛWZ9і¦WÄ£^¿9荈pß­—øvó´;øqn¬Of×E´*Ã9$]C;mÅȾüq‹ïç{ì6W.òŒ®Îæ6‘Øä®ùžêJOiƧ ±»ŠøF5QM`TÕ5P†VÇ¡‡~úq¥'¦šZVa5e  ÛbKÁ5wóNœd;Ðâ]¼3Qc?áÚη¡é#ŠNr蘢=ŠºQ¥#J+9¬d§’–,iÕ,jWÔ&)ïà[©šóVÅÛùý´܍¼äm¼Eñ-|“⛡¿üc¨WÞÊPùä›À›‘—| Ñd¯vEïA™þ¤¾ ch˜š°HR3L—”¦t8pU“ñ&¤F$wᏴр’â¼ɉTÏëQrêÞÚÀjŽÔr 'Öʁ–ضÇA9Ü*ø:ª€v`;0íTâ¿JŒ«=TòÕTŠ¶–û¨\XÜnì¥bðbco¢ØÞàÊ5ŽR;°ˆ£ÆÑĜ›«õdÝ*À ô#À³À`.9“% ó §áänÃͳ`ÝSGâµë“ü#K“|Á’›+Ê+°Lô,—ñ± ´ -p¦svÀ€é”Ñ à

ö~ -Öø³ão¤\Å]°°ËŸ\Gî²ÎÿY0bœùà -Í°0ϹÈ]´ò|†¹±º}Ï2—xɋ0¾ëÃW¾Œ1Zôb¼-L· ãÌKÎü^ÎÊ^ÎŠä¬ 8©„CwqÔ-D%‡ª[/qŠ¯À9¶/g×ÓlYìî£:ތª]§e8 ÃiAoð;7oäùê²®÷Qo -—ÎSÇË×oÝlÅxÓhÙ¼jØzTï¾ìç]á®v„ºÎ¢u͖½Q7ëŽÑ´ý‡µædoOº¯ž¥‹&›ûkŠ`“"W­·»'Ü5‘«'rõD®šY“¹dÕCYjÈò«A¢*3PÀõ­±ìÇge5ÏÑü­Â£4ÂÐAæóaÃâºpMW¦+Âo™póëWþÖ-<®,˜G åm8Âp0xÅ#­}5¼*µ<Âvº˜(øä Ûî¡2,Wå¬ÏŠ\™ÅŠ,VíTúm$g5ì ¯-ÄNøç£DÆáî2@á‹MÔCI‡paK;ƒÂ 18! ™Øþ`‡Û7 -endstream endobj 12 0 obj <> endobj 11 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon.ai) -%%CreationDate: 6/22/2019 3:02 AM -%%Canvassize: 16383 -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%%DocumentProcessColors: -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: 0 -512 512 0 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 2 -%AI9_OpenToView: -497 224 1 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 67 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 29 0 obj <>stream -%%BoundingBox: 56 -487 456 -24 -%%HiResBoundingBox: 56 -487 456 -24.8594 -%AI7_Thumbnail: 112 128 8 -%%BeginData: 1982 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDDFFFFF -%%EndData - -endstream endobj 30 0 obj <>stream -%AI12_CompressedDataxœì½ms$G’øfýê>¬ÙŒLDgfddDÎÉάªìRš҆íJ{2¦$!u-4zFÜ?s?æþØùó¸‡GdVˆ~áìè–²òʌȌyÜãïþ¯¾þ|ûòîOן‡³nó쳿û»ýýõÕÃÝýo6$o¾xõêÝۇ{~õ‡_oúé¬ÃUÛ/ò·vå¾¾{swû~wðí%îÿÕþ‡û›·7W·›Ëë×rѯ7¿ú5¾ýææáÕµ|óâîöìêæ×ÞªÔr~õ _MχáùÐõó&ü¦6Ûßñ’«Û?_½}{ó/×h*d¶´»{wûòæöûÝÝÿúÍ&N›Ïǜ6#þF|ÿ7¸~ûØEg9μòüîÅ»××·_Ýß½¸~ûv÷êîþíoÚo.ïnÞþf³¿{ws}ÿûë¿|õõï¾i/øýõõË뗧.Û~¿½¼yu-óúêaÓìÉíýðíîÝÍ«—¿÷úO×ÒoÓܓ¾å3üñíÕ÷רNþ&=}ûÅk!}}ýð ï$-q@þð÷»öɅÊò«þJúìZZ¼ÿ×·ÿí×¥æû»7 áîÍç±6ø¿³o¿¹~ýæ• ûkˆÓY”žâ¯öC¹X^‰~ú³œæyóù4vgÓ$Çñ¬—qÜôq>›³ÝQ{úúÏ7×ùÍæ÷w·×ÖAÛû‡¯u„DZëô_ûêï^]ßÿñö;‘6kýîîåõ+¹£VqùêŠÃÒ×íŠo®î¿¿~‰q÷êݧnöVd~{õ£ÌVyskäË7×·ßÜýg>êçãœ6Ã0nðNCÞÌQþÌl!J#ýäöõ_«õ –Rÿ”0p_ÉX~yóýÍíoʦoÿþþæeà4l²þ÷8ËÍÿsùßV^ýááú¶t‡L®ýҝýîK´zqûr÷£ð–ËèZڗùóêî{û¶~àwRÅ»7Ï>ûçgŸ…ùùÿ|w÷pýVj|u½™§çßß_ýùZæs~~ñîþnӇ®¹âOWo¯Ÿ'£ts«Ô—RÚõ«W7oÞÞHóÏ_^}ÿýõ½ý’¸¹—)òÝ«ëÿõüÍõýÃwïÞ^ݾ|þõ‹«û»ÛçßËjaݯ®¿{xþå…Ì’¨uƒ õñoéÒ¼I^Z>èWz'ԇç×·/¯Þþðüú5=ÈB¼~.üîå5ևTövÕ¨Þ|wýü坰1áG˜ÜÏÿËKYëòÆo7Ïß¾¹z!Ý1Ï_¼»¿¿¾}ñ£|˜žÿéþNVàŸ®d÷S~^®þâî͏VçýËï®_ßÜÞÜÊíix.ýóâêÕíÝÃó~|óÃõíó{Š·òj×/Ÿ¿¾zÇ’n•AzþF˜´Üùîíó‡¿Ü½}'vswÿüá‡ûëkÿtõâÝÃõó×ïd¾†ç¤½|!ãÏÚ^\¿¼yõêJj’¥èwȽ¾zûâÝ+>QÎøò¾»º—{ðçW¯¾Ó6ŒøvÓÏÃó-çƒTµÕ·Íhnµ·þö[¼ÀóíÅó½=Âó Þþü‚7K-Íí~ßzÕÚÄÍ5_ø5?<ÿ=”j¾Ô¾Ô¾lnøRŸéK¿ïõ»W7o^ýøüË·¯0'þX^èzó››ÿèwýýò›îîe¶€ãÞÊT{ûüJ¾*ïsÕÜ}¥M_y%W쎫ëç/Jw\ëí×Zûu½Yªºöûnôª½ê¦iâƯ¹–î¸Õïôò»òLwÍ wv‰ß÷òæÏ7 hg¼Ó[ßiKïÏóÎïùQ¿~`güXÈÏ>ûæByaüß~óV6†÷‡oÉh.n_Üa¯þÍæÛåz°¡þóóÕÏW7('þæ¿>cíÂÓJݛoîß]ó㛲é°áoåI¾’îàŠúý~—¿ýêÕ;ùòïïïÞ½ùâö»»gŸýJå¢ÿ|ýBdÙª^n¾üÓ—"ÝüþêÅß_ÿËõ͋n¯…ÿmvҕB÷kEÚyó럨XøýõF¿•{ùQ~‡ßO¹ÿüú;0jJý‡ÿ;¤QøÝíçÿUxéÿ¼¾{ùî•|{qûçëWwo®72[7ÿxuÿæ)M|õêêöê~Ã/J m½›/ÀV®þÇÃ͟7¯¯¤Q¹è·7²G|u%ýû¤„™¼‘^ãM¼fÙÚc4_=©©«‡6;yȗo½ö-¶6Åw·ßô_D¯Jõ_ÿøúOw¯nÞ¾öÊ[ŠÿýÄ'•n½ýòVùþÝÛ6ßÜݽòš÷›Ã››Û·×¯VO-B‘Þ÷7Ր_|¬,žÿ-šØ_‰(#lñÍ7/ŽµòŸìûïn®6vâþ'Í®ªc­~ýæú_n®^mñ𶿹ÆlndËÞy‚ ÿüñF´†Ým{ÉßßC$¸}%ùïï^½„P U׿EH›ÝKÊã]ó__þ7÷íN$Íÿ äõO¿*CS‚•ÑJäÿ¥Lø_jœ%yÉݼ(Û¦ì¤ì­œ7墻”/KY³h_ ýÙ7e§¥,ÕÅx.Gq9veԖ#µ©qlG¤‰eÿ/{Ýz{ÕÃìUé¯yէ֓‹>\öÛª·–ý#ýµì퓭•™%[IV&–hed VdÞq1ڞª»‚/…òrÚXùÙ±l­Ì,ي,vYüi?Y‰VF–`EyrÙ„¯6czÁqÜqÜ2Ç)r\0{ÿœ½½eß&öæÈÞëÙ[ì{#ËÛ%¾;ÞoÙñ­Îù[>wâSŽ|*y™6Ò¥{ag[akYØÛ$Lnf7Ÿ—'•)u!½f¸¶˜·IdFd¿ée¾”¡?—NÙÍ[a§yNÂX£0Ø ;T/;ö¥Lˆs鬝°á9Ë3 -Kž„59“îeo¿”©r.]¹K[aâ9%açQØzæދ,p)“è\ºw'¬–- ÉFeC²-ô“<£Lé ì½l[Ù<²l!SŒ²™ÙTz‘/.eâËìdÙeãIã$[Ð([Ñ R'KàB¦Ç^6©­lVòŒ²mM!Êd#ëE¢¹”Éz.Èm/¶â([¶jx”ý6"°]‰k˕¼V˜ný÷ Ì T £Ì­²&ÖQj¨÷C@üâ²Ù ”SÌ2Ǣ̯^æÖ±™54Ûw)üèNÕsÁb·Š\ÖeDz= ;–lJ"0”GÀÞèûâ$S/ÙƒïŒØ·h³Üï2F0 69ƒRÆåŒÞ$è²Æv=èÈxÝ¥×,Ÿ) ž -”.§võ ¸\Æagø8m)Ú\„ƒ@³wñIF¡T0ÜS¼¿FzÝõ5‹(^Eoª,¬­ÔUkb=ì(½ÿh'ù󷃩¹<(t™!Ifʎsf%h´Ým )̪eWuZU–Õ2-²-ïý#ÌlÉÊ~Š‘ùp¬–ò'YÈ;—¯K©S^èRÉô+-q¡ƒ™^&5cú£2ÿB%^j{e·r]е éŅ¹§„^4üžW%¯JÕXõ¯ÉtÙ¶Œ%”áH±©±ý9P±:[ÙÏŸ-ÂZdî½ì¼lO”ùdÉEÔÓªLO,U{m‘ŸÝÂQÿ>,áDáԐ‡'–c|¤HO»òÉ?Gmõóéjl¶×Þ;V¥ß"ş[Q¹­ØBŠm$›î]l'¶îeU«ž^V{±ÇÔ¥°^ÛEö-k¹]½;[ÕŊp¸v“[&+ÑmÕ.ÚÕê֌GÖ©ü嶐j[­Í²:Ϲ5KkcÛ]›»…eîpuÎzµæ…•¯Z…ŠeèØzõÏ Ûa<(ãÂÚxzU.-Wk›å±uûØj^­U®êß½ÿŠ~tUÿ ¬ÁO_ã ¡·U¯,•Z¬"«tTØ/(‘̦`N&“ ®^]6RIZH%C£bíEÉ¢Šõì3Q² f©’5«£Š¥J֞V'U´²+ZÁ-¨Z{Q³vT´2mX2©lõ\(—Ô¿ÏфTEÕRe êÖ ê®sS¸vT¸2.¨\`e2wLíº¤. ÅKU/(_™ÊÔ¯‘êWÏeuIlO JÔ°$ÍâRÑ´DE TÆD£=è‚ -Ù¹(dPÉ ”A-ƒb–ÆHÕ ÊY ëꨠ]š¿ÓLå;Hx‰Rބ~z -X•³C Ö©rœÊn™êÊHÞòî†k7RX±çêï–'·2å%á·ãläœuÁK’Í‚k.x¤¬˜VfAYq»£|îùâˆ<ñ4®q’›|âUíª¨–ÖBÖþ,‚©si‡+{.UŽÞTÚZ¢,m~qU¦E`aIL c¦Žµ,ÛUÙ­‹Y4Ûr~P.K™m ۝¼?R†£%-ŊxXâ‰2,nO–ÓªäGËüEDŠ…UûxÙ=±ãKû'–ó§©ñzl(Ÿ\¤ÆSß}àϑíõƒkrQçZë`N-£µ§ûj²R쯳³ÎJj­-?…UÔ%T†¥ðÛ¢[©¿XŠÕn,ó›æ)-“—bkÎ^f+[/»#<ë楎uŒWU?ÂqîÔ𥅟bÁ“Np£S\¨å<;ڃNóžGx΂ÇŸ¡-í49ÂY~Š£Hò‘'p§ —˹ÆsŠfõŸäOä -‡|à‘Uýxù+®ê÷2Û. ·"ØíՖJG1d±0ʁpjÆ;a ê4îÌm Çq¤ë8‹àYÜÇçp ˦£ä@‘NdÙc(ÈW2œÉt'«C9@ -¥S?p,o)*ùŒÅ¤f¸˜!ÒÍüì3ºš3¤rº›wžÎÝé܉”‰ŽçQ²t¢?‹8¿¥z/ìãÂ\ÑÝVVŒý…8¥á–ž¶‰jÁܸ§é –‚‰ y±§­2ÐY w5d÷D§uÕc¦ëZ×{2',ôKº±;ç…ÿÎ[8nå´Æc…ßîZ¹jᦕVîY¹få–-<7 µsÅ7¬M…1–C:Ë!̨*Ç4쀮«;6gíáçùLøüÉ »¼ -õìÎ+~³@0OÀ2ÿáæõëëWeÚ_RñX ™ÿÁYç¥1ÌÁXe47_2Ƹ5VxÞúlÍ†6š ˆév.|¬7<ÕÈMˆª7·Kš?tS›¸m¹‘]ÃO…K7­-m[çGЄŠ,žµíª»IgØKuyì$§Ž@‹`ýœF£¶–ÛØØhSD1 ŽJX›Ç’¡Ÿ`È. £°îö|{Ñ /ž„»X;.}gïÍ ß:â«+~¯»wãŽ}·ž‹KþÜò™Áø •åá£,¦¾Lù r¤®(=Ik/s°£t ¬wžÜ›¬½l¨†ŠkX #ÌxÖ¹[pOó˜šÃ’™½F3 ÷Õ(üdlʓp)îI¯Æ`uQŠ'2ѹc‡¶†*ÆáhÈ EuÜî/œÎ pÓ¡›jITïqpé9R‚ž(E'Jҙ¦Ñ-åéÕi= -N—”¬«l­PLŒ£Ê×*aW›R¶3ž 9’¶H¼”¶3¥í"oŸ/dî•Ôm27æBpRî.’·¬²¥ìY2¬sOÑñÂÁ%ïñl%ï=%ï ˆ\2ö*y‡FòN&uï(uŸSêVøg•·ÇFކ¬íÒ¶Hå甸‹¼}(qG“¸)s»¼½£ÌM‰Û™•AÞ šÜ€éN;üûÂÿ^R͐Lgœ™•ÍewQwå¯ö· [໩ ü¹w³up|ý¿GcÔ*¯&qaœˆ;hàñ$Ÿì_5¦ë¿êö¬ÿn¦÷sƒQƒÙ)—W×g™ÛÖeûÆC®ó\ŠÌlíÉfüD­ƒrŒòdòvÝCԑª+à‚«€ëÀñǜYëð…u9î2ÌÞG– ûƒ ™‡¡+PþñˆÃ ëKÇB!ÒÊÁ9­ÜŸ§"Ѵǃ"úGVÑ©5tDðѕ´kÜ-u-µë©YU†¬³Y„ÒûȔ ÷Cëþw½°°HÛ@ˆÂ¥`§ˆóÐÇ´PâåêÆÚõ©*TÃGž¦¹Ç­ã,¢s6C‚|t[…ÚyªÝd:I+7ÏóÁUè¤1K„…&$Ùìæ¾O¢,à%ñÞ6ÂK›÷ˆ“ÜÚ7V»®ÉLA¹ Üiþ’­8‡šŸ&¡™´‹­žù,ÆIr3ÐÇVõž¦›/ï_üpóòúÆÿ[ªڈڳI$cDÈӄA6Ï_+#Fc¯)om‘µ;7åFÍ=dwmì&3À"eP×µª¸Û,`O½}7Ng"8/†áC+xÏÎÿI‡îÑõöMqµã[9½Hϭܦ&#ãÎË/Š¾epg(!E'Š®÷$×njhh ñmµ—ÎKeݦvZ`¨5PW!« -`=m3ˆ´Pwa”KÑ^Ôf07ZÌÎ$‹b9— -Æ2„++¢õBÕ|™–Tß çRKB±&ìŠüb;Fq¡¨h>ÊÜÌѪ"dÒÞ@t-KÙlZL†(aWÑ¥%w‡D”£d)dj ^¢—ú“¼d/[/»Z¤Æ}S*L`éjqªý¢„¦°ûž}–F/qQòªÌGŠ›i{Pö'Êù#ŝ[0 Ÿp¶wï]8¡E¡>E9Ü\ۓ8ïêší—±5™+tWCµ±.eª=a£Ã5wÙت?{¶Ø óÆê6–µ[›¬]{:3;ƒŽiKÝÚ̾ ] s9кm–ª¶ãœ<ç\,¾ì3ªú±·ôcÛ8 -ÚS ´z;Z¦yv4ȄjCë̆iAS¿õì^ës3øƒ%·« ‚ùì64ú«iC{Ìg]½Ösc?Û3à6í ÃHº¿ZԔ¥Çz¢*S‘BÅs­úIEU$PÅqÀˆû¸Ÿñ3à}^ìßãÈS —Xž">¯;‡HC”à¾ÁÃå,9'Ñ9 åd•}ûwJIZ"tÆøÀSØÀGK±µôËXè]¢ŸKÜsy.OR5SÂ5K•ªeTs/ªPU{jü²+4sn(¯e¼rUK£”«Z¿Ré[UÞ°KUþ¸¡é@_©ð¦Äþn©Æ/ù¥*¿Tæ³Y¹“o„2J®ÒWµ¾(öƒg<éõþ²Qò/\—ópká¥ñú3{É^ê¶V7éèe¬Ej M©1}ý¢´¸ë%t£Õ 9¨Â!+CØ/Êî lWå؏hä±Ërtc§ÑîtqAIjŒ'Êøޅ[Óh|‚òA±ðGÃ3„TVà2ˆô0"~JºŒŠoãâÍ;+³{Zxh«ö|az]^Õ[ëþÚâ±Ýú8''í×aȱwïä¼ -çÕøjæ׋$s‘ `Ç¥0›×2QŒ-l5ÅVöҋ]Ã<¥`™9ì¡ÞìaðqA¶ û˜)µ$7ÙF“å=Ddúž†ø¢¡ {3æ.B4$D%¦¢¡!ª…ÐÙ$rT ¹4}Eª²½ À[3—°‘6pd2ÅԚ ³’ÚR‰Ù폄 ž -,a&ːa‘õLc›QõTØp-ã±b$>ü9Œì;Kvüìæª\|Hù)Ì15yi 8~A±3Ä.‹VHøH¿³™ "ìG}µ$¹Ýhmàø€ÛßÓÆðÇÛÛ«××/7ßiÓÃÞp„Ú}Že`Š®¢4Y˜úÓ¡ÿšDà²$ ™Û5Üv™#a ´U€B¶ xí£“ƒkç·f5–Œ -Vyú’¼ ¾Ãú-v̊uî揧f|x:,óÏß꽞zgO].´ý¾èys=_š¹æ }Ã#Y*ŽÃ¥¯ëH,ó9ýQ–˜­pŽš%ægÏnóËS/ŸzáÔcŠ’³I½ ÐïMîgj×:òÇqÆù êÕ¤ô$ÕÊďæµ]wœÛ -Iò×üv0¤!Öûž˜@xÊÌu .™iV½õ«fÌ«ð7Ía'àð·|2Ñ,yÞd­+ð·dPsÖ% -``A6=ûÌ¡MKX“šÁÑL2Ë`‚Ö0s1ÄSÌ3 -rLùÍPS &S¡ŠRUõ”òcÊÕ²¢¤¥mél¬ñ2‹5íå²ÈJ8ZÆ%.‹)£µLO*ét¡ïúxÉV,üiåˆ6yX,Èã–_j‘(J\ÂSRK¯“K{zéðì3ssWqo‹JèÝ©uÞÄ&l›ÜfՍE–ð¨a‘ãléº*Ž«ê´ª.«Öaª³Ê2[öG2[®ÝTk'Õ ÷Ô³ÏVªSsê1ǔÔxÂ1uÌ)õ7”=µìŸR윎Ÿ.§ Z…ùΉPQf!()EuÆ÷Â÷ŽüÁ?§cŽüOZmñé#¬›ØŸuÂížýÕW~‡4+ßLýMlÂx6õMº­G.YՐ¤â8L›¡; ܎հ¾¤ÖÒ10BKÿx<Âp0<‚g|»X°ÏW@쓥ìvÛ󃲿â5­×øyÌósà¥ò˜ù -é îÀøÃ#¼òa¼QcÁlO)L F®=ç³=ãsUþfkjS6í=1cµ¯Ù ñÑYŽÚbÄýšc؍mÁnx#?qÉ5òӝš55ÍRn,5é•>É5K&¦¬L*…Øg²­nd¾»<ö¹íº8ÎÝpäP¦OW§ÅFÇnèYdZ/<û€˜vý4žÕ¬ApΨ y «ÀZÿ$oóéûçãYçqÆ9|löœGÎËrȬÁ6y0.Á¦O‹¦°è1˜ë -¬kB€}´…ãosB»x/;êÜð×ýI0#øq ¨ø7؊´`a?ÑÂ{€2—mÔАCޓ`⒃¬¿ùë@ÃÑõÖëÁ€uÃ*ïo›L7– Ïõ[3ýÆæx>Í -¸cJ#ËìÛÄGÖ|¾“çñÝZÜ£Ïk:Ù4¦{ â©„&ƒ,Ít¹í,^û ¾šHl¸áD˜˜4ÞþDU_Xu0 e¤;®omó -ê:ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£#!8~²J ÀÉ%çBŒO¬É§CŒÌü÷M²Zr»îfrc×!ýGèûÀz«ð·)OmÞÔ¶Á÷¹ë£Wa>¾ ó:«g,ùیÝ>kb[™ ¤·BWÖë÷\8¸k1õîr¿ü”{ù9÷æò\c;sr[KÞΉ3TO$Ûú+ÞÓ -Íèš6"u^êX‚©þH‚)K.E¨ª<%ºãYbI}ó[\õI¨,Žô|Á–¶+;Ú©Äv–ÈÀ¡FzÛµx´µá‘”WÞbe…Òö2q°™Õ9Kôñ¢ytVrÁƒ­fhv½ôç9óÕNò$ƒ´‹«fšBƒÔ#(ŒŸAØ%Lž³Ì¶(³Y9pØÔNæbÞd_2²pËC¤0;ü ÓãܓŽ‡ýÉ ;a`}¾Àøoºíf­5™Sý¼-(·SpÉ2ÀX–e6ÕÞ$™ÐÂû[¾Ãâ+†XùÈY ðÚ5·eZ¸DÑP¡˜ü}Óªë°Î&gm\dÛ¨ÏxŠ«¯ùz…LëX´°Å -P¬@ÄÃpÔlyc ¢Zex&xêÄþv£dd ‰Š„Bí  -„=ìtA€ÓH8 L,‚’fB!ôǟ®=ïûãNûÖ‚ ‰ýà#‚ËéÛ¿<ÝG>ÝBd= ´<ôÝLËÃÔu#DÉ3Y3!2MÄþQ“èeÛ##>q½&²ŽÝÀeqê{&ø“^”¦8šÔ²p”Àpä¯sÎfQçÛgý¤õš±èãŒÿ¥Îþ Ûõ§s*¬êµ~íû¯-̆ïû.Ì¢nÊúþ­àÜÖ÷˜ÎsÂ<–æ”·uâN‹ƒ=÷Í¡žŸq«‡yn-s]±–f+Ït<îi!ïézŒòÈ°ˆ;æ__þYj|T%Ëã}2?´xõÅiö®J•¤ó+…«UŪ‚V²6T5n2Eª‡;H³ðPŽxØ/|K/F9ä¡B'óY˜—BDkƒ4œ§=*>~q–öþâüš. £ìM¸Ž0r8\ñ/ÂR£y˜R>ÉG›4žõ1µÁ«Gj±fBÌ»~˜xΖ0Ó>jÏ1ÌCO˜7 ç­#±›1 Ãn磫²³ÍÞë­rÚ ãYZ>ÉWñ±Ž¼xԑ׈ܣõ–öäÄÀãx€ÖYãuúæ„f$óZ¦=.§Æ–®Ê¿õ¤ÓåY±U& ëÏÍù®ëS^×â$4‘Ζ§|ØêûƒVMï\eŕá\ž–^³ðŸ´@·= ä²9fñð,¹9 qyÈ见ȓœ<¤jôÛÆö¥rê:Pt&Ø 9¥rXÞÔÉêŽ!zÐÜâ[×I{ßÿn;_OÖ ýá2KÆ!Ù­¹{Ì -à=Çý€›?z%ÇÇ_Ðñ -AÇÿ‚Žÿë ã§ùè:ò±¨­þ Q[§;0…ñÓۀ–{Ô'árÀ7ÓºžYun§4—s«êÉUÙO®ššs´êAÃ<¥ëȞñÞìw9??èv;œãàäŽåTXëÌ«˜ÀõÏ|:ðôÄ>Í_ÓûQžýT®ýø¢yÚ^𤣎ÝË®F…F&4´Pºižmþwö…°> x½Š>º²Ÿ%ªð¯oþßÿçßo¾~ñÃ_®îÿËfEùkJshÒûÀciž}v¶¸$A/I‹Û„Åç~&æ2zIT¼'Àì’ RIpú†ö†]=ð1ûæXFHP’ýÀ +ž7ԓ{® A+3ÎÏ}äρù÷ƒýa¢¢Ós¦$~v²ªÎššîºÈØ5å5dë™AEº¾°“|ŸF•îڌš4Ÿ—räpLY&†h÷X§9?žfâIsâCTê>ՑJí1P>#Nô`¶3¢=k·Ì‡& ú£s⧡/Ó ›¹›žä‰Zώó&né½ãš¹ÒÌ;¨àx²ÿEZ‘O'‘¹ü¯Xã1§Ú±“àӒãI‡ïˆær4•õ2‘µE`=ûì#c°’FaÕ,™e…e®Z=hï粫ËBY&‘¹8žFæg;SëC¬‡GOÕbÚì'Û¿XЋ%ÅßyMò'ý­Æ&úó4çOJô·Lóg±["ó|Tô–FOj—Ñ[2Ë>8~‹ˆ] 4&C꣋µu¹Jö“Ž§úeNü2'~™¿Ì‰GçÄ2-Ø{dÌ:Ìÿõþ7ÿ¬æ-¡|ûû»Û¯îonnn¿ÿüóVuo¿yöÙïßð» ß}uõðp}+ZýöՏoß^A›·¿6ó|6Oà 7ð8Ma3ŒãY'£³úéL&פO¼Õ_ÿôü~§ŠõŸ~ÔÏÿQþþïBý‹tÅæw›þoÝæå3Þõ\PZ*o^ƒzÐÞæ· ry®ß¶U%.+¸Å?Ï·÷ç7/nîn¯îÜüF"Ïwww¯¤/¾°~ùöâåÍÃÝý·»«ÿCzïÛon^]û‡ë¿Þü{Üñâï÷Nk9חþRçʀc/ÕÚ‘³f”Ù’-K¤œË¹—㜻0oþéJëZödèû³.Lý&æ³ J‚u”¼ç mâ|6‰L¶Öp†ÚbÂÅãfÈr¹0ƒMŒg½¬ÀÍ Þ–ã™,ò°‰Ãل[Ñ"ÎÆaʛq>ý‡&Og}ëÇp&+r(÷Íg] -Ã&È·‰Õ'67ä³8À퐻³8ãþt`ÖÛÒx&úÌf˜ú,­MҊ¥›0èC„sm‚¼†HÈv›P{Ñp62칗Y8¥3Y{@f„àŠN%ƒ†ËËMÔ:Œ›q:ÃU›A:§ŸefŒý™¼žÃ®ñlô»ú3‘v{òaŠgÂ'£&ÍCrºi:û7eá½p_^\Ë"7jõÂp†Y'¬Þ'ËT+ŠZ½f»Bï+Ô¾›íÆ{J?E8£lî EoÁãÊ„Ö »¬Ïæ”9«\ wªp .ë ~8oúæ€ÈܓnI«é_a:¯—T‘\ÀÒza˜£ˆÑ…¥õؓd|죽òdOõteöå•8ÁÚª=Nj/›ÑV©§ÓUìuͪ®OäW•gözV¯¶^«I‚pcÀ÷:ÙJ轒}­Ÿ,¥vÇ°YáòÇ<ÊoSp½VºWîr4vŠµ=0 ¸l®Â®º c…qcŠaƒïd[’­OÜõ…vÂű!rWSë…Ï‹ò³™Gو³l²ÔgQ#6³ì"~Ø}Ø,‚ôÇ, Döˆ wÁ^faIt!¯é‰ gž‡²{ U´+Ýu²¼Ã¡Hv7t¬‚ ÈõY:TXKÆrŸPÇAZ—MX¶'ÚE®›Ç÷­zåpÂ¢é¤ i;vÒÂë%/Ží[^8Žœl˜Fƒ0CY^>¿ðÎM±^$’°‰¦’B°¶ì¶B•Ñ–nØx= °ÈdIL,–>Ãý-Br!h‡@sè¦z•,%ò÷ÊÆ`Q€ÚmÀ¨"þL‡ò)Ùþh÷‰@•¶a;ôÐCR‘ŸŒˆõS.u!WÊ zô[,¢5Ì/Ü¡fŒØ.|5T?‹pZ)z«ìÈ"²çæByÌǑ$¢†"ÚÇÜÇrk!“µ™ÐÀø -XÈQ†JVpx…cUXÖaàœ–-u‚€$ƒ|FlK29;ÙNdtÁ°±mö©é¦¡“±x¡©y†åŽ4ñ„Å.3/áÆnnöYNƒ¾ƒ&à0Ø4Œ„aH#t-ÙΓ,5ðèÜõe=ɧq’G¥8ˆf!*=)ȦõÂnŒ¦*ý\ZtCú¬:E'¢í¦VeŒCèíŠÝXÌ/¬ïT*;x˟QFrÄeÙðǕ×j9|qûáº0 ^ü~pcœÜgŽ?ÙÛE†ÄÅó×˽úm]`ÿ]¡8žŠïBb`êüÃö"›s_½PCDšò¤î?(ϲ·ÕÿÞLJs ö®Æ¦V<€Øãd{l|€"aÈ…Õl 2ï},ÍÇO$ÉT݀ ¥y.Ér 5cÑ|¥úk¸/:€ÆCvŽy)·Æqh܁ðÀÒÑîì)°”N2 Uw(5î„ä*ûÖÐ8GtKªGP¶<}¯âì±çÊ U§ -±wg"½‚x}õû· ”ÿyÀt/ŽAtc7:S,žAjK3Þ³¸EÁþ#bŒû…·Š´Tö­âèÂÉ}õòÎJq°[§Qq¢¾œ¤ -÷ÂBJ}Ç=„²Š€WìHî"(™òLî#À.{zÿÌI#§éÒKÓETwBc¥Ó7‡Ëô´£—p™½^‘³lã,ç¬%|'wâ9eé.l.¤7°©Ê>[‹­ËlA$Ú¹ú ¡Óºìí9eé5l.ô‡÷ÊÖoyÄq(c-OÐǕçFNB÷Ñ ½ì鯮¼BXºëeæljrŠ5¹tb¤#ìZt›~hš4ÂÒ{X/ó‡÷šÖoùoDê¦g~»kd™àØ7©,â{Ñ:±åv擃: ™foR„3’â¬Ö8!Öi‚º!<„yGxˆš¤1­¬PL ê|¬Â7HuÜ&bÿŽÆÐúÆì·Æ\n•]‹­Ê­]€‰&Z ¯z¨Ohh°ÌŮٸr¯›ê‚avà¹Ç2 p|` Šé9Y•Þz¡0¦ ݱÖU)]Æ*Y^„Â\­lV1ôcÓj¡¼(ƒÊ§«×•ðºÞô'ä¡O⢆w‰Sb飆=Y‡»8©áWèFص‹—ºá ‰•›š6kÞZÐà+:íœb;ɜ<–IV<ÕCËü4OµS–žêzañ@\¡¥„Ô̲JÆ°ÆÖ7=¯‹6\Ën:í® Jã`ˆ×+26ïaªkßc‹Ù K§u½®ø£k]•b.×܋i"ðÊ dӞW-„¥ïº¹Î_ÀëZ¿éÏæ¾G¶‘Wš§“‹æé¶È¢ybšÐ„³Ð<Á^Dg\ó„~&2çìš'l4º-TO7"ÕÓmE§„U<ÁºP=¡Ov‚ -ÛdQ<Ëç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgiÄÓù…Þ}Eë<ìÐ#–«I#K­³’‹ªH;íE™Ätè/µNڙ ßÔ ûÂ/½2§,´À†lêb­¬¨”µÕ…îY¯^èo敭ßõ´3ü£Lóc4Ä ¬àðW¿^‘Á‘èy‹SsR«­ƒØã·ÏÓÎÚ\1~ÄZ™S¬Ug,Fža¦P‹V&»–°¹©iµPܺoÎU¿Ð_Á+[¿ëÏè°€§AÕÃ+XµQFæÔ)c Ì1׺òbÝ§¹…p”ÙÑ*2[è5ƒ蕷Š¸2°«sÕ ^Øþaiž¦A‡l ð™b W³A}¢¤“‰ëAWž·§®Ú·€À™{3ycµ'ˆš4ðÖ4Ã6!܇Fgô°ôX™ç0#´!òB_.r™¸ÑÇHt@?Ño7»ãCE?”½$Ñ{p!4Á8ôê4W@²Èþ"_€’qDPE™L=V¨ö| ìR¹C]WVì„ã‡`”ÜÛ8À–ßA€€å ž¦YÝu´ËÒ7Ìày¢:…àÚ5|û8 -O—uXa’íõÅè–<œ‡ªã›¬%rӘÆý®äb¥À4ê`-‘þIJ ‡ÖNXˆ'®õ›¦¢`º«íÅnôó ýá½²õ[6^A™¿ô¿aæs+{½"ÏjBü†ž;(â€i9 -ÏsŠ6zE%5Êââ¢2§X«~«‘“JÀµ2¸wah­­ŠÝZ¯^è¯à•­ßµéž9b_u’XÌ×K26pØI¹jÕ,ƒ…å0e¢8œà #~¡^7"Í`hêrJiÔnu2D%ºJe„@Š)mÚgãåÑÊUõ¥JE¯Y»6_ñ2‡z -ÅCܐGHΊKáMÍK”Ìa•È -Åøì&0Ö2¡kÃ4ÕÊŠµj·:y€(˜7MepK„ضj”åíñüB«ìð]›~pIŠÖý§¸öœ ›dxpÈn"ae”éoª”Ez‰qšÚ çÈMeN)­º0ad3ŒÔʄ«2†Ë5‚9-ÊÕËêk•š^ôg38ª›I- vÇ~61ïlA»c›š"Yî«GÈî(€w¨ -tI9âØô˜hñ6Èû BÑ@>ļC@…,å˜wô™z^ è׆è$½ÓÜ2NcE½S&bÔ_½ƒé†y {Çûå¸w˜â0®Ã.:²]<P¡[Bß¡ U‚hÎ]ðZÇ£;å…÷?v†æBƒ¶7uJiÔ*#ç3€Êj]Ò֐(–F ÅåÇ8†ö:­RÕú=O«þŸO÷Üàx×JVÔIœcŠÉ\š+2Ý)f1{s¡ÜkUN°&íN'ËÆ?uaÓԕÌ]M­ÙÚίóÇ÷ºÖïÙp;G2—EÍ-'‹Ü%·"Ô%¼lŒ½ù<;øê[&ÂpÆ©o. °–禮B(m:Ë"&=€ÙjM˜[ãÜ6Y(&–gó ýù½²ƒýmµÆÂ"Â|@aŽÆÊ€ÕŸÅ@Yj¢LKpݏàiNÃPÃœb¢‘ÆÔë -ò»ä e‘Ém!S{ŒåNÕk,HL¶ -è%W¿ª"ü Z)Ì~«“Eꆜk”@Kx”€SLr²(zaÿÉ•R,.t¹?#Fº tB…© l4Õç-Ap¨a® Àã’yÏ©èB)iԘ$œ‘ $@í%ÀhRÂP}UcÄáì=´D=F³GØÉëYT:Êíh|¾ù܄ -‚Ï¢ûëeÐÔäkÒîtr_ôéR@aCžà»µ<[½ÐŸß+[¿h£4ôà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q~ÉçD &pD\NÐ"â<žÀq5   â<¢`ˆóˆ‡Ä•ˆGÄyHÁç1W‚ -W -–h¸Wàp¸Xàh¸Z°ÕØÇ•à‡Â•è‚%Îà  -çñ…óƒÎ  -çÕý^b –P¸dàH82p$œ‡,‘pgàH84p$Üáê<â°5<þ א ¾æÐ~¸•€%Îêu%– ÖU)-0­!‚Í+s”[it‰†ó‡k®ó(u¼ér 8‰†kȆa+0ÿ‚ró`€ÎcêeUÐT䔙֐ ÂVë2”[m²ÃùƒùUþè^ÑúOé¬ÕÝ ;Ÿ0b_r2¬I´˜õ‘æbéÉ=3ŠY° ©½PXXS[—S¬Ñj˜P²,²ö¯ÌD„¦ÕVh¨OW®«/Pê:xÓf|”æ¾N½EM1Œ:Áë¹×à$Ø|D6Š:p]P½E¤ƒP)nì1ÍÌ/ÄÞ9…¶2§X«/Š¥ÐÈA#‚›Ê"ä€Ø¶j»ÕÏ/ôWðÊÖïÚöêGè¬pWvI՗˜æ"ÍV2ÌiL+ü=¶sàî©BÄ·…bš\I£â2B1NMe•b­Ó/ä™"Ô´©• %Íôz—V ÅZ-W/,¯P+[¿kíÆl² 6(,ž×+2zÙPvsŒ–Ü¥‡°¥çu͕b/ˆOÚ ïÛʜb­úæçä<´X*ƒÍ.7mêg»­Rˆ/SmÛ÷ër{]•bº·ÚÈ †‹~S낙wˆm›FyQ”g{8¿Ð_ÀëZ¿éÏ6Ia‰uHTäå,®/#ŽºŸÁ%zδ2’Uÿ"'¶Ïö^"'&‘×ý"D¬äÔÔR֖kþJ•å=Òu_êIž^[Km|¼?“Qý¡­žõ›µ¾ßAuë!@îòtªtY7©³–׌ÙÔLí¸ŒíΪûeÀRdU$´"'X{v_¡bš€WyEXPÚ½=#¸³XË/+^*Z¿ßϵ ¹#w¦·L8JòõŠ Ùp²£>*¨<Ý ÒG—aš/çpS •×/D'Ìm]…`m:SjRŒ{SS¶(þÚdnr4Ïæúó{eëýD¢ÇºC‡¨Fp -ì°Ê¾^’aсêÞØÏ -þ¡€>Є38ÁdUxøÆØ\Ö©+¯©©PJ“v§“¾Î¦ÖEkQÈM›…b·–g«úkyeëý¹$dðÔɒúôŽt©ÔÁð.†Ýk\ ²^I -ÁT€SÑR{–]?·u9ÅÚtmÒÈpÖªQ+CÛ>7Áîô‡óëÊó{U«×üy&( =õ&Rv ¶“a֊*¤©I¹žD{l˜™ƒÆ(önÌ®<¶vflª•9ÅZõ[<(³¨• E´ó±iµP|,ôñê…þ -^Ùú]?Ù& ÌRP‡_À÷¯—Ô\RCLf´dÔ¨eûP)&ŒŒ%Û¢_(Â2A5•9Åu{’¥ë˜¯V6t2U[-”åyõñê…öµ®Õ‹Öü”r?øö ý›¹¤v[@»q#Ъ »åµ»Ôç -ì{õם«’+ªȎH ԝ084»¶˜nYÂ4R…t#k'pƎ螐ƒïЙ.{¬xnkéT.pnxGˆ¾[ ¹aï -~ ¢ÝH\f¨Xîd>ÎÊ-íiDCArO¦£8{îv’ǝ€V s…q§YuÅMILoâ†)ÙPcâîhÙW71@°X.AÜ åe£¯Âeó‚á>ù›g† œx¸Á]©fTGÂ͔\6âéÃ~;Á=ãS¡&yÄléNYQ%´PêJ5Èu­ÈPÙµ½½]«\æn¼ßO8€>¡"Êè `úíäݞ‘EG>ä6|üÜ·áá7*¸mað²oÆ -Ûf> ²ÆŸ ™‚ÚŽ³6æXl¬tä²-K~fhT¡$l`ØçZcµCKê*@»[!³» -ÉZ€«‚È î¬ñØÐÞ+{°')käÃ2©²61FÅö"Òña¬ ìÑjY@° ÁAB´þuì50èß%ô35sE^£ŽK^cÆ1šx¼NÙ؁á®ÑA´$Ø5SǸB] ó‰=3è†k^V0×9a¹î™jU\×ÉY ׇÓõ€;€w®âºR %ÍdR ¸:3ÙmL©Ï/CWªA¤kE†¢®íµhk*#ÖǶzÞ®¾? }1ÆкR 4Ú¬êžFPCZc¬EÈedM…XËþ<µÕ8a °.Ô‰.9jښ[‚«í™ -±>´Usðnõµã±ˆóëµ@¡±qø§£¥ÃhÉ2¨jØæúÜ\…¢—×S |s¥ºÔc@io¬…Sû#•‹üMJ%ëW«oô[LÖ¸€RWªŸÑ¡} ›è'¶€i ¢búe£zujENhá̕j°çZ‘!£k{-‚º>V¹Ì¼T´~¿úê°CÁO¿ObA;ËzÑ<œ ãó«.€ÓÂø44Ö/Q¨‹ Û s¥ÔÙ+20´7×B¦ý¡ÊEåMJ%«7;åàƒ‡`.ñ¤²’ ¾=岂””}<§<®•p±÷SªÔŒlÝÌ o59amtjÁ@zE&éí-à”õ¹ -¹>{©êð%æ£²~œ|qóü‹Û‡#'àà×՟^]ëóüöîÅ·ÿéúGk!v›ç¸¾:vpÎùÍëo¿º¾q}ûÐÜ`ñcÓÉÛxÎÎ?Þ¼|ø¡4qê¹¾º¿þóÍõ_ä±^½=Ý3ÍÓÈóß\¿mæä忽þîá[‚Ëû»Û‡Ÿ¼ú›»7¸÷D£zô=ÿáúæûžú¢¸ûËۓ#{ñLÏvº¸}i·?;zØÓ¼ùó5ŽzâoªyŒ–Eœo˜U…È32«‡ÜӒõ×â¤'ƒ›¿ï‰O¥ÉÒ@Åo-ÚÕ›œìøÛ¶ŽãÔeÕ3Ÿh —ý¤cvÔ©AËÉýÐéáÝC9¼{\&ω³Ü‘£gŸa-ȏÀD¾@Àék$ðMIp´”œ"¨à Ü«ÏÅ4<D® k¯’P¯áÕ²UHÇj‚žÝ;!¹L²½‹jFgÈt~îD‚©’ޝn¶ã9Ž#„©a@Èô …àoëH#TrÔÞc#†N 9¤Y a¨o§' @䢭¼]÷_Ê ðyȾ¬ï&»úsZÌì€Y‘’ƒyvƒ~ž˜z@¤Yy·–õ=a‹ìŽ÷@ò*_Ãñ­t± ±ˆåYÐXl¸ {Žî2m…0Ï5\ÊvMù­š°®CTÀ±=c¯N%f¤_”Z9 -Æ9Ëðdìȳº÷2€4Û úÍèf'µ½:Ùäéé·§ÙyŒ\)Ê*G™¥HœŒþî-5èØËøǀU #R™Ç;ꔍ¹81g›`j$`KBítsY“QGÞ\7›C…ÆVÌÀâÃä¶úØzÚRً8¥/'«Ó¤Wl LŒŒ8†·qTGMŸ5Ûø4Õó¢¾ ֝ºe¸Ç%ã䁕‘2¶Qa|8§·Éj0ð T@t¹ûLµ‰ã4A€,ž.9ŽŠ>1q©ä$tøêMžK¬W~m÷ ÓË؋²í–ðµtÄÞ!´Så>•ð¢¨ºï–ËpÎ×b´DDH)#ìV˜ûr۔°—Ìú0DÉC<‚m²„ ücÀ yœÄÔé DB=N:ðèæ³Ìø‰wõ¾õB~NIë¢51^1D€iª|¤l¥Ó=†š>0ì@ÉƆǷÅÞAgÜÐ|Î:‚.Ҋ^qšGdT{hl䑲XÕòE$E†gôzXøˆjžh˜H³+“;éTÜ×ùaˆ/ìdÙ0‡QÒû¨é\•÷a”¨{¥½ž<–ìÌ`)F„Yx­óÊtå"Xà95‚ž.LˆJQMo3OÈf² )gî©ô«ø}|úi.¯3è&B´ü ¾gº*¯'cÈì-ES9Ž#"˜R 2a̚k_Ä|övìKr*¦ÒT*™ÜÈPžÖÁˆw»Oö>t.õ‰`èS$ßB`OI -Ù8C¯¦ØnXHä*]š51×ôDK4«tÏMµS•Ço# ÛS„Ÿðbâÿg½;NêôõŒÍõº¸Q¨9˜‚<ÆkÓ±nŠœƒ³9Ä@̣Vɞ231\]xA[“õÍ]Ð/AbÄ6F¶”K*œæÐʒ<.J& N{ኟÀΨ0÷ǒ á¦öÜ´4+m¨™¿+ Aª½˜ÏQ€òü¾ k,G€L4ì^sfä¾!{”ForZìôqaÄÅó’s̚ˆmÀ«Á§´3E䜐‚Œ^ÆNkFǨ1ÃàHýûx嚃…€ƒÊŠ´X0 䒰T¦Ür·C53Ÿñª„ HPì8$dïM$†»ÃD†jŠ1ž @ʧÄS ØöØ©ÙÔHÆ[L<1S±r*¶ég›Ð&^ùE¦æk@%ðD»3*lTã™âV*¡bK*3s4˜› r荤ªÏS”ËÈ8hF Ì̌­ ‚Aqøµm¡†¢ÀQ_"LñœÈ/Ø}~r 2¨ üŒˆ Šfp‚þ¡G5L )6 óÜM†™+]µ+šŒ°™r4”)6OCŠ›aƒ.L¢Ç -£…¦oë™a˙ŠQ<«gÈ4fz®µ¹ÙC:â?2©X’0ɌBŠûyTˇ±Íê4@âmåüxNjq jú˜¨·;5šF]5€Tdº^G81©WÀýëÆ -…G–Ç ;³²rpOÄ癅 ³pœ™:Q3­øÜe‹¢VæÜ :*À’è^ÜÖ3ˆ §CÍõ6Jf¾‚&|c§ Å\‚Iß3G=ù†±h,e*=f}AÔbÒÄF F,lð•«*òÓD}jУ—8tì#<-"ic.«©„’峁¹“1Q0I•3¿M·GK€Â„¾˜¿HnÊ®Äö8aª'¶ì>Ès0¸¨NŒ ™°EªŸ(yªCúy¾,Õ!4/â/é¢âR)¯Ú­ÀôÏ&›$Íî2Làь©óìèŸ!ÖÔ°Á#³£¦xŒ 飿‘{74<76V„7ê¹(ØFF›Ê -¥a êcffØ^5D{\ŒÃ¨ijÉQ^DÞ$ΊÛ×Yl[)58}Î49 XYHz«ð? Ÿ¤š”ÙO´§úF堎 æKMÂ-CP×EV3ÁˆÜËúÞ÷4CÎþÙc¾[7…³~R¯Ë‹bsS6Ù+T -uJÑBˆ£‹Aé--¡~ç˜;% ‡¨>礮’îæ\¸è@C5–# -=†ó& ÿå~„uÁ -̂–,·-ÌdŽ-˜þ躇,Ȉmœ2g§mŽ;`F0؛±ÆBîÕ8^•ÚtÇÄ MêM“Ùg‹yMÖâvŸ¢QØ:äúÙ·4¸eJúTˆ;&užhúNÄnϖÌ|‚¨ ¯Š;ê‚Z8 Ü‹¦:Út¥hZ«¼ ÀÁ̝VG0ߙùŠísyrüì »c¡b"«F-´3çrh pT™·MuöÀ{ì-…H¯y`gc8XÓqÔ]ÃÔ²úvHÞ¦Õujv¼¦Ò<óÈΙÁ¹4 *çlþXÃ@í{ ö°Ï¦·‘«,Ò'¤’>ˆT˜:àMƒ6Ɋì¤Ý0#LÃ; }³®¦ÆäΝ¾ gËlNA†ˆ$Yª30&Ådƒu‹ÄÿŒJ4ÿ’F>~Qø3WŸ-ß2Úy“~†ïŒÉpv%c¿ýÈ4d%†ä„ÊÐHm§V58ÍFM’0ρW4öwF"m K€3z£)€FØ?h*½Óñ3쌺áPø¬¨!ږ…sþBë'ŒŒ£h@íxH„í<+œù°ø~Í]y´#ȑRšoR¨A²bF)ߒa;‚ @c5æ!Ä+v43èJD‘|VN÷¤h¬·Á$2¥öLe[)RvÀvªž\ÐO;¢H<¶NÖÃe0ª0Çæ`Õ(¾(»_œóCb"6ø':¨@1çàÄ·9è&eí!df.=¨†§lòԉ‹>ºÉT@¾@ŒðÉ ÷V—è)£§Š ¼ý¬Võz†~\î#±?»N·"P¦8ë¹Öœxv'Dl‚:Åû¤ G/ÈêÏLú&ÜÁÜ`ŅpPÖ§R3Sb --ø&âšUŸ£uM[œÌߨ0ÍÌ cœÕçK§R‚º{‡Ñ'ÚÄ Ô­J[0+S+L§J[eV -Pj«0ƒðñ¨ÖaµE¨ ЬìÂÉ>iµ4ñ/êœÇ«RéÑÎúdŠr¶tQ4ˆAÈαá^çyW}Ðtª˜csÇ,£zõ̶ ÉI§¹l… GÚÜ@&£¡éR'/4ŠÁ™”äs˜„^¯£cŽÎɾ³C] ÑÀÓÇ¢/—d!L/‰-`Kk€À´§ÑÄ;œö={š4nÖX3➄ÝÁ¤§œ¿×UÂSí>îY „)Ôû:H) ö¶ÓÌØÄP½ª©yʦFÓan¨°úÄ ÞIN)œ‚ÌToðÂ÷x|w‘YÌÌK»(}˜´«+rS ‚Š H\c.\½ I6Ð!SGÅÞ6šÿÂ¿sÛ(¨ØbçÉEF™54ÓñTìA­ø\æˆÜ4ƒ¦Â4¨Qή¢gÙÿQk…/ çžìŸÄjæðN½[Qíº@`£³&aÊ5ÌTDÓñ̐@û ­Ðû¢ÐzÅ!€Û´(”g  AÇ>[Õ=êUŠä-BVï–pÆ`œkÇ+q´3Üe‘93ᢀOžËtœ«ŸDt7hÑ÷¼4pÜi¢ï¬]Œ³¦ºö6$ȅ©w°«È«±SœŒÌ³ÞÖ²3N»€…gÖ¹ÆԐСaD%Ä'eUTFsŒ¨%˜)ˆc±¦€Ç„bœõ8É;+Ð<Éï5‡Ük0:´IÇÁÕÉÞ„Tó5Îêÿ̍™fuìq¯êõ1™­·u>ð'v#½AzÒ3ÎDPNSo¶Å - k{_¦ãˆYpSm®SÛSY%NôŠ£0HìI¤'Ÿ·ÁwÅTI£=iannã¶óº¦ÏéÀÔlúÆ!TÛ8 'ˆ3¬pj¨‚‹<ól*õ7±k9âÐsÝûxö2z¥hi25 <žv!>Ç&c&ép±†I½Ý‘p®¢šfu8a¶×3è'Ûè‘5“jP%GṈ­(Rµ´ö̋Øs |:š:ç]Áèt*¿Æ3]‰ -˛ ‡•ç‚ºR‚1‚ÑÒ¤–ËIÉbÖäWT©ØX™íØAõ ~–͹ó°ÔùÞîÀîŸC€ÔàxmeHQGûdbìÚ‚s8X³ùbßIuçžÇÐÓLí¸vRs"Œg6R¢¼ºnºY µ½¥S÷öu„ $&¤< -2¹œéXNj@t­†^0µºá#Á´aÂÑۗxÈÔxN5qѬuQ¨é  3é&@Ïìù;7 n5ER.¶ ¤Qᤖy…'é6¤3ðÇß.'ºaÕ·Íôrz‡ŽGAˆG/Í~ˆ ³Þ0¥nŽ<0 Òð`Ê1SØGqÅàâ*욡KÚç'@Èè]Yy„VÑ~ÕÞoñÒk°òPÂ,~.‘î8EнKDǓ±ËcÙ …ð\Å%3báºÂÜGΚˢdýz•»–ëH1Š^È×ND`͑ŽAîx™Z aûÃQ¿…àÚ"ÏMŽPH+ϨKEóYÌtVrÝ»´TT™Ff!3m¡k”îOë¹U{,Ž1#Ŧ‰9ÅázÅsn¢Õv:.,”£Z€‘6FÖ>F2’ Á"$äÆȘ   vBÈzæ)ŒÚ|!™Ã¿…Y5c}=U!W„Á¦äÀIˍ³ƒ(hÍÎ+[*¶~†¨Æ“ñ’e±˜Á/ì\%¿R×`¨Þ€Ã }Ç+è8{Q¬9-yâ'NQѧLU¡·ÔH²${Ç.Àޖp.°é™‰â"d§‘ÈS·VWàÎ(F硵1¡_T…Ý Ψi‘¡ÔŽV=‹–ŽÈÁ˜/ u°S·u½ 8Cw2~(’<Ë—a§u{ʙpdô(_úVæQa8¯€‘üuV·0¤99Dû„ 3GU,vJd ¬W|æYý6ºÝ!š›½<«ÿ XVLÙaR0%™Âÿ8„Æ’*øú‘&€'1h8ϏNÂ<ª BnS%DZúÔÔÁl#³Ü)°•îA{Úo£ ƒK¨3 ™ØîCoMÜüo“‹^¸bBõuwH”¨ˆG”Q2Ë!–fÀ Õ5qóOf–Ä2玗L.ûÏ.D¥A;8±Nuú‘ƒ1h¯'Á=b)QŠ„Ó˜6ðÜ)*MXâŸ‘)›È‹Nכ¾ÏKÇjŽ*ðÀÇ­n÷ÉÿéGÊ®÷#A…H¨}‰pÛÁ±L`ç¨÷aáãH|~ - fKÞÎôS0§º‰üt16&ÅaÅ à6¢Ý ä0m97öÑ\ïözYñPo¨Kh ²‹€±7¸²AóäL½A¬A˜• ¨œ)(HjêUÖµû‚Z®‘®žG¤›çÅ}d[¬¹â6'å¢lr©–$É`””ÔDí‹2Áöb9pJjéœ:ÝC0ÀTÎoŽ®ƒšˆ„¦úÏ„óãLa -¢<ëɭߏ Þ9©úÏTð BRdvWÏëLÙïìtÔU¨£¯ÓCÂh_ˆ³:LÔ4GÆdL=Ì00Ç1–„#¯Ã¨ãaQY ˜ =x8Á íƒaò€@8ncîEn‡QB Pg@=¹ódUlmªG"]¾Øè(~˜¯ŠJM¼ýx}ã˜%Sä:$Z½øO =ÂÆM,΍»¢NŸbeg*à©Bž‘î8 †{GmuN†4Ðaw˜r‘±Þtd"} rƒ‚Z%1qpÞ L¹Z4¼®ICrô|6X›xø­úüh–· pÉÌîÀõ'Ε¢éRΜz¢MÀìî ª¬â´LPY=@ùÍp &V{ݱp³_}€q/cÿëÍó¯îon¿ßüj·Û¾xñîõî®pñ:άrqb4‹*M¯ Yq -}Wd­d&zhS†Ðs–º^DÜh§±Ó*AÊdmIKJga?t°U¤úĬ÷}=?iÂ)çÀ€Hõ¯PLä˜S¯ƒ‰f°t,ªw™lÒЯ}¹OuNDN‘PóêËÁÀ3O‰é)Hw`\cë …>ìT`S0G—Š³7€øêÎN7V ö!…1?©Ä‚ô¢ -9–ë{Á••Càù)ÕÀ#J}jÆEbîByV8\™DûÀ#m0i§@àŽëÎzèùLªe¢3[9½-±:¸oc½þxfUõ>¢«a ƒ„ÄÏ܍íí‚&HÈQí_L9 +J*¶m0/ð]lfcÒYT&`¼Œ€éLÔÆ&Èã@@ñrs N<<¨:É-z¸^Êîúapï}Tz±ê£áٓz'ËÁbg™Òmƽnï:ð„èñÎdÁaPüš†Ç'sÌvÌàfõû&Ù7̺yL½h¦%\EÆ LgêZ“:MZØ1;ã—’†Ë8–ô(O£PïÚ#+°÷ñl ‚²GJÐõXн“íävx@$ÄXµâ؄fäW0YIÅ°:B³·ËŠà=++däPÀê&ÄTóæi qžêEØqá¥iB}ɐZz¸6ÇFÚ8üÈ~4P“@F „{FÛwq¼À(›CëüՀÿ‡2œËڄLÍP“€–ã2³‚õÐ4¤0¢Öpn ÀS6å}Yx2œL“·— „D]4z0ÍH&|ZA|H׌Š‡¿+†'zü„•BÚ¦J‚ÇÄ<…6 ‚é<:aµ¹1Xs£ÂŸAÈ|ªQy pb@Ž¨ P1âÐxˆXâe腒Ú5°åfò1€T¬=3¶¢×»S7¼úŒì³È”ëí.#šåïB“ ÎÑózzó¸÷M( À\qÐH½,DO$CW¬»Ï¨9ª` OBª'zË@§%\³bL\?òxõC.UXø!.2œ ʆöÃéûÎu@¸þ¦ž‘y4ÙÑ—TÒ«‘2œóY òšYtJÇ +ö0f•sa©ÃtßnY\}IW X°þfÚÍ÷e¨5„¿cT1Þ³ ƒÞ¥+‡ rVo»w¸oÈê™çk a~`<¥J̟’õ‚Û<Æ| "•øt¢â3 pԓ™3žJëë²A_Ãь˜RÌ>ø‰+@1jÀԇ¬)Gªj±V$c7*ìbeTæ?wÄ)<0ƒC–0Þԁ5º¾9SŸ8Âtн!+’›ÇT –©‰ˆ£YÁƤ``è%ïi-F¼@§òVbyR÷ `Ĭ³…¾gÈj_#¥û©÷Yçf=&›H{Ê9ØnôLÄØënïÐ#ÂNè!1 ÷ƳrÑ_C§çíU€:OÂâäêÕSC˜ô:e¥¸“X¤~lñIæHÁ*鞇Eöz§š’é$¥1Ç%u¸ö”%fMZ; êpïUq -4ÂB;|Ÿ%ç©zÌä¤* -ß -.aëF¨Æ5…÷Ûe8’™9́$“q -ôˆ97Fž,tS°W¿NÅùüÓ«Œ`ø”yI=ëA·‡æߗ³*L(ãqAú*¶©žX"ÐÚ`.}³ð ´UtìLUÝüؘ¶gxo0©ÐJ.hÌRBƙ‚š""Ôûh«÷™VUªWýDUfdsŒbP-˜¨Oúg51zr¦¼¥&9};àæy>úïá÷€5ÃÚÊtmN æ\ÒÆ:8ã‘:Ï}I+Pàj× Kºªu*)‰ÅÖ«6`iýtKš¶#Њ†Ó sÛìâ‘û‡&ó€nSŸ2+Þ¢·ckõ6ìqùßik@^±àAÄöÎE‚Ú]YMÀ³…I2‚•280h€öÀ6¿Í,–È\¦9(®ƒfG;´•y'jðÞh˜„&¨êx?Ó§†ÙC08¡é® @†`BÏð`- L9)bu4r³Ž5îÆ8ؔ>ïÎ,ÁXt™O¢d»ªx†ö²\O:%3Ü1VÓÂòJÀ>À6Ž"×#ðÀ؊e QŠÄ¸F…‘0òhIµËú}:ÿcõeSè ¢i ÌvÒ9_-kÕTÒy j.ê-X‹yæxÞ§ZlÍP9êÌn‚Rðö€0ªE½Ó= ­!/-J-ÉõKj ª3N@Íc *­\ƒÆP‘@QГpYý4j’7SÞ¨¢5ìüÚùEìœ-3Z¬Šñê}<µà¡zæ%˜Ñ•þvh1ahôeú÷±Ç€JŒ5a>œ¤1*ÆÆào] Ž€÷…AßÉ£àC±ú&Ks/š¹Ò«-Ùó=ï±ÊAO#Dé¥Å^ßn41&”4°ÆBOj eðpœvÙuMjv}(¡ù“ ÁT:^°ž©ž6Ùë†f‹Èž,\¢,Î c3.óӆ7`Ÿôí(‚ó72Rk)ˆa°Á37&Ù@¯Ép¸ò¢…ýóˆ9-rÕVù¤¤¦gœ°³‚ºyŒLäha°~‘ç jøÑÄÜ Q=rüˆí2Zz »+i¸J44£‘ü(|FË`,yŠ Ý —£FÝð*l[4Þòœ;3öÆԚùáӁãEN „C»@€o7«:êUL©6Gf†…Ãä‘ÄACíÇrXú`Èoˆ¯à }P,7…Þ™Í"óPÔ[˜Cps¤¡2‚ÙŸü>n¶%‚BËR‰† 4ÑásӜŠÙ‘f_DNfuj›ó9+¸Ô$œ f~€ ‰Q7ïPb{'F6éä -y0˜ÃŸË zlœõq#ó»W‘Æ‘‰£……ði ҏú™ €`1€&àô:¡•¨4 £4X:¦AÃˊÎÅ7æœa RÖxM²oF†ïíÏo·À\pb(hg²#1”4À° óTC¢GkÌv<|oÆ:ƒ: fñ·Ó³jf}ܾñ>t ƒÕG嘘ú&¿M:ÍÀÌ4%è´LåÄÄVˆ«tž¨)ÐÆ`6çb6¯#NWD}Ó5ëÒÜJT°Ÿf}ÊNí»Ù2{Í -ë!a]†~q ˆË¢ ÂÈtÈ6tk‘ýgÐ -À¤OC²åғ©†IÅãX'õ¢rÇJ±dë >5—ƒm¾ ̃Œd‚yÒõ4ª¿“‰/°Á1ÅVjqjé1hGFí±èЋz„Ú©%ÂïÝYX:%x4@¯§+ЈàGÆÐ×9i¾9¾4Oº7J¬°æâ#Á»œõ²9Y·h4m=7¨Wӟû )–¿®Â¤†å.q þƒfoUX˜ š-“nGð±r à4¨ÇápàAuI¦kòxIôt23-㛴ÈF“2%¿ -÷ÃIE(!æt!äqq›Q™63>Û€ÏËQ%®B09/ëºóËþ?öÞ­ç–ä8ϼÀÿ°/=4\™••UyiïÑÀžÙ–ÁG¡i¶-ê¦AÑCøß{½‡ˆÌ\ßnS’7_è†ì/vU­:fFF¼ñÄ8$“CyëÅÓp,³´>A]FØ/àõn`Áýxêš!~'xLî ÖãÖð4Àç{v?öt)K®Ô¡¸q3•Ãã÷î2 Þï–RVèøXôO€Á»t AsôÔ{ à)\Áä!’QÎÆ}UTŒ{,BZñ1âYq´ZÚÝ~±ð7Wˆìv_ëp™¬VZòñ7áÃp8ÎÄTÙaA’‰­ÙsãÊñ6΋ß/ƒ1©*ě)­ò‚.c/2ç „'äyœYó/~ç}îתÇeÁ@ñqIyîÇ[ +>fVÒátp ÖeVÕcB/=¬(MŕMþ#f`R'xô°úÁhDÌZXœÁᆊY?ݱ·N­bº“b¨1äëFmÑ2 3 ç÷•}êñ×?¬ËREæV²ÚÏ>Ò·ÐNv½YÀ2‚Xç0_bqsÇìÿüYÎößçhÿÛÐÃ?‚ÿžÄãý» -é62¾^èσ\»ªèŒ 2‰Š+ýøJpü­oyd³áÓBµ²¢±.Î'ÉÇXÚ¢˜0ÀÇXƒaݳq!A&òÐØcü³ ê1þFa×F=æNr 6Ñï@ßR;7â1¤•/ð±\H Ä;¾ 0Ãç»àŽ¡ý.íLÚ1ªE)D(HiÖmí°ãÕJŒ/º¶B¨ãv±»‘Ž[€˜ƒt &?]’7çâwÒ13}Î2„¥ NR ãË3í:†TX!sŽ™†oerŽ҈°bŽ AåoRŽÙÌéirLu@}ÞÇeˆãK Ðóïþ†7¦qŒI7ÆaêsM¸ñeÁÛÎ6F÷$r<Œ6†lódÑhc,ìĜXÉÆ¡iM°q7ÿ;¹Æ]%s;Õk…óšLãnUiŒiú(o@cÎæטZ¹’]Ì¿©¼|6X—”%ØŸýì»í§ñ^ÑŸìSˆXJAõa¿6 -r1'qTÙläbYŸ–€ahHzˍyº˜ïÍÓŁÌtÙ©—^wn1V(Õl1@T-YB‹¢he6hñ@ùw‹¹vzù’,e^+¯F|[+ž…‚VŒóÀAVX1T˜UŒÏàÐq™‡´z܅T‰'†W?¥ÓUž„wå'MŒ;Òš˜%ƽ™Ò)Ô_‡N½¹àcã#_ ‘@p‰»U«@]1ƒýÙ©ÄH4Ž9B‹Ðõ˜™ÄÄß·x×3šÀ 3³}¥€Ä­‰C¼ñˆO›#Fتӈáq]øø6ùfV©öØٓR ˆß]¹õ´œ“øSû"FåäGƒ°q±)%ý’µ¬bò4Xߨ€<“„Øñöc§ªŸÕėµ­A Æ/‘øo²ðUÍ[ùÃ,“RÌ¢f‚ÙDFòˏ>ŒbüóÉFU»î‹2ՀîÚÁÃ`¨âý2gøb×àå/ -ü6è0 Ә¥‚9Œ¿]iÉHþf©êJFòdŒó«EՋ@‚ùçŠF± æ«  ¿V^¤~l};ONÖ0rîp5 qw'³Sñh^œÍà cŒaâĘaü;ÆF¾xÆ0vpÜ1|5y6Â0ŒüÈÄáKx°+H“|(›º£ƒM´Kr0nQ›ÜàƒÃßF ¦‡Ô{Bƒ¡Þ<ÕËR5y‹…  ð/æ$#!Òúqšv^°µß FPKVpµŽp›x‘SÅC T07:ë$#Эß]@Á·Æ¨äw$o”à0$x(6`ü/ø«ô•Dpµc›xí€àü{å‡1ðÀ¨pÂq“ìWnƒæ±[²€ChàƒËi}½Sy™J¨@\ ´šhàƒ"·óÙÑÀø^Ų6ø;ü¬èµ†, .çF9,e.Á†vމf`úºv20’ã üzo86&˜ëñó Œ‰GI*ðA…y«IƨÁÀÊFÆ-¥ãTàƒtn)ì8øxƒ‹TV&ø0°/ÀޜÏNFŒ1«CӃyÀ@øÚpÀ˜p°Œ 0( ,”Šú „¡ÎsgW÷ð2 -˜ßDH€¿á¹n `è¼îä#Ù-.“¨—‚F+ŽˆgAÆ­–ž[At%ÜÙÀa ðÉÑ%À¼+—,Rxˆ¢ðÚJ ŽÁÿÅ¿XºòOGØÿ{ºÆ=è¿ÈÿSAµTàՍlˆÙ¿4kô/Âô÷Vò/üŒ@þň‡úŽ`ú^ˆ$`çüKgÿœFæ½ðoü½Óhð£äþ¾»¹ÓF<Úà³û«F'wIîo¡~È\z®¿ —·3 þ-Ð^Qhà_lG _€ÑKóíþ¥¹˜ñ.!1ÊÉ~ ðoayäUßÀ¿i S~½'–h÷˜Ü_Zžò¼qqÀzÞk­¦¦)AC¥GíoÜ_¢àÏg$÷{ž ä÷—(Û»œoÜ_šÙþ+¸¿øçîûËÿè­¿aEû=ωýå>ϘØ_þSñ?MFXEîÙ&ö—I0¾$ýå"nÃþ"S%Ö°±¿¸Wû1öW¯Ôö—ºÚ'õ—˜Y@,‚úËöƒ‰Î•ú‹_x.¶4õ§tùÔ_¸ú[j`ƒúK•Vukle°¨ÛõúË]YT4Lþ_ÿ þÂRžÐ%õ—´\ÐÐ_„Egê/ã‹ýzƒþ2Q§ïÊÔ_†„¢6õw¼þŸ q6ê/0ç•Ì_ð'k¹'òÝÉx¢ñV¦ÊøËÍú5y¿8Ð;ìw¸AG²~ôR‰q¿¸N9;îw AûEńý"'¡²’•õ‹XäaUSîu7“ô‹¿k½Þ@¿֜“òûØeJÈ/³&÷xcü¢~ýêe"~›S¸±F )»¾!~yÕõ(“ñËÇÇ2›ÈŠ|nˆß¡šL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK -*"Ê+Ü·P pô„û*0ïԆZÞZ'ît_jÝmÕTŠ€§'ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿiwÒ}•  ˜os -ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥<ÒM¸/»STä)UŒÂ|v¦ûò¾°`pÅûÒ -Ãx_fíì¼/ L]lx_Xƒ -ÜUë~‹.x_˜}Xñ¾TnÞWO¼/»»`,¾/F¬¯v¾¯´œ 9üÊÍXj¾o©N–l€_X¹æÀ¯$ŸÚìÖ(&-ßFzÁ÷¥!ÂàûҀýøÅH.v±¿êà  /Á0h1hüÂÊÊáü²[Ï3¿4`ìÝ¿²># ¿<«/Mø…ôýðËX°áWe!¨iᗽa«¤“ð«fjWKÂ/úqJÂo!#STÞIø¥Ð{Ü%¿¥ºlÄ/ÿæû½"~im5 ¿Ò‹Wå›oþß¿ˆ¥;¨$a[§¡ÂH~¥ý>žðKÿïªú$VEº;ÁøEén;ãæršèKÆ/,ž¾Ìø¥%ò“ñ[²ÿ„¿ÖºÌ÷9ô&o,ßÛ Žå{[$_ Ø@¾¤º¶39¾ü[ÀCF°ïFÚa£øˆ÷> ¾ø/M0|'äwEøއ“£FøÞnM_†ÅkÙ¾Èìá܃ߋO%äÁï½£ñÊï–« ´©0ÖI­'¼·W ãWv/m¢3›}Hƒ4¹4¥K½íRŠ îØÙ¯äö"¿ŠŒ¸°½`Ž»´Q{©yD=¯¡½È«Í¡˜½·—–²—½oY+bo÷:)€½8Pï7^/OL3ãz»WAë%‚ "¨ÖËj7¼œfõ²&J%£zçARov/5¨7:Šùu›Ó ºÀôÞz7~ -{Œ¼¤b4.tb£Á…WzIC²môŠr8‚Ï‹?;k“Åç}¬¬Øð¼0Ñx‰ç…ºñû ó7Œauƒó¢nâàՈ͋Õ+w¸z:þ^ɼi3˜´œNPMJâ¹`Ù°¼Ã¬ òbY§æ´V@Á•þJå…Uí£åz’ÊËÕ -§ÿ•ÊKäõ†r„ºÆT^nAºÿJåÅdÇPqPyá‘VqYV‰U4þÆäŲ ^q0yyN‡¶R}4ü‹ÇÝY0ãÒà„F÷BÍCB -†â€ûܙ¼ò0ê“L^8Ü“—6;X™¼tÓxòfòD:˜¼•ÏéÃü1™¼ Ö¡(bcòÒÊ,¢™¼ -áÕ;¼ ̱teò2îÙL0yÉÍàáÅäMïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8í–áî°fÛ¢‡f’Wñ;«Ú~v‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Õ½1€"/)¼6"/UöMÀWá;HE.wy…©c'òRùHíB™ÊoƒÈ‹GɅÓFäE -V§äE™Yתÿe¿©Ç eU×÷H×>-F‡€ñ2JÕT:9a¼Œ¨ô§&7Å´A㥁­Ö ÉғD‘ǹ ß q-‡æÆːàEø¤ë§°ÎD°Í8^³JÙy¼ˆö°zÒ8^ ²‘A°vDiü ãE U›(ÞI™»$Š°ýçÜA¼°DÏH×Ïj³ö$‡÷öw±ax¡²CþÁ^ü‰¾á…J õÆà½Ý¶'¼7¨õJ/"9ˆlÞÛÁÖàïv¸˜GIþnwloÃïòDL‰ñ»ÝAÃ ï’ -uïì]6‰êEèÝΨNpw»3v·›E¿hP‚ÐOPwq꧄Oè.ûW#igæ.kÔ˓ÈÝf©×FÜ¥ `Ü ÜE I„ž‚· èUßx»XâÜ.ÖhH´]ü '~ƒíBƒð~°v¡ÎBn(P»@ö³‹QD·³{¡¾4»Ðâ`Ž!vaDì.»Ðð n \h|Ìɛ…÷WS>$ðº—zŽ.û¼NüÙÙº(¥§Lݐî`uQUCÉö -Ö´?\ÝË́«‹Š ,‰7ª.ŒøŠ‚ª{yÒ ¨.Îä4œ/Sȼ#ªg¤.œ· »ðYÀT8Õ>gpp½\[¨‹ÞÛà颪® §;Šwf -˜.$Ëäë­0]1ìK—5E£%JlûV’.ÅÚו ÝázptñwüPrt™8,غô×nŒ.j»Ú(º¨_lç¤èâ;GÞºÈJè5‰Xvs>´¸¢gÕº3ti}ÔÄ^ТMËH†.Cépo7ˆ.[¥#Ö]Ìû ûD—ÄùVˆîŒ‰/§8(º,Z@°c£èÂՉ—C3xîPPE7óÅE—{+ݳ 3R`t?xv3(ö1ºÃ¹®¢‹ïa0†ED|£xƒk¢a¥ÑNÐE-Áánhª‹ÑâËü\ìÇdΆÏeåæ)ÿ›ôÜ܀â26ÇûÏUeD«Ë†èۅW>é¹3Ñ´âséÃSWø\®˜Xhz.#†Ý¥u“Ë¸a¿]8à€àsª" #„ܑóbÂsUôÔOIÏ¥…=|7z.÷`Yé¹¼pL7¦çæß=—áddàƒž«zæ{$=—I5–V¬ô\FàÙ:ð Þ!ÑjÐsé.ã mô\:ZÐ&=IÖa…Àø°°r£çò¬Î3á¹,¶AH#๬[À(»Ásiå×nx. m ÏåH‡Â‰ žKÿçð\*¾Ò€çÂ@ýFÏåòô ‚ƒTXO>—ÃÆ£ÕÄçr¹Š{ø\¼å¬Y|®2Ÿuìø\‚:Ћ+ð¹Jגü\$ 8Ülü\ÒRš;+=DÜ&ø¹J.h4›ü\Š.Píü\NñrÕû¾wÅç"Á§{n|.A,P4>[ð6mø\è3ØÜ>ð¹Ì2æ<ô3Ùº š1“ž›ÁÙÀ¼]äaø²l]X)£肿D"ºH1µtI€ÃÚ5º0ÐÍ ‚. P¸n]2‘šÂ՜IJ~.÷bÙÏÊÏ-—}»àç¢,˜‹’àçªüFÏe6­È¦’‘çÜä8¨CB¾¿ÑsaՏ™ž[:GÒsi@8f£çÂÚðÀƒžËÍxLÏ呋ðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ…*êzî]$ué©åfÕ  èNà -ÐMkt Aip“ ÐÍsCè2;;&A—×È£A—鵪ү)¤K»`è2¹†uM0t™!C ycèòµÇš– ]s#e†.ÿ+Ñ ¢K¼\é€è2Y¨î«±€Gh_áÑ%ªñ(R”ÜúTÔÎ< ºü¸œç^;‰4z†èâώôb@ta¸Xš¥Ê°2S]Üǖ/¨-OU*×]怙¶Š.”w¬Ü)ºxà’E—D„[dIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±=ƪòEƒüu¼Ñ……1±£Kߔ)Zct »/;*‰Nrîí*WpîC.ò²Ïͪ« æZ˺Ss§CLÍE3Ñ^ÜOª:°2s¡1G~×Ì\„×í mµàk#æÂ0€¹ˆOârQO€Ùz£åB®´”`¹ø[)Árñ7êÌ6V.©Ãè´gT.÷x}òìܤ|#å2Z4%¨ÉYLï¢7Ð?²…“ ý UlÏ¡Á? ¹ggÃõ• ɟä²'ßq&°A„¹w<îi½DÒq!G7kB`@ˆa‡ãŠ+ظ§›$÷<¥ÊÚѸç N–`\$iU7ép¶ÁX±¸mXXc*.CmãL(.‚\#¯L\Ä=Ú$â¢êFó³”4݂±‡ #SÆáb'Š¡MÃU,eì0ÜËb­`á^nL(Ü+&¢…„ ½ £÷áB€XppáQâãÜ0¸»2×f -.tc2pQ#‹5ó†ÀEž¾¶àâO8‚‹}ðnü[ÈtªÛܱhý:ûô[¨Êªð°~‹‹D1J°oqø9Š`eQ_¹ØE„O(K& ˜NoOro»‘ö¶»eCPo£¶: ·Ý0…yË®gKämȚx{ºª{#ÞB‰XÅ”›®¼[Ä}1èn¸[:ÊHÚíåÖR»½,ÁÜX·0"f¨[ð:à­é¿TL¾Mç¼¹¬ 8·ð¹à×æaí rK}´f܂ƒ‚ïȈ[ܼ_áFvM1à„L„íƒo{:ñ²ñmXx[ü8ñ¶øA†n‹[g5à¶g·NÂЖӘƒ m‹(Öé¬ä´ª8À¶¨±Â§¸qmYü€€ý}`ª-’¦ýޙ¶ÕB0mñ7‚›´ÅßÈBoDÛÚ´øK mó $žíÅè g‹ ‹KÊLc/á̖:†çÚY¶‘-«Þ0w‹ ’-"Oˆ>l$ÛÁ²û2A¶M!·äØÞêý°cl/…דb[<§bûH/½1lU7Paûðmžۇ¤Œ7€-Ø„ß›_û¨dÁôÚGš¡7v­d?‰®½-Ö1¹¶º>j'×vñF\kYlrk)b~ÇÖ2œÑ&µV3K2k‘q-ýY‹˜÷XµxoÙÂÄZê}Î7`í)/'xµÕ³wàjY }µV H¿“U‹µñ„ªíª5yCÕ¾žAkIª½K,ªÕº§ÕT+1Ö{Õ"PéÞRº, –:IµÌö_²Þ_QÿMCúà{ïcêí¥n’j!\À+ ÚàV§É4J@WL-Vöp±‚R‹Šq¸³©½\¸1j1@ éEÍR`°6µøûÖ?ÏÕÇå|ði‘±DÈ?ð´ä´ô¶Ói/xFp€*ŒˆVÅù²‰¦}J¦fiÄڛ÷Až`ay¿qia¼˜å<¿‹r݈Ø≲ªJ‹:fǀҢ.ˆá3o„d]’öy´2$-Y¬Ï¬Yz0ol@ZDñàŽ„±?’º6þÞp´a ííy8(³Ð bIº±h¡ edÅƧ(’$Úü{ц18´Äç>#1´÷%ÑÆF¡…Œ¶ MK!!s-ƒ–Ä9õ-[|ÈKÅlA ½­Î Þ,^õS;ÍH3®Ò~qDö3}²½®Þf“?‹ Þ©Ø$Cü»ö¤Ï2fy\;|6|aÁž}Ü})س»‰oèYIÛò,3°âÕrVd†¶Œ;̤ÀÎ>uöñ¹CgÁÆÌY m‘… ä,þ® -QOâ,åLàìÀ¢ÈxY¬QµÏmÃ͎ÙUŽ¥o„ùö°YÖ½”kgÍÐT•zŽ²>’iöñjpÍ>¢i%fvÄ¢'(³¬Ls/©E&M˜®fÌâœX9ˆYÔâ\†ÓNÄ,bœÔ*40;±òeŸHn/û8Ù0Ùøä7¸,$ -;.ûÝÁDÆÞÍd¸ - ¾ -©ƒaEÊgL®,ÕÒ÷xÃʂ4°_Pe‰q92q÷1«vSÈ|³pWлCþ$ʾ ªd݀²Ý1æÊö#*M]°œ†);bÊvópiŠe'ÚQ–bnæÅÊm²GG¤¹Bl'ÊBi¯ºje)ÏwÜ·k˜h6S™H3•Óãџ€#]Ҝ¢ßY²—‰’EŽ ÄA’¥l‰yç•$‹Ä&V?’åÂÊ[¡¨–°Jç˜Sý‚©Ów€µÉ­Jˆ•Y,[“[)² KöRç‡AuåfÈ6Ë7„,º$ê̝ŒÌSdßݙÏßÜaú‚ìߍ Ën]Ìbԅócš)@ †°+×'59,CIê誅`ÎrFóqŽžðdýÄc¹D¤#rdÆ·ÛÀö}©) áU%'>,(«¡ð”.©Ck«{ʝ¡ fBÑò˜ å沧¹ïŠNŸIû9%ÈcÕ¤š8¾˜WÊbHþ˜F% 9…/<>xUw"gòÉëS·–¨‡£aâ@?ì4®2ØËñ´Kž:ÏÅ\9*äV Y”ÔA „‘`9˲+ŦÅu0¸ Ö¼ì_j‚‰ø“M° -`³TÊ°"‚|¨C2¥¨xÄÐg°[qÊÀVâ*ù) Xí¥ÞÇXvUŠ£ax±³=6hk}ríµ¡õ5‰±ìÏÄå+`J¹øR']«K¢­¦,¼‡á¿)§e‘íÜO,8‰jő ð‚…+%þ$û3ÂÒ£NN=ÅNý$ ©øÐÙ­ëps1.ªêí=3S•0lÏ®–Ðþ -tÓ¥½…EªbDܟ@|¡ã„ZãQÑY‚N¡ÓÜÑôqmn#¸ó·{—ãٍ.«ó{ o–’g o‘]9#‹ÂJø’`©ž\I&>_.Ôñàý¨¼UÓ'ÚB.—Çq4µ¹ÆG%Ïlq=Ø¹Û Äðñ°ŽOq-H’ˆ”>Œ^¤å¾µ!ãÍ0 ^YX2›WšŸ`¦OQƒ@ •¥ÉøiÉòy”ð ø³$dÒræÂ{\»™†¬Hª‡ØóÀ½’Ø·“čq‰\‹÷Bò®{½Á4³Ðs¼7|(ZÃ:œ½× ãÛæ`ÛujçoE¼¸¡::à706ÒÂR„½k¤…ŸˆQÒÏ(zFˆÅ£O†Z@1`¨ð¥žjþÈöÙaOmø˜ÑÇÇËNAXe°‰f„  -NŠЙv†LC“¡‚?KÞ¢cˆòUMö~ª0ŽýP%Îp’ü}<pñ ÃÎn 8WHž Ëë‘Åy†ò ¾ÊâŸÄ‚™0-08Fqg@Fãø¬ñš`ÙÞ2G3;ÞU«%Z8Bó±OŒ»«ÔZ¹+«*ifö[ª9n§ÛayÔ¢Šrã]«PllĶtX>±KðÃlæF-EYTeUd¼oJ ²,ñáàG•F%‰¯¾Ž‚03™E0;þÔ9`’!ê9ÊÍ`9sæF­'€î2ãÅî"HóH\»qzš°8ÏäˆMÀ{¡« &z²EŽù8J…÷–OF¨« ©«c~L„"w=z-J æ»P…ðŒûåzLf·êòGÅù¸îûv¹šýŒ!|ÎíÐ1 Ât›²”ê¶Z"=õ€àƒ‡`ö‘ÀO &@ QxëD¸ð €lÌUkÖò€J~ù -Ød®0zWŠb½DŽ›‰/ÁWƕ¶t&)7}\3þ}zb—5ù4´ðQR*íe7‡uF]­X¦ãŠ¤Â.Í=ºþöÈxÂL1J¢¸¡0Èۅ@õd„΁™XX)2ý5XèŸâíÅ®QýʅxQ¿.áw^KuÖÙL}pl±ßu¹Knˆ ­dFeSLáîô//‹„Q–v¸Õ‰š˜±K\u73Už§$×>áÃ/êiâ5NÒôÍR8pלæÉÖ¼uDÙ ¢&XX&Çm¨ªFUÑ}§¬Ɏf áêù -\æ¯.–GÔ¾ô¥Y”ÀŠ³h—TÍ·h4ŽÂ6¼ÙäI¹[f5èOÁ«ŽØÙ÷4d%¸ƒM¤ÜSËm¬yËО\Á"Ø›Ø?z6œ”}©e=ì¯Bê#5ûãjખ\ÞNù΁Kßó£ä6-\‡ßÀCÚ¬ff†«å®º "âý†ª?Ù èQ#Xõ ƒåšë†; õºÞzGï t㺓^ŸcÉ!ö_¶¦Þ3¡ÓÇK¶qõŠ‡5ÞÈYV€CÚ}i¤RÏÓÛ¡Ò¤_Õ|E*•‡øя—¼$c™'›JRçÙhLÙ]t×y‰—…ãû¡ w¥J 1ôùÝ´ރëóJ3Á¿°FëÇV}ßzåîót³Û:p}ÞMC(ÓbPŠ¹5°-Nˆ5%eç†h§ÈÉòŽ÷ñȖ¶«›Ò¶r¨­hö9¨%À‰"¡qò+Gú«b¼†È2dÈôaFдDp,7¹+ƒè"æœÂò©G+^)uybÜ´Vð®á1REs¸dW še‹”û±ÌÝpÝ^jÑNEØ W õôÄGSúsF”? -óeú¡´Âð1u#ºð~w1j6˜6DÛUYˆà±D…²ºË»v™Ô.H%(92åù<‹´œ*+÷živ)!㼌‚ 5SЂʍ´Å/~øysC¯Ðèg‘29-ÄxÏ°^&t“]ȟÀ×ϕs¾½@ÃÀëð3½¥¤QÓf5z!ÓH:äSaI ð®]“&à@޺A•¾ª|ai“Õ£ª.n¸{–zuãA1Q ×.x¢s…Ž:•ûŠ$ÜNn˜åŠ¿Ûæ²»Ïñ2¨H Ò8}j[ۜ\z°P„èÄ3bƒo´±D¾NÄÓâ]©bç®-cqñ¼Ý*3¥…<ԎRӇ]®"Ýe~jEŇ¢‡1ðýx -¿Ríz»é7è8¹l¡€Z ±îe±& Ô/ƒ·Þ¦"NÀ£`U)$†CO ‡ª`WŇPïȘBþsaêåu³S¾‹d©b×hõÇìy ¸€ì}úM¢ïȸáéx ,xzï…ýW?è&Ñ;µü":ãBt&r@J3aTÉRÊæ/犻Æqÿg&ç½q0U€7†> - ‡`1å€+ÌÜS Vž;Rüš³óÄS]:BýâÚŠï{¹õș+BI´Ê#°ñòC܈Sí~rg!<ä҂¹î[­öfzOC®ì¢OŸ7S7g•AÑý¶ÂÄÑÓÿ ksrŒÝJNå©ô:~XÌÕCí†7UÈ ñbº²_ˆæy1YÍu«˜4Äñ·ˆM8kùß Û«§u+ßC¬ˆA¬åõÒ0!SÏgFNaUhž î,̉ÒB&J½NíÈç˜{Ry¿íI8¡øo4“>­ÈéUÊ)™À Ž{[«ª¸‘ˆÂr~Ñu‚O†w´bròªÌnªgkn•Xò,ZÈ>a–TˆWÉi·–§ÊÂw–Ù0FÿpD¹ë©W:hp‚‘š—z…¨…?Ê'ç¥ÉÒùÐùâ_¬Ã%3å=]õ‡GÏ&1µ@ˆJâ?Ȫ(¹®a®]IçuŸfmFS@üˆªóÊôrÑÌ3ß3±†r|FT¢Èy©‡Då°<-$0s]C3"é°¨Ý Úî@`ßz%£Ì=¹Â„™G ò -XèÅòG!/”%4d•ÍY ømE uFíÛð+Gû-|n8£óPd¬ Eшˆ(ˆø+ð z$YÂp‡Ã£¢á(H$8“Neò%<.-`VÁÒk›{RÂ+ƒ…Ü®òc¾LÀ?,o¡%û>ÔÃ=ï+9b·Ò?5—)ž­ø¤ïÐ&"¾Ý#—A8,{Z3| -«~ÐíªÚáǖ‹Ú ÁÈ:ôW®Ì Oé0uvïy¤ÌÌ=YWRéª3k' §»¬ùƒ¥Ïža„¼àá!ÓÀ„ Åè·S 8Ãy³¥Æ­+Å ¸´'Ëpù8«ï=&vê=NÅ'™H¾(‡áâj!¬”S'ßæpZ –k~Ü0ßÌ<ª(æ±V8=0×íYób³¼Çåˆ:?g¹0îð!ªC¥Ë¬†Ì1ÏÅ‚Df€ŽKHü“Ú<Y3rüCÄÂè®Q•-Á¿?´D¤¡7wB.Aï¢ù9µÐ.8ÖskCƵ+)>Ֆº|e„Çñ^Õ2œÑijÍd)Þia„ŽKeã~¢vÔQBÇoI4 -žá±ŸÅŕTNŠ.•H2°ZýE‹[ýXʏÐn3û‘€kFOëqÝF¥¬¹jCöŸá6ì*€ 3æ¡©=hWÅ4 ýfwó=šÕñ·Šíˉ˜x®î6,kÍAUö›i¼Ó<…ÙH¨«5ŠõI´Ì_½ Ñ@ÒR“R Ÿ$ZæTv,ëyáöځ4ý†°Uðk°š©ìzD[Ó?–‰ó®¡OÆp%~B©GÑÆÜ{eè—N¥øàûðõ©®Ñ6¡2ò Ÿ•ÛÙÂÀ,ärW5ÈCµ_¸nX%g‚vëG÷¥Ä²ÌÀTÐreþz³µÌ`Åס ; Â"Yz†/î®RIèE¢;†9gó¿ows7¹ï1÷<ªe¬6ᜡ¬kPÛÙþ,™°«ûPšÑðP“‡-Él˜/šËsì¹UœùÌõ^LR -GD2þ°ÈX©ïØðnqƒ†¾[&ôTZzџÉIþ³¤„(J£Æ°›ê‹à+¥?³0øÝ5JÝmnÈ\«Àû¡'ê]/+ý ±gœ‹°_úe{L - ƒ}.ó=çvƒ—4(,êOA%xi5L]–ä- -àD½§Á7÷t2`nçº<;¦…¡ùÄ/Lsó|x¹œß°/̘ -Ì^ϒ¨V®µÊ:¬‹_qáŒùøî_c 3=î̌Ðu÷v’b«DT÷c!ª,¥@ÎeðÉÐfâsAäAi˜psõ¤pr.ê\ñZ|¾,I£¶€6ôD‰Ó‚õ¤þ©F„*CíÐaÚ(·yυ%ˆ ie£hm§Ü/)L’«vêtU …cµDV¡7)ãRH‹ÑÙ`&÷RȎ¡ë'¾uR(ã2!µw°­ê'5ÔbŠƒ ÔÛ/ïÐSó[9Ñü`:ú03&/X«ƒå\wucƒSý‘š¦$ Zë¢6«ô`Y¬ÝŠÚéhy3JBröÑ®ÂGqñíKuBfoèÅ-ÔnãÄXÑÎ^1 $âé9”¥$ç?`aí{“úsåž=Ú ÝÂA –Ó ½¼ë±ÊrÝÔ}Óë­·Ai7ú!eP +e–ëR‡5ÕA*ž÷—ðUÊ[ÌÈN‹‡”æ>:¹áÔ éf·U<Ô¿ÏuÍQL<Èý4n¥tš³1"«3îy¿+VðsJn/c”(GàôÃmrCNJvÝ~.·½ØR¢Ój¨îø‘›‡Uªì;3vf6 è -/XÆÕy˜æ.é.5æú¶µè’X'TâŒË–{‘PqˆŒÈ! lë\¢!0,ƒ˜lÓٖZx×p®`AýCÁ -•JT`äbǐš{úïä{22O*%kl“áàP^'՘ÐP·ˆ•$ï6ÃËtĊ»hàžÑ%žfæ¼YÙÏ0c‘C‹‚§ÅÀïӃ†;IuÏ©w‹Vc TOQ;ü](´+ôpwªvD'ÀH"ŠÕß_ìsúiL.3£œŠlw¹×?¦™ -†Þ-‚cðóèVs²AFXr©Kìųô±‹k§¨¸/-ñô΀«S£=7ÀÓN'ǹäö>¢â@\[¸ùt¡s•Š;7W\…mÖ¢\{¶YV{ESIüU°(W¦ô Å,ýXb©šúXÍ]ä*²¥¸šVƒRbÅ8浆O™õÆV½ÕTžT–à^J×qՑ¯ÓIg.ZèDBe£¸ðáqÔݜ÷ÜUž`à”(3f·•Ó5t´‹µþ>".'ÛÐ!;£`Û%½1>WR4‡c-1®©A ‘0¦Ã+eBó†ôìÊd—ùÇx3à ¡r`ÕK¬­9¶2p(ÚtQ)ATE.Eg°ªei£RÝé. 9´‹¡^êS™íe÷ÇSÊüô>a¤žt¸7“<‰€Áâ,USõOîʲ`˜¹Îd¦€¿‰ ™ôàô¢=¹*ÎñZ·‘e†¦tóü)¬gç^HÑz*å@{ôò²k_Í.˜$).ÜýögJ਺yw¦)ÅM¦&è9Š\n÷Ïü>²;úï''ãòØu=%Á&©.…UúçÛ$a†)/¿ -êUMVFwQFÆqæ#DÍ6°—¾IöŠãò¼)̜¸èòØh¦{Ϭý£õ4•­‰‹¥]³œ¾¦dÑÝ¿´IÒ~©cÒ»ß:ãšß;M¾A0èÇ0?*jáéÝZfÓқ«PÔ=|,Ú/Æ'›ý6µ‡¥Gpûr uݬ»fAé3|ö̉ðWe”x3beÎ6,vlºZ˜Ïí¬g͛ֆ‘hìê}÷9v$åLU|¹4Ñt¸˜ÄL€ðÁ -7ûœáƒ7à–TŸ'w—aK•ÓH­ýû®‡ÓªÅ¢+Z.…â]ZT\ùTÔË:¤®¼-Á?c†ãº‘i•°°b2”¾ØS\$å¸ê)–\1U;üHo•L`Ÿ”KtQÁq¸"-—2ÜõéeîJÍÈ°šœ59`±ëGOW‹qn÷…žbÒ;ԅõð‰ŒÆ8ŽÓ]RÖCñ^‘•Òlež< -5g˜Ôq†Ú—=[wÅÇ©·~¸K.,\@nº CΟ\¢s®iøŠ˜u çë$0¶(ÚjÌç\³+r8\Ýi -Á§@.kÙÁñFyFî*Šš`)o#ñ|aƒj¢Äc@p&$Nw¢™c+êÖ»é4‹ßnsðrA©Ú̟ø8`à$¸${ʟnIË=ßùÓmZq“´¢ªn\J]µ²ZC]–"Ax…RENÎEc¦ÃCõ)•ÝBæßN]ÝáÄfÈ"±PùåŠ(£—¨Ø³ŸÞT%«¼ª²¡QŒ=ÙQ¬Äiü2—£°'D^(ªE$‰oÈ9.a£y,ìl‹É–ÑÞÜUÔ|8ÓÂBç-(©O®[Âr<ù«…ÁHFà]Êbô-„{…ü¯ê»ï®T—î.“ª·äíêFDaN§EgX¶sá·ãÎxª0ô£MUÏPÙëä¢,f…èŸä4Ø"x J=·ãiJ7ðà”'4½çåb oL‘B*‰°$æâïÇ´~ïÖ(Åº‰®8ØEHŽÕVBQ–*-ª$Ê Öæ7ú˜²XPœËæ4“Æ+Y2*;TÏî7—i¼óÊlx³ |ŠûìÐ -úqi%r‚¾a©^eΕQvò1°ïOQ½è¡Ý$¤ÆßY~Å/#J½®Ýz>#êƒ`á`ÕÖÑe'XÓ-Œ±”GS§"ð†ä 8Óð9^I˜]-Ò}º·ø3#ýX‘7Ë"È§ 0³ÈBîx7Úz¶1¯”T4’”Ý!ÍÂPP Ez ¿÷y¡ÊùSIŽyÖýV)j,…ˆr®u¨‚äCC²:6èU©nDá(zFUÀòY<ú 7åº=&œ1\¢ƒ_D¼ú#_¬M_ìt :˜/½¸U §¤®Ò蔱¨ñˆŒRÂߓ¸ô± þ^H@Jä6ٗž®03úœé -º[.žõ…j*}k ü¹ÌÅjJšN‹ïôPÏøÑ.0‹*¥Æx†Õ)/Z¨¨® 㮔–Õ¶ &hæ#ƒ„c>žÇÐ_!kƒÂÓµ”’ÂTÚÍu¿÷ª€ç£UKµdr^,¤sòæuãÈR -¿Ü6.{&›J·Ó[Zfàð‹™êÊ{s -Ü0-hiÓ2¦;ÍÝE琩/ôZ~X|ûÅ I¸|Dq^t•Ž²+Ñ¥Z‘+À d¬™Ù„êœ: lSrÍZ›ƒ5\q’n´#’q®!ꆕOZ×à]Lªzýûˆk*$_#Lˆn€Ñˆ -/ZxÂÕµ¹«(ñX̄€@‰€zúå14ªÕ’:”~Å£¾hSøEåå¢Ô¼ óæðe9ÛüuàóºMzx'DLY…Ãß?jfpe­åQAµ°OĦŒÒ´ˆ˜pnõ10S‡CÆ­ëfÉ!*-æ±neprl²© “Sªã^š´¸(øŠ²&õŸã¡ª® _”ÀU"¥æð2å ¢·º,î¤er֘q‰1œúbŠXº6󨊝ÌXêÃþUe-“ð´ÛÔZ–7©8ú XsµÞÄ5öÑs¢4q:w¡+mîýÁA‚J"ô7!ŠL„âÊyÍ(fnµˆ]ŒŸèÑm¥yµÉM“ïNkîy؁Xü‚: “P„ÏÊeZf¯—Û]£À»+ÍR‚Tšs·ÜƒŸU3ÚÓÏ4:÷²Âó8Jj¼t®|K;JçÀÒ­2AmµÙ­[^Äj-æëMë{ª¬f•°u^ºó™4¨ýÄ­@Œ÷¼Œ*°F 'G‘+ÈW-˜.¨ÚÂÂÏ%kY]±Å »Ó$͵Úüâû½¦<QeŽ fÆÎP€àt©Ìâ‡NÝà­¼EîÚ¼JúÏèkƒVúIK‘§Õçlx#AÖÈQÝ¥éJk„ÈÇÀfL‹vELK• ·uOÅå2¼yäV”È4GÖrWö¶ÈÒUi§.Y\ª}ªd¼ËÞƇ@ëW—AîÃõ‡£#ÞzjíSNx°û;‘vÚ%èÅ2̉g|‰­T˜0€¹¹¹Š¿Žâüb1~‰SÞ1/´GC¯"ú+FꟘ¤/Ñ@»¹îÔ>U±t EWwÎ5—47BœU/Fú2½GA›Xå6T¼NN.e2ìF8ŒtÁâkNk˜§Ù‘úŒtgnh3â+‹êN˵V«…×3ф¨¸“˜~GhÖ¼É딃‡Ö"L7á—°¢.É MÃîõ¢’\ü)Άµ‡ph­D½XÆ´þœƒYEu -°¢ä-äfä) Øƒ¾,£Ç·]ØéÌ!zü¸Ý¹jQ=nªêW{Xë÷)PKu ª+_ƒY÷a)ñGX®PfêŒÛ«ÌómƒŒŽ§¸A¤Mâ;BcÝÄ/ñtrLiµP oÐÛgS´S©6͛°LèÀ.tš`JÌ©” ‚n˞=jõ¢WØc?B)as]„Å~æ£ÜÄܐ)„K «­‹L0ͼ`N}P«ß<¹Ó>àsZQ4êšw¢›̨¸ …:Q¡…†±ûÓñ2žÞ½¡xwÃmZø«wY,Þõ6Ðf,®Q‘Ù">]Í UžÉ ½¶ÃÅ)Œ<“jELuÑÉ*ä7š£±ö9É3´Ìú:wàjԄ¿OÃH%µa~ÙěR01å¥>–!1®ÔN5gŽÌ„g4žÈ;Üf– s ê•Í&RA„\ßtéˆ2NR¸Y…UøŽ«t†3“þÕbgzØ­à®ÍɋRu,¹«Ã⹧´Hi°Æç06MÛ°v_Ò¼•í/ÐMWÕÀM@ „¥HZOv„43ð̏]¬h¾½z^E²Nðbk¢veu€Î‰HvìÒC#ÂíNžF¥ª»F;®Ü“®Ì{ÓBþ&šnemëÉÛ[FäÂÛaZѨd°˜›¾b )iñ•ˆX¶ÎíðÕâö²Ü’>p´‹‡”ÛìÚܳV®«j†®ÚÇYÓƲ‡Öt{oîéæ,š´X†Ê&–H.…f³öü´ƒ½jh¡3FÖuz›\• ä»Ë %ãˆT×YÅs+Y¸”à„±¸wâmÆËöزbü«FqÛõL¹<̇o…j<ÁUO—ú”Å`p‹Œ‹1€ ‰ÁÊNˆÛ&¼‚@GxÇj[ràdpù1åOˆ³[Ímâ&•¤ƒSòל²91÷ýX‘D‚ÿÅÞÍ\*¥w˜/ßêûHŽÂ#GYžÀuh´åOHÞç>ÔGäØÇå¡/AóÀå¾l¬?¥ªïÍûü͝¼@šÿݐæQ8±Í}c½AÍ8¯‰/gßEP6œù9œû š9ðý:ºaæpÉÏÜXæ¨L}N9r@™G«±$™c¹G‘ò2G!–°£æ˜W÷ÊNŒ9 |6Œ9÷+ªÄaÀ‡¿Yþ¨+ވ¿Øì ˜#ÜÄÀkÌÑZø95L~ytJ|ys$ñåͪ¹^>­†—7wTMv9ðdêlèr ¡à%º¼ÑÌÊñ›fÎ.gÆÓðh%#¨JÛäò+¦ä•\ ¯àÚ¦SÁДücœ—åM§$\‘ l9êƙÏj9µõyƒ–³ßõLf9:ëÕ3ˆåü«ï¼rÚƘ¸r£>פ•_–î°ò«œÆ¬r„µÔYѬr,o“&¤—yéV&©¼›òŸ ò®’ÌSŽ>F§yò˜{oûFÉ(Ç,~>Ý0Îõ—±l39\&ˆò۟ÉN(¿ƒŠ€rÔ]ÞÃS(r/D?ÑQ&=EtÊE›N”ë„“ßÍ옍MŽ–@‡©÷Œ°¼–C,NK2y,v09–òóÌ%î Xò!ŠÖ%§Øç4oÿƒÓdh$[‡{PïDò§{À 90ݾ-yä·U’;Ž|<ªÑK9+í8eœÝ@ˆÕÚhäjÒäX‰bDÈ6hä°2³ÓÈK8ÞI#‡…}FNƒ¤°ÏÆÊK‘¿aäX†3„0r¬˜X_´±ÈQßxé,2-Êù¸] ÈÙÏDEâ+Š\fÕ‹"f·¹~G”½®,r˜ï…DÎN/ç^ªó D”:)jÁ!™³‘ÔE(”mrÌ$ ‚|xòñ„¾nÃÑ­IXàÇq:<ÐFGcp®¾>>¢è$tÖã6C@ yü¹bbð8ª—¹œß¸ã`:s±Øñk„_fìxV—oÔñËzRSÇA.áÏtäõåX™ãW„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆ—¿"P۝¼ Ö8ýLál¬qä¡øújrµ£Ÿ³aèË,ƒ Gڊ•¾oB%g堗5¦3ŽŒH+!¥rt¿`¸rŸ!&õ.FŒ3Ýõ™Q¶Ì" Æ@À8†zUÌG6S%QƋõ# |£‹×>ë¤Ô0ÅS]²Å?xŽ3bkU:<Jä7²8Š€¥iù¯Ë°Œ!¸âp8„nXqBdŠ‚ä„­0ƒZ]>Ç·‘‚ܘâX1èHqüŒ -g3ÇãzŠ#ûÂ×'¬,ÏÊcö ‡wš8ò=J/&Þä+%Jé@êX6’8`å| Ž³ZÁâð‘›áà“"~Ÿ–q¢º—¹gD(XâPS\ætSˆËåTñiXùáQšøð+âA¿. vxø]ɂˆÄ¤8Å°ïïõ3{Ú´o4 o´o¸)Ým5$YëÑÛ3ȕßPßX±3E¤ïAW2)|C ,œŸÞ8ß(7:ê]p'ë@ £ž^¼– ó J)ÄÀ|„ó‡Øâd›ê[B€ò}9*Ÿ†ܯb­¥ -*¤¤ßßÕ´†$|ŸU¥ øÆ`&õÓÊ÷†¨…à–À{ŸÕéñ {§.±ç -÷®Ñˆ0ØÞÕ­¢í C´Y A 5 ö†x ‡Öúâ˲ ë _RúOiX4ÿèzYIän>íPï´Fùô¬¯¦7¶YA>ÌyO¢÷é¬zc .16 ÷ñÅàyC%ÁâñÀyã,¡™5ž„õ?e¼ÏáÁ#XÞ)Ê[QÞPÑq ’7 -CX ˆn0™x¹ɛë“s±ö`-(6 É{ZMò¾†ãôòþàˆOW“k¶VŽ·ú-Ýe‚¼©ðc“ù ySÞȂ‡ä—±…$ycCa3ƒäÏI}#yÓÊú‚àqëu¯-IޅոW}#yã}Æv{Çn´@Þüû1-úX`øÎh&ÈRÎCŎ©Ÿª*ʘ oò1Ä"1ț²P‘X ò&‰…+țf"äÍ'u÷Éñ¦È†9àãMaM”{0 I .'9Þ܄ŸìÆñ†™Í¯“ãMÑíÑFr¼! rãxS³¯©ËïBÎò=&Ço¨*†6Ž7µÚ.áÈÌ c$Æ[ )#̗>‘Y°oÈ¥B8ãMá3)?ÆfsãM©¹ÆxK;ÇjµãÍ=YUï’ÀËÀxÃÂàݎñƅÝ> (í2Æo -¨X'¾R¼Ù9>+… \Þo„9®VvŒ7Ârç5!Þ+¬rOT0z+òDW„÷0Ñ, ÞÃjúxã8ïôîñÄÓ5¼›Á<™ƒßëà„´ó»QA}‚F à’éÝ$ŸªdJx7¢®ý¼ŠœÇaš~Î@E¯än4xWD›dàǾVR»±ßÛ Ú€ ÁìfđµÌÁìfoxâŽ6f7/ºÚUù0<¼ÇƜšPýÛ³(;Ø6ãt-œ?s¶cwª…DÉa8×솕UTÁëÆqw®¿¦R¢…Ö](š8T¢æNBÁŸ \·æ'i&®[”½hKËÎv$R<:˜P,àJpÀßpÝ0«â1pÝ´¾f\7 ÕBµ‰ë¦™åXëæO´„sc -f2mœŸv\7ÛªW \7k7!ˆu3ª¼­Ìš´n֋°Ò'pݨÀЯ®›7I¥¦+¯» yÝìÐÎXðºY¼¡:…•×ÍšD}ËI¸]â¼nZHMÜxÝÔR4¼nö‡â20€Ý˜»Tñ¹»%±¥ÔÌÀnn¨*ã'ÚÐ;´»éúpEÄniq½a;-hmænO`7¬rK 즡[|–¿IÐðNìf„OòA»Õå‘†Gä#Ä­·$˜Än®ªÔ†4 ˆD/ŸîqÀ²uX8ToÈn™Ÿ(X=µ¡‹y…ì†Aôû ÙÍæ6IJ[ëC¼µ–>£ßɆìV÷GÂZŒìf‘ÝxãˆøIdw¹® ã,ÈnH Br*d7]uY‘Ý%U ì¦…©á@v\5,+ -ŒÌüÎ7d72‘)¸Rž¤•G…3æ"{¦oÈnšÙàÌÈnüUk‰ì†…ߎ솙pžDvӢ중ݲ0é¶"»ñ£¤t&²)RŠ·‚؍”¢z®ÀnfDIº`÷p.-YÜY±1»ï3òö£¥ûcbwoQ¤´»a=ùâìi'ëîm -Ù璠;ߓ°îcSlÖ ºÚQÝÝÒ“Ô ^Ýáè:cchÃÎyhu“týŒi}™Ó†Ó=­æt?5Z†¿ 6–ö®˜îûr>73g>!ÝiØÝÓ*D÷M Ñ ƒ¯+ ›´òst#Ê­Š8ó¹aÐ4²â¹±çýÀs?!3 -:÷søíßàÜw4P 678ji47€/¦627YÌM!<ÞEŠ.‡ÓÊ]Œ¯\±Ü0’rTnšËèº"¦ÜîÉ侏©ücšôv·«DrÃ@áFäòŽõ‘äF˜•,òrßñ!/nÑ=!Û|¬¬Í6d›ï‡Ð€lÓ¢é -Ùf³Ð¸ -؏Ç&†lôž>§gõDŽl3É`ÙÙ¦YÙWC¶™¬÷Dj3â¨ä²ÍÕMÙÆcöo² &_˜±{à:n3¶ç29ÛúÖÝc ×è'ŒmZxWFH»"·;c»Ý&Û°HÜŒm–Ø>Úd"¶q¥Ùb¯¡°XØ†WèRï±=}àTVà} Y‰%ªœ6Äöb6b›Mž™yÄ6,R¹mˆm3Äv!ÿ¼¨tVÝè!æÀ³!¶ñ -[9bÄ6%†jLlÄ6ž³@wbåz¤§cukâÜ»$Ýó>í|mh䔊2^n8‡” kãu‘'¿ÒµDâpxm‘Ô Ýc-\³®tmY©H2^›Çº¦­òàêáeÃk3.Ê%Á×ÆsgÌ1ùÚã úØF=Q”ë2™ó##ðÚ¬/*ÂhOº6Úü´…­ !(#)ÁÖF׎Gi}¼£`0ÈÚ,_lZÑ2—mÙW®6ÖGBÎ8èBኗ³T‹XHaƒjßn1–LíÛÅk‰Ô‘ …¨†@·¨MýÇá` -\Ïî`çÎӍ1ºài÷3BÆi¤¦tõ„i³£Ifiã8 H»G¢vãhwãµ²šEçÅe(¶R´¡¤`Œ1 ÚHò³ -†v áކÐ&cnH‹ÈØ6 – ÝnEUv€6ô^* vàÚ~Ö>»…b£gC£D0KÀ³!²{|žtý@vnoàl”( tanö%nP@³±°b¡íÆ̆UE`®Á‡ØŠºÀ^CŽ%úË -̾\‚’¼ìË=˜—݈ÛÜaÙÙp)XÙݱÒDeCÿÂI|#eã"øsʾ¢½zp²Qc¦VW+&û -@E`²¯˜Ó‚’3:Çœ¹yL5 Ž#ÓÓmh6}¢Ë…x;"N¿Â áôø† º,*ªW>6ê­‚qu\Ñ~ÑtìѝÎ^éØ02Ìpì=̓Ì̍=,I2öp"ÁØ0ÄÏM06-‡Uw E*$¹ØP§E°jb±Ÿ;Úa‹=sTìøŠT^¢žÉ€â>!Öæâ‰îßŦ™€b²‰Ëø”Plæ$èsoTl˜•W -*6\ůƒ4lnó¸8`–VÎ#‹ ‹ò[Å.%ªð7,¶ÖM£M,6sàt‰‹- -„ÑîK_ø‹jg,6ÏjÀ>¸š3xø¹Øp9ØàpÃbƒ'¬u¢5{X¶#±‡ð$bà X ØÃèŝ‡Íêá³Oö¦uP®½dt£aŠArun'»º{Éä­q،ªv×uN¦5c«Ôw›gwž“†MÿüçWöTÎ2hØ´ˆzGmKuÙ͊Ãf!‹JόÃæ¥ßDÔ‡– ‡= y0*À‰Ã† ÖT²³â°a>ÕFõ¥¨‰Ã¦×ÎGµá°éԑ]8l€.Tù'6·à£ÛpØ<¹óœ4ìr¸R2iج‚ᨼҰiÕ@`6-Ý 0X¬x…w6]Ò꺄SKW.% Ufl8l.¦OsO4N°4°J³¬ÓÀ BAÙÆÃæòºF½»¢§GŽàa+åŒÚx،Çs/´ÔÀúŠCH± ¥ãx´± -’¤Ú@lBéÔâÃ@l¥hš”œˆMñ ÿÝ@lN㯻:ä]Ær¯f±±öԛ´±ÖØDl¸¦rM‰h„m[©§N$6uŒú*cz‡…’æ ‰-mh?'[X± Ä措8[ØŒÍÐâ«x­@l.E•Ñ™8l‰AÇ9qØ<{&ž‡Ø˜J?66ÌþÉæÕÓÅpÆaÓ"pŊÆوá°¹î†qØ<¸F¬‡Íµ¹+ÃƓ—(Ò<ìi؀؋ÙDlü„‚6ºf*tî ¶æ —07¬1Æ{±¬Dìi"6W…˜ˆïîÎÄfz|,Hl‚(p$6“šÕåˆSÿI3ߕ€b3«É·IPl&&•Ø ØåßcB±Y T@±¹ ×Î[Šë»O*öìKTlFÀžçz£b§ªž¦b3Å AÅæ×⃵k‘âðIņ·0©ØŒ™±ÓÅFÅfĉíÕ‹M‹&:a±i(bÅbó1¨ÓÙ|ߍ¯ÅF\A…®›8±æŽŒ*ÿAª˜¥ôÅÆ ¨¯nÃbS‹B Up±álºù‡¹Ø Äí²q±aæ>¹Ø´ða›µ_\¹Ø<"EÁÅf8Fé#®ÕµM;›¾0ÓæÁÅ&›=ƒ‹Í †j®\ìi.6ç@¶ .6oû/l\l˜ÝyÇ (X¤õ -.6·¡†kãbÓÌg\l¡ï2ÁØTDö7,6už¬@,64Gk’‹ÍÜPu§–ÉÅfŒœ¬‚àb³ªy¬¸kx·Ú ®\ìaIZ³¹R RÓ°A±§ÕÜ/ô?Š®å|'?¬þëÞ÷ãú´#±OÞåò)‰Øxؤh%»{8ÚyØÝá—Äaw‡¦“†ýØ×Øa؏£ ´v‘ÿDa?ñn$ìG½–Ý„/N öã⚃ýDÂÈl¾/W -6Ô.ʏ¬ì`'4ŽuÁ•®ómlÝ4)¨ã™ük&³Æù†¿®=’y¦_Ã0Ü%WÃcW߁~M¬8VAb_£× jyŽ#ÖÒ+úõtø‚|,ª$_ŸÑ(|_Cþ…€t`¯©~nç¤^U5väõy…ßiâõœxÍ×ñ¼ñ®Ï¸îE ^îú4þd£]ÃH5`×g(v´ûzo¬kԍ:I×HohaàW 7쬳q®Û0Y=0× ŽsR®{(S7È5RGmLÄ5$3¤ëáº[¸®»É·Æ~ ÄÞfüo£[_w#Eµ«ù¼j41:9#%®úŒþA«ݏ£AÀªÖ¾±ªQa§:L—$–¢›T]»?ß T]CEœê -ŠÀTÃùè÷¤ºÚIH5 âŠQ]£oꆨ~yZœ&¡ºÅûe@õÅìO}qœ\ðÔ,éRÿryEIÉcQo¦é.”þm–[b8%ñ8ÐÔZ‘‰¼¡©ó²åS’©›[¡%˜úv«K}9ѐXêây;¨Ô–ÐîPj•¢ØŠIMbÂëS"©ReމÔ@´°qF©/G±ù7µõ[É¢¾£û„QÔ5ªïvu7°'IÔÖX&ˆšÉ‡jFf¢\·'­„Pãý(®ä›jÔÆMD¼Ü^Âè£áˆ¨åÐ$PŸv¯@]ÃOþ4 û ÞNü4êÿºJQéQa=Ä×3ÙÓݽAßØӖ¯zúbÈ¡Lò´–d­¾‘§¥q¹ÏIžF˜öb„ OSŸz„%µZÔ\ƌÃÀ¢þ‰žþè²ûe†æ;Ö䁞nÎò%y:@q ž¾jè„Wî4bs; vˆ:N›:}EYìA„žL0§QÖÈino1HWˆ œF -˜â®àM#q݊¦ŠçŠÒcÇë!ƒåˆjŠ4šWG¢1YÓO‰¬·ŒÄù¶s’¦GQDbMÃÊ6@Ó0ˆµë ˜»¬@ß0ÓÃPœ¤L£â×h˜ôÓ»-˜4{Ñ_×K€L¥Ï’†Ì4Ô?†¯ì éĕG:Q˜‘~üõîi”ow.ÊBV¢%C†êˆýDHˆðA­#xѕǑ۸ñ£ÇÚ:_ aݽOz4²=LmlðhÒªÛÌFê­z££/bwrô#¾]r£‡Wg‰f!åuîÔhòÂÙ6ÏÐhœ }ƒ=N ’wfô0”%‘Ñ#*ƒ‚½h£ŸÈ/úq’,áÐ1<ì´h(yÙ 3hÑ ·‘ - è;úTn¬hH - +ëcESc7N4òXŒo¿Y1eJô}D±ù -‰F~,*ÎÅ©<  D4Rm,ÀÞÑÝáõ$D÷(» Dt6Fô´Ý͒JB1VȌ:mˆht;PeV(ô -0&GÅæÂÅ ^×å›É¤NµO>4VTj\¸â¡±,ƒ—xh¬ÞToå³fÙǾ¬"I64¨NjZl44%eLåO4t·Ú+ÉÐ\æ¹øõà„Ì:k?å6ôãJ™\èX'š‹ç~¿a¡±Ð& îy«E0ºYiº3¡ÁíŠsçY¹DB¿»FŸ¿¹óõ¿/úk¤çŸ=~ûôÿùO¿[Ãýæ·ü¿¿üÿþúý̗ß|ÿËÿ÷‡ÿî_¸ŽOÿø/~øË¿þÊnÿׯüåŸÿðÛïøéwË…á¯×öçvûW¿~ýÒ¿ýõ¯~÷Wñ?w^þÛþÿ_ÿðû×iýõßü<{9›×ùÿú‡¿YOæg7ÿòÃúÝ/_wöÿþío~úÝÜú_ýæ¿~Ø8*Oþ§×ùÏ~øõþ«ßým/ô/~óû¿ùÙ'û§¯¿þÉ??ù§?ýÊ»ÓpÁðË?ûÍOþzû~÷z¿ûÎöúÃ~óò/¿ø“?û¯ü·GÿöOûßþæ¯òXÿèÏ~øý'ÿõ©ü¿8>ý“_üÉñéßýþòßð+öûøôÿ¼þ뿼l¿ÿÔ>ý‹Oÿá?Ÿ~õÚãßýÅ/þä»{`èÇÿü8ÿ:Üöö M‡ ÞþÚéËv¬×_?á‡ÿåë^#3qڄVýV»(S¸á¥ÌôZ^¾Öxø×Þia„ 8.9V€7LÔْÌSV;Œ€d/# -0^«†ÝˆEÃőn³c(½_¿±–nÔkxÛÎ!Œ:Váp÷‹Â_Ûa§q?‡Å>Oxv¹´÷áu„ÿ„›|£€v¯u?<;6ñÁôL8üËzP5òZpŸ×Iրÿ…Û[ŽOÿâñ8o %+¾Ç4×j‡Ñ5m/#eýç›Ñ’ -]ßboBs쇅7özös°ñûùªmçö×¼îø§þrCüˆ*¤Qÿ\í>V/„òz/oFÈ òÁ.väñjÿ´–tŽóÓ~6~ÿ3疧ýoôz£ÛÓª‘vC9¯¥þ8Àl;ZÃË|±Õ.jyï§á¥>5ˆx̨nûý~‡¡Àªb;âu×v‹q»ºi_nÅ<ìrÓæ9ìwLr½o\…Öß\ߞò´/¯Dv}y>܇ÿõ1ã;žÎ-nü~{qîýxös8œ9ÚÎv1n—6íË}˜‡]îØ<‡ýöâGà”ïé­o/ð4¾=âi_އ<ìúæ|¸ßì¾ÔÔó}d«â¯öï4ð t¶l‹qÙûٖÃΑm9‡mdÏ -±o|C@ò~ØiÜÏaڗž‡].íÃ}ø>FQÌ3í(næ™ã|;¦”ÆOfùÅŸÞbŸ×²v^õrÛ-ÂÄx#ò¹m šVyÛa§q?‡i_Nxv¹´÷!oѼ{û´>÷2­Ïc™Öã6­/ö9­/‡ÓúrÛ´>÷ºq¾ëa§q?‡i_Nxv¹´÷á+oÑ~‹æã^Ž3_Œåãvz‹}^ËrØyÕË9l·h>îuã|1ÖÃNã~Ó¾œð<ìriîÃ÷Ýñî냻öÍ!;ç~óa*ë,ïî -fPdv/èQó©ÝU°ñÝ]Y7žÈ<ì4îç°Øç ÏÃ.—öñ>|“ÉtÎÑûíNÅrÓýXÎv1n—¶ø0ó>,.мc‹Ÿ°ÝÞÅ©X6žîÇòÔÒøöˆ§}yò°ë›óá>|«ÉtNÓûž~ÅrÓYNx1nW·¸1óV,^мi‹«°ÝáůX6žÈòàÒøö”§}y%ò°ëËóá>|“x~ø–îóãøöí“?Ý/w7)ßÇ ´÷:î}|¨Öïߦïãúñüäça§q?‡Å>Oxv¹´÷áÛ/gö;<¿åå4æW¿œðbÜ®n:æ­XFžyӖÏs»ÃË·¼l<¿úåÁ¥ñí)OûòJäaחçÃ}øÆ˙ýöÎy9‡ùÉ/g»·K[ƍy–agÞ±åÛÜnïò!/ÏO~yji|{ÄÓ¾¼yØõÍùp¦€€ñѓ<­Ú| _ ®Ø¼ŽÅ¸¹(‹}ú3Ëa§ç³œÃæ&}<·iù¸‚â¡Ï·OBkém/ÆÍ5_ìӏ_;=þóãâiûeç¿v¨÷OúÕèý[€Ïoö |/±^¼x?gÝ¿|<â þ_SžlÈéëí׋5gšª £íž<€$õ2¾\oFŒÂíZfÙ ¸Û§í° %<õÓvaœ3͸﷍­‚ß;û9,öyÂó°Ë¥}¼ßr¦Áïw¸E²†€Þ×~‹q»ºi_nÅ<ìrÓæ9ìwXîM}Û¸J¥·?¸4¾=åi_^‰<ìúò|¸ßj¦a¡Ëûí=\š´¯ò|{ãviӾ܇yØåŽÍsØooañþ¶±UûSKãÛ#žöå}Èîo·ûð-gмx=Çò€ÌrÚ¿ÓÐ\ïÃþy¿q¬{ œÙÞTb³ö”t?‡3éãßéG.6–\7¾%Þ;û9LûrÂó°Ë¥}¸[Èã’½Ý"ο×Ûq8Õö²ÿâbÜNo±ÏkY;¯z9‡íÁaxžñ¶±+ëöÃNã~Ó¾œð<ìriî÷YÏç{2WBÓd7a{u¡Ø[ß_uã|ÖÃNãõáÍ}™Ò7šk®'¦ip>¿å§ç½ÛÏsÞèuã|$ëa§ñúðúäy~Ë!~ñ}@ûv§x!£½}Õï·5nÑ~Ø=êsøÕS}‹ê®‡Æý¦}9áyØåÒ>܇¯ û-šO~9Î|HË/.Æíôû¼–å°{ Ôçð!ªê-ÚÞoÑbÜÏaڗž‡].íÃ}ø&=åóãíE:™ ±õxÆ{¾íbÜ.m±Ïû°vO®û>$×÷sےëwϼBN8~©«Ýgҟkuã6D/ö9ž/‡#ÿrÛ4ññܾÕp1]ëpߗaßV t"®˜F;‘ïK y½ìöÊÅþñîÞÛø¾ÄX7ž«†yØiÜÏa±Ïž‡].íã}øfÁnùÕûí åæ’a9ÛŸ]Ú²î˜÷aY¶Ì;¶øöÛí]ËÆsÉ°<µ4¾=âi_އ<ìúæ|¸ß0Øm×z¿Ãs-°œÆ\5,'¼·«[–óV,+—yÓ÷~»ÃËZ`Ùx®–—Æ·§<íË+‘‡]_ž÷á›»{„ÿž»ôãCØ·Ož¡·ú6>0Nw=Æ6^yÎ}|`øïíˤé}l˜Ώ}p÷__ìóTçA—‹úx¾}ða¿·ó+^Nc~ïË /Æíê–Acފẻ[¶|–˽]¾àÜp~éËÃJãۓöå5ȃ®/̇;ðÃûïró3_Îv1n—¶Œó>,CMܯåk\nìòáæ†ó_žTßë´/ï@t}[>܁ïÿž±×ýÓOùã¿út¿Ç]ÿn¡×v°§q«Ÿô_G%‡û»sÜ,tYí_Þìè*¬í—·ãüœ}9ÎO>Ïo#ÎÝNHŠ1–‹@.Œö -4€¯_”ñµ\Æë—ŒuHŸãýhÞ¸ÏÇÛ¿øEëËúú©ÊƒÏþÄÉ ãs©²?ØYÆ~¢¼¿ûzÝl¼ÎÃ'Ӟ3O†u·þÑÒ_Ÿ˜¨Ó5¢bKÆr>‡×³á@¥Îá9âÚz]ê†0!£ZÚz;^pß»zzÓ×YÝ>ƒjÓkIà”ºìÏZÝ<[ŸÔÆvõ¸,ßøK…s¹èåí+hyÀ—Òæ=x{Ÿã= ¡Bæ` ›ãö#ƒìu¿mï~Ö$“ŃÓ` CÄþ=-ûAó÷@Û.ñ8Ž×Zÿ‡¢;¿Ÿîïk#–Èü’Æx¦µiìOÜØï;7ö¦ “µÊPç×Î`žšÃòY¿ÑïvÆÉ¡²ÎV´³²é¼J_ߋoÚEüʧv -Ú){×MŠÊ8QùúÕ3øÛ<©«=¾ÈR<ÜÈÞÏxVµu?™æü¹þüÇu³ß©·÷õ²å˜ÈvŽþX/T٘#»=ÃÈ~ޒܯÏy| ²ƒ‡}bc-ÙøÄ·¾Ž°ÇÀsŽÆçØ2õ«W1ï*Š£J¼5Жþ˜öãêa/#î*>çîG9Š>:QÂä~LûY†íMCŒ(^õSÓ=lXâG†ˆM<ÊÕþ â>ŽP›×<ì~>=Jç…FG‡Ã:¶7 Œ …1Þù×(àïn\' mx&—ŸÎÕ°¤´ñðÓa5ããé™ùk¿˜È`Ÿ?³´x`RÍö[ciWÀû£±^añz„º7®heaã?ǯé«ç÷ -ˆÄ' 6÷ü1쯯ËÍQ÷'í@ðõkÕÆK?Iq?l¿b?øZÒXPæºLL_;‡õëc[ ¤˜Nó뛣è審¦töA ˆ‘œãmŽÃµ¶œ Ž˜ Ê3îØ8'ˆ·XoÝۅÿø5;ÆÛƗ;üïóþCg#{ Ú²3:@ü|#æÇ×}~öþë Á´®15sú1íåöûpz¸êžë×캏3Œ÷nÀÑㅧ½ž±ñÝbãçŠÃ6}§Ïaú.·´Bž#Ît¬sj1w’ð%ìO/>ÔkÆñÆŸ ià_=ò¼'˜ºlÿcØífp |tE/ã•c Ah¼Î<øuç=b\yz¹qÍñö™ÆRcÄöÐêŸÃ¨é#ŸgœC‹¯ã'ðÕ«˜ˆ&Zǽüâi?æ÷º'2ö -—6Þq+Æùävõrµ½öظ¦«W6¹Ù¦ÛÿÕSû’S -:æöwèüör¯eègÚxžþÖ0jhAŸ¹’¯*ì5<)–èÈØ<{ûv×O_=‡Ý©Œ_¤ÏžãכÓU´±Þ«÷÷s‰íg,h‰{±Ñ¾Ž0®?äTÞqáìóÆn§ƒÄ§¯^ÅúYÐyÕt:D’ýi=ìXó} »]؟|Uûaä«GÎ=/ðÐ|EO}âU 9WŪ_Ò~´{y@>ˆãÑ?}õÈóJ/ðѾr¥ ¬u¯Žµr“1öA•$N’ŒÇúz—ûòû3êGx}V±qËÏ®ñ2SñùgÎmý@ˆÛô띳ÍÛk¯Ùæã·ðïÿÀÆۑÿ ­ãðÏx¨Š&Øûù1ìõÒÜ -ûÃ/Ÿ´ø¼0'/ãÙïŸëÂÅ6ؾãyµq¹kޚ<ÂQÿVé9"¡Ofç€Ù=QÉxõâÇðr—«„AÊØòŽÃÞ"Vò€ÿfc‰#ðí±ñŠuÀqÏ#Ì/­ƒ=¢{zÕXl>㈪% û9~wº.W‹ÁˆA"Ÿ«~ýQå¨g××®A6oYçÏÇÎåXÈ9ì@~ÃX´T¤Wñú#T„‡ôŠÖ›-ão6F`ëh1nZ¡Âø̽Ä4´7> /aïOœ/'Q¢w¿Á¯Ùö£ñºjGöʈñ¿çuöӗKKÆRâÊê5÷ݦx01ùAä4ˆvCey½.YÎ`ä2¾·ym-?zR¾cϙSÁãkÍ4–-óÈõˆõO¹52á2Z¼£Ïð£³Q„óFÌ<´/ïèá«C$÷‰©Õ7-¡bØ%fI@²·½x‰ÔÉ>¯óÑíiðrK|;gó¯uSNäW÷Ưo=žÅ­ Àœ×ôó)Üû:ðò4bJx¼ çöW‹{c1˜©Wl|ڕX/^qÆ£4óÌA¤µæM{“ 'ã_ºrË.œ­[t'ñzêö6vpŠXO{ÂøúÊÊbÌ#G> ×ÅŵÌÙ|ðÁC>rõâwµõå*.¨'|ä¾|½j"Eº·‚‘Bo9_‡a¿^wë¾ã…×›†fwù(4·–Ÿ&ü„|}ѺoÜé×=O\[)aúèÛ Ÿàa–fãü´Æý,Gnw~Zq#~î°Gޅ»?ËÚö«ŸÞxæ ¸(ñ–£Çduž}aF -c™ÛrՅ·21óåÜXæ—á™Ò'üºï_Â~–¬™Î“±^q+JyŠ’É’_ rs:ó‹9"bǫ֔`n‹Ó;½|!Œ<2Om· šoÏC>çËx »§Çá0€lOøä­æ};AŠ«“‰Æz–ôå -ÉkO„J¾ÙÀ…]gØQt%cÍq\qkçÈq½ÖPóák` íu:ŸwÉY3bÚ¯t5G+mqVƉm5\¤¢°ñK<Á»*r¦®1ñ")û9ŽPî|²C£&Ú æl©Ð GLÇoøÉÖºñÖ!2ú%ìs”Õ -›qp”¯Ü?÷šÿÃ8Ô)CGˆä5ÔØ?‡µ¸]Ì3¯3«9®`ÿ̞Kã -6¾b9ß{%ϕaÎàÉÏ#ôǓ^¥¦ª“½3â°(Âñm¾kåå]Ä݁÷Õý*—8·b¢™ã2*ø‹ûžW‡š¿˜ÚÆñÄŽb¯sBz¡­÷47ŠpQ +è=éh“‡ÝïAn›¯›üÃَ×r–[Þî]À³²Ç¦DNŸ° -7†Q¨kv˜¦¾„½ä͌ùÆú:BHåHpäˆ,óëˆ3(Ï §²óOÞ´£Æ2Nrõ–Æ–ƒØ™‹’cu­4)•‘ñtûa» Ù]QäºífÐ^FNL§ÄcèPvé{Œ0NùÙÓzd Øñ6œ& ¨Ç#¥jhF’AâV2ߌ/+ˆÏÙ½qo=C"áˊµ´Ëæ²Ã'|KÄ:=Z3fÅ4NëV258Ul'揜ìf£o;ñ”åÜj~ž‘r}YKmDŠý¾·XBæãûˆ!õ5¶Fòþÿƒ½7[rãHEçYfú˜]Ó5in˜±åÒ²~`E6§K"ÉVkNŸ¶2ÅBÔÁBŠú™y™o8Oó¦:sÃ=Â="Ä’àR@1{aŽHϏ߃8²³%¸–‚…{Ziîu»«©Ã ȑ´ª‚<ú†‡–&êCPËxŽR-Li¥¹½Â“EÁ„1˜ØЖܘ-Nh¯phƒŒšA´c@Þ rL%Y&•ò‘ PʟTp Šcðñ -8.L -g+āKfXh4÷î¬Tl;ö±pù*Ç5jìˆ1mä>’’ƒ-±Æ;›Úi¿Ä®Eh¬u‹ßŒ¢~┠µ -uۉ>:ÄiYxÂÆ:m8t0ã=.ò”€&ÀIΣ†ð RіwNð a²ÃùJš¨uÁ¥ÆÓNò §ù–ŠB·XÄB8)$>€€x Æ)}lZù$<<‹á«@Ë3~¦Æ$¿&N–q@åÍ_öu`ìt@¼Eε4&¯Ã»ÝA‚r@ɚƒò!rВM‘Ql ÜüÁÖ±˜D†2ˆ*6E°åÃÁS -tNä3I%Š|¤)­TÀ ehù<'¸ìH…w8`ÆA "%&šòdÀ½,æh¨nï_æe½ÄO\K5 -= ýÝÁ™] áÆÀ`µ4îLƒË‚3Èßuàà!ܵÌáµDG bA f0ŸyNÑVȓ|Œ\î¬çŽÚ±ü.çeɋ¤!„s¡ö½yæʟûq¹YÏíù@{*a®˜§§MSæÐÚI¥у Ҝ–ž0 xw@ѝñ -A- Õ¾q8têG–FOì1ŠIɜˆ@©IK’skØ8+/;¸É„Í‘HFŽæÕl0%f w[0cÆ`6‚ѐx­ -|$±”€ÙPcÍlU¦ ¶èlñdät–C ߋwV¤(ù4ã¡Ai…(i–{_¢§£ãnВ}Ü:Äì牓Š\o Ma¢çH|¿½é×.Ç隶Y‘é($7÷”`)tçiˆôÅ yAh#έDԳ܏-Äâcc¢‚H$5K˲‚A³&-ü™'îÒτƒ*È؇QíŒ!1¥"cP”Q`´Ïh(X·½•’Ãg -WOÛÑ®9'x¦ˆÓ»¸+šŒd?ËV¥*ÏG|Vc®:TÁ CH`H-æÄñÇEä;ÃÐL¸Ä ÆçšÂÙ1†ÅcÈÙ±i>8¨pÚª:‘ ƒŠv´(# -†”b,”ä׊$U©5Åag¬UáJe YJ²ŸÌ3b\^ãËsWÈÛCiÁ錇´Ï ±r{ðõ -ܟAyJ¹©«ìâ§ÁÍåãïáŽê6%LÐۑa‡P©,òɨ‚û Ҝ9»'Í\wÜ1ñI–A±Ár¬@O]©3+bäÞ3¬h<#6Êa¦±C–6‚jvérP…æ܀ÜñPhœIæâ)Ùq¢|n†ƒ—+4 k“"ó¹pÿŸ»’ãÈ3Ùú…r -Ü7”S|*څN0è,÷G/"Ã@ùœÓ~R -[+TA ΢çÆ,v ¯eÊ݂æ$wJAh¯V´m«!¿…bá(•Ü˜9˜ á{i0¤…H>$'o(Š¾-¼l”ÉÀÜ K™tNÏ. åšäœkålP‚c - ܹö)þƒ”ÐÚ½IœçQì²f‰Ÿó]‚GRiOȋ$楣.én–õguBù^áè"15‘+ovòÀpDÌ®ˆ²òЖèD!9A.˜oÐoã1pø¶•Ñ£¾ Cæ dI¾Ãl|Ò00 Bx&†ÄÛzÀM®ù8Á›ë|ßTQ?Í~íHZ§xhDk‡Ž/Œ‘äl%™—ÖØ`i'”æ<'hXn,¿„sb–èâõn)E*`äi‘Q\i&”ïƒNãÈTr™%îú&”$b.P›Éâw³¦Q˜h̹¤¨à-\ès””-9áGÉÌG¦4æD{Òsø5¬9ӂ³ÿ¢˜YíÜ;:®ï›a»tâ\K®1…`%.A͵$Ûf✚g„ªG>˜ÉÏ Ø:‚‡”J*3.¬Ù“ÈÇÿZ9=£7ª•Å†©ñ)=™á ¯Ä]¸êÑf”T€7ñ…ã ¥UÈ9K);4‚ÆŸ¥ÎˆåèҊàBIï§K\P‰?Ô2ÅCNHq -è²N# ѯðó§-琰À~%âhâ£YzYn’ôº‚s{”Ñ„Az'zk2(KPßÈö…" - -!al]ʙ¤õ£)g9ç8ŽÄ…%{‘/§ìQ$cÈ9à ע“î҄£‹Í‹¾)í:4g‘8„é}Xå OfV³°]P–=2é&#ngL$ð§šv®ðVhP¼Ï -ºá2²A5}0I¬­ÉQ$!3ñÁrNCÑ´~„¤§%LLö6zE‰–0ôñœT8Ñ×JD–’²à(A4dÙzx&xÍÒ÷ËËüœæ²ÂT„Ap’O–ëŒÄvÎ(é.dS£šÛg ‚ôs¼É0¥C%¥>ÈBJF÷Ó)1ìœà*!^ŠAĄ™9Ho¾%s Ç˜«¢Ò‹£¹¤œ.\lÜ7í}4 äZ™€ -h%w,<:æü±yHrÜy‚\´Ò,“”[›Öèá‚T­Ä珅ƈ֝—˜3Z‘‡YöÞÄGáaã"¤Î†Ï]¤<:Æ uï\ôŠñ¶1ò.P,؃$Õ¼C½áF‘KÓÌ aHCNº0†¬ .‘xíL92ÏhÛJJEËOF–2 sËg.+Œ/(‘›RI’ñæR†€‚ZFf&]“®ªi¶Ú&z04ãÎd¹f5Ü¿×8é¥J=΀ąY²ÙŒ‚«gý`ƒ^¨\ 3Å6ÁpH—ŠläÇô§¼Çœá3†; àk¦»áŠÄU\u`—,X¼Á8J†Òvke˜d²zt0„$·Â+Ř甐xƒ^ÆþÆ$ø<]Û4œ~Éd¤ÞaV²&3¬,ˆIvCîÔŸ|'Èêëc í§&‹}!¼ÎÛ ̅÷2¦¬qø‹ÏXAxFiô>+_Ç}ðò žá,öA$PÂüċàäSÎ%¤©úì|ßØ©(x˜°éà šÌ2,äO?Oáa(.£ @®6AY“1$ñ6=JÒqHz´$ï*VM¡U±ÊiŠ -NN\i—‘¸!.Hp–›0ãöœàFñ^ö1ÀIB–MÔ©\âX "8ó!(,å¼R²„ò†’8p³OÓȈ@ƒ%vLF»™BÖ±~ق­äI(v&q\ˆ1x.Š\1çß,å>Xqñß¹q‰ N ™ƒqÍ»–þ°N½{ß¿ÎPÌ7.ª”bš%{$tšQLs}ù,²& ‡qk!Khâ2HJc ÄUg‘9ƹä}c.oæ‹NaUsnÒ§’<ª|“K¿5²ÈËn2A1É …pŠ–¡¢b-×÷B³”|g×`’É(Æ]»Kdϊ0øå‡$(r_:¬ñŽ5¡ àc'eqQŽ‚rª`‡} -2èWds -dÂÜD‡Œ Xuw!z¾1=ágj¬ÙcƒæMŸÀ È҉ԂÔm•åœ!Üf÷+ØJ‚2=¢ï€>f瘫7Y_"0°u´¦lþÔ‡‡C¥WÉvJåí…OTˆl¢˜³‘0ûð Æàs,QKäüOÁžKã>ñC(ÞŠòLdN‚©ÆÎÀ§ eœ -I®ã€´ CžT6sºv×py4â}œ…~÷¸L¨"Nd‰t^Hˆ4vW°.!½K7x dþ&X&įQt,X&Ñz’^l‚–ÕÉÄܚ€A°z—{: ¤/¡¦è€¾x8çŠw³É ³0xt+]( {  “ÏJ©Ò§ê"¥º‚yÆtóPÞÄ`H “¾hkO9…Pp–V0Uö°ÀŒË²aâ´Ç %%é.,> ‰© ­Ï@%œ—µùæÔY¦1“Ô’Â’”+ þy1D,upNð Æà$œ`RªwÝ:ÙVz ÷Бä1Š Ê'QWgÏ$¡ g§gª4$"¼àÔZÃKêžHCqHG>&¥‰¶,ºòýèRgavkÈpÚoÊJ¿+å‰ÙÄR°* 3—EfKª°#3Ê0wë•3š%W«LBZ+g:C4çxJÐl³bia¤%/”„òÀEP¢4þ$2'¨Äí%‰ÈÔ7㫎)ö*šÂí?ë3¼0Ü8'íÚY)\!¶s`àcÈò‚;ì_§8G3èt>b\?œéêÄ{ƒ -MBƒ¤BÊÕ¨ôÛ@Ðë|øŽŽ‹ï@ ‡0ъ9…Ò‘‚JbAí -˜©¯‘–Fµ81ÇcN#c$ .Poà/sFåhSòŽ88ób }ô}Ë\„º‹rzž‚üwšf_ Ì59/Aލ¶©'‚U’øm{É -åÈB5’P\Û§Ž+ÞɔÄ„cÏwCYä¡´ÿ½D¬@Ž–aò\¡ËæsòÛ`ø‘à ðŒËj*'çАLû:l: „ ó4BCu_å{ Eä¾æ˜T¶g#|Q,†NFђ -)ã>ð=”çKÚ‘Ç £“ {ž<ìò£ k¶¾: t ÞP#‡«ñ&ÆÉtdµ˜ -XŒ[î ÍÛÓ6&k”‹EPªÀúXhØS‹oâç5/S,¢Õ â*˾(öEÝͳ,ÖÚÅ´uS"N¨¿ ŠXdøÖ,¥"¢³Tn¦0»„E҉© tN'ˆ§M±|Fм]cÉù[ —c…b’¡4ì3£š4^øpJ!ú"#'•}¢š›nœÁ÷³á¥¸®?I±ì‘¹¯2’Š¨¢Zž²i±¨ŒS¤?`î Wå-–á×äÁÂò‘©Ä\¢»$¡N/£…@\:U°îEi~®±/š -¾)”eÆ$:ʜ+Rvy¦`Ie´0gáœà1Kœ},Ã%SÑOhŠ¯æ¬‰¤>ªÞ_Ó¢ -—úJÃ`€¹Ê¡Äzl)G ¥,¸¸×›Ñÿj>²­ U -Aû¡r…Œ\¥„Vqλò½ìMy`™÷ãÁU批d -ëƒÍï¨!R¢=&~z®ÂÉÎÆÊ4îIáB\$›Üùêݐ§QY`(]† gÄÙ -Ï+¤OÉG`T·ÔÛ è ¶IW‚"ðҔ 0z/ °nMùÎñs[ÂZ 'B -÷'Ð\ß´àš¬$VPQNq´v¢j‹n$].דkêœË…f: y?£MÓC½rtb"´Äé12öÛó²pç€[‘xÔQi-‘1ïxJç¹ÅgL\ã×øé1QÙTìcÙ£¹d Škûd^¶@É%Ý°Úc‰XLãÂaÚ©›F;ñÛï+–Žªa±bßXP5F᫇Aø”kšPÞ_Ê&C ñ•ÒóÿŽ•éE牽ik8Poêà¬YÅÀ\֋H¯ )ï#R)Œ·žÄ*Xêkz÷2j’•#´K£8£¢ÿ¨yÒJĄÆ‚gœí­© -°¡h"¦¤*£¯2´Œ4ó„2¤=ÏÄÆTMGJÁhÓäíZŒ˜ -æ;ƉÅJg„aia€™[N/„“‚g°(ÈÐK¾²È¥8; Û±xþÙ*W._—°iRÖÕ°_P®#µŒû\B¡jÒÄɆ@’WS)Uƒ\}Ç0Á:ï‰þõ¯pÓæ#VѪ -ì Ã9|9÷òÙ<ìã*¨+!GAù wèxK9¾Ž"Ÿ(˜iƒú(Y´#ÿ*Ѭg¬S®S‚eà™ä×±î¥Ã(Vy¾pp)%eÛՐŠ8ÃHƒk–sN%ëRjòJBY± ô©”µé3Wd?QS½ ðºÒÔitƒ ʧçkðœG—.ÕôàKUÁ»Ý‡$Vjz`m~äº÷*áXf„S1IÉnItù)g¯ÔÕák—ŠQ𵂆Up@½…‡ŠjT^ €\@Qiˆº2þ¥`Kâôq:Nœ+°)ºµ4c՗8Ýƺ¡H£òaõˆ‹3Ä@®/!DœšZíÛy|VµÚ_£E©Ú7½DsŽC—׉ÎÒÔgBŒ,×µp6(½Ë5F®×·ZñÏwo¥j× Á3)¥ì‚²_`v.åj$HŽfœÌ eÜ¢„—q¡ ž©íÁY|í‘ß„ÒEG·QEK2lTÓE)j_Ò%¾¦€¦Qӓ5×#Õö,L¸Œ -èJ¨ -ÃÒ&|½…;‘]Ò ——¦ßµ-R*’%}¶u!#Q–Š®¬ö l"”é¸~ àû<ÇÒ -endstream endobj 31 0 obj <>stream -¬æ…ª|¯‚¡mÒj7TCD¥Hø2‹º7Æ·9/=:ÃU—Qw áj÷ÀŒ…-ª¬R×~i(ŽuÉ·¾4cåœo\DŒ/3\Á{]O–ê .‹ø’RVÑ°ìY¸¤ÔPÉ.d¨„„X¿¦Û¬W0‡—jW¥Êý”òí¾™v– Ïù&Ɯµ[w3€CÎ#âÚµ»ªyѵÆY|=»‡ª®o¡Û©ÛîÜMB· ¹Æèàç …â`ʽ‡:l<óõ%ƒfƒ{"¢ò -*$ ÒM¶†kž%¡ÓJßâÃ) !tZÉp8ùpqvúÆÁm¨¤QKÃJ4|´deêBm#Í -ºØn¥AòÊÐlþ¼a¸`Ožr¢¤ívˆy””Í*9†z½Š8¼³paµî¬Lùîk¬ XðÞTQÚgΕr$Ý9S‡'°Ú$Š‘0aXP*ÑéÑOLTj1 Îp¾Ïyt_cg±L(ßGr9ƕŒVÁé.èFLpøÁW_‹™Ï=Í8žÌð ¾0j(ȑœêÊ~àÔ;w„rÅÓ+R¸oÚþLDËI­¾ öj‚¬#ÏfeÝ<ÜӌIuô®ÈŐêó5xÙ­VUt¾ý®óËßV>óði~ñÃxp:]Ì®Ÿ÷æór:F¨èÅO“ñóép<Ž_Ÿœxøiùz8Žùú«Ÿnñ7‘¸_þüäñpdQ}ýÕþÜù£ýöˏç?M%~~4ìχ“qoú~ËOßw¾ýõf4¶?žØN‡—‹y9û®óÛðátÚ[nÓ¿ŽÓrŒ-dçÁÓñ<üÿÌßߖøã·B'ß|×yð×ñ°oá/-îñëjÛ·½ÑÂ7~7̯7·÷n\cÛßüÇ0´ërøúz¾ûبý] îD6ÜûÝÇõþH†ôëîCúõî†ôðéÅÃË×åը׿ž—éçåÃùËþ5°™ñ…Øy¸Ãmºm Ðè» çÐØÐËÉbÚ/Žn¯{»Ód¼ûŽïn\Žӝ5-g‹Q>Díïjpzç‘ÍæƒGåÛaºµûøªOí¸º× ElJýþŠpU>é-f³ao|ºuF£!lž™Ÿ´A>;¸CFÛ`D ÃÁž†¸Æ±°ÂÉÕÕ¬œoß>‡!Þ%«x†#=f&1´žþd4™þñÝõp^6`öïG[ZW¹<6¿3M!Ù}`·e1êMøõv2.Ç æê“w6ÜÆ£=›ŒgóÞ>£ OÞÕhÍî£]L¯zýòe¿×híVžj‹8(XDÏ[VÝç;+CŸˆÄþç¾YL“1‡àD6š¨ßvÔow.è<Ÿ ÇóóFƳ?|ºÞ¼ôÇι^ŽYÛÏ&"›°vyw{bÛ jr[N{óÉî*wôı]í‘|PêÛÙäæv2Ûªñ6Ù]ÎӀk¼¹C¦±ûúfËà+#G1¢-6®Êˆô1h—oTƒ©ãáyÇs÷¦ÃùõM9öïõaì$©'ÓÞíuƒ‘ˑ<Ο÷†ÛŒ3홼όڑ¾‡}e|—³üc9}]]Yòj¼%¿„Iú¤9€Ž`Œ×Îýxð¨¼ê|ÿõ¡‡‡%÷7<¬ÉЎ-<ìÞ‡ÝËÐ00í}¢ °»‘N.ÿYö秓Åx`ûx:Ù2+ÌÓ¶ÏvŸ½ÊC;žˆ‡Æ`ç‹éåbTŽû»ûÖÝû‰_u'ÃO^·óþ–S¡8Í_ Geƒ…PyèÎ8T7ÙÝÕ|ٛ•§åÿ^ؙoÀ€—»«¡n1oDã/nžõç½·Mf3~æ®FÛò¾ëÓ¯vd=‡­j5š©ã±ÌÝs÷Øg³ÈÁªUN[å´UN[åô0”ÓÝãê[åôþ)§WӞÄG?M†³V==zõtwCÓqk§»ó¬V;mµÓš©V;mµÓV;ÝޏãÐN­ ý¨¼—ã‹-an_PšÿöÃEƒc™ÚßË G½ù‘-W×õ>|6«":h Þá:¸ßÕ_ÚÛ¾tIòИÈd‡ÒçGÈFÚKvQ{i§ªù4-ÍÊÁiì÷ñ_žp5šLþæ„ËQ¯ÿæûŽMn{ýáüý“n“³í˜.SÀAß;îßlTGºïÃ=æm7»î &ïÎîå -ü€c M,9ÏoCÞØ -(Ê(ïEyðÁðêjÑ ±÷Xåîy®žÍo7ZyððÇêvNû*ÝÕ›ÝèUw$gò~zV{.Ô¹ü9îå=ŽµGòÎ3rh'ú7^Îw9Ûí]à÷u’>igŽyµ´Wî,îx¯Üùr.„mâs¬wîìç$;éq×»vŽ_~¼· -Ýô,ºÝ˙Óñ :‰ÿoÝ'†ì~¹*§‡Óƒ1ÚìÏ{— fþ˜ »²³»©ðsCËmå¡;fFãþ‹cæB÷wv³NÒù²Vâ“v%äJ_K<=„!ÔÏ DÈ«io<»jp[ÎîŽ}MZ‹ÏAX|ö‰IÞwëó$þÖì³aÊ0|òáht(“uhôÙsI·½ؙèȽ¼X¯ÉmfGv±ž¾Ïë5ܑ\¬gvÑÑÜ«÷—ßÿëzTžN›Äò·×êU‡z®Õkà‹?–¢jÝŽ³Þ`¸h0ãÔþ®Æ6Žz jZ£ÞyŸC;ï}°Ò“éíõd4y½ûÉ~€ªfƒ°‚–'¶<ñøƱpÂ{juO8áîÙLÇ -›±IÄ÷ý ƒk°îŽ”?X÷½/Ð óX˜ßTá i òw…ƒÝciµÀA1äXN¸ÏÝ}—'Üý¨gp¹¥à[¢?coÆÙuo<.G/ËQÙo¤3¯>yW£}¸»7jïÑ®>yW£Ý}µîÈ_9Óïøޟ²ØÑDÝÇcm÷x¤ÇÚ£áìvÔë—7åxþcïö˜Ï¶{\«çrw+ϱÛ¡ÄPg壨|ÜyèÇV¨‰0v, s÷…z¤ 󞔺Ü]Í>ŽÒ„IËvÚ}–Ž.iºÑî³¥LÚ.½š–åo»›£¯†Ûʗâ½FÇ0ÿWÓÉMƒQaë»Õîûu>i |NîPNÛ"PÅvçòuÆê›ßÕÀz£w½÷»ÎòËyoڌÁºîl-î>¸AƒJ®ñ] j÷à ÷á'Æ®]z쮆<ŽËÞî×D÷{£þ“)%Ñw5Äi‰FˆÝ't0·o›Ì%?qWcOÆ Øï/nÛ#Á*CŒž¹S%©7Þ4éù>UGîO­šþ=Œ\ÊÛÈ¥ƒW@¬»#µç´‘K;ÌÕÝZ¿ûmäÒQG.µ—³¬ôXc—š"ÇrƵ±KGqÎõÛØ¥6véxb—vWoŽ+v©‰4v4±K÷ñXkc—Žçl»Ç±Ký/ vI|q±KM„±ca˜mìÒq0Ëþý‹]jÂ$e;µ±KíuûÏÌ13æ;ô.'x¯"”‡6=MâYÛéùìÓóIK¾Ýì|ÒÎ@GîcׇO/ž-G³Ûa9ºhŽqÈ¢§I:fw=ÕÍí‹&ªjôÈ]±­¤Ù˜dÓòf²-ÀîHCχãAy5o­ _ÑPnËÞüQ“0Ù葻h»Íúå‘Ån‹Sw<ÁÛ;÷&r{v ±Ûmäv¹Ý(rûn8NG|/“Ž0öߤcÿÿ½ýlÿ~oØý·pcܝ·G¼ú¡Ik—[sGh¿Ïµ³MرÙdzÖ>~|,¤½àj7;Ž„Kö骷g‹-ìï>8çïÁµv»ÛEß4àoîmìn}³e𕉣і¨„ʈôê.»hKØReDêØDßc9Š{Óáüú¦œ73ŽñHÞëô:Æ£ùÞ'‰~ì³ùBûMxëÎÿÀÎ@Gî¿;¿a‚ñ!ÍZw~ëί!YëÎoÝùë׺ó[w~óQ}iîü¶[ëÎ?w>ŠàЗÉ÷ÍDÂօ œÖ…ç°Ö…-[þÁ°ÁðêjÑ ܱp‘Ý͍žg“±•øÇ öÛʃ‡?VÇ"^6+Syè®Æø¾&ïvèhøúznœô!}÷±.?wg²Øî¼t1½²âwÃ9­>uÇᱜñM9ê'öoځÓZ[«bkU¼3Qá^ÞðÐä´oM‹­i±5-މôþýëiYŽ¿·R_ù½=+‡¯'ß¿NFåüûi9ø~2퍷Å.´6Ç;—ßD¾»]¸÷Ûðf1ßR±¼²V遻Z¨éîƒ+Gö[3 VôÈ›¯ Ñfqç„ Ùþ Òtîò£Þ t÷Û²o9óô‡_oí)ÐÄö´úäI”»ïêtsSÛê“w'’l1€Þ##T“•ÜZ¡Ë -E;怲 Q·–¨ÖÕZ¢ZKTk‰j-Q­%ê ±Dy»“³Dy³¤ZKÔ±)Ú£íƋc \iík®ik_ûˆýyéÕÁû``»ß‰î÷¼æÌ>v‰Öærï³Û½ªÉ‘TžiPÕ¤­¨s¹ñÉulGr[®á™|ŒqÍ'»­÷9€ŽÜÓ -p/û×i9¾O×¹µµÑöԘÛ"GW¤b÷²m‘ŠƒÙm»ßt>Øý–zl{WË°ÁˆÞ7Ñû#áÇ -'WW³rÛgZšqû#UXžáˆ¿`må¦üKP[mº>›ëâèfªU0OÁ:ùfçEün8hûç›ßÕQ*Tƒ¡]—ç¸ý] îD˜Ý×@ »Cy®ÑHÝw(tÇæ›{T¾¿5ß´æ›/Å|“¶æ›ã“Ñó{g¾i0¢Ö|ӚoZóÍ1Lù—`8´éjÍ7­ùæþ˜o@Áœ[ÙqÖßb—iÕË{­^^M{ýyoôÓdØ +Â=¾+™øew2À~CóÉ®¼ú—ùxòr>œ7ظ3lþj8j’û_y讆štw/ìuٛ•§åÿ^”ã~Ufé±»iƒâtãÅÍ3»iß6™Íø™;ۊŸ4¬òйK[²lËܖ,;¸’e ¸ïÕtrÓ`±õݍk÷  æ“’ÎäîÆtï«°ÝË"l d–¶Û®ãlk°ÝÇlwgÛ£Ù§2‰½ZL/#Ë,î)µ-‹t”™žM *ÇeüÞ+²µ970qÜߐÁ&C;¶ÁC;Ž€Á:špÁŸËé»áô²-Ư/¶T~h}:›,KGïәï($©Gç‹r$_Šÿc÷8µcuÀ¶<oA«Ÿ¶úé=ÕOm³VCm5ÔVCm5ÔÚQµê§ÓPwk[ õþi¨÷>êð‹ÒQw¯sÜ*êîãlUÔVEmUÔVEmUÔ#TQ¿yøT$?Œ¬ª"Ìèâ§Éø¹Å‚gžxø)Ü¿ÿòõW?Ý:<ÚýøòýÍådd»tZ†åøª  ¾ÃhXþþåøJ=ŒæW£ßÿ³]>{kûüuÒyøõWIç—w_µ ÿýë(òàÏàÑIð¿¿¼‡oÿf?ýÓÂÞutçÇÎßÿ‘t_‹Î//à7Û£´›$‰.:'EçÆ~ƒ¿ç_u²nj2©à+ü¾¦Òàç´sfþžÁ6´‚?çáeø…šÃ×ð‘âƒçø—~‰^uÙ¶½‚ØÁçöÑø“uEbt†µm?äØUøëÆD¿œ„æ'¹{·ýë^àGit‡q¿žänP'¹ÿ=’{åŽ>§—0Ißþu +kÐy=íÁŒÏ;ê;œ«“æÍÍý{j§ç$Á&‰èœ‹QÊNd…ԝ¬ÐºóËM¥¥õ-SÓ9íïŠót7œ2Eœ8 §§v1þ¦-éfÑ"DBݸUUœ‚@f"ډ§Zô—ç)š½¥‰­þ íÂÃ~Ž=Všé¨QÇhš×͜Ü}æ,*™Tig€ÊjyæDQß2•+3·çén8eV9œ¸o¿ëüò7ïCË©’nZè&=Uv¥Ø?Raì“«TÀáÿ¿ôVypÙÍe.TGw¥V÷è |–)¬=ÿ#L1|.l÷ðG,‚>ڟ”@-£;Ç|saO°yõœþæâ[K…,7ªÈ#SÁééC |1™‡ß\¿ð=´ôš›ðƺŽÕ j¶‚nsoeW™Tz×Þþu*3ìI£žCµ éø‡_o'Óù+:$¿¹H:N'“QµÑ¸w9*Ÿ,†/|s!VQ½°G×l>ÅEu×t„¢à,„/ÊÞèǞίШ‚¨x9ö˗ýÞȎõÉt8øKù¾:B^Ÿc¨æ0†ä /Ô zóÅÍ †I`¸ý‹ò@׈Tg°IíRԅ‰?$™åŠ6t"Š´îƒÛÖI7_#Tˆ„¥ -·ßíÁëy}F’îҌÿf~X¤™Q©†—ÉTⶶƒ*ƒSDeҘޒºÓþ$óçœ Ž÷Ó_b VêùÚÀ»o¢ÎÀd'&üÝxL›ÍÌÞþœÖT¹lüX O€}˜5ML×̱œnÒTÙ9Žì&*|Ð~¬:ûž¢É†Þ&ÛǬ·9Ù:fUTǼp£çîƒ"ð±iäi†®ë‡Ž²C=± Õþ“Ӑ톨ü¢sçê#§õ¨¥©´?J?$éG”øqÐ_¹m8'¹Tãł„ª¶°vãÈ6|ÄU©+«2«þ MÍÐteQ.=Q3"é$ýx? -úûqפ^»Ëôº]¦×î²5#2~DƏˆæ…þ~Ì5¨·î1½né­{¬n|‰_‚Ò/3é×]þ~Äå'*Ó¥«?hY3*Q™­¥'V#ÝX¤JâFàÿ|ܕ'Öí$±n'‰u;©~(Æ Åé7?þÏÇ\rbí붐X»…ꆂ¬ìÿ -/aÐ_±º²ÄœP3/^¨Z =±2/Áà3n5·¶ýù¨Kli(zi(5»ei(zÛPŒŠ—uýdø?q‰}ê9‰m‘Ù3éR -‘cÇ@y…LP 98k§“o‚lÁ[,ˆ‰‚4@‹'ÛM8ÉødüWúö`ôò&Ð^:AOõÈ+F¨«ÜÔè*¤Ä¬›‚l‹ò±tˆ¬*(gn ­;(T×´5ywÕN¸ïŠ$´¯,Væò€TzÔæúG݅J?Ü&ïƵ -½7ó;½~ocÑ- -)ì¡ýft@'iW㇖w…I3ÝÉ»©1¸ |£”Zà í¼dª¨NàQ@Á@{®@;°Ha#`Ô׍0ÆFo,|#îÀšïû_D4Fï2íÎ6Z÷ìy%Y‘nµîUü?Mæ/Êþd:°<Á¯}T"ìŸT墛ªv›*’tu½ž=|úÄó‘WW“éû–©]σÉeyñðiqaûürþ~T^„·WW3¼ö—cSrslú”¶„c±4yX°S¤ ³ËÄ5ʺ)þÀ€ˆî ‹m£¸jûÁ¯<^ yXgiXëŒ -ž”n…j¿ -¨óå=^†Õ­E  -¡¥±¦¼ÂÂȖi´«ÅfÃ2ñç†À85x ºðÅ~P8(w„Ø/‡ZûTb_%’üµ=/§Weî§\½ag%M||¿kžeÁðú?Ÿ_][ôߔãeEm)Ë.$t½ -kÓi’åàõL³Ää°¼ò<•Y›s£§U·›“¢]¾Ëo„RYtU"0®%K”ÕÞe>[¦iùDšft@Bv•ÌEa vՃ8–({ÚÝ-*ûiWªÌáu€¼›e©v =)Œ}B‰n‘f.øÇ5Z…žs/ùU^u²Ü™“åÃ)S3®“xèø}™6'1åNbª³†ïÒöcìÛ!eu¿w?Ù¡¦™HØ4¨œ2¥g4@ÿQ ö{hÁ—ꛢN„ޝ¹å@ýŽÇô6X¸,Á3a8V8—*UNˆI´)è<€dÖ͓MU+O:&eBKÉMá了öø35€xŽÖAñùê»\°Yôú“ -€ 8ûDxùò÷*RK~Û[ ëŸÿ•f*ƒ§e¦v8 ØÜ·®Ñª Ìa!ò‚>ó²ßºFj-àœXýf¸KÅöðê3¶[–N¤w´%¿n¹íþçæí? Çoz‹«Ù»Þëzÿ˜»°;¬ƒ–,Á 9Îæ”H^Ê (†Åf×m¦„†¥‘[&ö}è_ Qh¥ËäVZbwW^ä’#“î -ŒÛ=Ã×;˜å-Iî”aÔ¡}Ÿ‘pƸïÒ~·ƾ[á#ȕ³Ø¹è<¥ÎHG0!3䢉Nû) ¶ö­:·lN´&[€ç½#ƒÐH¯ºi,Ÿ€'ÊØ£@܅B”@1Ü8.O0Û«:Àxì‘âñ¸—Ñwܸ±èÐŽBßqöܲ¬¸@Z$ðÁîÄ"ÏŽF&PòÄÏ }Êû¾xˆï«ÝZY(}Uø^;ؤ0½ô´[K•…å؀‰ÊaI$y’xÎiuÃDÛ~Ûs#7>*܁p¾rçy¥Gk@ŒÍqÑÔ•J¹©}‡¥I–CÌgx:€º™ÎMùÉÔ)edžEVm×­å v-+ ñkð–Ü£”]™e -y$â~Ó£5 Âæ^f(…a°õ,êx­ÛÅ/sUÙ³ÑKV°Ÿ’U­Ý>¶¿€\ƒï‘þ=™ è »+­È•†ïwª›’Ók<Ü!hzp/ñßû¨„d–iq «Ó¥©e:¢·ˆ:âqP?—†âTû|fâáÙ§ •ðSöOn'ŒpÒW~+|¿èißo=ŒË¶ÃcÞC”À—ÐÓô•±À¿žö}«öݍçÀSÛ5©MÇX90SŽUiŽnêSX*Çêî‡$:µ¨ -ö܁¿…0·Ÿ1ޚ`ç >¨¬plÀ?[‹ž½ò:l¤ÈÑ!aqßD0°MiáPØ£2µi ˆžÜ`Å×Þn¡ëíX—ÆCG<4­0®'tjR Ï°ç˜HÀíšÂ¹i¥0Xièj–ᨤ–õÏfvٓÒ>[`DºóÛZޟæNSÒVžYó^Û¹¼0`–7Y7Qcp©Y* -´7¡’|ͳ0KŒz{>º[—è}ÆÅÒ&öôÁ?&s·“?ø±7{³dy:~[Nçå`y“ž†··v_,à g°e©ý/‚ð&…Ù=Pþ‘¿áþxћ¹d² Û?Ñù剳¹•o‡x¯ØûÎ/?äï¼ -N0. ÿùèv -¶ò/×È5tÿË£u¥;°€}ú;ô¨7ïýÑî6™ýÕ/O¿ú—þÏÿýïµÿù¿ðûúŸÿû¿?Ïïk:ÞþÞþþ/‡°>7ÿ¾m}Ø€/ؓ¸r´?3û²ÐÀ¼~ZÇU#3pÑy¼øí·÷à³UI⛠äÊA ¸øåÿó‰¿]"Btnõsæ°ß#â‹U”Ž½I`©Û‰] ±7`YYjá™ú¿.\Ï .NgîÏk„®J&ß\ÔÉ&4–D†zhÕC³* DÐH±XV…”ŒÄ”o.@P16U¬Ü»¿°òÍ҈+ß\|ˆÀòÍň,»v¼Vhùæâ±[AÎsç<ôëÎÛ·ÂÃ睇‹ù¤ã¶äð·2ø„V½kÏ.gåôm9¸°2ý…k5«n;ßǓq§…[ñËahIäæHTN+ûÁjv¥…œ©Ábµü·¡A ÔäTåƆIYÒº˜@B¦ý›'näÎpd—4þB€3/³'Jà¹J¡uü¨]PÎ$@Ø#öÁ#ó@Ù0£çK@•aH¡·œ%ˆ{AÄ&øUó7¨ð(›ÑGìÅYÍH™á0“ ²Sž»Y:ôà&î‚U½$äǝ·»½Hó¼Ú{0o!*FÓnnRmæ@´ °@»#dÌDz{D:îdD: ÁÂXâø;‘n…Fþ¬Îë“.†á…‡¿Û¼Â -¦yõ@?ƒÖUÚÁûUÌ.¡ƒ©ŠhˆvhÃ`ˆŒ™hÀ¯7-u3"…äÑzÌÑw"Þ -•‚§‘Ù¿ÂäYEf,¬ š{IÅ«¢k%‹<ˆŒô=–  Œá9/ôÌ@¯ÅETÊÒ¬"-Â_§ïyÔà«Éü!…ï'@$*(–ÃsDÆøú³*y⑘`BË wǔ£>Ƥ£ðƒ<|B˜tË4Zþ*›ÖÃÂÖòÇtØ|^’ŠIG"WL:ÌøAÝ5bâ1,¢^sc$ÔLze×ú~V¶­LضDÞ¶¶íªÒ^D=É´r#$¹ˆH@²SD:–±"Ò±$F0–Õ1"ÒX ] Ãñ1j¢¿?"u3¢„@2ñF߉lËô©ŠwÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(Æ @°„ã"¬4nzqD-ê^D-xÐkô¨µL—ª<Q‹@4®œ -7n’“"jyi*" \"ŒÒ÷ˆX -Ċ@8,ÂJÃöïhE‹h•V ²G}'Z-S¥*ÀE´" ‹Dޏ^,ŠhEÒSD,’°ø)/1Vÿ="ƒ±"3*{¬4nzq¼}÷"jÑø)4a ߉ZËt9ß’øiý³‰7âT?mÒÁþёVKÖøi¹€\C÷ï.~Ú<Óì¦õ®$ú߇ïúã¿TÿGŸÚÿ´ÿáÿÔ¬¡ù8«oýûþ§u†Ö;C´ÖI³ÞÝMã=—ËŽÞÇUãž\qÖ,›¸kàÑU‡ñ^.›:"Ʊ;¢È'—áÉõŒÞût?g ÜÀ£cŸ¬óéXð¾^|tÕ¯³nàÙÁÁ­øvº—w§Ž†g Öí³nâø±Ö¹~¼ó\qÿT¡ @8²U‚÷rÕQp3Áë¼CKà&þ!ûh‡ÁûùˆðÑU/ѸŸG·ê)Bð^¾¢:*n$z© -Ýݍd_PçHðž®$x´Æ™´nàN² µÆ¡ÞÃ¥TC½´®ó5U¡»{› kvÕߏöñ8Ás«>§*tg¯ iÕïÐ=Ð¥ªY¨R¾ˆŽve„àՒëXÙýcÔÁv~gKƒ¥MPt]¤DŒ®"@`û®@ðÁÄU9ÄÄè— àãÛ÷(gqT¡Š¤r YÔ×ÜWNªƒ…'±¼ô¾ -W¢]ÍF¦›€2H®Nõ,j·ÔكÝfYWY^•B¨s£3¨’º:béç/Àõ|rû×ÛÊõ·µUñ›ß|Õ Q©/ì$\eNwq›5}–áóIÜèDåÝLà· —@Îl’'üÕǸÂg/Š±žŸø8<XVc¢ç¡þ[åºð[G±‡þ¥çô‘šÐ£ÐÓxÐg¡ äDˆë†>úë)Üg,†|•c™°Þ㠒àé"ýg¢šHÑ賟¼9Ýëë_î:zrÙÁ‡Ñ -ËãpoŽÞ Uõ£ï÷ó<žøÄS±Â×0TèáŒ;tþ1.ò'çÛìÀŸ@®¬° tù*_³®m&–/é؈wù:ßµx¥Þ~¡oLÁ›*qc¢GsÍP4uõ‰ø4Õ¼¢•¸4;ñ¼E:ûWöÊdùÒܼPŽ–¦2G ãý„õ­³bõ2•¸OwÇ-Íòf47ÑN;á­má°°OÂÊ^ސñVõÓwVÙÙñ†?‰Á:ú‹FôOS5ûIý}EÀu­³´žþkqŸîŽ{™þX5ʋÙÎá†r³Žkޗ1”Xæ3g8gq'…ÀÿÒu­2F¬Ã²X³=±IôÑ·¸Šæ˜JŸÒ⺠VWĦrhÇPlZu‹Ì2ÎêëºÐÛÏ*½xùrã­¾ŸPñ€ WMšâmè…Ê)ÝÁ,Ð@+•gÊ Ù)GîP/ÚK vªEÚÞÊX@¯êcB—ƒÙ7hí¾ t!"¼‰}LerÝáFÔaƲ<ªþ†Âê~ùñü¯OuþØù¶?œöG兺ø®ƒÑ•vêìöÇêìªn’ 4™¦™VΎ’tU.ìÞg S¹´Är͙•ÏL‚:N€/ë®=„ –› ¸ -§Wû’Œy‘ÀAi'ʓ -`Z|®²«¥[jà§Jü!}ƜBè,M½Šfû#r¼€½þfD¯¤Xn{y4g«t[ÜΕ°(âa§V—Ðèâ†iW¦EK3OqæNà: ÷dËR…NÊTƒN{%Š…¥ƒï¾¢®"€"± -WSF¶~WÜþ¢t¦Ú©³Õ~naPw£…Áíª£…åñhð&3Dã¬ž‰H²£‡QêCBÒ{èܦ'Þ䒲 -ÂEiû™ÊGÓzÒ¼"Gá%'õ:O]Ëzg Î}§®å:m§r×OD³›*-Yú]ó1žÊ<1OˆÂ•i^YnyœÅ ¥î-­Q˜Z7³¤Vùåë'žôx1DCî,}jIŠS\4ÅÇêZ¦ùr<á\žý58—%ø£–Wu'M@TUŸÿ XØb¥N>ÿï3¬PڊŒpTZAÑW Ê»Rè¼,  -ϝYΔ+Áiá|“B/¯ -­ˆ}M -™ex#Ofe"pƒÐ¾+Ÿ©= ,ÀÙÕà’¨gŵL('øÚÏÂÊypÁ!"‹Àöd]-½ô•©DƒËÙ½ž*À·jõ<+ภHlwír5àd’¹p]‚jÆ9ž²D¸ú€E¦RW#€!¨H"ÀÆcZ¢Òˆd ºŒŸ¢’ýS_üЧM>ó‘) 'bkVç  {ÌF̝֭ _k<{ö±šùȤ=fÐ=.Ï¡¯ùØxk¨†ØP•ù«›7[ß\DóõA³”c]z±Ít„ z ¸½’… Ê@œDÖåÒÿn © ¯’Ñ­¢]¼rü’Çò×Ø/ŸqqÂÏã•3]þ˜»”ÓxŒId˺…Âë÷ðʼUV¨²ÀýÈRã,xµ‘ÆI¶ZŒ'·R ÞV”à…±ØÀOg2£¥Îý32µúš×® w†U–¡›ãíªŒ¾Ÿ¹ú öHvµ* -˜¡ªU™2˜?Ûs)U - mßûE„¸Ûvì:”wS!’ÔÀeÝgNGÍS”wìB6°€1ҙîŒ@Ò¬Ðï +u£~S.rå펁kFt÷KØ N®k°Tvušâ…NP¦ßuÄªØ ¦49Ÿ»…‘§ø¸O“±lBxM…Uµa“aI"‡ý,쌊 ¯œÀç¬èäXôƸ¦MÎgcז1â ðû*ä4ºk„Š'…¾£6jõ@°ÜáÚ‰%Hìì\û‹P6;Û1¬* Ú ÜMä.@Ó êµF¹Š²–e9{ :,á)¬‰êÀ -rÁ+Œü·“ ðŽoªs†×0撊ÑzW1̖Ж:Î,I„™Y™½³šÝÁ -—ÚÙYPwt·Kí4^²¾z†’noì `›Î Ø7ëhˆ 6îÂ.i>pëÞåyi;ZžØOµÊ}²‡bïô¬®À$]荻VyU]Ò8CC2Þƒߝ ïâïð ÉÝw©}cÂˀÔcóßÁDïoä‘f-ŸŠ¿çîN$@+ËLýÜ%ü÷¨éÉø‹vV ôÂÊ4 Å/¾§'îJžpoYþJ½[§}™Ê·ð#0~¤ÁÃdå’Ìýˆ…ˆWõ1¼2ßöhZà•*Ë*Zƒ÷.ël»½·öÆÓeee•ÜDßyUY¼kV(¯^ü\]ו%o¢É®®¿šUª«Kòc¸Ðˆöª†€9Ó^×Ì9”á†Ìà͏¦Yíœ7x¾Ó{kçÜ{Ãðfb^‘b|¼¬de§Ðüªð~²¤¨Y&4-7µÛ²×Ó5 è¡+ÿ*Uó*zòf7|ÍWñր¢‡Žßçfe=¼¨ÿ‚ w»Ê»¹âõUùëü²œ–ÃþõÅãɛÅlCîêyš -T4rˆ„sZzƒ­š¡1•"—Êʉ¿<\w¤‚ÁZ(ˇVOÖ ®¥D>‰UùÛ9};¡¯5ßèËÌ­Ä4z50èÜn‹w_gà\Ötx‡oçô턾Ö|£/³#_€îÍ´BޟÙ)àÄsØóäóGÁýÏEçqïíd:œ—ãÎõpüÛâê÷ÿª¹‘òóØØ  •p©¨½ÕÙà¾ÄçEwу)Üí`"Á$-ÓuØ¢›Šœâ£ (Àå˜d$8Ye2÷gÞǘt]*8 9æaC¨¢tBª´pÎ_Ъ3ôh è½ÒAœšmÀFcLÐ5³šºNwO£.³ÏÕ/È»¨Å´%Ô¾½ª4lžƒ"¥§CÙpƒ;¿ ÿøå}ÔòÜ-•ÜÈؙËeš€‹- -Y!˜R :‘Éþµšx( ób0ÞÓÛ ËFãÃ?t“eRaÜÊUQ1‰ÎQ6vQ®…íÐ΋ÝIŽzV‡tNf¸o5ÍáȹB_|fr(: ܽ&hó%â]|Ÿú{Ï\ õ½ða´ -´£€<2q¾œ»P„‰T N4ìÁr\maZÁ c@ZË 2'ècUB—N0eI"Üm½0Áhç aç:…‹¤í6¾ ²p¾{Beô:XÍH騄" ýÆ{Yµª ¶r&O _"õ ©t¢dØwqNTÞ¡Šœìðl*áÞX™ÀÍ&(éb¤§ŽÆL݄…1 ïTL%Ø7À¶â‚©!Ó'µ[D+b+itÌ3(q7~£ßþ:GÙm*ŠBâõ’¹(@®Ó©Â[°UÜâNgkÛß\Ôò20>îÉÍÀðYÃϼ'GsÙ‹§¹ôö=¸ZL—˜¯Aºä -gƒ”¸¦¼Í¯{q7ûÜ^üÍÊ5ÎA›ó8|n…ËYh Ÿ³’ì^œÎ>WÃëÛÜÒgöáw˜¶¹Çäô}xž[ïûp=·Éöâ{àæ©á|އ÷A6sSîy­+üÄо›=x &ToIÊÞoÙÃ˳ŠÜ¬#JKÀÔWƏ@v† ­kÀ ÎLÔÂèÑs'˜¢…º, Ð*~´„4ÌRzŠ©EâÌ”­‚¢^,ó|éQC“Œ)à3[—è Ñ˜Gn™64ê~@P ŒÈºU ¬<^C§¬ô©†Vñê:H«{ -^­¢£í†Ls´ºgÇ*µüä¬ zñÓdü|:Ï-Š“G=/þåë¯~ºÅßr÷ÛóÑÂþûìòŸV=¶š ¦,wN§‹ÙuçÇÞ¸÷ºœvžM`´ßòcÇýz֍†¯§½Ûëaß7}e)ý ób1tN:ªó|Þ}°Òø»Žíñ·õX ±ö™¥ÖŽQ¯m2ñ3v•<_WøËäzTÎæë9µœ:بҴ7ÿ­´jñøuImýÌÕàu8þ2-‡³òÁw®'·¢*±?ÁÄ N—º3u¾Bgp¸ÿ+àîûi¿©Îç§S»¾G%¢8^ÚmuqöÒ¶L/zó 7¸çÛ©Ï;´5ó#zÏ9„ýèâê -üŸÿïæïùòÊ"u/·ŸñîÿÁrþI; ÂûUGUÞ¾Óð?ö|Õí9\¼ëà›eÖr=d:ô_ ØƒŽO5 ¶#ÁŸðO|Îá¬ÛîßñV§áüT¾£ÖQýªV¾Âaj{gnoÁ†4ö›„8B‘[‘V:Z$kiñ ¦¶p¿ÙY|9o'ìë¯üe¨mM¦ÝòW(±ä7¸4…Èh%Šñ|1}[NgýëayiåÜ?vÎ-aO~¸º*ßØw`Ý@ (‰u/)”gJ僓"£²–`>&ÈnDiÌÊèI–Ob$¼»í©R£0jÚ(¼ÐªH8ŽßUnÅYºg©ÎßCì¦Ü@éOº?±àbüéD—{»€Lªò‰J”@õ[ӝwp)¦ÈRw¦‚‚}ë—NzÔKGšví4^;Zç9œ|"ÂÝÂ1$¤P‡Ë ;;ÕÚu“÷ºù,˦µ´ž‰&úó¿Y¹ÍƒhyÇ1Ë©6 ²4^Ž1!JË´ ×jwDaåÑ®*’// "i -sRH'›Ej¤íæV¡NXì¹ù8äù° C9»žNnŽ“OZÚæ¼Ð-æö5­7½ÿÅ?p5,o‡ãY9ú°XËjÆnçÁ_ÇÃþdP6¼|Ñ ã†2x‰Ô¢ÀÝÐ\&~ðäÙå?_؟ÿØYжÙyçhÂmOø#b-rU<¿ÌÆ{/`Ë™s`?ÚyÂ5仢ðø£òÖîäÙ³qþöso: 5Ž+½(G=ؘ¯&•ßè=k°rïê1óÏk'ìÕ§Dóð×"}nÕã î²ZgV&Ã& -cRÁô ú¨7×/Ø´áLžåûm·Ïh_t»×`C¶öõG A|~Õt8x½I"•4ùçx~‹´Ð´gnFÄ@)s¸ðÇÃ'W³yƒíÓ&$dûÛ-7¬`•Ê<=Ö#C¶GÆg92$ú5?ˑqœ ÍU1(T.ë -•'ÉæRå®l÷1f;È¥òòí"út‹È_1w/א¹›¬­#š•¶éÿâA/û×¥å,cz‹ßÿ£GÂÛZ†Z úûWëó -å¾?MÞ}}²ºþ—RÙ>:ååh<¨Z“.G ¯@a@R(o{ýïÖ°áFW¡|ˆ ~Ö¹žñu ‹Yùüåù)õX¤¤’ Á]@qç‡_o{–©ž–W“iÙùÙjà¤) Oõ^Ïú×Pš®ÿmùð}æϦ“ÛÎËëÞàã1âêæÙ5·Ø3«þlêx+›ï®'ÓßSfSÇ 7}Smô¶œÎ«Üð¶7dþØ2÷–¹{æþwË[Çvý þ±µbN§bÅ9ý(ž¶Ú!‹ÎÚ¢:Xô‡ñ ª?º½éóÞ¨´;Ð ãùåîýþöïÏ{³Y9½±{¬ÿã;¤À/¿éª?|ýÕó~• 5é÷ÿ Ÿlàïzv³3æú -_ß¾xrÚy1™ó+’TÀ-Ÿø@j„Î;¤¹ró'åè’Û§2KÑ ”ÛÐpúû¹¥Yáî@ë -i”KÒ#…ÎÞ÷BûÍ5–°=$q{™.¥nËöwՉjû{¯­RÞãGDZØáÂP³¼È0ÈCfRh,~™iŸe“æ’-(ÝF¸8l‡õOpÁ“?©¢sú'mûtêîCÓRã+Ü쀡ÝÖ×,cIàÎ^ô€aØ¥Ç,-µžüIæ³J£‰Ìlk…“žæ™K4Ná–ã+îl¥…=ùS‘TPÂã–Ԙ吤)v67©ñ Ë+áç PB/…ý×âLbœŽJÃuÅ0-™P.±Â¢× -Líº-RŒ=ÊNá4ÐMè÷éŸLpj#”ï•y®=2Ÿ£Q(ø./$,#“@F…tTaîáJãÜOaè´]÷ʅÜçTæ4ƒŽ®b81vZ+ ¤ —ƒ¤Üj*•»%o|¾wFT´tKLÁ«H'0â:™”™N…3²Y\®¸Nât»Ò…rÛF´|¤£¦Gip^ra1f:ìªTÁµ9°Š ¤ü`•¹Ë™2™4¸¤¤«äqaç4LG¦Ã7R.b5]»“Ô¸™—®Æ‹>\ÅØ_ô3aÏdv/× »¬³Üͅ Yåaº5î1)Í£"•ké`E’cß´É º›aaf®sœI—®v.… -L]ÃÂI‘v«ú&eØnyfÒÉÈT³ 5rwS&MÔ¡ ;yˆ_ØÝ䘀Ñ؉DéB»Ü¼¸“‹|'på‹0Y˜^ê_jQk¨¦î!¯·3h· îKm$"”•ÐžP)í ÜÀXÀoÖ¯‘ØËP„ßm…[ÅRbй ‚\r•ß l\;Aп0µº0{bIP`àl·ÄÜ%ÿE¼Šø Ïpãí–Ó:l7Ë«#Ž.“ ® ‘@±c\$Eš`´F×N_–ðz&·È`èEÄ^„]Ž˜ºî"Ø®î€,DÏ)]/™½H¢e‘Äx†—Ì&p;m”p†8¦ á°¦*GˆÂi‘"•2‡ýi7¹–Èøíi¬Ý¡ŸÑšIá”Z†qZÒÂzÎqgDT³ì\ãÆ´h•[Øv@¸XÒÜUÀHY‹†•¦ÂÀù)”ÆœEÜT¹©´ÔB1ÀßmAË÷ -dø|ØÑ  *‡åpØÁ$ç^¸Î ˜hxídäˆÎåñ1ôó# Wé°xsè0îêÔD$M3Ç s¼sºœ–ysÌú9GËx²€û[J˜7Qà³J˜#Pu!rÇñ•=ÿpMyÑ4T˜[;c°ˆÂñ’ÂVxbå2`N¥r»#Ó bÎub?ãé’ —¢3۟;•ƒ Ï­ˆY*+±áì¥Ú²y<\•Ý˜ dw¯«N-¿ÐÄÒìÁÒE U씹$D‹Þ‘Ùî -‰ÕRÇ”8øˆõ;Ön´ˆÌÂ9ÐXg™cž™=ÌR·K3û6µò$ò0I=´é—ä#2jÚjÞ-„Rü:$“Gb~½Chù -²?on ´e+ß°òð³iÿz8(Ë禉à§×ˆìåľ`º*ßp-¢'“ÑÀEÑlEÅM²õAí ^w-ýS›®X~η¥ãñÛ'ÓÞb6_\EFtž¿n¨˜¹8rtLJãBš¦Èá­æUävñ¹à8íDÍâô°ø$¬êHÒH íXryð–' Û0VµÂþOB#ˆ,x› ÇEjT†–±ªžÚö ÆP=Ëâ\÷õjùƒÇ›áf!‹X±åç(º<>$Y†ø¤=Óñ°ÔüÿŠTÿ— ¼Ìʏ`S…‰?$™ñòunùá–ȁQå²ÿî -3Çñê,wìÕKƝêV´Éü —VŽKw°µ|\ZÕyµ´Šaê„,;ûN™É¨cËiæÎ`”\²À¿ìѕbÈ~~0Ê«Û9ÿŸK¢Q€ãÀþ¬\›Â]ý ®?+Èg©W¹¨GËXÖHPς¥-cMp¿rX¨Z¢ ¤aªí¿a þ­¼¼êM/ã藸eùš’@IŊý¢"¦Š%} ˜öI2²€à†A±ÊË Ò!å¥ã„6 ²Hj³CUx,YR¥Ê[JÖ*ÓÆÔ(Ó®'nZ ˜^鱸΅ԊNä°H—Š»b÷jærZ”Ì ½Ó‰§îRwÊõ¬öDâêÍÂ6“–\h2s‚i–zá‘ÒF#1—è“aÉ Â÷ü4ØßØÊÖì¡óál^µE®ZÎ7|]W©f%¹ä됏÷u|IѪMÑõhÏû‘Dß¡¨þÅõ¾7š_~ÿO;Œ‹É[w5Þ«Þåyi[”'öS€–¿Î/Ë)Ô4ºxøåÇóŸ&ƒrÍÏßw¾ýõf4¶ N삛/s¾ëñÁÃé´÷YÑ|¤·Dí¬ h¥®rì[‘‹Ÿ~†æáÎÊoÿßñìâmo:û>ªy·}Û-¸1ü0[Ó‚©|;ߛYõëѓj<—»Pi4±+~°™¨éb€—ÃñÀvXì2H»f^–óŸp4; 4nþ1ŇEl&Ên¤µ±;íŒ]fúÎBs¦ðÇ·»³h{ ÆÙ· -âäæØß']¢œõÀÓ g¨Ý‡»¯Ôϱo^ÂÍ ‡ÕŸûµ•gWï`}'ŸÁ Ü÷fîµÝ<Ï8Vhí°ß Þ¸Ã¼û–Á½[GfõÈ××;qnzc;1Iºupïw×û’ëƒT[Gõën è@FÅqjkÇs9™[ùâ¼¼š?›­:»ÓðV:QyäËÉbÚ/O!|÷0d {ÄD?nÊyo`…¬Ð™âƒ;óÿ ¼¥d§5µFGžŽÊrkñç9eçžM'·§eυˆ×ûË{2‡0þƒøŸO†ã9èÛ‹Q9­,øAŒùÛ?Rü«ÜÿÄBàcoä‚«à—“¾#m“OŠç_ðñ!;'ðOèŋrôjòÂuÀõèùd6„Îãϒ;•ìþXfOg§óËIo:xT^õ£ªRL“AmDÕeJ*>#n{ƒA ™{Ñ –\¯Âf·“ù2¬7ÉˆÛ n‡]âÛ <ñ¡¹®O;óIçEo6/§ÃßÊe¬ŸÚã™VTçÍxÒ3YÌ;¯§“Åíæ¶ÃÙdԛ—Kˆ€¥týJë¢sÛ»-§Ùðf1 -)ßaÿB“ž§`Çv|B=—Qƒù´7žÝöì†ë¿·ý,>‡‘Zæk±u¤íÝb綯§%ïꭍ§lJM²®©ˆû°µm܇­CDªrÅMÉòzÖ¿íÍ^r‰ÊT>Ÿ–³rú¶ì€y»óÃ`8ï]GÃ9-äoW÷*>dž]«-n;G谍çxC‡ xÁåìš×"®ˆÎ‹Ò®£E´8TRyäÙb~k䖇tX1«<ï_/z¯ËÎóÉm´ª­ð–¬ð¶çåtv["“|b×Ú•Jx<šL¦?÷ÆÃÙµ%>à¡+W"ݎ $×ç£Þ¸<+G£~W˜8vý#Վ³órޛ}s¨ˆ”A Óî/5¹­ôP``Õî(NQî©`I3‹P턥–’Yav¤$œr ά§ãAùë˲?>ôx8m{.” 3¶î9҇N4#Ú{žÃê4g™Øqš R3Ë1J:W̪´¶.x5qe¡»I7‰dÅ7Ÿ>^ŒFÄõ|^ý•8ªÌÒlƒy:9ÑiýIVÛöNá ¨møì¶×‡Ž6?îõËP9gSsX€+­óµ]ùyX¾³Ô´ììXa¶7ã­ºuíŽÚÆA­¨2ç†^îBKTê«+3żÌÛï,zÀ¬;çå[!¬²’úò·l{ i][8Ûάê>gÚoÞG•sP­m h#‘pV A©\O®?O¬p6ÿ9¶Îi“gë"^YA'òâ¥ÕÎ@Èýq2ØÆÑ­º2ŽËÎ Stg5«¯®õ܊¼µ|ߋ'•uýlÕøGž¼'£‰=€^”·‹Ñ¬¢è¸^Xý¼7u°fÏ=†¤jË/*â6­ëJÛn.ËÁóéäj8*ÿR¾ßˆÚCt¶ªhUšýíÚjä«(ƒØ]iýrqiëã‰=Ž_‡ O|íC6åÒ¹’mzsnÏmRœŸ>¢cíï?–ƒáâ&’íÿq°,:V›Ý¤lT9¨¾Àj« úi¼ŒãHg^"xQ‘VÚ>ó«çåÚµViö*,²X†Á6N¡yð³^N—…—JÛgËÑvb‰ÎÏ_6 ´ÞF.‡sGz¹ÆÛ Vm·†b®ÑŽ$ó—i&bÃÄxÄÌÎpŒ!˜ƒje½š¥hý XxüsrÙ½µŠæÔ*œË[i¯îF[šÍÞ o/í@ß,1‰åvÓªU–ÐÅ閦ýÉh‹%ù²;4=y½Í(þo“˧ã«I'k·Qc1lO¬¦6Ûá0ÁfW‹qÓªq¼WΖêÇÄP¯.c³­ÚGÿ&–µ¾=›XÝuÐyüìɋ‡ªèü¯oŸ¾|Ö2Õىü£Lý¿¾Û¢ÞX©0–ëÄQÛºŠ×ª®9­ú7ï7ièQËÉüz«†îÄÕº=³į́(&;pöJûZ6ZA¿˜•&}4„Ö+öéÉXµÍB&8çŸ-GÏË)”†‹ùþíë •}†Êq.~`cĀ{êŒI§î) oXyªú.g4jü2÷ØoÛ'@ÁSmÅ2îmos=y÷çá`Õ:V,¿û¶7æst» &ª±xWªûöKýüÑã Za6 L34}5íÝÞnk) %zNƒh·¦ؖM‡;´uAwÍö9jû¸7›ÿ­¼O#›†å¬cAÇ®»QÔòÙ¼´¤¿.ǝËrxÓyy‹qtÓqÇþXN;ñD<²\j³Ž}Ëɣɜß.X|WŽÅK‹Ü¾`Vv~ˆQÿ¡cç_;Ïìö÷ÿ„Ýá8~IÇÎ.Âàõ7vžŸ,斏¾žönn:ïìÓ¿u;§ÝÎÓñ#Ô÷m¯!›SMo~ÿ?õ;v8àÿ¶W¯ÿ¯Ñ|øº¤^ÚÍ~{Wöß`וÅø²|cÏ6«».¦nIØ×÷§ÃÛml³2/¶È·a91ðát“ -I­_”¯!r£2QéÆǐ·7µQI¢¦Ï-_ùÿ»û®ìÖufÍ÷³–æ°%Ëʁ¤rŽT–eåd+˒­|ÿû¿ô zýÒéÑô03ERTØ}{õÚgùH"ˆ -…BU¡> ¯ì'1E‡Õ¿Å2¬@lfDUukKœ{"iwޖÛ!Û.*] æTüžè=.¨vÞ·›¶h™Ö–·¿Û)„§ƒ¥î_¿ërñPâ8½ÒófÌ­›ï¨ »Õ\ éö秠"”[Àë„Ì‹×wF%­Võ¡°_ôÈø¿¶‡uòšÀ¼ –Îó6 é]qeG}~Ÿ´g!PîwŽ–ÔpWlj˜Òø ²)äˆ\ Ïm\æM·bOak¹væa0:1Ù²î+ϦóYMêå=±ÔV#o±÷^:žÜðY¯È (o·¹ÊT°+þPÙÀS¾Qð4–ÚÓj±bíûۄ@ý*$d™pª„Œv•àڅü¸UM™áR¡ÓÃv2>ëa~¸Oq‹žrGE*ᢧ7ðÅrÂ4ÁsU´àº ï^­ÖæÅ@¤B`|›DœIrMOKk:ÅU‘KAY ªI©ë?âuó8GNdC~—·§)ž5x5 €\æeãëü3ù¯6GjJ´ºñØ&Ó@Ō7E{ÚI†v/GO¥¸Ö¨`÷¿ßTïCóÌf`¡ŒÕ¹iâ7+ß}ºóÊ>ƒØDmÏoQ–’ò^s:C-V)ÖGe<áäŠñ‚õT>ï÷¤ç°Gè©;V1ô­ávÄwl—¡bOÆٟ¯àòW[Èhm&cj5võÞfŽô¾ãÍl´ìŽKÆrüpžú2$Qö¿ân÷ †Óßé¥ ÓÇC‡%¶íŽñc‘p2ñPI{`JNÉe®ZŠ‡Ýózj‰NÓ‡qyA«4낾tæ5èëeOéïϤ»g·%~¶¥c"_?}Y£Þ—s&íÖ·“ßcI/°ÂD²6½/°ðµªýD#åhÉSå— ~ÆÃëÌgÁÞðYU(eÃŽä&l݅FÓ¢èH`áF0ëaª%BŽxϵÀ_qü‚ÖÍV4í2àÏ,‰ñY+t#êõÀ«Ocæü@2è%ôsáÔáKP‡©å½D}ÅÇqæ+$ÃՋÈP¯ÁæÀ;ýÿN¡"™ï4S¼D·£Ô® -ZҏòŸšþÉt6‡WÕ,I‘áºË”¢ª\ÏÒmãZNuu~5'ëô»=}™á0ý”e¢ESGüBõ2Ü/œ*aêͺŸàW„*7{+ ƒ@¯9Æ ú…žñ ’¡+'ù}Æw$¿<7",3(ö±!sž”0L£ԉß4ªCÚӖÁ6‘µm£›ÃçùéÖ)õï\46ì˜s½yHPUè+ÃkE2âéAñíý&Ch³ ÔԈ>3ÓÀnÞpmCÒÂÖFsZÈM"PAÄôº|EL€¥8Ìô†Õˆ ä崀pÞò¤„} 6±4;Ô¹yK‘‘*Êg­€¯R¿‰4¶4O˜!]ò´+žª§‘H´O 7y…QoÀäeZª•×„—#Ã2éNí2ª€Gqš‘V0 B[Ӓh´Š¿™¸qÞþłà¯KÄ/X•—¥Ì¨Ü f´Ç6ŸýŒYa×2ÀNJ¯ãí—æ2µ ãät½7Pk&ÏvñœÞåÝ(¾cm+¸Q–ôÒnŽQ¶æ{ÞüÁ-¦?{‰·Œ¦@êë\륋Å}’ߥäpž¨ý¦+ñúà0ÎØ~AƊ\–ආí£Ì–+@=uêÌ}à·väÔÖp&½6ÂÎsYñäd™ž[ÈϔkÎŽ1€ mõ}ø+¼îò-àCÇ:°ÉlRu€ -:nðš}ë,×>°avà xzœG=‚›¢Û="d@ÝêÝìA«örØž÷`ÍyFþã£Ç¡ùº¦Í±N!‰,g!«èª„Þ e>ß¡y3HÒþ‚CƒœxƍË}@Ç£˜ôó$Y÷-Éêëç ™àX!‹û$XÅwôG½EG:ÿí‹8Gó?ñ›ƒÝڔ‰J³ÄLSqcä|Š¥Q¯×Â΃lrã]öE>gÜòš:¯¤³ë×9˜gÕ0 «LÁ'Û)»ÓMkÈý&¬·$ㅍˆj¢¾‰[Á»Ë= ƒOk± -oj´›Ü°Ì¿Öî+A¢·~I}}hƒ ÑÃ!#ŸÐaG1¹.[÷ó¾p3½ Bd\-÷Œ{,8ûÙ`p¨ -ݛ̄É;Ý|™Á§å%CþžGÄkàÇO —Mïì2~ß´THVßãûóF7õÜ}MTßê-èê3Úß.Z"¶Ì·>OÞ±ÒαÉ+óƒ2i@FŠú㤱Ìć¯& BËí¢Âb¡t,SØ"Êó*¯ì’¹¤ûœÄp[ó¨ŒC„ŠvöAýw¬à)i‹t…\Æb¶¹ ºÚÀ±²Í~ÁrUËd†fíì®+ž ~ãíªÕü²ÖW`A |#qçéê‹JΞ.,#‘ÐÐZ4ZKF©¢ìLԖûP3 oÂ@/‰‚i é˙ìââŸÜL–šÆ¼–Ài ¼Ðí"µ:®¼é…½l1rŸBõ Bª*¢ ¼z«Z°˜3Ó؅gSÅ *ÄýÚ·Œ¹û~J»øŒÕБâÛ,=û Ø)4éÒ c K§r/Kí[mÔA"¨5«ñç#ÜfUîݙÜ8j8¨·þËÙ"Á·¦ÿ“^ûT0e©ï“»„}±Òt°Wÿ -˜ÈÃ5hINœ½•Ð²Aú»Bô^Z©*ïêÜbÈpE}a9'•ÉX,!¨{frjÅ>nS  -´aÛOÙ4}×K<kÒùŸU?éiu‰ªå}™¨5¬™ìköӗ\ã³²^àô¤ j‰8Óù~É-*tu¸.Õ|à¯g†/†nzX–Üøõ¶tÁd6q&m[,_×pÞ¬Ž]h¡¯ñÍ&šª,«µ#iµxüõŽ×n˜Ä[úӉ%]üÔzO¥L-éi8ìÜJŒZ,ßφé:Ø%ŋËߋEpe¬–­gKdÒݜEªs‚rkèsÛÿàŠ0‹´ TËâ{›†*¢ŠBóyâyÁ·ehEÚ¶=¨Iž¨{2ŸÙŸ“ÅË}SÊF(H”ÉñrkKù‹²IbÞN6õ–jÅXƒ–%jOå í“z_#ßóÌFZ,0àp{‡6eDÆ-=0Q‹^o$³Ï…Ó›’‡3é±¼hӋúh›Zéô ßîJâ7šßJ ©“¼Êvº ”NΛJ,ÆCÉß,§Û6ÅöÀjèxÂ÷9{K/#'ٛŸ "–¾Æ°ÝÄö«bÉ ´˜°0úåƒk>hV,Ï£hÄ뒒’À:A6¾@ ٓÃô¢z,R*ƒnl-k©Äç2“Š/k9}Ï'ÎuBTŠ.’°|Ç[ü8NŸxÍzùE¶ç˸wòB¤2$a¶ !²ôþ%ê®l_)ûk ¬%œÝ”¬Q_6ß÷B]v¨†žýG¸uP2òmˆ·3¯ò¨·pN;j3{<øö½æYîàOëËü¦è-!vÞîD)ùCÁÆ - gÜ8¿æƒÃnÚ §9’«œÓ¹Áñ˜¶M2dجm‰ìî“?•¨çRhª:°¢­{Éu7ç~\É֛ÆøƒØâ‡7óÇÏQö5£-Æ/ƒSz±=8$ä6ÖÑ¥n:u2©EÌu9>}0&\€d é•Ñw¾WáY¥³Ñ×9°;^*"³-çÖDÆ@NuÞO(iõö!ýµœhñísµr§C‹ƒ8øß^¡‰$² -Ê@“)¡¡ýÖеIkÅh<Ø¥Ö¦\´ æcQHgŠ¤Ûñð&c¦š5ÐŵÕ& ˜ËûÔQ LôØ pºu)bªš»Ð}Quçê%¦Í]¦Tf¸qzÂônâ¾Î’Lø³ÇÜ ·gL{+…7Ž¡yÐðz]3óIG÷?´y›Î/Tç9áŸì–¼E©ß^uœFà -ÎóƒXo-i'ï 6Rƒ$Ç»Çu`‰×3™ø2¾A"pnÌ®‹±9LjÐK(1jÀH —u[ŒÍÒò+PrzÖ ~»C˜Š^‘õéwžt¯g3o«ùÙòûb©\ê«?ÓA/LW]ƒt±Ö±ûÙâ×B™±Œ‡>›ÀõU­Ð lû)Pú½5X†»Dmãi Tò¸?š;ºt±àúLÔ_’;)íÊ$¼÷|áù”KEÒKW¶?VP D÷¸I–}&œ™ÒBÉê*VM1ŠÖiGÚçx7X#qŸ.’@K>S¾úlÎîô;ç‚2ÁÙlÚcË{rcÇÙN¯ó Ææ”äâT‘·Áäœ}ž¿`fˆ9Oö_[Ã}1æØiŒFØðö6ú¦ ŠÀïdydU ÊñƒVE^>ˆ Þ°kgÀÃî+PqÕ³ði;Ñhúˆ}P ëøw tþ§-sBNÚ`ÍÚaÇ~Ûñ©ˆ_Ic¸‘¶¬œÓ°­[L&ü¶<ÃJdòÍA÷™¢M?ØXÉi¢RÌÁýÜe2ƒ´©ªkż··ßi'ù L³ÀvE:(üԏ½+Q~ämVúß´²)e>d+ϘO¡-9õš=ɲټòýæ«VQ ›òªÀ(gŒ@ªõ=ÒÞõ/“î¶Ë΁ÕÀ¶L4ÒG‹w_Ç"Àƒ6ï+Œ ²µX"¡IpI®º/HÜhߓWrÿÁô#W‡«šúŠÏìéü&Õ™QýxɘŠIâ½gÛrýÙ|5±‚nª‡œ4H§&¤{ОÈÍP¤› ¦ô(ü‚rŠ8ÝÏÄÓÈñèۖøiß3#Ó''ÅGº ]`¼ҕ¡|%Wó;Í èÍUeCyC+Y¶À´ÚÀ\jÉi4jkvú@“ìëËö4,úŽA¢ñ5=Á&þ·¨†Åðè ?ï9B”ИÁ”øÝÜùÇ¢b¼üSSb¶ÌNªµ=,Ǔ9<é`K7Ưƒ—y %'•Ý¹ú]oŽ'ǔwœŸéÿÏÿþ¿þ‡r²$ýÚqzXö"Àeþwý^ÎÇGZòÖªÿc^>oN«Ýfž¸8Œé²Õ! {é¢è&?HºâB™‡šPŽ%ÿ'élIkÔ3òYc­‰sZËvkìë䂟w¸t±ªì'ô äŠ5NI`Ue×¹—Zd ý¢(û”°FjÞ/­É>6kí…ÀÑڈ ©µ;>­uê¨kÍoÝ­ÖìÊþ8\¥€ÖÍj î£K_EôݱÊ(ŠåF…lŸ2™ç‡ä™´–Kít1¯­3OÓk‡óèÉF,Ôâd;9¯ÅÇe8øù^¤{éØW(†ûI󏡞úÌoÒddãÀêúõhSæ*Mõ†Î¡¸ìŸq×Økm_ß9Ø%ÐÃᬻYךrGüÚ¥;Ù½r‹îÌáhyá‡î渖t˜êҞ›úî¢Ôpž:ú3¿ Âè걙G©pŒ?|—~@Ú¦ùJËL½þ¬«zY€¯Ù x·›†dèޗŽ‡CèØ;|†Þ+˜Ó]7ñQÍâîÎWÉ&Iõs™ÌÉR…f ñíÔr„…T'‡Óږ¦ú–4¿4w›’ÕãËÀ›ä¨ÂÈ»€p.Zõý¶¤©ºÍkhZ)KQ=œGA“å5¬IQE 9 Ët×û¢÷‡ªÝ,ÓHV%ûªË삯•U¹†¨2"ÂXöe[’¥j,”Üe97S¢©šET0Bº¶ëÕs2‚7Ýۋ¡ ê£4Õw£Q4´î†/»ATÁ¬šBªŸ‡ÏÖ¤†¨"I TpèiΖNIª{ãM–ªÏ¹¨¥¨2‡CXk>ƒÖ£Twþw߀ã ªGc´‹ËPõ|™ÉyQ…ûoâîºÍŸÖpè§&IU—{^öÞsYŠ*–)V“RT4´¯¿'&Ídwwˆe¶†4Õ¬>b(Í¿š’T³U QEÊæ‚É9ƒ]ëø¢¨’ë ŸjXg>ã6ÄaËÕÜðdz·ì0@Õ·ã¨2ª+åß>éîví&‘û<GOšª»—ÄJ?UŸ4Õ¼îì/u§~8=…„)ª•Í<'KµèØïl2TûV¬^ڟET!ŠpÑ5(e21­$ÕF~•—¥Z/{#9ªi¬… ŒdwKö—Ælh IRm "GYª-Ó|¸QEdhÂe¬m%e¨’ÖvÜHIRíÙYªßºF)I-kRÝýðbŸã‘Ušê[sµ¾¾Ù$©¡ˆ*E†&¼ÇLK9ªelD–ÒÒT3M\×9UóRT‡7; ‰Ó„'.³hòXÒEQëNYÁäÑgW -ƒTmT+Ó~@vâ€j䀨Âe%l n»6šê:`Q}]ôuÔòN$»x^¨(jùÖÏBªöËUö f¯è]¡w@8u3™$¿՘‰´‰ô¢qf¥Õ“KL…JqnøßúªQÕ ŒGØûª‹ts9@µ QÕÉÊM5Xuˆúú½kŠj¬Y* 9üŠ‚ï¯-Zhqõžâ N?Z"ø;‘yz6h]³ŸôS·Lž¨gŽž"-pQà$¢¼’y½ûŽ‘á -I=½°z¬wè)§ìyÓ³ÃJµ˜[T€}šÀJ³¢Wîi -+kÛ~¹§(±2Í×ä - ±zj}’yÚ·aõ֋Vî©kÄË&†i¿6¹§lÐ ¹X¦]ˆcCï0 óúð€;,EÌÓ± Œˆ²<Ó&/xÒ0Èȼ>©ãŪ® ótºÅßÖÄJæé šƒx÷»h.àü6BáSOú)q|×ͅ7ô”0FM9áӄ֑‹G¦](Bâ´Ñ†Ý…oêuô4e·Ôø>šiÖ°&·Ç7JQœÛVƒê) ¤ožDZ(Èé¿;ç<bøkÜy2¦2˜¯›îeºt ;ÀoX&•tLS©¤³håûw£× lŽ‹"È#ýâ2"oi<@ºB}N:Ëþ_#æŒtÎpŽô®\„YwöŹŠLÌ`.éÈ£¿|(ýƒŽ0FÞíԚý ¡Æ'ìù‚®ÐVšª»Û‘§ªË̜²T‘\!žÒçSV/p…ÆrTG -T³ö€ÐN› /aä°T]"&Cß ÄPÍn֙øTÝu=G®7çîàuWHù2T½/Ð7ø¦êîòƕ6õ&ÿ²T‘o Kú3)ªhõtwç²Ý wµ#O²†VƐg§‰»[½ڗ ¦>ÑâTY.DÙi׋º?Jêʙߩr”Þ J^žêd‚`¼Iœ9—ÜØOqÁdÜQz†a.7÷㸭‰ÛØ?}¾OOPµ;A°Ìú ë¨ñ"vÑwÃ6šêõ8šA<úÏë+ú‡´Í·ŽA¥B«´( Ýà *% -VEÙæ;øjx¥ÿŒ;PÕBluÞŖ+ -€i ϓî¥×¬SôˆV@õÎ#ÚÛä/ñc6vÔ,.Zôú`Lª§ þ€:íóø+‘Ó$rå;/k‹hþy½©Y M§—ÛU_Ò¸¹—š*øÎ#UpS\@¶‡'«Q™ëвQÉx΀Pùà›ùÂè`̔>á–äwæ =<~œŽ`֛+ž‘Œë<¢ìÇ^…”¢Eú:¿TNvY·ˆu£ ¿nœì~Ñ ý†C4Ó©Õó§ œì2ÎùÕX”KÔéTSƒ?WP)+L‰áTDáZ0åz t§&'ÐwDT~ -®X«QV¡ÉUÉ¥ì±GƒD@¦ ”‹^¨î’x••QI -q=0T…³PÁß$d o<·…Kdb;ÙØ΅@sJT’šÙ±àûIdf»bÍWÉø#ªžÖÐW,m†Ó»â16ÎN£Z„+K„¼•,d_Q´. - ¨[—Æ]‘³’˜7±fÄü ¸ïŠh5dö=ï cC{]+\%»„È(I<” ÷£ª H‘®€÷ñF´ò CiÑâ'cæB W¾«ëcæ2všpñ3Ò/FÞ¦.ø”¿™~®÷Zrö‰Ãúû(n/Zþ¤¶WՆ·`mQZ©-Ïñ‹Ò‚ÚÔÎB% çþ¨È‘3›dkì^¯Èrgsø;ì¨"ëSúeÕ"ÐзTd¿i!äòÓ¤ks<°¬òvi[À|évvO۞èPvšÐ3»{ù “Ù5RÜ)”åæÌ@8o2L‘†¾ôã9í\Y¤ÝÀoÁíMÚM>˜Òi>C»µ.·¾UÛ÷’µ)j7a\àšvkmïÔnÂé9?®]k¸¯/VJwiË„Šk͑Žr ŠÔ¨“ëÍq*/Žœ²ÁuöGÖNjÅ1h²q‹#G&hºÑɐI4L–ôO¢©Í_=©Y\j‡œ}&ï² -¸IMÏ+[xÀ—¸3È-±G€j{`ž‹&šä*²»˜æU;šŒê”u™À€¶Ô»³2jºCºZ²N‘ŠŒ=Q›$łhóL´RÉN×.Z¦.’1TÄ¡eWª®’'§mû’`ß6É Ó)ÇçIm6¬Jr€U6·lÿÀÚT˲ -¦uu†[ì¹DÇN—èwÕ1L™i?9*eúV -ÀI†Šf)F“å'‘Þñ§Ç<Ô&3””jzn/ZùÊnZãaúev&3}|iDßI–yœO˧‘-ÝçSÆòÁm¢§Àù”±|€Ìsà|ÊX>ºx7œOËÉ<׌åÓ\@ï„ó)cù4ð˜gÀù$¨VEÐÅgÀù”Ë!2πó)cù„ŽÇp¾K ËÇÙiWá|ÂhžD͕Ì{y0Òþ¦6ɈA³®åŠ—·ª@[ë@^èIߝxÛO cq›n -¿oÊ_WØ)짅©ûYu ó¹Le8e - 4U)B…Ú®ey]í!mܪñ©î¡”€ŠæjÆ•«â6É¢" ðJ K¡MbðR½ ¿§Ní H.ÚH{Ò÷Á¸*b¿\6¿„Ñr)&äs6ø¨4¸ùpx tîãE¶sütž«°;aÂå-¡DN !ìîH3 »“ ÉH¸Q×`w÷䗈U'àBŠ ß½ê¥Àªk ÜV›G1!¶¢Q„Y˜Ú{›þšgµž1›Ô'‹{높©š7^5,¦P¢RE †- Q7vš(Ö¦"֍`›0¢’…Œ!Eƽ›^³¬ÂRw F£<Y<šÿtÍƸS88ß xNÞ¬x“PSháǸä1rsYŽ¼™-¼Ï*eÞWj"̨òªÈ¼W)¼r‚æ&L¡(ê©^"¦ k»‚ð¹¥a;Õvýƒ[j“ßû¸‡iÄó˜æziÂx1uॠ‰j™ã y L•™›“…‹æˆ‘ºŸÇåI™ë”-ÀY˜2 ӛb_Šg@)`õ$<,ëÒî¸×NûۘûÜħ4´<«TÏ[e¨ØErÒý¬í ä@ÂýÔÈÁuŒžL›4bœtþÖèR›X‘R¹¬)°JUôæzJ¼xžB›.N‰œÄÑ‹zFôæ˜ñpº˜K4镣7üBe¯¢ðHôFø)<½s›RFÔãánŽÞh¤ ‹…óÃцãí§‹¢ê·aÕGoä÷ VP ¤¸—µûB†´óҐÞ‘!}%W]!]T‘:¯¹Ž V_¯©‚«~¶sŚ>ãà çw™¥+Z¤UááÌ·§á]¬7E•ÉW!~‚d·vÄï+“ !~j­Ê?nÑã2ºîM;8?ùóµø-7“Eé€@aŹòà·+V> ‘/›ôô82É³y8mO™we÷YÈ<¹´ë'#óL†U‹Ì»š ûd­¡oK;–kŽ|*#ãªD©ß‹Ì»LµbŒÐ§"ó4Rg©‚ÚžŒÌÓ¨9Æàqdž`løiƒÏEæIzkrûBÙÖöÀ¸ä]$ªN½Uá*­N©— 6ñ–Ð})ñ–D]Ŧ—2^ª©>áòJEŠyÈê7‹QEBû†æðì4TÑÃG Z.ve3ï¯j7åŽEùÕܾ§â|$?¢ñ|$?RÊ<äMF ïz*IÄÙS`Y/üðh*´q/?ƒdušl*´qÀõÂTO)gK¨Ç/>å¨cT‘Â|Tí⢊‚Z>öª–µëÉïÎË&›Øݺ8çÚqn¼ª4GO‚N^$,Áß®œH¥ävk Ù±®&{>³Z¶Ÿ -’m?$Û~HIÚ@²¸Îþ,¨è9 YXÑãÚÖò,„Ñ©;蚣“Í„Eá(Øó—(Ëfx¸œÃÃ#󑛌”§ Óž ÊC:íz®°›·{÷òcóTPœžjüAy·úžw‚òÄÁûN節òdÂÏå)ÄÓTzp“£‚Žb”‚F|>´úJ˜sqËé÷—vÚÅÁÉw «ÚëU!Užam§+ö‘z˦+>Bù– ®7œNŐÒÉÃP±;Ek ˆÌuÔµ¨M¢ läĂR•Z.8ï:‰Î ‘ (¸F¾¦÷ÁkÖëZ`F•´v¿}¨µC¸Þ*Ÿ®µµ¶Ö ¯[oh-„~z‡ESZ{qèÁœµ6#Û5¿ÑL|J»3‰CtÊ»{wb|N pG£~Ë¿&V»3Môµµ úÍü¡Qûé2»,U,“ôVd¨z_Ø, °ß@ v§õÈSÍf]–ªÈ(àÂÚO…kåªñªè -½Ð¦ùÆQÕ\ÞSo[vrP´®ìn‰ÉR… Aæ3'ö{];[9ªcªY,(´:ÅØÆeáE–ªöãÅ۔ã°Mì§Ëä ¢¡…S׎è£OÌ癪r•—¹¨½‘QTW‰hUTy8×üca¯/LT0ƒ7 -¼n3‰ÖX¥˜óõüÞKãöÝð#ÎÏÇaïí®æu^XäïôŠ+ŸE}‘Ñ%߬«WÔ(%ð\Üg]¯'u·žFæ˜ë±(ÙëõnÛ½uÏgj¨.•ÎKå*ݬw5wð©R¸YO¶‡’û7ð.¼k­¨íáÅipw3^EÆ&“ {½YW²Ño˜7Ø¢äþPÅ*þ¾…š[ùTˆoöݳ¹ Ø'å%ðÃvOöI¡úD6ô3€}RQDÉyó°O -Õ§yˆ) ì“ -ã+$øß ì“Bõ w -Ÿ쓪Jsý0“[}2™ÏöIíóVÏçû¤P}+û¤B2ÑÙvOöIEéù.}R& ~°O -Õw‘¥ú8°Oj§ÄOöIµIsypó£À>©1䖵§û¤ÆP&Õê`ŸDU±-ð`Ÿ2båiÀ¾™v/°O¢*â©Ls=È´›€}R.cÜ>Ø'µèk(Ô÷3}RÐé£ÏöIm¶HdÞ? -ì“Bõ]º¸û¤`l⍕'û¤P}—ëÍÃÀ>)vˆLõgû¤|ċüǁ}R¨>ù”جÇ}ÄàùˆB¦A€Òs€j¢;<¥Ü(µè+µzƒ19ž{‹ŸT›®˜÷ÜâwÅäPǪ«w D•á#iV}É/ê7ɍÐÈñ%›%Ѧ«¸zQ‚¿Ò•{½­›ÛĤŒÀfÝ4±•Út™›¡¬lXå½I²ËšÐerék§Ðe*ˆ]¦ËÄnùPž`Y“½ÿï&ðœT -†(ÏF¥½~óåJʆ»ÿï‘Ρ+¾'}'¦ïG„nJx”í$sýþ¿‡/ÿS„|øò?¾e#ÿŸ*¼”Ò匲Q¾ÿOõöX&^¤zͦÁ©Æˆ=ã±+>)ý tîh¢¢ªü ¥Ó0}ÊŽj¤Œºëjð^¦ïZ¦1sõÚ>ùÌÕð8tcߕ:uIjA>u­â¾1 -v iªË®|¹S­d6Œ`Tÿ|ÙeªhªûJTYmªòž–j…Î&x\ÒÏUΫ@Ì'줠ZdN=çD@eE÷­âÄ1XуS‘®Eàç -¶WoCÚSµ]Eû*^^/Fû~ÏMhßïù•Ý(.z¦¹v¼!¬MÕýȊ¬²µYT)6Þb&ËÍú¯ˆ›²cÃw6•6§€w™²Ýç+}¨ª¬í‹|”;1Íç]îؔpØ6e!·iÖöN…F Ä´>lc Z”ÓGo©è ÇP=zÃ7uSŸøÉ/#MEÅí›ÅÀ&»œà7E…úàýC÷þñÂÒWÿÝ7Å÷þ©Òißû§hªCž?çÞ?†ÌÃ)CšÔ¹¸ßûÇ.krWÿÝÞ/©Ô@QÌF-:åÖ{ÿ4WïŽëÞ?ÕÇ·g?öOÁ—)"VnDûâº+ø\Aîà5´/®»÷~yˆ9W>:Lóz±¥²¢ƒ_’QTÑãhß6—DuÍ[»^‘üÙv¼”q }‘µsã-‚\â‹¥ºÌځ­¦òŠv% Æ)Ð{X*•@ªŽh¯J¼¬]ÃR]"Ó&W¢} þF –ÊùR‘“(ïÝ ¦'¨m­bzªRuD.þC¾çð H¥ao`–=:ß,F ’U‰¥Rg1NŽ"‹‘"~~î6ٙ¥—Îå¸w›r¨IåŸy¯€L{ΩZ Ӟ†»¥@·wZ6)‡dHS6ž©Q¾uq¨þÌ'™‰ÚEk F%û:î´Iñ”Õ¸[nG=å_I‚ô(•Ž‡qÒÓhÁB^‡¡† ø'®µN1L!œ¡ÃU -èÙñ5ˆH`äGüõÀŸ¨ | ¡®¦ÓÁ€Ìý:ƒ,2ïp9äñ€Ö0±¬ -5´èj:ù[Ýݞ -ñ—¢ -ç D\¼Õ¥ºK]M‡†S9ª3<à[².Œr1rǗ¯¹2ϟ‹îõ?l_EÈ<³$ΚÉÞM|˜ø¾ö&CÕû¢¯ý9< …}äÛiB âÑ-O5kµd©ç&ߗˆª†½ /¬u(ÁKFYª‡c3ª•¥ªÚ‚Ä1@x`š€>уaNõf?jÊ Î?¿Rå4½Êõ¾ìd§rµJÏ-}ô !: ‘9ÊDoL?‰[°2çƒüšÅ®|*³3MLo;Jýôµ+ÔÔÞ.ön̈6½®e#)\(Lܒm¾PhÖ ‰[²{eÔôÌ(Ÿ!¤v—+-›µ%ŽÜªˆ;õÓ²‰[²ÃÇw šuSâ–ÍòíúÆ åP›×Ó®oºðð1D¾ê UÝSøø…‡Ê· -’ȹðPÌ«‘ÉÞsᡌJßv(Îå¸ûÂC‰D;Þm‡¼¨{Ñ1 õ:=~á¡òm‡Œõð…‡Ê)Þ"ãöþ …02q¯5gtÝuá¡2لËG/<¼ªžsá¡òF³æ¦{ -ï>o„·'ý؅‡‚Z.,ü{ $—Ê@.Ô¥öÞtᡲ™OGn¿ðP -rÁì.6$ï½ðð*hI=JéÂCå½ëË´„;/<«ðé{Mõ‹ •káº$*zøüú¶C…$òÛ.<|—ÞpE¡Höþ •o;ä6V¼ð'd·Þ£Ó$/il˜‡7»Uª»t_ÝæŽ5ì2ƱL²˜Ä2‹iËVÞ~Ž/ï‚iµ4Á螴Füo}̙j!B²Š‘-ߐA÷bÎÊÜ&šXÂi$¸Êpdúᢴ¼Îq«Ÿ'¸‹«5‡ßÜZ»Ó؂Hà4ÄýV´ú´??‘ZkU—¤°À֍»Ä–+i-ûÐ×ñÞO‹væ 59a…JT[Rx(µ;qØ/؛x¨¤= ʐDÙ>Õw¸m¹Œ‚O­=rÿ1çZç@¯»ôŸ†™NôjHýé{noäÌԅ¦ ãÞ -¿ZÑW86Àb±Ã_ìt’›®èƒ9]ï˜Ó“Ç?ÛÒ1Ql·?±Ü$ßÉ Íý"nÃ~GL;‹kÚözΘrùÙáOU;?@¬*Æmªƒ*5õ¦øC iø4WA_éz§½>N\7cu–ëkxÚ°¡§„ÙdÓp°d0³Þ›ú+i ˜ñÖÒóãt@‚)ùFîÑ¥éËêå†Sª>$iwW‰ñªÄ/Ç°µ:x£M÷[Â÷93!­M˜{u- Cm·O°#2réÃá’%Â|ž­™Þ·mœXé\ÄsP\J÷ò8P"=­xèO›&>ÁíÕô¹?@ëAšÇCú±„ãÛöPu {qXeρ.Û"†`ü£Š†ç]ùÈÜùbšÓ#xÍ…fß¼éÙs[ÉV'{3áõfÔÖ¦à<¹bS-¹q,-‰÷颔.æµu΍Ę{HSl˜ÄÀí¥ð£I×ë9?g¨~:QG\¢é¦€!Ô÷ПÒã[ÎE—ký$ÄÍ©¤Ÿ™ôF7…ó¦Öø0’{¼ ì„RàOϑÓÎK) ë:•¹{µµç ÎofÌA´G½¯©sº—™wÒ/³3™ú,¼äÈC?<ôl&±-yøl3}sž˜VG%²Ü·À²ž,A€~‰[Ö¡*0Ò²é)ü°ûž@…š)µ:֐°2¥€êŽRb$2L] Yu®¢ù(VøþuáSý1NíIG1WÒÙ.Â͘5F^|RʛÁÌÜtáP¨((ò¹’þÏÒíEèä$Ÿ|iŠÑæj0ó'Îu»W ÃÓ¯Êë…E]‚;ü—‚a¿äß¼é5ÔeyxyÇ2\0"Ý:ü*F–¤×YöŸ¢ød¹Äœ«÷ }# ‘þIV¨B§ÏùÂY—á°íÀà‚`yíÇ sÞU¡6P@>ƲÙûá'ׅ§$ (_àjG46ÂRC„cóׄ®žRoÞ+ "ëÒn‚ž78ƒè€rœE)mŒ>I„².}êŸè –ªM®9.ƒÖ[t®²M] u%žçrE„L{†ýÂ.ñހ½a»FõK囷¼Æ -´ø%ª÷ôï@¸˜šYF´;¯Ã­ë|Šêð07Cg°8fWJC¿8Ð: å€òCNÜÖÒ§ ÒÕ®R”ÅûÐN—ÛepÅÞ@cû¨KüxvÐIQýD¨˜9Ì°é¢$Y€m³¹’ó;>í¿•è—–ƒð…áØ$Â.”•Ó°Bg‚1/UËðæpXè¿IÀi/É#sËk¨7„ÍëzYÀ›£F@ø&Î0賆ZÉ'xÃkȲ¹|“ƒƒ] 4ÐP…E½„ùǕsFŸ!Ȫ¼s5ÙU°ÂñÔ¥ÝéH×Í9»¸%9KSñjèø ˆÓ/1aZöãx¶¹Ä±Eê;ō'7· Jƒ;õc`ñÁH(ñazð3A óZÀ‚ÉÀÅéĪ˜"̯Ú"¿°9-wA_W1©ÂPT—×ï -Àœø„A½Æá- –ö5*—Cõ›8Ýõù&jÖM¿fi7Øþg€Dä<ìk9WÒ`ŒqL»õÍ[xÍú7R‚ª¬e gæ F.2z00ŸÒNÂÜO­±3´@)å2¼å€É±ðE€òšsà*l1teA¢#†³ €É`Ì`…lÄ*R0F¤0—¨”Ú"|†óÊÅÊhõ¤ÙUQž76t—ô ¾b¡‡”î×|·\¹íÍË×xˆ–5FTh Ê m`ôã~¬ˆÏ Ê˜å€©ñi-© JوGŸKI^¤?1º8½!µzràaB´Ç*wPµõMMíàgÿ™*o˜ú‹"[‹h#…»ÃvjOùԄ)Ðuqî}MêÓLSAèUtò*À3,΅۩²æL(‚ lÂ&‰b’Ε-E1Iæ·Öžù­{p®*¿V.⊵ފ __7lÀ÷Åu5ô€Öpè§ÆDuÍøì… 27ßø›(r -»„ÝcOm³Äۖ1ðQ­ðw v¢fS¬¿¤ÄS£ŠÆÁ嫬éCïˆ3©êhªÓJF“u‡ÿ1ç!¦u´['I…ÛÉ./€‚íž/ÓD_û²ïÎR-â;/èhŠ^|ÇÈ2¡ÇghÇD#Bñ!îâñá5¬1|p;9>Àæ¬yWš£}WE&PÀ˜õ/ÃË«v–4Uî,DUL@ ¼Ú ïa-Ç­ûØ7¨êª3$ßIs‘eBîÓ¡ûn2LpØ4è MZøøˆãÚÌ02ˆË]‡d ãÞÂI$%ª„’_®³ÞÔ@梎 ÉöXGR»hj1LSߑfЩvD䦧-p²<"ÚpÂ*U £–p£Â~­#ãðW«¿Áý‚­oܶKa’QÉM§ÃQG]6—´²GYZú×^È´lro¦‹Â³WÙ¢¯î·ôèô˜¤Q·*="i%·CT¤¤)Ö1ˆcKšñËô˜¤a¿f9IS]GÉj»*%ü -8Np’6ð‰z7QÐX¶”v}½ŽlIw}Þ*TÉd›¦ÛáE#in²€ëòˆd—î«s_¹» r<éHNwªMf#_²#9{æŽ9¯À[¢Å´»æH.V#®4âuâüE:ç>9ša^“ÁëcKÂdiµrà/ҒínÄ¿"Z¢F2âvLõ>ûCb1µG"n2LS±4ÑuxSò“]¥êœÆò1þ×\%ÎÿZm&è-nB¶¦(Ço×NÝé˜uØIŸÇÙRê³l<:kí¨ÑWìÅ*Ìâ{0ÀÔÚ?ȶÖÚ3U´6slª5D*=fÖGmW„Ë_•#ÍÕ¢¹¸R6ko…^ z5 dÁÜzÞÁ®—‚ô'jÿ;»¦_€s™ˆd×JÞ@:§6Þö¬¸îZæìVè5õ{›‘`*Ñ4„~™Íúúñг™Ì é^¦‹ ¸­WyˆTcÂ;F¸Í,‹¡¢¶êéÍI>½Û+Ɨ<”'ÝÝñ³f<#ß«‰t7¨î%>l›þd¢·úL³&ë]£Ý銷:×G¸UŸì¹r|oãX%‰ ¡ù‹@ hÓyo€¾ cÑJ sËU†w)Fz¥vžŒ‘Φé´ùÙ£m¥Ëq9·iñ¦(2Ñì§T°ŒÓ©y—ï2Ùvª^ﬡ̵öŒüÖ¨7M 6¦å8Zþæ_ƒVç›' †}—|ØPöƒ}!†³°_;b¾z<áJ”CzäP’Ly3cE¼Ÿ±FÏNø»²+Öt»±ùº™ Ñ L¿`o¨®­Îè@©“±ØÝ1±‚úN0yE½ñØeHœ.ƒÅB‚A˜c(ÉQï¬[èBKW"TóÁLW UDÈÃÒn—>p¢ï¦އ ÔfÅà‚Aw]úYàï¸,IPs> -¯Y÷!¦Íôà—I>‰6à¦}ÔqôBñü¸¯æ,†-L57xÀlõf€ õ0Ž•u®l¸Ÿ•wSÐל‰Ë+ ÷=íί…; ÷á@ËÖt'…F¸YÅÏ«¤µËå~*w¤òŸ6Œk­ç`оš-º1WÏG›Ÿ½ÖÖÔÁSã»Ö0^0q­Óû:ðÓüԃJ´¡µûí-øµE%¸éR —§¡N²¦È1âéó¯¿È¦l\¾­&;ýO=D»“=_¡0Ir*ÉPŠ‚ѼTRH,d€^UÃ!•¡\þ›™0éÞ2Q­q×4P—yèÓ¾ƒÖhÒ{´†Qà¤âNp£Ô9(PÝœÉÙkc@,«w¤ó•ì· ÒrF¶‡´ Ón’üÍOfm¡ËQ¶Œ“2ÑA¤+ƒ³^¬KçhUž7† hã/¦ðÀ´Q{T:"‡ID!v§0¥éF0jLà òe=< ½ŸFÐt%ö9Ò0Ðæ*ø*½˜óáSN¨’xv¯wÓúx¨cÒ®Ek@(YkåEø2bDÆÒøôU›cÕižu¨S§”ÉÁjԙ±G0è´²_u™±ŠRâìë̲ý¬ÌLßû¸Î 44Ô.]!ojU6ÌÙg¡äÛ+EQR#=ƒ„ëâ·1ey¢ƒd†¹Y -+q˜áÍïž Ìö†Zêb–,1œf¼€Lٍ´+Üqñ‚üp &`ëàÖ?n™u' ²²8ÜÃ׃ÎÝô†¤Öe(/}@{{ 0!-@|ž^ƒèM¨¦#t‘P?7|ÌY!GxÄۄ0ë;1¬húÉSÛÖ¯ÓÔ®MXì9çj2@Ø(аœ¿#¸ý5V§Ô:Œ*_ˆ,¥ÛSÐÀ® ·¥*@–¾,eF±»Œlò•3ÒÌñW•3«l î¼Mk茵B˵AåYE<ÔÚö»Ì%ŽÁ¯M­m8íi­Ù}TkO¸&P%'èߦŽ}õP¹óÁ©i ˆù<5}ЊÔô-dPÓì²öwÕ4µSÈÛ!BjšxXMS)ö¬šf<•jÚ|©¦%’G€‘$«¡‡ÞVXçCðlt ih¬PùhÞ¢¡qè–$ўÈbV§¡aL–JºÏàihÆæ}‚Á›ÝÁÄ·`²Ž´ÀÖ…ÁÅÁe³ºD•qwœ”ëLe˜2é˜ÊQ°4#ZxÊfÀ'¥fæ<ÂÅ¡ƒ®wÜâù>9@T¿ (bBµ¶Ó³P»{í<¯0ÉÙCYñ=ÌZ#ŒA†~"P‘ YÏPßûàW„µÑÂOA@áõì2˜+>àDB"…ÍKg‚ºÏ6wn´‹k!KP]'a^v€ÒÕÙT)A-ØÉÑnL— ›ƒ0@@ -$bƒZۋgK¥0´L†JÏCI‰€Û,Ÿ…/Q·‰šÁW”³à(€·‹{Š½OC< ì`{‚i •¾“Òß6"Sgv~mð6ÒÕ¶¯U^7„O߀M¨ë\¦0ŒÜ -/‰»X.øÛÁék}{˜<Ü<½Ÿ²šY½…Në²,ðŽòx«•—ÄMíØÖé ys,b¥:é9½ëçÙÏÞ¦Ä'7þ?|ýni f Š`½ój ÖÜYôŸxÀ/zRtª|X¾MO”D²o ­dd@M+Rl<ˆB2æ왋ª“I$˜[ܒê÷`=îËübz•g¢ƒ‚¹ÿÞåÅl³›¤Ö áCij…MÈãŒEø*y-«6.!¥ìÑB@é{‘:kùù*‘ÊÒäiCÐL50ÅS+¥ ÆE¤ì¹îž’偞f‡¶D%Ώu 'gO!žµ§œ`íõԉ-Òú¼DÌFǙ²hA)ŠhZ³¢5èógXà¢~(æû…Jƒ{+F°èÖìaÄRfõä)›ÅИ‚ŠûpŠƒL4"ˆ4.´‰C”Á @ËÙ ˜ûu†›=Râ•á§lhÿ+2a¾h„)߂ošÎP%®Fhð[Ôß CUïÙt HÁìõ_t%F_*`]TÌ s¦ÐEQßÄeÌbx’ÕòPÅ× @E°Âø‹«xæd“ -"θ5֓³|)¾@Tuš3Û.O»FqЬçi'l»ÏJ’ÄúÓ$I4ÒÉQyšM’.[Ýp¿›­ϱŠYç•lDøò”ø{"ƒxL9"¬Dæ‰a^8ØèêL{bDùƒÜPQ‹ôa«rDXf¢LDؽ¿†éj2aÆ:]ö£Œu -m‘Ï#ŠÜJ¨òª3S/-”ê´™J6 ?_laScè˜JG«ÿf'¦ þ-Å\å쬙‹Ã43¥0秱Kd"S–ÍCV2êœSÙD¦D€³’Í÷ZÉôútǜ«G*@GšZ¤ë;xdjÿÂ,ª–ÑÆeJM¢ f¤&á³™¹0^ì…ÈK\6TLÅ¡éh±+q(±Ep—å…Še­çj¨ØŒáÖ5XIHó8̨ÎJ’>eù¿RuƋÁp.Ч†@k´€®ôGé^ê§_4É<ÙNžÚ‰œwôf ¸Êcw#ךÔëê€Â§Oúç§BaùbVOlÇ]pl@•î][fغ(«œ8Åz òâïòµŸÆ4£°ß(¸,ÜawrÄã½Màƒ‡Ü* ‰ÒdhWœÁiÓ8陡àD VÛy’vsÁ_ ø³™D5ÕGØNðz$w8D#ÐÍz#3Ízب¬2|ì ÔÿÊV#sTÔÓÀÙ`ÕÚu6" -'4UäT/‡u¬ËÚè -:Ø Ç4~Æó›èÄ -ÃÃS6ïº.çfÅ'´[8¥†14õ:- 'SWBJQp‰Ôaðé§È€/`|"A0 ‘Òçƒv æ«FŒÐسDºowÑ÷K&ÏÍ"µÂÝÏÕü”Q%t»)ŒG܏–fx¬ÿù ÐìÆH—FÚ';C%¶ÓZ‹PÓðê ÇΙP$‘9®-toиÎFï® ¯) çì›<86ÿ쇨›e• óÓØ3%DÀè)ûÀÎ0ð±hú"Gð Ë2Á¬àcPp͛lÄÂýÌ?¸#›²ñŒõ©ó °ïÃJÙ?ßg𠆣œ"˜!ӉªÔ!põD­œ,­7UzÉ*1H«i[yKAñ¦ö4¯ªNúŠX2¨ŠÓoT›¨^x{ø­_вzeOK0ÛÝиmðx#Œñ¨=¼àUø‡çC 2¹Lø‰Uæj)" -C2ÙϞ™¨Ÿõ+²7{DŽ çˆø<âôˆt.F–nþa1+/m;}âD53ºÚN$ó”Õ 7 &Ÿ02ßƹm£ut ?¹ØOnª2ôô—§GW ìT8,=vÞô0ö.h´²Ç9ô\üƒ(Òk=홭¿=LozޛN Ñ°(<îø”OÞ!-PéB¾~‚?Ý6ÌôøÄÙO¿\y醿¹E)#t‹ª™Q«›J[ýæL†,·üôtúñï'èE @ÒC§ˆœbúxŠH—:èèù„‰2n_, /;M•wá¡ nTúê`5¯^°¶‡‘f+­ˆÁ\â–ÓÝ" ‘‘0ƵŸpl ^„ª žön¢Î;W“ƒr¢Å€"f äPHŒv/™3"è?HMÓPD}p!àŽn cWш•÷ÛX—Þu4…Îc02YS§;´*_+—­3ÑQ:èh:@ìƒ[]Ôá'Ð=‚Öï²Â7·—nùØR¹©ôÙ -†t_uf› ö@¯ª{û߀óá ¸<Ðgí¼™*‡ÕrõûǦù'¤ùǙÈãxów¶ÍæóÆü?Oéíôü3ÿ=ý þq&ê©|ÞïIϧÛÙüu¾ gÄI…!Ú½uÉÅ»)‘^²ëÜK-2N/°nT´_©5î{¸Í/ՂqÿWÌîSÑ~Sîhƒ_»Z…‹þ\M€ŒcËKz~HžIk¹Ôi;ä~F,4”€£5¯ÅÇeؙKôŠÈ‹;Oؖñ/€k*Ž«U{£OûpS#.À-æ7ØÃ7ø w,fp'9wÓqU¢³ªÇüÙÇU‰ÎªB¶²ŠãªÆ§³ ûÌüÅõA4­¸•Ì-Á4v3Æ<Ë;ùG«(Ù *Œ sz•J»šr±¦|}s•ÑQ§à· 2Ô,Œ»š^ІŸží~ ;*`|ß+NèÌØÐёàkÕk¡ÈùÞw±‡TYy… -언³µF¯¸™–vŽÃv ÿûê®}"3·ëÃ÷GW)UÐR]%ã |÷¸qÞHçgíe^@ƒ.ÆæÍð…9Çjìf{?æ Ù¤‚Ô±Öؓ¦“–þICg+€O}œ^˜&"È`¼&cÚ¢¾Ìܨz|×5T¥@ ¾v˜Ã™Ö}Œù4àdnÂ% 3ïÁ@ë2Ë1*ï™S¹Ö?^žÛ8˜©/o¦BoéÉåVp¨uË­8uüy3¥Eæ4À d.Ácœù4ã›Òїӷû¢9žS+c1GC¾–]WΌʯƺt†GVÈZá_Ÿ^.ÒÁS˜RP2>¶ÂÞ(Z ,Ÿ(Tš¤­5 †lw´æ·ž‰V¢çà;T°9*‹Ç¼ÚDµößêT¬á&¯¼ñ‚&ú[Æ ³ú—¾Nû‹Æ ²\¨ðÜ_5^˜Ç©óQ¹ƒSiaÊHr*áé:’\Ý/ø7‘ä,á¯"É5Ô °É¿Œ$§“)´I®¹@Bþ$¹⡓ݾõï"ÉÙ使‹$g’÷þ2’\Ûû7‘ä>Úîï!É5m§þxƒ;‘äHü“‘äšû ñ·"É%¦çß@’kn*߉$×Ê IÈ 0ù_F’ËIړ‘äò’öT$¹”¤ý$9+iI.’´¿…$×ÜpøÂHr ‰ÿ»Hr ‰ÿ›HrH‚Éÿ2’\sÿ$¹†ƒÄÿM$9‘þ‹HrÊN»†hIÎh¿Œ$×È@⟌$—PIÎe9ˆ‘ä“JÝun]ûŒÐ70ngù—‹§qHÀ±Þ8¨=z÷³‹.k Â;Œ_N{퇑ù„›Ð¾íóΒ†°'b£œs¶_S浌“uñ!–¿yiübc®[¡ìƒŠÈìRKöÎ{ì¥}ãù”-{äÿ›ÿ`éfµ‡8µ) U•R œoô–¥p+ô‘}PJ Um…>²J…Tî[Þ¿ªùGõVè#û l¬óúV¨õ}P ð¿¾úÈ>èÅÆãÕ îÚ¥$MÕVè#û ÌVÚh❡D¤Ónˆ&ÞJÔüs[4ñÎP"?5DM4ñÎP"•rÃVhFGó8>$güÍNðó+ø©>?w¨ˆg˜œ/W¿¥ñ¿ç`¹ÁÿPÿ0ðþŸðÀ UøöÇ,M4ÿ˜òÓí¯ùO &z ‰Ã)½šžVÛßñáß‚è·N¹Ô̧ÿÿÐECL 1Ø”¿›Ñë6q¨ùû“€:ÿ‚Ôá_Œ¦~û7üVŸ¾ÁoÿúƒcÊúŸØŸ™<¬iþ!ܘ#àýc'|¸#@ø|€Oãö<J ™oæ?M¬o¶»ùð°Z~dZjÂ~Ûåó˜ÿ8ë§ÃêwùǔL&¦€¥µíi +ö ÿ“Ìñ¸„ÛE€æ¿÷ÃÖ^ÜáóxýàGð ÷x]·7u3_ȶÔ~_Sþ'vðsþÁX!Ã2ÖüãòøþØÝ~ŠÇ/õ¹D&Ü¿ÇáwTwù^ó³?Ѕ*:™\-©ÑN·›óÏñ¡ÚïrA¢€£¿ßø샭rᯠ@Ê躨4ÿ3û¦Ê&ÖƛÍ͍Ä].–ƒ<2üó}}²ãqyqö—sx½H®Q5pÜ×Ø[Ò3|Ÿ¾Ô4¹”¤•ÐHEØíZãi LVk$~i <þù0¥*oõF­™jä+of•Ú„WÅpøŸ„ȯüªÐ5Œ–QRԏöÇ sC`Ž| }ÿÌó¿³ùÒ?ÔOÛÿÙ`kዝÈMZ 'ìÌ åž üZ⾺@r½hLQiñwºø/3N+Pùœ©íïbõ &=_ØBâö.ñ{Z7«ñê*FŽÛ,§@[g ALæ?ð®â›8…+qŠ <¯Çõ"îwàn1Çá“ÑDßÔ&ê+æò ´¥Ï>Џ„Ëëp{=P…b~‡ i Q+Å én2ŠÒ¸MQ>Ñ··à±1!”ÆÄíñ807+•HåÐ2†>óä)*ñÓÿãRéR亃{€üx] N©Õ:ì Œ€úw9<­Ö„s`@·÷Ñë ÆóBƹ˜Ïƒdõ²VE¡ü/—Éÿ»"éV Sà1îÁ©éN¯š.æð`žÅs ‚ìonÁoÔ{nÄñ‹ºGØ>Ìðþ—Â­ xl<ŠÊÚçBv‡êW?Žá”qåBS˜”îõÝM™!nÀè€à7ô"æ§tÉEmÿŸ„´ýôú>^·ñj­§åqüó?cÊ´™ïÀ£?ËÃü†dþçøµýü¾Ä¾<¸JFóÏÿëHM -endstream endobj 8 0 obj [6 0 R 7 0 R] endobj 32 0 obj <> endobj xref -0 33 -0000000000 65535 f -0000000016 00000 n -0000000161 00000 n -0000036442 00000 n -0000000000 00000 f -0000038583 00000 n -0000038260 00000 n -0000038193 00000 n -0000172001 00000 n -0000036493 00000 n -0000036872 00000 n -0000059600 00000 n -0000059487 00000 n -0000037450 00000 n -0000037631 00000 n -0000037679 00000 n -0000038467 00000 n -0000038498 00000 n -0000038351 00000 n -0000038382 00000 n -0000038718 00000 n -0000038743 00000 n -0000039206 00000 n -0000039476 00000 n -0000039545 00000 n -0000039817 00000 n -0000039920 00000 n -0000059674 00000 n -0000059870 00000 n -0000060879 00000 n -0000063054 00000 n -0000128643 00000 n -0000172030 00000 n -trailer -<<79573FB5A12BB140AA20EB4EA35A55DA>]>> -startxref -172217 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai b/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai deleted file mode 100644 index 8ea0a6ef..00000000 --- a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai +++ /dev/null @@ -1,1213 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - logo_blue-orange - - - - - Adobe Illustrator CS6 (Windows) - 2019-07-16T17:01:17+02:00 - 2019-07-16T17:01:17+02:00 - 2019-07-16T17:01:17+02:00 - - - - 256 - 68 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4ql2ia/petQTTafN6g tp5LW4Q7NHLCxVlYdulR4jL9Rpp4iBIcwCPcWvHljMWOmyY5Q2OxV2KpfJr2lx65BoZmDanPC9yI F3KxRkKWf+Wpai+O/hl400zjOSvQDV+bWcseLh/i5phlDY7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+UtK8+6l5N/MjWL23rLYzX9wmoWdaCWMTP08HWtVP 8Cc9Kzdmw1WkhE7SEBwnuND7O95WGqlhzSI5WbHxfT+ia1put6Xb6ppswns7lQ8bj8VYdmU7Edjn neowTwzMJipB6fHkjOIlHkUdlLNiv5i+ftP8maE17NSW+n5R6daV3kkA6ncHglRyP8SM2XZfZs9X k4RtEfUe4fr7nF1eqGGNnn0eN/kZrGo6z+ad5qepTNPeXNnO8sjf68YAA7Ko2A7DOr9ocEMWijCA qIkP0um7MySnnMpcyC+js4J6N2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvDPzgvNWf zVJbXLOLGJI2so9+BUoOTgdCefIE/RnE9vZMhzmMvpFV+Pe+j+zGLENMJR+sk8Xfz5fKnoX5UXuq 3flKOTUWeQpM6WsslSzQqFoanrRuSj5Zv+xMmSenufft7nlvaPFihqiMdDYXXf8A2UWY5t3QuxV2 KuxV2KuxV2Kvinzd/wApXrX/ADH3X/J5s9c0X9xD+pH7ni8/95L3llH5TfmdceTtU+r3bNLoF4w+ twjcxuaATxjxFPiHce4Ga7tnskaqFx/vY8vPyLlaHWnDKj9B/FvpfWPNWjaZof6aknWWzkQNamJg 3rFxVBGeh5fq3zy3W5xpok5NiOnW+57TQaSeqyCGPe+vQDvfPf5w67e67oPlvUryglluNTCov2UQ G2CqPkM6n/ge6mWfFlnLmSP986/200cNNmhjhyEfnyd/zjn/AOTAk/5gJv8AicedD7Uf4qP64/S8 /wBkf33wfSeoahZadZTX19MlvaW6l5ppDRVUdznn+PFKchGIuReknMRFnYPE/M3/ADkqI7h4fLem LLEuy3l6WAY16iFCp4+FXr7DOv0nspYvNKj3R/Wf1Olzdsb1AfE/qS3S/wDnJnzAk4/Suk2k9uSK i1MkDgb1/vGnB/DMjN7J4iPROQPnR+6mqHbM79UR8PwXsvkzz35e836ebvSZiZI6C5tJBxmiJ6B1 3FD2YEjOT1/Z2XSy4Zj3HoXc6fVQzC4shZgoLMaKNyT0AzBch415z/5yL0/T7uSy8t2iak0dVe/m YrByG37tV+KRa/tcl9vHOs0HsvKceLMeDyHP4932um1HawiagL8+jHNL/wCcmPMaXIOq6VZz2xI5 La+rDIB3IMjzA/KmZ2b2TxEeicgfOj9wDjw7ZnfqiK8vwUw82f8AORt9De2x8sQWs9hNbJJML2KX 1o5y7h424SouwC9K/PKdF7LxMT4xkJCX8JFEbb7hsz9rkEcFVXX+16d5C81ah5h8hWnmG9jhjvZ0 uGeOEMsQMM0ka0DM7dIxX4s53tHRwwak4ok8Irnz3AP6XZ6XOcmITPPd5T5Z/wCci9futbt4dct9 PttKpI93NDHMJAqRs4CcpmHIlQAKb50ur9l8UcZOMzM9qsiuf9V1WHtaZkBIREfj+tMfLf58+ZPM Xnaw0ix0q1j068n9Pi5ka4WIVZ35qwSqoOVOH05RqvZzFg08skpy44jyq+75+bZh7UnkyiIAo/N6 X548/wCgeTtPW61Ny881RaWcVDLKy9aA9FFRVj0zn+z+zcuqnww5DmegdlqdVDCLl8njF9/zkx5q ectYaVYwQdo5/Wnfr/Ojwjp/k51mP2UwgeqcifKh+guml2zkvYD8fJPdN/5yRgudIvlvLFLLWYoJ JLFqtLayyqKqjAFXSvz+kZhZfZYxyR4ZcWMkX0kB9x/GzfDtcGJsVKtu5Z+Xn55ebPMnnHTtFvrS wjtbxpBK8EcyyDhE8g4lpnXqnhku0/Z7Bg08skTPijXMjvA7kaTtLJkyCJAo+/8AW9V82+btO8s6 eLq7BlllJW2tkIDSMNzueijuc4HXa6GmhxS3J5Dvet7N7MyavJwx2A5nueaSfnf5hM/KOxtFt6j9 2wlZ6dxzDqP+FznD7RZb2jGvj+v9D10fZLBw7znxfCvlX6Wc+SvzF03zKTaun1PU1HI25PJXUdWj agrTuDv883fZ/asNR6fpn3fqec7W7DyaT1A8WPv7vex38zvOl1putx6YdN0+/tlhSZPrsBmKu5YG nxqBsvhmu7Y7QljyCHDCQq/UL/S7X2f7KjlwnJx5ISsj0yru8mZeRtauda8sWmo3McUMsnqKY4FK xgRyMihQSxGy+Objs3UHNhjMgAm+XLY06DtfSR0+oljiSQK589xbzu+/OTzNb6ncWq21l6UMzxBm SWvFXK1J9WnTOfydv5ozMahQPn+t6rD7LaeWMS4p2Yg8x3f1Ux8xfnVHBcPBodqlwqGn1u45BGP+ TGvFqe5IzI1ftCImsQvzP6nF0PsoZREs0uH+iOfzUNB/Oyd7pItbs4kgdqG4teY4A9yjFyw8aH6M hpvaImVZYiu8fq3bNZ7JgRvDI8XdKt/iKZF5w/NHStDdbWzQahfMquQrUiRXAZSzCtSQagDNhr+2 YYfTH1S+x1XZfs9l1A4pngh9p+DD7b879fWcG5sLWSCu6R+pG9K/zM0g6f5OaiHtFlv1RjXx/WXf ZPZLAY+mcxLzo/ZQ+96j5a8yad5h0xL+xY8a8ZYm+3G46q1M6bSauGeHHH+x43X6DJpcnBP4HvCa 5lOE+KfN3/KV61/zH3X/ACebPXNF/cQ/qR+54vP/AHkveXp/53/lP+jJZfM+hw006VuWo2iDaB2P 96gH+62J3H7J9unO+z/bPiAYch9Y+k9/l7/vdn2loeH1w5dfJJvLt5dz/lcsE0rSRWusFLdGNQit b8yq+A5MTTOL/wCCZjiJYyBuef2vbf8AA6kTPID0H6Qg/wAwf+UM8q/8Z9T/AF22bT/gZ/4tk94/ 3zrv+CD/AI3H+r+pMf8AnHP/AMmBJ/zATf8AE486n2o/xUf1x+l5Xsj+++Cb/wDOR/m26l1e18sw OUs7aNbm7UHaSaSvAN7IgqPc/LMX2W0URjOY/UTQ937f0N3a+cmQgOQa/KL8ldN13SY/MHmIu9pO x+p2EbGPmiMVLyuKNRiCAFI8a49t9vTwzOLF9Q5n9S6Ds6M48c+XQMy8zf8AOPfku90+QaHG+lag qkwP6ss0TMAaLIsrSNQ+Knb36ZqtJ7TaiE/3h44+4A/CqczN2VjkPT6S8L8n+YdS8l+cYbw8ontJ jb6jB15RBuM0ZA60pt7gHOy12mhq9OY8+IXE+fQui0+WWHJfdze9/n75nn0nyOLazk4zavKLYyKd /Q4l5KEfzABfkTnFezekGXU3LlAX8en63fdqZjDFQ/ieMflR+WzeddXmW4la30qxCteSx05sXJ4R oSCAW4nc9M6ztntX8pjFC5y5frdNodH40t/pHN7hP+Qf5aSWZgSwmglK0F3HcTGUGn2qOzx1/wBh TOPj7R6wSviBHdQr9f2u8PZeAiq+188+f/Jt15Q8yz6PPJ60YVZrW4px9SF68Wp2IIKn3Gd12bro 6rCMg26Edxee1WnOGfCX0N+T3/kntO/4xXv/AFEzZwvbn+Py98f9zF6Hs/8AxcfH7y+XLO1lu7yC 0h3luJEijB/mdgo/E56NkmIxMjyAeXjGzT608oflP5Q8r3FrfWNu7apbwtFJevI5MhcAMxQsUX24 gZ5lre2c+oBjI+gm6obfpes0+hx4iCB6u983/mZ5ku/MfnXUbp2Z4o5mtbKPrxhiYqgUD+b7R9zn e9k6WODTxiOdWfeXnNZmOTKT8A9m8mf84+eWLbS4pfMsb6hqUyBpoRK8UMRO/FfSKMxXoSWp7Zym v9pc0pkYTwwHkCT83c6fsqAj695JH+af5GaNp2h3Ou+WvUg+ooZbrT3ZpUaJd2eNnJcFBuak1A8e uZ2P7Q5MmQYs2/Fyly38/e0a3syMYmcOnRgX5Kf+TP0P/Xn/AOoaTN12/wD4nP4f7oOB2d/fx+P3 F69+d+m3rNp2oope0jV4ZGG4R2IK1/1v4Z4T7R4ZHhn/AA8n2H2S1EAJ4z9Ro+/+xI/JVp+W+oaY bHW2e11d2YLdPIyJQn4eBr6YoP5xmD2fj0eSHDl2yd9/d0+bsu1svaGLJx4aliHSr+fX5PQPI35d af5emlvnmW+u5CRbT0oqQnpx6/Ew6n6B777s3smGAmRPFLofJ5ftftyeqAgBwRHMd5/UGAfnN/yl 6f8AMJF/xJ80XtB/jH+aP0vT+yv+K/55/Q9E/Kj/AJQWw/1p/wDk8+dB2J/isfj95eV9o/8AHZ/5 v+5Dw3W/+Ozf/wDMTN/ycOcTqP7yX9Y/e+jaT+5h/VH3PXvLP5R+Xo9JhfWYWur+ZA8v7x0WMsK8 VEZWtO9a51mj7DwjGPEHFI+Z2+Tw2v8AaXOcpGI8MAe4G/m8089eW4/L3mKawhZntiqy27P9rg/Y /JgRnOdpaQYMxgOXMPW9j686rAJn6uR94ZN+Wf5eafrlpJqurcpLUSGKC2VigcqByZmWjU3oKEZs uyOyoZonJk+m6AdR2/23k08hixbSqyW/zR8g6Rodlb6npKNBC8ogmtyzOoLKWVlLlm/YNanHtnsz HhiJ49hdUvs92zl1Ezjy7mrB5fd70V+Rk8gvNVt6/u2jikp/lKzD/jbLfZuR4pjpQafa+A4Mcutk fc9czq3hnxT5u/5SvWv+Y+6/5PNnrmi/uIf1I/c8Xn/vJe8vtSWKKaJ4pUEkUilJEYVVlYUIIPUE Z5JEkGxzezIt4r558j2PlLy7Lb6e5Njfar9at4DWsINuVMfIk8gCux8M1vtl2hLU4sZl9Udj5893 o/YnTDFnyAcjG/tDz/8AMH/lDPKv/GfU/wBdtnV/8DP/ABbJ7x/vnQ/8EH/G4/1f1Jj/AM45/wDk wJP+YCb/AInHnU+1H+Kj+uP0vK9kf33wU/8AnIXTri2/MF7p1Po31tDJC/Y+mPSYV8QU/HD7M5RL S8I5xkf1o7WgRmvvD1z8jvM+m6r5HstPilUX+loYLq2r8YAY8Hp14spG/jUZzHtBpJ49TKRHpnuC 7fs3NGeIDrFnOq6rp+lafPqGoTrb2dupeWVzQADsPEnoANyc0+HDLJIQgLkXNnMQFnYB8aanNL5j 83Xc1pGRLrF/I9vEevK6mJVdq/z56tiiMGACR2hAX/mh46Z8TISP4pfeXuP/ADkfpcw8o6PPGC8V jc+jKwHQSREBj4bpT6c4/wBlsw8eYPOUb+39ru+14Hw4nuLH/wDnG/zRp1jqGpaHdyLDNqPpS2TO ac5I+StHU/tEMCo+eZ3tTpJzjHJEWI3f62jsjMIkwPXk+hM4Z6B8sfnv5m07XfO/+4+RZ7fTrdLQ zoeSPIru78SOoUycfoz0j2d0k8Om9YoyN18h+h5btPMJ5dugp7J+T3/kntO/4xXv/UTNnKduf4/L 3x/3MXc9n/4uPj95fN/ksA+cdBBFQdRtAQf+M6Z32v8A8Xyf1JfcXnNP/eR/rD732nnkj2b4r123 uNF83X0Mqfv7C+kqrV+L05SQfk1K563p5DLgiRylH9DxeUGGQg9C+w/L3mDS/MGkW+q6ZMJrW4UE UPxI1PiRx2ZehGeWarTTwZDCYoh7DFljkiJR5Me/NrzPpuh+SNTW6kX6zqFvLZ2duSOcjzIYyQvg gbk39uZ3Yuknm1MaG0SCT7t/tcfX5owxG+ZFB8+fkp/5M/Q/9ef/AKhpM7jt/wDxOfw/3Qef7O/v 4/H7i+qNaudIt9OlbV3iWwekcvr0KHkaAEHrnleonjjA+JXD5vaaXHllkAxXx8xXN555l/J7T54H vvL0/pEr6iWsjc4nFK/BJWq17VqPlmg1nYMJDiwmvLp8C9ToPajJGQhnF9L6j3hj35W+b9Rsdbtt HllaXTbxvSWJjX05G+yyV6VOxHTNf2Lr5wyjGTcJfZ7nae0XZmPJhllArJDe+8ebX5zf8pen/MJF /wASfH2g/wAY/wA0fpT7K/4r/nn9D0T8qP8AlBbD/Wn/AOTz50HYn+Kx+P3l5X2j/wAdn/m/7kPD 9WAOvXgO4N1JUf8APQ5xef8AvZf1j976Lpv7iP8AUH3Pp7PSXx54l+dgA812tO9jGT/yOlzjPaL+ /H9QfeX0P2T/AMWl/XP+5iz78p1A8jWJHVnnJ/5HMP4ZvexB/g0fj95eZ9pD/hkv83/chB/nN/yi Cf8AMXF/xF8p9oP8X/zh+lv9lf8AGv8AMP6GNfkb/wAdTVP+MEf/ABM5rvZz65+4O39rv7vH/WP3 PYM614R8e+avKvmeXzPrEsWj3rxve3LI620pVlMrEEELuDnqej1mEYYAzj9Mf4h3PIZ8EzOXpPM9 H2Fnlj17z/8AOWxvbzQrJLS3kuHW65MsSM5A9NhUhQc0Pb+OU8UREE+rp7np/ZbNCGaRkRH09TXU PI/Pfl3zBP5R8sxQ6ZdyyxT6iZY0gkZkDm34lgFqOVDSudr/AMDqccOnyDIeA2Pq2/nd7znt2fF1 UTD1Dh6b93cmH5AaDrth56knvtOurWE2UyiWeGSNeReOg5MoFds6X2k1OOemqMok8Q5EHveZ7KxS jlsgjZ6/+ZP5e2PnTRBaSOLfULYmSwu6V4OaclYDqj0FfoPbOX7K7TlpMnEN4n6h+OodvrNIM0a6 jk+ZdY8peePJ2oGS5tbqwlgNYtQty4joDQMk8e3h3qO4GehYNbptVGgYyB/hPP5F5nJgy4TuCPP9 qFE/nXzVMluZdR1yVCAkbPNdcSa06l+Pf8cs4dPphdQxj4RY3lymvVL5l7f+T35M3GhXSeYfMSr+ klH+hWIIYQFhQySEVBenQD7Pz6cf2526M0fCxfR1Pf5Dy+/7932f2cYHjn9XQdz1LzDoOn6/o13p GoJztLtCj06qequv+UrAMPfOc02onhyDJD6ou0y4hkiYnkXyr51/KrzZ5WvJA9rJeaaCTBqNujPG UG45hamNvEN9BOek6DtjBqYiiIz/AJp/R3vLanQ5MR5WO9LLXWPPmsoNJtb/AFTUI3HH6jHNcTKV O1PTBYU38MyJ4NNi9cowj50B9rVHJln6QZHy3UfNPlXU/LN7b2Gp8UvZbdLmWBSGMXqMwCMRtyoo Jp45PR6yGoiZQ+kGr72OfBLGQJc6fSX5Qoyfk/poYUJhvG+hriYj8DnAdtm9fL3x/wBzF6TQD/Bx 8fvL5t8lf8ploP8A20bT/k+md9r/APF8n9SX3F5zTf3kf6w+99p55K9m8h/OX8n7jzBMfMGgIp1U IFvLOoX6wEFFdSdvUA2oeo9xv1HYXbYwDwsv0dD3fsdR2hoDkPHD6uvm8IS482eWLp4o5b/Rbp9p EVprV2APehQnO0McGojZEMg+EnRXkxHrE/JNY/J3nrXrG+8wX8dy1pZW73E2o37SVdYwWCxtJVnJ 9th3zGOu02GUcUTHika4Y19tcm0afLkBmboDmUX+Sn/kz9D/ANef/qGkyrt//E5/D/dBn2d/fx+P 3F7b+bfljzLqq291p5a7srZTz0+MfGrn/diqN5KjanUdupzxDtzR5stSh6oj+H9Pm+sezXaGnw3H J6Zy/iPKu7y/S8pTUNetom0xLm6gif4Xsg8iKS29DHUDevhnLDLliOC5Ad2/3PanDgmfEMYk/wA6 h97Ofyx8has+r2+tahA9rZ2p9SBZQVeWSnw0U78RWte/bN32P2ZkOQZJjhjHl5vOe0HbOIYjhxkS nLY1yA/Wgvzm/wCUvT/mEi/4k+U+0H+Mf5o/S5Hsr/iv+ef0PRPyo/5QWw/1p/8Ak8+dB2J/isfj 95eV9o/8dn/m/wC5DxDVf+O/ef8AMXJ/ycOcXn/vZf1j976Jpv7iP9Qfc+nc9JfH3if52/8AKVWn /MDH/wAnpc432i/vx/UH3yfQvZP/ABaX/DD/ALmLPvyo/wCUFsP9af8A5PPm97E/xWPx+8vM+0f+ Oz/zf9yEF+c3/KIJ/wAxcX/EXyj2g/xf/OH6XI9lf8a/zD+hjX5G/wDHU1T/AIwR/wDEzmu9nPrn 7g7f2u/u8f8AWP3PYM614R2KuxV2KuxV2KuxV2KuxV2KsS/M4+dIfLT3vlG5aHUbRvVlgWKKZpoa EOqrKj/Ev2hTr0zadk/lzm4c4uMvMij8HE1viiF4zuHhWj/85AfmHZXnqX9xFqkFOLW00MUVPdWg WNgfnUe2dln9mtLONRBge8En77dFj7VzRO54vx5Mnuv+cn7poGW18upFOfsSS3RlQH3RYoif+CGa 6HslG/Vksf1a/SXKl20a2j9v7HllxP5l88+aubBr3V9SkCqiCiqOgAH7MaL9w3OdJGOHR4a+mEB+ PiXVkzz5O+RfXnlrRYtD8v6fpEbclsbeOEv05MqgM3+yapzy7V5zmyyyH+IkvXYcfBAR7gmWY7Y7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWHeZvyj8ie Yrh7u9sPRvZCTJdWrGF2JB3YD4GPepWubXSdtanAOGMrj3Hf9rh5tBiyGyN/JjUX/ON3kNJFdrvU pVU1MbzQhW9jxhVvuObCXtVqSOUB8D/xTjDsfF3y+z9TOfK/kfyt5XhaPRbBLZ3AWW4NXmcD+aRy WpXenT2zT6ztDNqDeSV+XT5Odg02PEPSKT3MJvdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdir//Z - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:541D098FDAA7E911B425F35AB770E4C7 - uuid:486615b2-1b6e-4323-a473-deb008ef2504 - - uuid:004ce5b9-fc7c-4b0d-93ee-bf4717f6614d - xmp.did:73FE812EFA94E911B987F622BD994B0C - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:541D098FDAA7E911B425F35AB770E4C7 - 2019-07-16T17:01:15+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 2883.999023 - 736.000000 - Pixels - - - - - CenturyGothic-Bold - Century Gothic - Bold - Open Type - Version 2.35 - False - GOTHICB.TTF - - - - - - Cyan - Magenta - Yellow - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 2884.0 736.0]/Type/Page>> endobj 9 0 obj <>stream -H‰„’MKA †ïó+rÜ=Ìì$™Ïkk„"Åâ¡Ô¶ -®ÒöпofZµ¢ ›¼CòäÍ2Ãí†ùÔÂäj -j§,D@)±É9ƒ®j¿V÷ð¦&EYc)‚5L^¾™ö[5\ßYØÔPŠ„²QZ꘠¬àœ!X õœ"†eTݼׄÆuï½F2¡ÛöšƒÄ}oMì–ýc¹Qø9°«hÏ蚁 ¢Ô@yàáE†»±µÎŠZH=F=û¶\  =#„ºÇZmþ^o؜#pέc‚Õ¨êå¨D[x­Á2HY„vÉpªù³p?w¸ ÆÑ[61|cu@ùùb(±@š’~)¢Æ¿§ÿXÇè[×16ï56óE!1“qÁ•3̾ &Mô_cgsy5 ƒ¤uù -endstream endobj 12 0 obj <>stream -8;Z\t8Wpt6$q9pW3/fMoQ#<;]1kUN9.WJ^e=`dXojY-s54H#9A^MR+*mmk-_WT'j] -#;[)cme0 -ikIVjo,=N%.V<]^S'sc,N,q(P*kMSl:N&aJ(itp:R0j0tZ+13jBBUqkNNYX="IScK -4d/o^m'k=:3]imh[j,Uk?rG;/,@H\QKP(l2#/8HW1!N["X\"E5d<=2d:jpA"k*##= -#5DeQPgh0-VC/3:da4A$CbSR5HH%479J[eU@N%num.l*9@u7ZGXgj7+R/D\0B.pVi -=$8!LdZ]i%[4K:;p+hhbIK\1)2-fhHUeWS1A@^6gVNApWK0)E\"4IK*8Fc&3D_5&O -CoUIBUS^`J'E'fc)#sp`Y0?~> -endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 6 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 5 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream -H‰|VXWþÏ̼G…ˆ ˆóγ¡ ¸¢Y-ŠÝØEªRD ¢‚"E±aÛ{H4j4QWEÅ^bb,ë{ŶîFŒ®1 -ÌЏ/»‰¹÷»ß-çÜ;ÿ¹óÿg 1R!bhàOïø–ÓšñŠ‰Ûèàè Øk.Û§ä hý‚ä#%™½‹X@:=¬Ò¦1`ÃvétxTrXèì%=»—ì“r¢iôYÀ9…ÏëÁ ºîÖx~€ç­#¢’Öè_Øóü`œì¸ûš®ÑAI±ÚVÕ@ÛDö—gE‡¢5<ÏÄ'±13Ô~Z~–ÇÂ:{l|hìãÁcy^Xn‰w…£`ÍF{¤¿í{„ ö‚$4²ê‹ÄkKñ›28pH dÈo-jGã¾E’ÏÊn֛P}ïÈ·Æ#jÎM‹w‹Ü õ>ÿ[Ø(J­…¥•u#›ÆMlítöŽMš9»4oáÚÒ­•¬7¸·VŒmÚ¶kßÁ£c'O¯ÎÞ>]þÒµ[÷¾ôìå×Û?àÿöéûQ¿þúxðÀ¡Ã†9jô˜OƎ?aâ¤ÉS‚058$4,³|#¨jŸÏø_ gÿ-ƟÆø—‹…IM¤aÒ$)×-ÕígÙAn&Ëõø½å ø ‡¼>·¿Žñ»ÜÞáŸb©Ç/¿ÿÐü¹J¾²»ÿÆ‹ñû6à5FVáސªª÷ÕQ]Ôê€êüZÇZ‡ZûZ]MYMi¹ÆTStïؽáo©Yž^žWaUž^Aw­Ë“ʏóÊúr]ùå*º”E–%W´,V¶¯,¿4¯tKiPº£nW™¾4®t2ϼʆ””y›GšG˜šû™û˜Ì~ænf/s;³Álkª6ýjziznªªÛeºnºlºd*ö߉40 5š¼M^&O+ß®³æx½ŽÖ -ñmûã"DQœ߭ÎxŸ½ud]F¿› ÿ3ßÿÛÙ^ðh·ýC§wƒ"" éÂäá–`9²ð)va+ìÉÙa1Vãg_#¸ -qâI§yKX±b[ðS|áÏŒeÅd!›µ¼™UZˆí¬Ò ¬»̸—Ì»Zæt+êIýië%‘Šoa¬°FØ.ΏZ„¨›øùm/b$ë2†O\Ã'íD1óí>+§+u£€zýeP.¢úžîSµ&¬¶ %âXI«iYó¸öµ½úH}‰ïĆYÄÿ*s_ ÂxÆÆ7Ï:ŸÍ*_̙(‹3Ðf¾³­œSö0›2îsœAnã9ߏÀUÃՒÑëX‰N\}GwŽ$€‘Œg…Oe¥&³†rh'í%3= Gôšqµú Ó¹óWþž(‰n¢;×þâzq“¸KÜ#>‘œ¥Ž’·ä#­Ð,Óúks´§´O-jª—Ô&×^Ruj:GÐNpC+®mÑýÈ| áÂë³ØLÎYs97-æ{_Ëïë¿|W}pÇßÝûÐ×Ù:ù˒±ï|X$Ù`óaŸ±d,ƒí–dã/(-6e2 3IÌ&!™†I'M --MR’ÒP*&mâ™Òvš ӆþ¦Ó¤ã¶Ó ‚6Ånl©ïN6i§º»ÕÛ}ïî~ooß¾ûÄTv‡ŸÃ껳vÓX¥£¿A¦½ ¹ð ØþtŠ +Tàu¸²T 2ÑA@ÿ<>…ãøb%%p,"‹Iˆ ’“„’áø+¹ËXà(eÖ1f'svû b¹ÈüŠ™O -À6Øù;Øö[ì{œ¥ì öâ6rm\w”û%w“›á-|?ʟ4 ¦«f§Y±|bàq|iuý™¼±ó*þòO Äð·!ƒ¼€‹H=ªAMlŠ[ˆï0 +oG¥Ì{hpq?6[Ø?`D['¬¬ZÈIã‚e -= ‘W1? {Çä±\:ðgÀ–²W¬sÌÁ¾‚/›^Ä#hš8 BNH6ÂÜVÃʺ;Ô),¥¿Î~âå×i½ËæBþ ˜7¤oð ô#rC¯mÕG¬©­Y½¢ºjù²Ê -¿Ï»tIùbOÙ"¥T–JŠ¹]…΂ùy¹9ў%ج³‰çX†`ä )1‰zb”õ(MM~½¯ôÀ@Ï1*ÁPãÃ6TŠfÒÖ*X|ÉRÍXª÷-±(PÀï“BŠDß *Rok€|"¨D%š4äVCf=F' :² wH!çPP¢8&…hã£CZ(„çÅmÖ¥¡ßê÷¡¸Õ¢ $Ú¨ ÇqãZl¤1´&N9 PÑf%¢a%¨C LY¨§¶µGBA·,Gý>Šv*½)ë¨Ýk˜ ã5”o &ã5Ò.Ýt\Šû&´ñ„ˆzc^¡OéëéŠP¦'ª¿Ãá¥ë• ]`Òé÷%ð+›#ÔҐÀhsä -jNÆãÁ`T[NCdìAs7£…œ»$½«ic=ÝyP+ëm4 -õûZ:"2 VBã’îFGÄðŠ•RÓÝÌ8ܯ„ô‘Øn‰Z”uʐ¶;d¹4Š:“/¸šÕ+éPsHÒ6G™Ö¹•hO°(ž‡´ŽÇ.†U)ü°ÆŽÌLdzís‚õ Ð_gH†¹.êù©Æ:"% !B¥ ‰(””ÕèM Òvրü¢ftÌ_L×èDpePŸkSAIÞzx¤gn„/§.êár?ä@?/S¯—.]ªGŠ©¨dkþJ¿ïQÚ¢ ‹m)Cm¸)º¦¦\–u–'TÔ :ÚÉô%Ô뾀ÔJo”’˜®™˜×äoÑ5£óšû·ÇçKFiO͞û§]\ZCñ‚ÿ£îÏèaù„¤8˕imOvÜí‰iãQ ¦–¢¦5*R£ÓzéÑ^E-ÞÒ¢ ‡bó.%Ò±ãnzz<:„aRiuf6hnC„q“hF"n¤–¯*-íÛ"5s¤Q¶ ÎpŸêÛ!4Ú»ø‚³g\6YixZÖíH™x]yr^.Ey"Å6¦(—b >L™‚PúÑ…̍;h[œcØwñ¦7±„ñßÊ0ÈÊs ì½Ì0¤Ùb ï%ŒÂæĬ §w£x7Ð:Ø(NZÅ©ª ˆ³©ˆË—ÉÙQ †ímFb&fT -S‰€ -ùñ÷ þÐ-Õz͊°tÍÄ°R"=¤Ž‹YÂV‹å‚óÁ¬‰ç#›ÇAö4™ÍÏF—ÍPž «‰À®Ë`Œˆ`³Y,f3Ïsfd°Åʘ T ӒišL«Öi‰«6 ßÞþ$pv¡D¨vìá'ÂûÂY]šáU÷Ⱦ†È…÷Œ»£®ÂÖY—svÖU˜¬­Í©­u-r‚³sGF*¨ã*¼c¯ŽU8ÿûÏëõ._†e –se*uF†B'>+¢8û³Ô§/§~óïÔµ3©;ÜÛ÷R,ù¢ž93³C¿ E‘ô$ûÛuXjS+ØFDŽÎ,âkA§Éæ:Œ˜(!b1ÆÍÅ׋qÞà¨õº•Xà ·í7ÜiMŽIû€¥ÙÀ$ªKÖÕÕ%µŽœZ“C^™•R´rª®ZPÀ•òùy ª«V­\áaÎc1õ¶3ÛŸú-^z£÷pêãC¯½~ðð¹s¬zoâ›ðúÍàuÍÍCÇO\¾øìÓðnKm5ð– /Ú£–,ZµˆäxòKduú¤Î"îéÌ·r¶lĖÀW~–ÝÉÛsJ/Ià°jÃÍ~eÐö́oMôÖÙ»^Éd7ТfcÔ՝HbpÁexµ¸ìM¼\ZËŸºj-žóL\½ê¹¶÷ùÔ§?<µûËßú§V7½Üw3õ»ÓϾ³ýÕÍ©¿~í#‡~ø -«Ît¥n¡m/î­¨ îy¢©>ÅÌKO‡6}íÇG?§;§³´û, –³£5ûsîsáÕ¢âÚ4ùqª¢†ÐÇo·nrìpæMRˆ²…ªŠ•µÛG…“Q…6!ÂiIX&0BXüþþù¸48'ÅÉn,v‹·G¼ºë¹UPnðJ©gåŠU P:Õ48°><8PsR·y4ÔÜÕÒ4ÖÄ1„L6`ȃžT—3ʗ:¹üN›jÊÜn—ËaEåxGù¡rRR.•»˜ãˆŠ âºì.t¹£.Õ".‹z<"ÔÝ*|Ɍ"î$|(^<<6vvV_ FÛÝ=‚2Ë¥þ’b˜êråüµXgHo‹q>䎥4;#Uà9ñÎi|½àlUý/†÷ÓÖT²««qïªTÒ»õ+Á½«S·Yõ`놾X¬oÏù«³GHù•£m'¾›Ê'ö玪íϽ”*ÒyÚ«é]ð=¹P•ê^-b{'úûÕTÕu…×ÙçÜs®€.pÅ@à(¢AD. -Q|Dʼn†«ÜÊSyƒv,ÑH `T«F‘IӈAœN43Ó45c;­?j;m£3&?ÂhRk3v¦rú­}ÏeÎô‘N§¼{¾»ÖُuÖþöZkßkD–8ƒ£ª´¼WÕ®`%87zýŽ@êpøÝ⤹…lñ*³5Wd„ÐdÂÌ}"|TH‰Îne‘£Ã÷~øùð¹ó½×žëïÛµëTŸVÚ=|ïh÷ðÝW”üÛÖ©ƒÃÖ[{öŸ9»wïiœD\: s{GÎ4§ÇõXF±ÃØg¨ª'$,ãœz.Xôª½ÁÂ*” §1ô Aëíœ ðˆŒ ý#4È´Þω’aä¹V¹¥oºÐÐÕ°œ¶þgþcàS¸é]úYB&ÿVRv müYãU’¼Iásä L4@»91lrÞçÓv.OÿV±'.»Dþ³–Ó¹¦(f(ªçfúð2XO³nªóàw<ý)'mMxÌs N[èZ“¿A)p=aÜåq—ƒ¯EßtE‡ ¥,¡1á¨8¢¥(Ùø»5(¢sRV©Õõ9µKu¬”ª:SÍTÅx5F¿U?Q¿P-Ôö’Ɇî á¼f~Ž{µ»ÌÝèÞåv,p+ñî9n!Üánñ¾û²ûºûK·æ. ¦öIUãóº½*¶¯Ë¥¬rmt WîÔA%ù-ÿÉz½ùwoyåá¢$Þ÷6555ßôŽ(|ÖMLŽŸ‘wœ‚Àä›>—k ÍU†¬Ý€èñm ¤_£ÑF«shd -lÑ.)s0vœÇCÖ=â®<} •Ó|ðš?}Ž:ÌÏ#àsջ”Œ±ïê‡èuô“Hn€ÿ”¬'Ð\g/­Ã^6óùsìÉX(§5x^™¢}J‚¯I ¼{ct„+ðãl£ °QÀççä3¼Jǁ×0cåûR˜w>{e™ ÛAà)š¡=NšDM·ãò¯Ê¢D‹‰ôš-e,b¼LdYßΗekðk5p^6`¿V+ ïÃÞrpö2d1Öwaï‡pþEŽn%òGöœDÄMŒÛä b”ã12Éñ%Í法±Û+㨏cÍΝƒâ á@,|xÆÆ4Ø$™7ˆ]~¯m;Mæb 9–˜?qJ$†KòËñÝààCHø!c“}±¥AáëRÎEì7œ¥è :)/RDZŒÁ€L°.Ù<sžr®@þTtY§þqÞrîHù Å1—2m9ÂM@æ#ï7Q™Q »Ë°ŸE°½òSȵ4EoƒÄþPÃvƒû§´vªïQþ¸ê3ÆÓ õ‰ØZ{GÇÈ# ㊲Y{›Ú%ßWè€øvèg!Å|Zàj,·£øêýoö¹Œ•\ãä^›h -$ê±µyÌq# ¯áùEÈ x®ßY\ Qš¹rMbøϺà\_ë·àýþý¼ÇÚ¼cù+¹–ÊzfÇ#×ÁÀþ¹pN˚€¼VKvçüÒ>²zô«G\·z Åêq‡4­ø›¨ýêâ{ˆVȜÃ3'ì3×~Þ§c‰@Ýמ¤z¹æ y¡©¨Øû¦_§|®ùúz^¿J圳ÜÏ~ªí´–¹ïՐõ2þÿP«µ¨˜ÇÕßÀŽÙ,*–¹ìç7 }/ð<—ùSI™ŽyT¯†þÖQ&ÛÔËÀ1j¾ýT`×ãz»þÊ>Á{F̔ñYð>ÙW>[ãöz|´Q„vr2Mâ½J®öa¿6_z…°-£bµ%åxs€¯ñeóàŠcTޑ°©;É#¹"ŒÝ¦™D‘2—.Y·ùÝè/æºÁw3s,"­~}>ÞùsöÁº-}ðŸ['8íS›hO †ÇÊ@Lë\³è ­Íú˜ïCç ™C뵈òÐwÔ_‡E,îKÅ1€÷}¥\p ˆÝ¬?(ÇBùÐ?ƒ1zì?íÿ&¿Çý¼Eê¸/¸¾ñoKcHñf@boÏӜIÊçeÐX‹Ú»÷÷ZªÔ#ò÷ïP&âñQ')qŠj°f#LfýÛïþ½¦ÌÕúÐîû›hCû€›«^xض‡íaûÿ6R𠰛îP&e“ƒ…R<Í'Rëœ'HåQ -¡ÃRòg'à×Uš„'¿®AÅÖuègl݀¥_±mžþ®¶®Ðl¡Úº GDº­«è_dëô­¶®Cï³uƒž׊¶7VTú6U˜ýfQu…™ßPßЊ.sQCscC³¯µ¦¡Þl¬Ý4Ë\ìkõý‹IfŠÉæ̆ڭÜ×bæÖcejF†'9#Õ\P[kÔTU·¶˜-ÍÛ*ʋ—®.\Ÿ´¨¢¾ukóö¥ ­Õ5›’6Ô~ƒ»Çôw™5-¦Ïlmö•WÔùš·˜ •ÿ|{TDÛ©‘*¨’|´ Ò¤~ ˆª¥žO T´Ú³LZ„§fèüíCœa¢§ëgA[,û}ÿ¥%“RäêÀìBŒÖÒ֑y-è˅ô¿3•2Ð<”ŒïTô– ·D2îb:Ð)_ï£þ“|‘|™-§/*øªÙ˜b(Ä>ô)'Þ Îp7` ™5Âö§ôÊþٛɛ võE€³ÏP+­}¨Ië%Ô¯KËF½AZ¦÷$²çΞà7±gÎêy3 œêm2ºŒ·€Fý;ÀÙ*ÞbtÒR¢4E| m'®S7aÈ9âK`SŒ¯aÛ×Y7øìãÇÃ*Ÿ•=¨]€c=µxµ°Ž£>)­S\¼v{x•1‡ªY5q% 4ñÝ… -Š¶»D¡©ÏŒE}ás®½ðù ®^ðµ ^®Qeñ8ž~C½b|L—`UÓ¡‚£káF*R/¾;4*àúb´ylDL¥̦k…õvÑÞP=ê/8s5¬r³ºà܂feÁi×Â5´¢"ô³} Y -âE{W£ú ́Ðì^xfí) BµF½¥^=çÓÎZŸ,h?ۿèíRO:ªvÂY¨}}˜zÕ|Ҙ¥~)¸%ø R±K}Çöª¾/îTw¡]Wܬ¾j{3»êcêN{GƒºÝö| ‹)õEʇ´u"åFö—©)Û£t±]MÚ+ßP-¦T*d´p¹xìbúñcیÈûÌô=Šë¥Ò{̤.—Jû`=ˆ×€J{‹æ¯:–b2ÍÚz„eäð®¢ùE3ÜõF5ü¿eµ_L.hgÌRM õ'SDg߬þ(˜_™;µý¦ÇCF`™º7£kof,m2³Y{΁b·º%#÷祌Wõ–ü¼éUÕaÉÏ Äƒº{±/äQ͊~wF(BnC‚%VF‚î=í Oa½îÝí ·ºçÑdžèËå[(Ù,þ²ë˕“•YdO’„SÜ'‹/·Ø°Çc±a×ؚrõPԝ)ñŠ£-]OÎ w¼æ -endstream endobj 11 0 obj <> endobj 10 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (icon_blue-orange.ai) -%%CreationDate: 7/16/2019 5:01 PM -%%Canvassize: 16383 -%%BoundingBox: -43 -681 2789 33 -%%HiResBoundingBox: -42.999 -680.9844 2788.8838 33 -%%DocumentProcessColors: Cyan Magenta Yellow -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: -42.999 -665 2841 71 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: 983.0205 -584.8799 1783.6602 -8.87988 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI9_OpenToView: -2911 1691 0.25 1586 946 26 0 0 51 123 0 0 0 1 1 0 1 1 0 1 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 21 0 obj <>stream -%%BoundingBox: -43 -681 2789 33 -%%HiResBoundingBox: -42.999 -680.9844 2788.8838 33 -%AI7_Thumbnail: 128 32 8 -%%BeginData: 5449 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FDFCFFFD08FFA9FD11FFAFFD6DFF305BFD0FFF5B30FD4BFFCACAFD -%20FF5B0885FD0DFF85085BFD4AFFC3BAB4C1FD1FFF5A090885FD0BFF8508 -%095AFD49FFCABAB4BAB4C3FD1EFF5B080F08A9FD09FFA9080F085BFD4AFF -%BABAB4B4C3FD1EFF5409080F08A9FD08FF080908095AFD4AFFCABABAC2FD -%1FFF5B090F080F0FAFFD05FFCFCA310831095BFD20FFAFFD13FFAFFD17FF -%CAFD20FF5A0F080F080F08AFFFFFFFCFB4CA0F0F080F5AFD06FF85300F08 -%0F307FA9FD08FFAF3031080F307FFF85080F08FFFFAF080F08AF5A310885 -%FFFFFFA93031080F0E7FFF5B080F08FD04FFC9BBBAB4BABBFD04FFC2B4BA -%B4FFFFFFBBBAB4BBFFCABBBAB4BBC2FFFFFFC9C1B4BABAC2CAFD07FF5B08 -%31090F080F0FFFFFFFBABAC931090F085BFD04FFA931080F090F080F080F -%7FFD06FF85080F090F080F0831300F0931FFFFA90F08315B0F080FA9FFFF -%85090F08310F0F0831310F0831AFFFFFC9B4BAB4BAB4BAB4CAFFFFC2BAB4 -%BACAFFFFC2B4BABAC2B4BAB4BAB4BABBFFC2BAB4BAB4BAB4BACAFD06FF5A -%0908313009080F0EFFC1B4B4CA0F0F080954FFFFFF840F080F0809080908 -%0F08095AFD04FF85080F080F0809080F080F080F08FFFFAF080F080F0809 -%0EFFFF85080F080908090809080F080F08FFFFCAB4BAB4B4B4BAB4B4BAFF -%FFC2B4BAB4CFFFFFBBB4B4BAFD05B4BAB4BABABAFD05B4BAB4BBFD06FF5B -%080F31FF310F0F0F5BC8B4BAC937090F085BFFFFFF31090F085B85FFA95B -%090F080FA9FFFFFF0F0F080F31A9A9AF5B0F08310931FFFFA9310831095B -%A9AFFFFF080F0F0F31A9A9AF5B0F09310831AFFFC9BAB4BAC3FFC2BABAFF -%FFFFC2BAB4BACAFFFFC2B4BABABAC2CFCAC2B4BABABAB4C2CAFFC2BABABA -%B4FD06FF5A090831FFFF0E0F085BC2BAB4CA0F0F08095AFFFF7F080F085B -%FD05FFA9080F085BFFFF5A09080930FD05FF850F080F0EFFFFAF080F0831 -%FD04FF5B09080F5AFD05FF840F080F08FFFFCAB4BAB4C9FFFFC9CFFFFFFF -%C2B4BAB4FFFFFFBBB4B4BAC2FD04FFBBB4BAB4C1FD04FFBBBAB4BAC9FD05 -%FF5B080F0EFFFFFF0E0F5BC2B4BACA310831085BFFFF310F0831FD07FF5B -%080F08FFFF5B080F0FFD07FF5B0F0831FFFFA931090F30FD04FF5B090F0E -%FD07FF5B0F0931A9FFFFC9B4BAB4BBC3FD05FFC2BAB4BBCFFFFFC2B4BAB4 -%FD05FFC2BAB4BAC9FD04FFC9B4BAB4CAFD05FF5409080FA9FFFFA9085BC2 -%B4B4CA0F0F08095AFFFF31080930FD07FF5A09080FA8FF30090837FD07FF -%85080F08FFFFA9080F085BFD04FF300F0837FD07FF85080F08FD04FFC9FD -%05B4C9FFFFFFC2B4BAB4FFFFFFBBB4B4BACAFD04FFC2B4BAB4CFFD04FFC3 -%B4B4BAC9FD05FF5B090F0EFD04FFA95BC2B4BACA310831095BFFFF310F08 -%5BFD07FF85090F08FFFF5B080F31FD07FF7F0F0831FFFFA931090F5BFD04 -%FF5B090F31FD07FF5B0F0931A9FD05FFC2BBB4BAB4C3FFFFC2BAB4BBCFFF -%FFC2B4BABAFD05FFC2BAB4BBCFFD04FFC9B4BAB4CAFD05FF5A0F080FA9FD -%05FFC2B4B4CA0F0F080F5AFFFF5B080F08AFFD06FF0E0F0831FFFF5A0908 -%0F85FD06FF31080F08FFFFAF080F085BFD04FF300F080F85FD06FF31080F -%08FD08FFC2B4BAB4CAFFC2B4BAB4FFFFFFBBBAB4BBCFFD04FFC9B4BAB4FD -%05FFC3B4B4BAC9FD05FF5B080F0FFD06FFC2B4BAC931090F085BFFFF850F -%0F0F0EAFFD04FF310F080F5BFFFFA9080F083185FD04FF5B08310931FFFF -%A90F080F5BFD04FFA90831093185FFFFFFA95B090F0831AFFFFFCFBBCAFF -%FFCFBAB4BAC9FFC2BAB4BACAFFFFC2B4BABAFD05FFC2BAB4BACAFD04FFC9 -%B4BAB4CFFD05FF5A090831A9FD05FFBBB4B4CA0F0F080954FFFFFF300908 -%0F08313031080F08090EFD04FF37080F080F305B300F080F080F08FFFFAF -%080F085BFD05FF37080F0809305B300F080F080F08FFFFCAB4B4B4BBBBBB -%B4BAB4CAFFC2B4BAB4CFFFFFBBB4B4BBFD05FFC3B4BAB4CFFD04FFC3BAB4 -%BAC9FD05FF5B080F0FFD06FFC2B4BAC937090F085BFD04FF310F0831090F -%08310F0F0EFD06FF3108310F0F080F090F0E310931FFFFA931080F5BFD06 -%FF37090F080F090F080F0F0F0831AFFFC2BAB4BAB4BAB4BAB4C1FFFFC2BA -%B4BACAFFFFC2B4BABBFD05FFC2BAB4BACAFD04FFCAB4BAB4CFFD05FF5A09 -%080FAFFD05FFBBB4B4CA090F080930FD05FF5B0F080F0809080F5AFD08FF -%5B080F0809080F5B5B080F0EFFFFAF0809085BFD07FF5B0809080F080F5A -%5B080908FFFFFFC3BAB4B4B4BAB4BBCAFFFFC2B4B4B4CFFFFFBBB4B4BAFD -%05FFC2B4B4B4CFFD04FFC3B4B4B4C9FD06FFA9A9A9FD07FFC9CFFFAFA9AF -%A9FD08FFA95B5B5BA9A9FD0BFF7F5B5B85A9FF370F0837FFFFA97F5B5B85 -%FD09FF7F5B5B85AFFF855B5B5BAFFD04FFCAC2C2C2CFFD04FFC9C2C2C3FF -%FFFFC9C2C2C2FD05FFC9C2C2C3FD05FFCFC2C2C2FD2CFF7F7F5A7FA9FD05 -%FF7E0F080954FD07FFA9FD1FFFCFFD0FFFCAFD39FF85080F090F31855B7F -%310F0F0F08AFFD72FF5B080F080F0809080F080F085BFD74FF85080F080F -%080F080F0885FD77FF7E5B3031305B7EFDFCFFFDFCFFFD52FFFF -%%EndData - -endstream endobj 22 0 obj <>stream -%AI12_CompressedDataxœì½ms%¹‘ú}"ú?ØÉáaW -”®ãFð’Ú±%̈́4ò®½×ÑA±93ôv“m6[ò쟹?æþ±›Ï“‰ªÎ9löËheï4¤éfTá%‘/O&þîß}ó‡/O_ÞýéúËpÒmž}ñw·»¿¾|¸»ÿՆäÍW¯^½{ûpÒ/~ÿËM?t¨uúU~a5ÿËõýۛ»Û_ñw'¿½Àó¿ØýpóöáæòvsqýZ*ýró‹_â·ßÞ<¼º–ßß\ÝݾøÓ«w×_ÞÝ_Þ~}ryóKiñìòAª¥çýô|èúyÕõ›o~Ë*—·¾|ûöæ_®ÑmÈìu{÷îöåÍí÷Û»ÿõ«Í—cØ|9å~3¤ÿÃÕåýÝíóïeó°íW×ß=<ÿú\VJÔ¶AöøoÒ¼KV-?è¯þôN¨ϯo_^¾ýáùõkþõ ûòú¹p̗×Ø.ÒØÛU§úðÝõó—wÂ…‹É:˜Ÿÿח7×÷òÅo7Ïß¾¹¼’á˜ÆçWïîï¯o¯~”¦çº¿“ ù§KÙÓý”Ÿ—úϯîÞühmÞ¿üîúõÍíÍ­<ž†ç2þ7W—¯nïžÿðã›®oŸßËT¼•O»~ùüõå^K†U&éùaóòä»·Ïþr÷ö ÚÍÝýó‡ý§Ë«w×Ï_¿Ûô9<'íå•Ì?[»º~yóêÕ¥´$Ûџz}ùöêÝ+¾QÎøåÿ|wy/ÏàŸ?\¾úNû0âÛM?ÏO¹¤©Síñ´™ÍSßSÿúS|ÀóÓóç;{…çç|üù9–VΛÇÏý¹¯´ÖWÚÅWM¯¼ÎùÃÏÇ¥™¯õ¯õ¯›¾Öwúڟ{ýîÕÃ͛W?>ÿúí+¬‰?–ú£>üÇæá?úSÿUùíw÷²ZÀ€oe©½}~©_–ï¹lž¾Ô®/½‘KÇåõó«2×úøµ¶~]–¦®ý¹­u£µnš.n¼Îµ Ç­vx§ÕïÊ;Ý5ÜYîå͟o@ÐÁx§¾ÓžÞ-Þç?ó£þúƒñc!?ûâÛse…ñ?½øö­ ÿ/ÈhÎo¯îpÀÿjóbÿP=xÎþÓó5ŸxXó·ÿí{WúÚ|{ÿîúÛߔƒˆ/òBÞ왎î°ß½áïò‹o^½“_þúþîݛ¯n¿»{öÅ/TÒú/×W"MÉñõróõŸþ‡ü òÒï.¯~øþú_®o®~¸½~¸ÙÊÐ -ÝëŠÌôæ—ïiXúýõF+ÏòGùû;üý”çÏ®¿ù£6 Ô¿ÿB…ÿÝ~ù߄·>üË뻗ï^ÉoÏoÿ|ýêîÍõFVïæ.ïß<¥‹o^]Þ^Þoø‹ÒCÛîæ+°™Ë~¸ùóæõ¥t*•~s#gÆ7—2¾OêA˜Ë5>Ä:ËÞ«ÐüêI]]>ü°ÙÊK¾|뭟⨓Y|'rîzÄø!Zÿ)ÍÿáÇ׺{uóöµ7ÞRüßO|SÖÛ¯oõ•ïß½ýaóíÝÝ+où·ïpX¼¹¹}{ýjõÖ"(ésSyåC`óüoÑÅîRDa“o„óêå?Ûï¿»¹>Øّ矴º®8U‡zýÛë¹¹|u°ÇýÇþæ:³5¸@xç&ðh?üåòáê‡Íonþt/Çìõ{v+&û»›Û—ò¢xwópíàc 8ýöúá_„A {›‘.šjógM{œ|ùåãM?m¶·m•_ßCD¸}µû×r’AH¦ë¿E/H›íKÊç]ó¿¾üoÜü݋­HžÿQÈë?ýª M VF+‘ÿ/eÂÿ¥ÅiQ’—Ü͋rڔ­”•³¦œwÒâE)‹Wkÿ M M%j‘1Àß©Ÿ¤$þ›2/Êi¿õ²ó²íϤ”ŸÎ¤Å³þœ´³þ¢-íðñõʟД±)q˜Pž}¡©)y˜¥èO›²Õòì‹ÿûðœ›Õ°˜×±™Ý:ÇR¤Å2Ïc3Û:»í,g)ø³›ó<73-ÿ•uÎˬo}¾õoÌöy;ëò_ýÓœóAf ñ ó‹¿1Øë‰%s¶Ój¦O­,çsŠ¿ÏYÎV³Yº œË:w(:Weæf›3™'™S+ÌÙÎÊ˹• ”²Íð9«9í9[£æ¸n¹g.8BG`â7Îüž3¾uoo9qõœb­°oô5„Æ0…r˜ÃVÊY¸iïÇ0ŽcӘÇy<·ãÙx>^Èp1Ä1N1Å9žÆmÜÅó(ûT^©—%;Nqš¦<ÍÓ鴝vÓÙt!‹BTØ4¦˜¦”Óœ¶i—Î҅,˜>yÌ1O9å9Ÿæm>ËçùBŽÌéæq–†æ<ÏóvÞÍçó…,Ÿþ4œŽ§ñt:ͧóéééVÊîôìôœKjO·q›¶y;˯¶ÛÝö|{!ËLF“ƒvã.îävóît·Ýívg» Yv='c<‹gә¼ÞY>›Ï¶g»³ó³‹óN¦'œçÓy:Ïçó¹tv¾;—Ur~~~¥q!ƒv/äc/äõ/N¥H§òèÅêç´ã´:í¼)gMÙ5e»(§M™K‘g龖ԔiQbSƦ„¦Èj”/-g«\¹k_þ¼ýs¶(;-2dø{۔Ӧ̋’›’š25Eúyô2.JhÊД¾)][t؟}aÐ~@ûgה­–²Uó¹œÅåܕY[ÎÔrvdF¤Å±‘f&–ã¿uíÕsTe¼æ՘ÚH.Æp9n«ÑZŽŒ×r\tLN­Ì,ÙJ²2±D+#K°"뎛ÑÎT=|+”ÓÎʟ-Ë©•™%[‘Í.›?í&+ÑÊȬ(O.g€ðÕfNÏ9[Î[æFæÓ±Úʟe#o]¾.¥jLy¡K%Ó¯´Ä…fz™´Œè•ù*ñRÛ+§•ë‚®M°È(.´È%ô¢yàïyUòªTUÿ5™.ۖq¯„½2(öGZlÿ쩎؝­ìçŸ,ÂZdî¼l½œ)óђ‹†)-¦U™žXªöÛ"-.~v Gý÷~ G -—†´8<±äEZ|ZÍ'ÿ9h+ø¤?Ÿ¯Åæxí}`Uú-Rü™•ÛŠ-¤ØF²éÞÅvbû^vµêée·{LÝ -ë½]dß²—ÛÝ»µ]]¬û{7¹Õa²Ý&QíR¡Ý­nÍxdŸÊ¿ÜRmc«½Yv珦bcimlۃ{s»°ÌíïÎbÃYïÖ¼°òU«P± Ú¯þóÂv÷ʸ°6ߕKËÕÚfyhß>¶›W{•»úÈï>|G?º«ÿöàçoñˆÐÛªWû -–J-û -V‘U:*ìç”HfS0'“IW¯.©$-¤’¡Q±v¢dQÅzö…(YP³TɂšÕQÅR%kG«“*ZÙ­`ŠT­¨Y[*Z™6,YT¶zn” êßgèBÈ¢j©²ukPu‹ -י)\[*\™ -T.°2Y;¦v]P—†â¥ª”¯Lå ê×Hõ«ç¶º  -¶£ -% jX’nQU4-QÑ•1QÇh:§Bv& -T2(ePË ˜¥1R5ƒrȺ:*h¦Ãoµ#Dù^¢”7၀?=¬ÊÙ!ë„T9Ne·Lõ e$oywõ)¬Øsõï–'·2å%á·ãžläœuÁK’Í‚k.x¤ì˜VfAYq»ƒ|îùâ€<ñ4®q”›|æ]íª¨–ÖBÖþYSçÒWÎ\ª½©´µ„EYÚüâªL‹"À’˜6ÆLkYNWe».fÑlËÙ^Ùÿs±_Êjٞäý2,á`)VÄý”éhq{²´˜V%?Zæ÷)VíÃeûÄBŽ/-îžXΞV¤Å}ê¡©|r‘ýî#ÿ8^?º%7u®µæDÑ2ZQ{j±¯&+Åþ:[1무¨ÖÚò§°Šº…Ê´~[të"õK±Úe}Ó<¥eòRlÍÙËlåÔËöÏ:ƒyicâUՏp˜;5|iá§Xð¤#Üèj9ϖö ã¼çž³à1ÆghK;Îcp–÷qiñQ>ò²âôr9×øhNÑìþ£|â‰\aŸ<²«/Å]ýAfۅáV»ÚRé(†,Fك"NÃx+ŒAÆ¹á8Žtg<‹ûø d9tԁ(²Â‰,g ÙâJ†3ùœîdu(H¡t*ã˧•á\ÆfR3\̐?éf~ö]ÍR9ÝÍ[aOgîtîDJ„Ä Çó(/Y:Q„ŸEœ?¥z'ìãÜ\ÑÝ©ìú -ÿpJÃ-=&ªs㞦ƒZ -&䪶Ê@g5ÜՐݝÖYT™®ku^ïȜ°Ñ/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïåO=ý?~Ws8 _MìI¿ä_Ó&w'£ìM -ˆÃPùϾø»O©»}{ Í“(5c·Éý‰èÓñ×ÙÚI?¥yDMÅx(-1ça”¤8د‡>Nó´•á$tq¬Ý}rKú>(µq’jlû Šf.ª;›ÇØ͌´N9F„ýàï¾i,œtÂiš×úL ÚÛMðY4û.&>˜…?kc¢[fí`>‹Ædúâ¼h,vÝܾÝçiðærH'9„Må˜æOÐus‡Ö¬½ü<ŸŸ?º`—µÐÎö¬â7 ó,óïo^¿¾~P¦ýK $ó?:ë¼0†9«ŒææKÆOžµ>[cs£¡&(bzœ ë O5ò¢jËÃí‚æ=Ô&g§<ÈÎÉဧÂÁ¥‡Ö)m[gЄŠ,žµíª§IgØKuyì$§Ž@‹`ý9ŽFm-·±±?Ð8¦ˆb•°6%C'(>Á -4FaÝíù8ö¢A^< w±v\úÉޛ¾uÄWWüNOïÆ?úi=—ü™Oä3ƒñA*ËÂGYL|™òä.H]QF’ÖNÖ`Gé*Xï,¹7YGÙP ×°@F˜ñ¬s·àŽæ15‡%3{f@ï«QøÉؔ'áRܓ^Áê¢Od8¢3ǝb¨‡£!ƒÔñ¸?ßs:7ÀM‡nª%Q½ÇÁ¥çH z¢(IgšFO)Oo©NËìQpº d]ek…bbU¾V »Êؔ² œ©ðLÈِ´E⥴)myûl!s¯¤n“¹± -„“rw‘¼e—-eo¬’Ù`;ŠŽçî(yˆg+yï(yŸC䒹WÉ;4’w2©{K©ûŒR·Â?«¼=6ò6dm—¶E*?£Ä]äí}‰;šÄM™Ûåí-enJÜά òfÐä,HwÚþ¿ÏýßKª’éŒ3³²¹ìΫó®ü«ýÛÐ-ð]ÔþÜ»Ù:8 ¾þÆ¨ T::8^MâÂ8wÐÀã H>Ù՘®ÿU·gýïéÂô~f0ê’'ŽNÕH]aÔÁLû“©'sܪ  ßw -xoÀÓuÿÕ}(Yï9.OΡcnÿ:ôïåñ´÷ Ýz­ñ½wƒ}kºßwî»Gw¬–û?µ¯ÿÝÒ¢ûk(Çxöpÿ„Q”ŸÆ•C£usvñÖß»Ã×Þq=&}〭#[G¹ÎÄÒ=±€Šn@E“D+<´C ªÇ äðÞR,8¥ÊžÉN&Šß°7!aé=ꤸR°`…ë]ïù›ò~@w5›XDˆS7¯AÌÉMÍK se¶Ò™¥Å5˜ùlf>¾>³Ö§å*••]Ì-Œ¹ó5{a¶ý8í`ë«W×ïÌ£«XV¶®ä‰Ge]ÏÁ`vÊåÕõYÖö¹ Ù®ñë:—"+[W{²?Që £<™¼]Ïu¤ê8ç.à>püÀ!gÖ:|a]»Ì†=³÷^€ÃÁ@‡%è~/èAÖá^èà -”8b?ÂÀúÒâ¡Pˆ´rpN+÷çñ€ˆ@4í᠈þ‘]tl|p'mwKÝKí~jv՞!ëd¡4À>2%ÈýÐú…{d¨ÿ]/,,Ò6¢p)Ø)â<ô1-”x©ÝX»>WƒjøÈӄT0ÝÉ8‹èœÍ ?º­Bí<Õn2ˆ¤•›÷ùè&ô Ò„%ÂB’œ -öpß'Qð‘ø¾6ÂK›ïˆ“<Ú7V»OnÉLA¹ ƒÜiþ’£8‡š¯&¡™tˆ­ù$Æés3Ч6õ¦›¯ï¯~¸yy} ãÿ[šڈړI$cDÈۄAÏ_+3FcëÀ”·¶Èړ›ò æ#²§6ö`eXE|i-Tñ´YÀžú$ÆnœNDp^LÃÇ6ðƒÿ$!ºÇÐÛ¿hŠ«ßÊéEzn%à6059±À·^|^ô-ƒ;C ):Qt½'¹vSCCKˆo«½Ôp^*ë0-°ÓC­º -YUëq›A¤Õ€º £\Šö¢6ƒ¹Ñb¶&iœËA¸P0–!\Ù­º¨æ˲¤úN8—ZŠ5a[ä;1Š EEóÁPæfΈÖl!“ö¢ÓhYÊfsÐb2D »Š.-¹;¼ ¢%K!SKð½Ô?ÉKörêe[‹´¸kJ… ,ÝB-Nµ_”Ðß³/Òè%.ÊþŸ¼*ó"Âf:Ý+»#åì‘âÎ-†8Û».\ТP Ÿ£ n®áÍÉœ·uÏöËؚ̺­¡Úؗ²՞°ˆÑុhì՟=[lÐYcuË^­Mö‹î™‡AG „δ¥žÚÊ>§] k9кm•Âª¶åš<ãZ,¾ì+ªú±OéǶy$´§hõ,v´Ló>ìh Ն֙ -҂¦~ëÙ½ÖgfðK(nW óÙmhôWӆö˜Ïºz­çÆ~¶cÀ5lÚ熑tµ¨)KõDU¦"…ŠçZõ“ŠªH Šâ„÷3.p?-âgÞÃû,¼Ø ¾Ç‘=¦@.±ÎÉÀ–a3¥–ä&Ûh²¼€ˆLßÓ_A4dgÆÜe@ˆ†„¨ÄTC44Dµ:›DŽ*A"¦¯(CU¶·¥øԌÀ%l¤ ™Lñ0¥y©-•˜Ýþ@¸à±€Áf² YÏ4¶¹U… ×2 -!ö@âý?û‘}ÇbÉ€ÿÝ\•ó)ïÌS“—–€ÃŠ!vY´B‡DúÍLa?ê«%ÉíFkÇG<þ6†?ÞÞ^¾¾~¹ùÞH›ö†ÔÖès(St¥ÉÂÔý×$%̀ܮá¶Ë K ­Âpº€×0:9¸vÞskVcɸ§`•·/É ê7¬¿bˬXgnþxjƇG Ã²þü«>è­·öÖ5áB;7×ó…™köÒ7<’¥â0ÜYƺÎÄ2ŸÓO“'æ3e‰9ÎQ³ÄüäÙm~~ëå[/œaL±C²ö!©—ú}¢ÉýDíZþq˜q~†¶ÀE5G=Iµññ“ym×æ¶BGÎü5¿ iˆý¾#&ž2s_ƒ ‚EfšUÏeÿªY'sÇ*üMsØÉ8üm ŸL4Kž5Yë -ü­ԜuÉB XP€MϾphÓÖd ¦E0A4“Ì2˜ 5̜Ï0á󌂜S~F3Ԕð‚ÉT¨¢TU=¥ü1eŒjYQҊҶt6Öx™E€šörYd {%,ã‘—Å”ÑZ¦'•t¼Ðw}¸ä+ þ´r@›Ü/äñËÏ-«ÑHE~›œ«¨Ô6PrH‹¬™áh‰2‚«t–‘½JJ¹di Í“h ž ziN¸¬`Ko®-KxÓ2¸Éy–{áM -²œÜ8,üHxÔ¶ r2Îd¡NQáÃ"à)zÐS)Ŭ¡¤Ec5ex«¥˜VªÙ¥FÑT3M¿.D<Õ”ñH‰{…ÜQZœŽ–þ•#¥­²aW>¤ìY–EZ|O-OnñɤÅÏüçÿŒá(ÐIÎ-"R 9Uç”'~›Lç(ÙwÁOL׎²£–¡(ͽ -ïÂAûq‘wW]M¾Ýº™s”ÂS -lû@ÈäA®RøJbZHå.§ ΢6ø5o©üe0‹Nå2ÑLŸrZ7œ¦ü©ËuÉgà¡5Lªp•£\ç÷Ž”Z£s¤÷ñ'/Òâ#¿ýˆò8×û¨òs‹­?0.êÉmq B{v–´°™eˆ99ƒIKMbË6Ê‹Ö µ«¹©8Ü'³j®¢’ÃÆKˆÒ)mZ.?4N·Îõ ÊOÁ–™9¦ñì ºÓ„ÖS»úkbt¤GÃa€í¨O~\å]ÁèQy“pý³³¸9xz;s¤k){¾Ìia`Å-VÔ¶˜°÷¢Ñ¬ZͩՆ–úËZºmþýì@ÙÏY£žéîÑ2X¾ô§•ñ)ÅpÊï/ÓS‹´øäºÿ–ZlÌdg{鄷²|Óy”-ˆ\ºg–7mb¾´Ž™Ò¶4yM4wõ–m+ëMk0rÁÄóÜip¥©MãΘýL£bÉzFW™§—Ω„ð‰DQâž’Zz\ÚÓK×h„g_˜›«¸¸Š{+XTBïN­³&6á´ÉmVÝXta 9Ζ®«â¸ªN«ê²jV¡:«,³e ³åÚMµvRqO=ûbå :æžZ8§sLI‹GS‡œROpCiØSËî)Åîéx9fÐÚ+ÌçùYËÿ-þÌQ~æ(?s”Ÿ9ÊçkñgŽò3Gù™£üÌQ>_‹ 7û£—~ü/é½OØû™ÎôqNŒ€Š² -AI)ª3¾ï¾wàüçtȑÿY›->}„ƒõaû“N¸Ý³¿ú•?!ÝÊo¦þ‰&6a<™ú&ÝÖ#UV-$i8ÓfèNÂ0§C-¬«ÔR:Fh韎GŽààBƒGðŒoç+öÙ -ˆ}´”Óîôl¯ì>¬xKkÀ5þ<æùÙóRyÌ|…Æt?s`üþ^y?Þ¨±`¶·¦#×ÞóÙÞñ¹*³-µ)›vž˜±Ú×l…øì,gm1ã^çvã´`7<‘߸d—ùíNMŠššf)7 –šôJŸ¥Î’ †)+“J!ö™l«™ï.}`n».Žs7øÇ(ÓçkÓb£c7ôlN2mž}@L»~ ÏjHÖ 8g4мÐÇ5`½–¯ùüãóé¬ó0ã> -6{nÎ÷e9dÖ`›¼—`Ó'€EÓXôÌuÖ5!ƒWÀ>ÚÃá¯9 ¡]|—]ufø돀Ž¾Ì~\*~‚À ö"=XØÆ{zøP沏²Ï{rL\rõoþ:ÐÆpp?„õ~0`Ý°ÊûÛf ӃåÜsýÖL¿±¹žO³n™ÒÈ2û6ñ‘5Ÿïäy|O-îÑ×5lÓ=PñŒTB“A–fºÜ¶¯}nPƒ -_ -M$6Üp"LLo ÿ¢ªÏ-‚:2Ò×Æ·¶yux¾£uÆ£6çÑ@dAG¼AÉ{Ôf>jp,ûс¿Y¥àä€ó!ÆGöäÓ!ÆVþ‡& Ymy\O3y°ëþ#ô}`}Tø۔§6ojÛá‡<õÉ»0ކy‚Õ³–ümÆîŸ5±­,‡½ áÒ[¡+ëõgÎ Ü5€˜úty^þ”gù9wæòÜc[srÛKÞϑ;T$Ûú+>Ó -Íš6"u^êP‚©þ@‚)K.E¨ª<%ºóYbIýð[Ôú€$TGz¶`K§˜+»Ú©Äv–ÈÀ¡FzßµŸx°·á‘”WÞce…Ò÷2q°•Õ9Kôù¢ytVr΋­f^h¶½ŒçóÕNò&ƒô‹ «fšBƒ´#(ŒŸAØ%Lž³¬¶(«Y9pÙÔVÖbÞd_0²ð”—Hauø¦‡%¸']ûÞ »a`}¿Àøoºïf¯5™Sý¾-(·cpÉ2ÀX–e6ÕÞ$™ÐÂû[¾Ãâ+†XùÀ] ðÚ5·eZ¸DÑP¡˜ü{Óªë°Î&gm\dÛ¨ïxŒ«¯ùz…Lë\´°Å -P¬@ÄýpÔlyc ¢Zex&xêÈù÷N£df ‰Š„Bí -„=ìtN€ÓH8 L,‚’fB!ôÇß®½ïûÓnûÖ ‚ ‰ýè+‚ËíÛ?¿Ý'¾ÝBd? ´<ôÝLËÃÔu#DÉÙ3!2MÄíÿ£&ÑË"¶WF|ævMd» ÊâÔ÷Lð'£(#Lq4©e'à*áÀ?¼Íi8™Eoßõ³¶kÆ¢O3þ—6ûןϩ°j×ƵCî_|¶0~[ì»0sŠº)ë÷ó -‰ÿ8¬&|¦?U…jãÚÀdXHƔ햅 Þ°PX'îW¸°4K`àšž\Ós;>ƒp@"Žé´¦_\0Úuí…~µO{±OsQšìmÑ6W¤­.G[^ŒÖÂꗗ¢5×£-²{>~±ãÓ -îmýÀ;¶ÞWþZtá¦Ç^FšÁ(S …D‹h¸õeÉÿӕïì ×Xy=ê!Z:2Oû?Z -¾bºÙñ¹0Äô@£Íè)󈛖C§l4¯Ug Éšl(Ùõ²¥±«¡a–Ü8‚ÖéæÖWØ3•Ùá–‘œCeúØÂKÀ>kùð}Ôìz%ë`¹$CoŠ-©,“ýnè%:LÑÁS°ôØ´ ÓÛÿâï6 }פ£ocžCðQ~nñ©OÔ{m:ٞ;Qp­3.tîxó–×7C.(B"„<ipäµÌ/d†ØJ -í9&6r K‚gO9µ[ÊÊåΗÀÀr=}¹Í¢Þ‚Ñ^–Ü^%?ï-OÊÛ_ŽüދÚ_’|ô²õ¾týof™èåz¹y¤Í§…ÄeËM¡™)<+Åã·™«ßݺµ0¼o›¼WÅð^r_µ¦÷>w›: çn„?³l¦[3ƟzN¬b–Ïfœ/š”¯¼ñ©-ã^ GÊp¸ðv›C¥ÿØÂkÚ?kùðèQݭâ¸,ú=øGdφØfB„9,² Öë ž’ÿp™‘¹Ýd?sþõéOjñ°b1QELQ¡ýzYö”œU®í)WÕ&W¥„Ÿ—áådÓãzò¨X¤©‡w0ßRK–ýq¤L8P âBÔ0ʇ;Ëô˜ \μŽ–Í¶C“Ãr»aGÀøNTN•ÕZ¨Râ–yUB¤lh!$AȐ÷ åRA¼æ¾·} éß|‹KÕξ Yï$ Žojÿ[•È‚} -~G×RM©ÎE5¯Õ´Pq­4*Î'ŽÏޟ¿R‹+Çî/µBm}ÿÚ·õµm­äêÑÞ`R’gS°¶+l«_BØ\#84¸zõEöû[·–=±¸3[‡æc.Íý–5ƒ¥^?1»»j™‘mÇI-U¸È×‘ú·ÿê‚ô'µxDå8RLQa6ƒeÙWr–JP£ º€BZô '¬l- L½Vâ¼ÉÓyN˜Ç²Âsã¶NÜiq±ç®¹Ôs ã3žêež§–¹®X˳•g:w´÷t=FyeXÄ -ó¯/Hÿ$->ª’Àåñ!™Z¼úâ6{W¥JÒù•ÂÕªbUA+Yª7™¿"ÕˤÅÙ/x(W<ì>Œ¥£\òP¡Œ“ù,ÌK!¢µA÷îÓ¿¸K{w~vM—„Qö&Ü W9®øa)ˆÑ¿Wå¡éкnz(摸Œ|$.°¶™W1ë+*öÞùx4àñ…}œ¿.–÷£<û©\ûñMó´³àIW1ºº—S -,hh tÓ<Ûú7îìa}Añz}rc?ITá?\ßüÿïØüáꇿ\Þÿ ¶ÍŠò׺”fߤ÷‘×Ò<ûb/mqI‚^’· ‹ÏüNÌeô’¨xG€Ù¹%)¤þ2’àø% í Û&zàS"$v͵ -Œ $û‘1V!þ*ݵ55h>-.åÀ噲L Ñ\î±N rv8ÍēÖÄÇ\¨Ô}®+•Úk |E,"œèÁlWD{×nYMôG×Äû¡/Ó ›¹›žäO‰Z¯Ž³&néƒãšµÒ¬»¨àp²ÿEZ‘Ï'‘¹ü¯Øâ!§Ú¡›àӒãI‹ûï€ær0•õ2‘µE`=ûâc°’FaÕ,Ye…e®­Z=hïgrªËFY&‘9?œFæ'»Sëc¬‡oÕbÚì'Û¿XЋ%ÅßYMò'ã­Æ&úó4gOJô·Lóg±["ó|Rô–FOj—Ñ[²Ê>:~‹ˆ] 4&C꣋½u±Jö“§úyMü¼&~^?¯‰G×Ä2-ØdÌÚÏÿõáÿ¤æ-¡¼øÝÝí7÷7·7·ßùe«º·¿yöÅïÞðwA÷ÍåÃÃõý­hõ§¯~|ûöÚ¼ýk3Ï'ó4ÌpÓ6Ã8žt2;›¡ŸNdqMúƧú×?þ¿ÓŠõԟÿ“üûõ/2›ßnþé¿w›—ÏøÔïQ¡ôTÞ¼u¯¿Íoäò^¿i›8H\6p‹ÿ ¢$Ø@ÉwÒÐ&Î'“Èda 'h-&\Qð[¼Ô˜æ¸‘öòˆÛ c¹`4°0$N> -#÷e"ü #òI'úÞf”¡f)y“iV@®í9ú Ó'û˜QXό—™#Þ3?—™ Øøà^˜ï­ˆ.š7Ò)Ft£ÎÛO„­•y ý‰ü kn’ñíåÛäyQW¦Í4ÊFyéq™çÍ$aŠõ9Y}ý0m҄ÀøÌ¡n=ã19Ä {5ˆ´‘ÁKÂÓëê°'¤1ÄVoB'Ÿ4ËÈ£Lø¼Áàb–Å)çƒÍœ¼ØÉÔÉHÈZ„WLVº“n²<e¨‚,<®î4èÔçd¦EãOŒrOV£ÔÏSÄæé"VùzÏñ¹ïtŸéì瓟ב± Âdy½^RG]`A–§ã#r('!ÈnœdY‚͝¬7QN›j£ö\*ëϞ+ÔáDô`™;o¨?e4ýÁž+¯åÕʋ{C«ï«Ÿþïÿˆÿþñΐ¯Þ¾øí¥û»7?¾¸ûŽgʯïïÞ½±Cäð#¿¿~s}ùpýò…t²>mæÍ/~¹ùÇ8rðÈJ‰SGX•H'3ݶ0µÀGØTb{â$½¯ÞNœ1Ÿߒ±Á>m-W*ÒCÀã+«&ä6Âç¦,\¸îËȵ,r£ŽX/ g˜uÁês²Mµ¡¨Í;a¶ú\¡öÝl8؃PúÉ(Âåpo(úè·¨( Z+vYßÍ)sV¹@Ÿ,Tá@ÜþÕüpÞìÍ'µ'҄W 2¾Ât^/©"¹€¥õÂ0G£ Këq&Éü؏öȓ=Õ:Ê ìËq‚õUGœÔ^&6£¯ÒN§»Ø;ëš]]ßÈk•wövVŸ¶Þ«E‚pcÀ÷:9J轒s­Ÿ,¥vÇ°Yáòy”3ޖà g­ ¯0Üähì{{`p9\…]u#Æ -ãÆÃßɱ$GÞ¸ë ;턋ã@ä©¦Ö Ÿåg3rg9 e«Ï¢Flf9/Dü°çpXYˆœž‚½¼Ì,’è.B^!ËÎ<åôªhWzêdù†B‘œnXAúYTXKÆòœPÇAz—CXö'ÚE©›ÇÏ­FeÿÂ¦é¤ é;vÒÃë%Žã[>8Ž\lXFƒ0C\Y^~¾òÁM±VÉ@ØDÓH!X_öX¡ÊlË0l¼„A§Ú[!ØsúJµVygogõiëÅ×oNß|æ×Ca=Q0²¬Ô(3&3-Kõ¤Ï<2–48èÄÁ ÆâÊ'µš æ‰ÈÛ)ëΞ+Ôt}S¹;ÊR¨ýÁž³·òZåµ½Õ×5ƒhz›âgØý,œ˜r+ÈÃ:P80÷“Ì’ˆj½ð|9†ù†}°…… %Ù¥²§gl[²èf`Q&_V¾Ð'6™l‰©“ÍÒg¸¿EH.hÝTkÉV"¡ F¨=Œ*âτyè!Ÿ’íöœT9áøÖìç@=$ùɈØ>åâQg‚q¥ ² GÔÉ"ZÃüÂjƁíÂW³A󳧕¢Ê‰,"{n*Êk¦8Ž< ©5Ñ>æ>–G ™¬%Ȃ„ÆOÀFŽ2U²;€CÀ'ô˜«ò²×´©$™ä“0âX’ÅÙÉq"³ †c³OÍ0 ÌÕÀŠ¦æ –'ÒĊ ›]V^ƒÝܜ³\}MÀ3`°;h ӐFèZrœ'ÙjàѹëË~’ŸÆI^Q”â š…¼ªŒ¤ðÔÍÜé ¬ëþ±]„+¶GW©HE• 1S>iwKÊ!ÈÜ{áçH•S)¾Vƌ©©„©oÚr‚õiO:Y†#ˆ’Ö´%âì$Û¨éÔ(ö¨¿WôðÆÖ_Z£Ÿ9L ¼‹ƒIý˜ç±¸ YÔl‘ã1°¬…9.("æåÁ§ÆÉØk9nšÆdƒôøUíÕ(öh8„Õ·å@Ú¬iÌ)Ë^ì¯çù'¬¿µÙ7#Q“C–ž_/©MˆØuA‡{Äëˆ(ыº°, Á¹²ÕjSÖö†œ`ý]•Å§Ô ë loh°¯òþŒ`»¾¼–W+/^Zß{$½O2pA í`ªj Zà~¢P¸= ÊEî´´úQ¤7Qá–-H¶"€ÍnÐRõCVS1hA̕õ6. Zhma"0ƒx)û+­ž–á! ‹Ù)xb1iÉçŸÀ´î&-y¡…E«FH€¹X´À~à cP,Z䌘ù…E‹Œö+3háPé¦ivƒV©ÐسÀQÇ'¥½·º0ñônÏêÙ yž–ö,PS–¡Ø³\v(ö,l;€–ö,°fœ´dgÁ ïö,ì4¨' s–lȈY)Ö,a yâI@c–üF¼skË£]5fI!¾œ;qv56µâÄ'Çcã C–€(¬¾Ñ`cuïsi>>¨x"I¦êf(ÝsK–:0ԌEKðêŸá¾@ê`g l Ù}8æ ¤ÜÇ¡qÂ7Ê@»?°§ÀRÉüTÝ¡Ô¸?’«œ[Cã1,El¨A9òô»ŠK°Ç™+“V‚´hÄޝ‰ô -âóÕïS܂Pþç˽81ŒÝèL±x©-ÍøÎâ_øˆ1îÞ*ÒR9·Šsp  '÷Õ;È'#(Å=Ãn]FÅ=ˆör’&Ü? )õ÷Ê (^±#¹‹p dÊ;¹p»ìéý3'!Œ\¦K/!LOQÝMu”AßìoÓãŽBTá6{½"g9ÆX(Î9XKøMîÄsÊÒ]ØT¤7°iÊ~¶[—!؂H´sõB7¦uÙûsÊÒkØTô—÷ÆÖ_yÀq(s-oÐǕçF.B÷Ñ ½œÃ©¯®¼BXºk5ó 6-9ź\:1Óvm ºM?4]aé=¬Õüå½¥õWþ‘º„é™ß.ÀY8ÎM*‹ø½h8r;óÉA…ŠL³7)ÂIq V[œë4AÝž?¼#֊ð R·‰8¿£1´>‚1û£1—GåÔb¯òh`"‚‰BÃÞ§îëS,s±kî†Ü롄¶`‡xî± ØB…bzNV¥·VƔ¡;Ö¶*¥kØP%ˇP˜«Â*†~lz-”«2©|»Z¯|€·µ÷¥ï‘‡>‹‹Þ%.‰¥ödî⤆_¡a×.^ê^„'$VnjÚ¬ùhq@ƒ¯è²sJˆí"sòXYñTq,ëÓ<ÕNYzªkÅ⁸+BK ©Ye•Œi­og^mº–ÃtÜ]=@”ÆůWdÞÃTÖ~Æ/²–NëZ¯ø£k[•b.×<‹i"ðÆ dӞW:-„¥ïº©çàm­¿ô's_ƒ£ ÛÈ+ÍÓÉEót[dÑ<±LhÂYhž`/¢3 ®yB?™svͶ ݪ§‹êé¶À¢SÂ*ž`]¨žÐ'»FA…m ²(žåç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgiÄÛyE¾¢uîèËդƑ¥ÖYÉEU¤ˆöÇ¢Lâtè/µNڙ ßԊ}á—Þ˜SZ`C6u±6VTÊÚëB÷¬¯W+ú—ycëo=î ÿ$Óü q+8üÕ¯Wdp$zÇâԜT#Ánë ö8Åíó´³6!ÀXsŠõêŒÅÈ3Ì -cÑÆäÔ675½Š[÷͹êý¼±õ·þ„¾ñxT=찃U edN2ÊC q} û! /Ø}J[G™­"«…^3Øù‡^y«ˆ+‡:wPÍà…à–îitÈƟ)Žp5ûÄÑ'J:™¸^tå}{ꪍq œ¹×9“/V{‚¨IM3lÂ}htÆˈ•u3B@"/ôðåÒ)—I}ŒDôýöp³;>TôC9K½÷¡ Æ¡W§¹’Eöù”Œ+‚*Êd걃Dµçgà”Êښ°¹²B`'\?£ÄàÞƶų̈Ð(yñ4Íꮣ]–¼aÏÕ)×®áÛǵPx»¬Ó -“l¯F·äþŠØWØ`-‘‡Æ4èw%+–Qk‰ŒOBPµàiª[3AGM½֌¶©B°.íÁB †®- z¶Ö‡æ°mÞÌëùÛ{[ëÏü É!Ü@ AjI'@8ýØ+’!—‰ù"!žtCqÁ`}å Æ^o¨ºÂ:¿`W„R:Q¾ìq+­¶&átÇ"WìTŠ†ØEÝhdHx‡°pkÅ4 ä¬]p…*†c^ȐiE§TLV¨ -½N‘TeÈJN¡È©æ瓆NèÔM 0̼´“k`hÔ÷ÊûÊ?´ÓÜÙ§ŠóŒ´ «±ÇŒ•ò=ìL›[¥ |‰ï E@?u¶©†D§¦ƒo¹SCUð^¹Ú;à΃i‹ šQ§D74xlPû$Í©þ¤2—ԟм٠ŽíS–´©MɎ¨:/Me#¥Ñ¬ý4( "X-VloJ ‹× Iõ”f@_äƒ-Öýe¿Ïm°<ÛÃ'Ñj÷zE–ã'Óì"rÌÍøFy#¿²PlsȀ'0ÖZQβØ6e?‡ÖNXˆ7®õ›¦¢`º«ýÅôóŠþòÞØú+¯ ¬_úß°òy”½^‘g5¡~CÏ qÀ²œ…ç9Ž¢’šŠ²y‡¸hÌ)Ö«?jä¤pm î]Zk¯…b–׫ý¼±õ·6ã Ó3GœË¢N‹ùzIÆ;)w­še0¡°¦L‡œtÄ/Ôz#Ò †¦-§”NíQ'CT¢ë 4@¤˜Ò§ýlœ£¼Z©U?ª4´÷™u`ó/sª§P<Ä y„䬸DÞÔ¼DÉVف¬¡PŒÁnc}!º6LSm¬¡X¯ö¨“ˆ‚yÓ4·Dˆm¯F¹*/l¯çý¬±ýomÆ!À%=(ZKôŸâÚs2lzáÁ!»iˆ„•Qº -Z¤¿©R®Šôã4µ çÈMcN)½º0ad3ŒÔƄ«2†Ë;5‚9-Ê˕jõ³JK{ú“ ՍÃ$ȑ¿»ã<›˜w¶ ÝqLMŽ¬w‡Õ#dwÀ;Tº¤ñlzL´xä}¡h Ÿ bÞ! B–rÌ;ÆL=¯ôŽº!ºÉ@ï4·ŒÓXQõW`ï`ºa^ÃÞñ}d9ŒkˆWÇ?¨Ð-¡ïІ‚*A -4ç©x­ãѝrå㏓¡©hÐö¦­B)ºBeä|PYmKú¥ÀÒi¡¸üÇÐÖóÏ*M­¿ó¸êÿYpðtÏ Žw­dEÈ9–˜¬¥¹"ӝbC°7 ä^›r‚uiO:Yþ© ›¦­dæèÚijÍÖþr^Ï_ßÛZgÃí`<!ÈZ5·Hœ,r—<ŠPK@”ð °1öæóìpá«Sl›Ã§¾©`-ÏM[…Pút–E*Lz³Õ–°¶Æ¹í²PL,ïæýý½±½ý mµÆÆ"Â|@aŽÆʀݟÅ@Yj¢LKpݏàiNÃPÃœb¢‘ÆÔzù‰Ý ò…2÷ ÕÉÈ䶐©=F€r§ê5$&[t€«_U‘þÇDP -­” æ ÔÉ"uCÎ5J % 7¡…àë…èþZÍš–œb]ړNî‹>]Ú(lhÃœb–w«ýý½±õ‡6JCAÏÇ6öEZÀýNöìúpJl#d*2‚ ¼1Hì°Ô^b¸¿©hMcNYöêd=oÌ?aý­Í8$=–R݄^ÉÂ܀uqP¾ÈÀ'ç¼ïçYù׊% 6V)ÖëUY‚FîÍVSëìój¯F1à¯çýJc{ßú¡ù³„ ,!q%nÀq8à8XBâ•àìÀÞ­Tk¾JZf; Ÿ¢¬™ª„ YPèëÀº 1å^R™ã4ع>Rˆ/SíØ÷z¹À€½­J±NÝ[mäÃE¿©mÁÌ;ĶO£\åÙ^Î+úx[ë/ýÉ),1¢‰ -¼œÅõeÄQÏ3¸ Dϙ6PF²ê_äÄö³}—ȉIäu¯„ˆ•œšV -ÁúrÍ_©²½GºîK;IÃÓko©÷w2ª¿´µ³þ²Ö÷;¨n=#È]žN•!ë&uÖR㚱zƒz€©‚±ÝYc¯,EVEBr‚õgÏ*– x•7„ ¡Ýû3‚;‹õµ¼ZyñÒÐúû~ª ɹ3½eÂU’¯WdȆ“ ðQAåé•>º Ó|¡8‡›­¼^ƒ0·m‚õéüM©I1îMKÙ¢øk—¹ÉuÒ¼›Wô÷÷ÆÖú™Dõ€QàØa•}½$â76Ô½±ŸüC}  gp‚ɪðð±©Ö©+¯i©PJ—ö¤“~Φ¶EkQÈMŸ…b–w«ý³¼±õ‡þT2xêdI}zGºTê`È x—Ãî5.PY/$…`*aÀ­h©­‡m×Ïm[N±>]›42œ5€jÔƐÀ¶ÏM§F°'ýå¼^yojõ™?Í¥¡§£Þ$âCÊÄv2ÌZQ…45)"×’(㌠3sОÙ•Ç¶bgƦژS¬WÔȃ2‹Ú˜PD;›^ ÅçB_¯VôOðÆÖßúÙa`–‚:ü~ÿzIÍ%5ÄdFKIjPƵ•bÂÈX²-zEΐ ªiÌ)Ö©Û{”,CÇüxµ±¡Ó©Úk¡\•÷Õ׫í j[«­#ø9#äÞøöý›¹¤v[@»q#Ъ »å³»Ôç -ìgõם«’+ªȎH ԝ094»¶˜nÙÂ4R…t#k'pƎ螐ƒïЙ.{¬xnkéT.pnxGˆ¾[ ¹aï -~ ¢ÝH\f¨Xîd>ÎÊ-ýiDCArO¦£8{îv’ǝ€V s…q§Y6uÅMILoâ†)ÙPcâîhÙW71@°X.AÜ åe£¯Âeó‚áޛù=›g† œx¸Á]©fTGÂ͔\6âéÃ~;Á=ãS¡&yÅléNÙP%´PêJ5ÈumÈPÙµ¿½]_«Tó·†ö¾ï= OC¨ˆ2:Ø°€n;¹@·gdёŸ r>þÜ·áá7*¸maðrnÆ -Ûf> ²ÆŸ ™‚ÚŽ³væXlì ä²-[~fhT¡$l`ØçZcµCKê*@»[!³» -ÉZ€«‚È î¬ñØÐÞ+{°7)käÃ2©²v1FÅö"Òña¬ ìÑZY@° ÁAB´ñuì50ß%ô+5sE^£ÎK^cÅ1šx¼NÙ؁á®1@´$Ø5SǸB] ó‰=3è†kV+˜ëœŒ°€\÷Ì?µª@®ëâ,ëýåºÇÀ»FL×q]©†’f2©\Š™l¶Æ -¦ÔçÕOÐMµJh¡Ï•jéڐ¡¨k-ÚÚßʈõµ­½¯«ßC_Œq´®Ô6«ºƒ§ԐÖkrYS!Ör>Om3NX¬ µ@¢KCŽš¶î–àj{§B¬/mÍì}[ýìÀxìâüzA-PhlA\þéhé0Z²Ìª¶¹>7µpðAôòv -ao®TÃA—v (흵pj¥RÉ¿¤4²þ´úÕH¿Åd (u¥øÚ·°i€~b ˜V"Z ¦WÕ«SrB g®Tƒ=׆ ]ûkÔõµJ5ñÒÐúûê§Ã?ý<]ˆí,ûEóp@4Œc̯ºN ãÓÐX¯&¢P ¶æJ5¨³7d`hﮅLûK•JåKJ#«/;æàƒ‡`.ñ¤²’ ¾=岂””s<§<®•p±÷SªÔŒlÝÌ o-9amtjÁ@zC&éý-à”õ½ -¹¾{ijÿ#æ“²~}‘qóü«Û‡7àà¯Ë?½ºÖ÷ùÍÝՋÿ|ý£õ»Íóß__º8çìæõ‹o®ï¯®oš,~l:úïÙù‡›—?”.Ž½×7÷×¾¹þ‹¼Ö«·ÇG¦yyÿ›ë·íË­þ›ëï^È\ÜßÝ>¼·ö·woö*¸÷D£zô;ÿþúæûžú¡¿¿ûËÛ£3{þLïv:¿}i?;xÙÓºùó5®zâßTó-‹8ß0« -‘g:eU¹¦%ë_‹›ž nþ¡7>•.K¿µèW/lr²¿àoÚ6S—MüUï|¢\ÎÙQG\¤-'÷C§—wåòîq™<'jÌ6rGŽž}T„µ k<;@ùf·¯‘À/%ÁÑZP>rŠ j€7pOl>Óð l¹&T¬JB½†WËQ!« ztï„ä0=Êñ.ª="Óù½ ¦JzwºÙ®ç`8Ž¦†!Ó'‚ l|¬#uŒPÉÑzŒ:%äf%„¡~Þ4@‘‹¶fðv=)ƒÀç!ç²~›œês Ìi1sfEJæÙ úóÄ<Ð"ÍÊ·µäqêõÁ0ÎJ‰œ•ˆœÚ„±Ñ`Ø<ѲP9< ÐSÀzÑÂã’*›ã8•ÙCJúÔ÷¼„-j°;¾ÉC¨|Q Çoeˆ]ˆEä óZ#»×¤fQ­ï‚t¦®YâDÓJÁC%¦Éâψ '%ÍÄI%³š€gë5uSûº·I?£ïl¦Þ ²C0I± .¸ê£#5á÷æfJŸ˜Û‚Êl½Î”éöÈ[SPU‹¸ÂêMC’ÚÐ;FÏë@è„ $}¹‘F«„ì°t“ÅÑÁÌÆèh·+«¨Ït†CÎHšGÌN³‚‚r£ç‚¨÷”ÛtAZ[`1JÔ¹5³mR&Y` -Cg#«å>«P'Š¨‚ƒqÍ#)1øUæ*¸BéaBìWàÚ%u ¾÷DbñO°vîüÉÙfx?¦ö ˆb†;udf?ù°öuòØÂNwù 1‰ê¸u¿XƒŠÃšçÂÀ”Ï)Ú:¼rDj¥Èq“þ<º[^Î1a<áɜåíæÑR à;r$ -3Îe -™)£„ÞÀÂ̅¤§™éV,̬`jǓÔ.ðN2.˜ú–¡÷¶õ–¼„©oÂÈ8h &Å4%i–í§ÙGf‚é=£‘&rêÐ ~)3ü .p9A¨.€ØǍõŠÝѼ’µ "Ù@z#³c‹óˆTĦN÷3 Ϝ5ÑØ$~ž|L:ˁj°ÇD¹˜›Ç2°6½7|Uæ€ç‚F0£˜â j4 ‘)*:#!´=ÍÊÃíózí/%]¡4 Í=oñ€\¡õùæÐyOP±ù&`"™ÌÏ4!ðå¡!ÚǺ4²1挔Þx(£RÈ .€v=*‰Æ` K]Ɍ)뛁ʚ"`ÚqCiáJƒf/€NêÕI‹Ci¾Èr^a\®Ì T½âNû7zéHÄíHÀű•Û§”™I>åYÐØlx gŽž²l…0Ï5\ÊNMù[#4a]‡¨€k{Æ^JÌH ¾('µrÌs–éÉ8‘guïei¶+&$ô›1$ÌNjgu²ÅÓÓoO³ó¹S”UŽ²J‘8ãÜ[jй –ñ«˜F¤2NÔ)(sqbζ&ÀÔHÀ‘„Öéæ³&&£Ž¼»n6‡ -­˜Å‡Émõµõ¶'¤²qJ?NV—I¯Ø˜q o㨎š>k¶ñiª÷ Dý¬;uËðŒKÆ/ö$È=+#e£ÂøpOo“Õ`àE©€èòô˜j×h‚Ù¼]r=}bâ2RÉ/Hèð՛<·X¯üڞ¦—qe;-ák鈽Ch§Ê&|*᪨zî–j¸ç{1Z""¤Žv+,]ylJ8Kf}¢ä!Á‹6YBþcÀyœÄÔé -DB=N:ðèægYñŸêýè…üœ’¶Ejb¼0bˆÓTùH3ØÊ { 5}`8’_‹³ƒÎ¸¡ù9ë ºH+zEÄm‘Qí ±‘WNÈfUË‘aTž½fÐú°ðÕ<Ñ0;f½V&w2¨x®óË_Øɶa£¤ÏQÓ¹*ŸÃ,…QÏJûgÐC„hù"|Ï tU^OºÆÙ9ZŠ¦ kWD0¥68d˜5'Ö®ˆùíؗäTL¥©.T2¹‘¡¼­ƒïöœœ}\êÁЧH¾…À<ޒ²q†^M±WnXHä*]š51×ôFK4«tÏCµS•Ç# ÇS„Ÿðbâÿg}'NêôóŒÍõºxP¨9˜‚<ÆkÓ±aŽœƒ³9Ä@Ì£ž¡½VÉÞ231\]xA{“ýÍSЫ‰ 1â#[Ê%nsheI^%‹·½pǀOàäT˜çcI†ŒpS{oZ„Ž6ÕÌßǝ† Õ^ Ìç(@yþ܌5–«‚@@&ŽN¯93r_ƒ=J£79-vúº0ââ}É9fMDȌ6àÕàS:˜"rNHAF/c§­ £á…CԘap¤þs¼rÍÁBÀAåEZ lrIX*Knyڃˆ)Šš™ÏXk a`´#' ÙG‰!À¡šbŽ'(²Ä)ñT¶ývj65’ño ÁRG¬œŠmú³-h¯¼’©9ÅP ¼‘ÇãîŒ -ÛÕx¦¸•ÆG¨‡8’ÊÊ æfS‡z#©êóå22šQ+3ã(à`R>@m[¨¡(pÔW@ ƒK<'ò Ÿ?‡„h jFÄ &E38AÿЫƒ&†„áYî&C Ì•®ÚMF؉L9ÊŒ§!EŠ­°A&Ñc‡ÑÂ@SŽw‡}‡Ì‚°åLÅ(žÕ3d3=×ÚÝì¡ ñ™T,I˜dE!Åý<ªeÓˆØ¿fõ ñ¶r~¼'µ8€5}LTˆÛM³®@*2]¯Æ#ܘÔ+à~€õƒWc…£GËㅓYY9¸'âóÌ…U8ÎL¨™V|mŠ²EQ+sm`ÉG /ëąۡæú%3 -_A¾qІb.Á¢ï™£ž|ÃX´Š H–2³¾ j1ib£#øÊU -y„i¢À95èÕKœ:ŽÞ‘´± —ÕTBÉòفÀ܊ɘ(˜Š¤Ê™?¦Ç£%@aB_¬_$7åPâxœ°Ô“ -[öä9\T'ƆÌØ"ÕO”<Õ!ýtÕ]‰<_–ê"•KÚ#,çò³«G¼NÞ+A¥ÓHÎõ-ëÏ©‹PYˆQÍPÅ2ô¹$£X ލ)º âdຳ[AµÈ\ò‘7Ö*bRä&tú%ž¯ª'#o€Xõɤ5g?¢=)šF»ycȍýä)öšuÂxC§¾¬P(#¯¶¥ó+:G8Pã¼|”W+hy4ʬyFFß&ìcKB»¸"ÎôÆ z䫝’™úy:视¬’=Nzê+#½Ÿ MËÒfÝ¬ÁlK;‡áü †Å€aý‚4özÑFß zòÑib:zk1òŽl1;€i¢&ẽšSÓéÐk_r}Ô£™Yßñ—ˆô Qq©”WíQ`úg“M’fw -¦GðhÆԁù võÏkjØ`Š‘ÙQӁ¼Æ‰ô1ÞȽž+Âõ^#£ŠMå…Ò0Põ133l¯¢½.æaÔ4µä¨ /"€_gÅíëªG¶­”œ>WÈ\l,$}TøŸ†OÒMÊì7ÚS}#ˆrPÇó%&጖!¨ë‚"«™`Ä nƒe}ï{š!g ÿì±Þ-Š›ÂY?©×åªØܔMö -•AR´âêbPzKÁCK¨?9æNÉ´ª±âÕçœÔÂU²€Âݜ h¨ÆÖbä#C¡gâÃpßÁ¤á¿<°/؀YВå¶å•™Ì±Ó]÷±[æì¶Í±s̨£Q{3–ÃXȳ׫R›î˜8¡I½i2ûl1¯³ÉZ<îS4 -{‡\?û‘·LIŸjYÂðĤÎM߉Øíْ™OôS1`G]PË'”Ç`10ÃTG›®ŒMkՀ—8˜yRÀêæ;3_±ýœGÞ?ûÆî˜@(˜ÈªÑ -í̹\ÚUæcS]=ðAÀ;GK!ÒkØÙötœu×0µ¬~’‡w€iuš°®©4ϼ²sfp.MB„Ê9ۃÿÖ0Pû^ƒ}'œã³ém$À*‹ô ©¤"¦xÓ M²!»i7L£ÆÓðNBßì+†©1¹s§ÈÕ2›S!"I¶ê ŒI1Ù`ß"ñ?£RMã?†—¤‘Ïc\þÌÝgÛ×· „¶E^„pà¤?ÃwÆd¸»’±ß~e²CrBc -¤¶S«œf£&I˜çÀý{à흑Hè`£ÃÌ«Þh -`€Î$JosÇtü ;£n8>+jˆvdឿÐúI #ã*P;^Òa;Ï -ç|Yü~ÍSy´+ȑRšoR¨A²bF)?’a;‚ @c5Ö!Ä+\v43èJD‘|Rn÷¤h¬Á$2¥öLeG)RvÀvªÞ\ÐO;¢H¼¶N¶Ãm0ª0Çî`Õ(¾({¿¸æ‡ÄDlðOt¼Pb>î ÀosÐ -&e!df.=¨†œ§lòԉ›>ºÉT@¾@ŒðÉ ÷V—è)£§Š |ý¬Võú¦~\ž#±?»N"P¦8ë½Ö\xö$Dl‚:Å÷¤ W/ÈîÏLú&ÜÁÜ`ŅpPÖ§R3Sb --ø&âšUŸ£uM{œÌߨ0Í̊1Îêó¥S)AݽÃè mâêV¥-˜©¦S¥Œ½2+(µW˜AøzTë°ÛÇ"TŒ?hVvadŸ´ZšøuÍãS©ôèg}2E9[º(Ä dçØp¯ó¾«>h:U¬±¹c–ÀQ=Èzg[Ðä¤Ó\ŽB#mn “ÑÐt -©“"Bp&%ùZ &¡×zt̑ÂË!ùÃw¶¯ 4zxúXôå’,„é%q¤l‰` ˜ö4šx‡Û¾qfO“ÆÍkFܓ°;˜ô”ó÷ºKx+¢=Ç3 „0…ú\)ÔÞNš‡šW5µ3OÙÔh:Ì UVŸÔ;É%…[™ê ~@ø^¯ï.2‹™yi¥“¶``En` -ÔBP±‰k̅«Õd2uTìàm£ù)ü;·‚ŠÓ!vž\d”UC3oÅÔJŸË:‘‡r0ÐT˜5ÊY-zöý­VørîÉùIÜ©fïÔ»Õ® d:ûÑÄ¡ "L©ÃLE4Ï ´Ÿ¡úXZ¯X Äð˜Ńò 4èØÏ6‚AuZ R‘|EÈêÝrîŒsx%Žv‡;¢,2W&\ðÉs›Žsõ³‚ˆá-šã~‚—Ž;Môuˆq×T×>†¹0õV‹¼'ÁÉȬ1ëc!;㶠Xxf]kL FTB|RVEe4LjZ€™‚0k - xM(ÆY¯“q²͓üòPpȽ£ƒ@›t Yì;AH5_ã¬þßÁܘiVÇϪ^_“ÙêñXç3b7Ò¤7]0ãLäå4õfÛ¬°°·we9ŽX7Õî:µ=…A‘e PâĨ8 -ƒÄžDzòù|WL‘4ړ&0ææ1ë0¯kúœNLͦ?Â8„f§áÑc†N Up‘gÞM¥þ&-gz®{ÿïÁYF¯-M¦fA¢â‚÷Áێ"ÄçØd̤1.Ö0©·›"î5PTÓ¬'¬özýd=²fRíªäȅ9¶ Eª–ÖŸy{ŸCGSçÜ +Nå×x¢;Qay“á°ò\PWJ0F0ZšÔR ‘QPà”,fM~E•*•éЎT¿àÏr8 w¶:†w'°»ÅçÀ 5xÖ¢­ )êhÿƒLŒÓ P[pk6?¬ã7©îÜózš©×Njn„QâlÀFêOÁW׃B+c¡v¶têޢΔĄ”'CA† —3ËI ˆ®ÕÐ ¦V7üHpm˜pôö%25žSM\4k[júèLzÀ;{`þÎM‚[M‘”‹miTx©e^!ÆI† éLüñ¯Ë‰nXõm3½œÖâÔñŠ ñ¥Ù/1aÖ¦4ÐѦALÙ"f -ç(j .®Â®º¤cy„ŒÑ•Ghí×Qýç]ðþÿ'£+%ÌâçéŽKdOìÙ¹Dt8»Ì0¶ XÏU\20#®+Ì}D`ᬹ,JV9¯W¹+`¹Ž£è…|íTp@dÖé˜äŽÕÔ Û®ú-×yo2pœ€BrZ!xFÝ*šÏb¦³’‡èÎ¥­ ¢Ê42 ™i«]£tx \σ¨ÚcqÑ)6MÌ)×+Þ{t娶Óqa¡ÕŒ´Ñ0Ú°õ10’‘l`†!!7FÆe­BÖ3OaÜÐæ Éþ-<Ȫë癨 -¹" ¶$.Z$XD @kv^ÙRq¬ðgˆj¼/Y‹üÂîUòÇ(u fñê 0Œ‘Ðw¬AÇÙU±Fä´äŸ4:EEŸ2aT…ÞR#ɖì»{[½À¦g$ŠJȄO#‘§>n­®ÀQŒ&ÎCkcBÿ¾l¨ -»œQÓ"C©1¬z-‘ƒ1V u°S·u}Œ 8Cw2~(’<Ë·a§u{˙pdŒ(?úVæUa¸¯€‘üë¤%`H)rqˆö fŽªX ì”ÈX¯øγúmô¸C47GyVÿ°¬X²Ã¤`J&2…ÿq%Tð?Œ#1LObÒpŸ„yT„ܦJˆ´ô©©ƒÙFf¹S`+ <-‚Ž´?F&—Pg@3q܇Þ6¸š¸!øß&½ðÄ„êëé(Q#(£d–ClÍ.6€AkkâáŸÌ,‰mÎ/™\öŸ]ˆJƒpbê8ô#c: Ð^O‚{ÄR¢ §1mà¹STš°:Å?#S6‘î7ý6ޗŽÝUà?ŽGÜî“þӏ”]ïWþ‚ -‘P;úᶃc™ÀÎQŸÃÆGH|þ - fKÞÎôS0§º‰üt16&ÅaÅ à6¢Ý ä0m9öÑÜïöyYñPo¨Kh ²‹€±7¸²AóäL½A¬A˜• ¨œ)(HjêUÖµç‚Z®‘®žW¤›çÅsd[l¹â6'å¢lr©–$É`””ÔDíŠ2Áþb¹pJjéœ:=C0ÁTÎoŽ®ƒšˆ„¦úŸ çƙÂDy¶“[¿7^¼sRõ?S=pÀ'I‘Ù]½O¬3e¿³Û SV¡ŽF¼N/ £}!Îjè0QÓ“Y0õ2ÃÀÄX^Œ¼£"LŒ‡Ee1`.ôàá/ô„Å à ¸¹<¹FE@íäΓU±·©^uˆtùb£ ø`¾**5XðöãócN”L‘ëhõâ?ö,°87îrHˆº|Š•©€§ -yFº[à,î]´Ôý9zÒ@‡ÓaÊEbÄ~әu"ˆô €Êjj•ÄÂÁ}/$0åjÑð¶& ÉÑûÙ`mâå·êó£YX¾‚À%3»ן¸NTŠ¦K9sYè6«»'t¨²>ŠwÐ2Aeóåïh†€=1±Úë…›ýâKŒ{™û_nžÿááþæöûÍ/¶ÛÓ««w¯÷p‰Êë8³rÉ Ä‰Ñ,ª4¼.dÅ)ô]‘µ’e˜è  MBïYêxMp£ÝÆN«)“õA$-)…ýÐÁV}zé³Þ÷õþ<¦ §œ"Õ¿B1‘cRP‘J|:Qñ3 pԓ™3žJÛë¶ÁXÃь˜R¬>ø‰+@1jÀԇ¬)Gªj¹V$c7*ìbeT\æ?¯wÄ-<0ƒC–0Þԁ5º¿9SŸ8Ât0¼!+’›×T –©‰ˆ£YÁƤ`bè%ïi-F¼@§òVb‹yR÷ `Ĭ«…~gÈj_#¥û©÷Yçf½&›H{Ê98nôNÄØëiïÐ#ÂNè!1 ÷Æ»r1^C§÷íU€:oÂââêÕSC˜´ž²Rÿüªã>e^RÏzGÐ-äa†ù÷å® -Êx]~£Šmª'–4‚6˜Kß,<mÕ»SU¿ö¦íÞ,*´’‹³”q§ ¦ˆõ9Çês¦U•æ•@?Q•Ù£T &ê“þÆYMcŒžœ)o©IN¿¸yÞO£þ{ø=`GÍ°¶2]›Ó‚9—´3†Îx¥Îs_Ò -¸Û5Ȓ®ê@ÊCJbq„õª XZ?ݒ¦í´¢áöÂÜv»xäù¡É< ÛԷ̊·èíÚZ} g\`þwÚZ×N,x±=+A‘ öTVðla€Œ`'G†   =p ÍÃ3‹%2WD†i -„ë E£ÛÑ.meމ¼7æ¡ ªºÞÏô©aö .hú„k!˜Ð3¹öG’ŠRB¼Óax궛­Äæã<ÇC Áž`Ï-+ öó}w¹Ù8$“CyëÅÓp,³´>A]FØ/àõn`Áýxʚ!~'xLî ÖãÖð4Àç{v?ör)K®Ô¡¸r3•Ãã÷ú9 Þ¯K)+t|,zƒ'ÀÆàMºF† 9zê½ð‰®`ò ‹É(gã¾"*F‹‡V|ŒxV­†–vÝ/þæ -‘Ýòk.€ÕJK^#þ&r¸Ǚ˜*;,H2±5`n\ù ÞÆyqøóe0&U…x3¥5@^ÐrLáE朁ð$‚<3kþÅS£ßãyŸûU‡êqY0Ðc|\RžûñVʏ™•t8ˆu™Eõ˜ÐË@k`JSqe•ÿˆ˜Ô Þ_=¬~ðѳG#g°@¸¡¢@ÖO·Eì­Sc«˜æ¤j ùðŠQ[´ HÆLÂù}eŸzüÁõër£TQ‡éJVûÙGúÚɦ7KXFË&ÂàK<OQ¡;¿ÇãV)ªÜ'h•añ@ѽÉ ‘³¹Ü©¨R¾ôX]!Ô3gCR=¸ï1­²Ìf·ž†Ä’©¬¸nD:ïG%p¬ê¥»Ô]/Ém¦ EngóãàêZÅâ²òøû\+&ÂVÔÄ ›“„ä.¯‡êk ˜(­eªe¨ÁÄC&}Mt ÄOû³¨¸Rpt9oZfUJ—P"Ž Œ±fãñ»ëù¥JÔA; ªá&ò í¸çbôpõÁá¡*u>Ô½r¶~üNÇV)pJ(€a«?-ü´[E¨Ê|CŸúâ‘DyTJ ½„Ãë:².“P¨Qóž9çrÿQµC‰„R‘yva2?}qv™P"Dƒüí Ì°ÐèÝmúòͳÿñ9Ûÿ˜£ýwCÿ >þG?õ l*¤ÛÈøz¡?þqiª¢ ü1‚Ê$*®ôãk(Áðc´¾å‘Í>†O Õʊ>ƺü¹ž$ci‹bÂc †uÏÆ=†™ÈCcñ7Î6¨Çø…]õ˜;É%`Ø Gî8îR;7â1¤•/ð±\H Ä;¾!0Ãç»àŽ¡ý>땴cT‹RˆPR­ÛÚaÇ«•_tm…&:QÇõ2bw#×1éL~º$:®ÎÅï¤cfúœe KAœ¤@Ç·gÚ t 9¨°Bæ3 _ÏÉ9FH#Š9F$•¿I9f3§§NÈ1ÕåycC @”I ŽoBpÌ¿ÛޘÆ1&݇)Ï=áÆ·o;ÛݓÈñ0ڲ͋iD£±°sb%‡¦5ÁÆÍüïä7•ÌíTc¬®{2;ܪö$ÒÓôq¾9›ßcòŒY®vžsmÝýYì@ãüñŒQ×Ç=qÆ0 dd§Ã#V -Ö0c4ºÎ:Yƽ*ö´¡Œá^bdËÙ¿_žÉ5dŒÌ?2õÇ¥]ýMzý=P¿cü}öaŒ}Xø-„1Ž‹ÚŒál¡Îb?MÑàã£FÍmà‹qîøB6z1„d¸Ú€³DŸNÀ‹9#‚“¿Á‹5Oªu‘H”‘ðbIÞL3Nxo§‘Æ]í>êy'»˜Syùl0°&)K°‹qûØ v1ÚO!ã½¢‹qٗ±”‚êÃ~mäbN⨲ÙÈŲ>5Ã0А´–ó6t1ߛ .¦‹™é²S;[Ù¹ÅXI T;°Å]Pµd -Š •Ù ÅåßI,æÚéåK°x<–y­¼bñm®xx -Z1ÎYaÅP `V1>ƒCÇeRÒ>êqRñ¸ô©¨˜ï¾dqŠ1™ÂEÞ0Å Äb-”â{ˆè”âÛø“ R|[­bÀðÃÁ(ÛZ» Q|;ª„b”<㗂PŒ¿ÑD'²™`‚OLõüõ$ž^üü•NLL×ù$œ¸)?hbDؑÖØÐÄ,1n%ÈĐN¡þ:têÕ—ùZˆ‚K „\W­uÄ ¶g§#aPE8æ.BÓcfwñ®g4'€…A$ffúJ‰k‡xã_7GŒ°7T;¦Ããºññmò ̬Rí±²'¥@¿»r3êi93&ñ§´DŒÊȏ„!aãf RJú%kY)Ääi°¾Qy& °ãíÇNEÿ>«‰ok[ƒ@Œ_"ñßdỘ7¶ò‡Y2&¥˜Eͳ‰>Œä9–+|ÅøWÉFU»î‹2ՀîÞÁÃ`¨âý2gøf×àå/ -ü6è0 Ә¥‚9Œ¿]iÉHþf©êJFòdŒó«EՋ@‚ùçŠF± æ«  ¿V^¤~l};/NÖ0rîp5 qs'³Kñh^œÍà cŒaâĘaü;ÆF¾xÆ0vpÜ1|Wy6Â0ŒüÈ×½“„Ñóï¶AÂHbõ Žðeë†FÍΗ¸‰)tàöòÎÑÇte7£ l;¨ç†Sl‚ðÁ7áoá×ÛK؈ÂM3q⃡¨õ|ˆÃ—ð`W&;øP6uG›h—ä`Ü¢:¹Á‡¿L©µ„C½y©—¥jò* 2à_ÌI FB¤¶ â4í¼`k¿Œ" š¬àbá6ñ"§Š‡¨`nt•I -F [¿»€‚»Æ¨ä7$o”à0$x(6`ü/ø«ô•Dp±c›xí€àü{å‡1ðÀ¨pÂq“ìWnƒæ±k²€ChàƒËi}½Sy™J¨@\ Ԓhàƒ"·ëÙÑÀø^Ų6ø;ü¬èµ†, >¯ŒrXÊ\‚ ?ìê‰f`ú¾w20’ã üzo86&˜ëñë Œ‰Ç™Tàƒ -óZ’ -ŒQƒ• -Œ[JÇ%¨ÀéÜRØq0ðñ©ìœLàÃÀ¾@#xs=;1jĬ MV4æc4ákÃcÂÁ22hÀ 0°P*ꃆº®\ÜÃË(`V|m þ†çº€q ëîÉF²[\& PoV -07ςŒ[-=·‚èJ"¸³1€Ãà‹¢ÏDó®\²Há!ŠÂk`(08ÿÿN`éÊÿ½a üïå÷ ÿ"ÿOÕRGT7²!fÿ @Ҭѿ@ -Óß[É¿ðO0ø#ê;‚é{#’€Wð/ýk™÷^À¿ñ÷þM£Á¿7¦Ž:’ûûîæN?ñhƒÏV쯝ô3¹¿'õCæÒsý½ÄèÎ\$ø÷„öŠB£ÿb;ùü‹^jœowð/ͧï£ì‘ì×ÿž,¼Ëø"aʯ÷Ä­Éý¥å9Ÿ7î/XnÂ{Íý¶ÕÔ4%h¨ô(íûKüõŒäþbϋ¼àþeÛÏëûK3Û÷ÿñô6±¿üVÛöW´ßëšØ_^àóŒ‰ýå?þ§É+¨Ñ½êÄþ2 Ɨ$°¿|@äÑmØ_dªÄ6ö÷ê`?æÀþꀚcÃþ2CWÚ¤þ3 ˆEPÙ>`0ѹRñ ÏÍ6ƒ¦þâ”"ÿ‚ú˃÷±SÏXÁ þR¥UÜ[,ê¶Fy£þrWU “¿Á×?¨¿°œO臒úKZ.hè/¢Š3õ—ñÅv¿A™¨Óweê/ÃGBQ›ú;^ÿφ8õ˜ŠëNæ/ø“åìù‹îd<эø +Seüåfힼ_èö;Ü #Y¿ z©ˆÄ¸_\§œ÷;†¿‰ ýŽSńý"'¡²’•õ‹XäaUSîu7“ô‹¿K¹ß@¿֜“òûØeJÈ/³&}¼1~Q¿~·s"~›S¸±D )^Þ¿¼êrœ“ñËÇÇ2›È]Š|nˆß¡šL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK -*"Ê+Ü÷¤àh ÷U`Þ© µ4ìZ'ît_jÍmÕTŠ€§%ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿ©=é¾JÐÌ·:…úìF÷Åi³DÐ}Ye„BÒ ûâRéˆ&ܗÝ)Š -ò”*Fa>;Ó}y_X0¸â}i…‡a¼/³övÞ¦.6¼/¬Anªuï¢ËޗfV¼/•›ýn‰÷ewŒÁ÷Åh‚õÕÎ÷•–$ƒ_¹KBÍ÷=‹“%àV®9ð+ɧ6ë¥Ñ¤eãûÂHo#ø¾4 D|_° ß¿ÉÅ.6àW}ô%mã1m€_XY9€ß“ìÖëJÀ/ {7¯¬ÏHÂ/ÄêK~a }#ü²‡¬AøUYjÚEøeoØ"ià$üª™Ú]“ð‹>DœÒƒð{’‘)*ï$üRè=ú™ˆß³ºlÄ/ÿæû½"~i­% ¿Ò‹å›¯þß¿ˆŸJwPI¶NC…‘$üJû}<;á—þß]4ôI¬Š& -tw‚ñ‹:ÒÝvÆ/Ìçe¢/¿°xú2㗖ÈwNÆï™ý'Œøå±"ªEPÃLàmˆ_\¨œ±@ür²¦ˆ_x@¬¿Ü¿Ôfq‰¶&Xᨁ­ ¿¸6Â/DúF›ð‹wìn×= ¿çí%ÖNøe‘]Á ü²÷šÅ&üÒyWˀ…ð{F> ¿´tëã dúìö/KŒ³øž7¯¸睄_ ¼¯‰¿áW¯ÁÓvÂ/­xƒð‹£KÈ_~aàĵ~™À„XAç0n>¿2´º~ñ{äíá—_Éq%à“ÇÑÛÆ÷e¦ïî-ù¾L“žgÂ{1B= -ÀNÄ/†;ç9ia÷À߆Áç¸v¾/Œ‡A¼¶a†Gt_ˆŽád®p_v%T™¡<¤¿0yü‰Ñb#û¶ž 2»á¼fö¢³03 חÜg„ BGöÅóžñ÷ŠõM›±¾§çàõ‚a‹åíFõí·¢Ô¹‘IÓÁô¿W¤oÚLô}‡šÅDßçPÿхçûxÈžïshè œ/þÆMÝh¾Ø‰ËsÓ|k]æûz“7–owƒ£@ùv‹€ƒä 2ȗT×z%Ǘ xÈâÝH;l_ñÞÄ㥠†/‚â„ü®ß~89j„owkš ø2,^Îà‹ÌÎ=ø½øQBüލV|/°\M M…„±Nª-á½­H¿²{iå˜ÙlìC¤É½ )Ýêm—RLpÇ®v'·ùUdąís Ø¥ÚKÍ#êy íEÆXmÅìí^ZnÈ^ö¾e®ˆ½Íë¤öâ<@½ßx½<0͌ëm^5­—6ˆ VX/«ÝðršÕ˚8(•ŒêYH½Ù½Ô Þè(~ä×mN/èpÓÛônü.öy7H/Äh\èÄFƒ ¯ ô’(†dÛ -èåpŸ6Ö&‹ÏûXY±áya¢ñÏ u?â÷AçnÃêçEÝÄÁ«›«W6îpõtü½’yÓf0/h9 š”ÄsÁ²ay‡Y;AåŲNÍi­€ %‚+ý•Ê «Ú (&F!Êý$•—«Nÿ+•—È)6ê ?äu©¼Ü‚tÿ•Ê‹ÉŽ¡â òÂ#-â8²¬«h<üÉ‹e¼â`òòœm¥úhø)º³`>Æ­;À î…š‡„ Åýڙ¼ò0ʓL^8Ü“—6;X™¼tÓxòfòD:˜¼Ÿ•/éÃü1™¼ Ö¡(bcòÒÊ,¢™¼ -ᕞ^æXº2ywl&˜¼äfððbòŽªwcCòâÒ¹ú$o®0£–6RP6$¯cÊÓ!’—œvÍðaSX³nÑC³?É«ø€¿Em?‡‰ÈËÞÏ ò2ƀµ[y$Á\²yÓµ4‘—/¤E " Ð'Fâl%ò®ÖâÞ À‘—” ^‘—*û*à«ð¤"Ÿ=‰¼B”±y©|¤váœÊoƒÈ‹GɅÓFäE -V§äE™Yתÿe¿©Ç eUÓ÷H×>-F‡€ñ2JUU:9a¼Œ¨´§$7Å´A㥁­Ö ÉғD‘ǹ ß q-‡æÆːàMø¤ë§°ÎD°Í8^³Îsçñ"ÚÃêIãxÈDI4ÂÚ¥ñ'Œ%Tu¢x;’2ýL/`ûϵƒxa»ˆž‘®ŸÕfõIo÷w±ax¡²CþÁ^ü‰¾á…J õÆàínÛގj¹“À‹Hb#€·;ØüÝó8“¿ÛÛÛð»€<SbünsÐ0軤Bõ½Ë&1P½½ÛÕ îns¦qÃî6óƒ¢è Jú ê.NýRƒð Ýeÿj$íÌÜeúù$r·Zêµw)=»h!‰ÐSðv½Ëo«Q|âÛŚ ©‚¶‹¿áÄo°]¨`ÞÖ.ÔYÈ jhغsvQ Šèv`voԗ&cZ¬¸7Ä.ŒˆÝaÄm” 9y³ðþ®Ê‡^÷VÏÑeŸ×‰?;[¥ô”©Ò ².ªj(Ù^Áº€và‡‚«{»9p`uQ„%ñFՅ_QPuoO:Õř\†óe -‚wDõŒÔE‚³›° ŸL…Kís&×˵µºX!á½ ž.ªjàÚpºãtÂáÂáÎLӅd™|½¦ #†Ý`鲦hÔDéBƒ`ßJÒ¥Xû¾¤;BŽ.þŽJŽ.‡[]AMáÆè¢Ö °«¢‹úÅzMŠî0L1 ºÃq䍡‹¬„^“ˆeŸb·Wô¬Rv†.­šØ ZB´é9’¡ËP:ÜÛ ¢ËVéˆ5Dó>Ã~Ñ¥q¾¢;Ö¢ câË)Š.‹ìØ(ºpuâåPÆ ž;AÑÍ|ñFÑ¥‡ÆÞJ}–rF -Œî'Ïnž1Fw8×µStò= fðˆˆoopM4¬4Ú º¨%8Ü Muq#Z|™Ÿ‹ý˜ÌÙð¹¬Ü¼ä“ž;P\Ææcß๪Œ¨eÙ}»ðÊ'=w&šV|.}xê -ŸË‹MÏeÄ°¹´n2p7l݅>—*2BH1ðç9/&ËØñ¹u Wàs•†?Ïäç"IÀáfã璖R%ØÑX ì!â6ÁÏUrA£ÙäçRtj¯àçÒp‰—«öØ·ð½+> >Ýsãs -d¢ñ¹Ø‚·iÃçBŸÁæöÏe1ç Ÿ¡pÈÐь™ôÜ ÎæÅè"×eèÂZI%@ü%:AÐEʈ!¨ KÖ®AЅn^ti€Âu#蒉T®æì(HRòs¹Ë~V~îyÛ· ~.ʂ¹( ~®úÁoô\fÓNùÃT2òœ«õOBcHÈ÷7z.¬ú1ÓsOB®‘ô\ŽÙè¹°V<ð çr3ÞÓsyäSxèIÏEr’c]Ðsñ|)¬ |n6~î´ ‹Ã3¾dܓ*êrí]$ué©åfÅ  èNà -ÐMktO‚Òà& ›/æ†ÐevvL‚. ®‘G‚.ÓkE¥_S8H+–vÁÐer ëš`è2C†@óÆÐåk5-º,æF -Ê ]þ+V¢D—x1¸ÒÑe²PÝWcÐ¾Â¢KTãqJQÒõ©¨y@tùq9Ͻv©ô" Ñş éŀèÂÐXš¥Ê°2S]Üǖ/¨.OQ*×]怙¶Š.”w¬Ü)ºxà’E—D„®F²¤èR††Yy£èRۀÅq`táþ)±]¼„l¶cta&Ü91º´àÑ$F—jó6Œ.XcUù¢AþÇ:ÞÀè˜؊ѥoÊ­1º„ˆõÛÙ,PÉ!lµbtӘ]NWÃÝmõ$qÃØ|pÃè¬×Ë]>HŒ.7‘ìdÅèÒÌG]qغÁº¢[ ˆô±St©¤T (ºP®püHŒ.áÅ­Ù'F—áaVvF—ÝXø¸üxå+F—+Ÿc‡E - ÑMÃÆНVcÐ¦$:éò=üä›ÿV¬Ñ"Çc!èª8ÿL€.œ}®Ö‚ŸÛ4ÚìøܦXFÒs›Ôä Ï}äììܗ±‹”+裒è$ç>Ñ®rç>ä"/ûtV]5×Z֝šû8bj.š©ˆöâ~RÅ©€•™ 9ò»fæ"¼†hgÀh‹_1Fø€ÌE,ðx—‹zÌÖ-zt¥¥ËÅßÊH –‹¿Qg¶±rIF§=£r¡¸Çë“gç&å)—ùxÔ¢)AMÎbz½8ø‘-œ\臭Ò`{ þɽ®¯„\øHþ —=ùŽ+ù¸€ "̽ãq/ë%’Ž ù;¸YB ;VÌXÁƽܼ Ù¸×%U֎ƽu²ã"I‹¨z¼1H‡³ ƊŭÃÂSqjWBqàyeâ"îQ'U7šŸ¥¤iŒm<\)˜2;Q m®b)c‡áÞk ÷vcÂ@áÞ1-$\èe½7à ç†ÁEؕ¹6Sp¡3“‹Y¬™7.òô¥&‚Äü[샷pãßB¦SÜæŽE›è×ÙzÐo¡*+ÂÃNø-.Å(Á¾ÅMàwäh(‚•§úÎÅ."|BY2YÀtz}’{ی<Ø°·Í-‚zµÕ½m†)lÌ[vµ¸j"o³@ÖÄÛËUÝñJÄ"¦¤hÜt×àÝ"î‹AwÃÝÐqŽ¤ÝÞn-°ÛÛ̍u #bº¯ÞZnñK§É·éœW—ç>üšÀÜ¢"¬¾An©€¶ÂŒ[pPðq‹»€÷k#ÜÂÈ®)܂‰°}ðm/'^6¾mko‹¿2Þ"È°ÑmqKà¬ÜöjÖIÚrs°¡mQÅz8••\VØ5Vø7®-‹°ïÑF!€ Ú"iÚúδ-v‚i‹¿Ü ¤-þFz#ږªÅ_m«_ ñlo@o8[dX\RfûInÀl©cxîe{£ÙQ³ê s'¼È Ù"ò„èÃF²,»?'ȶ*ä–Û®Þ;ÆöVx=)¶§çTClé¥7†­êÎDØ>|›'Áö!)ã ` öá÷æ×>*Y0½ö‘fè]+ÙO¢k»Å:&××GíäÚ&ÞH‚k-‹Mn-EÌïØZ†3ê¤ÖjfIf-2®g{cÖ"æ=d-Þ[¶‡0±–zŸë X{ÉË ^mñì¸ZÖBßu§ÕBÒz²j±ö ž0PµMµ&o¨Ú×3¨5Iµ7c‰g€jµî©eÕJLõžAµTºƒ·”.Kƒå€NR-³ý·¬†÷Ÿ‡¨ÿ¦!}r¿½÷1µ{©›¤Zð -¨6¸UÁ©E2ÐS‹•=\¬ Ô¢bîl@jo×#nŒZ PCzQ³¬ B-þîúç¹ú¸‚>-2–ùž–œ–Vw:ííÏNP…1 ³Àª8_6Ѵϙ©Y±öæ}P'X@XÞo\Z»³œ'ð÷©\7"¶€x¢¬j£Ò"‚ŽÙ1 ´¨ bøÌ!™‡D׆¤}­ IKëӓ5 Ræ H‹(ܑ0¶GR×àÑÆߎ6ŒA£íž‡ƒ2 *–¤‹ -RFVl|NErƒD›¯ Ú0‡–øÜg$†¶ßmlZÈh«Ð´‚0‡Ðr0hIœS߲Ň¼UÌÚnuNðfñª_ÚiFšp…”.ð³ˆ#²'˜é³í5õ6›üYñ.Å&âàߥ%}–1ËãÞá³´á öìãîKÁž}ÜM|CÏ2HZGg™¯–³"3´çظ³ÁL -ììó¸1PPg‘;tœa¼ÁœÒYÈ@Îâï¢õ$ÎÒx^ œX/‹Õ#ªvà¹m¸Ù1»Ê±ô0ßÖ6˺—óÞY³4¥ž£¬O…¤Aš}¼ÜA³hZ‰™±è Ê,+ÓÜKgj‘If«³8'VNbµ8·á´1‹$'µÂû¥*ÌÎc¬|Ù'’›ÆË>NöL6>ù . I§Â‚Ë>§î`"c{5nC˂¯Bê`X‘ò“+KµtoXYFö ª,Ñ#.G&Ρ³j7…Ìý˜…»‚ÞŠð'QöeP%ë”mŽ1'P¶Qiê‚å4¬HÙiS¶™‡“HS,;¹Ðވ²Ûp3/&Pn=:"Õb;QJ{ÕU(Ky¾ã†¸µXÃD °™ÊDšé¼|0ý 8¢Ñ%Õ)ú%{[à(YäØP@$Yʖ˜w^I²Hlbõ Y.¬¼Šj «tŽ9Õ(˜º|X›\‹„X‰‘ŲE1¹•"[±d?˼ã0¨®Ü Ùjy←E—D¹€‘y -‚ì»;óå›;LÿDý‡dÙ­‹9@Œºðb~J3Ä6åú¤&‡e(iX]µÌY®Àh>ÎÑž¬Ÿx,—hÂtäOŽÌø6c›ØÒ^uæće1žòÀ%uÈ`mqO¹+ÃL(Zsá±Ü\ö4÷]Ñé+i?—y¬šTóÇóJY ɟÓè HÎÉ ¼Š;‘3ùäõ©[K”ÃÑ0q vWìíxÚ%Oçb.ŠäV Y”ÔA „‘`¹ÎeWŠMO×YÀà6&XóB²« &bàO6eÀ*€ÍR)gÀŠð¡ɔ¢âCŸÁnÅ)[‰«Tä§H$`µ—z;`ÙT)Ž~„YàÅÎöHØ ­õÅ´ԆÖ×$Ʋ?—¯€)åâK}œ t-.‰"´š²\ð†ÿ¦œ–E¶s?Ab°à$ªG‚ ®”ø“ìÏK‹:9õ»ô“,¤âCg·®ÃÍŸ¨*Ý{f¦.*aØ8ž]-¡ýè¦I{ ‹Tň¸?øBÇ µ>Æ£¢³B%þ¦º£éãÚ:ÜF>pç9º{—ãYG—U‚ù½†·F˙g o‘]9#‹ÂJø’`)žÜ™L|¾\¨ãÁû7Pyy\|7.¶…|Š¦O´…\4.ãhjs,JžÙâz°s·ˆáãaŸâZ$)}½HKïڐñf /,,™Í+ÍO0Ó§(AH ÆÂÒd|ˆ´dùfôññ²SVDl¢!¨“ §Ó Йv†LC“¡‚?ϼEÇåë$4Ùû©Â8öC•8ÃI>òñXXÀÅ/ :»à\!y>Y^,Î3”_ðUžþI,˜ Óƒcœî ÈhŸ5^,Ûkæaf§Ã^´Z¢…s!4o[ðÄx°^¤ÖÊ]YUI3³7ÐØRÍѝn‡åQoˆ"ʍw-B±±ÛÒaùÄ. À³™´œÊ¢z,+" à}S‘e‰?ªÔ0ú+I|·u„™É,‚Ùñ§Î“ i4PÏQn˕37j=t—/vAšGâڍÓËЄÅy&GlÞOºÚpa¢'![ôà˜£TxoIðÔh„º -’j°:æÇD(rÓ£×¢a¾ ExÏøÝ/×c2³¸U·?*ÎÇ5pßÝåjö3†ð9Ý¡c$†é*6 d)U·Z"=õ€àƒ‡`ö‘ÀO &@ QxËD¸ðà٘«Ö:¬å•üö°ÉÜÉèY\)Šô9n&¾_WÚҙ¤ÜôqÍøéuŠ]VåÓÐÂGI©X´—ÝÖuµb™Ž*’NvinÑõ·EÆfŠQZà° Ä …AÞ.ú«'#t̄@ÀÂJ9Aè¯ÁBÿøo/vêW.ÄOõë~çµT'`ýÁÔÇû]·¸ä†ÚJfaaT6ž¡§y[$Œ²´Ã­NÔČ]⊻™±¨òº$¹ö ~Q/¯qz”¦o–“ƒwÍižlÍ®#20Èf5ÁÂ29nCU5ªŠzO%X3’Í(&ÂÕó¸Í_],¨}éK³(gÐ.©š¯Ñh…9lx²É“r·ÍjО‚5V±³ïeÈK4p«8H¹§–ÛXóžC{r5‹`#lbÿèÙpRö¥>–õ°¿ -ªÔ쏫«Xrٝò—¾çGÉmZ¸ïÀCÚ¬ff†«å®º "âý†ª?Ù èQ#Xõ ƒåžë†„Z ]oíÑ{ƒݸæ¤×—Xrˆý×­ª÷Œð@è´Ãñ’m\½âaM…wr–àvß©Ôó´;Tz2éW4_‘JåaÄ~ôã%ïÉXæɦ’Ôy`v'SvÝuGâeáø~(ˆÃ]©C }~7õ ïÁõyg5Áÿd֏µø¾µÂ!ÝæåfÝ:p}ÞUC(ÓbPŠ¹5°-NˆU%eç†h§ÈɲÇûxdKÛÕÇMiÛy¨­¨ö9¨%À‰"¡qò+Gú«`¼†È2dÈôaFÐôŒàX orWÑE̹„åSV¼Rê$òĸj­à]Ãc¤ŠæpÉ,®4 Ê)÷c™»á$º½Ô¢]Š:°¯@êéÄGSúsF”? -ómú¡´Âð1u#º°¿»%L›¢íŠ,DðX¢BYÝå]›ÇLj¤”™ò|žEZ.••{Ï4»”q^FAК)hAåFÚâ?ü¼¹¡Whô³H™œ b¼gXoºÉ.äOàëçÊ9ß^ aàuø™v)iÔ´Y^È4’ùRX’¼k÷¤ ¸·®9ÂkGoPå„ï€*_Xêdõ¨ª‹‡^ÝxPLÀµ žèAa££Nåþ£" ·“f¹"$ÆﶺìîK¼ *Rƒ4NŸÚãÖ6—,á‡:ñŒØà-§X"_ 'âiñ®T±sך €±¸áX^»ÊLi!ϵ£ÔôaW†«Hw™ŸÚ©âCÑÃø~¼…ßF©vénú :N.[( h¬…{yZ‚ê—Á[¯S'àQ°¨á'†CU0‚«âŽC¨ÇŽwä?L!ÿµÀ0õòºÙ)ßE²T±k´úcöÚ³ä;Äfx?ŽÛ#u~ÎraÜá;B<Ôi •.³2Ç<_|™:n!ðOjódÍÈñ OFw.l‘þý¡%" ­ºòô.šŸKÛ í‚c=]2®]ØHñ)¶”å+#<Ž÷ªœÃªfÑL–âFè¸U6î'jG%tü6D£0àûY\\Aå¤è1áV‰$«Å_´¸Õe¡üx=à6³ ¸fô´×mʚ‹6dÿnîh:cþÊs…5¢Å;C=ªM<§zá+'ÜÏtx= 5†’ uvqïžÓàQâ7gîè2WrÎ>€ú¹K{…Õ´Á’bb˜õq>ñ -Ò/+“Î$w-'oˆÒ¹Ð¢¨¯jumO!R÷a'ÖòjŒ)0ëߏè­zìϑY†Â, Uƒô%ݏ¥/æâYò7cÔËoV¹àȈ1L€ÓÕ{w˜ -WI9S8#ØWÑ+üˆoW{Ƀ=ö²îàa}“Q!˜6Û*½„!&˜ÓÃ&J÷ ¥枬hÁÏë¹ïH¤ )ý -ƒyC£Û»Z+ -³[Œ59—É8 ±ƒì)ÃÈ|Â},<5!ÜB -£ Ò'¥íê4 C¿ÙÜ|fuü-bûr"&ž«y ËZsP”ýfFï4Fa6êjb}-óWoC4´Ô¤TÃ'‰–9…˚G^¸½v M¿Á„!lü¬f -»ÑÃÖô¥Dâ¼Kè“1\‰†Pêqjcî½0ô˧P|ðCøúÔ—h›Pù…ÏÊílaàr¹«ä¡Z‰/\3¬’3AíúÑ})±,30Ô\™¿Þl-3Xñu((ÅNƒ°H–ÞÂA„€á‹ÞT*éý”莡GΧùßÝÝ{`áœÇMzsÏ£XfÀjÎʺ¶µ‘=l˒ »ºÕ¥ 5yؒ\PÁ†ù¢º<ǐ[Å)Ï\ïÍÄ!õ pD$ã‹h•úŽ {4ôÝ2¡§ÒÒCˆþLNò/˜%%DQ5†ÍT?X'€\)ý ˜…Áo®¹PîªsCæÒXÞ=Qïz[é=ã\„ý:Я(ÛcRHìs™ï9·¼¤AaQ@:ˆ—VÃt1ñÑ`I>Ñ¢N”> ¾¹—“s;×½àÙ©p0- Í'~aš«çÃÛåü†}aÆT`ö~–Dµr­EÖa]„€<øŠOȏïþ=Ö0ÓãÎÌ]7o')¸JDu?¢Ê’Qúä\Ÿ `&ž1H”˜†‰7WO -g ç¢ÎEß¡Åç˒4j 8aCO”8-X/êŸNȐBe¨š"Lg7ïùd bBZÙ(ZÛ)÷ F -ӟäª]:]UBáX5‘UèMʸÒbt6˜É½²cèú‰oʸLHíl+úÉC µ˜â`µûàzJ~+‡Ã@ šLG¦`Æä‹bu°\ë®nlp©?AӔ¤Ak}*„Í*=XÖks‡¢z9šÆFތ’…œ}´‹ðQ\|ûRÙzñG µÛ81V´³WL‰xze)‰‡À9ÇXXûÞƤþܹg‹¶H·pЂårF/ïz¬s¹¿îaʾé¥ëmPڍ~ȹ (aЕ2Ëu«ÃŽšê ÏûKø*å-fd§ÅCJuÜpê†t³nõ/ÄsÝsr?F—[)]ælŒÈêÄ̟{^ÆïŠÕ0윒ÛË%Ê8ýp›Çб¢ÞÝϥۋ=Ïèß´Š;>d$Àæa•*ûÎ ‡™Íº… –ñFu¦¹[:‚[ †¹¾m§ZtI¬*qÆeϾH¨8DFä¶u>£!0,ƒ˜lSٖZx—p®`AýCÁ -!•(ÀÈŎ% 5}úïä{22O*%kl“áàP^'՘ÐP·ˆ•$ï6ÃËtÄNwÑÀ=»¢K<ÍÌy³²ŸaÆS - -žž.0xŸ4ÜIª{.½[4°¡zŠâØáï¶@¡Þù£‡»SÕ#:F*AP¬þ>ùb_ÒOûcr™åTd»É½þ)ÍT0´fƒŸG³ªèr˜“ 2’K]b§(ž¥}ºvŠ~k‰§w\í¹é^vš89Î%7°÷âÞÂ͗ ˜«TܹºÂàÎ(lµåÞ£°Õ²Ú;šJâ7¨‚E¹2¥ W(v`iÇKÕÔÇjîS®òI¶4 wÕjPêA¬ǼÖð©£3³ÞØ¢·šÊ“ÂÜ[é:®:òu! àÌE H¨l>Ü#Žº›«Ï]å N‰2cv[¹\CGËi±£Ö?DÄåb:dgl»¥7ÆçJŠãp¬%FÀ5Õ"4Ætx¥Lhސž]™Œã6ÿcœ¡ T¬x)‚µ5ÇRE›n*%(€Š‡Š‰éPÔ£•©rg†™± 8Âҟ%ü¦ÄáaQ/\AHRˆ?É!–ž Oʀõ ‚Q ^ÇâeX0ºâNsf ð³ VŎPˆÆhHN±E«<{w8ÒlŠJK’ì®` =r¸VònXüpªÿΌkžê> KÁ¹«—-ôšY;ÈLd!Ä&wðr<‡‚¸J)K°$†Içž\›j ››6k9)­NP·JY DN!¬ÂŽlTOªÐßÊJ$ßJÅÇCYW.št´ª†wpF¬…ESiw’“IIofN¥µú:ñ|Gk §'È°Ìì!‹]×Kâl’êRX¥î& 3LyûUP¯j²2š‹22Ž3!j¶½õM*°T—çmHaæÄE“ÇF3Ý{fíب§)lM|ZÚ5Ë9àkJÝüðG«$í·:&½û­3®ù±Óô^ØëXƒ~ -󣢦ž^×2›–V]…¢îácÑ~1>Yí·©8,-‚Û· X¨ëfµØ= ‚LŸá³gN„¿z(£Ä›É+s¶a±cÓÔÂ|nç`=kÞ´6ŒDcSï»/±#)gªâ#È¥Š¦ÃÅ$f„Vè¸Ùç ¼]R}ž\?‡-EN#µöï»N«ž]Ñr+ïҢӕO§zYç‚ÔU‚ÝÙü3f8®™V +&Cé‹=ÅUARŽ«žÓ’+¦j‡iWɔöùH¹DgчÛ!Òrû!XÀ]ŸvÎ]É#£™V“³&,výèåj1Îí¾ÐKLCz‡ºÐ >‘ÀÇq£KÊz(Þ;e¥4[™'BÕ&u܄¡´eÏÚ\ñqé­î’ ‡›nó'—èœkª¾SÌ:†óu[m5æK®Ù9œ .î4…à‹S ·µìàx£<#wEM°”·‘xþdƒj¢Äc@p&$.w¢™c+êÖëGˆtªÅoݼ\Pª6ó'>8É#.ɞò—[ÀÒç;¹M+n’VTōK©«VVkH£ËRä#¯PªˆÀɹàԘé0äP}Ja·ù·SW=ÜƒØ Y$*¿\eôáöì§7UÈ*/ª,dhcOv+q¿Íå8Ù"/Õ"’‰Ä· ä—°Ñ<v¶ÅdËhoî*j>œia¡s”Ô'aWŠ-a9žüÕÇÂ`$#p‹îaE1ú½BþWõݽ)Õ¥»Ë¤j—¼]ÝÈÈ#Ìé²è Ëv.œàvôŒ‡  -C?ZUõ •½N.ʒaaVˆþINƒ5‚× àÑs;ޑªtN ðpBÓ{Þ.ÆÀðÆ)¤’˜Q+Ab.þ~Lë÷~aX¬›èŠƒ]„äX©gˆ Î¥J ‚* †rC µù>æ†,gç²9ÍäñÂF–ŒÊÕ³ûÍeïº3^-‡Ÿâ>;´‚~\Z‰œ oXªW™se”|g ìûsª^ôÐnRãï,¿â—¥¿Œ^—f=ŸõA°p°ªë臲¬ÇéÆÇxž¦NE2à Ép¦áK¼ -’0»zJ÷é"Üӟéÿà -ˆ¼AXiD¾\€ÉœErǛAÐÖ³y¥¤¢‘¤üèi†‚bh”8¥×ð{Ÿªœ?•ä¸!‘7aÝoñ—¢ÆRˆ(çZ‡*H>4$¨cƒ^•êFŽò¨WTŒ!ŸÅ£ßpS®î1áŠá ø’ âÕùbuúb—[ÐÁ|ëÅ}ü¨¨Z¸$u•FçKÈ(%ü=‰K "àï…”¡Dn“}éé -3£ÏI® »ÅáâY_H¡¦ÒÙ]á—ðÈe>­ö¡¤é²øNõŠí³X¡PjŒgXœò¢…:âÊ0îJiY© b‚f>2H1æãIp -ñ"°6(<]K))LU Ý\'ü{+ -x>ZµKV çÅB:'o^7Ž,¥ðËmã2±gÒ¹©t»,±¥e±˜©Þ)¼7—À ӂ–65cºÓÜ\t)Ð)õ…^ËO+‚o¿ø`! —(ÎÁ‹®ÒQv%ºU‹#r„쏂õ!3›PS'mÎ\³–ê` Wœ¤‡íˆdœkˆša%§'­ë p¢{©Î—Ê|VdœHÿTB†6 -r@lÑ8wVBñ²8§–gþ(3R§iÆPȵª -¦®² e½½„‡­ëD6ƕ!ÊX@0×¢ß#‚ˈ«Rx¨àY­W]Í+(*£as3uI¼”XS¹^ô÷®w¤‹3èDýě{O\ â*{ -bñ£LœìŽ†Í˜›çúXƒ¯û˜={Ïÿ0хVÏĐEájmVƒ€þ?+ÂPõÁ¸÷i‚,,‡ÊÜ°—9ëùª/ÊϝQ²Z™æD°è5Ñ -fo֊w ‘Ìt‘F@ìâtŸnÂ7 -µs©f”æÏ ¿Pl`‰tuc7¦šg¾üŸëP½‘RÍ(æRÖ/Æß]·{úlJù›* -YñDðͨ}º˜Tôú×TH¾D˜Ý£— ^´ð„‹k'rWQⱘ åôËch*T«gêPڏºЦ8ñ‹Ê;ÊE©yæÍáËr ¶úëÀçÕMzx'DLY…Ãß?jfpe­ç£‚$j% a!ŸˆM¥i1áÚêc`¦‡Œ[×͒Ct¶˜ÇêÊ>0àäØdU&§Tǽ4iqQðeMê¿ÄCU]¾(!ŠDJÕáeÊD¯eYÜ+HËä¬1ãc8õűt#læQ;™±Ô‡ý ŠÊZ&á!hÝÔZ–7étô°æb½‰kì£çD5hârîBWZÝûƒƒ•DèoB˜§+ç5 ˜¹nÔ"vý1~¢E·•êÕ&7L¾?:­¹g°±øu&¡Ÿ•Ë´Ì^/Ý]£À»;«¥6©Tçn¹?«j´§Ÿitîe…ç%p”>Ôx è\ù–6” -΁¥Ye‚Ú,j³k³¼ˆÕZÌ×;›ÖÜ]#÷TY)Ì*ak½4ç3iPû‰®@Œ÷ìFÆ@X¢†“£Èä«LTmaágŠ’µ¬®Øâ†Íi’êZm~ñ­¯)dT™cƒ™1‡+ 8]*³ø¡S7ؕ·È]«·SIÿ}mÐÁJ?Éb)ò´Úœ /c$È9Š[¢T=PiYãXiÑ®ˆi©´[÷tº\†7ÜŠ32ՑµÜ•½-²tUÚ©[—j_êƒïò£Ýøh½ñê2È}¸ò°ctÄ[O­±}ªË vßb'²ÃB½¢½±X†9ñŒ/±• -0W7Wñ×q:¿x¿Ä)ï˜Ú¢¡×)ú+FꟘ¤?£vuÝ©}ªÓÒ5]õœknin„8+.^Œôez‚6±Êm¨xœ\Êd؍pé‚ÅלÖ0O³#õé:ÎÜ.ÐfÄW՝ž÷Zu¬~\ÏD¢Ó„Äô;B³æõH^§<´aºé -¿„uI^¨vŸ¨·•äàOq6¬Õ8„Ck%ŠèÍê0¦õçÌ*ªK€%o!7#OÅôe=îva§3‡èñãvçªEaô¸ªª_Mìa9T¬ß¦@-Õ%,Ž(-~ç‡;ÀÂ"z,Ó'AËÒÓúva쑷åÒÂá ‡O‰ oµ!^ãrIi‡¢AlÚ'ZL>ƉˆîºlÇnâx' ùPf ,º-{¶¨Õ‹^aý¥„YÌu; û™rsC¦n%tîºþ},2Á4ó‚9õA­Þyr—}Àç²¢h”5ïþD7/˜QqA u£(þB 9 c÷§ âe<½yCñî†Û´ðWû¹X¼k7Ðf,®Q‘Y#>]Ì UžÉ ½¶ÃÅ)Œ<“jELõ©“UÈo4G1bís’gh™õuîÀ;Ô¨ _†‘JjÃü²‰7¥"`(bÊ;J} ,Cb\©kΙ Ïh<‘wèfžAçþÔ ›M¤‚¹¾1èÒeœ¤p³ -ëä;rZ¥3œ™ô¯žv¦‡Ý -îZ¼8‹Ž%wu¸B<÷”v) Öø†£sÃê¢É“Å6ì‡Ý–4oaû tÓU5pa)’Vē!Í <3Åc7+š»WoëHÖ Þlíqª$ÂcY ³C"’{†ôĈp»‹§Q¨ê.ю+÷¤+3ÅÞ´¿‰¦[Y`Çzòöž#ráõ0­h2XÌM_1†”´øJOˆX¶ÎíðÕâö²Ü’>p´‹‡”nvmnˆÙ+W„‰ÇU5CSíã¬icÙC­º½{ºy‹&-–¡²‰%’KaÁ£†Ù¬=¿¬Æ`¯Z茀u_Þ&We (ùî2Cɸ"ÕeVñt% —œ0žîØÍcÙ[VCŒ—(n»Ÿ)W"‚‡ùpâ­P'¸êåR‚² >Ç¢ãbŒ`Bb°²ⶠ-¯ ÐÞ±R—8\~Lùâìs›¸I!éà’ü5§lN@Ì}?V$‘ ÏT=gûG|‹guÉiø,a§¢éÕ*Ý ¹¨Îq -Ž¸ÔlQ\MŸÿfïf .…Ò;ÌÀ·ou?’£‡ðÈq.Oà>4Úò'$ïsŸ ê#rìãòЗ yàv_6֟RÕ÷æ‚}ùæNÞ?!ÍÿaHó(œØ‰æˆ¾±Þ €æœ—Ä—³ï¢(ÎüÎýÍø~Ý0s8Èägn,sT¦>—9 Ì£ÕX’̱ܣHy™£KØQs̋{e'Æ>ƜûªÄaÀ‡ï‰,ÔoÄß ìHvÌnbà5æh-ü\šG&¿<:%¾¼: ’øòjÕÜN/ŸVÃË«;ª&»øG2u6t9PðÇ]^¯hfåøMµŽaG—3ãix4‡„T¥mrùSòJ.‡„WpmÓ©`¨Jþ1ÎËr‡*S’ -îȂ¶uãÌ絜ڊò¼AËٍï~&³õÊÄrþÕv^9mcL\9ŽQž{ÒÊoK wXù]NcV9ÂZê¬hV9Ýd‡ ée^ºž“TÞLùOPySIæŽ)G£Ë.“¡‘lîA½ɟæ'€äÀh4û¶ä‘w«$wùxT£—4rVÚqÊ9»«µÑÈÕ$¤Ê±ÅþˆmÐÈa!df§‘Ÿáx'öý 9 ’Â>+/Eþ†‘cÎFÀȱbb}ÑÆ"G}ãe¤³È´(çãv"g?‰¯(r™YTo`8,Š˜usýŽ({]Yä0÷…DÎN/ç^ªó D”:)jÁ!™³‘ÔE(”mrÌ$ ‚|xòñ„¾nÃÑ­IXàÇq:<ÐFGcp®¾>>¢è$tÖ£›‚¿¡ÇG …ƒ<þܱ -1xÕË\ÎoÜq0¹Ø ìø=Â/3v<«Ë7êøm=©©ã —ðç:r‰úr¬Ìñ;Â~¿çMä8 Á«œ8PäTMlàx´ƒ Þ8ՙÔë­¸q&DN—¿"Pۜ¼ Ö8ýLál¬qä¡øújrµ£]³aèÛ,ƒ Gڊ•¾¯B%gå ·5¦3ŽŒH=CJÿåþh~ 8>ÀÐrŸ!&õ.FŒ3Ýô™Q¶Ì" Æ@À8†zUÌG6S%QƋõ# |£‹—6ë¤Ô0ÅS]²Å?yŽ3bkU:<Jä7²8Š€¥iù¯Ë°Œ!¸âp8„nXqBdNÉ [aµ¸|Ž-n#¹1űb"Ð7âø=.ÎfŽÇýGö…¯OXYž5”Ç$ì-ï4qä{”^6L¼ÊWJ”8ҁԱl$qÀÊù6gµ‚Åá#WÃÁ'Eü6>-!â0Du/sÏ0ˆP°"Ä¡¦¸Í馗˩$âÓ°òã4ñáwÄ;ƒ~ß íðð;º’;xòf8 Ûð›ÉY¸Í‚âB NJR)#sÃI_zŽ³ºË„†ƒÁÁúý`†ßÕ9³ «¾MÃa8M¹`ˆc“fðI 'À¥˜!ÎK©Fþ+'A%VT8ÒÅÛM -¯ÁPx=ƒ>¿rÂk¨uŽ\Üåâ`ŽtWLÅ$Âò‚ƒ^-UODøðø~…ø%áhQ«ºMÂÙ³ÖzˆÉ/í -^Ô¬1áàØíÒafåÞwMç&ƒ# ÔXUf0øbå• ˜@‰æ ddqiÀ¾›ÚxïPð¤5®S‹è^]ãMq¯Š ÎÞ=‰à- -Å?œ5Üqà®Î4ð¨cNøá$ôÎ7Mr¢Àú¾/ì|ÀÓWkzàL-Wö_UŸU¹äþ0ä­Z)!ÀaÆ&|8³ÀCôüo.&üR}±ÍöŪöds3“c”`@3Q» ùÛáÀ7ÕÔOîw6ìwZƒú=ê–7c‘gŸfxX¹™ýé$~OÃüNcð¾KV¾î;^ˍö=( -¨ûÆZ‹z¸`}Œzê=å³8†Äbb}‹åPËd}¬A¾ž7Ö÷A$&Å)†}‡¬ŸÙÓ¦}ƒä Ix£}ÃMin«!ÉZ‹ÞžA® €ø†úƊ)’ }ú¸’Iáb`áúxã|£Üè¨÷I€„;YZõôâµl˜oxPJ!æû œ?ÄÛTw 6Ê÷Eä¨d|fp¿Nk-UP!%ýŽø.¦5$áû**ÍHÀ73©ŸV¾7D-·Þû*NÝ8u‰=W¸w‰F„Áö.nho¢ÍêLâh¨Y°7Ä-´ÔߎmXoø’ÒHâùG×ËH"wÛó±C½Óå?Ðk°¾:˜Þ¼OöÚfQù0WŸDïË5X ôÆ\bl@ï+â‹Áó†J‚ÅãóÆXB3k< ëΠ󾆏`y§(oEyCEÇ,HÞ( a5P ºÁdâån$o®O®Åڂµ Ø4l$ïi5ÉûŽÓÈû“#>]u L®ÙZ9Þê·ÔÏ ò¦ÂMæƒäMy# 6’7>^Æ’ä …Í ’7<'õäM+ë ‚Ç­×½Ô$yŸ¬Æ½ËÉïÛ0¶Û;6¦òæߏiÑÇÃwF3Aސr–à*vLýTQQÆy“!‰Aޔ…ŠÄb7éH,\Ù@Þ4  o>©Þ&Ǜ"æ€7Ž7…5QîÁ44$5¸œäxs~²Çf6¿NŽ7E·GÉñ†dH€ÈãM;¦.s¼Or–û˜o¼¡ªÚ8ÞÔj»„#03Œ‘o¦Œ0_úDfÁr`¼!—:á Œ7…Ϥülo˜Ì Œ7¥r äã-í«ÕVŒ7÷dUM`¼Ï^ÆïvŒ7.¬û€¢< ´Ë{`¼) bøJñfÿåø¬.@XLpyc¼æ¸ë¹c¼–»î ñXa}¢‚Ñ[‘'º"¼‡‰fIðVÓ'ÀÇy§w'ž®áÝ æ1Èün\'¤ß -¨êŒ0Î.™ÞMòñ¥J¦„w#êJÐÀ»¡Èy¼¦éç -TôJîFƒwE´I~ìk%µ{ñ½Ý ÝRqÌnFYËÌnö†'îhcvó¢Ë¡]•ÃÃ{\`Ì© Õ¿-‹²ƒm3.×Âù3g;v§ZH”†síÀnXYE¼nGqgáºñk*%ZhÝ'E‡JÔÜI(ø³ëÖã$ÍÄu‹²miÙَDŠGŠ\ ø®fU<®›Ò׌릡X¨6qÝ4³+pÝü‰špnLÁL¦ëcÇu#°­zÕÀu³vC‚X7£ÊÛʬIëf½+}׍ - ýzàºy“TjºòºÏ€$¯›Úë^7‹7T§°òºYB“¨o9 Ý%Á릅Ôč×MA-EÁëf(.؍¹KŸ°[[JÍ ì憪2~¢ ½óH;±›®W4Aì–×Ö˂ÖjîövÃ*·ÄÀnšÅgù› ïÄnFø$4±[ýXixD>BÜêqK‚IìæªJmHŠHôòå,[‡…Cõ†ì–ù‰‚ÕKº˜WÈnD¿ßÝlnC|@ »µn0Ä[ké+úlÈnu$¬ÅÈnÆÃôìæ2'ÛÙMí¹°4fvSŸ®oÄÌnZô1¬Ìnš«3¿ - vÁÙÍeeä†ì–äÿT)­²¾‰ì––ÿpÖDvÓ}d˜  Ý¸o·¨†v+,â‚ØEà„àÈeD·9ÐÕÓ_@»*¹M:Ih÷™ýhÌìÎ@K2»œaâscvãRå̳›¾"\ðbòeïÆìÆ¢òä¢ýVN*‡%²›¨;¾H²[‘åÑ&²o?‰ì>ï;è8 ²›EcR‡ƐœŠÙM×_DVd÷™*†@vÓÂÔp »?¯–Ff~ç²™È\)ORˆÊ£Âs‘=Ó7d7Ílpfd7~‚ªµDvÉoGvÃL8O"»iQvÒÈnY˜t[‘ÝøQR:ٍ)Å[AìFJQ½ W`73¢$]°{8—–,n €¬‰Ø˜ÝýŠü°­Àhéþ˜ØÝj)­ÀnXG¾8ûÀ@ÚIàº[Bö¹$hÎ÷$¬»ÅØ›5ƒ®vTws§ô$uƒWw8ºÎØÚ°sÚ@Ý$]?cZŸ43sºÓ°qº§Õœî§DË0ã·ÁÆRÃÞÓÝo‡ás3sæҝ†Ñ=­Bt÷hJˆn€8|]ݤ•_  QnUÄ™Ï ƒ¦‘ύý8ïžû ™QйŸÃoÿçîÑ@-ØÜ`à¨]¤Ñܾp˜ÚÈÜd1W…ðxi8u9œVúi|åŠå†‘”Ë rÃP]¦@×1åàvO&w?¦òiÒînW‰ä†:ÃÈ äë#ȍ0+Yääîñ!/É&>ÇGB±™“ Ï½Q±aV^)¨ØDp~¤Ù`s›Çų´rÑXlX”ß -,öyFþ†ÅÖºiԉÅfœ.Q`±E0Ú}é+QÍãŒÅfâYÍã¢Ø'Ws¿1.nXì¡bð„bƒ5 N´fbkÂv$öðžDl 4{½¸ó°Y=|µ‰ÃÁ´Ê5£—L‚n4lB1H®Î ÁádW×Àa/™¼•‡Íu…:ˆ˜‡ÍU]o‡Í¨js]çdZ3¶J}wà°yv×5iØôϯq}eOå,ƒ†M‹ø¡=j[ŠËnV6 YTzf6/½QovZ66ö4äÁ8l|¨ '.XUÉΊÆùRÕ"JP‡M¯jÃaÓ©#»2pØ]¨òO4lnÁG·á°yr×5iØçáJɤa³ -†£òJæUiØ´47À`±âq*¬¸Ó°é’×%\ZŠ¸r)iØ°¨2cÃas1}™{¢q‚¥Eše -Ê66—×%êÝå¸ ÄVŠ¦JÉ9Ø¿ðß Ä¦á2þº©CÞm,÷ÊÃF.ÕÏ!bg”¡Ûè¶mX»)ŸTlx “ŠÍ˜;]lTlFœØ^-°Ø´h¢›‰"V,6ƒ:À÷ÝÑøÚXlÄTèºa±‰«îȨò¤ŠYJXl ‚úê6,6µ(ÔPΦ›˜‹Í@ Ñ.f.à“‹M Vp±iQûŕ‹Í#RP\l†cT>âZ]Û´s±é 3m\l²ùØ30¸ØÌ`¨¡æÊŞæàbsd+ÀàbóƱÿÂÆņٝwœ€‚EZ¯àbsj¸6.6Í|fÁÅ갟ŒMEd{ÃbSçÉ -ôÀbCsı&¹ØÌ wj™\lÆÈÉ*.6«šÇŠ»†×ÑÕqåbãHҚ͕•š† Š=­æ~¡ÿQt-ç;ùi5ðGXwð¾÷ǎľx—Ϗ$bãa“¢•@ìæáhça7‡_‡ÝšNöc_c‡a?Ž>&ÐÚEþ…ýÄ ¸‘°õVXv¾81؏‹kv ö #c°ù¾Ü%(ØP»(?²B°ƒIœlhÐ8ÖWºXÌ·!°atÓl¤ Žgò¯™Ì×þº´Hæ™~ Ãp—\ M}vø5±âX‰}^'T¨å9ŽXK¯èkÔkÐá òu°¨’|}E£ð | ùҁ½¦ú¹^“z TÕؑ××~§‰×Wtrà5S\ÇóÆ»¾Bà¸kA0x¸ëËø“v #]Ԁ]_¡\ Ø5Òbìë½±®Q 4Ê$]#½¡…_%TÜ°³Îƹ®ÃdõÀ\3x8®I¹n¡LÝ ×HÕ1א̐®„ëfà¸n^$ßû1xk˜ñ¿n}÷xœÜßэ5ØÖ·ç°mv‡‘Í`Ô š›Þƒw‹~ðœ7®5jJV -k‹@C­»Q3;ÓkGÇïéFq-Y• ¯ŒÝø–n@k„r²àƒ5ÅÕÚÄÀYC.¨)s¥Y㊛û»2aJAÍ­>a”Š0ûµ²¬]@—$kŠœ`b¶²s¬[t} Œur‚bÝP¸A¬Ù%çÒ„ ÓYØí‰ó -pÁ†°†•“b¬TfÂ3Ö·ùB¿šÄþŒ¯¾ƒ ôê;¤¸¼Vä»TÆÿ]_;“e]æ÷£ÐQ€«áӑºÜjfÔÇÇN­Fò„‘¿€VƒÄÏ.˜Õ—åB;²úÊFŽ&V£.E€S«¯HQmÀêD>¯MŒNÂÀHɆ«¾¢?@ЪA÷ãh°ê„µo¬jTØ©Ó%I—¥è&U—æÏwU—P§º„‚"0Õp>ZƒT{" ©†A\1ªKôMÝÕ/O@‹Ó$T×x¿ ¨¾9‚½ó©oŽ“ žš… Mê_.¯()y,êÍ4ݍҿ£ÎrK §$šA+2‘74õ`^öüH2uu+´Sww°Ú¹Ô· ‰¥>=o•ÚÚJ­R[1©ILx$’ú!UæH D gúñB0pÔ›ƒQ[¿•,êÝ'Œ¢.Q}·£¨›=I¢¶Æ2AÔL>|âP32åšø¸=i%„ïÇéJ¾ ¡FmÑAÔÁËí%Œ>ŽˆZMõe÷*Ô%ü„àO³°ßàíÄO£þ¯©•ÖC|=“=ÝÜô=mùz §o†ÎIžÖ’¬–7ò´4.ýšäi„ioö@ò4õ©GXR«EÍElÈ8 ,êŸèéÏ.û·_`hî±&ôtu–/ÉÓŠKðô]B'¼r§›ÓØi°CÔqÚÔé;Êb7è4"ôd‚9 4ˆÒ°FNÃнÅ\ Ý!~0p)`Š»‚7Äit+š*ž;J¯‡ –#ª)Òh^‰ÆdM?gd½e$η^“4=NE$vÐ4¬`4 ƒX»Îp¹Ë -ô 3= ÅIÊ4ÊÓ"ôfø}6ÆôãrÎdL¨üô‰ŽéƒÓÐF˜î&a¤µ¹5ÓiØøÒaM¼t÷\ŸÐhˆ”¹–ÞàÒ+DdësºÓ˜ÐÒóϕ,ÖK÷ÐWºtuÃJCp]6‰ªßAO6T†hƸø²Ñs&Ò=ôT„ë·«PÀ/ƚ̓F­•jñ“ÆwÔܯq¥ŸÛŽxð¤i(mâ¤/?î7š4ÀGü “~j`·“f/úû~cI©ô¹QҐ™ƒ!âÇð•$¸²àH' -30ҏ¿Þ"ò­ÓK£²•hɐ†¡8b?Ò#"P45ö}¼q¢‘Çb|Әhü͊)S¢ûÅæ+$ù±¨8§ò0,ÑHµ±{#D7‡×“Ý¢ì.ÑiØÑÓjHt3K* ÅX!3ê´!¢Ñí@}”=X¡Ð+À˜« wD4x]·o&“rX8•6ùÐXQ©qኇƲ ~\⡱zS½• ̪e;ú¶Š$ÙР:©i±ÑД”1•?ÑÐÍj¯$Cs™çâ?փ2ë¬ý”ÛЏ;ÏɅŽ¥qr¡¹xný …6qÏk (‚¡ÐÕJӝ nWœ;?˜ÈÊ%úÝ5úò͝¯ÿ~‘Ð_#=ÿâñëÇ?ÿW?ÿ~=<÷»¿áÿýåÿý×?êg¾ÿÝ¿þß~üÿü ÷ññÏÿâÇ¿üë¯ìö?ýö§_ÿùóÏ?ÿ~ÙádAøëµý¥ÝþÍo_¿ôï~û›ßÿUüÄ/×Ÿÿ͏ÿïoüÃë´þúo™½œÍëüûãß®'ó‹›ÿãüý¯_wöþ›ßýüû¿sëó»ÿüiã¨<ù¯^çÿòãoÿÓ_ýþï{¡ñ»?üí/>Ù?}ýõ/þÕõë?ýù7ޝ††_ÿÙï~þó×Û÷û× øÝw¶ÿËÿÓ뜗ù՟üÙæ¿=ú·ù7ÿåoÿ*õÏþìÇ?|ø¯óøÕññ/~õ'ÇÇ¿ÿïþä¿à?Vì÷ññ¿¾þëÿyÙþðQ?þõÇÿù¿yíñïÿâWò]úñ??Í¿·½ýž¦Ã…‰¿líôýv¬×_?ã‡ÿ÷×ÿ¼Ffâ´ -ú¬vQ¦Ðá¥ÌôZ^¾Öxø×Þha„ 8.9V€Ÿn˜¨³%™ç\í0>’½Œ(À(o6¬nt›#iýÄvTzQ¯Ñm;…0êX„ÃOÜ7>ýÚ;û9,ö<ßyÔåÂ>߅×þ#nqG÷4àì^«~øuláƒÉ™hø—3ô fäµÜ¾î‹¬ï 7÷<>þõ¯âav%;}‡!h:îÕ£+Ú^FŠú¯7£º¼Å^æØ _ìõ2ìç`ãóEÛÎí¯yÝñOíå„ xE@£8þµÚ}&¬]äµv¾!.ÈçºØ‘Å+íc?,Ù×Ç~6þð 疧ýOïóý}®O-ÆÙ= 㼖ùã¯í¨¯òÍ6»¨ãíOÅ+}iñxQÜòûýþB9€Åv§×\ëù.¶íÚ¦}¹ó¨Ë-›§°ß_àÎû}ã"ªþþØÒøöŒ§}¾yÔõÅùtþÛNjïx6]ÄøýæâÔÛñìçp8g´žìbÛ.lڗ»0ºÜ¯y -ûÍÅoÀß7†7[Þ^Þi|{ÀÓ>_†<êúÖ|º ßìå½ÕÌó}L+à¯öï4ä d¶i‹qÓûӖÃÎ1m9‡mLÏ ú°oÜ!y?ì4îç0íË ÏÃ.—öé>üã'f˜zœŸnf˜ãz;&“ÊïeùÅŸÞbŸ×²v^õrÛ-”ØñÜ6E«»í°Ó¸ŸÃ´/'<»\Ú§û·hÞ½}BŸ{™Ð狱Lè‹q›ÐûœÐ—ÃÎ }9‡mBŸ{Ý8_Œõ°Ó¸ŸÃ´/'<»\Ú§ûð•·h¿Eóq/Ǚ/Æò‹‹q;½Å>¯e9ì¼êå¶[4÷ºq¾ëa§q?‡i_Nxv¹´O÷á‡ÏŽ -IxŸý›7׃Ĝþndueÿä§`òDža÷~µœÚßý”uãézÌÃNã~‹}žð<ì¼²O7á›L£svÞnít&æ L¯c9ÓŸ]ÖâºÌ{°8>ón-þÁvkgbÙxzËKãÛãöå]ÈÃ./ÍûMøV“蜞·»;½‰yÓíXNv1nW¶ø.ó6,žÏ¼a‹ƒ°ÝÝśX6žnÇòÐÒøö„§}yò°Ë{ó~¾É‹;?|A=Cóó ûö¡_|ï£Zy}Šõâû'iãû¨°n݇9ïCï?>{—Õ>›ÿ‘ ”›§±7·d±Of9ìôv–sØ\£Ïç6ã*ŸWM<ôõ¶jâIh½1=쟹ã‹}úîËa§—}^0m¿¬óü·ëþéϿكº¯`ïõ ‚½¼Ÿ¾KXïÝ/Y½÷÷ŸŽ·}ÿÛ#’ûr¦ÅûõVÍi¦(žh»g°G½l?ßlë2ÉÈÌp@¯ÛA8xÊÇvaœ“Ìèýmc‹Ý·ÃNãv -‹9Ïvt¹¬Ï÷à[N1Øàýîžæl§!j÷½ïb[/mš—Û0ºÜ°yûݕOSÞ6.âí-ûžæù.äAחæÓ=øVÓ +YÞoíáÚ£íx×þâ.¶õº¦y¹ó Ëݚg°ßړmÂÛÛÆFPíO,ûӝæù"äA×7æÓ=ø–Ñ1Z<ª^c‰k@C9íßi,.½Æ8õ7#ŽÕ×è˜íUõ3ûa/‰<÷s¸-þ~äf×Èuã.õï~ØiÜÏaڗž‡].íÓ}Øâ·<æíq½ߎùµû/.Æíôû¼–å°óª—sØn<„ço»ln?ì4îç0íË ÏÃ.—öé>|›…{¾'sé3Mô ö7'ˆí©…ñýÍY7Ηa9ê´ÝŸÞۗ)]¡ù¨æòašòxóá-?|e0ØoÑ|ðËqæCZ~q1n§·Øçµ,‡Ýƒœ>‡OAN½OoAÎú~‹ã~Ó¾œð<ìriŸîÃ7 è_Ÿo/2Å$„­ç€œ2Þóílãvi‹}އå°{ÞÜçð)o¾ŸÛ–7ï-9EàøgYí>“öÜûˆ»·áy±Ï±|9ìõ—sئˆÏçö­†‹éNËGü´¢°y[%Ðut6bí:¾/)äéf4ÛëûÄ»Coãû’bÝx.æa§q?‡Å>Oxv^Ù§›ðÍ¢Ùò¥·[;=ÿys‰°œébÜ.kYfÌ{°,RæÝZ¼ùíÖ.®ÿ²ñ\#,O,owڗw!»¼4ï7áF³íNoww:ÿóæ*a9ÙŸ]ٲҘ·aY§Ì¶8ôÛÝ]¼ÿeã¹LXZߞð´/¯CvyoÞoÂ7‹f·ˆï=ýü<(„}ûÐ[+o£q÷óiT`•çÚGÆ÷Þ>HšÞG„¹áüÄç§qÿõÅ>Out¹¨ÏwàÛö{;¿ßå4旾œðbÜ®n.æ­X›¸e˹ÜÛåÛÍ ç7¾<¬4¾=Ùi_^ƒ<èúÂ|ºß8Ä°ßØùé.ç0?òålãviËH1ïÃ2ÎÄýZ>ÆåÆ.Ÿmn8?ïåI¥ñí±NûòäA×·åÓøá\ý·?ÿü—?ýø›þXý‡ÅVëÁŵ|迎B¨öw×è¬ZYíß¿ÙÑ"ŒÚïߎóKöå8?û<¿Òv;Yð%&–É.Ú êüm|ý¢Œä2ÞǸeÀ¼oáK<Ÿ痓z?lҘ_Ñú5Ñ›Æ&¶ƒí½çÆÞ´b¢Ö1ÖüÚ ÌsC—W>è×!Z¯WœJälE_*›®û ã¸ÃxðžÝ䨱-jl|â+_¿~ØcÈaÓ¶àØøô«—0o)JœÎxeîR㖢Ìîna?GÜR|ÈÍÏqœúà`D ,OƒjCÆûôëÁF_~áç@‰Ò»xy^Z‹[ý ‡zôžÀXÎæçˆÁÍÆzÇsóV=*yöÆýöÆG«'ÎâÁ h†#^dÁóñh=øØ8¾‹'óÕ«Xߥ׉>:jóUb¥£Ì(æý>í5ímÄÛ@š‚Œ1d¿x>`–·ûl„û)í×9l¯-`DªŸÙ¶»øyuïæ5ó±©6Þó ûøäh8ß&´*:¿±½ú3`ð'Œñº¼Byqã¾XjhûÃ3áJnüôü¹²a=‡<½ÅU”J`4Ù ô´³ð0]›òÜ~4wÅ*ÒÆφõˆŸŒ—çã¯ýb~ƒ>ül®³Æ8; h¶w ¢MíÏÆr‡qÄ«=€jÞ¸ …=~Ž_ÒWÏ!ï ‡O lÏùSØ__–þšœú‡ŒvøòUÛn}Kü/ß Éb®:¯âmO”©.óÑ×Î`ýîؖF#(fÑüðæðyûC*éûÜÇÃzÉü>Î9þ–RsÐ܊ŸzFmcÿ·Ÿ_oÛ~Õ?}͌aö“ñåþþ‡¼õÎÈcµìãŠñ >äˆ9ñu;Ÿ_º÷:?ð¨KÌƜ{~JûÙý&ܗ«:ßú»ûq…±1ó-^uÚË÷?w¶ê ý|Ó]éÒþxf¸Ò•ˆ©ÆŒÀÁ÷aÚéC½Ö[ò±ºê}m´ãôéÈóž@$>ʲýOa·gÁÑïѽŒwŽ~¬å ñ¾òàwÏ{†Ã¸óôrã’#í3g‰‘Úƒª㥏|Å)Ôø0Lÿ_½ˆy}èuôåJû1'68¨4¶óW6ö¸‹¤/q„l/-6.鵖'€5uû¿znßçd‚nw‡½z!?…ýBk~y_Sìgã}—y\¯‚âqVW»|±t²d|]¯«Üsÿ×MŠÇÎ)蛆Îæ¯ç\^.FE–3¹`ou^ZÍï†Þ“ï×så'öZ eÃî©;‰—S··²áRuêÆ×'v.Æ<Âqäz][\8šÕ /øâ#W+~Uk[®â†&ÂGnË'Њ¦O´Œkq+ô–ó%q€öûu·z÷]ï zÓå“Ðô[k~˜pòõE§½Ñӕ{ž¸¶ EÂîÃÎ8 åYmœÖèÏràÚóÊûð G=òôœPp€ÚÃ~·ËϜW!Þr´˜¥®«Í#Ìx`¬ik.³ðî#¦¼œÏùYp†Œwj¼îú÷a¿Î§™®“±Üq'Î82òg†Ïü\üŸЕŸË9^µf+ÐmkœÞåõ -Éá‘ÁxJ‰è݇Ü̗±‹‘§§á5?èiOxáµä}»€u«“ÀˆÆré¿ñ¥$%í‰@ϙ¯5Ð^÷vMÉXr WhšÆ9jܯEÓ× Rbÿüø»âv1üά䈂ý3364ècÛ;?ñÙ±§ñ\æLî;Aî<@±ñq<éIjŠºØã"‹AÏꛆÐñ÷a>ï旘ÎŒ§Ác6Êx¨V/îz^ÊõbFC—Ûrd½¯ñÄr1û:~L&h{ÇPó”ùb"£/D ä€ìÞñØìàéx֖î7‘Ü÷º•ñ¾îœ`ü2 àh·àõÇ¨_ê<±+ç´³ÕG%B¹Ž ªJÜ3„`çËò# -‚ §×•:dŒi}s‘`¿´Žƒ'=b¬C+s»ëp4RîÛ»8Ç­ÇQÂ7Àp’_!¬%rC½É-g??c‹0¢qsøµ·W¼²×ŒŠ{õªš¬¶½# QΥɓÞ6dgÎgöNÀ O¼Á ”ñ:âÍ«9Îá¹b‰¹-ÇrÛטy¬gä=¸3R‰äD<ù¹ê¬Ð%Þ¥–c}©Êúí?½iϑš`s1ŽÄ<ÀýÄëqå¶õ|òë™Æ«¯¾N ö¼]w|ì~¶ð–ñ}†¶Ä‡}Š˜ÚÀƒ¼ã -ž6o-FŜñÞ~ö«±Ð=Û4gIGJoñéë‡ÜĂó‰Ie~'=‡"ãZB:”äAö;ņëæÓf`þp -ãµfå–Ý-xRvìÑ+È9ÌÆ£„–·äà†Iéû°Ÿy'=sÃVÞãBèΨ¼éÖDFàCp"„¤ÆÙmà¦MÆ]€‹#ۃ}x܀ʉÚE)b<¹‚¤ä™6ÄÆsÚ)±³@‘'ëÍÇ6c@C§Ÿ6%hBít¢ŽQVž°NŽúËxs‹<%  ‚n’ó !¼‡T?4Н¸{ƒ8Âï¹$2~)7P±-žRŸó‰8 CÊGqB¬ô -ÏÓWBÖ(„ûàŒTxÓ¿fìÀ*Râ)Ï\+Á"†âòþe^¬KœMĵô±žÐÒ9œù”nd vHc<,rìø›@í£qóÌ÷Ãr$°‡m¦„™ažR  ´L™ @ká”bD‚ŸlZKXaXp 5µŒSû¶÷ë´ !#€=C1)(5©B’¢d ›Z… wˆ°}IÈᷚíŸÄ"áV æÆ„@°‡U{ä!0j¬™™Ê4# a ý&ƒŒ|yÎh‚#rñ¶ˆÔ%Ÿ`<4è#­åcÄrïôdt< Z²£Z‡ûpwË)Á3EüÝM!Ðd$ìYv*=Pyâsspº¡šMB¾AÂh9®&."/FÞ8`Â}0°Ž0d8×~Ž1(CÎþqÈÉð±=…ÓI=Ð-ž ÊËњŒ( R -”P’‚¤ E¢©Ôš€«O¸NA–’´'óŒxV†×çòÔ2ÀÃæPZ0«àXö¹.VL.[áBñ3HòN)Q#u5W|ã48¬üPàjê5¥7Ðۆaû2)²È½¢ -î‚Hsæè>4s½qì?ã,ƒJ‚W0žº¢c:Ò¹2ȋgî+X¦xF ”‚Cc¯*í Ôì—åÀ„ ͑ü¹ãžÐ8“̾S²De:¼3 ó̀dMˆÌ§-À•O|ØJzՑå^('Ñà ?9•æ åþ´ÅPâ\ԞsvNJ UÐB‡èß¹1 YÂë;™r׎ùcHR̜Ԋ¶k%F·P, ¥’Û2ã2yˆ¯ËãcÅc€ô Ég¤Æ$åa”#¹ ,ݰ̐Á-Ԕ0F9Z˜ÑV9ýeUžHp/É:×¾-ì‚(R¢‰Ý‘4µyõÀ.g–í9+%8•ö„ÄEâX:dYIw«?žÊÈ -ǕI3yãð%ŒBÄߊ(iM„~-’òׂiý/‡Z[Y\…ž Cö -äB¾»l[’(.Ó mg" H¼!|ܚϼ#Î÷LõìW¤Š§D´jè¼Â FNéP’™·a½ ÖtByZ9çýÈ'øµ›{D7/t£HóQŒ Äz§EFQ ™P¾:ãHÉk’¢‚¶pQÊQÆ´ä\D#s™ÒˆíéΑÒxŒæL N͋\µ»_ÍÁAõ}3ljNœ—È5¦Ð)`RžA’É2q~ÉB€^Q„ÉÁxÉ9‰Ñ:‚‡¬Jù2.þØȇêZ‰<£ª<•A†˜§ñY7™áP­ÄÝjêÑfü×ÝþŸÒ䜢”A¥ÏRg¢rTcý.môþ¶ÄłøC,S<℀b€ç4yðš<¶ržËfà$"þ€Æ>ˆ¥—êá¶VA¯+8ûFM¤w'‘Ê‚ru [(ŽÐÈ\؉Z›&iíhÊ$Î9Ëv9eu‚K‘ŸÏ9ùL²d—&Ô}e^ÂMi·¡¥*H¾!–hÊ9…0ٙeê‚òßdæÌÐˈÇÖ'½€æzá Ë xçtÂ¥Hƒüz`’XåY‘;H¢dâcۜ¢iå%HK˜Žì4ôÚ%a¤â)©iÞÉg%¢Ã”(,%e¨QÖfH}õðLðb7¤ÓFçmA¹¬°!œ„“å:£ÆñZ£3ʇ ùͨÉöƒ Ý ‡9Þ˜Ò1’RìI'kÜNrÄì¬S‚«„(Æûffs ¨ù–ÌtcV¬mJ/væ’ò­p¡qß´w¸$e7B¶& •Ü1—R ýbnÛ~$G‡',³åp÷)M±fkÓ =\.•ø̮бºÒsÆ*ò0ÅÁŠ›ø9l\„tÖ`¢ð9…>¿HÅ[Öýb¼Ù‹€¼‚qÌ©æ½éÍ2Šüš˜ömCrą ²‚¸Câ•k0ÔÈ<£ + (-=ÙÀ4Ì+²¬¼ ¼jJ$IÆÛÊ3¸¹’ZFF$R“®ªi¶Ü&z04ãÎd¹f-ۿ׀´²H<ÃÆ}àä©!˜rÿѶÁ¦ºPF@f~”ÅlŸrÊþH®{ÌÐ=c¸Ãþb:Â¥«ƒ0E¢©n7°7,Í`À#Cž¿ÝT™f™x¬šœ !ý¬ðJ¯æ9î'þLŖtú±ûÒ5Në÷+&#%3…5ÙWeA„LbK*ª->-Nø¦>n ž§­”GIg9«¡`ãÍ8-4T#Ë­‘tZÒnÊ#U4ñIñ9XF²x×0æ<§Á4xNàew`CB,ùB’ˆg+#Ȃžºp<¬`À, ïù¦Š(…·ú=¥¤\2äÃ€g“ž©ˆ˜äˆHRΙ$Ÿ­  jÆÞÃ)š”ÖÀ”–¤K+@ÏM"(+W2c°;Ã,õ¡`õEysø~4IÇÂ%Ø'D±GÅç}«2Îô6h¬^ÁŒ)I" >dy¼÷ÈA,¯jéNˆ5¥2¼KS|~¦Dj"ƒt–Z”¡Ú¸‚#-I µWÔ ïР¯s‚.:J’•{3Õ¿XƒÀ7T+,€÷СXVÃPaoÁƒ p¬¨Ö‘j:Q\¬¢sn:kÕ5 –î §˜ *™Ÿ¶Ø|ËÙS¶sꌃº¡Âªdƒ¤r±ñÂgDÆO̱H˜õacðù¨rf¦`Ÿ¤ñVŸ¨!o Ey!2g@H,³fàQ†rA…$_ž%žÈ’ÃñNÀi™A@zÇ A"1—~R‘§)U9a0Jò)ëŠ^ðºÑ9ËEÁ^pÝ®BjÊwÚª”g&X°}Æ'ô|ƎÕ$w<Â}‰ â2è]³Hšx¤ÞÅñƒ|”ù¼ ÌSšŒ(‘|ș0Š‚6妉X1,B`溣®²$&Qžmâªã8`¨A‰rÇ`¨8Õîm)Q•B†A˜0†Œðâ é÷wî¢ä;J%UüòjtœÔ ŧS«*1–¯ñùˆ¤ÅøKAºöÕPªq=0 Aß=,*‹ƒS˜p¶›— "åÜ‹KHKÄJ -(™ñ†©• 1jTüï•I´’¤• aFå)1& ¬ÈÃm™h)G¨: ¯%€*?'È@±l6-aâ®` %btàY±Túœ=]¤TÒ/ϘlÎäû&ÀdÉـX?Ƶ§Ä?(òJK—ÊlX`ÆuÑ0›Ùc†jŽôFj€@»´Ô„Öç5 ÆÍëY‚ÌGSê И-IjH!9]3W*ýó:b„Xzà”àAmÁI8”Qï”uò¬‡y)=±¡¸@ |¦£2wô6# k82u8J¥!¹à§½^hTƒDŠ­@2òé(M´YÑCï—:K²[B†3rSVð]MÌó•‚ÝLi˜¸,2OR±™QÞ·[®œj,¹Nd2O9ú 9S‚"› ëƒ%y$” -‚n¥Ö'‘é@%n+)H¦¾Ÿ9ÎNCS¸ÝçpAd€ûÔ|I -(Û#\j>[40š‚dyÁÝu/SœGô :÷/.~^QŽ)m ®{ 4É ’jN@´à <̇àȸTs¬˜G(9¨.ԑ0‹ú -eiTãj<æ428’¨¥/L* `Sò88ó`Œ]ô]Ë\p¹ŠrJ‚”tš`7¿`”Éyíñ6´-}t,§VoÛKVÞ(‡ª‚„BÖ>§[´N#¶ã KÁx~ª 懶ï%`r³ 3çÊÕXöž“cƒ‰f€g\ÏR9Á€†Ì\ڗAÓI  Êé*ß-"/—ðe¿´ ò18¡ðŠˆB,”pB‰–T··€ï¤<\R†<ˆXQó”àÁ*—¾( Yõ•BØj[p.1ԪḉqBY¦b cÁ¶ùBóδÉêäb@‚%°J•öÃâ›øyÍ«ËWF•€¸¬±¯Á À„]}FQwó,‹µ4YS]Röð"P‡ Ÿ³ªÁÀ. ¨Ê‘¦ú.HEgm*G’tPAô֑Û,’Î$IêZ»Lb‡Ö% 3’˜¾†¢¨M°ø`ù%Ô¥W6´‰ãˆ -Ö¦Î6Ë«^šsÿ¼šŠH%ÌPb` ¡†'„C;˜Ì¸˜©Î «J‚,›G]p’J«"ÄøfhÉҜŒJ"ª$„ÒŠ¯À”RKê¯jÁ"iÂj)À„ó„‹^iI©ÚSÊ<ãŽÂó’ü˜ìzJðpZ £Ë™y˲@_­%¦B̙Ò,,gԘ8¡ñ%ÐÒÈMŠÜAå/ö±;×ËkXÉցBñXLÌõσ­‡6Zæ xêŒb»wd,bµ@œñN /l–JuÊ_ý`|¥rF YbÌ57®:ÓH‘PsF€“ÀHŨC4NÀÀŽ#4›0_/#nœFb>•ÁI`©7—ñê(ØMOՇ-Û ¹L y>ã²a§ &®´¢§cJ:A çaâ±È‡#ªð²­Îc›T®¸âßà`´ˆjÞeLœÔWÔ±õ*¥Êg`à☚P - -rŽÔ‚ùFæ †˜P60s&íè{Xw\R0 ó$t“P ¯èˆ€ -†q\:Ñ ÖaÊ¡:ü¼ˆ¢.“ÌÔ&‰j? 5˜oÊSJš&Tc 3 -ƒubH!õ3TæXÂʌFA¡ÔQœ|ìØ4d™Ã¨V 7cª¸f†¯¯jjœEÅᜨ`bm„cFd¦Ü3š;æKrfÎí¡Øèðࡸyû-ç´°=%y€g† ¶Ä -Aàb·¥ñ՚Üg#0‹•§If¥ˆöž—Qð0pa\ԅԭug® Ö:Zëh†§©#Ó=RCØÜB…n§³Äþ/oÕ¦ü1œN÷š(ÈÆ­Y JEDeéKa~ûƒ¤“RAI˜N%>›b…‹ l»Æ’¯.‡ -Õ8$-AiØ1Fåb¼ÜáA¬ºEöLꗌ‚ÓMðð¬¹pA)®@ëQ,Gä¤"*m–§lÅÃ**®i˜üµñ@qexÆÕr°–{Dc*õ拺ŽP-Îiö˜ÀÃuK«\.5ÞçKs¦‚ï -å1õò݊”}š)$ER]«p²`–8kX -v(Êö¥Š›Ð2>ÍYI}x¼¼¦õU õ5~ÁÐ’‹¹Ò:d)· …,¸æ¶S•ÑÉ*.²ŽK‰jy ­Ð¹ŠE®Rª8YŒÝô^ঠ®Ì{‡ñ à¢îÄÔ -…¥Á6vT )'35=7áädã«Tš5÷‘pm,’{Mîñnȉ¯XG¥Ä0+ã„8ZᙄôÙ󌊆zÓ}ñ4é -Ešr Dï -–­)?¹ >âJX¨á$Hᶚ ã›\•„i*J΃ªnB ¬`‘Í€|˵trM@s±ÎLG4oe4`:`(m@žláI„C3=C&}ÇðA*ü >à¨Ú•È˜i¼5ìÜÒ3&.®kü䘨b)v‹1„ŒÏ\2ŕw2¯ýZ äk¡”‰Só¦îF•¼4UTϹMªYè3:*èƒ%‚}cAõ…¯æ5ÙS./h²€@QÌ.Tzÿw,/:OHÐ œZÃzSgM*æ²XDŠLÈN§ØJUb¼dï(V¹R_G»ÏxQãY¡]Å ØGM“Ö f"Þ<ãÄlMÅw  !0%Õ]‘¡e¤ˆ'”Îì˜%¶¥Z7R -ƚ ï{hœÐ:ôUý [œ¬tFƆ—¹5áÔ@8xþŠ‚̹äo }\B²²‹ÕŸ,cpµ|ðu Œ&eÝ ëáU:RÃ(TÏå: &½›,Õ$ù4•‹à0Èå×qD²¬á.ÐÁ‘è_†ë+Ÿ°JVUXoαÈÞ¨‰06û êJ QÐõÂE5¬,úËMˆPZ£,JåÈ…*3ëÁk«T^™¸_7\ã‘T—Z*œD÷ø-¤–lºpQQ %Whðºr®¨äd“ú¼’šôP¶Æ…6,}dmÌÊC)^n¸¦t]̇Òèi=–Óèj¾…²|5Ÿ*x›ûÃJÙ ¬ƒï\d^ÅU7èÒLh«3FÀupérᾪo¡\_ÕgX Q‡Å[x(rF5¿È‰üŠª7Ô¢ð/“g{Ó!âà\MÑ- «¸Äá֕†Å•ŽG\A!r !"՞ÆWTUkßñU”Z pCQ¸A §ˆRðæqaæ,M}¾ ĺrá ghòA¸\å3áêyËå÷|ï– -iÝ<ãqRº]!(¦&áêZ¡–ä¸TÁéÇPMÁ­Gx—Áp˜ÚœÄw -ùÍ']4ptÑU–$ëE¥1ÝF²¦%•ë÷<0š­¸|¨¶ga¾eTÀVB;Ý5ák$dAc/¸¢3¥å®$h‘Rñ*éó£ É­Te¹a¡Çõü¨k2*ªG…ê=œ/¥ŒjÒR7T»BDÅBøʈšƗ"/<úQI }á²÷ÀŒ…+ª|R× -endstream endobj 23 0 obj <>stream -~i¨FŽ…À7¾4cœïÖ\ۋ/\Â{Ýû•ê ‹èÞ¯”•1,Fîü4TL˪6’jâø>‹xox¥vå£ÜO)_“›Aa~¾q6ç» sÖb] ~‡œÇÃÅc×v:TÙ¢û³øwÉS]ßB·!µ’S°“ÐmC~/:빚B¡8w—²å¡¼ ›Ç|±GÀ Ù žˆ¨‚ -©~t+¬áZdI¨Ž´Ô·øPJC@œV2J>꛽€¾q0T*7‚ÌrÞñó}Cá3Èac…Î;µ=’Væ8€fãæ Ã{oò”“m§Cø¢/فâ;½Œ9¼´p!²îŒLùi,ÖWðÆTQÎfÎÅl$ÝêR‡'0Ù$Š~0a\P¼Ð)ÌOLTü0 ŠpºÏit b_±f'ßóÿ -Ž‹„‚Í*øÓ]m( -&Ãp¡ZÄ|àA,gÆ!b†ïÅØOC‹ä/‡pNvñ¦Þu#`‡f R·o|ÕþfIDË ©¾õr‚Ä«#¿fUÝ<ÜxŒqÍ.œÅèèÓxÕ­Ut¾þ¦óëߖ>õø‡üüûÑåñd>½~ћÍÊÉ¡ ç?G/&ƒÑl0z}täáÇåëÁ(þåË/~ºÅßDâ~<ûåÙÓÁТúò‹Gü¹ó­ýö돧?/KüüdП Æ£Þäý†Ÿ¾ë|ýÛÍpd<²œ .æ³rúMçO¶áãɤ·Ø¦=^NʶG?ŒfáGøgöþ¶Ä¿:ùê›Î£ŸGƒ¾…ŸYÜ£×Õ¶o{ùoünp9»^ßzÔ»qmw|ó?ÝÓЎd‹¡½o>¬÷{2¤ßšé·ûÒãÎ_¼.¯†½þõ¬üko4+ÌÎú×°Gç¢ñp—¶é¦B£ûi«­v]^_ÏšÏ µÿS³ì:Ï'ýòñðöº×|ÂGÍÉ3Ýß¼_ ç“ƃš”Óù°Å¼Sûûœn<²éìòIùvЃn5_õ©†«{ÕPĺ¡Ô3hWå³Þ|:ôFÇg4Âú™ÙñI»lqˆ\Þã)ÒbD-NúË{<ê[q}a…ã««i9Û¼}î†!Þ'«xŽ#Ýg&ašsöùäª×/Ïú½aق³Wžº¯9± t»þx8ž|ûîz0Û0†Ê‘ö¾Õˆ]óG¹ÃAMoËþóù†¶Çò•Hš¯FKŠù°7ùþ·Ûñ¨µäò“÷6ÜÖ£=¦³Þ6£ Oî©Òt$ûŸÆû½9‰~¿G‡h5¨=±Û˜6cjm¸¹OAçÅx0š¶2VüéãõæÌïíS¬ï³¶MD¶9·åým‰MF4¨ñm9éÍÆÍUîè‰}‘KòÖN©o'ã›Ûñt£.°Û ¤¹0õ¦×xsL£ùúfÃà+#{1¢ 6®Êˆô>ˆðoT‹©ýáyûs÷&ƒÙõM9ôôaì$©g“Þíu‹‘îˑ<Ì^ô›4àټ͌ìڑ¾…}‹e|Ÿ³üc9y]]÷Yòj½%?‡Iú¨ÙŽ`ŒWã~¹˜ËQ¿¹×Ù=ܔ>üª{Þh|6ÌúN…ŠKš¿ ˼µòн±¢nÒüi<˜ÔÓ½WO›[”ö[;mΜÚéA;Ý¡™:h§íô nîÇ~h§VX~R^ÊÑù†0·-¥å}(›SbÒ»Ì[ËÔþ¾XÆå`Øk‘9xàŠ;ÊOn¯ÇÃñëærï-nÇÓ[ôãkN‰[<°Å[|˜lñûÉørPNãg!0–v¶ŒñÀŒ±c<ˆŒ_d<0Æc<0ÆFŒñYoþÇLû×åäoå ý;ü3*'É=¿lòPžò°é>Ѧ˛Ώ¯9%›î°é6¯'aqž+fzã<Äƒ‹ôl5¤½‰õüËxøûMoZNæ› -©íUÀgnò™|>ìB)‡Büw)tíþ"+jº.›‹Û»&Iî9Ü.ÐpD‡Û>Vq¤IyÙ®nê¾qûqƒëö—îÿå WÃñøÒß)p1ìõß|×q ñm¯?˜½ÿ6é¶9°÷éšôƒÝxíF·gûî),Ñ}Þvp’/vÄ;Úr‡d“]c‘ÓëÞåøÝÉCf”ŸYyp·¢ZÞïTyè¾Öb»ûœª—A5êâs÷5Úæ3z9¸ºšOËö—ç,=x_cý<®'{zº_Cöl;¾tøíÜy£šïÙÞy?.?p_“ž6¿É¡Úoí¬ïÑ#÷5@<äšWþÛ3‰îÉϳ¹Èê‰ã!á«ÏK;È%{+—ÐՇûD+ä8Ü'Úl´{ŸèA@Ûí Ÿ}ùìpÑèÁ]²î’m„–ƒ@¶såî„G¡Åe–{ráh‹Ë,Žîþˆ6”“¨ŒHÝ߈Z÷æ0>\8úŽåÅ£{t&.?œÉ;½êöäLÞNÏ:œË;u.Š{y÷c`‡#¹ñŒìډþAAέ—ó}Îöá.ð‡:Iµ3û¼ZWî,n¯Üù|.„mU°¯wîlç$Ûé±é];û/?>Œ[…nz]óRAût<ˆNâÿ[÷‰!ÇŽ[°j¿G[q_¸Ì3ûôts°ãþ3L}û±ÁÝm.óO¼Ï"óPütwÝÑÃ+ŸsÔ\ ڗú9ŸÊúv/ƒ{~/¹ê÷É<ö¿àÌÌÙþx©x(g{y_8 -¸m`m¾ú ..~Q#[MØ>®Ææ ­û&ý‹n‹Tăü¿+;ïa¿^•“§ƒÉΘ€vmög½‹3¿O†]Ùiî#B*üÒÒr[y螙ÑÓù¨ÿrŸ¹ÐÃ]‡Ý¬“t>¯•øì°wr%ŠÏ%ïBˆêgP•àÕ¤7š^µ¸-gwǶ‰&‹ÏNX|¶‰÷IÞwës—$þƒÙg͔aøäãápW&k×è³å’>Dô~`gv #òb½6ז.Ö[3ÚݸXO?¼‹õLóíͽzýã¿®‡åñ¤Mˆÿî_«×fñ}f×ê‰n 7Sïr0oÁy¨ý}Íûå`ØkQÞsµ´‡ùp£[ÌÕ~•Âûq<¹½ǯ›á;¨jxâ^óÄ‡Ç ?I`ҎìÀ w<â{O£^ÌØEÛےöˆ=4ڞñ‡ýë>”XÜþ–HZH¼û] yàé¾VhÃ3÷å„{¸¡Ð-†¶g'Üèg°¡`Ìý[^–sÏ·ä´Xw{’óY_ó¸w¬¯ùж`}÷2¤ Õ±Gðäº7•Ã³rXö[ؖŸ¼¯Ñ>nîÑÝz´ËOÞó±öd0½öúåM9šýØ»Ýç³í×ê õx:KEåcãáï[¹ž6ìu_ÃææȽ; ›mÏô€Rr¨ÍíËvjn Ù·íÔârÅ»É/Þõ üL.ò¾š”åïÍÍÑWƒMå ‘”Ã}XÒW“ñM‹QaëûUó<·>Ç÷(zncSzùºÍYá›ß×ÀzÃw½÷Íg€YoÒîÌpÜÛZl>¸Ë•\ãûTóó-÷á'FӁ.jgv #±‚«I:¦¹†êH𲍒=r_BÌçXÊõñç/¿•Ãéí ž· sxÀ¡ç“òf¼)ÀnOCÏ£Ëòj0ÚXA¾¢tݖ½Ù“6a²Ñ#÷5ÐCì6«Ì{»-ZLÝþo7<Läöôb·‘Û‡ÈíV‘Û÷Ãq:â;™t„±ÿ&ûÿïìgû÷;ûCó[Ü>À3sZÜñê»&­=äÂÙ {lÏ> ëx«)<ØÇ.¸ûr?˄·Ûb{ÂúûtÕÛóùž~7GÀý:çÀµvÍígoZð7÷È6šÛ|ßl|eDb/F´!Т2"}ºKómˆÄªŒHÝ߈¶“ç÷å(îM³ë›rÖBÎØÇ#y«ÓkæO’÷úÎæ}tm7áwþvf:rpçÜùG¼Sîü–wþÁ¿Z9¸ó?š>ppçÜù»ïÎ?b;¸ó÷ŝò-8ôeò];Y÷àÂß'“ß~‹.|lypá˜RupáߕÄ홳vur*Ý×:|_‡ãw:¼¾žÙG}È}n>ÖÅçîMsh®7 ®®æÓòd<²ÊΨÿ\zðÞd–æŒt>¹²bjËõ[}j?éžð~ =Ø3¾íø>“û)VŃUñ`U¼7ÙàAÞðÐFb;˜¦Åƒiñ^4°ï^OÊrô•fËïìY9x=þîí`<,gßMÊËïƓÞhSìÂÁæxïò›È›Û…{¿næ³ EØ+k•¸¯…š6\9´ßڙå¢GîÙ|õd€Šû)œ;.dûƒÊÒ©?È÷yƒX^öù˜šö—½µ¿Lo˾ &Ÿ(Ofçק'Ç÷¿ÝZ‰¬1tùÉ{nóӋ:ÝÞö»üäÁu°D,QKÔÁu°D,QKÔ.[¢¼ÝÉY¢¼Y - RKÔ¾)ÚKÔ]Y¢î屮oïøçb_;óJÛC0°=ìD÷^sf«ÓÁ¢öà³Ûw½ªÉžTžiQÕäPyf÷G´'•gZG:îÍaü™TÙ¶Žß~ËÃÁìEo°ÉÅq8“wâL>Tƒ;œÉ;½êöäLÞNÏ:œË;u.·>¹öíH>Tky&ïcœEûÉ>T€ûÀÎì@Gb¸Ï´:ÚYÿÚ"-G‡«Î•7îð\¾—Á5/ïwG•7îó`z(E*š_Þ~Ùü–zl{_˰ň޷Ñû=áû -ÇWWÓrÛgR^¶ãö{ª°<ÇÆÚÊLùç ¶ìÚt}2×ÅÞÍÔAÁÜ?Sèä«Æ‹øÝà²MD£o~oGég¨; Ó|:[Èy÷(æµR aüeñØÂñqª¿ß/Q-xÉuÙ*R•ÛÌ7ëd†ÝWÄöÍ|“Ì7û'£çÎ|ÓbDóÍÁ|s0ßìÔF]›®ƒùæ`¾y8æ›ÏÑÆÚóÌÊËÓþ[Ôgp5éõg½áOãA‹¬÷xÓ¹ç—ÝS©€³Ù`ÖbƧØüÕ`Ø&Q¾òÐ} 5é6¯!uћ–O'åÿž—£~ ¹á±{35ëÍožÛþ¶ÍlÆÏÜ×û5ñ~†ÔÜd¹oƞC;Ï_!UJ–í\ɲÊÕd|Ób±õý«ù­V³q Ig|czðUØd¶bØ¡[Óqj°=Äl÷gÛ¢ÙÇ2‰½šO.æCË,€)õPi/3=Û¨:ûeüÞ*ò`snaµ9„ > sz‹É܏€ÁڛpÁ_ÊÉ»Áä¢ÎG¯Ï7„Ø«Á6¼ä3 œ5Ý÷è$Ÿ‹K§yœÚ¾zt`[>ô ®ƒ~zÐOïY?mµÍêAC=h¨ õ ¡î††Ú\Ú=h¨{¬¡¢’ŽÚ¼BÌ~«¨ÍÇyPQ*êAE=¨¨uUÔ¯ÿ ’óïG—¬ª"Ìèü§ñè…Å‚gyø1Ü¿ÿòå?Ý:<Úýxöþæb<´]:./åèª^B!‡á üã?ÊÑÔtή†ügÿº|þÖöùˤóøË/’ίï¾übNÿû×9Pä ÀŸÃ?¢“à}ßþÍ~ú§…½ëèΏ¿ÿ#é\~):¿¾„ßlÒn’$ºèû þž~ùÅȺ©É¤‚¯ð?øšJƒŸÓΉmPtRlXtø7zÛÐ -þœ†—áj_ÃgDŠžâ_ú%zqÔeÛö -bŸÛGoàOÖ‰ÑþÕ¶ücWá¯ýršåîÝö¯{9|€¥Ñ~Äýz”»Aån ü[ôHî ”;ú_À$}ýóVÖeçõ¤3>ë¨op®Ž -˜77sôﱝž£›$¢s$,F);Rw²Bëί7•–RÔ·LMç¸ßçq3œ2Eœ8 ÇÇv1þ Ӗt³h"¡nܪªÎÀNA 3íÈS-úËóÍÞÂÄVÿ„váa?Ç+Ítԃ¨c4Í«fN6Ÿ9‹J&UÚ ²Zœ9QÔ·LåÒÌ­ÆyÜ §Ìª3‡÷õ7_ÿã}l9UÒM Ã¤§Ê®ûG -#Œý`r• -ø!üÿ×Þ2ï.#»¹Ì…êè®ÔJà=‚Ï2…µç„)†Ï…íþ(EÐGû“² Et§8‚¯Îí 6«žÓ_m©åFyd8>~ „/dzP"ã«sàïç¾g€–^sÞX×±ºD͖Эï­ì*“ŠB7ííÏ«P‘˜aOõÊMFßÿv;žÌ^Ñ!ùÕyÒyt<«F½‹aùl>¸ôrÁWçbÕK{tMgìP„PwMG(ú¾ÁBxô²ì ìÙáü*ˆŠ³á _žõ{C;Ög“Áå_Ë÷Õò‚üC5»1Ô gxé N`xқÍo¦(0ŒkƒÄí_”ºF¤:ƒMj—¢.Lü!É,W°¡Q¤uܶNºù -¡B$,U¸ýn^Ïë3’$p—fü7óÛÀ"͌J5¼L¦Úï°ý³Tœ"*“ÆÔð–ԝöG™?à\p¼Ÿþk°RϗÞ}u> ;1áïÚcÚ¬gööà´¦ÊesàÇy|ììhbºî`^‹åx–¤ÊÎqd7ÑPáƒöcÕñØ·MÖô6Ù :‚Gí¹íLÀ i„€Q_×½±ð¸_k¾ïÑ DD ¼‹´;YkݳçA–dEÚÔºç˜õ4STJL‘2ÌÒ5ʺ)þÀ€¨g ‹§5áQ¤”Cm?ø¹á)ÌÃL¤a50*xRº9ԞJaÔùâª;üòâ# …ÐÒXSžƒ0²E5µiÀÿ‘›‹T墛ªؖ*’”8«À)¼Œ?€G ìè]øb?(”c²ö‹Å¡V>•ØW‰$CnÛö]ÇMÞ¥ÍÂk˜ýÞÕ2ýו|¼®Š‹½óè§ñìeÙO.íÔyv¿r¦–XôÉãžùé~u5žÜ¸ß¨Ó–…_Ž/ÊóÇ?ç¶Ïg³÷Ãò<¼}q ZæyéV“ÜÆB„N逹ÍMį—ÿMśti#-l´¥ÝXá¼Ñ­.oùE¦°Ä96²“˜¯ƒ1ÃZbi‹{zÅ>_d#"Ð2GYâڍ\| ¸E¶j;)(¥¬cn!Vî`|*ÑÌ-tÌ-Z¾ë¸É»´^xÍÝq‹=Ý᜼ ;[¦iùDšft@Bv•ÌE®p»êA`IŒ= íî–Æ´+Uæð:@ÞͲT;†žV™?R¢[¤™ q–!„çÔËF•W-væh±ÃpÊԌë(:~_¤ÍQL¹£˜ªÀ¬á»´}ÀøûÅvHYýáßÝOv¨if Âc6 j‹Léã ÐçG¨ýÚdð¥ú¦¨¡w'n9P¿ã1½ VKðÌ@(‡_¥J•bmŠ: ™uó¤@sÇғŽI™ÐGr@8¹®¡=þL ž£UB|ºü.×l½þ¨`DÎ>^¾ø½ŠÔ’ßöèzã§Æ¥™ÊàiY„©]„Ž6÷­k´*d‡sXˆ¼ Ï¼†ì·®‘Z 8'–¿îR@±€=¼ú„m_»eÊiGçmÉo„Fn»ÿ©yû÷ƒÑ›Þüjú®÷ºžÃæ.ìë 5DðBN„³[$’—2Ša±Ùu›)¡aiä–I úWHZià2¹€•–Øݕ¹ƒäȤ»c?OðõfyK’;c³e¹fßg$œ1î»´ß-‡±ïVørå¬>®‡:A©3ôLÈ ¹h¢SÇ~ -‚­}«Î-›€-’`à9@ïˆÄ 4ôªnšË'à‘2öÀ(w¡%P 7ŽËÌö*…0{¤x<îeôÝ7n,:tÀÀ£Ðw€=·,+. |°;±È3…c…‘ ԇ<ñ3C߁ò¾/âûj7‡VJ_¾×†¶)L/=íÖRea96 Áæ®rXIž$žsZÝ0ѶßöÜȍ,v œ¯ÜyïèÑcs\4µp¥Rnjßai’å7ž n¦sGS~2uJY†g‘UÛuk9ˆ]ËJC ¼%÷(eWf™BÉ°¨ßôh ˆ°¹—€‘R'JÅCal=‹:^ëvñË\Uölô’%lÁ/aUk·í/ ×à{¤OæÅzBÇîJ+r¥á»Æ‡ê¦‡äôwšÜKü÷>*!™eZÜÂêtij™N@A€è-¢ŽxÔυ¡8Õ>Ÿ™xxöéB%ü”ý“Û #œô•ßJß/zÚ÷Ûcã²íð˜÷%ð%ô4}eìðo§§}ߪ}wãÙ±ÃÔvMjÓ1V̔cUšÕÌ$ò“«OÛú4ˆÊ±ÚüDLjUÁž;ð·ðAÊö3Æìì4‚Á•Ž øgë`ѳW^§ƒ­“9é%,)- -{T¦ö ­ѓkìÜÚÛ-t½ÝBëÒx胇¦Æ@à„NMŠ.~{Ž‰\w)œ›V:ƒ•†®fJjYÿlfw‘=)í³F5;ߟåýiî4%må™ïµË †k“uqê7Ο¥¢@{£*ÉW<+³ÄÈ°÷á£Íº,@ï3.3±§öøiœ×ðs“€äG?ö¦oÌ!?ŒÞ–“Yy¹¸IO†ƒÛ[»/áOSزÔþ×?ÿsø‹ì(¿åo¸?^ö¦.!éÜöOt~}ælnåÛÞMõ¾óëOù;¯‚#Œ-Âþº‚­üëõšFr Ýÿòh]é:½±O_a‡žôf½oín“ù—_üúÃÿòÁÿù¿ÿ½ò?ÿ~_ýóÿ÷§ù}EÇ¿~ÿ—]XŸëß´¿>ì?ÀìÉ\9Ú_˜}Yh`^?­âª‘¸è<ÿþûûðÙª$ñÕ9rå PœÿúÿyÄßP!:µú9sØïñù2JÇÞ$°Ô͂D‚®„Ø°(‡,´ðLý_ç®gÛ§Às÷ç5B—%“¯Îëd“K"C=´‚áÊ¡YP"h$X,ËBJFbÊWç ¨À[‹*VîÝ^XùêüCĕ¯Î?D`ùêüD–¦¯Z¾:êVóÜ9ýj…s¿­ððø‡ÎãùlÜq[rð{|BËÞµçÓrò¶¼<·2ý¹k5­n;ߏGãQ§…[ñ‹¡LIäæHTN+ûÁjv¥…à§Ábµø·¥A ÔäTåÆIYÒº˜@RŸý›'näÎpd—4þB€/³'Jà©J¡uü¨]PÎ$@Ø#öÁ#ó@Ù0£§ @•aX¡·œ%ˆ{AÄ&øUó7¨ð(›ÑGìÅIÍH™áP´£ 2ÊRž»Y:ôà&î‚U½$uǝ·»½Hó¼Ú{0o!*FÓnnRmæ@´ °@»#dÌDz{D:îdD: ÁÂXâø;‘n‰Fþ¬Îë“.†á…‡¿Û¼Â -¦yõ@?ƒÖUÚÁûUÌ.¡ƒ©ŠhˆvhÃ`ˆŒ™hÀ¯7-u3"…äÑzÌÑw"Þ•‚§‘Ù¿ÂäYEf,¬ š{IÅ«¢k%‹<ˆŒô=–  Œá9/ôÌ@¯ÅETÊÒ¬"-Â_§ïyÔà«Éü!…ï'@$*(–ÃsDÆøú“*y⑘`BË wǔ£>Ƥ£ðƒ<|B˜t‹4Zþ*›ÖÃÂÖòÇtØ|^’ŠIG"WL:ÌøAÝ5bâ1,¢^sc$ÔLze×ú~V¶­LضDÞ¶¶íªÒ^D=É´r#$¹ˆH@²SD:–±"Ò±$F0–Õ1"ÒX ] Ãñ1j¢¿?"u3¢„@2ñF߉l‹ô©ŠwÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(Æ @°„ã"¬4nzqD-ê^D-xÐkô¨µH—ª<Q‹@4®œ -7n’“"jyi*" \"ŒÒ÷ˆX -Ċ@8,ÂJÃöïhE‹h•V ²G}'Z-R¥*ÀE´" ‹Dޏ^,ŠhEÒSD,’°ø)/1Vÿ="ƒ±"3*{¬4nzq¼}÷"jÑø)4a ߉Z‹t9Ý’øqý³‰7âß©Ÿ6éà?ÿèH«Š%+ü´Ü@®¡û·‰Ÿ6Ïô»i½+‰þ÷ßáû‡þø/ÕÿѧÃÿáÿÔ¬¡¹›Õ·úÇmÿsp†Ö;C´ÖI³nî¦ñžËEGoãªqO.9kÀmÜ5ðè²Ãƍx+—M ãÈQä“ˉðäzFoŽ}ºÎŸ³náѱOÖùt,x[¯>ºì×Y·ðìàà–|;ÝÊ»SGõ3PëöY·qüØGë\?ÞÆùƒ.¹ªÐ Ù² Á[9ê(¸žàuÞ¡pÿ}´ÎC„àí|Dø貗hÜÂO„£[ö!x+_Q׽ΉT…6w#ÙÔ9’¼¥+ ­q&-€[¸“,C­q(Á€·p)ÕPo-­ë|MUhsodÍ.û› hÎ6'xnÙçT…6ö:Á–ýNÝÂóTCµµ4®sIU¡ÍR.´ä–à6Ž)ˆ\ZvMU¡MS0 e÷@·pPÕÐl½dR㹪B›û®ìs5Þ+„ná¿Âç–>1BÿAJW-Ibp~8Å*GôkôÃtâªE¯¨vÀ÷Œ>¦h$~€'.`jq`˜LÙüÆ®xéÿ‚A'…O|å;~>Šž:r¨°mQéàòWÎ,wM]çoèkê‰ß9 -¸é¾4Å¿ŽbG‚Š¿pƒøIðÄ÷"ÌSõëׂrⓗ+xñüL½z|öêû{*¤¡˜¨JnqH+/),À¡»…2.Š`ʾH+\_B­I`»©ÛÞX>Ð¥ªY¨R¾ˆŽve„àՒëXÙýcÔÁv~gKƒ¥MPt]¤DŒ®"@`û.AðÁÄU9ÄÄè àãÛ÷(gqT¡Š¤r YÔ×ÜWNªƒ…'±¼ô¾ -W¢]ÍF¦›€2H®Nõ,j·ÐٝÝfYWY^•B¨s£3¨’º:bé§/Àõb|ûómå -ÕÚÊêíoOê†¨Ôv®2§+~ïfMEŸeø|7:Ry7øíHCáyșMò„¿úWøìâEñ#6Â󇧫ÀjLôñ4ôÏË¡\~« ñè!öпô”>Rzzú$TD‚©qÝÐGŁûŒÕÁ€¯r,ÖÁE -+{qCÆ[ÕOßIegÇþ(^«è/ZÑ?MiÔX_$uô÷WµÎÒzú¯Ä}Ü÷"ý?°j4”³Ã åf×¼/c(±ÌgÎpÎâN< -ÿ¥+?eŒX‡e±b{b“è£oqÍ1•>¥‡Eu,¯ˆuåÐö¡Ø´ê™eœ)Ô×u¡·ŸTzyv¶öf؏¨xÀ¥&MñFíBå”Æî`–?h ‹•Ê3eÐ씣Ž÷pí¥ÐG;Õ" m -o e, Wõ1¡ËÁì´va_ˆº ÞD€>¦2¹îp#ê0cYUMaõG¿þxúóO:ßv¾î&ýay®Î¿é`t¥:û€ý±:»ª›äM¦i¦•³£$]• »÷èT.-±\sfå3“ ¤à˺kaƒå&…®ÂéÕ¾$c^$pPÚƉò䆘Ÿ«ìjé–ø)¿FHŸ1ç€P:KS¯¢Ùþˆ/ñ.ÀÀ߁¿YÑ+)–Û^ÍÉòÝ·s%,ŠxØ©Õ%4:¸aڕi‘ÀÒÌSœ¹#¸NÃÅ=Ùß²T¡“2Õ ÓA‰barê¾¢®"€"± -WSF¶~WÜþ¢t¦Ú©“å~n`P÷£…Áíª£…åòhð6,Dã¬ž‰H²£‡QêCBÒ{èܦ'Þ䒲 -Âe[û‰ʝi=i^‘£ð’“z§®e½Æ³g¾S×r•¶S¹ë'¢ÙM•–,ý®øÏFež˜ÀGDáÊ4/­·2¥åClÍò¼t‹™ÃȺ¥¹sák­gÏ>V3‘´Å º ÇÅ9ô5[Ïb Õª2?» q³õÕy4_4K9Ö¥‡ÛL‡ðG¸ ŠÛ+Y˜0¡ ÄId].ýïš*±ð*MÐ*ÚÕÀ+Ç/y,?Ç~ùŒ‹~¯œé -ô÷À,Ø5 œÆcL"#XÖ-^¿‡W6àͤ²@•îؕ/`Á«4N²Õb48¹•J𶢤/ŒÅ~:{-u©Õ×4¸v]¸3¬² Ý4oWeôýÄÕµ@²«UQÀ ¥¸P­Ê”ÁüٞK)¨RqhûØ("Æݶcס¸kœ¢‘¤.|>q:jž¢¼c²Œ‘Îtg’f‰~'X©Ոð›r‘¨+ow \3B #¸_Ânpr]ƒ¥²«Ó/t‚2ý®#VÅN0¥ÉùÜ-Dˆ<ÅÇ}šŒeºÀk*¬ª ›ìKj9ìgagTdxå>gE'ǂ¤7À5mªp>»¶Œ…÷ØW!§Ñ]#„T<)ôµQ«Ç¨‚å׎H,A*`gçÚ_´€²Ù ތaUaÐnàn"wšQ®å0ÊU”µ,ËÙKÐa OaMTn\P{^™`保÷D»P¼†1—TŒÖ»Ša¶„v°ÔqF`I"ÌÌÒìÔÌh(\jggM@ÝÑf—Úi¼¨{ù Û%ÝÞØÀ26A°oÖÑAl܅]Ò|úà†W½‹ÓÒv´<²Ÿj•ûd ÅÞéY]'€Iºw­òªº¤ÿp‚†d¼…¿;2Þ ÄßáA“»ïRûƄ—©Ç濃‰ÞßÈ#ÍJ>ÏݝH€V:—)˜ú¹Kø-î3Pӓñí¬腕i@‹_|OÜ•<áÞ ³ø•z·Jû2-”oáG`üHƒ‡ÉÊ%™û /ëcx!e¾éÑ´À+UU´ï]Ôٚ½·öÆÓEee•ÜDßyUY¼kV(¯^ü\]ו%o¢É®®¿šUª«Kò.\hD{UCÀœi¯kæÊpCfðúGÓ¬vÎ[¼wIOoôÞÚ9÷Þ0¼ÙF ˜W¤o+Ù@Ùéô¿*¼Ÿ,)j– MËMí¶Œ.™§j@ÑCWþUªæUôäÍnøš/ã­Eí¿ÏÍÊzxQþîv•÷sÅë«ò·ÙE9)ýëó§ã7óé*‡ÜKÔ9ò4¨hä ç´ô[5Cc*E.••}¼êHƒµP–-Ÿ¬\K‰|«0ò·SúvD_k¾Ñ—©[‰iôj`йÝï¾ÌÀ¹¬éðßNéÛ}­ùF_¦{¾ܛi…2¼?³SÀ-ˆ æ°çɧ‚ûŸóÎÓÞÛñd0+GëÁè÷ùÕÿUs#姱±A.@*áRQz«7²Á5|‰Ï‹î¢S¸ÛÿÀD‚IZ¦ë°E79ÅGP€Ë1ÉHp²Êdîϼ1éºTp8rÌÆPEé.„Ti᜿ UgèÑÐ{¥ƒ85ۀÆ>˜ 4jf5u&îžF)\fŸ«_wQ:‰iJ¨}1zU5hØ&4<EJN‡ -²-àw~*þñËû¨å¹[*¹‘±3—Ë04[²B0¤@u"“ýk5ñ,PæÅ`8¼§·–Œ&Ƈè'ˤ¸+þ”«¢b£lì¢\ Û »“3ô¬éœÌpß&jš ‘s…¾øÌäPt@¸{MÐæJ<Ä»ø>)ô÷ž¸ê{áÃh.hG;„ydâ|'8#v¡©@4h؃å* ¹Ú´‚ƀ´–9@eNÐǪ„.-œ`ʒD¸Ûza‚ÑÎA ÂÎu -I;3Úm|3dá|÷„(,Êèu°š‘ÒQ38Eú÷²jUlåL$ž¾DêRéHÉ°ï✨¼C9ÙáÙT½±2›MPÒÅg%Ù­8}®†×!¶-¸¤ÏlÃï0ms+Ž‡IéÛð<·Þ·ázn“mÅ÷ÀÍSÃù¼ ïƒlæ¶ÜòZ—øˆ¡K|7[ð@L¨ ޒ”½%Þ²‡—g¹+4*X7F”–€)¨3®Œì Z9րœ™¨…Ñ£§N0E u X@¡Uüh i˜¥>ô;RŠę…)[E½XçéšS£†&SÀg¶.Ð%@£—9Ü"m"hÔý€ ‘#t«Xy¼†NXéS ­âÕµ“V÷¼ZEGÛ ™æhuÏ$ŽUjùÑ -Xôü§ñèÅd0šYGGŽz^ü˗_üt‹¿åî·ùý÷ùÅ?­zl5ALYîOæÓëΏ½Qïu9é<Ÿ\‚Ñ~Ï÷ëIo8¼žôn¯}ßô•¥ô£ÎËùè²sÔQ³î£¥Æßtl¿®ÄjˆµÏ,´~êp {ýkû‰Ÿ±«äùȒúºòÀ_Ç×Ãr:\ͨÝå±Ã*M{³ßK«^—ÔÖÏ\ ^‡ã¯“r0-}ÓézrÛ)ªû#LÜåñB×af¢ÎÃW(ð ÷Üb?í7ÕyüÃùñÄ®ïa‰(Nv[ŸœÙ–éùÓaovî÷bl;õi‡¶bÞaDOã9€°]\]ÿóÿ]ßá-_^Y¤îåö3þÏý?XÎ?jTx¿ê¨ÊÛ ÿ®ç«nÏájä]ß,³îë!{Ô¡ÿÅu|ªI° þ”€âSgÕvÿ†·: ç§òµîˆêWµôþ ÛPÛ#8s{ 6¤±ß$ÄŠÜŠ´ÒÑ"YI‹0µ…ûÍÎâÙ콝°/¿xô×ÑøÝ¿ÁAûõãáûé´wþìì›Î£ŸìÂqõè±=‹ß–ÜèÑÉøævlèÓÁП;¹î F×ā§é‘oó'8èý2˜ìqŒHkœÍzý7­÷¦ƒ~Ãdü¦lƒBâOÃçÿ(`…K†ñìeÙÛ#ñu =5:-l $>zR^u¾ë|ùEçëJßuðå+t½èMfµ£<.çƒY³®GcoEñõ´t2ÏyA}³¼º;ÝÌ{ÔÜ'N:ƒv£²•±tn[ٙ¡é¹OHaž–ß¿-GÏ//[Pþc“ Žî$×lœæ!d?˜L¸›pS«¢£ Þ*áxKn^h!ò¶¶ø»¥Ñz‚K{ÝÅß{/k@±vPö™ï+ûsèŒûQÔ°LÔ^ö[ÞIOg؝¤ž{>¿ºš–³op^V¢øú‡ápŽêÖxÒ-ƒKîtƒ[SˆŒV¤Í擷ådÚ¿”VÐý¶sj {ôýÕUùƾãÑ«ÁlKþõóùljUÂ(BìÉ`z;ì½w_¿ù茞·˜ûÁÑ퇑ëTcv´¿»ëãœnetž¿ÊŠ¶;ÇÞCXgu„­Î©ŽÌU|V nn‡á¬âõ˜C]MCëbLuñ«ò…݃³&Ó;‘ÍFaDBŽùØ.N! ™¨«ÝBZ!©øØ=F“øáè?ý‡£ÿpôo£î}Đ«ƒLp ɘ÷‘±ú£ã%à휌'#Ëëïäèø¾ÿ¦uz‹¸Å'ÅúÉ]¡Œtî¼Î×.?Ÿ®Ù ãåƒ7^~eæ´fIù~ÈՇ=¼Ë{E¬De ª„‰4 šÍ騉jy,þÝaƒº;8ã«_ïàÔü$©”¿öF³²ù™ ¹À&§3óå¦3óóåeŁ—xك”GvŠåP½àÀVr£ãaonGòS9Mz×7åžx-w-aŠ¦’‰»ÔJd2+|>nÈÏ̌„[›‚W~)QS؉˜¨™šš$MqW,íÞ(d’4ƒLÛ®ÌdžJLÀI¹P8D¸ÂÆ„R…éB‰‡J¨4Má^ »¦ŒÉD²Ê@@5dÌ -ø´†BP1ù!(ËS\7]-ñÚoÅh XFa}e)ØF׊d=H -å™R¹À°Â¤È¨%˜²Q³†2ú.ÉòQŒ„÷·=UjÆQ…W|C] Çñ»Ê­8K÷,Õò{ˆæ”k(ýQàG\ì€?žèò`IU^À"Q‰‚¢¨~kºó®ÉP DV%üV/t¯—Ž4‡µÓzíhçpòIˆw ǐ`ú(‡Ü8;ÕÊu“í÷ºù$Ëæ` 8x&ÚèÏÿfäCfÄÁ˜w7Ž \Nµy¡ñBqŒ QZ¦]¸h»# -+vU‘|~i‰H T˜“B:Ù¼(R#)@1· -u -ÄÚaÏÍgÀ!OýkÊÉõd|³Ÿ|r×BÐÖgŠn0·¯x¬ÛÜ®ˆ¼ô\ ÊÛÁhZ?(Öòѳçÿ|i—Ê·…tÞΦq=Šóáæ$üWi‘‘ÿñèuئÞî0*§Îôoüd`GˆÔw]xüIyk÷Àôù¨Šû¥7„zÁ•Ç^–Ã,éWcümqx~ úã˲EˆéËå'הL¤îûöÒ?¨µ‚6LãzúðÏ+'ìÕ§wDóð%}jÕã n#²ZgV&Ã& -cRÁô ú¨7×/~X· MžåÛ-ÂOh_t<È`Cþöõ¸/_\õ.;¼Þ&‘Šœüs4»EZhÚ37ÃÁ B ¸9\äáã«é¬Åö9&p˜È=;Lü¾ô7{®Ù«*•yz82¶92$ú5?ɑ±Ÿ íU1(].ëJ—'Éúâ宐÷>f;ȅ‚ó‡Eôñ‘¿tîA®!s?Y[{4ÿ*ÿdÓÿÙƒÎú×¥å,#ezó?þ£E"ÍZ†ô ö¯ƒÌ+”søþl8~w'úduý/¥²mtʋáè²j»ν -¥I¡¼íõ¿YÁ†[]Žò!&øièzÆ4̧勳Ócê±HI}B‚CZ¸¨ï»íY¦z\^'e竁°3üd2¾íœ]÷.ïŽW7OÓÜbϬúӉã­l¾»O~wL™M—½É›j£·ådV冷½óÇs?0wÏÜÿnyëÈ®ŸË4(ñӉlƒ8§w⪲è¬,ªƒ5I¿]FI7—6}Ñ–vºa¼¸hÞï¯ÿþ¢7–“»ÇÊÑ?¾A -üú;®ú×_¼è×Q R“þøú¹Å–Þñ®g7;c®/ùõõËgǝ—ã¿"IÜû‰¤Fè¼Cš+7V/¸}*³ ’A¹ 'ü׈[‘îV´®F¹$0Rxàä}/´Ïs•bÌj–"Jö†ö`ÄíeZ¸”Z¸?Ûß^'ªí콶Jyia‡ CÍò"à ™I¡±f¦}–MšcH¶ táâ°Ö?ÃÍÏþ¬ŠÎñŸµ dLìÓ©»!MK¯Pp׆vXp³|XŒ%[|цa—³´Ôzög™[Ì*&2³­Nzšg.Ñ8I„[Œ¯¸³U”öìÏERA [Rc–C‚®ºEnRã–—ÂÏ  „^ -û¯Å™Ä8!•† ŒaZ2¡\b…E¯þ˜Úu[¤{*”Âi ›Ðïã?›"àÔF(ß+Ã<2Ÿ£Q(ø./$,#“@F…tTaîá’ãÜOaè´]÷ʅÜçT÷4ƒŽ.c81vZ+ ¤ —ƒ¤Üj*•»%o|¾wFT´tKLÁ«H'0â:™”™N…3²Y\®¸`ât»Ò…rÛF´|¤£¦Gip^ra1f:ìªTAÁ[XÅR~°¿ÊŽÜåL™Ì—3“®Ç…Ó0i˜; ÜÍ·[FL[è°Ý,¯Œ8ºL&¸6DՏq‘i‚Ñ];}YÂëE˜Ü"ƒ¡{v:bêBº«as¸Ì²={¤t½dö"‰–Eà^;›ÀÍî´QÂâ˜2„SÀšª! -§EŠpTÊö§ÝäZ"ã·§±v‡~Fk&…ShÆiI ë9ǝQͲsÓ¢UnaÛábIsW#uPd-VR˜ -ç§PwpqSå¦ÒR ÅK|·-ß+áóaG'€ªv–Àa“œGxá‚3`¢ⵓ‘#:{”kÄÇ<ÐϏ4\¥Ãâ͡ø«S‘4Í7ÌñÂtÌérBZ"æÍ1ëçl-ãÉîo)aRÜDÏ*a -Œ@ՅÈÇWöüÃ5UäFÓP¥n팁ËQ궺À+—s*•Û™Ns®ûO—x`8¸ÙþÜ©\xnEÌRY‰ g/ՖÍãáªìvÀ%»{EXpjù…&f–.Š‘¨b§Ì%!ZôŽÌvWHܨ–:Æ ÄÁG¬ß±v£Ed.€ŽÈÆ:ËóÌìa–º]š Ü·©•'‘‡Iê± M—ø¸$‡i¬QÓVón!”âÿÔ!™<óëB‹Týeps¡-‘ø†•‡ŸOú׃˲lð87 H?¾Fdgcû‚IT¾áJDÏÆÃK[²7uÈVµG0xݵôO­»$`ñ9ߖŽÇ¯ŸMzóél~Ñyñº¥bætàÈÑ1)ciš"‡·šW!gØÅç‚ã@´5ˆÓÃ⓰ª#I#-´cuÊåÁ[ž€lÃXÕ -pø?  ²àm&©QXƪxjۃCõ,‹sÝSÔ«Åo†›t„,bŖŸ£èbðødâ“öLÇÃRóÿ+Rü \2ð2+_h<€M&þdÆËԹń["F•Ëþ¸ƒ´ÌÇ«³Ü±W{,wª[Ñ&ó'\Z9.ÝÁfÔâqiUKäÕÒ*†©²ìì;e&£Ž-~ ¤™;ƒQrÉÿ²GWŠ= ûeøÁ(¯nçüZ,‰F ŽûoP°rm -w„P¸þ¬ Ÿ¥^å¢-~`Y#A= –¶Œ5ÁíÊa¡j‰‚†©¶ÿ†-ø·òâª7¹ˆw _â–åkJ%+ô‹Š˜*–ôe$`ÚS$ÉÈ‚Å*/ d$lH‡”—ŽÚP,È"©ÍUá±dI•*o)Y©LS£L»ž¸i-`z¥Ç"à‚R+:‘Ã"a\*îŠÝ«™ËiQ2ƒôN'žºkÞ)׳Ú‰«7 ÛLZ^`p¡ÉÌ B¤Yê…GJÄ\¢O^„%'ߋã`c+[»;…NÓYÕ¹l9_ðe]¥š¥ä’/C>ޗñµEË6E×£-oLI|«: ú×ûÞpv5üã?í0ÎÇoÝey¯z§¥mQÙOZþ6»('PÓèüéøÍ| -Àã۟o뱀×ârünĀãbW®Êáå9ÐqPµŽ*?§g{³ùÍ›ÒÓOC$ÖË3$ÔÙÜ6ùû­.³7½É /¹ú~0zӛ_Mßõ^»ß_†÷Gòö|uþõÿIJW#?¥pÚbà/Øô}kAãyñø¥Ù³[tŽÀFºñ²¾¿t=p]z1ž`ø³ôiiÕ÷¢“‰æϊÐçÆùajwÜÅØîù'åUo>œEÝýŽþ|Mm¨Dá_<ýɎsíS¿Ý G¶Á‘å“ÁÅ|ƗyV&瓠¹£·Dí¬\o…è’–­múþ™…KI¿þGÓó·½Éô»¨„}Üöm´°ñ‡éŠ†£x~¨åŸ©FãQلJñe`—ÈDMïrán?À‹ÁèÒvX4¤]3–AºMÙ` qó»\N±ž(ÍH1€{íŒ&3}ï ¡=Søöms¶mwcÁÃ8ûVßßìûû¨KôÛi÷ Ù}Ø|¥~Š}s½ìVÖVž^½Ûõ½œ| -W¬?˜¹—VIïæ¹ä¢Ú+Çýnp éª &Þ·Ü ö}”æm 7Žï}£±Ý±±ý¸¼þ´iT¿5Ûª;2ªL¨f“u]^_7:¸éN Uו#»Ϭ¨æÒâŒqù¡‘*]žç“~y Ù»!VØÓn'úqSÎz—VÞºƒÎܙÿçқµ­¹¨õŸj7“Jißö.Iåë¬Ý^…ModzEXo8 %›Ñ溼t=LS¤óØÇø:“ϝÇóÙ¸ó²7•“Áïå"V´âÑ:oFVÅÏg×“ql¿«k;˜Ž‡½YÙ¹€PZʆ¯´.:·½ÛrҙnæÐ;– 4éy£TÇv|L=—QƒÙ¤7šÞöìüößÛ~ .->‡‘NìØ:ÒönÞ¸íëIɋhcã ["Rc”YÝTÄ}ØØ6îÃÆÆ¡"U¹â¦d•=éÞö¦g\¢2•/&崜¼-;`'ï|9˜õ.ÃÁŒŽö¯—Í uFߧCt-؉F„³Nl+ Ñõ0‚Ëé5¯E\—¥]Góhq¨¤òÈóùìÖ.È UmÌ/á [02G?¿ßÆ?rŒþ³áø¢7|YÞ·ÓU¨ñ€‰_–d«ÊY9üKofiv:î÷†@›iÅ»¢µÊròÓJÛø÷W |Á«i²„î&Ý$âXoÿðt>Òlù¸}û+Zfiæ×Ì ûãm‰¦÷gv‹#ŸEk1Y×ð¸~×¶}Ék6,Ú†Ïo{ý°µYÛøi¯_†*"뚃l°Ô:_ٕ_å;KÍ'ƒé¬7êÓ9Ôy¨¶E·Ãâóg³›íÐýép<žDäÜض 9±a•œrÎW‘B”BÔr}3 b¼:L^äbMÛãÊVd”v®˜wôF³AǞq½)óªÔµ;jё´ØÆr°Y´8×ô² -Q´¬®ÌˆC{VÛïÌ{ÀJ;§å[Qª²’úò·øzƹªíI9žXrÆ´_¿¾ÿmdµ²- NŠ5X¤r5¹þ2¶<{<úK¬zh“g«"^YATòü̊E'pöý8¾¬;Ғh=Y)f8•)¦NkV_]ë™= [>ú¢7qUp¦/ž<…ÌJ»©+G%-¾JÛïo.ÊË“ñÕ`Xþµ|¿/ µ§çtYHª4ûÛõ ½„²9;‚¹{1ìJwŽÅl)Ëìю˜š ù¥7L¯íBQ¬š‹[4À3~ nh–dƒ|Syb‚ÇýÑ[ûV+éØS9b¾«ÞÒn­h–Û߬hôڒ’yI)*ä<›_Ø-÷tl;ôøt iÒ92ôÐRPù(\·µ4ÁX™\‰t3.Ø#89°+;lí鋏`ö®H8q*çTV4X“•Ž*ýo¼¶Šåŕ§YÃÅåe·Jf…iHI^åÍ ¢~]–¿•ýñè²åCO“é¦áBY3c«žã!}èD3¢…yþž I– ríRæ6 ÄÑNíæ¦X„žüú÷ËËÁü&’íÿ ³Àÿ;V›]§lTE P}A¦x 2EÐOcîO€mœx¶ñ²Ê6Û>÷ÇÄÙÊC¥ÒìU8MbF‡mœBóèÇáŽ9\¥íóE¶¹™X¢óý‹³Ԃ֛Èåp6¤—k¼™`Õv+(æ5$™Ç¸H3&Fãpu#<6 ¦V©«YüÖ‚AñÑ?ÇÝ[»ê'võ/vl©¼º7nh6}3¸½°}³ÀÛMJ({YB'šöÇÃaà5Jþâdwh3,z&ò{y›PüßÆ?Œ®ÆHÝDñÖxô·òâÑ/ƒËrüèDZe…ÿX?n‰¨«1\KݟΆÝK>…£`Bn <çˆ ƒMº½¼±?GÍûu{Ù½óՇGêÖÃííÄ·[Óhä;@ÚAaº\“s±iìõʵèæ«VE7[‰qpc7UwhO.R!ºÅ†Æ³1:&7QO¢Žä‰éšt}{çf ©x2Ÿô¯;¯&åàÂrZK©Áh€…#ÖÍ U¸ñò û‹ä\ݪBË5ÈƱ’¹Ýb»¥EÍÐ6»Ý\–ÓÁëQlþ•ëxDž÷¬Å‰-Q jÒ°7½Ìnz·Í9^ub–Ç>œto‚ -ºª‰!¡€ó× šòady}Ÿx}&k›O.»V«†ìýª´¶å•=­¹Ô Ú:k›ÝúðÒµ _üº»~1úFµi^‹Í¦`¼al¾Ý0ÒiÿvØ¿†¹FýђŒ¾ØhfÅë؟±b”vʆ½Ûäð × àöõ͛n9›îZv ͦ\¶dãZÆöŽ¿G›¥ÉCvÌ Äuî«c‰ÐÖr<ÞU}ç/Àˆ¾©Q2¾ÝÔ䬁•!6µC–Z¿WÜ{Á¶tћL×Mi†å‘ñ¡Ô õl¼¿ºq|(՟GÐê¦LzÒ uèIƒÆqOêvÖÕhÖ½nàˆ®Ñíäjê¯[5®‘7#ðÊÙp‚àC½ÑˆƒêÕel¶QûèßIJÖ×'c«»^vž>öò±*:ÿëëΞw„Luv$¿•I¢ÿ×7ôÁ+Ʋc8jBW1m×5"Ëvÿæý: =j9ž]oÔН¸Z·g6Ťg¯´¯e£ôóiùdÜGGx½bÿ˜žŒUûØ,d‚¥ðÅà·rø¢œ@¹˜ïßÙ¾žQýh(AçâÖF ¸§NÁ˜ôxâžÂð†¥§ªïrF£Ö/s5x›¼–\˜£ÞR ÍR›ëñ»¿ .—m]Å¢Ýõ¶7âSq³E%*½x°» kŠ%Ž~ñäé9­—5K& š¾šôno7µÐ€ÇAP[ÑlˆÀm]†â`­µÚ>íMg+/ @€ ƒrÚ±‡ÈeÇ®¢QÔr‘鬴¤½.G‹rpÓ9»Å„Ãɨc,'x"žXþžðiǾåèÉø Îoê.¾+G—řEn_0-;ßǨÿÔ±¿ó¯‡gzûÇBæî`¿¤cgaðú›Îiïýx>³\ñõ¤wsÓygŸþ½Û9îv~=AíÝö’Ì1õæÿÉÀ#‡þo{õúÿίKê¥íÐô÷weÿ 6p]™.Ê7öT€Ð±º»Uꖄ}}2¸ÝÄ+ó÷rƒ´‘êOÖ)„ÿ{ï•ÜL¯$ -¾w„öð‘”èM½÷ވ¢è)Ñ;Iôîöí—YÄì`^f!³šYÆ(‡*–£é‡‰è8'¾Ÿb3D"‘ɼý9_ŠQYӀ7Œ$.Z•_oȚ<Ì«Àê)È[=Ì«ãï±)™VU=Ú2glÈÁ¥’·ÀcÀÁtÔŠÝú—5ÕEµÐÂÁâú)3ÚÊn»›Âªuppý疪ë¹> -ä(NŸÛØr€cSã=•/÷;WCczþ…íB)A$~¨œÐ zƳ¢9ñ²`ö€Çÿsw\%•Ž{æ—à ü/,%Nf‘7XÔgë‰Û <á~çj‰-w闍äÊ­B›BfÅÕòÜFels¸eg -Gˍ³]ˉɎ5F1 EHg5‰”÷ìáÆ&2QCì°÷*-Æ78ée)ùíö%W™ý¡`­ð…¼ü¹B à¨=ÿ.~Ymý6&P -ñIÆßjN§„t¡Úÿ¸Um‰åR!Óãn2>ía~¼Oq‡žüD"áj¦7­ðÕqÄ Á£ÈÚ ð‹:/‹^­ÔÆ<b-\'æ–)ÉiqI'{*ryO(íI *uóG´nžæÈ$lœéÒú4E³–Ê@½lü\6“íøw}R!¦§F6‰Ê&ªÊêkT\êaXj­Jvý¤\×ÿõ®:ªŒ©Í@C«3ӄ¿à|÷ÉN…¨PEmÏo–¢üVs:KV)ÖFe,áä/c'ê©BÁïIÏáŒÐSw¬ªÿ²„ÛChܱ]úª-?æ6?ÁåVSÌj¬FCêwl?½z›ùŒWŒ7sъ;,*ñãeêËfœÿévëâ”þK/­Äk<4°›ãaëþ?•œ€&*kŽÌ[Åsr™¯•ãa÷¼žúD§i»Ý°¼ÂUžuB_:ûôõrçô_?éîÙ¬‰Í®|JêçKÔ«»dÓî×vòomh4éQœˆB{õ¾Víë;ÑHÙ[ÒXñ÷‚ýxx•íǃ'ûƒ¶¾]²ÆÜlÐ zeG`ÝӋ~ۗ\Çםà"ùsNýøz$"#}zJ–ñpÌЦAŸRƒå`>é鬠IÚü¯‰ºM·¥ÑÏ.MàÏh™f¦žš1õã†Â‰7—Þ’|·Ž,ñ”¡™MÍ/æh«¨û M§ãüôkÉ,Ê?j’pŒ}Çß×QðwPœ%×o1ƒíhù¾$ÊuýNÀ\7ÔêÇÛ©ac‰TBßæ;òëó9N Wâ8-–UdANÓÅS PÎg˜ûÚ.büM9Æ`‘ÉJÄh³Î“kßdžšC·üOºvÆðÀÛõӅ/¯.êKí–pkötNt}7º}SŠzÍ:¸,_Þ¶·¶…¤Š&W&¯fÐÖ¬L}]%í‡õY¥w„h¼ðÁAA¯4ÄD[p£?,Ñl˜þngJÔû)kfDAsvÀÁf¬Îtl¡µ#áÐìï}€V“1€WMz4à­d‘BŸiŒ|·ænôG“L¹Œ‰¹½=ïß4ÑHÿYÒ G鐏 ¯Iï¤Y |¼uš‰j*ù‘^ÔñC?¸h’încH´çõ2CÒÒJº;‰j6ýצ~ÿ¼ŽÐbó¶Ì¦fÐ0:òù>g;¡¿~ؔÕ²¹”M›f%Š: ­©-Y༷×,±Öø@M)êõã¡ÆY›hϗëÉ ˆ‹Q‚YŒÎQÀªƒTMÁ„ÌLoö¶tŽÂ±4‘ýŽ»„GálðˆÙjIîázñ‰‹/.³ûÄ~ND'8œTÅr.1,’ˆo–}h”5.Jönôœ¦×A˜ Ÿ"ÞËg`ž5ê÷¦Ô÷s•±”íYŽ_Á>è©gfQã`wmô`r:Sjù“9ùBÓægÂ×s¶…ëð‘_·xÀµ¹ŒÍ: ˆ-K`5/¥šD£2³a ¤“åîJl¼èUì½\×·›'ã$œ9wåš}ÎYÓÇ:”M{zNK47‚W¢qSóš.²™´Ç—ôÚª-${ìd¾eEXӎÑޜü;Ï6Éõ¶µK4~:¯FÉÂØg¬»wgVoó}%>?ð³¾>鵔hÑiJ/ y/ï™V'ÏHt€¡Ôo¸²ñe¤åý(=qÿ´Í·é‰ÿž>ñÙøZûÿÖ¶0’nܹÑp/ìŠD8¹2î³áiÄD}ïÓ<ÆÉÎLt“Ää’1Fmîä<… m<û–`€óúÕ þ‘%T8-€üžêÁ§1ó~‚ ô#ôuñÜ€È%€aìD±Q’ã8ó'DÃÁEh¨ŸÁ¦Àýù—B¯PhþÒÌ àGô8¾b¸WÐÚ°kÎÍæ!@ ÐŸ ­eÑ·E–µ×¶wS“cР‘ A|1; <àö 76Ä-,4šÒ|j:UÄA̬«ޟˆp°…™Ù°²!Ý£œàï[ŒK؟Á!–gÇ:·o)4b¯â¤åÑUì;ãƒÁ–ç鳤KL -°ì©z XÑR{Íl^–¡ÅF©Ä¼–Hpb—Di†[Á‚~óuMs¢Ñ*m³qü싅?—‰-8•—åì¨Ò f5fû1ŸýŒZa{h€ž”^ÅÛºæ2õ;Æ3ÓÕAO™˜îâ9H›Q¸Žci˘QæôÒfŠQºæGÁôͦ<;ÐÅ[c õsùì¥K¥CŸRr8O|nÓÕx}pœclC^¡± “%øN¬‡aÛ(»ã^ ž:´¦/`·ö™©µáHz­Nf²’ÉÉ2=7gò˜*×(^aZëûöW±éâ °‹¡aXgw 1@Ç ~fÛ9*Ÿß 800<=Î"‚ÁÍFÑíR n5Šn¶ˆ Ö çGì<Ë{°â,#ÿÚ~ÌÓëÐ|[ÑêX§˜Dš3ŸT4(¾5C©ƒÏ7hÖ â´ÿƒñŒ—ÿ††G)é5 ¦I²ÿ2'koý3RÁ‰bŽô‰ -7÷G½%{ºðç (GÓ?±ÍC†n­ËDµYl¶©p0R¶ EÒ¨×kf÷A.¹ö.¿6§ÜbCWÓ¹ÕÛì³ZºU¦à“õœÛk'€%ä~çÃ-KØFaš¨¯ãðÛå !§Ÿ±ª3ÞÔh3¹ažz­Ü -Ngo¥Ký|k‚`ÐÃ!Ã};˜°½”\U,ÀúùX¸™Ù@‚¡=2H®œ ÷Œe{"8Û¬ ¸TEž…îMfÙo;»Ý|ÙA߬Ëf¶—‘ó-°ñSÌe}u|4~ß´\LÖ>âNSwóNõÒ}KÔÞë-hê3Ú.š#vz·ºL>ˆò޾Νªó£é¾$ ÒÚØàiÆ?j‹ù¬Ùdu4@tµaemÁqõ™ÍMš8]W<<lãíšEü±ÔÁøCìŽÉê+Jޖ.Í#ÓÐR Z“‰R¯²;™-ÿ­f;½ =}$ò¶1<¤¯w²‹ór;Ylc#ÛX¡»Eê÷ôëM/l_@ËRÏ¥ªÂˀÁ­iÀaÎlc™K•Öè• é×¼gMݏs¢Ô%g¬„Ž”ÞgéÙ&`e¸Ð¨M/ 1"Êë(’Úvš¨rDPgV;â ÎGú9Mªü‡#¹¶’n}Ëé"Á÷¦¿ŸÞ¾(gÊR?$Föûa¹È`ïë F Ï efâèýò5$¿¿ë€>ÂËKÀU•};ÌîU_ؕ™gÕÉh,!({¦ÌÔB|'ÜÆ@ HöŸÒhü.]<kêӅÍïWÒÓêØ5óÇ2ñÙ°dso¹¾/¹"gG¤½ÀíI)0Ôq¤ _e3Ô@>Ñ[@V‡ëbÃ÷7ô¯õìP§ï¦€dɵÿ՚.MFNå¡u‹åÛ -î›ßS@Z¼Öpµ‰ÆêÇêç)c1{øy×k?Lâ­×ó™E]˼ÔxÏåìgÒÓ°Û¸ 4Dá+¦a°G.òWþ‹à¯¡Vºž5‘Mwóf±ÉñÞóXBýÝ×7÷ -sHóÞj™}ïÓPU(4˜Vȟ|_†~3Ö]bÒC&êžl?·9› ð½?JØð‰R9t'p¶T~($æíäRï©VŒUøh^¢b*GÍP©Ÿ`¥ãLm¤Ù‚° -·÷((#Pnéu°ƒZòz#ÙC>œ^—=œ‚L¯å@§I/ê£]êWûêüí®&¶ÑÂNdIãUwÓ} ²ppßTƒ™R<”Üãj9=¶°1~´.PBǾþì=½Œ™Þü¬4ðw44€.0è&v?U³€_ .À¸…Ñ7ßÜðÁ°bŒ¢¯KŒK«D¦‘ð>‘>9L/j§%2èÁæѱ–Jô—ÙT|ù™…DÀ±JÞ¢_I˜ÿâ­Faœ §ÏØp€\ÖiãÁö|÷ïCÌEÊC“qšÌhÉ/}ü¦+9WJÿãF¡„sëÊÆõåòñC/Ôe— -IèÙ&s‚¡ƒà‘?}¼µh\0àQoñ’¶Îlñàûß -ÓÜÁ? ¯6»MÑ!!vßÎrrC^` 3¬?óÁˆ!7­ÐÓÉW/éüàtJ['ÙLØôúÖÙ=$7Õ¨çšijZp¢­zÉUˆ4‰ç~ -\ÁΛÆ؃ÄbƒmÅ©?ʽe5¥øQ78§»£]„oà]š`Щ“M-b®ëmÔ÷AŸp¢ªWöµó÷K8=«Ÿt.ú6zGÀKy„§­Þ‰…Ê ³64@¿¡´è¤çá4$.¡Àt™&¿çjM)÷‡ö ™tk<¶Š‡£{¾)í|š90ÄÉÚóF›îLÂc+Õ È …hÐ+hœƒ¬³9MìÒfËÛÌÔ³¨mv“½ _½’ëÐýHì‹+ñÑҗüdkF TË`ÅâúJ4z oË&w·ÿÉÈ4Þ.`ƒÄìéÆ6A8cÙ௑™vžt<¿?0/[wPáóR\•ëÆ×(¶‰ôK¤Ø+òxõ“k_ü™t´Õ Ã>óʏϠm>²Æ•¼‰H®×û‘ÐØgsúfÎóIfB„ ¸¦MƒôRëñLt0’D$>wåsÚZ=Ì-jua—;t¨rd¦ZoX<šc6ãÿÌ Nß!ÿYF6uh±Ñ끕ÿçåëIÕ „xÆ.àü¼aµP;c©,€†›Øa¼­€MYz¨³vYÔmD´uքkéBhu™]6ô!õž Œ¨S&zê8‰¦1ÖL]èLfÌ»ãW Ó:/óVv¸vxÔô®ã¾Î2“ðçNg¥·eE[+E67§Ð<¨ß€YšpÔÑÆÖ1cÓ9¡¡ü¼$ü“ý;) îÕÆy  îˆÐâ2? -¥ñΜv`¿`Ý5ˆs¼2PêxÆo²ñ%`öú¥1Sfc/²1 ©PlÔvM%\IÔ­q°6KóVÀ ™éE;„2Ío³k¡¾è08¤¶ó¤{5›y[Í~Ëò©Ÿ¯™šbÚx¸æ¤K¥°– j ʎõ™x¨ß\õYûjÂi=Läï­ÀY¼Ø'>מ6O.;ñ“©£M—Š.Àýºä^LÄ2=_cxق÷R‘ôÒãÕB3ÊzùþõFæ °•Ì‡l8;¥™’Õ1ØÔ9¤i]äDzK$îÓ¦Q¦I?å«ÏváÜþu`CLN[™àl6mcóGrm#¹N¯³ksNrN@ê•÷Áä’õ/?0=Ā,(ÛÖÚp ÖÊÃ1µ ‡ î°úMcb;YžXQÇ9pnÐш%…ð඀r;¸v߀ˆ«]øOۉFÓ×@h -Vñ¿2˜ü¦ÍóuBJÚààÚ§~ßcÞTD¯¤!ÜH›Ó°µ[J&üÖ„§ÿåC֒– >³@´þ—ŠVrš¨–ò0¨»ìBJ8ycªiÁY1ÿ -Û»¿´#óô³ÀîŠÎAç§ Ä­+òþÈÛ¬~ýѦœý–ž5C»ÌÔkò$+&Ó¯o[¨Y8G6$ó*P*Yàê×^ÆÖõ/“î¶Ë†±ÀïÀºL4Ò'³÷PÇ"ÀŒ6,Lò²P̑Ð$¸Š¤û¿]²ÖX˗„|à ÚHÁpÕR?ñ™-]X§Ú]€pÖ¾uYc)éO|ô¬;4šÓœ|7:'&~¡­êÉL'&y¨{P©Èϐ»›ñ¨ôȃ‹ì‡2qÒ3ãџ5±i>²#cß 7Åwº¨YØiàÃA¨PÍzƒæÌfž¥HÀp´Ü(K¨šøo??ÍÔõU¥DyCK¦b € h±‚½Ô8e¦Ñ¼-jê÷¯fæë5°lÁÀòЫo ÷ÃÏô GùD_ØêA'¼è_•ùœ`µÐ˜© æ±»°ð×°¼~».«>þ_óÊe}þݯ牫+–®Gza{2 -ýAlT@X°È<|ù”k‰%ž5i‰zF>K¬5qKÅf‰ýœ]ð“Ó®]ìƒû =¹bs(V¹U^÷Cû(Ê>uZ"ŸÞÑ6:k¬ÃÜc[10Ðض5ŸÆúó×ÓXMñ¼ÆRÓ|kŒ¯_FµÒÉÙ]å€ÆÍiôî“뵆FâŽUGQ"?*Æà8ý”þÖ>@sì·&ŸbÖàÐӜ-¢X¶Æ»$VŸcQ7pX!§aˆÃÓñ´œÄ±~ø _a=¢]R«fæ™ ÉyN|ºnSßmÄçªÍŽ=ºƒ÷RÃJdKµ$‡® iß<~OLkwHdw†8ÖÜkD_žÿ4Å°B™–«ù[RDÎëmû…5ó½Êò(¬5 q+¢°ù -k~¸ñÌ{`õÁvÀÂé– ï}k×fÌÕç±Û{âXݽ$QÞÔ|bXš“¶ ½øËÝ©!b­®çyI¬%ûao•Àúe!êåÃaEœ&˜nÉ5(g³1(ÖFá· ‰µ^ñ6FbXᾈÓD‹ĉ\¶é³¡9$Šµ5ˆœ$±¶Œóáa…åëéVˆ¶-–”Àš±´ãþcJkÏÚˆa¥i¯îOÛ('%ˆüí%úã‘Eë{ów|{·Šb :C„7×ÓÝÍcÆ¥Ö -1ʔÓâX³MRÛ9× -¬(Ö%Ôñݦ£§;q™›Ç0g\Ö±öœã‹§àñâJ«õ -k5b< 28ܞ3}ä(˜®%¸ëZi¬«€Y€õmñ¥] ¬Îd—,ðÅ'‘yÿÊA¬6+DC´ï¶×­+ô°¦ÎB"g2v -k̘± -ä¢af¡Å“ë5˜*ñ…âÜñ¿!Ê]w\ïÞ7m¤›Ï¬E«Æ™¬þÐXƒ5»`®»HfEa5Ëe„•ÒÓ("ƒô÷³C-P®>Rø°œçÆÜN$ž^ô×l³ê6í© #Ï\ê…#àˆÊ¯ÄÓî‘ W3ÔÓ+ý !Êq—=…ÛóJÞ÷bDù3æF/ˆ©“¥š¶(ñtº#ßWÎ_i¢ÍLd÷¯¤ÿ¹g°m„ÂçžøSçéCc0ßÑS§!jÌóŸ& íiÏÇ£Ô BAè<¯5awñ{š²™?qÍ8kX’»Ó;%Š( Îmý„â) ¸oždŽµh ÿú‡þÀŒ‡cŒ|‹;ΆT¶óuÓ½l·‘îeÂvð‘M%íÓT*é(Ypûnô¶†ÃqQ1Ô:—2£Š$ô )ôÅ BGÅ¿5ŽHç÷Ȑ•‹0kÎê¿‘‰ ì%mæä¯?x²÷¨u"6êLv_Oƒˆ¬žh -íıº»i¬ÚìÌ!À -Ðpˆ‘)$h½ÀKaÉ`ÍÙ|=m¦×ë8¬È6`±ºxXýyh„¬¹5ÂZ#ŽÕ]‡ÙÆb`5’vI¬È6ÀêÕAÛà[«»ûE™¸8b‘7NI¬È6Ä -mƒ‡Ά‡x.Õÿ^ëHc…Š†$…a<(C©éÖ®–V´ÒøÑ'šÝƒòï!aC¿RÒý]V÷žéƒzÊ ÊZ+{ù^$Þ&Î^€InøJqΤÙQr†!.·÷㤵IZÙ¾˜µ¡•@sHÚ=ÏYfÙBŸ˜ï.ú¡ßÁBU½ÇeÄ_ô¼½¡à’¶9í˜Ù7ئ#JCó0‹ÞâyçÒ«h ×üêßèÆL›¦}lÌ/¥ÉLÿ”£ÕAzÎØ £™7úkeGˆRéÞA0À‡) qÒ'?óôdhð_À™1¢ ?,ö‰1Y3Vꚤ$æ@ÄÜá/*þ¡gˆloÑ~h¸òì$Ù>q#Gd ]QZÃᙸôð)³Gà%¥X‹]é{×Ô$C–é%Í!«çè’c{qžÏu÷òüÅ1ÍÐÒüE,HmWõåIt@}%nU½ƒB„陵Q¦_ -ÙwWR¨kÝó0°óà!šV$'’Ã`°ƒæI!“ñ¦äöìZϒ#¢GD=ú‡&ŸXx’/óÝnO\Ž‹oOÊ´™\Œ,•ULŽZ|~¼ÉÙtò“£þ™ØõT(B”̹ Tn%Î'n^zj^âóƌé3iNþeŸ0ÃӏÓ:Õ9H%Lw`å¾’A;!ÕÓKv³‹Ñ AA~èkzݸÙyôâït;s¬ñ6û¦Èßìfœ¢/ÊõÔjU9Sd›¢Œ)xíÈ¥i ý>FR%‡²#ÒAÒð GeStÅZŠä䨴%_ˆë5p q„ÐR дvOIxÊâž[y¿o©Š¾€Wí$â76žÛÜ%¾¢À·#ÃÐ:q—_͎?Î5Ûk¾iôg³Te5íëuؗnò±q†ÏZ±&)ï6jÉRçb ‹Ìé)çU¡%ïKüsñÎ}kFL°;ÅÐû’ð@TéÆÆÙ=XÓðBlJÜlÔLéÍ}§(À9­tuÞ! -a'“D.qøI¨¹@ü“Oá\BhMWäð3Ô:ÔŸRà;ãFyÖØî“v?têwF7ðyå>6x4JÍ (ãނÐX/­ü¾Qá¥Ðäw¡: 7ù¨®œÉ(€")Td¾i8âvÈò”yášÍC€l*†C'Àȟ…šýc•%£›L×fg§ñpx6šÀ2»ûøãETF -%©9Ó;ÕD²/‡ÀŽ“nÀ´ñ˜Ò |T¡ÞéP`EA½è4–nhm€Ây“~/'Ý(éF'Y܃Ðn’n -th»–0®o~†¸N¨æ4E@jĉ<*:¤F’(Ç!iû#ƒ}g‰0¼tå Y4‹\L‰Ž@ÂœâÂ÷rPG³e Qd持ïÔ,†ªŒ®xV d«ÔØ:-NⲧçÝ1aMYâr¾N%¡ÛR›P!&q8)ëîånj6Z9~”´°Q$©øKBœž, G³*((¬Ù-ÈW¤6§‰ÍL‘܏Ú}NnîpÄÄpç,Âóq¬-«°yloÊ(촟¡ýKçApªºêó@“ÕþÅG)Ï-„v§ö¯+©õ<åXk+Ï9Ö ÇO#ªø¢òprŽ´g—m§ ˆ”<åG1aCjm·Ÿ2‡cЈ²»…çcÐx£‘!‘h˜#ù:³~…Ô,.µCRÒ&+¢&ڞ)¶ĝJ°HŒA»yŸK mry÷ƒœäåÍ+¿šü(®¬É´¥Fÿ ÃâFaGÖç-±'5&Œ-ø¾Nå}&fÆ9“®MpL ’1Tù¡%͸®Ü1…§ÆA™&’'$A²ó#ô`ß´Éø>›EÊ®`<©ÍƂ È6¢TËÐ<§œÏ"[Ë÷‚-=T·gh]×ò½àWLV·a©åÕ*瓯å{ÁK)瓯åã+P”óÉ×ò½à¥‹”óÉ×ò½ðKï/瓯壏µÇËùäkùC?£œO¾–žÍmå|üh™<ÖÀ†ð”>é:°ƒŠ1©qƒa)åŠWvòš;–FîN¼ýJócç#âÃMùë2‘¯4ß!u©˜ú¶«2ŸëT6žQ&W(›ò')”¦”å%1ëŠE|ªgxåèz€ðCùÂUjLX~šÌ°”]2cÚ tè[ë÷n;xG×ÃG0üêY>¿„6¸²=UòroL/ì%§¢ÃºÉ{#3&”dñ®’óÞ¼°7Ž©ÖmÞ¡Å÷GÎBï ,‹zÄ{ƒqÚ¦ø°÷Æõ4¾ŠYz¡2Î~¬yRey/,Î{vežÄÚ<»2OÁZ“Š åZ»gþÃ#O!]uê%EªÔ:U¤^hÎgH@󺊠—¨j€'\6Ÿ¡c (WyÈw‹ ¾‰­8QŸ ôð -½UdÞ+J7É ŽE3ïU¥X-=jîÇÌwJž†týØ}è²[Ö×¹0(Ýñ¢>Úpî 2M2ÚpP]à*£ª§Ä²%nf·Ö“®:F€”îÂQcâ"@7îGñc­õ”ýؒ<qŸJÅA›Üt1¤E೤L€^%,Áïn6»q4ü:¨OÉû™ÕÒ°ýÔ"ÙöS‹dÛO*’ý><¡H–ÔڞS$ =§Hz¼HByJ‘,,£S¾èZ˜;(YF6ŠÌU°ªò—øé…ÒpaM_¦­\-þ‰a´Ð ­›ï/’Å~žs¼mÞK•¢uåÊî–„ë ¿Oa?/]ì÷¶r´&RXÇ2XsD¯u -k—E$VÍ·Î۔¢°U¶ØO›-èK ÷­ áGŸ˜¢ÀËLÕ{UÝ\A,õª¶Ѩy¼ Wømãp֜ŠÊùӘM ~n5 -ÎX9Ÿ³r~ïµrû¡ßóó…~Ø»Š‹^¨ž^{I?•¸ƒEº§W\ô.jéŒ.éâ"Å5×ñ3QïàcíõøcºüŸÕ^OlùÔºí> ÚGŠ31ñWZ¹Û -/wP¦·›°­ž -·Ý õ$gø¢Ü O©ÑŠš¾ˆÝwwU¬ª+j ¯Ð~â†}C,ÊîoU¤Âý¤Ò]ù8£ði…}bÖÇ­>…}bV‚¸Ûî¡Â>±ª>IúþÂ>1/"í ~faŸXUÚ7Ï-ìc6¶ö¼Â>iw÷S ûÄÒS0 ý¬Â>ÅLÈçö‰Åy$¢¸öñוªê“ ¬Ü[Ø'Å}vaŸLÅÊ3 ûÔÞÑõ`a–ïÏVõá&î“ -ûÄ'ÊõÔÂ>±1á¡ï'ö‰Uõ 2ºžQØ'¶†ì¾y^aŸ(&XüÄÂ>±ª>±Š• ûî&Úm…}JD{RaŸXUß­DSQØ'VÕ÷"Qéõ@aŸ˜Nú"¬ú~¼°OLö`‡ô³ -ûĂ-”íùÔÂ>>½¢‰{gaŸØZKVî.ìÃW‰‰Ìȝ7wöI؞’¹³°#«c¾H”Ý[Ø'6¥ìæ$)}ëA‘Êž®Ê‡ŒiE½C®PÄ_و¸uõ•¢Ü¨Ïè⧤r<©‹_T¤…Ÿ¨Ê¡ŽTŠ=€1V¥œÒÍòKõÕñd¹RÏ^³ºåû‘>~ÅüåZî)õêÓuÊ–š­jLŒªVØȐÊ{ƒ°‘4™\¯•ƒo2…&Óub“Ðg&a{ -úÿÝY<ǹ™%ólTêë*›ÿ1œ&¿7ÿ£¼JýÿTÖô=ãŠð‡šÿazšLÿ?õ¥RÍÿnuBÞÙüOÜ )ìÿwc½Ôu󿗫 ÏÅúÿݑAŽ ¬=Sã!™”+S<÷¼}é9w’£µ Ö®&*Éçwp —Š5}bŽ·fwŸKPI2Óø*F±mŸtfˆêò8Ô±O!N]’¤ŽOCKöãÅOLÆksòN>žµvSÀzõUחɥă¡ºå}é·¤Z!‹à9©Vèn‚Ç9 Ð\M–•šBÌ'DRž*+Æ*ÝrJ'ŽA@wmÅ+(ÀÎå+íqhҗ$ªi^/¬öý›¯ª}ÿæÊÑ(õhsUý‘Eô>‘$rͬJ°a‡™$5ë[DMkƒ›rÁ) Å]§l·¨ë|å㞪œ…©«|”; cšOmîØ|^sǦ „â^)ÐÚݤÜK˜Q¨Ý#:E>}ô@O¸Æ€t_‡o¾}Éd#ݖ 6ŠH Å#Áb “]ïGðH Å=Îû;úþ‰f¦à­ÿî܏¨'öúVêû§RU´ï£ªK¶þ»±ôG¢ïß­&î}ÿDŽ5~ë¿Gæuå³¹­YŸšrß?ƒX¶Ú÷®¾ª¯oÏ}®/ƒ,´>…›7ÔWû’ZQӒeèÛª}Iímýåŝ)æsuŠ…˜Lé=gÜ H•óK!£ z¬ÚA¡NÏÇ«}Û²wÛÅÑéyKõýU֎ª.‚<ÍFXKuµËȚò'š¨L,ÏÌ^f?ÞXHÕA±*écM¼–J®Zn"íí£9Mµ ý¨ÈIZ÷Û@[©Øž* -©:ÈÄ’í9<ÊÛùW¶§Ä!4Úe2&5F¡û K¶–êVqBn…hÀ×ϸ~ÊÍ°›àùQÜ;ênSvéT>N(¼©L{äV­k¢=­æäąr%£Qj5›”ݧâ}QÙ@°3Tß(U2…úô=­&“ì-#ªën¹mõT¶¢éE(ŸŽGçÖFуÅ@–6à?qej/Âê3´»ÊWvùô¢ÑŸx5rÇùvä°"†æ·¦Ó:ƒñʼ°V/Y™w¼ŒìÒõ€Mعvâ³p­éDº²Õj=¹*Ä?R`ß -ïuI¬z²8œJaIÖÈ4'ÿ{²ŽM—_#wÒýÌ¥*óüùèáuÃÎUP™gÂê_Øîq‘#NI¬D6@¼K`õê^?7΁V€NW¦üQ›=¹¥±æ¬£–$VÃÜèûÁ]’@»Ö²AëñԌjÄ°4T!b¼okð–v`ð£Oôb˜R½ÙFÍ{ƒËfË6¯zu‡A¦SUéù¡¹>8a‰ÎwB ŽbIÆ͕&{9JŸYìɧ";“6ØE"J_駴]HCc,+z)e#Étåã©Ã¢mÝÔKmÂçu¬Œw€ÅËÊß!¤V N œÀ/"iTû¾ÒŠ`°„KyRݒ¸¥Tg–4Àn+“Ê}ÜA¬Š«n̓΂3TL„W[trù}£¾P!]ŽÖÓÔ KúŠž[÷MH:–Îu.߹ܓj„ö K##Ï®ZÏm×z~ÄÆ'Zæ»%Ÿb£6žyN˜¨kÓ=ÁŸ–yÆ%”°‘ÙÆ/R›©+ITë¥]ª’%‰ -Wª«GT_·¦dÕddsÀÔùÓø©(äuphâ<ÈÏZµ°gŸhIO\Z5‹¡¢J¬­`rë:çƋº½d.þgœ9/Tá¿:ÌÊ¿öÕú$%””êÚÅ:; ÒIœª -Ú°€ä,'¯ÒÝPÐæ¿Ž“—G*½& -W1pî5JtJ×ÙI_Å BUç)PW^Ò[ë±5D%EïP][ªØõçj %³†Vþ£b©jŽ8^éA“,¡}aû­ÝífƗ#šb5ÑMD{Öý(šdô.¢ÉTÆ]U1óƒÅw–$ªUñú›;JùÛSºñEäúJùƒ®G|ô“¾±$Qm="sHÚHR0nk4([»¡$QBì]Õ#Šì7”$*5RÙ7•$JôªQ @ÝZ’¨Ê<†WùSº©rI¡Qڒ®6ÅçuW³B\ -ü76+Äͨ«ÚÆç5+Tr?<©Y!w(ˏš -eÚS³BÚ¥zoc@µÍ -Y·Ýo³BÄipXÿ½Í -ñÌûÿÆf…âî8¬¹hÛQ¤WSÃQºÕ -ïvȦÁ=ÚðaUñn‡·fÛI6<¼çV«;JNî·Zq ʁRßðP¾ðå ·Z¡†‡O¸ÕJMÃCuõž7<ä$æôcè»Fe»b†Çc o,(»·á¡-øݯ`îmx(?¹Ùþž74<”ïv(ãë¼­á¡ü”(Uý “aŸÓðP¾)-Óox(¿YU]XukÃCù“O¨§ÝÝð—þtÕíPÔ¾¹§á¡|^–výXÃC¥$Ïhx(ßí=omxxcŸÂ{ò¡»^;ˆïlx(®F£yNÃCùx -Óox([Cåª?«ZMºÛ!n<ÔðP>΃tg4<”Oñ–ôÜÞÚðPª E›{ÊCy‘ìSøxÉÖíð±R’¦¤….ˆ6«KíUÑðP>‡ö…½_€Ý÷5<”¿y„3<lxÈ~‰Vl¿àEKêK ®ªiÏhx(ßíðqUnxø„rl5 ՘¸OhxÈ@·¸¯Žµ[*¶(”6w4<”+ôø>жçã E™Œívø˜Lk«U~ð¸çC å•,û᱆‡ÁÅJƒoõJ6<¼½÷®†‡¢PXQ,_±rCÃÃû3ºDÞ[ªÿBWH>Ü𐷯ºRhžÐ𐩪ïvHË´ÇÊ'QQÊíÊ[÷ ўVx%Þíð_'Ÿh†‡÷۞75<”’‡T·Ãg¥(¦ä»¾®Ö¿»á¡|·CZåx¼á¡|‘®ø!}GÃCùn‡Jzšú"]Ùn‡¸ò¡†‡÷h6w4<”\M⇾å )4jÞ¾-z ôi ƒüÆùKXBÑCÀ}v-ßՎÈdþDæÏ$²¥ ¯ÙÝo™ÈÕ6¢\xåÍbIT×ó¢^qˆFá·E4O? ¢Eœ×Dk¹m[ËHô¬Mџh«Ä`ÐYÃOי¹:bT1֎ÇcÆq<}ïBÇ ¹m4ÇËÐo<|z¨'|žaµ©Áö;ËWóïE¼Õï-5fý[çãÕZ'ß>ê¹¢þgõ¦ÕïFÝzúVpôÕÉ_'63E‰š‹uï~¡eA%p&‘m4ވ×ù |ý±'ôÚ ’×Ó ¸–5¶d׍5Ȥ;,“z!bA¢åjA7 Èå@ŒÂÓñøn³pÓ½š«ÛÔ±„]†8‘M–’Dv1-¹êûæ¤x'°˜VC#Œ2–ˆÿý‹pd‡šªB²FdZ¾!êH8ªs«@ ão#^+ÑqÃyi±Éq§§ Põ¿z)üîÖ؆,Núߪæ5íÏÂO¥¦MRµÀ–µ»Ì¾W֘:0×ñÁO³vö%¹Ó…è+iN‘!€&õ;vpjÃx¨¬9¢Êfœ?øTߓÖå2 ->µÈü'+­ýÜõ؜ Âhw ?¡„4ҟþæfð‹¼‰jhº0,Ô¾É[èo‚FüÓFÿYvÓ0€<8g¦«C€px -Db³+Ÿ¥v»Oä'…Nvhú*‘Vb;bÆY2[ÒÖ·K֘/HkêmаϬø³&9cØñ˃0ZÆãiŸ¤ “ šÀ¢éLÄÌh ¢ïÐÚäâöý™ÃÌûY÷eكïÊJwräªt[\¯Á7Î;Õö•œ ÞÆÌkÔÊʴɞ„¤ªÙX^z"Æuš½EN½)'ü“@ iä4_EÒp§½/’^¹nÖâ¨ÔW.ð´aEO&op†­a§Ð¦W?á\×ß2րi­W\ì±å§ÈȺV}Y¹Üppð ў’À†H:t§°¥:z£M÷{Âןi] é4õêzi»_NvEF®×px„xÉiºÌVÌÔÛ¿8Óùˆ~g§¨”îHÄ Îô´êAŸà!^7ôח¯:ǜÓxHr.áú¶=Œa/Aöì¨Ù–s¸Ê?úíðòI™:?ÌpzN4€†Ñ(4ûcŸ¹-™V'g3Áf3jkRpŸ‡\±Æù3¹¶/͉é¢œ.4uΌ$˜>¤)ÖM¢Çõ4Îg’t½] -sk߁&âÒ;›nJèC_úSzü˾ç¢ßkm‚á4‰jªÑϦ×Úiâ³ñmÈLlñ6ÐÊatƒ?½GÎ{/%€”e*Ó{µuàYӝÅQï[ê’îe睴nvɤúE]>sü -=ëIl—9ö[¥làµ9OLk£r¦<´À±ž,Ãý2w¬CQ`àR=Å =h°”Xk‹H`Xh†¢ÐÜYUŸàS»†ßàO҈KàŸÈüé3#\”µVwÓ2h<02nCòP~ö€&Ö:Rû|þá SJ§_¢–ébÿ¦wó“&­†˜:S2áb2p¶Àï,øwe ”L%JˆCIêHÃ;HÒ¬“¤¯Õ:¹Ön³¤íµðƒ ›wZKJÍʕµvgÚöeA‚._²…Ì|ÇwH¦" Äé灧žI .î;AáÏ{Ëìæy§n² Åªí6ú>qltí~Ù Hë~³ÄœNiYù ´Õ¤¡Eºõ+ù…þÔå­NãrSv%Â.'1Ÿ¸½â%¬H!¸ò#qÄ¿HÿŒ8þ®‹˜œ˜k=ÎBß½¹ßÓ5bö¶Mƒ—\A±:ã `¾­v>ŒŸhshÎ0*â©É»ƒƒÒØtà;ÿ…ꈮï9‹˜f‡n†È„«¤@9OµkŒ¼>ëIî:u§âÀîïNöÜgÍ[à';û}÷ ø°‡µXæl‘íç?…œö±yÓêÛÇ9 ù½ÄZó8§µ¶sZww“ ¾09rœ&Ã(=¹‰ü¨¦¦4§­.­Hwˆí[šhbЅ1¹M -¢cMc~|lEº?'_1DSÏZÝÕüýÂëˆín/Nä¨Û Ð;¨~"흃àtèžN§´Q§o†ÆÐúáÝ7™H ø!-GŒÉüðÈ ¨şYk²:=,:'Û³¢Ø“=—&‡ ®CßµÙ' þçT§åý©×!C‚vB)]XÒÎ<Ñ¿Ìnu8ëh¬‡}Yc­tª”vˆü”ŒÙہF©GàªeM  tZÈtÁ56¿­®±¶úYþŌ\ÇyÝþe=ÂÆö-Ø©àò$Pa Jë„F!éدœÅwÒô iڒæ|ÃÐ;Ó'ì´;ƒöFØ(3jž0F~KÔk*úk.›¨¥¾g ŠäÇhd’ŽYêtÌ8ë‘úSÀKŽO:)¿“Ž(v?á *6ÒÚÜPWë[{X–·†»’qF·-—«é9 ×€Áî°..E8Cè¶Kv-ܕsÞÙX¿µEèe=ŒÁåÖÐ̆3î½÷M=uçkÚwÒèO'4^Ïx ß@Ç r°3¼ÑtEüš$ëÃûd¬pL.ÎCÀEÎðr32™øn³$䐫ǜœ¥[¸’~—?8ëź,[´ùž[²`!?ÎK°ðHŸIVàPmäd¿Œ°)Iðº”ÎIˆpŽv9g²çÊsXCÉÏV…qw žòÝ LùJØ[|F]‰cæl孀~]Žßɦý>$r‰Pi ï:_Ìñk-ç`’±97]ú0Qã̼3)#Â!ô7Ã"çáƒþJ’rÚbå(òêSSâÿÌ÷gÈGÙÀ´Öi²âd>+‚}…Û“Ì•Ë —Þ•/òÇ;Dx›ÑÀsZ5Ðñ„ýåƒàOÿôõ†Á*ÙQ"C÷Jnd‡zgÚ6³ãǚÇՅõŽßê6Șĕ-iYœ™¶±ßèJ˜ .èV2ºbÍr™NNÊå(ÿg&ä ÞÝpŠ a”ngVÚâÿÀ›€(–=»ÈYæz›nlÎQ»VqüæR@ä§Y(QÔ³ö@ÿ”äôÍì…À¿Q™"99¼Â‚ˆ(« ¢ø·µfèD¿žr:ê½Ît\w%ÁäéœÝ ‚€‡ªG«b÷M4²ÇJŠà]¢ą€š ‚ÁmÄ_à•Á…Ý{FÎ} –Ûaá3¨-8ʇfxúUMWák:̼—zÀx,#]÷ÿ„ðþ'„÷?!¼ÿ áýÿ0„%“‡§f: §32²Ê–þYunf×Æ©£˜ =Ü·ïqÅڙ1"”ZvZ¯‡¾tpî[iŒ$©uЁ%OÄÊE(·¬•’ž”¦KuØX˜‰ÎÝódâùÛ@°áJ“Š Û3 휜ßͨÆL1Ѹ}G+\ÑÑâK·}Š`ÂjU’J3PÄÍEÌ$Ð„~·àaµʞw:H—Ûá øþñµò©Ñ*1t=-÷‰§ÏÀ¸™É©:ýº/àòüCÿ8>/ëù±zü]þnÿY_þœAŽD$›ÛÙ.{œÏóÿ}N聯Í|{þüçHÔS…‚ß“žOw³ù?ªq‚gäc¢ž ­µ»¤l%ĈÉô"[åuŸ‘qzAt£ehæÔÌa_˜óͺ/Õ™­kŒù“þÙ¥¬LJ ¤êQ» ;f]z~L^2–J¹-؃(L5r€&ÓNÎ?ãŽÓ2ìÈ'z¥t/ÛªÇgbÇD¬0ƒE!ïG2éÎæ5íwh¬¦xœ20-5í;œá;|ÓØ®4\ó*ò~$5jmž¥4Hj pK¨QÆç³a|&î>‡hĂ=¿¦"̃´^¹g@oƘg£-ÌÁ.{[£ †é ê\ʊ@4膚í@N›@ø¶PÁëþéú“Ûe,ð!Êße‘p03–wz#ý~”²é,û)uÖñQu@hE9¸àÏ&‚k¦ÈññåbU 4t()`°ƒsº[æ4œÏÀïA¢¥㰞5yÿ°¼IÜ¢e¥"#™,Ür€É›¤AŠÁ5’e@2Ï 7ÌéÂ,¢¹v4ç¯i=Ô1ÚÄØÍÎ~Œ3Ù¤Šò ¬€®¾-ø³é ¹Ò!€]T0O@£«ÉÀ œ`½&cT•Hÿ1s#ôú®>HÊäv˜#rõE0ŸÏM8£<˜¹°kgC© -•Ã=›ÕƋ³ói‘úñf«Éµ_çDŽ#% ¥L§‰0ÿPE‚œËåܱãûfJ³Ìy@92nŸÆ$óiÆ©eSú(;ÿ¹¯†ã9·²fS4äkÙ´•ì¨ò@ç@ãÒO>¢˜³@M«ï¥Õ¢¡SÈ䥌ËAi¿: Ìý,dx t4ÖÖ $d»£1½÷Œ´½? €ÍÁkhL¿ë¨Æ¶­}CÁk©B/Z¤K‰=°yF´ñ^Ø;d€ü¤ß ÐëÂÔ7¤—ª*Ã3«‡(g$íz‚¢ê0˜èìîìÈOå4Ä5}´ôHt¦ìVÔhÌÙ¿„ ŽßÎÙN©‚¿Ö ™æ@¦eŠb• À.z/ X%±ÐiHŒœ¥eZŸÞ -)«-쑀¥t˜þi²¢r|¬«n–V͘ ¬1.Á‡ªàñSú3™kᙵ¬B-ÅJ+-K7$Ú»Nôy3‰FÀ£$)&¿sM'Z 6­›»x‡5噃þmÍÈ™ÀyJ¹ -¹“±ÖkfàaSb¨tÌ#G¹„mxFËÔ_dÅh4g#Þ9}\¥Ä¸Í9»;Ÿ`2D";³ ã€Jà±U¸Ô§1Ðuñ²w¼:Í[ò5ÍÀ˜ê¯2€’ ™íäHäw` 1ZŽGººã7ÚÌ ²[±;ó]ëÀ|×=Bw”…³nãq¤ç<þ‚èœZ§?gpJtºÝHÅo›ÇLâ içFaâ ºÇáþÄ“XŠ™(æŒ0t ÕdÈdzÐÕÞâ.Œ(Ÿ‰¦ƒÛÁÑg…¹¾P)”Øm,¸Ú2t0¿ñé`{0‹*r~4x ~œÌ¢‚†£‰!$Ê{c(dNIRی º -uLyƒÔZÔ‚Î×»†4Z›HÊn㶓çzãDP¹âŠÈnOkàl~„µ¡CÑ"ÀM-1 ãÑv{bÚ ~a²âE'¢’š0u–DNÚ\>ia»KÑùzìÕ\ò`¢_…íÐØWaèèꆮÇ8 ¨-ÆÇ8­ì¶s¤9MÆ N<Ìi†ãcœFlMRœ¦FÙbUäš…€Ó>û#+‚ò¸Å@NS #WÖ*ï[q/tÔU BñA ìâԄƒ ¢ÚŠ+TOŽ/7Ü[¨ðÊS“:oä&’·eoÛ#Wƒð–QÌä‘=’}:qŒ:HüÎ»Ïöfƒ1¼=v$L– {HˎCf{Ršµƒ`¤€pÓWŸí!¶˜Ú"vŽš¸èT3 ãN¢›]r"¢s+Äð?óÕ8þg­™ c˜9Çm‚Y¿M3u§c–a'}çÊ©~‘J ¤|ž8㧂.8@~´Éˆê0 m2`ÌÎʖó§±Q–0¬×v:œ€üüÀ@ M¹w»œI~±¸4m¡­`¦(‡6€=+eœ';_GI`~–u°&>gƒyô ?¬ÏUXdÆ…•6Sö €Ûš}jÉ>#±@?€^Úw<ð -„í„-žÁ£®@²QWh€› Ê4 ’¨Ð,p¼“´qû„Öpà`ÇAâÖhs0~¶\¬•¦¼ ¹¯æ Ã¡±퇮Ñp!¸.̑™ߨ¨›Éæ†<ÚÀhã4Åâ!¡4Êý€EÓ®.,`NS>¾9:÷†_Xu ²VŽp Ïùãužë÷üËDýòú›éÍ> /5häì_qÚÕѸX_§›ïëLÇ|,Ë´mt´–‚"©í`6̧šô¡Û&ÇUÅ#`Ü¢íb?¹)™ÐÆ þìQfŠˆNÑê÷ÌÏ{û ã9çÈ9`ƒ‹=þ ½ze¼˜f6=/ë ¾-ŒÍý#Œ9÷± šKoªBºöÁ?ݶ‘â´>‰þ€Ÿœø«•¥~牪ײ£V7•¶øMÙl¦Òbbç‡˜O‚^È¥vÖýÑ£÷>µÞÄ;]‰H¦ÝàM¼Ó•øò·yït%âÙ j¼‰wº©luÞÄ …¤ðf¶3<Ø ¾~_Õçç˽â&çËßmyü_spܐÿ¨ÿàð¿N ¨Âÿÿ<ðËòäå?Œ…énkúW†wZ ‰ã9ý;=ÿî¶ããý ¢ï:•r³þüG¿úgƒ!†à]ð½ X‡pˆÃ—ÿ þ%à?ÿ¤C´p´ ñÏ#µ0b ßGŽ7óÂv6ÿßôõóîø_ìÎøÛÄöü;^ÿŽO¿Û%ú•';jÂ`ÿÿ*‚Oà»ÿüGÿ*ÿ¾úÄ¿Ù xø ‚ÿÎ^þÃûÏhú×iC‚%öðë*õŒ¡ù¯3~ùwÀõÏæñþSËæòSŸËÔg— ~‚opŸ˜ç …¤€ö„Ýïvy\î„Ýë÷x½n -¿púÜ0#»Ëéqƒ…³œ¤Ç@#ry|ÿln¿ŽÈíñRŸËôg§Ûî÷‘$ü½Gºüv/IøÙ/è—%‡‡­{òw9<þ.ÎÃén}Ù(ð=!0V?é÷»=hA°)PcwÁ1yI»¼'àôÁA»H»×G º¡/èA¢·ñÏì/UΠ¾¯×·ÏáŽE!0‹‚­ ³$ž³ýíqÛ=./É~áòD^üq:v'÷ç +Vž/ÎÏñùGÍ4ËIZxY‚D‡ ž¹oãå¼qÿ®¡,YžÆÿkþo¼ÝîÎãó|ý[ç'°gçÿN?»ÿ„ßÀ±?’© -LÅÿŒÈŸÈ -endstream endobj 7 0 obj [6 0 R] endobj 24 0 obj <> endobj xref -0 25 -0000000000 65535 f -0000000016 00000 n -0000000144 00000 n -0000044463 00000 n -0000000000 00000 f -0000046571 00000 n -0000046388 00000 n -0000168557 00000 n -0000044514 00000 n -0000044880 00000 n -0000055560 00000 n -0000055447 00000 n -0000045262 00000 n -0000045826 00000 n -0000045874 00000 n -0000046455 00000 n -0000046486 00000 n -0000046828 00000 n -0000047096 00000 n -0000055634 00000 n -0000055830 00000 n -0000056898 00000 n -0000062550 00000 n -0000128139 00000 n -0000168580 00000 n -trailer -<]>> -startxref -168773 -%%EOF diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png deleted file mode 100644 index bc25641a..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg b/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg deleted file mode 100644 index aa301583..00000000 --- a/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png deleted file mode 100644 index a5a40d10..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png deleted file mode 100644 index 955beb71..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png deleted file mode 100644 index e2e6a010..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png deleted file mode 100644 index dcd898c8..00000000 Binary files a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png and /dev/null differ diff --git a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai b/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai deleted file mode 100644 index 321e40ee..00000000 --- a/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai +++ /dev/null @@ -1,1350 +0,0 @@ -%PDF-1.5 %âãÏÓ -1 0 obj <>/OCGs[6 0 R 26 0 R 45 0 R 64 0 R 83 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream - - - - - application/pdf - - - icon_blue-orange - - - - - Adobe Illustrator CS6 (Windows) - 2019-07-16T17:02:54+02:00 - 2019-07-16T18:26+02:00 - 2019-07-16T18:26+02:00 - - - - 256 - 68 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9IeUfNmk+adEh1bTXrHJ 8MsLEc4pB9qNwOhH4jfMvW6KemyGE/7R3tODPHLHiinOYjc7FXYqkWt+cdJ0nWNK0aVvU1LV5RHB boRyVN6yv4L8NB4n6aZmn0M8uOeQfRAbn9DRk1EYSEf4pJ7mG3uxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KpDeee/KNnqJ0+51OKO6U8XWjFVbwaQAopHerZg5O0tPCfBKY4vx15Oyxd j6rJj8SMCY/jkOZ+SfKwYBlNQdwR0IzOdaQ7FXYq7FXYq7FXYq+Pvy5/MDUfJmtrdw8ptPnomoWd dpI6/aWuwdf2T9HQ56n2p2bDV4+E7SH0nu/Y8hpNVLDKxy6h9a6NrGnazpdvqenTCeyuk5xSL4dC COxU7EdjnmOfBPFMwmKkHrMeQTiJR5FGZUzY55987af5P8vyapdqZZWPpWdsNjLMwJVa9gACWPh7 7Zn9m6CWqyiEdh1PcHG1WpGGHEXzn5H1/VNf/NzSNV1OYzXdzeBmPRVHE8UQdlUbAZ3naGmhh0M4 QFREXndNllk1EZS5kvq/PNHq3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXzxqf5f eb7fV5LMafPdlnPC6jQtE4J2YyfZWvfkds4DN2XqI5DHhMvPp831PT9taWWIT44x25E7jyrn8nu3 lzT7jTtBsLC4f1J7aBI5GBqOSrQgHwHQZ2+kxHHijE8wHzfXZ45c85xFCUiUxzIcR2KuxV2KuxV2 KvhPPZnhXoP5SfmfceUNT+qXrNJoF44+sx7kwudvWQe37QHUe4GaLtrsgaqHFH+9jy8/L9TsNBrT hlR+g/i30xqnmPSdO0Q6zNOr2JRZIXjIb1eYqgjp15ds8x1eYaeJOTbh+/uey0WlnqZiGPcy+7ve D/ml5jvfMPkCLUbui1110giHSOIWgKoD3pU1Pjm6/wCB9q5Z55Zy868h6Wr210MNKceOP80We83L dhX5T/8AkxtA/wCYof8AETne9s/4pk/qvG6H++j731X5n8zaT5a0afV9Uk9O2hoAq7u7n7KINqs3 +e2ebaTST1GQY4Dc/i3qs2aOOPFLk+b/ADb+evnXWriRdPuDo+nmojgtiBLxIpV5qc+W/wCzxH68 77RezunxAcY45efL5frt5zP2nlmdjwjy/Wx/T/zO/MGwm9aHzBeu23w3EzXCbf5E3qL+GZ2TsnSz FHHH4Cvupx4a3NE2JH7/AL3uH5V/nXB5muE0bW0S01lh/o80e0NxQbihJ4Sd6dD28M4/tjsA6ceJ j9WPr3j9ju9D2iMh4ZbS+96qzBQWY0UbknoBnNO1fPf5jfn9qk19Np3lKUW1jESj6lxDSzEbExcg QieBpyPXbO57L9m4CInnFyP8PQe/vLz+r7UkTw49h3vOofzI8/w3IuE8w6gZASeL3Ekib/8AFblk /DN7LsrSkV4cPkPv5uuGsyg3xS+bLrv/AJyD86z6BBaxSra6xDMDJqEcULLNDxI4vHIrqrcqGqjf 276yHs1pxlMiLxkfTZ2PvH6XLl2rlMK5S73oH5Eee/NXmmbWl12++uC0W3NuPShi4mQycv7pErXg OuaP2i7OwaYQ8KPDxXe5Pd3l2HZmqyZeLjN1TEvzQ/Nfz/onnvVdL0vVPq9hbNEIYfQtn4hoEc/E 8bMfiY9Tmz7I7G0ubTQnOFyN9Zd583E1uuywymMTsPIdzHPOX5zecNbvVTT9Rn06whCpEtqxgkkY ABpJHj4t8bb8eg8Mz9D2FgwxucRKR7968hbjajtHJM7EgeT6G07Uj5Z8hWt/5mvHeaztEk1C4lPK RpWFSn+U3JuC+OcNlxfmNSY4Y7Sl6R5fjd6GE/DxAzPIbvn/AM4fnp5y1q6lXTbltH02pEMNueMx XpV5h8XL/VoP152+h9ntPhiOMcc/Pl8B+t0Go7TyTPpPDFJNI/Nb8wtLuBPDrl1cbgtFdyNcowHa kxelf8mmZmfsbS5BRxxHuHD9zRj12aJviPx3ZH5g/P8A87XtzBNpFz+i4vQRbm2EUEyeuC3N0aWN 34sKbE7ficDTezengCMg4zexsjb4FycvauUkGJ4dvJ7V+UnmLVte8i2mq6xcfWLyR5xLOVSMcUkZ R8MaoooB4ZyHbemx4NRKEBwxAH3ebuuz8ssmIGW5YB5v/NPW9RvpYdJuHsdNQlYjF8MsgG3Nn+0K 9gtM811/bWXJIjGeGHlzPxfUuzPZ3DigDlHHk8+Q8q/Wk2mfmD5w0+cSpqc1wK1aK6Zp0YeHxkkf 7EjMPD2pqMZsTJ9+/wB7n6jsTSZRRhGPnH0/c908p6+2vaFb6k1u1s8tQ0bVoSpoWQnqp7HO20Oq 8fEJ1VvnPaWi/LZjjvir8b+byLXfzK87WuuajbQajwgguZook9GA0RJCqipjJ6DvnKantfUxyyiJ bCR6R7/c9xo+wdHPDCUobmMSfVLu971jWtSvbbybc6jDJwvI7L1kl4qaSenyrxIK9fbOp1GaUdOZ g+rhv7HidLghPVxxkegzqvK3kukfm15rg1CKXUrw3dknIy26xQIX+E8RyVAR8VN85XB25nEwZy4o 91D9T2+p9m9NLGRjjwz77ka+3uS7WPzG83anO0h1CS0irVILVjCqjfaqkMevc5j5+1tRkN8RiO4b OXpewtLhjXAJHvlv9+yY+U/zR17TL2KPU7l7/TWIWYTEvKgJ+2rn4iR4GuZGh7Zy45ATPFDz5uJ2 l7PYc0CccRDJ0rYHyI5I7zj+bWq3d3Ja6FL9UsIyVFyoHqy0/aqa8F8Kb+Phl2v7cnKRjiPDHv6n 9Tj9l+zWKERLOOKZ6dB+s/Yxix89+b7OcTR6tcyEdUnkaZD/ALGQsM1uPtLUQNicvib+93GbsfS5 BRxxHuFfc9s8i+bU8zaN9aZBFeQt6V3EteIalQy134sM7Ps3XDU4+LlIc3zztjsw6TLwg3E7g/ju fIehqr63p6OAytcwhlO4IMgqCM9w1BrHL+qfufNMX1D3vRvzn/Kl/Ld42t6PEToNy/7yJQT9VkY/ ZNBtGx+ye3Twroewu2fHj4eQ/vB/sh+vv+bse0dD4Z4o/Sfsa8uX15cflE0E8rSRWmtrHbIxqERr V3Kr7cmJzhf+CXjjEwIG8qv/AGT2/wDwO5E5Zg9In74qHmv/AMlTa/8Abdf/AKg1yf8AwMv8p8f9 6x/4Iv8AfQ/qj75pB+U//kxtA/5ih/xE56P2z/imT+q8Bof76PvZn/zkjr9xc+Z7PRFci1sLcTMn YzTE1JHsgWnzOar2W0wjhlk/ika+A/a5va+UmYj0AZH+Qn5c6O2hp5p1O2S7u7p3FikqhkijjYoX Cnbmzqd+w6Zge0famTxPBgeGI511J/Q5HZekjw+JIWTyesa/5c0TX7B7HV7SO7gcEDmByQn9qN/t I3upzmdNqsmCXFjJifxzdtlwxyCpC3yF5o0a68pecLzToZmE2mXIa1uOj0FJIZNujcSpz1HR546n BGZG0xuPsIeRz4ziyGI/hL6D8/ecp5vyWOtwfurnVrW3jPE/Ya5KrMAR7cwM4fs3QgdoeGdxCR+z l+h3+q1BOm4hzkB9rxD8p/Jtv5s84Qafd1+oQRtdXiqaFo4yq8Kjpyd1B9s6/tnXHTYDOP1E0Pe6 TQ6cZclHlzL6wsdJ0uwshY2VpDb2YHH6vGiqhBFDVQKGo61zzTJmnOXFIky73q444xFAUHgv/OQP 5faTpAtPMWkwLaRXcxt723jAWP1WUukiqNlqEblTbO09mu0p5bxTPEYiwfLudF2rpYwqcRV80X/z jB/vR5j/ANS0/XNlXtdyx/53+9Zdi85fD9LBPzr/APJn65/rwf8AUNHm67A/xOHx/wB0XB7R/v5f D7g9w/I/y1p1j+XtncGBGudVDz3bsoJdeZWNTUfZCKNvGucf7Qauc9URe0Nh+n7Xd9m4RHCDW8mJ /wDOTOuXCW+j6JGxWGYyXdwAftFKJGD7DkxzZ+yenBM8h5igP0/ocTtnIajH4pP/AM4//l9petS3 fmHVoFureykFvZ20g5RmbiHd3U7NwVloDtvXsMyvaXtOeIDFA0ZCyetNPZWkjO5y3Ae/X2kaVf2J sL2zhuLKgX6tIitGABQUUigoOlM4nHnnCXFEkS73fyxxkKIsPk381PJsPlLzhcabakmwmRbqyDGr CKQkcST14urLXwGemdj646nAJy+obH3h5TXacYshiOXMPdfyOg9f8qrWCvH1Wu05eHKVxXOJ9po8 WqmO+I+56HsefDijLuP6Xl6LeeXPMSi7tlkudOnBe3lFUbgajr2I3B+nPHQJafN6hvA8i+1Ew1WD 0yqM48xz/He9Ttde/L7z01vDqUAttTR1ZI5SEZyD/drMtOat04mh8BnTw1Ok1tCYqfn919XjMmj1 3ZwJxnixkdOnnw9D5vQ4444o1jjUJGgCoigBQoFAAB0AzfgACg8tKRJs83zP5n/5SXVv+Y24/wCT rZ5xrP76f9aX3vr3Z/8Ai+P+pH7g918xf+S8vP8AtnH/AJNDO31f+KS/qfofN9D/AI/H/hn6XhPl zShq2vWOnMxVLmZUkYdQlatT34g5xGkw+LljDvL6RrtR4GGeT+aH0fbaPpVtp406G0iWx48Tb8AU YUp8QP2iabk56FDTwjDgAHD3Pk+TVZZ5PEMjx9751826XDpXmXUbCAEQQTERKd6I3xKPoBzz/XYR izSgOQL6r2ZqDm08Jy5kb+969+VXlnT7Dy7bamYlfUb1TI07AFlQkhUQ9hx3PjnWdi6OEMInXrl1 eF9o+0J5M8sd+iG1efeUi/O3RrOOGx1WKJY7h5GgndQBzBXkpanUjid8wfaLTxAjkA3ui7L2T1Uy Z4ibiBY8lL8i5H9fWIq/AVganuDIP45H2bO8x7v0s/a+IrGf636Hz5oH/Hd07/mKh/5OLn0Tqf7u X9U/c+JYvrHvfa99ZWl9ZzWd5Cs9rcIY5oXFVZWFCCM8jx5JQkJRNEPaSiJCjyeLeafIi+TfJ93Y wS+tY3WtJc2RJq6xtauvB9uqlTv3GYXtr2j+aw45EVIEA+/1O+9iNL4OpmByMTXziw3zX/5Km1/7 br/9Qa5tf+Bl/lPj/vXD/wCCL/fQ/qj75pB+U/8A5MbQP+Yof8ROej9s/wCKZP6rwGh/vo+9kf8A zkRps1t5++tstIr61ieN+xMdY2H0cRmB7MZRLS8PWMj+tye1oEZb7w9U/ILzDZ6j5Dt9ORx9c0l3 huIv2uLyNJG9PAhqfMHOb9pNNLHqTP8AhnuPlRdp2XlEsQHWL0h3REZ3YKigszMaAAbkknNCBewd k+OvzM12217z3rGqWrc7aaYJBIOjJCiwqw9mEdc9U7J05w6aEJcwPvN/peP1mUZMspDk9q85eWb+ L8grewKH63p9ra3M8XccCHlH+wDN92cjodXE9pmX8MpSA/R83dajCRpAOoAeVfkv5rsfLfneG41C QQ2V7C9lPO32YxIyurMey841qew3zpe3tHLUaYiO8oniA7/wC6rs7OMeWzyOz6wR1dQ6EMjAFWBq CD0IOeaEU9W8N/5yR82afLaWPlm2lWW7jnF3eBCD6YVGREan7TeoTT2987H2W0UxKWYio1Q8+/7n R9r5wQIDndlQ/wCcYP8AejzH/qWn65sl7Xcsf+d/vWPYvOXw/SwT86//ACZ+uf68H/UNHm67A/xO Hx/3RcHtH+/l8PuD6K/Kn/yXWgf8wi/rOcJ2z/jeT+s9Dof7mPueW/8AOTmnzC+0PUQKwvFNbs3g yMrgH5hjT5Z0fsllHDOHWwXWdswNxKZf841eYbNtJ1Ly+8gW8jnN7Ch2LxyIkb8fHg0Yr/rZj+1e mlxxyj6a4fjz+2/sbOx8o4TDrdva85F3T5Y/PnX7LWPP0gs3EsWnW8dk8imqmRHeR6H/ACWkK/MZ 6R7OaaWLSji2MjxfcP0PLdqZRPLt0FPZPyE/8lnp/wDxluf+TzZyntH/AI5L3R+53PZf9wPj97I/ M3lDy95lDQ3igXsAAFxCQJow1SobrVT2DD5Zyes0OHUbS+odRzD0mg7Tz6TeH0HoeR/Hk8Y86+Rd Q8r3ERklW4s7gkW9wo4mq9Vdd+J+nOP7Q7NnpiLNxPIvf9ldsQ1kTQ4Zx5j9T1L8qPMN5q/lxo7x zLcWMno+sxqzx8QyFj3I3GdN2JqpZcNS3MTTxntJooYNRcBUZi68+rxrzP8A8pLq3/Mbcf8AJ1s5 DWf30/60vve/7P8A8Xx/1I/cHuvmL/yXl5/2zj/yaGdvq/8AFJf1P0Pm+h/x+P8Awz9Lx38tv+U3 0r/jI/8AyabOR7I/xmHv/QXvO3v8Tye4feH0Pnfvlj54/Mn/AJTfVf8AjIn/ACaXOA7X/wAZn7/0 B9T7B/xPH7j95e2eSP8AlENH/wCYSL/iIzsuzv8AF4f1Q+e9r/41k/rli353f8o1Zf8AMav/ACak zWe0X9zH+t+gu59kv8Yl/U/SEn/Iz/evV/8AjHD/AMSfMT2b+qfuH6XP9r/px++X6Hz9oH/Hd07/ AJiof+Ti59Fan+7l/VP3PiGL6x7327nkD2zz787f+UVtP+Y6P/kzLmh9ov7gf1x90nqPZP8AxmX/ AAs/7qLx/wA1/wDkqbX/ALbr/wDUGudT/wADL/KfH/eun/4Iv99D+qPvmkH5T/8AkxtA/wCYof8A ETno/bP+KZP6rwGh/vo+99Ifmd+X1r500H6sGWHU7UmTT7luisR8SNTfg9N/DY9s4LsntM6TLfOB +ofjqHo9bpBmhX8Q5PmKaHzj5G1whvrGkanFVRIpKh1rvxYfBIh+kZ6HGWn1mPpOB/HwLzJGTBLr GSK1380fPuu2TWWp6xLLaOKSQxpFArg9n9FI+Q9jlen7I02GXFCAEvifvJZ5dblmKlLZm35Q/k3q Woajb675htntdLtmWW3tJlKyXDqarVG3EQ67/a7bb5qO2+3YQgcWI3M7Ejp+37nN0HZ8pSE5ioj7 f2PouaKKaJ4ZVDxSKUkRhUMrChBHuM4OMiDY5vQkXs+ZPzJ/JPXNCvZr7Q7aTUNDcl1WIGSa3B3K OgqzKvZx260z0Lsrt/HmiI5CI5PPkfx3fJ5rWdnSgbgLj9zCLHX/ADhaIdJsdR1C3Tk0ZsIJp0HL oy+krDfahFM3GTTYJeuUYHzIH3uDHLkHpBl7t0VrfkfzLpGhwa5rMDWi30/pQQT1Fw/wl2kZDuo2 p8W/tlen7Qw5chx4zxcI3I5e5nk004REpbWfi9R/5xgVvW8xtT4QtmK+9Zs5z2uO2P8Azv8Aeu07 F/i+H6WB/nX/AOTP1z/Xg/6ho83XYH+Jw+P+6Lgdo/38vh9wfRX5U/8AkutA/wCYRf1nOE7Z/wAb yf1nodD/AHMfcifPvk2y83eXJ9JuCI5T+9s7ilTFOoPFvluQ3scr7O10tLlExy6jvDPVacZYGJfK WsaF5p8ma4sd2k2nX8DFrW6jLKHC7epDKKch8vkc9KwajDq8dxqUTzH6CHlcmLJhlvsU0uvzZ/Mv U7QabJrM8kctIwkMcUcr1HEL6kSLI3Kv82+Y0OxtHjlxiA+N18iabJa7PIcPEUh1/wAuavoFxBa6 rAba6ngW5EDfbVHLBQ4/Zb4a07d98zdNqseYGUDYBq2jLhljNS2L6Q/JH63/AMqotvqXD63yuvq/ qV4c/VfjypvSueee0/F+anw/Vwivk9T2NweHHjvhveudW83vtQ826P5guLq6muLPWGYmeQkgtX/h WTw/Z8M8hyZc+LKZSJjk6/ju+x9lw4dLnwCMRGWLp+OYP2qWr+YvMfmOeBNQuHvZU+G3iVFXdv5U jVQSflXI59Xm1BHGeI9P7Az02h0+lBOMCA6m/wBJe0/ln5YudB8vcLxeF7dyGeaPugICqh9wBU/P Ox7H0csGGpfVI2+f9v8AaEdTnuH0RFDz7y8S8z/8pLq3/Mbcf8nWzjNZ/fT/AK0vvfQ+z/8AF8f9 SP3B7r5i/wDJeXn/AGzj/wAmhnb6v/FJf1P0Pm+h/wAfj/wz9Lx38tv+U30r/jI//Jps5Hsj/GYe /wDQXvO3v8Tye4feH0Pnfvlj54/Mn/lN9V/4yJ/yaXOA7X/xmfv/AEB9T7B/xPH7j95e2eSP+UQ0 f/mEi/4iM7Ls7/F4f1Q+e9r/AONZP65Yt+d3/KNWX/Mav/JqTNZ7Rf3Mf636C7n2S/xiX9T9ISf8 jP8AevV/+McP/EnzE9m/qn7h+lz/AGv+nH75foenLoWiKwZdPtlZTUEQxggj6M7E6jJ/Ol8y8H4U e4I7KWanPb29wgSeJJUBqFdQwr0rQ5GUBLYi2UJyibiaUX0rS3iEL2cDQhuYjMaFeVKcqUpWmTxH w/o9Pu2RkJn9Xq9+62LRtHhkWWGxt45UNUdIkVgfYgZZLPkIoyPzaxjiOQCMypmoXun2F/Abe+to rqBq8op0WRDUUNVYEdDk8eWUDcSQfLZjKAkKItBWHlTytp83r2Gj2NpN/v2C2hibbcfEig5dk1ma YqU5SHnIlhHBjibEQPgmmYzak3m+78w2Xl28vPL0EV1qluvqRW06u6yKpq6gI0bcuNeO/XbMvQwx TyiOUkQPUdPvadRKcYEw3k8Ls/8AnJbzcl3Gb7TLCW2Vv30UKzRSEeCu0soU/NTnYz9lMBj6ZTB8 6I+4fe6OPbGS9wK+LME/5yW8mmCr6bqKz0P7tUgZK9hzMoP/AAuas+ymovaUK+P6nLHbGOuUvs/W 8m/M78zr7zvfQfuPqemWfL6rbcuTEtSskjbAsQOg6fjnTdk9kx0kTvxTlzP6A6rW605jyqIe0fkD 5UutF8oSX17GYrnV5BOsbChECrSKo6/FVm+RGcn7SayOXPwx3EBXx6u57KwGGOzzk9OznXZuxV2K qF7YWN9Abe9t4rq3avKGZFkQ1BBqrAjoSMnjySgbiSD5MZREhRFoTTvLPlvTJTNpuk2djMesltbx RN0I6oqnucty6vNkFTnKQ8ySxhhhHeMQPgmWY7Y7FVC80+wvY/SvbaK5j/kmRZF8ejA+GV5MUZip AEebbizTxm4SMT5GlKy0XR7Bi1jY29qx6tBEkZP/AAIGRx6fHD6Yxj7gAzy6rLk+ucpe8kozLnHd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVYD5y/JXyd5muXvmSTTtRkPKW5tOKiQ9z JGwKknuRQnuc3eh7e1GnHD9UO49PcXA1HZ2PKb5HyYTJ/wA4voXYx+ZCsZJ4K1lyIHYEida/dm3H tca3xf7L/jrhHsX+n9n7WU+VfyD8maJdJeXZl1e5jIaMXPEQKR39JR8X+zJHtmt1ntJqM0eGNQHl z+f6nKwdl44Gz6j5vS8592TsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/9k= - - - - - - proof:pdf - uuid:65E6390686CF11DBA6E2D887CEACB407 - xmp.did:551D098FDAA7E911B425F35AB770E4C7 - uuid:6a8ecdeb-674b-4af8-abe2-024c292e2d29 - - xmp.iid:541D098FDAA7E911B425F35AB770E4C7 - xmp.did:541D098FDAA7E911B425F35AB770E4C7 - uuid:65E6390686CF11DBA6E2D887CEACB407 - proof:pdf - - - - - saved - xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 - 2019-06-22T01:30:22+02:00 - Adobe Illustrator CS6 (Windows) - / - - - saved - xmp.iid:551D098FDAA7E911B425F35AB770E4C7 - 2019-07-16T17:02:54+02:00 - Adobe Illustrator CS6 (Windows) - / - - - - - - Web - Document - - - 1 - False - False - - 2792.000000 - 736.000000 - Pixels - - - - - CenturyGothic-Bold - Century Gothic - Bold - Open Type - Version 2.35 - False - GOTHICB.TTF - - - - - - Cyan - Magenta - Yellow - - - - - - Standard-Farbfeldgruppe - 0 - - - - Weiß - RGB - PROCESS - 255 - 255 - 255 - - - Schwarz - RGB - PROCESS - 0 - 0 - 0 - - - RGB Rot - RGB - PROCESS - 255 - 0 - 0 - - - RGB Gelb - RGB - PROCESS - 255 - 255 - 0 - - - RGB Grün - RGB - PROCESS - 0 - 255 - 0 - - - RGB Cyan - RGB - PROCESS - 0 - 255 - 255 - - - RGB Blau - RGB - PROCESS - 0 - 0 - 255 - - - RGB Magenta - RGB - PROCESS - 255 - 0 - 255 - - - R=193 G=39 B=45 - RGB - PROCESS - 193 - 39 - 45 - - - R=237 G=28 B=36 - RGB - PROCESS - 237 - 28 - 36 - - - R=241 G=90 B=36 - RGB - PROCESS - 241 - 90 - 36 - - - R=247 G=147 B=30 - RGB - PROCESS - 247 - 147 - 30 - - - R=251 G=176 B=59 - RGB - PROCESS - 251 - 176 - 59 - - - R=252 G=238 B=33 - RGB - PROCESS - 252 - 238 - 33 - - - R=217 G=224 B=33 - RGB - PROCESS - 217 - 224 - 33 - - - R=140 G=198 B=63 - RGB - PROCESS - 140 - 198 - 63 - - - R=57 G=181 B=74 - RGB - PROCESS - 57 - 181 - 74 - - - R=0 G=146 B=69 - RGB - PROCESS - 0 - 146 - 69 - - - R=0 G=104 B=55 - RGB - PROCESS - 0 - 104 - 55 - - - R=34 G=181 B=115 - RGB - PROCESS - 34 - 181 - 115 - - - R=0 G=169 B=157 - RGB - PROCESS - 0 - 169 - 157 - - - R=41 G=171 B=226 - RGB - PROCESS - 41 - 171 - 226 - - - R=0 G=113 B=188 - RGB - PROCESS - 0 - 113 - 188 - - - R=46 G=49 B=146 - RGB - PROCESS - 46 - 49 - 146 - - - R=27 G=20 B=100 - RGB - PROCESS - 27 - 20 - 100 - - - R=102 G=45 B=145 - RGB - PROCESS - 102 - 45 - 145 - - - R=147 G=39 B=143 - RGB - PROCESS - 147 - 39 - 143 - - - R=158 G=0 B=93 - RGB - PROCESS - 158 - 0 - 93 - - - R=212 G=20 B=90 - RGB - PROCESS - 212 - 20 - 90 - - - R=237 G=30 B=121 - RGB - PROCESS - 237 - 30 - 121 - - - R=199 G=178 B=153 - RGB - PROCESS - 199 - 178 - 153 - - - R=153 G=134 B=117 - RGB - PROCESS - 153 - 134 - 117 - - - R=115 G=99 B=87 - RGB - PROCESS - 115 - 99 - 87 - - - R=83 G=71 B=65 - RGB - PROCESS - 83 - 71 - 65 - - - R=198 G=156 B=109 - RGB - PROCESS - 198 - 156 - 109 - - - R=166 G=124 B=82 - RGB - PROCESS - 166 - 124 - 82 - - - R=140 G=98 B=57 - RGB - PROCESS - 140 - 98 - 57 - - - R=117 G=76 B=36 - RGB - PROCESS - 117 - 76 - 36 - - - R=96 G=56 B=19 - RGB - PROCESS - 96 - 56 - 19 - - - R=66 G=33 B=11 - RGB - PROCESS - 66 - 33 - 11 - - - - - - Graustufen - 1 - - - - R=0 G=0 B=0 - RGB - PROCESS - 0 - 0 - 0 - - - R=26 G=26 B=26 - RGB - PROCESS - 26 - 26 - 26 - - - R=51 G=51 B=51 - RGB - PROCESS - 51 - 51 - 51 - - - R=77 G=77 B=77 - RGB - PROCESS - 77 - 77 - 77 - - - R=102 G=102 B=102 - RGB - PROCESS - 102 - 102 - 102 - - - R=128 G=128 B=128 - RGB - PROCESS - 128 - 128 - 128 - - - R=153 G=153 B=153 - RGB - PROCESS - 153 - 153 - 153 - - - R=179 G=179 B=179 - RGB - PROCESS - 179 - 179 - 179 - - - R=204 G=204 B=204 - RGB - PROCESS - 204 - 204 - 204 - - - R=230 G=230 B=230 - RGB - PROCESS - 230 - 230 - 230 - - - R=242 G=242 B=242 - RGB - PROCESS - 242 - 242 - 242 - - - - - - Webfarben - 1 - - - - R=63 G=169 B=245 - RGB - PROCESS - 63 - 169 - 245 - - - R=122 G=201 B=67 - RGB - PROCESS - 122 - 201 - 67 - - - R=255 G=147 B=30 - RGB - PROCESS - 255 - 147 - 30 - - - R=255 G=29 B=37 - RGB - PROCESS - 255 - 29 - 37 - - - R=255 G=123 B=172 - RGB - PROCESS - 255 - 123 - 172 - - - R=189 G=204 B=212 - RGB - PROCESS - 189 - 204 - 212 - - - - - - - - - Adobe PDF library 10.01 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 88 0 R/TrimBox[0.0 0.0 2792.0 736.0]/Type/Page>> endobj 85 0 obj <>stream -H‰|’OKÃ@Åïó)昲™?›ÝìµµBqÁƒxj«`”¶‡~}g×j+ˆòæ…Ùß{ é¯çØ/焳‹9£”˜»2ížáßa–IDr*ƒÝ“î6Ð_ÞnöÐçLȘ×Ðٞ -應°\E}#Çó÷ÍGÛ±¸ÐlÚNƒé®%›Çö!_Ǖ¨¦x—á€âDló“ö¯FpÚLõè"ÃÍÿ•·Èµ£ŽTû¬&(&HÉ䭈âX’Bõ£Ó±Ì/°6ú¯vg´`oJê>stream -8;Z\t9t%q^#_hHc=A1XALg@6UBB8O0VJ0CY1+PLJMH]QAJuV'4g5)6AFB>,p>9qqj -$:KhHFH&hG]UWKc.M+c4rRZe:%^Zns62rH^8*%8i?R7b>7Bn$G.AE[ZS%%PRhHJrT -IGHRm-^l*8%,5@V=\L#Lol1D-IBL'G$IAapr:Y;>NVfG6%Ra!R7%@c/PJ4L[`^ZWp -"]>:Cd8iZ,LIGi`8J6H2S7iETbcsW)$*PS7:je@3Q\\n3:PeW]OmOWj&?XVl)hdlnq1`smp"drMl -endstream endobj 89 0 obj [/Indexed/DeviceRGB 255 90 0 R] endobj 90 0 obj <>stream -8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 -b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` -E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn -6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( -l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> -endstream endobj 83 0 obj <> endobj 91 0 obj [/View/Design] endobj 92 0 obj <>>> endobj 82 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <>stream -H‰|V xM×þ×>çÞD„äˆ8÷ƹf‰ð )!}TB‰YÍ"ƒˆD"ˆ%†ˆyz%ÄÜ(¥EñÌóX­ž{sbzÞ«(%¹ç­„Ï×÷ZÝûÛß>{¯µ÷ù×>ÿ¿ö¨†4HèÖ×/ ©îž±pžxÕks @€>("y¢rðTfÀ!G'ŽŽï]â\ pf»|rt\jô˧7Û®/ØpLTxäÑZñg^¼_ëž0´ujÂã¹<®?1e©ñ¹·N1q á;B -&žÓµŽOIÔ¯®R4ae\x|T(ö®ã1c’'&L˜¨uÕó»šô­°'&E%>ê<ˆÇÇM éŽ8ïµZג=Òßö ÑÂMÈ¢ªƒ¨,2ÏÍÃoJ°žaP ¼zØàžC)P€u¶•fªìkò©ñÕæ¦Ç»IîE¥Ïÿ6J²NïàXÅ©ªsµê.®·5k¹{xzÕ®ã]קžb4ùÖWÍ 6jܤi³æ~þ-Z¶úKë6mÛ~Ô¾CPÇNÁÿµs—Oº†„vëþiža½z÷éÛ¯ÿ€Ÿ }FÚÌY³ç¤Ï—1?3+;gÁÂÜE‹—,]¶|ÅÊU«×ü틵ëòÖoÈ߸ió–­Û¶Y°ã«»¾Þ½ç›o÷îÛÿ݁ƒ‡þ~øÈÑcÇOœÐ"ÜD1nóhEnÁ†ÝØ#>¡@ìÅ>œ]ñ ¾Å)ÌÂqÌÃKŠUx‚؄ÅŠ…Ô]Ì¡O©õéøNdâÅ1’©·X‰5ºx3ÃՊ&w‚7«ô6·’ŠÞž¤•TØ+z‰ï~†°jOtWQƒí?‹çpû-ß´^ÕüϹü֏x7rû Ó6òÃkþÖô‡Z0ör$OQN°…Z;†‘+¼˜ËKPB.š…íAÌôEäAžÚ,-GËã“zM.‰Réö%ƒ3y¢%ZñìVæ˜A¬]Bæh‘ÐbYý:pšªÀM‘Í>^ä#Gkùp@tÀæõzlbv¶ƒ YCh¯&§jÇ´'Z9œÐ˜wÅjæH36Æ /©…´^ã?¸p$Ñ=ÎÚZκËǞŠÈHböÒ@á-ÆKodƒîQ…[‡ßˆN¬ÁDVL²YËkY¥ùØÌ*=Ϻ»ÎŒ{Á¼³3§ëQ{ -¡PÖK2ˆ1H,›¥iÒ!‡Hm ¿¿£ D7ôc]&ðŽKy§­8Æ|»ÇÊiMm(¸R”Kûèý@÷¨LD‹b“8% ’õººåì/µÆÚCíd>gfÿ«pÌ]ÐCg4ŸPë|2«|6g¢,Î@kùÌ6rNÙÉlÞ˸Ïr¹…g|>‚«Ž«#£7°ݹ¶dm9’`F2„>Š•šÊÊ¡­´‹¬tŸÒkÆÕH„ˆ±\ñ-W’%ɗkˆ´RZ#m“vJeO¹™ ·”êæë;ésô'ôOÊËæÚSí5ƒ–ÎT…;|PkC´FW„1ß"9†Ñ•Yl笩œ›fó¹/ãï•ÏœÚÏ·Ãù®ئ®+|ïû³c;ñ³›ä9˜€íòŸÔ#b‡Ø!àd@ì(¡NÈŒŽ¤«ª)`J[è# ŠZ´Ýؔ•6íØ53bë"­›Ôj•ÐV&­hR;eVj¶nÑ-<ï¼çA5-ïùåÜ{ßýÎùÎ9÷øç}×Ák7µ,ýý*ím¨…ÿ†ãOµÁ U¡¯ÇP¥âP‰&ý+ø$Nâ[”*k9µ‚ -R#ÔqŠPÃõu‡Î«”^OGéô^8íOAÇr‘þ5= –‚8ù»˜aæ»Ì!æC˜̟XÄnb#l{ý{“çr¸w;®3éÞÓÛõbÎ- åkÙõgê]ˆsø#¨?%Ã/C9…Ô:ԀÚ…]†ÿN¼•Ò¢'‹)üèleþ€ÝmݐYP“öá/ASAÏCä•@̏ÁÙ1 -ul¯C]ø°å€êUyŽY8WðÝ«xÝ¥,!'5$›À·ÕY—à„:‰…ÌÌiˆ—ßd8ô“õׯߘ¹Á¥Ð[Ô µ·•ó?ÖÔØP_S]µ¦ru…ÏëYµ²|…»l¹XêJŠ—9EKí…KlùV oÎË5 9zÇ24…‘7(¶ÆâŽÆ-¶µùÔ±ØýMĉS­ê!®© jJ 9ü5M)«)=ÐļàG~ŸWŠù0 -)ÜÓùh@Œ $­ÉšÌ¸µA. \.ø†´‚ãB´>=*ãx_Òhh[† >/JŒ A"­âX·®Åš@µ›’Òç*A*B—ûI¤3 8\®˜ÏKpËq€ q=1{4Ô¢mC¸¢Ó¶vªæ #BÒ;#O¦x4÷˜ÅÁþÞ(¡ûcêÙ Ȇ½³vŸ7…ßØ%9-)Œ¶D¯¢p&‘ %˜º›µ%zèau-í;u(ˇr¶3úðªK}ÆbðRŸ·½+êÔbpRPÍèŠjÀK±}5€TçT3³‰Au&¾K 9âzqTÞ²Šd‚ºžq]( -KW3Ÿ pP·DEivˆ±þ€3Y€ä®g.†$!ôèŠÏ›ä-YO'óÌ ‚)÷aaèÁš&iꪨ]UDbB„;@ UÖ >†¼£Ôà/†Á£;Áq™oR‰`Ë ?—炘þâљþ…®ŒŸCª¨†ËƒƒõE™x’’Ð H¢3š hÀqI«=1BÅՕ™ÅÛVu%±¸òàëqÂù’ÖZۈÞýà6óKòƒ£M/ù?ËCÙuHŸ dØ29u÷ËGî¸<jZ!e¹UZå¸ÜŸÊ$Dåd{»<Œ/š”Êď8ÈÙÉØ(§’ê¬7H~K”vP±¬D9hÚ¿)¶wöDH#LÜ¡A18¸B(1° ø‚»R6—Ì“Ð]—ªG•ñ×Å÷¡æåTÀì×`c‚ò âC„.l€E¢TC¡r#Dà I²L -{/ Nw {…0þÛešFŽMaÏš¦Â9:Ðð\Â(¤O]Å"²{6ñwüsþMü]?çGÍ~þ¾ÎâšJ—Åe)ƒ†ãm^ gæ%S™Ö E3³Ì»L/tN‘*˜BšG–î\âhCa·ÎXtÑ1Šâ‹1_/Æ# Ãue-ëyJÛv¼#=Û> ûÞ÷Ï¢ætsssÚÒh±6®©Ä°kmKQm ª®ZRȖr¶‚%ÕUuµ5nú<æ•D~¸ý÷ÊoñªO÷¿ùöāéiFúÏÌw6¶à ÿšÇëÃáы“G¯\|é¼=Ê6 o ò ÝRIáòºå”Õm+A‚ÁÜÝm3°3ÆOŒ”1…¯þ,¯›3[K¬LádÄaŸ8byÀw¤zÇý;à°tº¯%zAÊè/¦‘Æ`‚f t—. ¯ã\¥x…«WW­Å –ñõuÿË´=¯(ýøärì+ß·íÛ/Ô·}ð¦ò»³/½¿ýÜå/Þ|çÙý?~ƒ‘æ{•/ž%‘W÷T¬ì~®­ûÿ‰é׏7ë'ŸŸ–O«,m€³nŠCН˜Ñ¸”÷û•Žâ$gqc†Ã\Š²K¼)é‚MœÙ°Ùò¸…¢¯QKQ.Ê¡–J¢)7/f6'LÇM”dŠ˜â œ5±¼I0UšhSˆÿQÖ}ãYùY~¶‹}üíqjz~ œXê®­©£Ò¹¶‘á ¡‘áuتÜæÐh84²³½mXÖÄa„tF`ȍž—VRzdºY[·ÑÈ5eGQ‘Å€ÊñãåûË©’r¡œ2óVKŒOQEWK‹œŽXˆ’ӍËbn7¤½y±ÇᧅB+ÆÑfÁއϳ¯o\{¸šá_šOs@]¾Ë¶« ©Ïblƒl¨q‹¥yY©/ˆ‡±µõí¡á©ªu¿{Št(éÞÞÖ=uJÚ³í=õÊmFšèØ8î>ÿÞýg©ò«#G_Sl”ùÄA©óÄëŠSåi+dÓ`{*BU’£žÇæn¤³uëö&촎$ŒØrôL,¦Ž~i5iҐ-}¸Š±Ú -(FK˜úºü‡BŠzñ 6Ÿ:­ÜûÁçÊåkSÜÿÖ¹DbúÓ{F¹wúŒrç{¸ãvfúe%“”‘ ““?&Â鄖Û’[_i]Öø„nBwTGӕ&Kãeú²‘š¢§Œ”ž§°A¯3#ΐÊ\‘ ù†c¬Ž7èR™ɞcjԅ­›­Ÿ3Çx>oYz~™¥Aea¶oÿ™B¦#íi^L›lÖôaOŸ'¿Zc Pnçl…Wøs÷¾öÚ¦­•%ÍÝXù’‘^ìÜâ¼em¶Viƒ·×À/ÎÀý_ö«=(Ê늟ï~]ä±±ò)¢A‚»ø¨2a•‡Pð 1eË.y,,«©!c$†&š¤$©E&5Qƒ8™h-­4ñ´µÆÆÔ±Ó6:còSãXë¤3Õ¯¿s÷[ªØi§f¦írç÷sï=÷ÜsÏ=çÜ%þ˜7{EÂê ΁T­ ¾hBIÚ:¥<þ©´GuvôŔ+Ρ”ØÑB©NoMß+vÇjneþ)yîeêz5¨>§v«úRɪª¹ª£NPŧêgꗪ…ÿVOr˜ ž‘Àkæ繖»ª]­®­.=ߥ¤¹f¹„p%¸ÄG®³®K®k.͵:n4u&׍YœÞ®uûºã•eñëãE|ɔA%뇑›­ª*»ñ§*y¹(‰·ªÚÚÚBWª†¾ë6vNÄ#‰®TÉ)6m.×\¸[™‚lCتSúë*f̞”ïkÓ¹]ýÞaOçÌo<½ööW§÷møP=Ü_;훮tsæÒwš_ÿù'æ-š=yA_už¨"ù‚Š5=¥¿´$m Ó㭇¦[I·^‰Itþ²£¥¼\匽í%ŠñZI–+&Ñþ=†=$¼Ãh—)U;C^­ƒ7.Ót½|Ê/h­CUÀµ‹fc¾²+Ôµt ôyõ}zò9ÀQ€y^?ð XÀ”åå¬côm}ˆœ@¶v^Z¯÷P¿–Aýêzÿ)ÔŽ>¬Û‰þTí&‡³hÖôc¾:ú$=Hb]lû†žJoAÏ<)×FX·@#r‹nêÇÜPöoÖȺùÇôbz؁¹JɧÒjìéÿ$ä^V†¨H$ZýØãð͎.z ãQù¼:³D­ôãvؕdÔÒXPëÆÂWqbÆhgÄ81hYñó¹|n>sôLÒþˆM÷‚÷„}w6ÍU†¬m@°}ضv݉zDEù @6ШQfaîÏëCÖW Ä]~ú>ü¾æ§ùðkìôé´›ûÃà{ï¥'Ô”…¹gŒ]ôÆId—áÿ˔e¤Ó\çAZƒ³làûçؓ±à§èƒºµÏi<ü•ÌÀރ£Ã¾‚œ´:Êùþœ|‡è°r+ûØØàf¿óÝ+ÅVtÇÀO) íÒ$:hš—ûx}Œ—2d,fÐ~›ÊXÄ|µðZߎ—Õ+ˆ†ïËô7iåôô-Ï^­Äúnœ}î¿BïQJ@߶e27å2n»7ˆQŽÄH²~fòÝÊØ=(㨏cÍ͝â­€‰°á)S¡“dÞ vy_[÷l™[ˆ(åXbÿ‰#":â¥9¾¢´>8 -;dl²-65i'l-â\Äy˜Š.j–ô45sËŒÒtëŒí§JÎSÎПŠnëhÔ>Î[ÎI?£Tö¥ŒA›û&Jː÷5Tí¨‡Þbœ§º×€~ºŠ& 8jØ6ø~‘ÖI-â$•Ê£>Çš®þ’[Ë oﺇá8§lÐ~BÒßçè qzðÇA[Å|ZõÕHßÞᯃwù;—‘”kœa›¹öó9õWIDë¾öµÈó°ßšŠzs°mÆ%*ãšo¼AÏÈÏ9Ëãl§ÚI«Ø7°½´EæÀŸajµö Uò¼ú[ØÀ1ë¥J™ËÿŽÅØ ,Çó2j)WŸG-ÚQð'±¶‚rY§Q £æãÀÿžÊízÜb×_9&㡋ù̈™j¾ >'ÛÊw븎³î‚?:(Q»:‰’ù¬ÒW¯â¼¶¿ŒLŠe]Žš¨=Nãôç Üå/ۏQ_qŒÊ7: 'y¤¯sWi±cúœÙÔ­çP¬qc/KùRçoÀ§•².ÌÅ9P‡ðnl×çÐ×íÖj|S#ïJ)êÔZ2Œ…üÞÉ’oOôÅú ö©3Ž–²¯t?Ö´“Ç1qÆëßÅۙšܦ%Æh&%É\:c]å½1^Éuƒßfö±H²úùØóglƒuUÚ¹·íðiŸÚF;¢1<’FcÚàzè¥wµë<¿‡ÎË2‡žŒÖV`°c{#uXLÄ{©èØï¦ò±> ¶1/ åTdŽ)ãιÿtü~ ~‡÷¹Qòx/¸¾ñoKǐâÌ(Åßž¦:3•=ÎFeб -µ·ï÷*ªÕ"#î?¢\Äãx')q„°f=TzÿOÚ®4%­ÖnW”+"S¶Õ¬íA{дÿm#¿{è:åÒÒIP¥Ñ|"µÙyˆTž¥XÚ-)ÿm"¼JÉèEx ü›6o€?fóhú5kÑF¡÷7Åaó -ÍªÍ zH̱yã…6¯ßhóø>›wгâbÅæÖ@­¯&`ö›õ³,Ø cÈ, †Zƒ!_¸!Øb¶6ÕÌ0ú¾#dºMVg® 6mä±v³¤+³sr Ùj4ƒµÿúxTA›©•TK>ª5©¨ zɗQZ€°-eR!z!ðüõa¼AJ˜iÂúàÊqß×Ôd’[®ŽJ¯Älm–kÇX hdÏlÊAóP¾ÙèçC¶ ´Òu° ,åË¡©Ñ&|ýTIET -•´ˆ2aOúÂØ#„]‹¤­õX_­rw¿ÔP‰&Xºõÿw˘wI™ø²'øvÂÒï~H7ËÓ4b,ˆ8ø:·¯FrÜZHƒôOþòãÈ#ª)X>Η€k¢zÀ™j*”_(Æ#Å»ÅúpPÑ+E¯éþšÈfHn*0 ÜVp[%.Nr‹\J܀Š^z9Rb™€G–T၄ãg…[37$}Â}\E'ÁòR(û±êütâÉ_& -p†¹kí.*ôEƗ˞!’¡í |o‚Nã{^r}øžÜ‹ø¾)¹:|Ÿ–Üj¹nƒGςÄú h¬H¡|@üñ² £ãø<“ko.——Ë ÃƳ·›\•B ¨|)ØÍåîª,š4—voÓb/9ô>Ùk´Ø„"¤VJÛ T¡ÁZk)ºw v/­m¿ˆ_Ú/~D°E¨öMÚB|fïZ*Fqîvž™çÿ›çٙÝÙ½#€õA_ÝDcH°þJ¶Ð˜ú8l¸Ë@wÀa  - ¹t#‹d™Ðä0¡ -Fž\'ôü §-å¬<(Î'ŒW#Œ­óX_ò[?RñØ¡µ BD"=”E¤H}߃x•Éï× ¾ü•c|Ï*ï¹°Šò[^—|˳»8I§ñêwv0õ4ÜÆVNU-EìFñÝ!C¡¯G[Á…ˆJ8œ$&DH/¶>tͽîÁxÕê–=0êfkÕzÍXÕê—›as#Ð ÄlZGr8,éšG»øІ~&Ï¢§Õ5—e V›ÍýüºuN¾fxt±*ÿjzô 5<Ä/Y\¾h­“¿[‚Q¾@Õþ`kè;% wˆdzŸÜ#ü(ڝî>þŽé­VCçøs¡“6½¦unŽ¿iaäSòN‘rGfÜMO´IÅù#÷ yó¸³*ž§S#ÚXBržî×30G¦}fz`¢9ªÏè:2EÝgà*Ñ}F‡«"΃ÈƉ×½Îtk÷˜n (árÝÊd«éÞtê@Ç4]½ ¿Wµ -éÔT<•Kþ7fÿ["Ó¸„ ’¬p3Ü»þ]º_ - 7v~&UÀXñTœs`fJröN*Jeþ¬§éÑÜd~J؉‚s6^H:óñ¤RÉϬ Ï9OVÈLj,[™Q Éj^ͧâIÃ-•Çgÿ–ëíû¹ÆË++‹`ã"WivyVÈ%‘kVäš¹JjÉÏ©WÅ^ÉVICÛëÖ¥áfÜY¹h¯‘à‘Òsþ6ÛÐ+ÍE—Ž“p¿á´ÄN+BR€øRºÛ’4·¡7ºÇRݸϫN¬—ñƒ¥\ÆoyW½²Ê¾Ç/~χ„SÜ9V_n©)¦RSŽz ç(ñ¤³Z8Ò G_<¹ ¬¿  -åì -endstream endobj 87 0 obj <> endobj 86 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <>stream -%!PS-Adobe-3.0 -%%Creator: Adobe Illustrator(R) 16.0 -%%AI8_CreatorVersion: 16.0.3 -%%For: (Christian Femers) () -%%Title: (logo_blue-orange_clean.ai) -%%CreationDate: 7/16/2019 6:26 PM -%%Canvassize: 16383 -%%BoundingBox: 56 -668 2732 20 -%%HiResBoundingBox: 56 -667.918 2731.9385 19.8062 -%%DocumentProcessColors: Cyan Magenta Yellow -%AI5_FileFormat 12.0 -%AI12_BuildNumber: 691 -%AI3_ColorUsage: Color -%AI7_ImageSettings: 0 -%%RGBProcessColor: 0 0 0 ([Passermarken]) -%AI3_Cropmarks: -23 -665 2769 71 -%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 -%AI3_TileBox: 957.0195 -584.8799 1757.6592 -8.87988 -%AI3_DocumentPreview: None -%AI5_ArtSize: 14400 14400 -%AI5_RulerUnits: 6 -%AI9_ColorModel: 1 -%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 -%AI5_TargetResolution: 800 -%AI5_NumLayers: 1 -%AI9_OpenToView: -2915 1691 0.25 1586 946 26 0 0 51 123 0 0 0 1 1 0 1 1 0 0 -%AI5_OpenViewLayers: 7 -%%PageOrigin:0 0 -%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 -%AI9_Flatten: 1 -%AI12_CMSettings: 00.MO -%%EndComments - -endstream endobj 97 0 obj <>stream -%%BoundingBox: 56 -668 2732 20 -%%HiResBoundingBox: 56 -667.918 2731.9385 19.8062 -%AI7_Thumbnail: 128 36 8 -%%BeginData: 6246 Hex Bytes -%0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FDFCFFFD04FFA9FD11FFAFA9FD6CFF08A9FD0FFFAF0885FD4CFFCA -%C2BAC3FD1CFF0F30FD0FFF310FA9FD4CFFC2B4BAB4C9FD1BFF080930FD0D -%FF5A0908A9FD4CFFB4BAB4BABBFD1BFF310F0F5BFD0BFF5B0F090F85FD4C -%FFC2B4BAB4C9FD1BFF080F08095AFD09FF8509080F08A9FD4CFFCAC1B4C2 -%CAFD1BFF310F31080FA9FD08FF5B08310F0F85FD2BFFAFFD2FFFCFFD10FF -%080F080F0831A9FD05FFCACA5B09080F08A9FD05FFAF5A310831305BA9FD -%09FFA95B0E0F0E5B7EFF855B5A85AFFFA9855B7FA9A9300F30FD04FFAF5A -%3108313085FFA95B7F5AFD05FFC2BBB4BBBBCAFD04FFC9C3C2C3CAFFFFCA -%C2C3C2FFCAC2BABAB4C2CAFFFFFFC3BBB4BABBC9FD04FF0F08310F0F0837 -%FD05FFBBC261080F080FA9FD04FF85080F090F080F08317FFD07FF5B0F08 -%0F080F080F5B5B080908FFFFFF080F09850E0F085BFFFFFF85080F090F08 -%0F09853009080FA9FFFFFFBABAB4BAB4BAB4C9FFFFFFC2B4BAB4CAFFFFC1 -%B4B4BAC9BBB4BAB4BAB4BBCAFFC1BAB4BAB4BAB4C2FFFFFF080F080F080F -%085BFFFFFFC2B4C95B09080F08A9FFFFFF5B080F080F0809080F08095AFD -%05FF7E09080F0809080F0809080F080FA8FFA90F080F0E09080985FFFF85 -%0809080F0809080F080F080F08A9FFFFBBB4B4BAB4B4B4BAB4CAFFFFC2B4 -%B4BAC9FFFFC2B4BAB4BAB4B4B4BAB4BAB4C1C2FD04B4BAB4BAB4C9FFFF0F -%08310F0F08310985FFCAB4BAC261090F080FA9FFFFA9090F080F315B5B31 -%090F080FA9FFFFFFA90F0831090F315B310F08310F0F0EFFFFFF0E310F0F -%085B37FFFFFF0F0F080F0F5B5B5B090F08310F31A9FFCABAB4BABAC2BBBA -%B4C2FFFFFFC3B4BABACAFFFFC2BAB4BAB4BABBC2BABAB4BAB4BAB4BBC2C2 -%B4BABABABBFFFF080F085B5A09080F0885C2B4B4C95B0F080F08A9FFFF08 -%0F08095AFFFFFFA95B080F0831FFFFFF5B080F083185FFFFFF8531080F08 -%0FA9FFA90F080F085BFD04FF5A0F080F08A9FFFFFFA9080F080F08A9FFCA -%B4BAB4CAFFFFBBBBFD04FFC2B4B4BAC9FFFFC2B4BAB4BAC2FFFFFFBABAB4 -%BAB4BBCAFFFFC9B4BAB4BACAFF310F0F30FF310F080F5BC9B4BAC2610831 -%090F85FF850F080F5BFD06FF5B090F08A9FFFF0E0F090FA9FD05FFA90F08 -%0F0FFFFFFF0F0F0831FD05FF31080F09A9FD05FFA9090F0831A9FFCABAB4 -%BAC1FFFFFFCFFD04FFC3B4BAB4CFFFFFC2BABABAC1FD04FFC9B4BAB4BACA -%FD04FFBBB4BABACFFF080F0837FFFF0809085BC2B4B4C95B09080F08A9FF -%5B080F08A9FD06FF7E0F08095AFFA90F080F30FD07FF3009080FA9FFA80F -%080930FD04FFAF080F0837FD07FF37080F08AFFFFFBBFD04B4C9FD06FFC2 -%B4B4BAC9FFFFC2B4BAB4C9FD04FFC9BAB4B4BBFD05FFBBB4B4BACAFF310F -%0F31FFFFA9080F5BC9B4BAC26108310F0FA9FF310F0831FD08FF0F0F085B -%FFA908310985FD07FF85080F0FFFFFFF0F0F085BFD04FFA90F080F5BFD07 -%FF5B0F0831A9FFFFCFBABAB4BAB4BBC9FD04FFC9B4BAB4CFFFFFC2BABABA -%CAFD05FFBABAB4C2FD05FFC2B4BABACFFF080F085BFFFFFF85085BC2B4B4 -%C95B09080F08A9FF31080F30FD07FFA931080930FF850F08095BFD07FF7F -%090831A9FFA931080930FD04FFA9080F0885FD07FF85080F08AFFFFFFFCA -%BAB4B4BAB4BAC3FFFFFFC2BAB4BAC9FFFFC2B4BAB4CFFD04FFCABAB4B4C2 -%FD05FFC2B4B4BACAFF0F080F31FD04FF5B37C9B4BAC261080F080FA9FF30 -%0F0931FD08FF080F085BFFAF090F085BFD07FF7F080F08FFFFFF080F095B -%FD04FF850F090F5BFD07FF5B0F090FA9FD05FFC2BAB4BAB4BACAFFFFC2B4 -%BAB4CAFFFFC2BAB4BACAFD04FFCFB4BAB4C2FD05FFC3B4BAB4FFFF080F08 -%5BFD04FFA985C2B4B4C95B09080F08A9FF5B080F08A9FD06FF7F0908095A -%FFA831080F08FD07FF0E0F080FA8FFA90F080F30FD04FFAF080F0831FD07 -%FF31080F08A9FD06FFCAC2B4BAB4C2FFFFC2B4B4BAC9FFFFC2B4BAB4CFFD -%04FFCABAB4B4C2FD05FFC2B4B4BACAFF0F080F37FD06FFC9B4BAC261090F -%080FA9FF850F0F0F31FD06FF37083109AFFFFF5B0F080F37FD05FF5B0F0F -%0F0EFFFFFF0E0F095BFD05FF37090F08A9FD05FFA908310F31A9FFFFFFCA -%FD04FFC1B4BABBFFFFC3B4BABACAFFFFC2BAB4BBCAFD04FFCFB4BAB4C2FD -%05FFC9B4BAB4FFFF080F085BFD06FFC2B4B4C95B0F080F08A9FFFF0E0F08 -%0930FFFFFFA95B080F0837FFFFFFA9080F080F308585853009080F080FA9 -%FFA90F080F30FD05FF5A09080F0885FFFFFF85080F080F08A9FFFFC9BAC2 -%FFFFFFBABAB4C2FFFFC2B4B4BAC9FFFFC2B4BAB4CFFD04FFCABAB4BAC2FD -%05FFC2BAB4BACAFF310F0F30FD06FFC9B4BAC2610831090F85FFFFA9080F -%0F0F0E5B31310831090FA9FD04FF5B080F080F090F080F090F080F0FFFFF -%FF0F0F085BFD06FF0E0F0F0F08373731080F090F0831A9FFCABBB4BABAC2 -%BBBAB4BAC2FFFFC3B4BAB4CFFFFFC2BAB4BACAFD05FFBABAB4C2FD05FFC2 -%B4BABACFFF080F0837FD06FFC2B4B4C95B09080F08A9FFFFFF7F080F080F -%080F080F080F7EFD06FF5B0809080F080F0831300F080FA9FFA80F080930 -%FD06FFA90809080F0809080F080F080F08AFFFC3B4BAB4BAB4BAB4B4B4CF -%FFFFC2B4B4BAC9FFFFC2B4BAB4CAFD04FFCABAB4B4BBFD05FFC2B4B4BACA -%FF0F090931FD06FFC9B4B4C25B080F090F85FD04FF850F0F080F090F0831 -%85FD08FF850E0F090F085BA97F080F0FFFFFFF090F085BFD07FFAF310F08 -%0F090F08855B09080FA9FFFFC9B4BAB4BAB4BAB4CAFFFFFFC2B4BAB4CFFF -%FFC1B4B4BACAFD05FFB4BAB4C2FD05FFC2B4BAB4CFFF305B307FFD06FFC9 -%C1BBCA855B305B30A9FD05FFAF5B310E31307FA9FD0BFF84857FA9FFFF30 -%090831FFFFA9857F8584FD09FF5B31083130A9FFA97F857EFD04FFCAC2BB -%BABBC2CAFD04FFC9C9C3C9CAFFFFCAC2C9C3FD05FFCAC9C3C9C9FD05FFCA -%C9C3C9CAFD28FFAFFFAFFD07FFA931090F30FD70FFA831080F085BA9FFA9 -%FF7E31080F087FFD71FF5B09080F09310E310F0F08310931FD73FF300908 -%0F080F080F080F080F85FD74FF5B0F080F080F080F0931A9FD76FFA98530 -%3730315AA9FDFCFFFDFCFFFD55FFFF -%%EndData - -endstream endobj 98 0 obj <>stream -%AI12_CompressedDataxœì½ms%¹‘ú}"ú?ØÉáaW -”®ãFð’Ú±%̈́4ò®½×ÑA±93ôv“m6[ò쟹?æþ±›Ï“‰ªÎ9löËheï4¤éfTá%‘/O&þîß}ó‡/O_ÞýéúËpÒmž}ñw·»¿¾|¸»ÿՆäÍW¯^½{ûpÒ/~ÿËM?t¨uúU~a5ÿËõýۛ»Û_ñw'¿½Àó¿ØýpóöáæòvsqýZ*ýró‹_â·ßÞ<¼º–ß¿ºûþîş^½»þòîþòöûëW¯®/oO.o~éï!íž]>Håô¼Ÿž]?o¦_ Óæ›ß²ÊåíŸ/ß¾½ù—kt2ûÞÞ½»}ysûýöîýj§Í—Ó”7C -Ãfà›ÿýÍï¯ß¨”Næžû“9ä¸éç“ÜM9»»z÷úúöá›û»«ë·oww¯îîßþj³ûQ>í·—ßËo.7ÿõúÕ«»¿´µ/înPKþùîþÇ_ß=üpsõåöîÕ˶Òﮯ_^¿|¬êéWñÅÅÍ«kÓח›~àœ~Õ/¶ïn^½üݻ׺–ážæžôð‚ï÷Ç·òbÒ$þMzzñÕk!ýáúáA>\zãhüþ×Ûö«„Êò‹úFöZz¼ÿçëÛÿþËÒòýݐäé/‡€Q‹2bÓ¼I¥ïo¯_¿y%3Ɓât¥&ÿj(•å³XqŽéDæV~óx’Ó<¿¾}yùö‡çׯù׃ìÉëçÂ1_^c«HcoWêÃw×Ï_Þ #þ%ë`~þ__Þ\ßË¿Ý<ûæòJ†cŸ_½»¿¿¾½úQ~˜žÿéþN6ãŸ.e?÷S~^ê?¿º{ó£µyÿò»ë×7·7·òxžËøß\]¾º½{xþÏo~¸¾}~/SñV>íúåóחWx-V™¤ço„Í˓ïÞ>øËÝÛw2h7w÷Ï~¸¿¾öŸ.¯Þ=\?ýnÓç𜴗W2ÿlíêúåÍ«W—Ò’lGB^èõåÛ«w¯øF9ã—ÿóÝå½<ƒþpùê;íÈo…íÏO¹¤©Síñ´™ÍSßSÿúS|ÀóÓóç;{…çç|üù9–VΛÇÏý¹¯´ÖWÚÅWM¯¼ÎùÃÏÇ¥™¯õ¯õ¯›¾Öwúڟ{ýîÕÃ͛W?>ÿúí+¬‰?–ú£>üÇæá?úSÿUùíw÷²ZÀ|oe©½}~©_–ï¹lž¾Ô®/½‘KÇåõó«2×úøµ¶~]–¦®ý¹­u£µnš.n¼Îµ Ç­vx§ÕïÊ;Ý5ÜYîå͟o@ÐÁx§¾ÓžÞ-Þç?ó£þúƒñc!?ûâÛse…ñ?½øö­ ÿ/ÈhÎo¯îp¶ÿjóbÿ@=xÆþÓó5ŸxXó·ÿí{WúÚ|{ÿîúÛߔƒˆ/òBÞ왎î°ß½áïò‹o^½“_þúþîݛ¯n¿»{öÅ/TÒú/×W"MÉñõróõŸþ‡ü òÒï.¯~øþú_®o®~¸½~¸ÙÊÐ -Ý늴ôæ—ïiXúýõF+ÏòGùû;üý”çÏ®¿Ù£6 Ô¿ÿB…ÿÝ~ù߄·>üË뻗ï^ÉoÏoÿ|ýêîÍõFVïæ.ïß<¥‹o^]Þ^Þoø‹ÒCÛîæ+°™Ë~¸ùóæõ¥t*•~s#gÆ7—2¾OêA˜Ë5>Ä:ËÞ«ÐüêI]]>ü°ÙÊK¾|뭟⨓Y|'rîzÄø!Zÿ)ÍÿáÇ׺{uóöµ7ÞRüßO|SÖÛ¯oõ•ïß½ýaóíÝÝ+où·ïpX¼¹¹}{ýjõÖ"(ésSyåC`óüoÑÅîRDa“o„óêå?Ûï¿»¹>Øّ矴º®8U‡zýÛë¹¹|u°ÇýÇþæ:³5¸@xç&ðh?üåòáê‡Íonþt/Çìõ{v+&û»›Û—ò¢xwópíàc 8ýöúá_„A {›‘.šjógM{œ|ùåãM?m¶·m•_ßCD¸}µû×r’AH¦ë¿E/H›íKÊç]ó¿¾üoÜü݋­HžÿQÈë?ýª M VF+‘ÿ/eÂÿ¥ÅiQ’—Ü͋rڔ­”•³¦œwÒâE)‹Wkÿ M M%j‘1Àß©Ÿ¤$þ›2/Êi¿õ²ó²íϤ”ŸÎ¤Å³þœ´³þ¢-íðñõʟД±)q˜Pž}¡©)y˜¥èO›²Õòì‹ÿûðœ›Õ°˜×±™Ý:ÇR¤Å2Ïc3Û:»í,g)ø³›ó<73-ÿ•uÎˬo}¾õoÌöy;ëò_ýÓœóAf ñ ó‹¿1Øë‰%s¶Ój¦O­,çsŠ¿ÏYÎV³Yº œË:w(:Weæf›3™'™S+ÌÙÎÊ˹• ”²Íð9«9í9[£æ¸n¹g.8BG`â7Îüž3¾uoo9qõœb­°oô5„Æ0…r˜ÃVÊY¸iïÇ0ŽcӘÇy<·ãÙx>^Èp1Ä1N1Å9žÆmÜÅó(ûT^©—%;Nqš¦<ÍÓ鴝vÓÙt!‹BTØ4¦˜¦”Óœ¶i—Î҅,˜>yÌ1O9å9Ÿæm>ËçùBŽÌéæq–†æ<ÏóvÞÍçó…,Ÿþ4œŽ§ñt:ͧóéééVÊîôìôœKjO·q›¶y;˯¶ÛÝö|{!ËLF“ƒvã.îävóît·Ýívg» Yv='c<‹gә¼ÞY>›Ï¶g»³ó³‹óN¦'œçÓy:Ïçó¹tv¾;—Ur~~~¥q!ƒv/äc/äõ/N¥H§òèÅêç´ã´:í¼)gMÙ5e»(§M™K‘g龖ԔiQbSƦ„¦Èj”/-g«\¹k_þ¼ýs¶(;-2dø{۔Ӧ̋’›’š25Eúyô2.JhÊД¾)][t؟}aÐ~@ûgה­–²Uó¹œÅåܕY[ÎÔrvdF¤Å±‘f&–ã¿uíÕsTe¼æ՘ÚH.Æp9n«ÑZŽŒ×r\tLN­Ì,ÙJ²2±D+#K°"뎛ÑÎT=|+”ÓÎʟ-Ë©•™%[‘Í.›?í&+ÑÊȬ(O.g€ðÕfNÏ9[Î[æFæÓ±Úʟe#o]¾.¥jLy¡K%Ó¯´Ä…fz™´Œè•ù*ñRÛ+§•ë‚®M°È(.´È%ô¢yàïyUòªTUÿ5™.ۖq¯„½2(öGZlÿ쩎؝­ìçŸ,ÂZdî¼l½œ)óђ‹†)-¦U™žXªöÛ"-.~v Gý÷~ G -—†´8<±äEZ|ZÍ'ÿ9h+ø¤?Ÿ¯Åæxí}`Uú-Rü™•ÛŠ-¤ØF²éÞÅvbû^vµêée·{LÝ -ë½]dß²—ÛÝ»µ]]¬û{7¹Õa²Ý&QíR¡Ý­nÍxdŸÊ¿ÜRmc«½Yv珦bcimlۃ{s»°ÌíïÎbÃYïÖ¼°òU«P± Ú¯þóÂv÷ʸ°6ߕKËÕÚfyhß>¶›W{•»úÈï>|G?º«ÿöàçoñˆÐÛªWû -–J-û -V‘U:*ìç”HfS0'“IW¯.©$-¤’¡Q±v¢dQÅzö…(YP³TɂšÕQÅR%kG«“*ZÙ­`ŠT­¨Y[*Z™6,YT¶zn” êßgèBÈ¢j©²ukPu‹ -י)\[*\™ -T.°2Y;¦v]P—†â¥ª”¯Lå ê×Hõ«ç¶º  -¶£ -% jX’nQU4-QÑ•1QÇh:§Bv& -T2(ePË ˜¥1R5ƒrȺ:*h¦Ãoµ#Dù^¢”7၀?=¬ÊÙ!ë„T9Ne·Lõ e$oywõ)¬Øsõï–'·2å%á·ãžläœuÁK’Í‚k.x¤ì˜VfAYq»ƒ|îùâ€<ñ4®q”›|æ]íª¨–ÖBÖþYSçÒWÎ\ª½©´µ„EYÚüâªL‹"À’˜6ÆLkYNWe».fÑlËÙ^Ùÿs±_Êjٞäý2,á`)VÄý”éhq{²´˜V%?Zæ÷)VíÃeûÄBŽ/-îžXΞV¤Å}ê¡©|r‘ýî#ÿ8^?º%7u®µæDÑ2ZQ{j±¯&+Åþ:[1무¨ÖÚò§°Šº…Ê´~[të"õK±Úe}Ó<¥eòRlÍÙËlåÔËöÏ:ƒyicâUՏp˜;5|iá§Xð¤#Üèj9ϖö ã¼çž³à1ÆghK;Îcp–÷qiñQ>ò²âôr9×øhNÑìþ£|â‰\aŸ<²«/Å]ýAfۅáV»ÚRé(†,Fك"NÃx+ŒAÆ¹á8Žtg<‹ûø d9tԁ(²Â‰,g ÙâJ†3ùœîdu(H¡t*ã˧•á\ÆfR3\̐?éf~ö]ÍR9ÝÍ[aOgîtîDJ„Ä Çó(/Y:Q„ŸEœ?¥z'ìãÜ\ÑÝ©ìú -ÿpJÃ-=&ªs㞦ƒZ -&䪶Ê@g5ÜՐݝÖYT™®ku^ïȜ°Ñ/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïåO=ý?~Ws8 _MìI¿ä_Ó&w'£ìM -ˆÃPùϾø»O©»}{ Í“(5c·Éý‰èÓñ×ÙÚI?¥yDMÅx(-1ça”¤8د‡>Nó´•á$tq¬Ý}rKú>(µq’jlû Šf.ª;›ÇØ͌´N9F„ýàï¾i,œtÂiš×úL ÚÛMðY4û.&>˜…?kc¢[fí`>‹Ædúâ¼h,vÝܾÝçiðærH'9„Må˜æOÐus‡Ö¬½ü<ŸŸ?º`—µÐÎö¬â7 ó,óïo^¿¾~P¦ýK $ó?:ë¼0†9«ŒææKÆOžµ>[cs£¡&(bzœ ë O5ò¢jËÃí‚æ=Ô&g§<ÈÎÉဧÂÁ¥‡Ö)m[gЄŠ,žµíª§IgØKuyì$§Ž@‹`ý9ŽFm-·±±?Ð8¦ˆb•°6%C'(>Á -4FaÝíù8ö¢A^< w±v\úÉޛ¾uÄWWüNOïÆ?úi=—ü™Oä3ƒñA*ËÂGYL|™òä.H]QF’ÖNÖ`Gé*Xï,¹7YGÙP ×°@F˜ñ¬s·àŽæ15‡%3{f@ï«QøÉؔ'áRܓ^Áê¢Od8¢3ǝb¨‡£!ƒÔñ¸?ßs:7ÀM‡nª%Q½ÇÁ¥çH z¢(IgšFO)Oo©NËìQpº d]ek…bbU¾V »Êؔ² œ©ðLÈِ´E⥴)myûl!s¯¤n“¹± -„“rw‘¼e—-eo¬’Ù`;ŠŽçî(yˆg+yï(yŸC䒹WÉ;4’w2©{K©ûŒR·Â?«¼=6ò6dm—¶E*?£Ä]äí}‰;šÄM™Ûåí-enJÜά òfÐä,HwÚþ¿ÏýßKª’éŒ3³²¹ìΫó®ü«ýÛÐ-ð]ÔþÜ»Ù:8 ¾þÆ¨ T::8^MâÂ8wÐÀã H>Ù՘®ÿU·gýïéÂô~f0ê’'ŽNÕH]aÔÁLû“©'sܪ  ßw -xoÀÓuÿÕ}(Yï9.OΡcnÿ:ôïåñ´÷ Ýz­ñ½wƒ}kºßwî»Gw¬–û?µ¯ÿÝÒ¢ûk(Çxöpÿ„Q”ŸÆ•C£usvñÖß»Ã×Þq=&}〭#[G¹ÎÄÒ=±€Šn@E“D+<´C ªÇ äðÞR,8¥ÊžÉN&Šß°7!aé=ꤸR°`…ë]ïù›ò~@w5›XDˆS7¯AÌÉMÍK se¶Ò™¥Å5˜ùlf>¾>³Ö§å*••]Ì-Œ¹ó5{a¶ý8í`ë«W×ïÌ£«XV¶®ä‰Ge]ÏÁ`vÊåÕõYÖö¹ Ù®ñë:—"+[W{²?Që £<™¼]Ïu¤ê8ç.à>püÀ!gÖ:|a]»Ì†=³÷^€ÃÁ@‡%è~/èAÖá^èà -”8b?ÂÀúÒâ¡Pˆ´rpN+÷çñ€ˆ@4í᠈þ‘]tl|p'mwKÝKí~jv՞!ëd¡4À>2%ÈýÐú…{d¨ÿ]/,,Ò6¢p)Ø)â<ô1-”x©ÝX»>WƒjøÈÓ4÷xtœEtÎfHÝV¡vžj7™NDÒÊÍû|túi Âa¡ IN{¸ï“( øHü _›Gá¥ÍwÄIí«Ý'·d¦ Ü…ÀÁŒaÎ4ÉQœCÍW“ÐŒL:ÄÖÎ|c‡ô9èS›ú@ÓÍ×÷W?ܼ¼¾†ñÆÿ-Í mDíÉ$’1¢äm ‡g‰¯•£±Œu`Ê[[díÉMyPóÙS{È °2¬"¾´ªxÚ,`O}c7N'"8/¦ácøÀÁÿ’Ýcèí_4ÅՁoåô"=·p˜šŒX`Œ[/>/ú–Á¡„(ºÞ“\»©¡¡%Ä·Õ^j8/•u˜Øi¡Ö@]…¬*€õ¸Í Òj@݅Q.E{Q›ÁÜh1[“4΋å \(Ë®lˆÖ]TóeYR}'œK- Ś°-ò‹Ņ¢¢ù`(s3gDk6ŠI{Ñi´,e³9h1¢„]E—–Ü^QŽ’¥©%x‰^êŸä%{9õ²­EZÜ5¥Â–n¡§Ú/Jh -‡ïÙiôeÿO^•ù@a3î•Ý‘röHqç ÃGœíÝ.hQ(†ÏQ7×ðæäÎÛºgûelMæÝÖPmìKفjOXÄèpÏ]4öêϞ-6謱ºe¯ÀÖ&ûE÷ǎÎÌÎà£BgÚROmeŸÓ®†µh]Ž¶JaUÛrMžq-_öÀUýاôcÛ< -ÚS ´z;Z¦yv4ȄjCë̆iAS¿õì^ë33øƒ%·« ‚ùì64ú«iC{Ìg]½Ösc?Û1à6ísÃHº¿ZԔ¥Çz¢*S‘BÅs­úIEU$PÅqˆû¸Ÿñ3ïá}^ìßãÈS —Xž">¯;ûH}”à®ÁÂå,9GÑ9 åd•}ûwLIZ"tÆ#øÀcØÀGK±µôËXè]¢ŸKÜsy.oR5SÂ5K•ªeTs/ªPU{jü²+4sf(¯e¼rUKö£”«Z¿Ré[UÞ°KUþ°¡iO_©ð¦Äþn©Æ/ù¥*¿Tæ³Y¹“„2K®ÒWµ¾(öƒg<éõþ¢QòÏ]—ópká¥óúgö’½Ôc­ÒÑËX‹´šRcúúEiq×KèF«AsR…CV†°[”í^9]•CD ]–ƒ;vNj JÒb§Ÿ&OÌgÊs*œ£f‰ùɳÛüüÖË·^85˜b‡díCR/ôûD“û‰Úµüã0ãü m‹jŽz’jã â'óÚ®;Ìm…Žœùk~;Òû}GL ™h–ÂQ “œ[,D¤rªÎ)Oü6™ÎQ²ï‚Ÿ˜®'eG-CPš{Zޅƒöã"﮺š -|»u3æ(…§ØöÉƒ\¥ð•Ä´Ê]NœEmðkÞRùË`Êe¢™>å´n8MùS—ë’Ï,ÀCk˜Tá8*G-¸Î1î3)+´2FçHïãO^¤ÅG~ûåq®÷QåçÿZ-~`\ԓÿ<Úâ„öì,ia2Ësr“–šÄ–m”­AjW)rSq¸OfÕ"\E%'†—¥SÚ´.\~iœnë”Ÿ‚,%2(r(LãÙt§+¬¦võ×ÄèH†ÃÛQŸü¸Ê»‚;Ñ£ò&á(úggqsðôvæH×Rö|™ÓÂÀŠ[¬ ©m1aïE£YµšS« -õ—µtÛü1,úف²Ÿ³F=ÓÝ£e°|éO+ãSŠá”ß_¦§iñÉuÿ-µØ˜ÉÎöÒ oeù¦ó([¹tÏ,oÚÄ|i3¥miòšhîê-3ÚV֛:×`䂉 æ-¸ÓàJS7šÆ-œ1û™F+ĒõŒ®2O/S ቢÄ%<%µô:¹´§—®ÑϾ07Wqq÷V°¨„ޝZgMlÂi“Û¬º±èÂ5,rœ-]WÅqUVÕeÕ:¬BuVYfËþ@f˵›jí¤:âžzöÅÊAuÌ=µpN=昒8¦9¥žà†Ò °§–ÝSŠÝÓñþrÌ µW˜Ïó³–ÿ3Zü™£üÌQ~æ(?s”Ï×âÏågŽò3Gù™£|¾nöG/?üø_Ò{Ÿ†1÷3éãœe‚’RTg|ß!|ïÀ?øÏé#ÿ³6[|úëÃ&ö'p»…gõ+Bº•ßLý MlÂx2õMº­Gª¬ZHÒp¦ÍН„aN‡ZXW©-¤tŒÐÒ?0Á# À#„àßÎWì³ûh)§ÝéÙ^Ù}Xñ–Ö€küyÌó³ç¥ò˜ù -é æÀøý+¼ò~¼QcÁlo)L F®½ç³½ãsUþf[jS6í<1cµ¯Ù -ñÙYÎÚbƽÎ!ìÆiÁnx#¿qÉ.5ò۝š55ÍRn,5é•>K% SV&•Bì3ÙV72ß]ûÀÜv]çn8ð#P¦ÏצÅFÇnèٜdÚ.<û€˜vý4žÕ¬ApÎh y¡kÀzÿ,_óùÇçÓYçaÆ9|löܜîËrȬÁ6y1.Á¦O‹¦=°è!˜ë -¬kB¯€}´‡Ã_sB»ø.»êÌð×}/˜ü¸TüìEz°°÷ôð Ìe54dŸ÷䘸ä ëßüu áà~ëý`Àºa•÷·Í@¦˹çú­™~cs=ŸfÜ2¥‘eömâ#k>ßÉóøžZÜ£¯k:Ù4¦{ â©„&ƒ,Ít¹m-^ûÜ ¾šHl¸áD˜˜4ÞþDUŸ[u0 e¤;®omó -ê>ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£!8~³J ÀÉ%ç3BŒìɧCŒ¬üM²Úó¸žfò`×!ýGèûÀú¨ð·)OmÞÔ¶Ãyê“wa>¼ ó:«g,ùیÝ>kb[Y{ ¤·BWÖëϜ;¸k1õéò¼ü)Ï,òsîÌå¸Ç¶æ䶗¼Ÿ#w¨I¶õW|¦š14mDê:½Ô¡SýS–\Š -PUyJt)æ³Ä’úá·¨õI¨,ŽôlÁ–N1WvµS‰í,‘C ô¾k?ñ`oÃ#)¯¼ÇÊ -¥ïe$â`+«s–èóEóè ¬äœ[ͼÐ*l{Ï3櫝äMéVÍ4…iFP?ƒ°K˜”+”˝/!åzúr›E½£½,¹½J~Þ[þž -”· ¾ù½µ¾$ùèeë}éúßÌ2ÑË ôróH›O ‰Ë–›B3SxVŠÇo+2W5¾»ukaxß6y¯Šá½ä¾jMï}î(6u<ÎÝfÙL·fŒ?õœXÅ,ŸÍ8_þ4)_yãS[ƽŽ”ápáí6‡Jÿ±…×´Öòá-:Уº+Z‡EqYô{ðþȞ ±Í„!sXdA¬×<%ÿá2"s»yˆPð҆-s«¥ƒ½žó†­cå ¤ûž²sÈg+ -®mˆÿú‚ôOÒâ£*‰´xø7‡/ Ù¿è ½ð€êØûW‡L{™E—ÙEû½]UöԖ·gŸšË0û…5£;kv¢Ãù‰úÕ) Wsàô\4Z½AŽû yñ-9ü$<}È~æüë ҟÔâaÅb<¢Š˜¢Bûõ²ì)9«\Û-R®ªM®J ?/9ÂËɦ9ÆõäQ±HSï `¾¥—,ûãH™p @ą¨a”w–é1¸œy-›#l‡ -&‡åv΀ñ¨œ*)ªµP¥Ä-ó"ª„HÙÐ$BH‚ÿ ïAÊ;¥‚yÍ}oÿúÒ¿ù—ª…}0²ÞIßÔþ·*‘ûüŽ®¥š:S-Šj^)ªi¡âZiTœOŸ½?¥W(ŽÝ_j…ÚúþµoëkÛZ5ÈÕ£½Á¤:%-Φ`mWØV¿„°¹Fph põê‹ì÷·n-{bqg¶ÍÇ\šû9,kK½~bvwÕ2#ێ9’Zªp‘¯#õ;nÿÕéOjñˆÊq¤˜¢Âl˲¯ä,• FA:t…´èNXÙZ˜z­Äy“¦óœ0e…9æÆm¸ÓâbÏ]s©ç@Çg<ÕË~q—öîüìš. £ìM¸®0r8\ñ/ÂR£y˜R>ÁG›4žô1µÁOkGj±fBÌ»~˜xϖ0Ó>jÏ1ÌCO˜7 ç­#±›1Ãn^瓛²»Í>è«rÚ ãIZ¾ÉG7ñ©Ž¼xБ׈܃õ‘öäÄÀ㸇ÖYãuúæ†f$óZ¦=.·Æ–®ÊëM§Ë»b«LÖ?7÷»®oy]‹ÐD:[Þò]`«Z5½s•W¦sy[zÍÂÔi@Üö.‹æšÅý»@ææ‚Äåm £ß"orôFªÑŸ6¶/•S×A€¢3ñòÀnÈ)•Ëò¦Nv×Àp уæߺNÚûáOÛýz²_è—U2ÉÍ%ØcVï8îG<üÉ;ñ08>þŒŽ‡Pø3:þgtü_?Í÷¡EmõOˆÚ:~݁)ŒŸß´<£ž¸Ÿ¾YÖõΪ3»¥¹Ü[Uo®Ê~sÕÔÜ£U/æ-]Όf¿ËõùQÛå{7w,—â± -ŸºêÒaA,íIbnP÷yîÅ×=rÍÆy}4~¯ÊCÓ¡uÝôPÌ#q!øH\`m3¯b×WTì½óñhÀã û8],ïGyöS¹öã›æigÁ“®b8tt/§YÐÐ@é¦y¶õoÜÙ7Âú‚âõ.úäÆ~’¨Â¸¾ùÿþßÿ°ùÃÕ¹¼ÿl›å¯u);Iï#¯¥yöÅ^Úâ’½$-nŸù˜Ëè%QñŽ³sKR<4Hýe$ÁñKÚ+¶MôÀ§DHìšk!AIö#c$¬xÞPOî¹6­Ì8?õ•?{æߏ¾ô‡‰ŠŽ¯™’ø5Úͪºjjºë"cהא­gIéúÜnò}BýUºk3j>jÐ|Z\ʁË=>62e™¢¹Ücäìpš‰'­‰¹P©û\W*µ×@ùŠXD8уٮˆö®Ý²š$菮‰÷%B_¦A7s7=ɟ ´^gMÜÒÇ5k¥Y1vQÁádÿ‹´"ŸO"/rù_±ÅCNµC7Á§%Ǔ÷9ÞÍå`*ëe"k‹ÀzöÅ'Æ`%Âª1X²Ê>: -Ë\![µzÐÞÎäT—²L"s~8ÌOv§ÖÇXުŴÙO¶:~± KŠ¿³šäOÆ[!LôçiþΞ”èo™æÏb·Dæù¤è-ž6Ô.£·d•}tü»@iL†ÔF{ëb•ì'N ôóšøyMü¼&~^®‰eZ°ȘµŸÿëÃþIÍ[Byñ»»Ûoîonnn¿ÿòËVuoóì‹ß½áï‚þî›Ë‡‡ëû[ÑêO_ýøöí%´yû×fžOæi˜á§)l†q<édv6C?ÈâšôOõ¯ü þ~§?ê?þ¨?ÿ'ù÷ÿê_d(6¿ÝüÓï6/Ÿñ©ß£Bé©4¼y ê^›ß,Èå½~Ó6q¸làÿy~zÿpvsõpsw{yÿãæWjy¾½»{%cñ•Ë‹ó—7w÷/¶—Wÿ,£÷âۛW×/~}õðËÍÀÿþãßýïßi+gúÑ_ëZpí¥Cû!rՌ²Z²e‰´Kƒs¹÷rœsæÍ?^j[ˑ }҅©ßÄ|DI°’嵐MœO&‘É6ÂNÐZL¸¢xÜ Yª 3ØÄxÒËÜ\ñ±Od“‡MN&؊q2Sތó‰è¸4y:éƒÔÉìÈ¡<7Ÿt) › ¿Ml>±»!ŸÄn‡ÜÄϧ“C°>–ÆÑg6ÄÐgém’^D(݄A_ -„ œkä3DB¶Ç„Ú‹†³‘iϽ¬Â)ˆÈÚ0#Wt*™Ü8€0„\>nê¤ÕaÜŒÓ ®¨Ú 28ý,+cìOä“ðV#ēџêODÚíý͇)žŸŒš4Éé¦édìó¼é£Ìì4•ç¦“Y¸Ñ}à·x©1Íq#íå·AÇ sÁh`aHþœ|FîËþDøF,ä“Nô½Í(C)ÌRò&Ó$¬€\'Ús2ô&¦Oö1£°ž/.3?Fþ<&¼7f~.3°!ðÁ½0ß Z]4o¤SŒèF·1ž[+óúùAÖÜ$ãÛË·Éó¢®L›i” ŒòÒã 3;ϛI:Ãës²úúaÚ¤ ñ™C)ÜzÆcr† Aöj h#ƒ—„§×Õ5`OHcˆ­Þ„N>i–G™ðyƒ=ÀÅ,‹SΛ9y±“©“‘µ¯˜¬*t'Ýdy<ÊPYx\ÝiШÏÉL‹ÆŸåž&¬F©Ÿ§ˆÍÓE¬òõžãsßé?ÓÙÏ'yì2á¾y½ Ê:C–J.9Ë~‘E†8ÿl+IÞn–‰óJ²—Ʀ þX:ò¥š,ãyBkAVœh€Cí§ê’ÅÛÔjå+¼¡ÕgÕ}>®#c„Èòz½¤ŽºÀ‚,O9ÆGäPNBÝ8ɲ.›;Yo¢œ6ÕFí¹6T֟=W¨Ã‰èÁ2wÞP2Ê*hú3‚=W^Ë«•÷†VßW?ýßÿÿýãœ!_½}ñÛK9†wwo~|q÷ϔ_ßß½{c‡ÈáG~ýæúòáúå éd}Ứ_üróÿpäà‘•§Ž°*‘Nfºm;aj'Ž°©4ÄöÄIz_½8c>¾%cƒ}4ÚZ®T¤‡€ÇWVMÈ!l„ÏMY¸p/ܗ5kYäF±^Î0ë‚Õçd›jCQ›wÂl5ô¹Bí»Ùp°¡ô“Q„3ÊáÞPôÑY¨Â¸ü«3øá¼Ù›=N kO†% ¯d|…é¼^RErKë…aŽ"F–ÖãL’ù±í;'{ªu0”Aؗ7â뫎8©½LlF_¥Nw±wÖ5»º¾‘×*ïìí¬>m½%V‹0áƀïur”Ð{%çZ?YJíŽ)`³Âäó(g¼-ÁAÎZ^a¸#ÈÑØ)ööÀ,àr¸ -»êF$Œƍ%†¾“cIŽ"¼q×vÚ ǁÈSL­>/ÊÏfå Îr@ÊVŸEØÌr^ˆøaÏá°2³09#6<{y™Y„%Ñ]„ ¼B–'œyÊé%TÑ®ôÔÉò „"9Ý0°"‚ õ³ ¨°–.Œå9¡Žƒô.‡$ °ìO´‹„S73ž[Êþ1„MÓIÒw줇×K*>Ç·|p¹Ø°Œa†¸²¼ü|åƒ-šb­$’°‰¦‘B°¾ì±B•Ù–aØx; ƒ%Ûí9¨rÂñ!¬ÙρzH -"ò“±}ÊţΠãJdAþ¨“E´†ù…'Ԍ9ۅ¯fƒægN+E•YDöÜT”×Lqy@R!j(¢}Ì},2YK ŒŸ€eªdw‡€Oè1Wå…e®i9R'H2É'aı$‹³“ãDf ÇfŸša:™«MÍ6,O¤‰6»¬¼„»¹9g¹ úš€gÀ`wÐ0¦!Ðµä8O²ÕÀ£sחý$?“¼¢(ÅA4 yUIᩛ¹ÓX/ÖýcºWl®R‘Š*b¦|ÒC¹÷Âϑ*§R|­ŒSS+2Sß´åëӞt² G%­iKÄÙI¶QÓ©QìQ;¯èà­¿´F?s˜x“ú1Ï9bq²¨Ù"Çc`;Y s\PDÌ˃O“±×rÜ4Ééñ«Ú«QìÑp2«o+ʁ ´YӘS–½:Ù_ÏóOXk3²o8F¢&‡,=¿^Rš±ë‚÷ˆ×Q¢u#`Y‚s)d ªÕ¦¬3ì 9Áú»*‹O©AÖ @ØÞÐ`_åýÁv}y-¯V^¼4´þ¾÷HzŸdà‚ÚÁTÕ´ÀýD¡p{”‹Üi1hõ£Ho¢Â- ZlE›Ý ¥ê‡¬¦bЂ˜+ëm\´ÐÚ<ÂD`-ðRöW,Z=-%ÂC-²SðÄbҒÏ?iÝMZ òB ‹V?Œs±hý†AÆ X´È1ó ‹+ìWfСÒMÓì­R¡±g£Ž#NJ{otaâéݞÕ²ò<-íY ¦,'B±g¹ìPìYØv,íY`Í87hÉ΂AßíYØiPOæ,ِ³R¬YÂòē€Æ,ù1Œxç֖Fºj̒6Bx̖%¼¶0e‰¨žä¤qK̤Y¡²äüðR ;V¯âG5da »,bd1dIÿ'ðS, Y½t͍V Y½¬Þ¸vÑè„s/ Y=4ã4» Gm—åÊ«œ‹zaÇ¡Fɸر¤g9ÂeG;ÖÞVÛ?æÔԏK;–S‹ -‹#c1™‰ª˜`raƹ6L¹Öéa6…­¯4R ãR¥š ÊÛ)VªÒÙ–åoTk•/)í¬?mÉÎEŠ—¶¬J5øf˜£Û¨D`EˆÚ¼4eç"¢ª©ÖiǵBhMK•j¨ÚÙ¨j­)ËßÊk•×övV_÷¿•%댆 1´yçLq•Y¶ú„#Æ]rà^+„^ ÂàT1c6T”Qz›™;8dàû™v„ÌZŠN*+sç…ù&`RŠtW ¢±p›Ê)/ÞON0¿„}5Úh5ü“°õœÍëQóŒÜü`Tl“nÂ{ÊÑ',I5 -2°ŒÚ(ûÂ,ê 8¼Wô!Ä®RK)ƒºo„HZ\qbˆe&°Jæ)úĨÖe:6ðפöq‘¦J±1„²i­8ÀÑ4¥?—ݐ>«Nщh»©Í@ãz…b–óŠõ›Jc{_ùÊH¸,þ¸òúAí!‡/n?Ô °àÅï7ÆÉxæø“³]dH°… -Åôœ¬Jo­(Œ)Cw¬mUJ×°¡J–¡0W…U ýØôZ(WeRùvµ^ùokïKß#}5¼K\K5ìÉ:ÝÅI ¿B7®]¼Ô½O0H¬ÜÔ´YóÑâ€_Ñeç”ÛEæä±,²â©âXÖ§yª²ôT׊Å=pW„–R³Ê*Ó[ß4μ.Út-‡é¸»z€(‹!^¯È8¼‡©:¬ýŒ-^d',Öµ^ñG׶*Å:]:®yÓDàAȦ=¯tZKßuSÏ?ÀÛZéOæ¾G¶‘Wš§“‹æé¶È¢yb™Ð„³Ð<Á^Dg\ó„~&2çìš'l4º-TO7"ÕÓmE§„U<ÁºP=¡Ov‚ -ÛdQ<ËÏ ½³]í„Ù¦.W&é p-´N˜Î҈·óŠ>|EëÜЖ«I#K­³’‹ªH;íE™Ä?èÐ_j´3A¿©ûÂ/½1§,´À†lêbm¬¨”µ×…îY_¯Vô/óÆÖßzÜþI¦ù1âVpø«_¯ÈàHô<ŽÅ©9©F‚ÝÖAìqŠÛçigm*B €±6æëÕ‹‘g˜)Æ¢É©%lnjz-·î›sÕ+ú'xcëoý }ã6ð4¨zØa« ÊȜ:e ”9†@ãú@÷C@^,°û” ·Ž2;ZEV ½f°ó½òVWuÁ ;À?,ÝÓ4萍>Sájö!ˆ£O”t2q½"èÊûöÔUã8s¯s&_¬öQ“>šfØ&„ûÐ茖+ëf„€>D^èáË¥S.“7ú‰è'úíáfw|¨è‡r–$zï*BŒC¯Ns$‹ì/ò(WU”ÉÔc‰jÏÏÀ)•;´5ase…ÀN¸~F‰Á½lù˜Q¡QòâišÕ]G»<,yà ž'ªS®]÷k¡ðvY§&Ù^?ŒnÉý±¯:°)ÀZ"i,ÐïJ.V -,£ÖŸ„ jÁÓT ¶f‚"Žšz¬mS…`]ڃ… \[ôl­=ÍaÛ¼™×ó·÷¶ÖŸù -’C¸@ƒÔ’N>€pú±W$C.óEB<é†â‚ÁúÊŒ½0ÞPu…u -~Á®<¥t¢|Ù7â$VZm!LÂéŽE®Ø ¨6 ±?ŠºÑȐðaá֊i.@ÉY»à -U Ǽ!ӊ N©*˜¬Pz"©Ê•œB‘SÍÏ' Ð‡)›@a˜y!i'×ÀШï;•÷•h§¹³O-çiAVc%Ž+å{ؙ66·Jøߊ€~êlS ‰NMßr§†ªà½rµw4 -ÀÓA4£N‰nhðØ öIšSýIe.©?¡y³4Ú§.,iS›’Qu^šÊFK£YûiP@E°Z¬8Øޔ¯;’ê)̀¾È[¬ûË~ŸÛ`y·‡O¢ÕîõŠ,ÇO¦ÙE䘚=ðò.<>F~e¡ØæO`¬µ¢œe±mÊ~­°#n\ë7M30DÁtWû3Š=è/æýå½±õW6^AY¿ô¿aåó({½"ÏjBü†ž;(â€e9 -ÏsŠ6zE%5eóqјS¬WÔÈI%àÚÜ»0´Ö^ Å-¯W+ú'xcëomÆA¦gŽ8—E$óõ’ŒvRîZ5Ë`Ba9L™('8èˆ_¨õF¤ M[N)Ú£N†¨D×Ai €H1¥OûÙ8GyµR«~Tihï3ëÀæ+"^æTO¡xˆòÉYq‰"¼©y‰’9¬²YC¡?‚ÝÆúB&tm˜¦ÚXC±^íQ'ó¦i n‰Û^rU^Ø^Ï+ú'XcûßڌC€KzP´–è?ŵçdØô ÃCvÓ +£t´HS¥\é%Æij+Α›ÆœRzuaÂÈf© We —wjsZ”—+Õêg•–ö>ô'38ª‡I# vÇy61ïlA»ã˜š"Yî«GÈî(€w¨ -tI9âØô˜hñ6Èû BÑ@>ļC@…,å˜wŒ™z^ èuCt’Þin§±¢Þ)1ê¯ÀÞÁtü†½ãûÈrÜ;Lq×þ8® ŽP¡[Bß¡ U‚hÎSðZÇ£;åÊÇ'CSÑ íM[…R:u…ÊÈù ²Ú–ô5$J¥ÓBqù1Ž¡­çŸUšZçqÕÿ³ààéžïZɊ:)s,1YKsE¦;Å,"†`o*Ƚ6åëҞt²üS6M[ÉÌѵÓԚ­ý弞¿¾·µþΆÛÁxjE„ù"2€Â•%4»'2>‹ €²ÔD™–àºÁ<:2Ҝ†¡†8ÅD#¨õ -ò»ä e‘Ém!S{ŒåNÕk,HL¶ -è%W¿ª"ü‰ Z)Ìþ¨“Eꆜk”@Kx”€SLr²(Z±€ÿ‡d€‰J) ºŒÜŸ#]‚:¡ÂTƒ6šêû– ¸FÔ0W‚àñɼçTt¡”4jL N€H ö`4)ah¾ª1&èM:%€yèû>×0œ5ÈwT$+‹€v?å&N§_bõî[¢ €³Ù#ìäõŠ,*.åv4>¿|nB -Á× Ñýµš4-9ź´'Ü}º´PØІ'8Å-ïV+úû{cëm”†‚žŽmì=Š´€ûìØ ôá4”ØFÈT2,dxcØa¨½Å5pSњƜ²ìÕÉþzޘÂú[›q(Hz,¥4º ½’…¹ëâ |‘O:"Î xß)γò¯K@m¬R¬×«²Ü›­¦6ÖÙçÕ^b<À_Ï+ú'”Æö¾õ=Bóg XBâJ܀#âà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q^eˆs¢„G8"® 'hqOàˆ¸PPqQ°@ÄyDCâJD#â<¤`ˆó˜‚‚‡+A‡+aK4\‰+p8\ ,p4\ -X‚áJlcáJpCáJtÁ çá…óø‡Ây€Á -ç…óƒê~/1K(\ 2p$œG8Îà –H83p$œ8nwp؉„kÈ_sh¿ÜJÀ灵^‰%¨mUJ LkȆ`óÆåV:]¢áüåšzþ¥­½/]žç/Ñp Ù0læ_Pn °ÃyÌ@­fQMCNi‘i Ù lµ-C¹Õ.[0œ¿˜×òW÷†ÖßxLg­îNØù„yû’“a­H* Å¬¯4KOîٙQ̺€c`HmEaa!Lm[N±N«aBɲÉÚS¼1š^[¡¡¾]©W? ´µ÷¥Íù$Í}z‹šbu$0‚×+r¯ÁI°ùˆlu⺠z‹H¡RÜØcš™WÄÙ9…¶1§X¯WÅRhä ÁMcr@l{5Š=ê¯çý¼±õ·¶£ú :+ܕ]Rõ%¦¹H³• sӊã¸{ª±3Àa¡˜&WÒ¨xEF(Æ©i¬R¬Wcú… Å-ïV+úgycëý©$dðÔɒúôŽt©ÔÁð.†Ýk\ ²^I -ÁT€[ÑR[Û®ŸÛ¶œb}º6id8kÕ¨!mŸ›N`OúËy½òþÞÔê3šJCOG½Ić”ˆíd˜µ¢ -ijRD®'$QÆfæ 1Š}³+mÅΌMµ1§X¯þ¨‘eµ1¡ˆv>6½ŠÏ…¾^­èŸà­¿õ³ÂÀ,uøüþõ’šKjˆÉŒ– ’Õ Œk*ń‘±d[ôŠ"œ!TӘS¬S·÷(Y†ŽùñjcC§!Sµ×B¹*﫯W+ÚÔ¶VZGðsFȽ'ðí3ú7sIí¶€vâF UAvËgw©ÏØ Ïê®;#V%WT7,3¨;arhvm1ݲ-„i¤ -éFÖNàŒÑ=!-!Þ- ;2]öXñÜ0ÖÒ©\àÜðŽ}·@sÃÞüD»‘¸ÌP±ÜÈ|*œ-”[úӈ†‚äžLGq ÷Üì$-Ž;­æ -ãN³lê*Š›’6˜ÞÄ S²¡Æ ÄÝ+в¯ nb€`±\‚¸:ËËF_#„9Êæý7ó{6Ï 8ñp-‚»RͨŽ„›)7¸lÄӇ=üv‚{ƧBMòŠÙҝ²¡Jh¡Ô•jëڐ¡²k-z»¾V©æ/n í}ß{@Ÿ†Pet°aÝvrnÏÈ¢#?ä6|ü¹nÃà nTpÛÂàå܌¶Í|@d- ->*2µgí̱ØØÈd[¶üÌШB HØÀ°εÆj‡–ÔU€v·Bfw’ ´4W‘=@ÝY㱡½W,ö`oRÖȇeReíbŒŠí/D¤ãÂXAØ£µ²€`‚ƒ„hãëØk`"0¾Kè5Vj犼Fœ—¼ÆŠc4ñx²±Ã]c€hI*°k¦(Žq…ºæ{f26Ð5 ׬V0×9a¹î™jU\×ÅY ×ûËu;€w˜®âºR %ÍdR ¸:3ÙmL©Ï«!ž ›j;•ÐBŸ+Õ Òµ!CQ×þZ´µ¿•ëk[;{_W¿†¾ã -h]©mVuO#¨!­1Ö"ä2²¦B¬å|žÚfœ°XjD—†5mÝ-ÁÕöN…X_ښÙû¶úفñØ Äùõ‚Z Ð؂¸üÓÑÒa´d™ T5ls}njáàƒèåíÂß\©†ƒ.íPÚ;káÔþJ¥’Iidýiõ«‘~‹ÉPêJ5ð3´oaÓýÄ0­D´@L¯6ªW§6ä„Î\©{® 2ºö×"¨ëk•jþ⥡õ÷ÕO‡ -~úxº ÚYö‹æá,€hǘ_uœƧ¡±^MD¡.6l', ̕jPgoÈÀÐÞ] ™ö—*•Ê—”FV_vÌÁÿÀ\â He%$}{Êe))çxNy\!*ábï§T©Ùº™ÞZrÂÛèԂô† -LÒû[À)ë{r}÷ÒÔþGþ4:Í'eý8ú"ãæùW·nÀÁ_—zu­ï󛻫ÿùúGë!v›ç¿¿¾4XüØtô1Þ³ó7/~(]{¯oî¯ÿ|sýy­WoLó6òþ7×oۗ9Zý7×ß=¼)¸¸¿»}xoíoïÞìUpï‰FõèwþýõÍ÷?<<õC÷—·Ggöü™Þít~ûÒvð²§ÿtóçk\õÄ¿©æ1Zq¾aV"ÏtʪrLKÖ¿7=ÜüCo|*]–*~kѯ^ØädÁß´m¦.›ø«ÞùD¹œ'³£Ž¸H ZNî‡N/ïÊåÝã2yNԘmäŽ=û<¨kAÖxv€ òÍn_#_J‚£µ |äAÕoàžØ|.¦áØ rM¨X;•„z ¯–£BVôèÞ É5`z”ã]T3:{D¦ó{'L•ôît³]ÏÁp! L B¦O(ØøXGê¡’£õ1tJÈ!ÍJCý:½i (€"mÍàízþRÏCÎeý69Õç˜Óbæ̊”̳ôç‰y Dš•okÉãÔëƒaœ•9+9µ c£Á°y4¢e¡rx@ §€õ¢…Ç%U6Çq*³‡”ô©ïy [Ô`w|’‡Pù¢ŽßÊ»‹ÈæµFv¯I3Ì¢Zßé"*L]³Ä‰¦•‚‡JL“ÅŸ3NJš‰“J&g5ÏÖkê&¦öuo“~FßلM½ d†`’bA]p!ÕGGjÂ=îÍ͔>1·1•Ùz)!!Òí1·¦ ªq„Õ›†>$µ¡wŒž×8Ð H úr#V Ù`ÿè&‹£ƒ™ÐÑnWVPŸ)è ‡œ54˜fåFÏ!Qï)·é‚´¶4Àb,”¨?rkfÛ<¤Lþ²À†Î*FVË}V¡NQãšGRbð« 2ÌU4p…ÒÄدÀµ!Jê@|î‰ÄâŸ`íÜù“#²Íð~MíÅ wêÈÌ~0òaí!#ê䱅îò&8b; Ôp;ê~°‡94υ)ŸS´uxåˆÔJ‘ã&ýyt·<¼Þ1cÂx“9ËÛÍ£¥ÀwäHfœË2SF ½…1˜ IO3Ó­X˜XÁԎ'©]àd\" 0õ,C#îmë-yS߄‘qÐ@MŠiJÒ,Û!N³:ÌÓ{:F#MäÔ¡ ü0R:gø\àr‚P];° 뻣y%k-D²ôFf Æ ç©ˆLî9fž9k¢;°Iü<ù˜t–Ô`‰r17e`mzoøªÌύ`F1ÅÔh"STtFBh{š•‡ÛçõÚ_JºBiš{Þâ5¹Bëò/ Ì¡ó<ž bóMÀD2™ŸhBà9Ê7BC ´uidcÌ)½ñPF¥-þ\ízT*Á–º’S6 Ö7•5EÀ8´1â†Ò•Í^:Ô«“‡ Ò|‘å ½Â¸\™¨zÅ!œöoô>Ò= ˆÛ‘€‹c+·O)3“|ʳ ±ÙðÎ=%dÙ -ažk¸”šò·FhºQ×öŒ½:•˜‘|QNjå(˜ç,ӓq"ÏêÞËÒlW,LHè7cH˜ÔÎêd‹§§ßžfç1r§(«e•"q2Æ?¸·Ô s,ãV1He?œ¨SP6æâĜmM€©‘€# ­ÓÍ=fML"FywÝl[0‹“ÛêkëmOHe/â”~œ ¬.“^±-012âÞÆQ5}ÖlãÓTïˆú0Xwê–á—Œ_ìI{VFÊ8F…ñážÞ&«ÁÀ‹RÑåé?0Õ&®?в!x»ä8z(úÄÄe¤’_Ð!à«7y -n±^ùµ='L/ã,ÊvZÂ×Ò{‡ÐN•LøTÂUQôÜ-ÕpÏ÷b´DDH)#ìVX»òؔp–Ìú2DÉC<‚m²„ üǀò8‰©Óˆ„z&œtàÑÍϲâ'>ÕûÑ ù9%m‹ÔÄxaĦ©ò‘f°•A÷júÀp!$¿gqCósÖt‘VôŠˆÛ<"£Ú#@c#¯œÍª–/")¨0<{Í õaá#ªy¢av !Ìz­LîdPñ\ç—! ¾°“mÃFIŸ£¦#rU>‡Y -£ž•öyòZr2ƒ¥t˜!fáu´Î+Ó”‹`ƒçÔzº1!*E5½Í¼m ›Év‚¤œy¦Ò¯âÏñí§¹|Π‡ Ñò'DøžA誼žt!³s´MAÖ8®ˆ`JlpȄ1kN¬]ó9Ú±/É©˜JS]¨dr#C!x[#Þí99û0¸Ô'‚¡O‘| y¼%)dã ½šb¯Ü°ÈUº4kb®!荖" hV鞇j§*?F„Ž§+> àÅÄÿÏúNœÔéç›ëu+ð Ps0xŒÖ¦cÄ9gsˆ˜G=Cz­’½efb¸º".ð4‚ö&û›§ WAbÄ1F¶”K*ÜæÐʒ¼.J n{᎟Àɨ0Ïǒ á¦öÞ´4+mª™¿; Aª½˜ÏQ€òü¹k,W€L4^sfä¾!{”ForZìôuaÄÅû’s̚ˆmÀ«Á§t0E䜐‚Œ^ÆN[Fà ‡¨1ÃàHýçx嚃…€ƒÊ Š´Ø0 䒰T–Üò´S53Ÿ±Ö@ÂÀ$hGN²&C€Ýa!C5ÅOP e‰Sâ©lû ìÔlj$ã-&Þ‚¥ŽX9Ûôg[Ð&^y%SsŠ5 x#Çݶ ªñLq+Pq$••9Ìͦ9ôFRÕç)Êe d4£VfÆQ†AÁ¤8|€Ú¶PCQਯ€@–xNä> 9ÐÔþŒˆLŠfp‚þ¡W5L )6 óÜM†™+]µ+šŒ°™r4”%6OCŠ[aƒ.L¢Ç£…¦ïû™a˙ŠQ<«gÈ4fz®µ»ÙC:â?2©X’0ɊBŠûyT˧±Íê4@âmåüxOjq jú˜¨·;5šf]5€Tdº^G¸1©WÀýë¯Æ -…G–Ç '³²rpOÄ癅 «pœ™:Q3­øÚe‹¢VæÚ :+À’^<Ö3ˆ ·CÍõ1Jf¾‚&|ã  Å\‚Eß3G=ù†±h,e*=f}AÔbÒÄF F,ð•«*òÓDsjЫ—8u#¼-"ic.«©„’峁¹“1Q0I•3LGK€Â„¾X¿HnÊ¡Äñ8a©'¶ì9Ès0¸¨NŒ ™°EªŸ(yªCú骻y¾,Õ!4òh”Y󌌾MØÇ<–„$vqEœéôÈV;%3õótÐO Y%{œôÔWFz?5š–3¤Í»Yƒ)ؖv -Ã+ -ø ‹Ãúiìõ¢¾ôä£ ÒÅtôÖbäØbvÓDMʘ;4§¦Ó¡× ¾äú¨G3³¾/â/é¢âR)¯Ú£ÀôÏ&›$Íî2Làь©óìêŸ!ÖÔ°Á6#³£¦x éc¼‘{74<76V„7ê½(8FF›Ê -¥a êcffØ^5D{]ÌèijÉQ^D¾$ΊÛ×Ul[)58}®4¹ -ØXHú¨ð? Ÿ¤š”Ùo´§úF堎 æKMÂ-CP×EV3ÁˆÜËúÞ÷4CÎþÙc½[7…³~R¯ËU±¹)›ì*‚:¥h!ÄÕÅ ô–‚‡–Pr̝’iUcÅ!ªÏ9©…«d…»9.:ÐP­ÅÈG†BÏćᾃIÃya_°³ %ËmË+3™c ¦?ºî! 2b·ÌÙm›cç˜QG£ öf,‡±g5®W¥6Ý1qB“zÓdöÙb^g“µxܧhö¹~ö# n™’>Õ²„á‰I'š¾±Û³%3Ÿ *è§bÀŽº –N(Áb`†©Ž6]šÖª/p0ó¤€ÕÌwf¾bû9¼9~öÝ1P1‘U£ڙs¹´8ªÌǦºzàƒ€=vŽ–B¤×<°³1ìé8ê®ajYý:$ïÓê:5;a]SižyeçÌà\š„•s¶ÿ ¬a ö½ûN8ÇgÓÛH€UéRID*Lð¦A›dCvÓn˜F¦á„¾ÙW ScrçN?«e6§ CD’lÕ“b²Á¾EâF¥šÆ /I#ŸÇ¸(ü™»Ï¶?®om‹¼áÀI†ïŒÉpw%c¿ýÊ4d%†ä„Æ0Hm§V58ÍFM’0ρ5û÷ÀÛ;#‘6Ð%ÀF‡™W½ÑÀ#œH4•ÞæŽéøvFÝp(|VÔíÈÂ=¡õ“@FÆU4 v¼¤ ÂvžÎù²øýš§òhW#¥4ߤP;ƒdŌR~$ÃvA€Æj¬CˆW¸ìhfЕˆ"ù¤ÜîIÑXƒId Jí™ ÊŽR¤ì€íT ¼¹  žvD‘xll‡Û`TaŽÝÁªQ|Qö~=p͉‰ØàŸèx¡Å|Ü€ßæ L>Ê:BÈÌ\zP 9OÙä%¨7}t“ ¨€|á“Aî­.ÑSFOA -øúY­êõ)L3ü¸Gëšö8™¾Qaš™cœÕçK§R‚º{‡ÑÚÄ Ô­J[0S+L§J{eV -Pj¯0ƒðõ¨Öa·E¨ ЬìÂÉ>iµ4ñ/êšÇ§RéÑ ÎúdŠr¶tQ4ˆAÈαá^ç}W}ÐtªXcsÇ,£zõζ ÉI§¹… GÚÜ@&£¡éR'+E„àLJòµ@LB¯õè˜#…—3Bò‡ïl_hôðô±èË%YÓKâHØÁ 0íi4ñ·}ã̞&›5֌¸'aw0é)çïu—ðVD{Žga -õ¹R -¨½4314¯jjgž²©Ñt˜ª¬>1¨w’K -· 3Õü€ð½^ß]d3óÒ.J&mÁ*ÀŠÜÀ¨… bט W«!Édê¨ØÁÛFóRøwn§Cì<¹È(«†f:ފ=¨•?—u" ä` ©0 j”³Zôì!û?Z­ðäܓó“¸SÍÞ©w+ª]Ètö£‰CAE˜R‡™Šh:žh?C+ô±(´^±@ˆà1-ŠåhбŸmƒêµ¤"ùŠÕ»åÜ1ç:ðJíwDYd®L¸(à“ç6çêgà Z4Çý/ wšè;ë㮩®} raê¬y5N*‚“‘YcÖÇCvÆm°ð̺֘:4Œ¨„ø¤¬ŠÊhŽµ$3`,ÖðšPŒ³^'9âdš'ùå= à{ F6é8²:Ùw‚j¾ÆYý¿ƒ¹1Ó¬Ž=žU½¾&³Õã±ÎgþÄn¤7Hoº`Æ™È ÊiêͶY!`aoïÊr±*nªÝuj{ -ƒ"Ë@ Ä‰Qq‰=‰ôäó1ø®˜ -"i´'M` ÌÍc<Öa^×ô9"˜šM„qÍ6Nà ¢Ç +œªà"ϼ›JýMZÎ8ô\÷þރ³Œ^)ZšL͂DÅEˆÏ±É˜Ic:\¬aRo7E$Ük ¨¦YNXíõúÉzdͤÚTɑ slŠT-­?ó"öÜC#?‡Ž¦Î¹AW0:Ê¯ñDw¢Âò&Ãaå¹ ®”`Œ`´4©¥"£ À!)Y̚üŠ*U +Ó¡;¨~ÁŸåp@îð¸žQµÇâ£1Rlš˜S®W¼÷è&ÊQm§ãÂB9ªi£a´aëc`$#ÙÀ )BBnŒŒ ÊZ'„¬gžÂ¸¡Í’9ü[8xU3ÖÏ3QrElI\´e¨ -½¥F’-Ù;vö¶„{MÏH• ŸF"O}ÜZ];£Lœ‡ÖƄþ}Ù Pv38£¦E†R;bXõ.Z:"c -¬@ë`§nëúAq†îdüP$!y–7nÃN-êö–3áÈQ~ô­Ì«Âp_#;ù×I=JÀRäâí2ÌU±@Ø)‘1°^ñgõÛèq‡hnŽò¬þ3`Y±d‡IÁ”Ld -ÿãK¨àGb˜žÄ¤á>?: ó¨2 ¹M•iéSS³ŒÌr§ÀVxZiŒ,L.¡Î€f⸽lp5pCð¿M.zá9ˆ Õ×Ó!Q¢F QFÉ,‡Øš]lƒÖÖÄÃ?™Yۜ'^2¹ì?»• àÄ:ÕqèGÆt@ ½ž÷ˆ¥D)NcÚÀs§¨4auŠF¦l"/:Ýoúm¼/»9ªÀ¸Ý' ü§(»Þ¯ü"  vô%ÂmÇ2£>‡ -øü1@͖¼é ¦`N9 tùéblLŠÃŠAÁmD»AÈaÚrì£#&¸ßíó²â% ÞP—(Ð@d;  $1bopeƒæəzƒXƒ0+AQ9SPÔÔ«¬kϵ\#]=¯H#61΋çȶØrÅmNÊDÙä>R-H’Á()©‰&Ûe‚ýÅrà”ÔÒ9uz†`‚©œÞ]'5 Mõ?ÎŒ3…)ˆòl'·~o¼&xç¤ê?~¦zà€O’"³»zŸXgÊ~g·¦¬Bx^FûBœÕÐa¢¦92&³`êe†96ˆ±$¼yFE˜‹ÊbÀ\èÁà ^è<‹ÀApsx(r;ŒŠ:Úɝ'«boS½êéò ÄFÿ@ñ+À|UTj°àíÇçǜ(™"×!ÑêÅí602X`qnÜåuù+;SOòŒt·ÀY0Ü;ºh3¨ûs2ô¤§Ã”‹Äˆý¦3ëDé•ÔÔ*‰…ƒû^H8`ÊÕ¢ámM’£÷³ÁÚÄËoÕçG³°|Kfv®?q¨M—ræ²ÐmVwOèPe}ï e‚Êæ!ÊßÑ {bbµ× -7ûŗ÷2÷¿Ü<ÿÃÃýÍí÷›_l·§WWï^ÿþîá•×qfå’ˆ£YTi2x]ȊSè»"k%Ë0Ñ@›2„Þ³Ô5ð"šàF»V R&ëƒHZR: û¡ƒ­ú õÒ'f½ïëýyLN9Dª…b"Ǥx˜Z&šÁÒ±¨Þe~°IC¿vå9Õ99FBÍ«/ϼ%¦W¤ ݁ap­7 Æ°SMÁ]*fÌÞâ«';=XA&؇Æü¤ Òkˆ -(äX®ïiWV÷§T(a@ö3Póà0.óʳ"ÀáÊ$Ú¹h“I;w\wÖKÏgR-ÙÊAèmn‰ÕÁsãësôÇ3«â¨Ï] 0–$$þÌÓؾ.h‚„ÕþŔӰ¢¤bÛóßÅaV1&EeÆ˘ÎDm‚¼Î4€/7ÇPàÄ˃ª‹Ü¢€ë¥ìÞ©üì£Ò‹] ϞÔË8Y»Ë”n3žu;ׁ'Dw& ƒâ×4<>™c¶c.È7«?7ÉɸaÖ ¬cêE3-á*2e:SךÔiÒ‰Ù¿„ˆˆ4Tã\Òÿ¡<B½kkŒ¬ÀÙÇ»1Ê)!@×c;@÷Nv’Ûcà‘cÕ^ˆcB˜‘W\Ád% ÃêA̾.+"€ô¬¬‘s@«›KÍ4O óT+᱗N¤ õ%CjéáÚigàô#ûÑ@M5îíÜÅõ£ - ­óOþÊp.{24CMZ®?ÊÌ -:ÔKӐˆBXÃy@‚ nÙ ”Ïeá9Èp2MÞ_V,uÑèÁ4#™ðiñ!]3Bþ®žèñV -i›* ^ëÚ,@¼¦ó<ê‚ÕîÆ`ݍ -!ó­Få5$À‰9¢b€@ŌCã!b‰Õ0 -%µ%Z` ÊÍäs©X{flŨw§nxõÙÏ"?R®·§Œh–C| M&¸[DïëéÍãÞ7¡4sÅA#e´Zˆ -žH† ®„Y16öœQsTÿÀ@Ÿ„4Oô¶.K¸>f¿Ä˜¸~äñê (†\ª°ðC\d8” !‡=Ò÷<œë€pýM=#óh²£ÿ.©¤W#e¸æ³N@dYtJNÇ ;ö0g•sa«ÃtßnÙ\}IW X°ÿfÚÍweª5„¿cT1¾³ ƒ>¥;‡ rVo»¸oÈê™çg a~`<¥J̟’ý‚Ç<Æ| "•øt¢âg8@á¨'3g<•¶3Ömƒ±†£1¥X}ð W&€bԀ©YSŽTÕs­HÆnTØÄ8ʨ¸Ì~6^ïˆ[x`‡,a¼ ¨ kts¦>q„é`xCV$7¯!©",SG³‚IÁÄÐKÞÓZŒxNå­?Äó¤þîAÁˆYW )üΐվFJöSï1²ÎÍzM6‘ö”spÜ蝈±×ÓÞ¡%F„?œÐBbîwå”ÐüɄÆ`*kÀŸ¬gª·Möz †Ù"²' W( „3ÃØ ‚Ëü´¡Cã 8§ý:Š ÁüŒ”ÇA -b˜lò̍I6Ðk2î¼haÿÀ)ÆiiÆ'¬Ä¬ n^# 9Z¬?Fä9¨~41wCTÄq-½†=•4\%šÑH~” >£e°–<ŦnЀËQ£nX Ǎ·¼çΌ½1µf~øtà8ÂK‘Ó!€ÀÐ.àÛÁÍj ŽZK㢃Éà1ÕîÈ̐£p˜<’8h¨ýX.K ù ñ¼¡Ê‚å¦ÐÇ ³YdžŠz snŽ4TF0û“?ÇöD’@hY*Ñ°&:üÜtg·‡‡bv¤Ù…“YÚæzÎ -.5 '¨™`„°@bÔÃ;”Øމ‘ @:¹E†B æðç2ˆW½AÜHàúîU¤ñçhf@dâha!|ˆô£þLP@°@pz]ÐJT†Q,Ó áeÅçâsÎ0)k¼&Ù7£‰FÃ÷v„ç·Ç`. -81´3ٕJH`؆yª!Ñ£5f»¾· cA3‡ø×é]5³¾n_®x -º†Áê£rL,}“ß&]æ`fš Z¦rbb+ÄU:OÔhs0›s1›×7Œ+¢Š¾éšuin%*ØO³¾e§öÝl™½f…õ@°nCŒ¸ÄeQ„ad:d›ºµÈþh`Ò -§!ÙréÉRââu¬“zQyb¥X²ƒuŸšËÁŽ€N¿æAF2Á¼ézÕßÉÄ8à˜b+5‰À¸ƒ@µô´#£õXtèÅF=BëÔá÷î,,¼ ×ÛèDð#cèëœ4ß?š7]‚›N%Œ -VXsñ‘`Ž¿Î]ÎZmN6,M[ï êÕôçþBŠåÅo€ZXÔ°üÁ%ÔÐìí¡ - ³¡Q³…bþÿì½[¯.IržwO`þú” 4T•••Yy)mÓ°ìM’%Á0tOKƒÝ##üïý½‡ˆÌüÖnñ =€.x3Ó+vU}ǔŒxã ¦1ŽÅf4`¤ÁqR^–.ÝkM¶—ĝîÎ0´Œé¦?ô|r+ì$¥„x§ÃðÔm7[‰ÍÇÿxŽ‡@ƒ=Áž[Wìç=úîr³qH&‡ò"֋§áX$fi}‚ºŒ°+^À'êÝÀ -‚ûñ”5Cü8Nð˜ÜA<¬Ç­ái€Ï÷ì~ìåR–\©Cqåf*‡Çïõs¼_—RVèøXôO€Á›t AsôÔ{ à)\Áä!’QÎÆ}ETŒ>!­øñ¬8Z -íº_,üÍ"»ä×:\&«•–¼FüM8äpŽ31UvXdbk6ÀܸòA¼óâðçË`Lª -ñfJk€¼  ä˜Â‹Ì9áIygÖü‹§F¿Çó>÷«Õã²` Çø¸¤<÷㭆3+ép:8ë2‹ê1¡—ÖÀ”¦âÊ*ÿ30©¼¿ -zXýà 4¢ f-ŽF,Î`pCE¬Ÿn‹Ø[§ÆV1ÍI1Ôò᣶hŒ™„óûÊ>õøƒëÖåF©¢ӕ¬ö³ô-´“Mo–°Œ –9L„Á—x:ž¢Bw~Ç­RT¹;OÐ*Ã⁢{’"gs¹SQ¥|鱺 -B¨gΆ=¤zp%ÞcZe™1&Ìn= ‰%S-þXq܈tޏJàXÕKw©»^’ÛLAŠÜÎæÇÁÕµ0ŠÅeåñ÷¹VL„­¨‰A7' É]^Õ× 0QZËTËP'‚/ˆ †Lú ›*舟ögQq¤àèr޴̪”.¡DcÍÆãw×óK•2¨'‚vTÃM8äAÛqÏÅèáêƒÃC#Tê| -¨{ålýø:Ž­Rà”PÃVZøi3¶Š Q•ù†>õ/Ä#‰ ò¨”z ‡×ud5\&¡P£æ=r8Îåþ£j‡7¤"óìÂd~úâì2¡DˆùÛA™a¡Ñ»Ûôå›;fÿã/r¶ÿ1Gûï†þ|ü$êØTH·ñõBüãÒTEøc•IT\éÇ×P‚3àÇh}Ë#›} Ÿª•}Œuùs=I>ÆÒń>Æ 랍{ 2‘‡ÆãoœmPñ7 -»6ê1w’KÀ°ŽÜqÜ¥voÄcH+!^à1b¹ˆw|C`†ÏwÁCû}Ö+iǨ=¤¡ ¥Z·µÃŽW+1¾èÚ -Mt¢ŽëeÄîF:®bÒ1˜ütIt\‹ßIÇÌô 8Ë@–‚8IŽoÏ´èrPa…Ì9f¾ž“sŒ0F„sŒH*“rÌfNOcªÊóÆ8†€(“@ß…&à˜·7¼1cLº1Sž{o Þv¶1º'‘ãa´1d›ӈFca'æÄJ6Mk‚›ùßÉ5n*™Û©ÆX+\÷dw¸UíI¤1¦éã|s6¿Çä³\í<çÚºû³ØÆ=ø!â£8®{âŒa@ÉÈN3†G¬¬aÆh tu²Œ{UìiCý>ÄȖ³¿<“k$È™dê7Ž1*J»ú?0šôú{ ~/(Æøûì;Ãû°ð[cµ&ÃÙBÅ0~š2¢Á/ÆGšÛÀãÜñ…lôbÉpµ/f‰0>€sF'ƒkžTë #;>(#ጼ™fœð*ÞN#»Ú}ÔóNv1ÿ¦òòÙ``MR–`ãö°ìb´ŸBÆ{Eã²/!b)ՇýÚ(ÈŜÄQe³‘‹e}j†a8 !i ,;4æmèb¾7\L2Óe§v¶²s‹±’@©v`‹º jÉZ%@+³A‹Ê¿“X̵Ó˗ `ñx,óZyÅ0âÛ -\ñð,´bœ²ÂŠ¡À¬b|‡ŽË¤8¤}Ôã.¤âqéS P1ß!|Éâc2…‹¼aŠA‰ÅZ,(Å÷Ñ7(Å·ñ'¤ø¶Z1 ŀ;à‡ƒQ ¶´v¢øvT-Å(yÆ/¡¢‰Nd!2#ÀŸ˜êùëI<1¼ -øù+˜˜®óI8qS~2ÐĈ°#­±¡‰YbÜJ‰!BýuèÔ« >6.1òµ —¹®Zê2ˆlÏN%F ŠpÌ -\„¦ÇÌ$&þîâ]ÏhN ƒHÌÌ -ô•×*ñÆ#¾’=ŒªvÝ-eªݽƒ‡ÁPÅûeÎðÍ®ÁË_ømÐa@¦1Ks»Ò’‘üÍRՕ8Œä?ÈæW‹ªóÏ7ŒbAÌWA~­¼Hý -Ø0úv^*:¬aäÜá$j ãæNf—†b6Ð0¼8›ÁÆÃĉ1Ãøw<Œ2| ðŒa$ìà¸bø®òl„aù‘yœÂßHl_£JÝáÂðÐÈg5[ZB|˜\’,Œü'a…!­„”3¸ÂÕ})6¬0uGMª04ƈrxºØ—òܙ€XBÈHa.p¶& -ƒʏ{ -C5wՒ@a?ï;yÂø›³ÝŠ.CxŸ  …ƒ%Œ}®{' £ç%Þmƒ„‘ĆkáË× #ŒÜ]›/qS éÀí坣éÊnFAÙvPÏ §ØáƒoÂ5Þ¯·—°„›fâÄCPë=ø‡/áÁ® Mvð¡lêŽ6Ñ.ÉÁ¸Eurƒ5˜Rk †zóR/KÕäU.6d0À¿˜7’Œ„Hm<ÄiÚyÁÖ~.E@5YÁÅ:ÂmâEN5PÁÜè*“Œ@·~wwQÉ n"H&&8þÞ(Áa HðPlÀø_ðWé+-ˆàbÇ&6ñÚ!Áù÷ÊcàQá„ã&دÜÌc×d5‡&ÐÀ—Óúz§ò2•P>¸¨%ÑÀEn׳£ñ½Šem6ðwøYÑk >X@|^;尔¹~ØÕ ÌÀô}ïd` %!Æ7øõÞplL.0×ã×-3©Àæµ$£+·”ŽKPÒ¹¥ °ã`àã -,RÙ9™À‡}Fðæzv"0bԈYš¬hÌÆhÂ׆ƄƒedЀAa`¡TÔ! u]; ¸¸‡—QÀ¬ø&Ú@*ü Ïuã@×ݓŒd·¸L Þ -­`8n ž·ZznÑ!”Dpgc‡1À;DŸ‰æ]!¸d‘ÂC…×&ÀP*`p þ/þÀҕÿ{9ÂøßË5îAÿEþŸ -ª¥¨ndCÌþ@€¤Y£¦¿·’áŸ` -ð/F<ÔwÓ÷F$;¯à_:û×42`ãï ü›FƒoLu$÷÷Ý͝~0âÑŸ­Ø_5:égrOê‡Ì¥çú z‰Ñ¹Hðï í…FþÅvòø½Ô8ßîà_šO3Þ%$FÙ#Ù¯þ=Yy—7ð/DÔ_ï‰%Z“ûKËs>oÜ_°Ü„÷šû+l«©iJÐPéQÚ÷—(øëÉýŞyÁý%ʶŸ×÷—f¶ÿ -î/þãémbù­¶7ì¯h¿×5±¿¼ÀçûË:ýO“VP£{ՉýeŒ/I`ù€È£Û°¿ÈT‰5lì/îÕÁ~́ýÕ+5džýe†®´Iý%f‹ þ²}À`¢s¥þâž›mMýÅ)Dþõ—îc§þž%°‚Aý¥J«¸5¶2XÔmòFýå®,ª&ƒ¯Pa9ŸÐ%õ—´\ÐÐ_„Egê/ã‹í~ƒþ2Q§ïÊÔ_†„¢6õw¼þŸ q6ê/0םÌ_ð'ËÙ'òÝÉx¢ñV¦ÊøËÍÚ=y¿8Ð;ìw¸AG²~ôR‰q¿¸N9;îw Aû§ Š ûENBe%+ë±Èê0¦Üên&é—r¿~¬9'å÷±Ë”_fMúxcü¢~ýnçDü26§pc‰>R½¼!~yÕå8'㗏d6‘»ùÜ¿C5™ü"Æ|ƒ¿øàœ•ï ªhï‹#Ð 2ݗTD”W¸ïI5ÀÑî«À¼SjiصNÜé¾ԚÛ8ª©9OKº/ïôîË>‚JA÷¥1X/§hÀ -y£û*ÿS{Ò}•  ˜ou -ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥<ÒM¸/»Sä)UŒÂ|v¦ûò¾°`pÅûÒ -Ãx_fíì¼/ L]lx_Xƒ -ÜTëÞE— ¼/ Ì>¬x_*7ûÝïËî. ‚ï‹Ñ뫝ï+-'H¿r3–„šï{'K6À/¬\sàW’OmÖ5J£IËÆ÷…‘ÞFð}i@ˆ0ø¾4`A¿~1’‹]lÀ¯ú0èK0 ÚÆc Ú¿°²r8¿'٭ו€_0ön„_YŸ‘„_ˆÕ—&üÂ@úþFøe ,Xƒð«²Ô´‹ðËÞ°EÒÀIøU3µ»&á}ˆ8¥á÷$#STÞIø¥Ð{ô3¿g5tو_þÍ÷{EüÒZK~¥/Ê#6_ü¿~%?•î ’„m† -#Iø•öûxvÂ/ý¿»hè“XMèîãu¤»íŒ_˜ÏËD_2~añôeÆ/-‘ß3ûOñËcET‹, †™ÀÛ¿¸P9cøådM"¿ð€X¹!~©Íâ,mM°ÂQ[~q3:7l„_ˆô.6áïØÝ®{~ÏÛK¬ðË"!º‚Aøeï5%ŠMø¥ó®– á÷Œ4|~iéÖÇÈôÙí_–gñ=o„_q%Î; ¿x_¯^ƒ§í„_ZñáG—¿$üÂÀ‰k#ü2ÿ±"‚ÎaÜ|~ehu'üâ÷ÈÛ Â/¿’ãJÀ/&£·ïËLßÝ[ò}™&=τ÷b„z€ˆ_ wÎsÒÂ ƒÏqí|_ƒxmà è¾ÃÉ\á¾ìJ¨02CyHa4ò6ø£ÅFöm= -d:vÃyÍìEgaf6®/!¹Ï„Žì‹ç=ãïë›6c}OÏÁëÃËۍêÛoE©s#“¦ƒé¯Hß´™èû:ÿ5‹‰¾Ï¡þ£ Ï÷ñ<ßçÐÐ8_ü›ºÑ|±—ç¦ù>ÖºÌ÷9ô&o,ßîGòíÉd6/©®õJŽ/ÿð,Ä»‘vØ(¾0⽈/þÆK _Å ù]¾ýprÔßîÖ4AðeX¼œ;À™=œ{ð{ñ ¢„<ø½=?¬ø^`¹š@› - cT[Â{[‘0~e÷Ò&Ê1³Ù؇4H“{ASºÕÛ.¥˜àŽ]íNn/ò«Èˆ Û æ°Kµ—šGÔóڋŒ±ÚŠÙÛ½´Ü½ì}Ë -\{›×IìÅy€z¿ñzy2`š×Û¼j Z/lA­°^V»áå4«—5qP*Õ;²z³{©A½ÑQüȯۜ^Ð=ষèÝø](ì1òn^ˆÑ¸Ð‰^Aè%Q ɶÐ+Êá>/þl¬MŸ÷±²bÃóÂ8Dã%žê~ÄïƒÎ Ü0†Õ ΋º‰ƒW#6/V¯lÜáêéø{%ó¦Í`^ÐrA5)‰ç‚eÃò³v‚Ê‹ešÓZAJWú+•VµPLŒB”ûI*/W+œþW*/‘SlÔ~ÈêSy¹éþ+•“CÅAå…GZÄqdY%VÑxø“Ë.xÅÁäå9ÚJõÑð/StgÁ|Œ[w€Ý 5 )Šúµ3yåa”'™¼0p¸ &/ lv°2yé¦ñäÍä%ˆt0y?9*_҇ùc2y¬CQÄÆ䥕YD3yÂ+=¼ ̱teò2îÙL0yÉÍàáÅäUïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8íšáæ°fÝ¢‡f’Wñ;‹Ú~6‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Å½1€"/)¼6"/UöUÀWá;HE>{y…)c'òRùHíÂ9•ß 4‘’ §È‹¬Nɋ2+²®UÿË~S;Žʪ¦ï‘®7|ZŒãe”ªªtrÂxQiOIoŠiƒÆK;Z­5@4’¥'‰"s¾âZ͍—!Á›ðI×Oa‰`›q¼ fçÎãE´‡Õ“Æñ‘5ˆ ’h„µ#JãO/J¨êDñv$eú™(^ÀöŸkñÂv=#]?«Íê“ÞîïbÃðBe‡üƒ)¼ø}  •&êÁÛݶ'¼ Ôr'‘ÄF6ow°5ø» .æq&·9¶·áwy"¦ÄøÝæ aÐwI…ê;{—Mb zz·1ªÜÝæLã†ÝmæEÑ/” ôÔ]œú¥áºËþÕHڙ¹ËõóIänµÔk#îR0zwÑB¡§àí$z—7Þ.V£øÄ·‹5RmÉß`»PÁ ¼¬]¨³ -Ô.аuçì¢@ÑíÀìÞ¨/MÆ.´8Xqoˆ]» Â.4<ˆÛ(sòfáý]• ¼î­ž£Ë>¯v¶.Jé)S7¤9$d]TÕP²½‚uíÀW÷vsàÀê¢"K⍪ #¾¢ êޞtª‹3¹ çË2ïˆê©‹g7a> ˜ -—ÚçL®—kku±BÂ{<]TÕÁµátÇé„ÅÝ™¦ É2ùz+LF »ÁÒeMѨ‰Ò…Á¾•¤K±ö}'Hw8„]ü?”]& ¶º‚þšÂÑE­`WEõ‹õšÝa˜b@t‡ãÈCY ½&Ë>Ŝ-®èY¥ì ]Z5±´„hÓs$C—¡t¸·D—­Òk ˆ.æ}†ý¢Kâ|+Dw¬EAÆėS]- رQtáêÄË¡Œ—+&šžËˆasiÝdà2nغ |.Ud„bàÏ;r^Lx®Šƒžò‘ô\ZØÃw£çr–™žË Çtcznþ½ÑsNF>蹪gî#é¹Lª±´b¥ç2Ïց=$x‡D«AÏ¥»Œ'´ÑséhA›ô\$X‡ãÃÂʍžË³º®„ç²Ø!€ç²n£ìÏ¥•_»á¹4p´1<—# -'6x.ýCœ{Àsa(øJž ö=—ËÓK€fPa`=ø\rTŸËå*î]àsñ–³f!ð¹Ê|–±ãs ê@/®Àç* žÉÏE’€ÃÍÆÏ%-¥J°£±ØCÄm‚Ÿ«ä‚F³ÉÏ¥èÕ^ÁÏ¥á/Wí±oá{W|.|ºçÆçÈEãs±oӆυ>ƒÍíŸË< cÎ#@?Cᐠ  ¢3鹜 ̋ÐE†/ËЅµ’2J€.øKt ‚ ‹”CPA—8¬]ƒ  ݼ è҅ëFÐ%©*\ÍÙQ¤äçr/–ý¬üÜó¶oü\”sQü\õƒßè¹Ì¦ò‡©dä9W9ꟄƐïoô\Xõc¦çž„]#é¹4 ³Ñsa­xàAÏåf¼¦çòȧðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ'UÔåÚºHêÒSË͊@Н† ›Ö螥ÁM2@7_Ì ¡Ëìì˜]\#]¦×ŠJ¿¦pV,킡ËäÖ5ÁÐe† æ¡Ë×kZ2tY̍”ºüW¬D7ˆ.ñbp¥¢Ëd¡º¯Æ¡!|… D—¨Æ㔢¤ëSQ;ó€èòãrž{í$RéE¢‹?ҋх¡;°4K•ae¦ (º4¸- ^4:P]>ž¢T®)ºÌ3m](ïX1¸StñÀ% Š.‰]dIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±>ƪòEƒüu¼Ñ……1±£Kߔ)Zct ë·²Y ’CØjÅè¦11ºœ®†»ÛêI↱ùà†Ñ…Y¯—1º00|]n"ÙɊѥ™*0ºâ°uƒuE·@éc§èRH©@Pt¡\áø‘]Š[³OŒ.ÃììŒ.º±ðqùðÊWŒ.W>Ç4‹¢›†¡;­Æ¡MItÒå{øÉ7ÿ#¬X£EŽÇBÐUqþ™]8û\­?·i´Ùñ¹M±Œ¤ç6©ÉžûÈ/ØÙ¹/c)WÐG%ÑIÎ}¢]å -Î}ÈE^ö鬺 -j®µ¬;5÷q:ÄÔ\4SíÅý¤ŠS+3säwÍÌEx Ñ΀Ñ ¾6b.Œð˜‹Xàñ$.õ˜­7Z.ôèJK –‹¿•‘,£Îlcå’:ŒN{FåBq×'ÏÎMÊ7R.ó1ð¨ES‚šœÅô.z-pð#[8¹ÐZ¥Áöü’{56\_ ¹ð7ü @.{òWòqD˜{Çã^ÖK$òw„q³&„v8.¬˜±‚{¹yA²q¯Kª¬{ êd ÆE’QõxcgŒ‹[‡…5¦â2Ô6®„â"À5òÊÄEÜ£N".ªn4?KIÓ,Ûx¸0R0e.v¢Ú4\ÅRÆý-Ö -îíƄÂ½c"ZH¸ÐË0zo.$ˆ%>Î ƒ‹°+sm¦àBg0&5²X3o\äéKM.þ‰#ø·ØoáÆ¿…L§¸Í‹6ѯ³õ ßBUV„‡ð[\$ŠQ‚}‹›ÀïÈÑP+Oõ%œ‹]Dø„²d²€éôú$÷¶y°ao›[6õ6j«zÛ Sؘ·ìjqÕDÞf¬‰·—«º7â-”ˆE,LI!иé®Á»E܃% ãI»½ÝZ*`··%˜ëFÄ,u ^¼µ Ýâ—N“oÓ9¯.+Î-|.ø5¹EEX}ƒÜRm…·à à;2âwï×F¸…‘]S ¸!aûàÛ^N¼l|ÛÖÞ#d¼-þDa£Ûâ–ÀY ¸íÕ¬“0´å2æ`CÛ¢Šõp*+¹¬*°-j¬ð)n\[? `ߣŒBAµEÒ´õi[ì Ó#¸H[ü,ôF´-U‹¿ÚV¿@âÙÞ€Þp¶È°¸¤Ì4ö“"܀ÙRÇðÜ;ËöF#²£fÕæNx‘A²Eä чd;XvNmUÈ-9¶]½vŒí­ðzRlOÏ©†Ø>ÒKo [Õ œ‰°}ø6O‚íCRÆÀì Âïͯ}T²`zí#ÍлV²ŸD×v‹uL®-®ÚɵM¼‘×Z›ÜZŠ˜ß±µ gÔI­Õ̒ÌZd\ÏöƬEÌ{,ÈZ¼·lab-õ>×°ö’—¼ÚâÙ;pµ¬…¾ëN«…¤õdÕbíAþ"wè,8Ãx‚9 ¤-²œÅßE!êIœ¥ñ¼8;°(2^«GTíÀsÛp³cv•céa¾­l–u/ç½³fh*J=GYŸ -Iƒ4ûx5¸ƒfÑ´3;bÑ”YV¦¹—ÎÔ"“&ÌW3fqN¬œ Ä,jqnÃi'b1HNj…÷KU˜ÇXù²O$7—}œì ˜l|ò\’N…—}NÝÁDÆöj2܆–_…ÔÁ°"å3&W–jé>Þ°² 0ìTY¢G\ŽLœC?fÕn -™û1 w½;áO¢ìË JÖ (ÛcN l;¢ÒÔËiX‘²Ó(¦l3'‘¦Xvr¡½e)¶áf^L Ü& {tDª+Äv¢,”öª«6P–ò|Ç qk±†‰`3•‰4Óyù`<úpD£KªSô;Kö¶À!Q²È±¡€8H²”-12d‘ØÄê'@²\Xy+ÕVésª?P0uù°6¹ ±#‹e‹br+E¶bÉ~–yÇaP]¹²ÕòÄ !‹.‰:s'#óÙwwæË7w˜þ‰ û#Ȳ[s€uáÅü”f -ˆ!lÊõIMËPÒ°(ºj!˜³\Ñ|œ£'xw"gòÉëS·–(‡£aâ@?ì4®2ØÛñ´Kž:ÏÅ\9:É­²(©ƒ@ ;#ÁrË®›ž®³€ÁmL°æ…dÿVLÄÀŸlʀU›¥R΀àC’)EÅ#†>ƒÝŠS.¶W©ÈO‘HÀj/õ>vÀ²©Rý³À‹í‘°A[ë‹#h3¨ ­¯IŒe&._SÊŗú8AèZ\Eh5e¹à= ÿM9-‹lç~‚Ä`ÁIT+Ž…,\)ñ'ٟ–urê)vé'YHŇÎn]‡›‹qQUº÷ÌL]T°q<»ZBû+ÐM“ö©Šqñ…Žj}ŒGEg :…JüMuGÓǵu¸|àÎst÷.ÇÝU7³Ž.«ó{ o–3ÏÞ"»rF -…•ð$+ÀR=¹3™ ø|¹Pǃ÷o òò¸øn\l ùMŸh ¹h\ÇÑÔæY”<³Åõ`çn7ÃÇÃ:>ŵ I"Rú0z‘–Þµ!ãÍ0 ^XX2›WšŸ`¦OQ‚@ …¥ÉøiÉòy”ð ø³$dÒrêÂ{\»™†¬Hª‡ØóÀ½’Ø·“čq‹\‹÷Bò®¾Þ`šYè9Þ¾@­aÎ^€kqmŽs°í:µó]/n¨Žø Œ´0„$aïiá'b”ô3N=#ÄâÑ'C- 0TøR/5dû ˆì°§6|Ìèããe§ ¬ˆ2ØD3BP'N§ 3í ™†þ&Cžy‹Ž!Ê×Ih²÷S…qì‡*q†“|äâ±°€‹_tvÁ¹Bò|²¼Yœg(¿à«<ý“X0¦Ç8ݐÑ8>k¼&X¶×ÌÂÌN‡½hµD çBhÞ ¶à‰ñ`½H­•»²ª’ffo ±¥š£;ÝË£ÞE”ïZ„bc+ ¶¥Ãò‰]€f37"h9•EõXVDÀû¦"Ë~T©aôW’ønë(3“Y³ãO&Òh ž£Ü –+gnÔzè.3^ì&‚4Äµ§—¡ ‹óLŽØ¼ŸtµáÂDOB¶èÁ1G©ðޒà©Ñu$Õ`ȕ‰Pä¦G¯E 4Â|Šðžñ»_®Çdfq«nTœkྻËÕìg ásºCÇ0H< ÒUlÈRªnµDz(êÁÁ,ì#Ÿ@L€¢(ð–‰ páÁ ²1W­uXË*ùí+`“¹“ѳ¸R#è%rÜL| ¾2®´¥3I¹éãšñÒ뻬ʧ¡…’R±h/»9¬3êjÅ2T$ìÒÜ¢ëo‹Œ'Ì£´Àa!ˆ -ƒ¼]ôWOFè˜ €…•r ƒÐ_ƒ…þñ%Þ^ìÕ¯\ˆŸê×%üÎk©NÀ:ûƒ©Ž-ö»n7pÉ ´•Ì¨lŠ)|COÿò¶Hei‡[¨‰»Äw3cQåuIrí>ü¢^&^ãô(Mß,'îšÓ<ٚ]Gd`-Ì j‚…er܆ªjTõžJ°f$;š%PL„«ç+p›¿ºXQûҗfQ?(Î> ]R5_£Ñ8 -sØð -d“'ån-šÕ  <k¬:bgßː5–hàVqrO-·±æ=‡öäj ÁFØÄþѳá¤ìK},ëa -T©9ØWW±ä²;å;.}Ϗ’Û´pÞ7€‡´YÍÌ WË]uDÄú U²УF°êË=× = µºÞÚ£÷ºqÍI¯/±äû‡/[UïáÐi‡ã%Û¸zÅÚ -ï -ä,+À!í¾5R©çiw¨ôdÒ¯h¾"•ÊÈüèÇKÞ’±Ì“M%©óÀìN4¦ì.ºë<ŽÄËÂñýP‡»R%†úünêރëóÎj‚ÿÉ9¬kñ}k…CºÌË̺uàú¼«†P¦Å sk`[œ«JÊÎ ÑN‘“e÷ñȖ¶«›Ò¶óQ[QísP9J€EBãäWŽôWÁ(x ‘eȐéÌ éÁ±@Þä® ¢‹˜s ˧­x¥ÔIä‰pÕZÁ»†ÇHÍá’Y\1h”-RîÇ2wÃIt{©E»u`/^ÔÓ=0ˆ¦ô%æŒ (æÛôCi…ácêFtaw1J6˜6DÛYˆà±D…²ºË»6™Ô.H%(92åù<‹´\*+÷živ)!㼌‚ 5SЂʍ´Å/~øysC¯Ðèg‘29-ÄxÏ°Þ&t“]ȟÀ×ϕs¾½@ÃÀëð3íRÒ¨i³½i$ò¥°$ x×îIp o]s„×ŽÞ Ê ßU¾°ÔÉêQU7Ü=K½ºñ ˜(€…k<Ñ9 -‚ÂFGÊýGEn'7ÌrEHŒßmuÙݗxT¤iœ>µÇ­m..=X(Âtâ±Á7ZN±D¾NÄÓâ]©bç®5cqñ¼v•™ÒBžjG©éî W‘î2?µSŇ¢‡1ðýx -¿RíÒÝôtœ\¶P@-ÐX ÷ò´& Ô/ƒ·^¦"NÀ£`Q)$†CO ‡ª`WŇPïȘBþkaêåu³S¾‹d©b×hõÇìy ¸€ì}ùM¢ïȸáåx ,xzï…ýW?è*Ñ;µü"ãBt&r@J3aTÉRÊæ/玻Æq¿‹3“sŒÞ8˜"ÀC' ‡`1å€+ÌÜS Vž;rú5g牧¸t„úŵ ß÷³ë‘3W„’h•G`â凸—Úýä ÎBxÈ¥sÜ·XíÍ(.0:¥OC®ì¢OŸ7S7g•AÑý¶ÂÄÑÒÿ kurŒÝJ.å©ô:~ZÌÕCi†7È ñbº²_ˆæy1YÌu+˜4Äñ·ˆM8kù_ Û+—u+ßC¬ˆA¬åõÒ0!S®gFNaUhž î,̉ÒB&J½.íÈç˜{Ry¿íI8áôßh&}Y7;Ò*”S"2÷¶/Tq"…åü¢ëŸ ïhÁ:åâU™ÝT®Öt•Xò,jÈ>a–TˆWÉe·–§ÈÂw–Ù0FÿpD¹é©:hp‚‘š—z‡¨…?Ê'×­ÉÒùÐùâ_¬Ã%3å=]õ‡GÏ&1µ@ˆJâ?È*(¹®a®]Içu>ÍR¦€øUç…éåSW0Ì|ÏÄvÊyð!PPˆ"祕ÃòԐÀÌu ͈¤Ã¢v/h» |ë9”ŒsîÉ&̌8òXWÀB/–? -y¡,¡!+lÎÅo=•PgÔ¾¿rD°wáspÝπ"c](ŠFDD1@Ä_ „gÐë"Ɇ?ŒŠ†£ ‘l àL•É·ð¸´€YK+uîI ¬ r»Âù6ÿ°¼…–ìûP÷¼/äˆu¤o~.j.sz¶â“î¡MD|»E.ƒpXö´fø +Vý  Ú]´ Â5Ž-Ÿj/#ë@Ð_¹0 0<¥CÀÔؽç‘23÷d]I¡«Îx¬4Xœî²æ–6{†ò‚‡‡L"$£ßÎiÀΛõ(%h])nÀ­=Y†ËÇY|§è1±Sïq)þË8É DòE9 W a¥œù6‡Ób°Üóㆹ3;𨢘ÇRXýáôÀT\}´gÉwˆÍ>ð~·G êüœå¸Ãw„x¨Ó*]f1dŽy.¾ø$2tÜB2àŸÔæ Ț‘ã žŒî%\Ø"üûCKDZu'ä3è]4?—¶ÚÇzº6d\»°‘âSl)ËWFxïU9‡3:UÍ¢™,Å;-ŒÐq«lÜOԎ:Jèøm ‰FaÀ3<ö³¸¸0‚ÊIÑc­IV‹¿hq«ËBùñzÀmf?pÍèi=®Û(”5mÈþ3܆]ÐtÆü!”ç -kD‹v†zT?šxNõ8ÂWN(¸Ÿéðz4j8 %AëìâÞ=§Á£ÄoÎÜÑe®åœ}õs—ö - $,ªiƒ%ÅÄ0ëã|$â)¤_:Vþ&1HîZNÞ¥s¡EQ%^ÕêڞB¤î7ÂN¬1äÕS`Ö¿Ñ[õ6؟#!(0² „Y@«éKº'K_Ìųäoƨ=–߬rÁ‘c˜§«÷î03®’:s¦pF°¯ ¢Wøß®ö ’{ìeÝÁ5Âú&£B0?l¶3Tz !BL 1§‡M”îJ)Ì=Yтž×sߑHRúó†F-¶wµVf·kr.9’qbÙ'R†‘ù„ûX4xjC¸….F¤OJ ÚÕi†~³¹ùÍêø[ÄöåDLæžG±Ì€Õ&œ3”umj;"{ؖ%vuªK3jò°%¹ ‚ óEuyŽ= ·ŠS Ÿ¹Þ›‰CêAáˆHÆ9"Ð+õö7hè»eBO¥¥‡ý™œä_0KJˆ¢4j ›©~°N¹Rú0 ƒß\s¡4ÜUç†Ì¥± -¼z¢Þõ¶Ò{ƹûu _Q¶Ç¤0Øç2ßsn70xIƒÂ¢þ4€t&/­†éb⣠À’|¢Eœ(}|s/'æv®{Á³Sá`ZšOüÂ4Wχ·Ëù ûŒ©Àìý,‰jåZ‹¬ÃºyðŸœ1ßý{¬a¦Ç™ºnÞNR,p•ˆê~,D•%£ôȹ >ÁLLÁŒÉ Åê`¹Ö]ÝØàR$‚¦)IƒÖúT›Uz°¬ ÖæEõr4¼% !9ûh᣸øö¥:!³7ôâj·qb¬hg¯˜ñôÊRsŽ°°ö½Iý¹sÏmná ËåŒ^ÞõXçrÝÔ}ÓK×Û ´ýsP +e–ëV‡5ÕA*ž÷—ðUÊ[ÌÈN‹‡”ê>:¹áÔ éfÝ*ê_ˆçºç(& ä~.·RºÌÙ‘Õ‰™?÷¼Œß«aØ9%·—1J”#púá69Ž¡cE½»ŸK·{žÑ¿i5w|ÈH€ÍÃ*Uö;3›t …,ãê=h¸“T÷\z·h`5BõűÃßmB½óGw§ªGtŒT ‚ Xý}òž¤ŸöÇä23Ê©Èv“{ýSš©`hÍ"8?fUÑå0'd„%—ºÄNQ,=ž”ë£@¼ŽÅË°`tŝ(æ Í@á!f¬Š¡-ѐœb%ŠVyöîp¤Ù•–$Ù]Áz äp­äÝ°øáTÿ×<Õ}@7–‚3rW/[è5³v™ÈBˆMî(4àåxq•R–`I& “Î=¹6Õ67mÖrR8Z n•²@ˆœBX…Ù©žþT¡%¾•;”H¾;”Š‡²®\4éhU ïàŒ2X ‹¦Òî %'“’Þ̜Jkõuâ'øŽÖNO$a™yÊ.p ó•Ôƒ@ìõY €JPj^ªKõt¡ÐèŠÔaýD9ÚmbÿƒN0{wz*0³H¼Gÿ>ä8)gê®Ø‚E]/¡-sOéAz´ĺBÝ]‹ó—²Æ -sj̱RQ‘üåiºEzVDúã -{ ¡ŠY;¾ÔGåÞ\œqýÓ\kÌ:M>E5+xjËÒ fÔYÂ,%>,é¥pB”#¢´¡ä+،»¤ù¾¥ª£ð~ÛUý•yø©ÕmÀ³ -pèǬç)Vu׉žÑŸäK¬€ô«f²¨ÚbjUºj÷Za(‚2ù¤‹ÁÜ»ðP¸£c…VTÀ_RSùXÏ*(h.u£rOKš&©óm*váÑÓ]áJCñè»MŸ¢·¢3XÕ²´Q©ît—G„…ÚÅP/õˆ©Ìö²ûã%e~zŸ0RO:ܛ‰ÉžDÀÇ`q–ªªú'weY0Ì\g2SÀßĆLzpzў\çx­ŠîFd™¡9›yþÖ³s/¤h-•r =zyÙµ¯dLH’n~Û3¥pTݼ;Ó‡â&SôE.Ýý3ˆìŽ>ÆþDãd|ØC»®—Ä#Ø$Õ¥°JÿÜMf˜òö« ^Õde4edg0BÔl{ë›T`¨8.ÏېẨ‹&fº÷ÌÚ?Š1QOSؚø´´k–sÀה,ºù7àVIÚouLz÷[g\óc§é½°×7°"ýæGEM#<½®e6-­º -EÝÃÇ¢ýb|²ÚoS;qXZ·o°P×Íj±{™>ÃgϜõPF‰7“!VælÃbǦ©…ùÜÎÁzÖ¼im‰Æ¦Þw_bGRÎTÅGKM‡‹IÌ$ ¬Ðq³Ï>xº¤ú<¹~[ŠœFjíßw=œV=-º¢åV(Þ¥E§+ŸNõ²Î©«»³%øgÌp\72­VL†Ò{Š«‚¤W=§%WLÕ?Ò®’)ìó‘r‰Î¢1*8·C¤åöC&°€»>휻’GF32¬&gMXìúÑËÕbœÛ}¡—˜†ôu¡A=|"#€1Žã4F—”õP¼wÊJi¶2O…ª3Lê¸ Ci˞µ¹âãÒ[?Ü%. 7݄!çO.Ñ9×T|§˜u çë$0¶(Új̗\³+r8\Üi -Á§@nkÙÁñFyFî*Šš`)o#ñüÉÔD9ˆÇ€àLH\î(D3ÇVÔ 0¬×éT‹ßº9x¹ TmæO|0p’G\’=å/·$€¥Ïwþr›VÜ$­¨Š—RW­¬ÖF—¥ÈG^¡T“sÁ©1ÓaÈ¡ú”Ân!óo§®z¸±²H,T~¹"ÊèÃ%:íÙOoªU^TYÈÐ(ƞì(Vâ4~›Ëq²'D^(ªE$‰oÈ9.a£y,ìl‹É–ÑÞÜUÔ|8ÓÂBç-(©O®[Âr<ù«…ÁHFàÝÊbô-„{…ü¯ê»{SªKw—IÕ.y»º‡‘G˜ÓeÑ–í\8ÁíèA†~´ªê*{\”%ìý“œk¯A)À£çv¼#Uéœàᄦ÷¼]Œá)RH%1£V‚Ä\üý˜ÖïýÂ%°X7Ñ»ɱRÏAœK•U å†@kó}Ì Y,(ÎÎesš‡Iㅍ,•ªg÷›Ë4Þug6¼Z>Å}vhý¸´9Aß°T¯2çÊ(;ùÎØ÷çT½è¡Ý$¤ÆßY~Å/#J½.Íz>#êƒ`á`U×Ñe'XÓ-Œñ<MŠdÀ’7àL×x $avõ”îÓE¸§?3Òÿ‡yƒ°,҈|¹“8‹,äŽ7ƒ ­góJIE#IùÑÒ, ÅÐ(qJ¯á÷>/T9*ÉqC"oºßâ/E¥QεU|hH6Pǽ*Ս(åQ¯¨ -C>‹G¿á¦\ÝcÂÃ%:ð%AÄ«=òÅêôÅ.· ƒù֋ûøQQµpIê*Î9–5‘QJø{—>DÀß (C‰Ü&ûÒÓfFŸ“ ]Aw‹Ãų¾BM¥³»Â/á‘Ë|ZíCIÓeñê!Úf±B¡ÔÏ°8åE uŕaܕҲRÄÍ|dbÌǓàZâ+D`mPxº–RR˜ª@»¹Nø÷Vð|´j)–¬@΋…tNÞ¼nYJá—ÛÆe"bϤsSévYbKË c1S½Sxo.¦-mjÆt§¹¹èR Sê ½–ŸVß~ñÁB.Qœƒ]¥£ìJt«Gä -0ÙëCf6¡:§Nۜ¹f-ÕÁ®8I7ÚÉ8×5ÃJNOZ×à;܄o<jçRÍ(5Ìž~¡ØÀéêÆnL5Ï|1ø?סz#¥šQÌ¥ ¬_46Œ¿»n÷ôٔ ò7U²(â‰à›Q(út1©èõ"®©|‰0!ºF/*¼há ×N䮢Äc1%Êè—ÇÐT¨VÏÔ¡´;u Mqâ•w”‹Ró2̛×å@lõׁϫ›ôð0Nˆ<˜² -‡¿Ô Ìà$ÊZÏGIÔJ@ÂB>›2JÓ"bµÕÇÀL·®›%‡è l1Õ•}`Àɱɪ.4LN©Ž{iÒâ¢à;ʚ<Ô‰‡ªº.|QC‰”ªÃ˔;0ˆ^˲¸W–ÉYcÆ%Æpê‹)béFØÌ£(v2c©û•µLÂC"к©1´,oÒéè7`ÍÅz×ØGωjÐÄå܅®´º÷ *‰Ð߄(0NWÎk6@1sݨEìúcüD‹n+Õ«Mn2˜|tZsÏ`b9ð ê4LB>+—i™½^º»FwwVKmR©ÎÝr~VÕhO?ÓèÜË -ÏKà(}¨-ðйò-m(œK³ÊµYÔf×fy«µ˜¯w6­¹»FR˜UÂÖziÎgÒ ö]ïٍŒ*°D 'G‘;ÈW5˜.¨ÚÂÂÏ%kY]±Å ›Ó$ÕµÚüâ[_SȨ2Ç3cW(@pºTfñC§n°+o‘»Vo§’þ+úÚ ƒ•~’ÅRäiµ9^ÆH5r·D©z Ò!²Æ1°Ó¢]ÓR%h·îét¹ o¹gdª#k¹+{[d骴S·,.Õ¾Ô2ÞåG»ñ!ÐzãÕeûp=äaÇ舷žZcûT—ì¾ÅNd‡„zE zc± sâ_b+& `®n®â¯ãt~ñ4~‰SÞ1/´EC¯SôWŒ8Ô?1IFíêºSûT§¥k(ºê9×ÜÒÜqV\¼éËômb•ÛPñ:9¹”É°á0Ò‹¯9­ažfGê+Òuœ¹] Íˆ¯,ª;=ïµêX-ü¸ž‰&D§; ‰éw„fÍ둼N9xh-ÂtÓ~ +꒼P5ì>Qo!*É-ÀŸâlX«q‡ÖJћÕaLëÏ9˜UT—+JÞBnFžŠ=èË2zÜíÂNgÑãÇíÎU‹ÂèqUU¿šØÃr¨X¿MZªKXx¨P]éø̺OK‰?Âr…2S—`t¬2Ì· 2:žJà‘4‰ïu¿ÄÓÉ1¥ÕB €¾AoŸMÑ.¥Ú4oÂ2¡»Ði‚9(1—òÈÕM‘`Q*´.+8ü†¤‹á¤°¥ì Ç©jBڋL:tÎLé“ÆÍÜÇÇ#dáhÜI!È#r£gzBˆK+›ïÍ%Ör‘7ƒ`ñ;.K2×ÊA|QZ4üÎw€…EôX¦O‚–¥§õíÂØ#oË06¤…ßÞjC¼6Æå’ÒEƒØ´O´˜|6ŒÝuَÝÄñN@ò¡Ì@Xt[ölQ«½ÂûJ ³˜ëv ,ö3å&æ†L!ÜJèÜuýûXd‚iæsêƒZ½óä.û€ÏeEÑ(kÞý‰n^0£â‚êFQü…rÆîOÄËxzó†âÝ ·iá¯ös±x×n  ÌX\£"³F|º˜ª8<“zm‡‹Sy&Պ˜êS'«7ÞhŽbÄÚç$ÏÐ2ëë܁w¨Qþ¾ #•Ô†ùeoJEÀPĔw”ú@X†Ä¸R;=֜92žÑx"ïÐÍ8<ƒÎ5ü©6›Hr|cÐ¥#Ê8IáfÖÉwä´Jg83é_=íL»ܵ:yqKîêp…xî)íR¬ñ9 Gç†ÕE“'‹mØ»-iÞÂö覫jà* ÂR$­ˆ';BšxfŠÇnV4w¯Þ†W‘¬¼ÙÚãT;H„Dz:@g‡D$;ö é!ˆávO£PÕ]¢WîIWfŠ½i!M·²À6Žõäí=GäÂëaZÑ(d°˜›¾b )iñ•ž ±lÛá«Åíe¹%}*4àh)ÝìÚܳV®«j†¦ÚÇYÓƲ‡Zu{;÷tóMZ,CeK$—‚G ³Y{~YÁ^5´Ð#ë¾¼M®Ê@PòÝe†’qDªË¬âéJ.%8a<Ý;±›1Ʋ=¶¬†ÿ.QÜv?S®DóáÄ[¡OpÕË¥>e1|ŽE ÆÅÀ„Ä`e'Äm^A #¼c¥.9p2¸ü˜ò'ÄÙ-æ6q“BÒÁ%ùkNٜ€˜û~¬H"Až©zÎö0øÏê’ÓðYÂN-DÓ«;Tº/rQãq©Ù¢¸š>ÿÍÞÍ\ -¥w˜oßê~$Gá‘ã\žÀ}h´åOHÞç>ÔGäØÇå¡/AóÀí¾l¬?¥ªïÍûò͝¼BšÿÐæQ8±Í}c½AÍ8/‰/gßEP6œù5œû š9ðý:ºaæpÉÏÜXæ¨L}.9r@™G«±$™c¹G‘ò2G!–°£æ˜÷ÊNŒ9 |6Œ9÷;U‰Ã€ßYþ¨+ވ¿Øì ˜#ÜÄÀkÌÑZø¹4L~ytJ|yu$ñåÕª¹^>­†—WwTMv9ðdêlèr ¡à%º¼^ÑÌÊñ›jÎ.gÆÓðh%#¨JÛäò;¦ä•\ ¯àÚ¦SÁP•ücœ—åU§$ܑ l9êƙÏj9µåyƒ–³ßýLf9:ë•+ˆåü«í¼rÚƘ¸r£<÷¤•ß–î°ò»œÆ¬r„µÔYѬr,»ÉÒ˼t='©¼™òŸ ò¦’ÌSŽ>F—yò˜{»}£d”c?„ ŸnçúÛX -¶™.Dy÷g²Ê{PqPŽºË><…"÷BôóeÒ³QD§\´éäA¹N8y¯fÇllr´:L½g„åµbqZ’Éc±°ƒÉ±ÌŸg.ùpÉÀ’Q´v(9Å>—yãø|\&C#Ù:܃z'’?ÍNɁÑhömÉ#ïVIî8òñ¨F/i䬴ã”4rv!Vk£‘«IH•c%Šý!Û ‘ÃBÈÌN#?ÃñN9,ìû0r$…}6V^Šü #Ç2œ!Œ€‘cÅÄú¢EŽúÆËHg‘iQÎÇíEÎ~&*_Qä2³¨ÞÀpX1ëæúQöº²Èaî ‰œ^(νUçˆ(uRԂC>2g#©3ŠP(?Ú(ä˜Iùð2 äã }Ý - ‡5*<¢[“&°Àãtx >ŽÆà\}||DÑIè¬G7C@ yü¹cbð8ª—¹œß¸ã`:s±Øñ{„_fìxV—oÔñÛzRSÇA.áÏtäõåX™ãw„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆœ.E ¶9y¬qú™ÂÙXãÈCñõ Ô8äjG»fÂзY4Ž´+}4^„JÎ8ÊAokL'f‘z†”þ5ÊüÑüp|€¡ä>CL<ë]Œg*ºé3£l™E@Œ,€q, õª˜/Žl¦J¢Œ‡kG@ùF/mÖI©aŠ§ºd‹ògÄÖªtx”Èodq=JÓò_–aCpÅápÝ°â„Èœ -’¶Â jqù[ÜF -rcŠcÅD o Åñ{\0(œÍû (Žì _Ÿ°²«rÉüaÈ[µRB€ŒMøp:g€‡è?øß\þLø7þ¤úb›í‹UíÉþæf&Ç(Á€f¢v7ò·Ã þnª©ŸÜï4lØï´õ{8Ô,oÆ"Ï> :Íð°r3ûÓIüž†øÆà}—¬| Üw¼–í{PP?öµõpÁú>õ4Ô{Êgq ‰ÅÄúË¡–Éú>Xƒ|=o¬ïƒHLŠS ûþY?³§MûÉA“ðFû†›ÒÜVC’µ½=ƒ\ñ õ;S$Aúôq%“Â7ÄÀÂõñÆùF¹ÑPï“ w²´0êéÅkÙ0ßð ”B Ì÷A8ˆ-.¶©îl”ï‹ÈQÉø4Ìà~ÖZª BJúñ]LkHÂ÷UTš‘€o fR?­|oˆZn ¼÷Uœº7pê{®pí]Ü*:ÑÞ0D›Õ™ÄÑP³`oˆZh¨/¾!Û°Þð%¥ÿ4†E󏮗5Dî¶çc‡z§5Ê ×`}u0½yŸìµÍ¢òa®>‰Þ—k°è-¸Ä؀ÞWÄƒç •‹Çç °„fÖxÖÿœæ} ÁòNQފò†ŠŽX¼QÂj @tƒÉÄËÝHÞ\Ÿ\‹µk!@±iØHÞÓj’÷=§÷'G|ºê˜\³µr¼Õo©ŸäM…›ÌɛòFY{—7’7Þ·al·wl&L äÍ¿Ó¢†ïŒf‚¼!å,Á1Tì˜ú©¢¢Œ ò&C,ƒ¼) ‰Å oґX¸²¼i&(@Þ|R½MŽ7E6Ìoo -k¢ÜƒihHjp9Éñæ&üd7Ž7Ìl~oŠn:’ã ɐ‘Ǜš}M]æxŸä,÷19ÞxCU1´q¼©Õv G6`f#1ÞMa¾ô‰Ì‚åÀxC.uÂo -ŸIùÙ0Þ0+˜oJåÈ5Æ[Ú9V«­oîɪšÀxŸ ¼ Œ7, Þío\X÷Ey@h—1öÀxS@Å:ñ•âÍþËñY)\€°˜àòÆx#Ìq×sÇx#,wÝâ=°Â:ûD£·"OtEx͒à=¬¦O€7ŽóNïO<]ûÌc9øݸNH;¿PÔ'aœ\2½›äãK•L ïFԕ ÿ€wC‘óx#LÓϨè•ÜïŠh“ üØ×Jj7öâ{»A»¤â ˜ÝŒ8²–9˜Ýì OÜÑÆìæE—C»*†‡÷¸À˜Sª[eÛf\®…ógÎvìNµ(9 çځݰ²Š*xÝ8ŽâÎÂuã×TJ´ÐºOŠ&•¨¹“Pðg×­9ÆIš‰ëe/ÚÒ²³‰& ¸ð7\7̪x \7-¤¯×MC±Pmâºif9Vàºù5áܘ‚™L×ǎëF`[õªëfí† ±nF•·•Y“ÖÍzVú®úõÀuó&©ÔtåuŸH^7;´3Ö¼no¨Naåu³„&QßrºK‚×M ©‰¯›‚ZŠ&‚×ÍþP\°s—*>7`·$¶”šØÍ UeüDzç‘vb7]®h‚Ø--®7¬—­ÕÜí ì†Un‰Ý44‹Ïò7 މ݌ðI>hb·ú±<Òðˆ|„¸Õã–“ØÍU•Ú‘èåË=X¶ ‡ê Ù-ó«—6t1¯Ý0ˆ~¿!»Ù܆ø€@vkÝ`ˆ·ÖÒWô;ِÝêþHX‹‘ÝŒ‡éÙÍeN¶'²›ÚsaiÌì¦>]߈™Ý´ècX™Ý4Wg~ì‚$²›?ÊÊÈ Ù-Éÿ©RZe}Ù--ÿᬉì¦ûÈ0A@»qßnQ? íVXı‹À Á‘ˈns «§¿€v+Tr›t’Ðî3ûјٝ–dv38ÃÄçÆìƥʙ f7}E: ¹àÅäËލٍDåÉEû#¬œTKd7Qw|‘6d·"Ë£Md7Þ8"~Ù}ÞwÐqd7‹Æ¤† !9²›®¿:ˆ¬Èî3U ì¦…©á@v^5,+ -ŒÌüÎ7d72‘)¸Rž¤•G…3æ"{¦oÈnšÙàÌÈnüUk‰ì†…ߎ솙pžDvӢ중ݲ0é¶"»ñ£¤t&²)RŠ·‚؍”¢z®ÀnfDIº`÷p.-YÜY±1»ûùa[ÑÒý1±»Õ(RZÝ°Ž|qö´“Àu·:…ìsIМïIXw‹±)6k]í¨îæNéIê¯îpt±1´aç<´ºIº~Æ´>=hfæt§aãtO«9ÝO‰–aÆoƒ¥†½+¦»ßÃçfæÌ'¤; £{Z…èîє0Ýq0øººI+¿@7¢Üªˆ3ŸM#+žûqÞ<÷2£ s?‡ßþ ÎÝ£Z°¹ÁÀQ»H£¹|á0µ‘¹Éb® -áñ.Òpêr8­ôÓøÊË #)—A冡ºL®+bÊÁížLî~LåÓ¤ÝÝ®É u†‘È;ÖGaV²ÈÈÝãC^xÜ@Ö5ÓnÝjÑC9hÜ`´²äaƒqÓjˆ9ÕØOV£¸_EÖ6w‹õAÜýªw›yI"ß0ÜÔ¦²ÍŸ)ÜÈÃ+`w÷bwgp³IøÁÝ¢:Ü8!–mnžÆÍàoãVs@ü6 ôîWúv¾Í²ÊÚ'{{=ÎDogç o÷Ècg;ˆ ¼Ý­WKîvw«ˆ¤i£¨‚£üFÝ~š«r³ÁÕb"·!G¤Öc%n‹.:&pαÜ~Bì²ñ¶aåp¼mÔu0ƒ¸mPÅU·Ò¶QEÃ@À¶±ôfúͬíü{CmO«IÛ ã4·ZdÛѦ³=?˜m,MÝÑ;ºSÁ_Æff­„"®G¹ÐáRz5SWÌ6¬µf -[³Ímxˆ³¹VañÀl³¥’²å‘Ú¾¯í×Eªò% Û<1Þå€l‚ð{VÏÀéäµd›ö%È6èãݲÍÇÊÚlC¶ù~p È6-Š‘®m6 «P€ýx\`bÈögïéKzVLÈ6# –mmš•}5d[‘ÉÒ'R›G• ¯m†Ä¨n -È6³Ðmà0ùÂlŒmÜ×q›±=—ÉÁØÖ·î†K ¸D?é`lÓÂ+¸3BÚ¹ÝÛgÐm’± ‹Ä ÁØf‰í£M&bW*‘] ¶ñ -‹ˆmx….õ^ÛÓNeÞא•ˆ‘qF•Ó†Ø^ÌFl³É33Ø†E*· ±MbãØ>É??U:«nô sàÙÛx…­1b›C5&6bÏY » ±r=Òӂ±º5qî]’Îîy;_9¥¢Œ×†Î!%èÚx]äɯtm‘8œ^›A$uB÷B ׬+][V*’Œ×æ±î€i«<¸xxÙðڌ‹²CIðµñÜsL¾öx‚ƒ¾¶QOåºLæ<Áȼ6ë‹Na´']m~êÂֆ”‘”`k£kÇ£´ÆŒ>ö( ²6Ë«V´Làe[ö•«õ‘3ºP¸âå,ÕbÒAØ ÚÝ-ƒ©Ý]¼–HmÙ ZˆÚhÄq;€ÚÔ¦ÀõlvîÄV Ðör,Ñ_V`öí”äeßîÁ¼ìFÜæËΆKÁÊnŽ•&*úNâ)ÁŸ PöíՃ“3µºZ1Ùw*“}ǜ”lœÑe<æÌÍcªap$٘žº¡Ùô‰nâíˆl8ý -'8d„Óã€l貨¨^ùب·VÆqÔqGûEÓ±Gs:{¥cÃÈ0SÀ±Gô46v03w4ö° $ÉØÃyˆcÃ?7ÁØL´VÝ1t©äbCÁª‰Å~z´Ã0{æ4¨Ø#ð+©½D-“§ûT„X›‹'º›f>Š}’M|Ž„b3'AŸ{£bì¼RP±‰à:ý:H³Áæ6‹fiå<¢±Ø°(¿XìóŒ*ü ‹­uÓ¨‹Í8]¢Àb‹a´ûÒWþ¢šÇ‹ÍijšÇE'°O®æ ~c.6\68Ü°ØCÅà Åk@hÍÄքíHìá<‰Ø0h ö0zqça³zøj‡=‚i”kF/™Ýh؄b\‚ÃÉ®®Ã^2y+›ë -u1›«ºÞ&›QÕæºÎÉ´fl•úîÀaóì®kÒ°éŸ_ãúʞÊY ›ñC{Ô¶—ݬ8l²¨ôÌ8l^z'¢Þ8ì´l8lìiȃqØøPN6\°ª’‡ ó¥6ª=D” &›^;ՆæSGveà°ºPåŸhØ܂nÃaóä®kÒ°ÏՒIÃf G商M«Ó°iin€ÁbÅãTXq§aÓ%-®K¸´qåRÒ°aQeƆÃæbú2÷DãK‹4Ë: *”m½V - 6—¢ÊèL¶Ä ãš8lž=OÃFlL¥fÿdõêéŽb8ã°i¸bÅaÃlD‰pØÜNwÃ8l\#֊ÃæڈܕÀaãÉKiö4l@ìÅl"6~BA›]3 :÷[s…K˜–ト½XV"ö4›«B‰ -LÄÎwwgb3=>$6Á8›IÍârÄ©ÿ¤™ïJ@±™ÕäÛ$(6“ŒJlPl‰òû˜Pl–†0(PlnõóFŖ⺷IŞ}ɂŠÍØóÜoTlâTÕ³ÂTl¦¢Ø¢!¨ØüC|°v-R>©Ø0ð&›13vºØ¨ØŒ8±½Z`±iÑD',6 E¬Xl>u:ï»£ñµ±Øˆ+¨ÐuÃb'VݑQå?H³”>°ØõÕmXljQ¨¡ -.6œM7ÿ0›¢]6.6Ì\À'›>¬àbÓ¢ö‹+›G¤ (¸Ø Ǩ }ĵº¶içbÓfÚ<¸Ødó±g`p±™ÁPC͕‹=ÍÁÅæÈV€ÁÅæcÿ…‹ ³;ï8‹´^ÁÅæ6Ôpm\lšù̂‹-Ôa?'›ŠÈö†Å¦Î“èÅ†æˆcMr±™*îÔ2¹ØŒ‘“U\lV5w ¯£« âÊÅƑ¤5›+*5 {ZÍýBÿ£èZÎwòÓjà°îà}?}ñ.ŸIÄÆÃ&E+ØÍÃÑÎÃn¿$»944ìǾÆÃ~}L µ‹ü' -û‰p#a?ê­°ì&|qb°×ìì'FÆ`ó}¹KP°¡vQ~d…`“8!ØРq¬ ®t±˜oC`Ã(è¦ ØHAÏä_3™5®7üui‘Ì3ý†á.¹›úìðkbű -û½N¨PËs±–^ÑרנÃäë`Q%ùúŠFáøò/¤{Mõs½&õ¨ª±#¯¯;üN¯¯èäÀk¦¸Žçw}…À%p×(‚`ð:pחñ'íFº¨»¾B¹°k¤ÅØ×{c]£h”IºFzC ¿J¨¸ags]‡Éꁹfðp\“rÝB™ºA®‘:ªc"®!™!]/×Í:Àpݼ(H¾5öc >ðÖ80ãÝúîñ8¸¿£k°­oÏa;Úí#›Á¨47½ï!ýà9o\k,Ԕ¬Ö:†Zw£fv¦5֎ŽßӍâZ²*;@_»ñ-݀ÖådÁkŠ«µ‰³†\PSæJ³Æ7÷we”‚š[|Â(aökeY»€.IÖ58ÁÄ4l3dçX·èúëäź pƒX³KÎ¥¦³°Ûçà‚ a *'Å X¨Ì„g¬oó…6~56ˆý_},èÕwHq7x5¬,Èv5¨6Œÿº¿v&˺ÌïG¡£Wç#u#¸Ǫ̃Zä #­3ˆŸ]0«/˅vdõ•M¬F]Š§V_‘¢Ú€Õ‰| -^5 š„‘’ W}E€ UƒîÇÑ `Õ kßXÕ¨°S¦K’.KÑMª.͟ïª.¡" Nu E`ªá|´þ©.öDR ƒ¸bT—蛺!ª_ž€§I¨®ñ~P}s{çSß'<5 AšÔ¿\^QRòXԛiº¥Gå–NI<45‚Vd"ohêÁ¼ìù‘dêêVh ¦îî`µs©o'K}zÞ*µ%´;”Z¥(¶bR“˜ðþH$õCªÌ;‘ˆ6Î õã…`à¨#6ÿ£¶~+YÔ=ºOE]¢únGQ7{’Dme‚¨™|øÄ¡fd&Ê5ñq{ÒJ5ޏӕ|BÚ8¢)‚¨ƒ—ÛK}4µšêËîU¨Kø ÁŸfa¿ÁۉŸFý_S)*=*¬‡øz&{º¹7è{Úòõ@Oß 9œ“<­%Y-oäii\ú5ÉÓÓÞìäiêS°¤V‹š‹ØqXÔ?1Ðӟ]öo¿,ÀÐÜcMèéê,_’§—à黄NxåN# !6§±Ó`‡¨ã´©Ów”ÅnÐiDèÉsh¥aœ†¡{‹¹@ºCü`à4RÀwo‰ÓèV4U¡Ñ)s-½Á¥!.VˆÈÖçt§1¡¥çŸ+Y:¬ –î¡ -®tèꆕ†àºlU¿ƒžl¨4 ьqñe£çL ¥{è© ×o'V7 4€_Œ5™'Z+Õâ'ï¨¹_ãJ?·ñàIÓPÚÄI3^~Üo4i€ø5&ýÔÀn &Í^ô÷ýƒ Sés£¤!3 5Bďá+;H:qeÁ‘Nf`¤½;Eå[§;—Fe!+ђ! CqÄ~"¤GDx‚ ŠÖ¼èÂãÈmÜøÑcm‰/°îÖ&=Ù¦66x4iÅmf£µ«^ÅèèNj؝ýˆo—ÜèáÕYb£YHy_;5š¼p¶Í34'ÅBß`FK‚ä= eIdôˆÊ  F¯šÀè'2ÅÁ‹~œ$K8t ;-J^v Z4èm¤ºGŸÊ ¡I¡aEb}, hjìûxãD#Åø¦1Ñø›S¦D÷#ŠÍWH4òcQq.Nåa X ¢‘jcöFˆn¯'!ºEÙ] ¢Ó°1¢§Õèf–TŠ±BfÔiCD£Ûú({°B¡W€19*V.îˆhðºnßL&å°p*mò¡±¢Rãeü¸ÄCcõ¦z+˜UËv8ômI²¡AuRÓb£¡))c*¢¡›Õ^I†æ2ÏŬ'dÖYû)·¡wž“ KãäBsñÜú m2âž×PC¡«•¦;Ü®8w~0‘•K$ô»kôå›;_ÿý"¡¿FzþÅã׏þ¯~þýzxîwÃÿûËÿû¯ÔÏ|ÿ»~ý¿ýøÿùîããŸÿŏù×_ÙíúíO¿þóÿæ‡þý²Ãɂð×kûK»ý›ß¾~éßýö7¿ÿ«ø‰_:¯?ÿ›ÿßßþø‡×iýõßþ2{9›×ùÿöÇ¿]Oæ7ÿþÇÿøû_¿îìÿü7¿ûù÷çÖÿæwÿùÓÆQyò_½ÎÿåÇßþ§¿úýß÷BÿâwøÛ_|²úúë_ü«ë×úóo¼; 7 ¿þ³ßýü篷ï÷¯ð»ïlÿ—?þ§×9/ÿò«?ù³ÿÌ{ôoÿòoþËßþUëŸýُøð_çÿð«ãã_üêOŽÿ‡_ýÉÁ¬Øïãã}ý×ÿó²ýá£~üëÿóÿ:>~óÚãßÿůþä»>0ôã~šn{û=M‡ ÙþÚéûíX¯¿~Æÿï¯ÿy<ÌÄhZôXí¢L¡ÃK˜éµ¼|­ñð¯¼ÑÂ! -p\r¬)>Ý0QgK2ϹÚa|${Q€QÞlX3Üè6;FÒþú‰í¨ô¢^£Ûv -aÔ°‡Ÿ¸o|*úµv÷sXìy¾ó¨Ë…}¾ ¯üGÜâŽîiÀÙ½VýðëØ“3Ñð/gèAÍÈk¹}Ý1XÞnîy|üë_ÅÃìKvúCÐtÜ«FW´½Œõ_oF *ty‹½ -̱¾ØëeØÏÁÆ拶Û_óºãŸÚË ð"Š€FqükµûLX»8Èkí|3B\Ïu±#‹WÚÇ~X²9®ýlüáÎ-OûŸÞçÿúû\ŸZŒ³{Æy-óÇ^ÛQ+^å›mvQÇ۟ŠWúÒâñ¢¸å÷ûý…r+Ší4N¯¹Öó]lÛµMûr#æQ—[6Oa¿¿À œ÷ûÆETýý±¥ñíOû|ò¨ë‹óé.ü·ßñlºˆñûÍÅ©·ãÙÏápÎh=ÙŶ]Ø´/wau¹_óö›‹ß€7¾o o¶¼½¼Óøö€§}¾ yÔõ­ùt¾ÙË{«™çû˜V(À_íßiÈAÈlÓã6¦-ö9¦-‡cÚrۘ†Aôa߸C8ò~ØiÜÏaڗž‡].íÓ}ø!ÆOÌ0õ8?Ý"Ì0ÇõvL&•ßËò‹‹q;½Å>¯e9ì¼êå¶[„)±#â¹m ŠVwÛa§q?‡i_Nxv¹´O÷!oѼ{û„>÷2¡Ïc™Ðã6¡/ö9¡/‡úrۄ>÷ºq¾ëa§q?‡i_Nxv¹´O÷á+oÑ~‹æã^Ž3_Œåãvz‹}^ËrØyÕË9l·h>îuã|1ÖÃNã~Ó¾œð<ìriŸîß’ð>û)6o®‰9ýÝÈêÊþÉOÁä‰<Ãîý*ëÅ÷OÒÆ÷QaÝx~èó°Ó¸ŸÃbŸ'<»\Úçûðí—/ûž_ñró{_Nx1nW· óV,Cμi˗¹Ýáå+^6žßûòàÒøö”§}y%ò°ëËóé>|ãÌ~{çg¼œÃüà—³]ŒÛ¥-£Æ¼˘3ïØòin·wùŒ—ç¿<µ4¾=âi_އ<ìúæ|ºsއÞ|ö/«}6ÿ"()6Oc1nnÉbŸ>ÌrØéí,ç°¹FŸÏmÆU>¯šxèëmÕēÐzcz؋qsÇûôݗÃN/ÿú¼`Ú~YçùoÖýӟ³uÿ^ÁÞë{y?|—°.Þ»_²zïï?o úþ·G$/öäL‹ö뭚ÓLQ<ÑvÏ`zÙ~¾Ù0×e’‘™á€^?¶ƒ2pð”í Â8'™ÑûÛÆ»o‡Æísží<èrYŸïÁ·œb°ÁûÝ=ÍÙNCÔî{;ßŶ^Ú4/·at¹aó ö»+Ÿ¦¼m\$ÄÛZ÷<Íó]ȃ®/ͧ{ð­¦V²¼ßÚõGÛ9ð¯ýÅ]lëuMóræA—»5Ï`¿µ'ۄ·· ÚŸX÷§;ÍóEȃ®o̧{ð-£c´xT½Æ׀†rÚ¿ÓX\zqþêoF«¯Ñ1Û«êgöÃ^yîçp%Zü;ýÈÍ®‘ëÆ]êßý°Ó¸ŸÃ´/'<»\Ú§û°Å5nyÌÛ-â„{¿‡sk;÷_\ŒÛé-öy-ËaçU/ç°Ý"xÏ3Þ6vÙÜ~ØiÜÏaڗž‡].íÓ}ø6 ÷|OæÒgšèìoN8ÛS ãû›³nœ/ÃrÔi»?½·/SºBóQÍåÃ4åñæÃ[~xÞ¸ý,ç]^7Îç±uÚîO¯Nžå· â߃°o÷‰×1ê›Ñý~Sãí‡Ýƒœ>‡OAN=Ò· §ßzØiÜÏaڗž‡].íÓ}øÊ`°ß¢ùà—ã̇´üâbÜNo±ÏkY»9}Ÿ‚œzŸÞ‚œõý-Æý¦}9áyØåÒ>݇o2Ð/¾>ß^dŠI[Ï9e¼çÛÙ.ÆíÒû¼Ëa÷¼¹ÏáSÞ|?·-oÞ[&rŠÀñϲÚ}&í¹÷w1nÃóbŸcùrØ9ê/ç°MŸÏí[ ӝ–øiEaó¶J ëèlÄ4Úu|_RÈÓÍh¶×)ö‰w‡ÞÆ÷%źñ\&ÌÃNã~‹}žð<ì¼²O7á›E³åKo·vzþóæa9ÓŸ]ֲ̘÷`Y¤Ì»µxóÛ­]\ÿeã¹FXžXßï´/ïBvyiÞoÂ7Œf۝Þîîtþç9ÌUÂr²‹q»²e¥1oòN™7lqè·»»xÿËÆs™°<´4¾=ái_^‡<ìò޼߄oÍnß{úùyPûö¡3¶VÞFâîçÓ¨À.*ϵ -Œï½}4½sÃù‰ÏNãþë‹}žê<èrQŸïÀ·2ì÷v~¿ËiÌ/}9áŸ]Ý2\Ì[± 6q˖/r¹·Ë·›Îo|yXi|{²Ó¾¼yÐõ…ùt¾qˆa¿±óÓ]Îa~äËÙ.ÆíҖ‘bއeœ‰ûµ|ŒË]>ÛÜp~Þ˓JãÛcöåȃ®o˧;ðÃ?2¸úoþù/úñ7ý=°ú‹­Öƒ ŠkùÐ…Píï®ÑYµ²Ú¿³£Eµß¿ç—ìËq~öy~¥ív²àK8L,;’]´ÔùÛøúE Èe¼qËx¢¨èK¡Õ×ëù|â¿——ú²¢µ=Ê´ù½Ú'ƒöÍg‘ýÁÎ2¶ µ -üÝ×ëfã}>™ú\y2,¢õ¢ªm¨ìÒ%¢úJƳ>…׳à@՜Ná9âÒúVê~0× £zÖõn ¼ß¾uåò¦¯“ê>ƒbÓkàûŽjìܝe#º3x²>§žÆz·¸*ßö‹ƒå +·Ï¿^¹íÝ}€yÞ—x>xB¨u9،æè~> ‰½n¶íÍšŒ±xj tˆØ¿¥e?hþ¸Ùg<Œãµ¸ðï¡|Î/';õ~؆%1¿¢1ôk4¢56MlÛ{ύ½iÅD­c2¬ùµ˜ç†.¯|ЯC´^¯87”Èي¾T6]÷Æq‡ñà=»ÉQyâÔ.Ñ7eoºGQâ&#JX¿zŸu×ÇyžjdoW<ªR›LõÛ \{þŽ§ÕÙ8áÒ«ûz×r:õè=±œÍσ›õŽç8æ­zTòìû퍏V=NœÅƒÐ G¼ȂçâÑzð±q|Oæ«W±¾K¯}tÔ8æ«ÄJG™QÌû}ÚkÚۈ·4cÈ~?ð|À,o÷Ù÷SÚ¯sØ^5ZÀˆT?³+lwñóê+ÞÍjæcÿRm¼çA÷3ðÉÑp6¾MhUt8~c{õgÀàOãux…òþâÆ}±ÔÐö‡gÂ#”Üøéùse9Âzyz‹«(•Àh²èhgáaº6å¹ýhîŠU¤‡ ë?/ÏÇ_ûÅü8;}øÙ\gqv@ÑlïD›۟åãˆW{Ô¼qA3 -{ü¿¤¯žCÞ+@Ÿ0؞󧰿¾,ü59õí6ð嫶Ýú–ø5^¾#’Å\u^Å۞(S]棯Áúݱ-FPÌ¢ùáÍáóö‡TÒ÷¹+†õ’#ø}œsü-¥æ  ¹?õŒÛÆþo?¿Þ¶ýªúšÃì'ãËýýyë!œ‘=ÆjÙÇã|>Èsâëv>¿tïu~àQ—˜9÷ü”ö³ûM¸/=Vu¾õ v÷ã -c?bæ?Z¼ê´—+6î56~î8lÕúù¦»Ò¥ýñÌp¥+S€ƒïÃþ´Ó‡z­·äcuÕûÚhÇéӑç=H|”eûŸÂnς£ß£+zïýXËAã}åÁïž÷ ‡qçéåÆ%GÚgÏ#µUÿÆKùŠS¨ña<˜þ¿zóúÐÿêèËþ”öcNlpPil#æ®,lìq'I_âÙ^Zl\Òk-O%j6êöõܾÏÉÝî{9ôB~ -ûyœ^»Ðµ´ñºü÷£Ô0jXA¸¼§0—pŸXd#cõ´b[/_=…ݍŒ¤—žCW—éÚVúêðýÒ bû«W‚Zl´¿ƒ#Œûïò#{\6;t‡±Ù‘ÄññՋX? -ú«šF‡xA²?µ…K¼ïÃnWö'^ÔvDˆÇøêó7¯ 3_ÐSžxQ0Î%ðƒUé÷i?j_âãÃx´¯y^è °ÙW.x´æ¥°Vj2¦‹>(y¤ñ„o$ã±¾Ûg¿ýöŒrǶ£Ä¶5¿¹rÄ«@¼Ä—_8µõã &Ó¯öµ|˯yæÓgðþŽm×ãþüEô{ÿâ*l`‡ç§°—[*ì'!"Þóª<’¼ŒWë#¾ÓŸ$[Wûf74ÓÕ¶g/y[†mGyüK§—£Ü¿7“ÍӓŒ7.A¿uÙÁt=kÞkØkDDÛl<ã|ml¼ãG]Îa~a ´ÝϻĪòGŒK¯å~øöl|ó{:+”ÛËØâ-ºŸ»|õ1å(J×Gî¡FoYæÏÇÎçœÁ·Ñî€vÆSËBº¯Wÿ±1â<§€Ž>©µeÍ ›¾:jŒÖ‡V£0>sïÁ íÝo倓/ó/ï"f‚Ç+nn׸—‚8½cÛËî8xñâŒ+ž<—WŽ U òJœÿН[6Ñg}ÜSw/§noeÃ¥êÔ'Œ¯Oì\Œy„ãÈôº¶¸4p4«^ ðÅG®VüªÖ¶\Å M„Ü–O MŸh×âV0è-çKâ#ì÷ënõï»Þô¦Ë'¡é·Öü0áäë‹N{£§+÷¹™/c#OOÃk~ÐӞðÂkÉûvëW'å:ÓãKIJځž3_k ½î+ì(š’±ä®Ð4sÔ¸_‹¦y„p20€¶énö3§gL…i¿Ó¹õ¬‹{ú nk-á9ZÂ-ñøzQ„Lý]â%ÌQé:7ŸêÐp‰~¥9K>ž6h‚žÕ7 ¡ãïÃ|ÞÍ/1/OƒÇl”ñP­^Üõ¼6”ëŌ†.¶åÈz_ã‰äböuü˜LÐ2öŽ¡æ)óÅDF5^ˆÈÙ½ã±Ù3ÀÒñ¬-Ýo4"¹ïu-*ã}Ý9Áøe8"ÀÑn9ÀëQ¿ÔybWÎi1f«J„rAT+”¸gÁΗ;<äGN¯+9tÈÓúæ"Á~iOzÄX‡Væv×á:i¤Ü·w/pŽ[£„o€á$¿BXKä†z“[ -Î~~ÆaDãæðko¯xe¯÷êU5Ym{G@£œK“'½mÈϜÏ은ž.xƒ(ãuěWsœÃrÅs=ZŽå¶¯! 0óXÏÈ{pg¤+ȉ6xòsÕY¡/J¼K-ÇúR•ôÛzӞ#5À6æb)ˆy€û‰×ãÊmëùä×3W_}<@íy»îøØ!ýlá-ãû„ m‰û1µyÇìW9b¡{¶i>Ž”&ÞâÓ×1¹‰ç“ÊüN -zE,(Æ´„t(ɃìwŠ ×ͧÍÀüáÆkÍÊ-»[ -ð¤ìØ£Ws",˜G -oÉÁ “Ò÷a?óNz憭¼Ç…НQyxÆÏùEÄ œÏ –h¬:Ùñ0£wêCû÷c<4+°Õ á×az¬*Íg'x{”¸<­BôÄÑyª·œŸV®Ð¼Ä^#ü÷“kìüzyª­JL1z Ž×sɯüqŽÆöԊDdáK b<šý žšq¨'ä4bd+Å.ÉGÞnþ/øQç¾¥ôè.Á¶é)ŽçŒ”;k¾ay„㊡¶…&Пii½†±9àk÷QÏæ˜$ëÛ¶ÜvhÒÂQ#¦îcd|­«A‰ßÙ+~í°7ÇVdqØאŸsËÉå@{¨˜¾Çðùb ³l—+÷‹1BÐØ®œ4‚pãâÂÐl2Vvm†\Ž9ɲ¾S0öi9ÅÛîÔ7,+Ti38Yè'âåô4ÄtHÆ æ4†þm¾´å–_¹µd㝠šž‹†ðþÁäÑ6¿'žŒŒÍ·« ¿HÓO„ -#'€¦£™(hŽ¿j÷§ûK-˜Ç“7ì(±FAn¿â–KùrÑq¬ԃ†¡22BnwKz4žk1xÜÝþíçș躽míGúö©{j‹¨?{ÏÆ#ÓBã þ°ÇEIÒڂdෞ™7Æ÷”«¿çj޸ՖÑ«‚ðAÅbƒ×ås]‰·šïV3Õʽ쟞ËL2Í7h×sEšïșðÀn6ú–£!ιœYÉo2(£ýÿì½Ûr9²(:ÏÑÿÀˆ}¢{]@…ªé˜Kn{¼FnûXîž^{ö„‚¢JÇ©Í‹»Ý?³^ög¬·ù¨ý¸2L È"YEË)s.™De!@"oHD¶B¢ - -”{ 8¨n š»:¥¼.H;/k)X{=È\4ǁ©» ­‘:¥Eå5f -u!Ø\<>$f4Ç\v]¡)\Šú^Âtì>Ë -n̎$tD8´A5jÅPڍ a™$cšú䨧O¶µ՟ø”!©±Yâ ÜôÂÊ¡6ܸ82e°Oo€P9!Q¹,EÌG£P”< †ØyN+%¤IÆzó±†ÍÐÑé‡-4O¡v:qG…,+ Oا4gý^Ü"Ϩƒ¢›äL4¤÷é‡ºS‚mÏ51@å³qs㊏{² ì¦@‹)aa˜g”h-3ÐÚg8e˜‘ƒ ”w6%µ‡%l‰‰@\çBM­àT¾mý*+AHdÀ `ASGFBJE¦¤,YÍ®V!hÆÁ"ì_Drú­bÿ'‰H¸U‚¥1&¡¼€$aÓ =ò ˜55V,Lef¨YƒÅ¸‰Ç £XžóZ àŒ\¼-"ó@É;“}¤Ù‘ú±ÜG=Lƒ–¨V!Ã>Oœäz[(Êí8çÍSm.ˆ3Bsjm¡hFEY´¹Ï{çŸÛCCr.渻½2ObqŠ¨c¹'-¤Îccb‚H$ëŲ‚A±±,ü¾˜'î¶/~CZ ³ÐC¢9ÉD -ƐRþ¿VþøAÁö¶í­”œýR¸R֎?pwË)ÁMJòÝ%M!PRö¬8•˜zâÏ 0ætC3›0„ó £å¼š8e¸ˆ¢`˜y〠÷AÃ|8”á\Qú9æ x 9ÇÇáL†Ïí)œMênò(/Gs2â0`È(Q"•”$]¤¤šJ¥hØ|ÂyÊLFÚžÌ É,ƒ×çòÐ2ÀÃâH• -`ÚW!°ìϺX5=„l…KÅ7pÈ;£ƒ™«¹âg!`åI«u¨×t¼€Þ7 ˗Ya¢ðJZpD–³D÷I ÆõƉ؁J‚WŸ0ž¹¢c*²¹ œ‹gé+X§¸!JÉ¡qT•Ö€*ŽËrb…âLþÜIOhl$‹ïŒIŠ0„è èüÓ Y“Âøc påo¶’“^U乩Óèᆟœ’Jó„Èr¿Ûb*I.LjÏùtNF‹´ ‰;ÐpcV²„·wLê®óې¤œ9©RZ®•Ý"em(“Ü–—ÎC~]o+ߐ¼IjLZž€r,—A¤kÖ ÜBMÆ茖áA¼Mý²êœH/Ë:W¾-%ì‚*ÑA»"ihó<ꁝάÛó©”TL•g \$‰¥Â)+é®qõÛsB'²ÂvåUR#¢hÞ¢ä€Sˆä[šC¡Ÿ …¤ókÁ5ƒñ€S­­.ž†ž Mþ -”B¾»ì[’8.³ m$ޑ1nÅûÞç{–õìg¤ Š»D4kh¿Â¤F>ґJޚí2˜Ó ÓÊùÜùˆüa?wsæቮS²|RFr½³ÂP¨©ïÊâžD& ê Ô5rl¡:B”¹´“tíy0IsGÑIâœ0`¢±n—Ó©N)òó9>“¬Ùe 5ÅX™×p3Zmè© -šoÈ¥Þ°aAA!<ìÌ:uAçߤqžÐ3$ã4ۓ^As½pŽe° |ð :áŽHƒþz “ØäYqvTÉÄç¶93DÑÌ© [,a>rÐÐ[Ct˜3OÉLóAÎøT"L‰ÃRÒ 5:µŽ¾z¸<Ù5ÙtAÐy_P.+¢ >„cre¨qA²V+CçáÂùf´dûŒAmá•Ão Ìhɨ v§“Œ5îrÄÓY§O ˜ïK˜Ý¢æ[²pPyŒ9ekSzµ3—tÞ -'÷Mù€K¡tÀ@êF8­ h%wÌ©„~±´}?’³ÃÖÙr¸û”†Ø+³µÇ =\-•ø“]¡1bu;¤æŒUäaˆƒ7ñ)sظÇYƒ‹ÂŸ)ôçہT&^²è÷íÝ^äœ{àæȯMï–I)®‰Ç¾5aÈÂq¡StH¼q Ž™Z°’€2¥©'#˜‚qåM– B€t®š ’Äð²òÂn®¤–‘‰”Ô¤›Ö4[n=šqgL®ØÊöïÕ ­,2O³sä0Yj¦³ÿèÛ`W](# §F±Ø§‰œq<Òïë³¾†; /¦-\º:KI5!ìþƂµLxD`8ço•ñ@S‹ÇšÉyÀŽŸÞèµÀ<§ÄýÄï©Ø’v?_ºÆYý~Æ2âð¤°"ÿª,ˆ‘IìIE³Å‹¾©Ï[‚çi)åÑ¡³œÍPðñ>ª‘€çVKÚ-i5å‘)šøCñ9xFL¼jsžÓÁ,DNàe·aÁXŠ…$‘ÌNµ zæÒñ°‚‹0¼ç›*¢ÞëôŒå’#<šœ€€p“F̤@D’ñ™IŠÙ -:AÀ8š¢ùˆ&ë`FSÒ+ÀÈM"èT0ÎdÆ`W†^êCÁæKêÝmûQ¤+H—à˜åAŸ­Êø ÷Acõ -LIað)»(ã}DrxVK·C¬)•áC:ؘºàÏÇá‘HElÎC“2 ÐT»×B¤%™¦ö)õÂ4èëœ`ˆŽI‚ŽÊˆ½€ê_¬Aà“ª zè¶P,«¡©0‡w„`cÉ8VTëÈí(.WÑ7·ŽêPK¶h„éÝØá”b¦VؐP•¾cŠ‰¾4cÐYØÕ2 -Ûz/O$" -åî8ô³‹ÓXx8eŽé#èÍ;\žƒ¾·¨Ô  ²ñ¡ŒHÓX¸ó Ô)͝¨ð4vI±Pg 0YÕdÛ£4aÌZK1.šÑr-¹e„Xs• LP`ÄÞÖ¸¯Ô¢á:wE0Ã0:UŒfBØb€G¤,ÙiRk§‚û= „P3H© á þdœOØÙ ’ê†ÃNkÈ0©áÆ9ՖP:崃ŒŽn«„U5L} i©”vÂÅZÊS¡BòDÊÓ Ìæ€ÁÇ1î+P‘¨%pmQ79­8ŠMB®Ÿðμ\˜HÔâ’f ÁÄs©­ØØçÂë¼ ÒUx!ã‘2Ncñ‡Jn(ÃƟZÃ×q¼bƒ›7oԐϓ°0ñz7y‡s'ÆÒúó¾±3Kp#!' € é—, ŒKùñŸgpÙl¨ú{Ä9m|0§¨¹¢çi‡µj‰${U~œ\ÿÞ\r@ïKÇñ)˜'¤˜`ýÆPddèRºUîò¸Ýú!IÓùÈŃܮ ֓ðeˆ_ÒGñ -xOô(=¦ }‡§ ”/Œ#; Iê¯õË2LÓj[ù¹ñ6Vðy ï a8… -‚*…(xoñ\/¨+G$+ò{$Þq@If im€•´Ü”MQè@A…¤r ‚ó&®ÖÏ¦3¤fÈ$r÷‚¾)<§Ö)/cŸ¹›$ä½D+ÊëJø{Èé?8O“Щ†$Î?_’ƒá/bðÀ zFg.ž±º“øôJH™% ¦ìÑúZY»1WëЂ¶ »æd EÎgQ,Xïߦ)KgTFyȒã *£Zõ•Sã}‰‘QRºr ’(–SÂ৏ L{©i‡ÆËË<†‚’†jÅõ1 -:õ«“ØS÷F»x@&,HT8_SŽà.ÇÎ7æú\`üLÇcЍéòhb<Æ• û:59ŸZn¡ûéë AºùQow@Ÿ÷†CÌ„ˆÜ‰‰?¶Ø}ÓÙ3ös*ÃIÝPaU²C2u¹ñŸ,ˆœŸxÆ"aч)ŒÁŸD«Of -ŽIjïð5DÊK#¥s!2{@8XnÍ £4’b!¸—x&KNÇOøè IËŽ×yÌ$sé§4Š4eiNt*y—uE/DÝhŸå¢`/¸nW!wXEe÷\Þ»ë‰U©&X°ƒcÆ'ô¼áÀj’;a¾DIô¡YdM8x¤œƒÞÅöƒ~dü¹ Ì3Œè 4.x“ӁŠ‚M±aX„S€™ëŽºÊ’xxˆÎÙ&®:Ž†”¨×y šŠsáVíޖq"U)D` B áÅÒ¯ïÜeÉ9q”Iªøå7´èøP/ŸÎX­N¨ÄX˜¾ÚŸG MÆ _ -²Ý°¯šŽŠ‘Ôc‹ÔñÝÃ2¡²88„ ŸvóšAdœ»bq Y‰XIÁ% Þ0´2!A†Ÿ“½2‰f’tª44TžÏÁ‚ y¸-Óµ ãÍBôµÐäç2P,›]Kxp‚‰+ØÂBØmxV-•þ̞*2*é—f¦3ù¾ pYòi@¬ãÚÓÁ?(òJS—ÊlX áºhxšÙc†jŽôF—j€@Ÿ»¼T„ÖŸk@‹›ç³†Ô9 ñ´$™!…äãšyšÆ -£^E‚Kœ<˜-8GxdÔe>ëa>GFG¬)¯¤þ¤£†2wô6- kØ2UØJ¥&½à{Õ<Ѩ‰Ô”[läÝQêh±b„Þ—9O²›BšOäflà»"šxÎW -3eaàL䞤b7Òйo7]ù¨±ä:‘I8yÊG¡ŠbJ0dM±00Y’çIB´E° ¢£õIä:H·”R8$L}Óþä8 uáVŸGÀ‘îæK2@ÙáŽæ³G³)É î®{YÊç(ƒ½@þÅÉÃϧtƔ–×=ŠôI5' ÛFð -æS -2®Â§,#R¨.ԑÐAŠú -eYTój<æ,r8’ª¥/t¦ -Àfÿpp–Á˜»è»f\r¹#%uF] -GÒi€Ýø‚S&ç¹ÇËжôÙA0Â±zÛ^²ñFgX¡*H(díÏt§ ­“Èý8ÇR0^ކ*(;iá{ 8½Y†‘såj¬xÏ)0ƒÉD3À ׳Lb@Mn.åË ©$ðÐ åtSß%¢(—ðe¿” ò18¡ðŠˆR,Rá”%©n1.ßIçpÉòd´!bEÍS‚¯\^ø¢0d3ÖW -a¯mÁg‰¡V ÀM´SâÈ60± öÍŠW¦mL^'—Š ,UªPsßÄÏ+ž¥X¾2ªÄe} N&êÓ)u77&¶Òx•p9T¨Æ!i -J́1*ãõgbÕ-ògR¿d”œ®C„gͅ iÊhý&Šåˆá¾ -H&¢ÒfyÆ^<"[Ñùä‚ä8¨+a¢† ƒÛ -h,´oZpATR¦˜Ò!à<˜ê:$Ê -VÙ4è·\K'WT9ë4* x)£ÓCiŠdkHO"´˜šé1hré;GL¨ð/xƒ£jW°Ðxjع©§u\\WûÁÑQÅRìc'>sÉR®¼c¼õk’k¬…"P:>š¯u7ªä¥¨¢zÎ5h2ÅJŸVQA,ì ª‡(|5/¨ÉžqyAm‚”j¸Péý?°¼è9p…È% „ˆT{v_QU­}ÇWTÑÑj€kÊ j8e”B4 3›,óç!ו O8G“OÂå*Ÿ WÏ[.¿ç{·THë†à†é¤ãv… ,04 W× -µ $ç¥ ->~ ÕÜ|„—qL‡©íÁI|§_|ÒeGmQeIò^TÓm$kjPR¹~_À³¨éъˇj{Æ[Fl%ÔláÛ]¾FBD{ÁéXîJ†¯’þ|t!#½•j¢,w , T⸞uÍ  ¢ -yT¨ÞÃù‚Q:Q @šêšjWˆ¨X_Q -endstream endobj 99 0 obj <>stream -óÂøRä…'B_¸à1‰¡/\áhX¹¢Ê'u}ᗆjäX|ãK Ûà|·–àÚ^|AàޓèÞ¯L³XD÷~elŒa1²p秦bZZPµ‘L‘Ä÷§ˆ—ñ†W*W>Êý”ñ5¹ -óó³9ßm˜³ëJð;äL]ÛéPe‹î6ñ=º¾…nÃÑJ>‚„nkŠ{Ñ^ÏÕŠ”ÏîÒiy(oÃî1_ì0(v¨'"ª…†£~t+¬æZdI¨Ž´Ô·xSÊBBœJeؔ|Ö7G}ãà¨ÖTn($™å¼â Ë}Mé3Èic…Ê;µ=š–q@±só†á‚£7yƇm§Cú¢/9€â;½Œ9¼´p)²nÌøi,ÖWðÂL£3›9³‘t«Kž d“(ûAº x¡3˜žè¨øaH(@átžÓèÄ ¿bÍN¾ç-ü+8/ -6§!ž.èjC‘P2¦ Õ"æ r9 §ˆi¾r?5%,R¼Ò99ěùЍ€j´nß8Īý͒ˆ–¤újÔË}¯ŠâBxªê†àáÆc<ÇÙ,áÂY̎>]ÇqÝÚPEçÛï:¿üméó7Ÿçç?Œ.'óéõ«ÞlVNFÕ=ÿqš…áŸÙ‡ÛüV¨ä›ï:~ ú~fqÞVÛ¾ï ç¾ñ¯ƒËÙõú֣ލkl»ã›ÿñžH;’-HûМ¬{BÒoÍIúíþHzüüüñÅÛòjØë_ÏÊ¿öF³òÅ`vÖ¿†•8:É\Ú¦›…F÷Ei«¥v]Þ^Ϛ µÿc3 -vM ç“~ùxx{Ýk>à£æìŒîoÜ/†óIc¢&åt>l1îÔþ¾ˆS)›Î.Ÿ”ï=èVsúªO5œÝ«HëH©Wå³Þ|:ôFÇG4"aýÈìø ]¶ØD.ïqiAQ‹þò·úVRc_DáøêjZÎ6/Ÿ»ˆ÷)*^"¥û,$tsÉ>Ÿ\õúåY¿7,[HöÊS÷5#‡ 6m×Ǔ?ýz=˜m ¡²¥}hE±k~(wHÔô¶ì¿œoXh{¬_‰¤ùl´¬˜{“~»ÊQ "—Ÿ¼7r[S{2Mg½m¨ Oî©Ñt$ûŸÆû½9‹~¿G‡hEԞømtšZ;nîSÑy5Œf§­œüt½9ókûÔoëû¬€mç‘mömyKb“‚5¾-'½Ù¸¹É=±/zÉAßÚ)óíd|s;žn´v[€4W¦ÞµïîQh4ßCßm ¾B‘Ø Š6ø¸*©}Páߥ-(J÷GæíÏ&ܛ f×7ålÐЛ±Ó¤žMz·×-(ݗ-y8˜½ê 6YÀ‡=y›Ùµ-} úÓø>GùE9y[_÷Yój½$¿„Aú¤ÙŽ`ŽWã~›GnïVãô`œŒÓƒqºÓÆiótûƒqºÇÆéÕ¤gñáãÁô`žî½yÚÜ£´ßÖisát°NÖéÔÁ:=X§ëts?öÃ:µÊò“òzTŽÎ7¤¹m©-ï£Bٜ“Þå`Þb[¦ö÷%2.Ã^‹“ƒ©¸£RñÅxr{=Žß6×{bq;±˜Ä¢§¯9'bñ bñaŠÅ&ãËA99(Œ_„ÂXÚÑ>ƃ`<Æ‚ñ 2>|•ñ ‚ñ  Æg½ù¿þsÚ¿.'+ýëßáŸQ9ùDáù}“‡ò”‡E÷™9,:O_sNÝaÑmžOBòæy‰—éي¤½ÉõüËxøûMoZNæ› -©íUÂgiò…%|>ìB)‡Büw©tíþ¢(j:/›«Û»¦Iîš9Ü.А¢Ãퟪ8Ò¤¼lW7uߤý¸Áõû+ ÷ÿò„«áx|éï¸öúï¾ï8Ðø¶×Ì>ü)é¶Ù°÷éš$úÁ.¼vÔíÙº{ -StŸ—ÝGì‡Ã;m¹ÂºÉ®‰ÈéuïrüëÉC”_Xyp7£ZÞïTyè¾æb»ûœª—A5'uñ¹û¢¶ùˆ^®®æÓ²ýå9KÞ­_ÆõdÒN÷sèÁn€méûD›ßÎí7ió5Ûû}p3oÇåîkгæ79”Cû­÷=zä¾ÄM®yå¿=Óèž p?ۙ‹¬ž8òî±ú²t°ƒ^²·z ] y¸O´ÂŽÃ}¢Í¨ÝûûD -Úþ+hýìóèg‡‹Fᒝ—l£´²+w÷ " --.³Ü“ G[\fy¸pt÷)ÚPN¢BQzµv ïÍf|¸pôlˇ G÷hO>\~ؓwzÖíɞ¼uؗwj_þ÷òîa‡-¹ñˆìڎþQIέ§ó}Žöá.ð‡:HŸ´3û<[Wî,·¿Wî|9¶È*Ø×;w¶ ’í‡öØô®ý×Æ­B7=‹®y© }ÚD'ñÿ­ûĐƴãÇ¢†ÚïÑRÜ)óÌ>=ݜì¸ÿB¾½h°Fw[Ê<äï‹8ˆy(~º‡«îèá•Ï9jníKýœÏå}»â^ÞËYõûû_pæ#Æl¢T<•³½‚¼/Â607ß|?ˆ¬‘­lgcó­û¦ý‹n‹£ˆýWVÞÃÞ~¹*'O“qíÚèÏz-F~Ÿ»²ÓK¡‡;»¦“t¾¬™øì0wr&Š/M$ïBŠÚgP•àͤ7š^µ¸-gWǶMŸðøl¥ïæç.iü·Ïš!ÃôÉÇÃá® Ö®ñgË)}ÈèýÈÎì@GäÅzm®-;\¬·†ÚݸXO=¼‹õtsŠöæ^½¿þë¿®‡åñ¤MŠÿî_«×fò}a×ê‰n‹0Sïr0o!y¨ý}ûå`ØkQÞs­´‡œùp³[ŒÕ~•Â{1žÜ^‡ã·Í·ð452q¯eâӄŸ%1iÇ);HÂÏøޓô臗3vÑö¶¤=ÍIÛ3ù°ÿi݇r‹Äío9€¤…Æ»ßåš'žîk5€62s_v¸‡› -݂´=ÛáF=ƒ %céßò²œ{¾%§Å¼Û›”œ‡(úšOÀ½}ÍIÛBôÝ I«ãˆàÉuo4*‡gå°ì·r°-?y_Ô>nÑݚÚå'ïy[{2˜Þ{ýò¦Í^ôn÷yo{ÀµzB=žÎÒGQùؘü}+×ÓF¼îËfØܹw›asÒöÌx %‡Ú о,§æΐ}[N-.W¼›óÅ»>€_ÈEÞW“²ü½¹;új°)¡|!“r¸Súj2¾iA¶¾/ªšÏàÙ¸…ò9¾GÕsƒŽ»ÒË·mö -ßü¾ë í}hNœÝf½I»=Ã=pos±9q—-*9¸Æ÷ETóý-"ûð#’єЅÇî‹äá`TöšßÞï û/Æ-Ž”DO܉“Íôòr0¼o3–üÄ}Ñ8ZØïÏoæ›sÛ*$FÏÜ«‘Ô nÚôüŸª#§VÍQ~È\Úy´ÿp3—Z¶gþœCæRƒq:d.}¶Ì¥ÃM&˄îkîR©¹/{ÜÃÍ]jAڞíq#w©¹ -¼_¹KmæÝÞä.=DÑ÷ps—ZvÈ]:ä.r—¹KÛç.‰/.w©xݗÍðáæ.µ mÏ쀒»Ôf€öe9r—ö;w©Åî™Ðø!´}LÅj3Àí…Î}ðVE(wmxÚä†ç³Ï'-b³w£óI;³yˆ\uÒÑÍ-Tǂ×mŒÔè‘ûRb¾ÄR®ŸŸ¿üV§·ƒrxÞ2Í᧞Oʛñ¦»=M=Œ.Ë«ÁhcùŠÑu[öfOÚ¤ÉFÜ¡‡Üm6™÷,w[´ºýIÞn¸+>˜Ìíé-än2·™Û­2·ïGâtÄ÷2émÿM:öÿßÛÏöï÷ö‡æ·¸}Ddæþ¬¸-òÕwM[{ȅ³/6:÷Ø;n¾ïx«!<øÇïQ„.¸ûz?˄·[b{"úûtÕÛËù™~7[ÀýçÀµvÍýgïZȍw÷(6šû|ßm ¾B‘Ø Š6$ZT(R÷h»4§hC&V…¢ôþ(ÚNŸß—­¸7Ì®oÊY =c·ä­v¯}ܚ?˹ׇ´7ïc@h»?„ó?²3;БC8ÿÎoLñN…ó[žè<„óáü՚È!œÿÉìC8ÿÎßýpþ¡Û!œ¿/á|Ôo! /“ïÛ麇þ>¹üöÃYtácËCÿ㌪Cÿ®â n͜µ«“Syè¾æá‡r8ÿژÐáàíõÌ68êÃÙçæ´.>wo–Cs»apu5Ÿ–'ã‘5vF-äç҃÷¦³4¤óɕUS[ÎßêSû!H÷dƒ÷sèÁîñméûBî§8x^ŃWñÞtƒyÃCíàZ<¸®Å{±À¾;)ËÑ÷V›-¿·{åàíøû÷ƒñ°œ}?)/¿Oz£M¹ Ÿã½ëo"oîîý>¸™Ï6a¯ÌUzà¾&j֜¸rh¿µsËEÜ³ûêÉ ÷SØ8w ]Èö¥S¿‘ïó±²ìËq5ü/{ë™Þ–}«L>Ó9™ŸŸž?üvk5²6ÎÐå'ïÜæ»uº½ïwùɃ'êà‰:x¢ž¨ƒ'êà‰:x¢ž¨]öDy¿“óDy·:¤ž¨}3´ž¨»òDÝßVyßÑñ/Å¿v捶‡à`{ØÝx͙m¼NÚƒ?ݾëUMö¤òL‹ª&‡Ê3»OўTžié¸7›ñRufÛ:~û±-³W½Á¦ÇaOމ=ùP î°'ïô¬Û“=y;;ë°/ïÔ¾ÜzçÚ·-ùP®åž¼yíûPî#;³yˆà¾Ðêhgýk‹´®:;TÞ¸Ã}ù^ˆk^ÞïŽ*oÜçÆôPŠT4¿¼ý²ù-õØö¾¦a Š>´ èÞH}…ã««i9ƒå3)/ÛIû=5X^"Å_°µòCþ%˜-»6\Ÿ-t±w#u00÷ÏÀ*ù¦ñ$þupÙ&£Ñ7¿·­ô ´„n>œ-ô¼{TóZ‘ÔB¿G]<öp|šêï÷#KÒ²äºl•©Êíî›u:Ãîbûæ¾Éî›ýÓÑóç¾iAÑÁ}spßÜ7û0ä_‚S`׆ëà¾9¸oŽûæKôq€õ<³úò´¿Áõe\MzýYoøãxÐâT„{¼éØóËî©TÀÙl0k1âSlþf0lsP¾òÐ}‘št›×ºèM˧“òÏËQ¿…Þ¿ðؽ9Œšçuæ7/í ßf4ãgî‹Äþ'ÍA¼’š»,÷ÍÙӂ´CñüZÅ¡dÙΕ,k±¡\MÆ7-[ß]Íoµš[h:ãû£éÁWa{EØZ¨a‡lMé<Ô`{ˆ5ØîÏ-¶E²Oå{3Ÿ\̇VX<Wê¡,Ò^žôlcêì—ó{«Ÿs ¯Í!eð¹Ó[ æ~$ ¶ hoÒ.'¿&åp>z{¾¡ Ä^¥ ¶‘%_XÊଡ’xˆèì~D'ùRB:ÍóÔö5¢Ëò¡'uìӃ}zÏöi«ev°PêÁB=X¨ u7,ÔæÚîÁBÝc õuølÔæböÛDmNçÁD=˜¨õ`¢LÔ=4Q¿yü\$ç?Œ.ÙTE˜ÐùãÑ+‹/Î<òðc¸5þåë¯~¼ux”ûñìÃÍÅxh»t\^ÊÑU9¼„BÃAù¯ÿ,GGPÓa8»þëÿô¯Ë—ïmŸ¿N:¿þ*éüòë×_Íéÿ6Ž<øKøGtüï/àÛ¿ÛOÿ´°_;ªó¢ó÷$Ë¯Eç—×ð›íQÖM’D£¢sc¿ÁßÓ¯¿:⦛i#Sø -ÿƒ¯™Ôø9ëœØE'ÆE‡£g°M­àÏix~¡æð5|F¤øà)þ¥_¢G]¶m¯€K|n½?¦+­ þU¶ücWᯣ‰~9 -͏r÷nû×½>ÀR«?â~=ÊQG¹#„‹É=ƒrǟã ¤oÁ̺켝ô`Ägô;«£Æ͍ý{l‡ç(b“DtŽ„Å(e'L!UÇJu~¹©´”¢¾e¦;Çý¦8›á”âÄQ8>¶“ñ'¶¤k¢IˆŒºq³ª:G8ÍÄ´#ϵè/S4z [ýڅ‡ý{¬4ÒQ¢ŽÑ0¯9Ù|ä,*™Ty§Ëéâȉ¢¾e&—Fn5Îãf8¥©ŽÜ·ßu~ùÐûØJª¤›*‡AÏR;Sì)´ÐöƒÎÓLÀáÿ¿ô–eHÙÍe.ҎêJ• -\£GðYf0÷ü0Äð¹°ÝÊúhJíhÝ)Rð͹ÝÁfÕ}ú›óo-L®Ó"|ÇǏ!ðõxJd|sòýÜ÷ ÐÒknÂë:VG@Ôl ÝúÞÊnª3Q¨¦½ýi*R3ìN“¾‚²@“Ñ¿ÝŽ'³7´I~sžtÇÃj£QïbX>›.½^ð͹XFõÚn]ÓÙ;!T]Ý)ýß`"Üá¬T•Yiª?(]CšªLʅ'j(’ž ééI<ô÷nç¤Z¹ÊÔªU¦V®²iO‘öѸÐß»œƒjãS«Ö˜Ú¸ÆêèKü”~šI?ï’ð÷§Ÿ¨ —ªþ d U¢2Z O,#-ґ’8 -üŸ»ybÕJ«V’Xµ’êIюgßtü`ø?w9åÄÊ%$V-!±r Ց‚¢ìÿ -¯aÐ_$‡DݝL1§Ԍ‹Wª–©¡'–ÆÅý°D N1íf“vs+¥?w:ÅHQ ¤Ô¬–RÔ&R´#Åëº~0üŸ;œbŸzLbEäöLº…”BäØ10^D!…XÎÛéôÁ› [ð j¢ ËÐâÎvv2ÞÙÿ•¾=8½¼Ë¬—N°SÀ<ò†Ú*75¶ -1«†Àl0>öaªŠ²qShIÙA¥º¦­Î»Ë~ÂÕx—4¡Uxe±4–;dÒ£5ŸÐ?é}˜ô“ñíåø×Q­AïÝüήßÚÙ_t‹T -;FèA¿YÐQÖUø!†å]¡3£:y7ÓÚ@˜À7ʨNÐÏK®ú€ê ´û -´Ó{€d6F}] clôÆÂ7â~¼ù¾ÿE@D4ˆ˜@xyw²Ö»g÷“˜"kêÝsBˆzš‡!.%ºÈfé™n†?0 êÃâa @x9åPÛ~lxó0Y˜ Œ -ž”n •çRAu¾8«À¿<ùD¤Z¢5ã1”-ò¨©OþÒ\di.ºYšØJ‹$#É*pˆƒ,ã?z¾Ø)儬ýbq¤+ŸJì«D’G¡´mû®ã&ïRzá5,~ïjšþÛJ9ÞW%ÄÞyôãxöºì'—v輸_9RK"úäñóg~¸ß\'7î7ê´á—ã‹òüñóâÜöùlöaXž‡·/.A+¿Ê?ï¿+G‹ÊþBBH¾*W>­¢+²Ää9ËL¢s˜^yžIS*[­KÁ ØM´ÎÐ6…¯ÚÊ‘Z£·è¦‰ÀÜ“¤Ö”Yøl…¦•Yfè4€„ì¦2„Âí¬…%I ífhW·h0f]™‡×ò®1™r=)¬1”Šn‘—@â-Cϩ׍*¯:ZìÌÑb‡a—©¡ë(&¿/òæ(æÜQÌUÖð]Ú>`þŠýb;”Zûá?ÜO–ÔÌhȆðXALƒÙ"3úxBúïLpāÚï¡}@_ªoŠ:zwâ¦õ;¦é}ð’X† ©V}•i–:%&Qº Ó’¦›'º;–žtBJ‡–HÉMáຆvûÓ5€xŒVAñéò»\°Yôú£ -€ ØûDxùâ÷*RË~Û[àëÿ•FÊÀÓ²C»lî[W«´ %Æ°yAŸyÙo]-•°O,ÓÜ¥€b{xõ û¾v˕#²ŽÊ;ʲ_ GFn»ÿ¹eûƒÑ»Þüjúkïm½„ÿ Â]ØÖAoˆà‰œç·H$OePÃd³óÖ¤BÁÔÈ­@1ô¯(Tª@ÊäfZbWW^ä’£î -Ìý<Á×;˜•-IîœÍd0s;OKØcÜwi¿[ cߝâ#ÈSçõq=$Ði ʜ£‡`B”¢‰Êœø)4(¶ö­*·bvôHZ€†ç½cƒÐћv³D>Rm7Œq)¢$ªáÚIy‚Ù^eÐÆc·Ç½Œ¾ûíÆÑ¢B< $ -}Gì¾eEq¼Hàƒ]‰EnR¤(hyæM߁ó¾/âûj‡J-”¾¦ø^K l2^zÚÍ¥ÊÄrb@‚Ï=ÍaJ$y’xÉimÃDÙ~Û}#×>³Øp¼r½£Gk@ŒÍIÑÌÂÓ4ã¦ö–'&‡¼ÁðtuÊOùÉÌ©TË -0<‹¢ÚÎ[+Aì\Nä@Á[rRv¥1)ÊH†Eý¦Gk@„ͽœ”*IӘ†ÁÒ³¨ã¹n'¿ÌÓʚ^²„-Ä%¬iíÖ±ýô|ôï1^ýÑ`'t쪴*W¾+\qhnzHN¯ñp… ëÁ½Äï£b¬ÐâÖ¦Ë2+t -Do!uÄã ~.â Tû¼Ñ1yöé"Mø)û'·F8é+¿•¾_ô´ï·Çè²íp›÷TàKèiúÊØ àßNOû¾UûîèÙ±ÍÔvM*ÝÑV4©†mUê·U£ùÙ·Õ§ƒáMý1ˆÊ¶Ú|“ÄÀˆSÁî;ð·ðIÊö3æìì4‚Á‡ÔN øgë`ѳWÞ¦ƒ¥“9:é%L)% -»Ufv#­ѓküÜÊû-T½ßB‚èR¸é›¦UÆS€Àé Cüv „î2Ø7­v+]5·ÀT*Yÿ¬±«Èî”öÙ³š]ìÏÊþ,w–’²ú̊÷ÚÎå…ǵ6Ý$…<õHç7™(ÐߨEšä+ž•€Ybæ øûðÑf]`÷i—™ØÝ{ü4>×ðS“„äG/zÓw îç£÷ådV^..ғáàöÖ®‹Eø“Á–,µÿåÏðïþÁƒEv ”âo¸>^÷¦î@Ò¹íŸèüòÌùÜÊ÷¼›êCç—òwžG˜[„ÿül»–ò/×kÈ5tÿË£y¥:ôÆ>}ƒzқõþdW›Ì¿þê—ç_ýá£ÿóÿ{åþ/ü¾úçÿþïÏóûŠŽ~?üþ‡]˜Ÿëß´¾>î? ìÎR%Ú_X|Yh^?®’ª‘¸è<ÿþû‡ÈÙª&ñÍ9Jå Pœÿòÿz…ÄßP!:µö9KØïñù2J'Þ$ˆÔ͊D‚¡„8°¨‡,´ðBýßæ®gÛ»ÀK÷ç-B—5“oÎët“k"C=´‚áÊ¡YVP"h¤X,ËJJFjÊ7ç ¨­U«÷n¯¬|sþ1êÊ7磰|sþ*Kӎ×*-ߜ?u3ÈEî\„~µÂÂg¿­òðøyçñ|6î¸%9ø½ 1¡åèÚˋi9y_^ž[þܵšV—ïÇ£ñ¨SÈÂÍøÅT¦$ -s$© •ý`- ;ÓÂHðSà±ZüÛÒ!fr–æó‹¤,4YÝ LàPŸý›'näÎqd§4þB€¯³'© -ÀS”B©øQ;¡œK€°GìƒG恲+`DO€©Á´(Bo?8O÷‚ ˆMð«æ=Ž¨ð(ÓÍè#ö⤎gdÌp*ڑe™ -ÏÝ,zˆÀ wÁšÞuǝ·«½Èò¼Ú{po#*µð¬îZτÀ¬dXÄɆ¤2jæ÷ f$÷5æ$“Äϲ=úÀœ\âyØì3W‹9ý¤ïŠœV™_¶#¹ZXS°!DXá¤ýX¤&šÀb0w!à!Ìˌ˜wºØ£gŽp/*’ˆú[‘DDVDL:I¢$Ñ"×NÉ¿›WÔM†´ZY$r±C€ÌÑE…“VùÃÓ'Á+›VØ §@ešG ¼!NFÀÀÉ -H 艡'¹»#™&‚ªîø;qq‰[ÛL‹l‰1 ÉÔ‹Žyfwv¡²ª”Tv·L¤©ð0µ$%iÄ´›)8:ʨc10ÀÿbÈ˜‰üúˆyÜ͈yL Áµsü˜·Ä%ǼÜÊ ,1/†!…y$U‘¹E+²¼Â<ãrbÞY½Mšxͺ¹Î”˜cñ.ÀïbPȘ‰ôöˆuÜɈuL Á­qüX·Ä#¿W uYÐ@!ÂæﯰŠi^ÝP ΠT•wðþ4—ÐÁ,xˆwxÀDÆL<à×Nj–º1iá™Z9úNÌ[âRˆÔ 2ûWèÜTtÆÂ*¢¹×$P½*ºV³ÈƒÊHßc‘`±ÂžóJ_ÀìôúX]D£,3mþ:{Ï£†Xñ›¾Ÿ‘ªH XS ÏsàëOj¸ä™GjNÌ<‚1‰¤C1¼¢3²˜y¤¶ñs¤Ø1fÄÌcXļæH$ÔÌzÌ<ß͘yD -?Ç Ì€™·È¥]0fÁ˜DR›˜ ¤\ÅÜ#-,æéjü Wæ³ÿóŽ@ëÈÑGh™ôî˜sÔǘuD?ÈäêÀ¬[äтòWY´––ߦÃâóšTÌ:R¹b֑bÆ’êƨ 3a÷"˜£‘P3èý•UëûYY¶ž˜°l‰¼l ,Û>Uµ½ˆ{’yå($½ˆX@ºSÄ:Ö±"Ö±&F0ÖÕ1"ÖX`] Cú5q€ß±ŽºqŽ(! ŒD¼ÑwbÛ"ªê]Ä5q¤õ¤4E\#Ý*bé_"ýŒ°Ò÷ˆc - ‹@Ha%ºéÅ·¨{·ˆ1Ñkô¸µÈ—ª>q‹@DWÎ…£›ô¤ˆ[^›Š˜E -H!#¤ô=bƒ³"’EX‰lÿވWÔ¹ˆWyõb’=Òè;ñj‘+U.⁈,Ryx=zµ(âiO³HÃ⧼ÆXý÷ˆY -̊@Ωì±ÝôâxúîEÜ" -ø)"š°†ïÄ­E¾œnNIü´ñÙÄ;ñï4N›tðŸt¤5ŒqZn ×ÐýÛ$N›õÑaZJ¢ÿýwøþ±?þ¡ú?útøÏá?üŸš9ô‡»™}«Üö?‡`h}0ÔÅAkƒ4 àæa¹\ Ô8ð6¡÷äR°fÜ&\.lÅ[…lêxˆGn‹¢˜\NŒ§Ð3FsìÓuñœp‹ˆŽ}².¦cÁÛFuðÑå¸Î¸Ed‰[Ší t«èN׎@mØgÜ&ðc­ ý x›à>¸þ©B[€²å‚· -Õqp=Ãë¢C à6ñ!ûh]„ÁÛňðÑå(ѸEœ©[Ž!x«XQ×2½.ˆT…6#ÙÔ’¼e( ­ &-€[„“¬@­ (Á[„”j¸·–×u±¦*´y´ NÍ.Ǜ hÎ6'xn9æT…6Ž:IËq'€nyªáÚZׅ¤ªÐæA)HZ -Kp›Àd.-‡¦ªÐ¦Á) h9<Ð-T5<[¯™ÔD®ªÐæ±+û\Mô -¡[įð¹¥VÚ8†…$-E±Ú>ŽUõ [ár€+‚¶ qEÚvädŠ”íVa®H§ŽœMUhóPWP³#ŸS¤e‹6á®®­çqM,‚¶‰„Eêt•Ç[EÃ"¹Êã­"bA®òx«¨X ךéÐUo0‹ôç*“·š-¹Êámg‘â\åðVÁ³ž5Sš$Å6qµHa®rx«ØZ¤W™¼U|-ҔdÅ61¶¾5Ғ+LÞ"üiÈo‚‹Ôà -‡· ÃÕ¸Âà-BqËüj¤W˜»E”.¨ÄÞn© Šo…¯[Dë‚.\aê»e>5҃+LÝ"˜Ç:p…§[ô‚¦[áiû ^P~+,Ý"°·Ì¥FŠo…¥[Äü‚Ò[áéq¿ ÚVxºEì/h»¦nÿ[æÓZ¦®®UøyAäΎnu"ú¯“òr0{כÌÊú2#‹ç,>aÅ,vájø§®Z’, -wÕÖBÀ/îÆ/ühw]W[Á}µßì.LßýløÄý)]µ$‰Éøá«ѯÑCӉ«n½¢Úß3úD˜"J<'.ajq`šL§ùµñÒÿ‡NÿžøÊ=>w<ü|=uäPaÛ¢ÒÁå¯|²Ü5u¿¡¯™g~ç(à¦øÒ ÿ:Ž *þ â'=Âߋ0NÕ¯;\Ê]ˆÏ^®àÕË3qôæñٛ‚b>`J¤¢p“CZ})Ū[¤Ú¥@,µ/R)Î/‘®I»™[ÞX>ÐU³Ð4õEt”+#¯–\ÇÊ®KPÛù•-5–6AÕl‘ -1ºŠTå»ÁWå_£_d€ÏoKÜ£PœÅq…*’zÈi€˜¨¯¹¯œT Oby#è}  ®D¹šÌ7e\êYÔn¡³;»ÌL7µ²*…$PçF¨’¹:bÙç/Àõj|ûÓmå -ÕÚÊêíoOê†¤™/ì$\eNWüލZ}–áóQÜè(Í»Fà·#…çáÌl’'üÕç¸Âg—/Š±îŸø8<XVc¢§¡þ[åºð[G¹‡þ¥§ô‘šÐ£ÐӘè“P r”ˆë†>ú+Üg,¨ü4Ç2a¼QÄ3$ÁÝEúÏÄ5‘¦Ñgÿ0> xsºÖ¿Üu*ô„岃£–époŽÞ ÓêGßîçi<ð‰ç,b…¯Tè1á„;tz—Á‚“óh‰Ï `—)¬]¼V¯jkÄâEkñ.^ »¯T›/…9xSenÌôh,¢Š†.â>1Ÿ†šgC4F'·¨C'wqí«L/^͋ÔñRWÆ´b¼ã®¾µ)–/äX‹û¸9n©/Á¢q¸‰VÚ/µh ‡‰}fö₌—ª¾“ÊʎüQ< Vñ_´â–ÕX_$uü÷Wµ6Y=ÿWâ>nŽ{‘ÿY5ʋÙÎá‚r£Žsޗ1”Xæ3g8ŸâN< -ÿ¥+?eŒX…i±byb“è£oq1•>¥‡Eu,ψuåÐö¡ØtÚ-ŒœÔ×u©·ŸUz}v¶öfØOhxÀ¥:ËðFí"Í黃Yù €/V+7©F·SŽ6ÜÃ]ô—:@ìL‰,´)¼'”±€^ÕÇ]fß ”KûB,Ѕ\ˆð&ôñ(“ë7¢3–Eªúk -«?úåÅéOϟtþÔù¶?˜ô‡åyzþ]³+íÐÙìÕÑM»I.Ðeš•:?JÒMsa×>É¥$–k6V?Ó Ú@*¹¬ºvÖXnR(pà¦8¼Ê—d̋6JÛ8I=»¡¦Åç*»Z¾e~J Ä¯ҟ˜s@(m²Ì›h¶?"ÇK¼ pðwà¯1½’a¹íEjN– tK܎•°(b²3kK( qì+³"©™g8rGp†Ë{²¿™,Å e¦À¦=‚ÅBçÔ}„I!]EEbSœM†|ý®&¸ý%M¡3ÕN,÷sƒ€º+ nH;JXÉ—‘ ¼¨º(tþÙ%Ð'¶¿ìfæns7[ælWES»“y \yÁv’¬¾HR^d‡í/÷˜H°\.às֎ûpʯT Y&Ñ!ºƒX½›Ñ#~+ šº{zÑYS Îp¤ÎJX…NË¥w'Ô£„ˆ¦OÐÖH®ô|äÑàmXˆélž‰H³£‡QëCFÒ{hߦ'Þ咱-Âe[û‰'åܞ,¯èQxÉI½ÍSײÞâY³ÆÞ©k¹ÊÚ©Üõñì¦ÊKÖ~W|ŒG£2NÌà#âpe˜—怛'ñD©û@Sk†Ö,™U~úðì‰=ž Éý»²§´hpÅÕhóP|¬®e–7Ðã çâè¯À¹¨Áïµ¾ª:Yªjúù7Š¹Ý –êäóÿ>ƒÂ -u ­Ê[¥U}µ ¼+Óƒ—…ÆBá¹sËBÂYêJp%\lRíõU¡T¹¯I!ÁyŒÕ‰ ` JÄJ¬~Rdv'°çWƒK VœU׌Hâk? «çÁ_„ˆ,ÛÐu•ôڗI!g÷Vxª€Øªµó¬‚ã. ±ÝµÓUCIæÂu ªjx2‰põ “f®5fCR‘D€eŒÇ´À¥!é@u'~ŠÊéŸúâ‡þØäKŸ™Òr€!·fyܺÅÈafÝÒعôµÖ£g«?ÌHÚb]Òãâúš­G±†kˆ M™ŸÜ€¸Ñúæ<¯¥ëÒCŠ­Q!ý.èâö©,t80‘jȓ0].ýïÍRбð*EÐ*ÚÕÀ+'/™–Ÿâ¸¼á℟'*§»ã=0 -v¤ÎâÑ:‘Ìt‹¯ßÃ+ðfRY ÉwìJ…°àÕF -ÙZ1 -‚ÜišàmEIQ‹ âtv#ÓJªÜ?#3k¯)íºtg˜eÃ4ogeôýÄÕ³@²«Ò¢€Êp¢Z“ÉÀøٞK)¨R$q(ûX¨"Úݶc硸jœ¡™¤.|>q6jž¡¾c'²† Œ™Îtg²f‰'X©͈ð[ê2Qᬼ]1ṕŽà~ »À)t žÊ®Ê2¼Ð Êô»ŽX;Á#M.æn!Bä>îÉX1¡ -¼¦ÂšÚ°ÈN°¤F‘ÃzvD…Á+'ð9«:9$½ó®iK ³±sKk8ââ=öU(iTW !SúŽÖ¨µc҂é׎H,A*`eçÊ_´€ºÙ ތaMa°nàn"wšU®åЩ«(kE–ó—`ÀžÂš¨.\»¤ ÷¼2ÁÌ;ï‰v©:'x c.©­Ãh å`™“Œ ’D™¥Ñ;©ÑP¸ÔΎš€º£Í.µSxQ÷ò¶K¶½¶;€lÊ@²¯é(È ÖîÂ.©?rÛÞÅii;ZÙOµÆ}²…aï쬮SÀ$] -«6õ¦†¤ÿp‚Žd¼…¿;2Þ ÄßáA»ïRùƄ—™Ç濃‹ÞßÈ#õJ>ÏݝH€Vº)¸ú¹Kø-î3Ðғñå¼…•Y@‹_|OÜ•<áÞ ½ø•z·ÊúÒ-Œoá)ОÒa²z‰q?b!âe{ /¤Ì7=šx¥Ê¢‰Ö⽋6[³÷ÖÞxº¯¬Ì’›è;O£Ê$‹g`Í åًŸ«óº2åu4ØÕùW3KUuJÞExŸÖ00gÞ«š1‡2Üp2xý£™©óï]²Ó½·vÌ}4 o¶¨ææÇ[EÀj6Pv:;ÀÏ -'KŠšiBÃrS»,£KæéPôЕUZó*zòf 7|͗ñր¢‡ö?æfu=¼¨ÿ‚ w»Êû¹âõMùÛ좜”ƒþõùÓñ»ùtU@î5Úy– 44rȄsVFƒ­™¡ð(E.S«'þòxՖ -k‘Z9´¼³¸–å$Vaäo§ô툾Ö|£/S7³èÕ  s»,~ýÚ@pYÑ澝ҷ#úZó¾L÷| -¸7Ó*exf§€[<Þ'Ÿ? îÎ;O{ïǓÁ¬u®£ßçWÿú¯š)? Îd.`·z'\×øsÂ]ô  wû¸Hð–îºlÑÍDNùÑrL )N֘Ìý‚÷1&]w¶†ÏaCª¢tB¦YႿ`Uôh5ؽÒAœ™­ÁG£L05³–ºÊwO£îdŸ«_wÑ:‰yF¨}1FUXØ:4<C*œœ¶€Üù]høÇ/çn©äFڎ\.i.¶(d…à:ȀëÄ&û×Zâ&pÆEc:¼ç·S–ŒƧ¨KgB»+þRWEE'*GÝØe¹¶?À;¯v'9žÐ³6¤ 2Ã}›hiF0HGÎSŒÅCÑáî5AŸñïâû”b¼÷ÄåÀPß ŸF›â„v¼C°G&.v‚#b'ŠÐ0)˜“{0]®¶0•Â£A[3Pô±*¡;N°Ô²D¸Ûza€ÑÏAŽuI;7úm|3 ²p±{B&eô:˜ÍÈé¨l„„~㽬*­Ë'u.ÏL_"ó ¹t”Ê°î₨¼BS -²Ã³™„{ce7› ¦‹ç ¸8UD3u&ä4h¼S1“àßߊK¦†“>™]"J[[[uHa`žA‰»ñãûºð×9È.SQ¯—ÌEz¸NS¼;;CÒéd¥sû›óZYÎÇ-¥8>k䀷”h®3[É4w¼} ©ó%–kp\rI²Á‘¸¶²Ín¯[I7ûÜVòÍê5ÎAÛË8|nIÊYhœ³šìV’Î>W#ëÛÒŽÏl#ïðØæV¥o#óÜ|ßFê¹E¶•Üƒ0Oäð6²N3·•~p®uIþº$!v³… Ä•!Z’q´Ä{öðò¬"w…FÛƈÒ20sƕñ#áB¥N4à N#jaôè©SLÑC]P¨4~´„<4™O=ŎԀ¢qdaȖAQ/é<]³kÔð$cø“­ | Ðèe."·È›u? ¨FìݪV¯áSVúTëxví¤×=ƒ¨VÑQvAf9zݍDZ¥’ŸÜ¡€5AϏ^M£™EqtäáhçÅ¿|ýՏ·ø[î~{5œÛ_^üӚÇÖÄ#˝ãÉ|zÝyÑõޖ“ÎËÉ%8í7üØq¿žô†ÃÁÛIïözÐ÷MßXN?꼞.;G´ójÖ}´Ôø»Žíñ·õX ±ö™…ÖOŽa¯mÒñ3v–¼YV_WøëøzXNgƒ«µ»/i+Æ(z9„ýèòê -üŸÿïúoùòÊ$u/·ŸñîÿÁsþI;†÷§´òöFäßõxÕ­9œ¼êà›Ö -=˜Gú/pìQÇ5 ¾#ÁŸˆO|NrV-÷ïx©9?–¿R뎨~M—¾Âa*»·¶`AjûMB¡È­J+/’•¼øC[¸ßì(žÍ>Øûú«Gá7Øh¿}<ü0öϝ}×yô£@Ø®=¶{ñû’=:ß܎í}:Z’ñ¹“ëÞ`ÔqMØEšù6„þÑσéÀnLj´ÉÙ¬×× -Éqo:èW0LÆïÊ6($þ4|9ñÖXù°lÏ^—ý±Ý/ñW×Ðs£ÓÂJJá£'åUçûÎ×_u¾p¡fð}_Þ±úAçÑ«ÞdVKåÉxt9̚¸Ðފãëyèg^ò„únyvwþ.ºÆGÔÜ' A:~š±tn[ù™¡é¹OÈaVš–?¼/G///[pþS³ ¶î$W˜lœå!d?h#ÜM¸™5ÑÑop¼%7/”y[_üÝòh=·¥ÝÈîŽcˆo‹µÑP¬%Ê>óÃoeq?"Š‘‰ÖË>HË;éÉ⻝ÔKϗWWÓröŽËJß>çhn'Ýò7¨±äv7¸5…ØhUŠÑl>y_N¦ýëAyaÝ?uN-c~¸º*ßÙwÍîöI&ø'—ù«¼h»³í=„yöP)lµOuÒ<÷ª³ÁÍí0ìU<s¨«©i>BŽ©*>bV¾²kpÖ¤sÅÆÎAf³N1#!ÇóØ.O!$™¨«ÝBZ%©øÔ=F—øaë?lý‡­ÿ°õocî}”«ƒNpÐ éx -îobõ[ÇkÀÛ9OFVÖßÉÖñCÿ]9êô.&q9ŠwŠõƒ#º"Õ҅ó:ßBºü|ºf1œ—Þyù1œ9¸Ó>Z$åû¡WÖð.¯aT±’Ô$h&R'è6§`&*¨å±øw‡ên㌯~½ƒ]óopH¥ìüµ7š•Í÷L8 ¬sÚ3_oÚ3¿\YVdÙA–=H}d§¤QÕ Òh¥4:ö斒ËñhÒ»¾)÷$j¹ b h¦2q—Z #MáÏã†ó™FK¸µ)Då—j -;ðjfºæ¦¸+‘voÒIfà¤mW™g`‹¤À³P8D¸ÂƘŒJ )²5Œ•QY–Á½vNimDî§Rjd@AÕä4|ZÃ!¨˜üdò çMWI¼6Ä»Fñ 40<£0¿L¾Ñ5 ‚"Y’C¹IÓ\`ZaR*D`擄ìB”Z¯áŒºK¶|'áý-Ï4Ó)æQë¯ø†ºNâwS7ã,ßM¦ Ê{Èæ”k8ýI'à'V\,ÁŸNuy°Hgi^À$I“Š¢ú¥éö;¸&S@ -PYS(á·zêd{=u¤>̝ÖsG©<‡OBŽ¸›8šƒÌg9äÚù©Vγßóæ³L›ƒ'à™hc?ÿ»5'#μ» Làtª=ç!^(Ž9!©’Y.ÚîˆÂê£Ý´H¾¼c‰È -4˜“B:ݼ(2-)A1·uÌÚáÈÍ !Oýk åäz2¾ÙO9¹k)hëOŠnp·¯x¬Ûܮȼô\ ÊÛÁhZ?*×òѳ—ÿ|m§ÊŸ: Çy;›èzŸw„›“ðGœ¥EBNþÇ£·a™z¿? À¨œ:׿&𓁥¹ï»ðø“òÖ®éËQþöso2õ‚+½.‡=˜ÒoÆøÛ"y~ úã˲EŠéëå'הL¤®ûöÚ?QHÜZÁæq=øçöêÓ;byø‹’>·éqŽ - ·Y«Ó…6øA'"ŜTp=ƒ=êÝõ‹ÖMC›|»Iøý‹N¹l8¿}}'áËWW½Ë'¯·IB¤"'ÿÍn‘ŠÖÌÍppƒ(nWyøøj:k±|›ÉGl&rÏ6¿.ý͞kÖjšÉ<;lÛl㚟eËØÏíM1(].ëJ—'Éúâ宐÷>žv ç“èÓM"é܃œCú~NmíÑø§ùgþ/ÞtÖ¿.­d.ӛÿë?ËQ¤Òì¡gèàAßàÿ:Á¼A9‡ïφã_ïЬ®£ÿ•¦f›òb8º¬úÄ.†soÂ@©@2(o{ýïVˆáV—£|Œ ~Úºžñ óiùêìô˜z,22Ÿáp,ÜÔ¿Ýö¬P=.¯Æ“²ó³µÀwÈRØ™<콝ö¯¡XÝ!ÿ÷ ‡²~2ßvή{—w'ˆ«‹§éÙb/¬úӉ“­ì¾»O~wB™]—½É»j£÷ådV•†·½Ëǃp?w/ÜÿneëÈΟË4(ñӉ|ƒ8¦wª%YtVÕÁš¤?Œ.£Š¤›K›¾ê K»¯.š÷ûÛ¿¿êM§åäÆ®±rôï¿ü¬«þðõW¯úu\‚£IÿúOú¹Å’ÙñkÏ.vÆ\_òëÛ×ώ;¯Ç3~E’ ¸÷È´Py‡,Wnþ¬^pûLš ’Á¸ 'ÿú¯·ÔÂîV´®:u‡4¥ðÀɇ^hŸçi†9«&+D•ì í့—YáŽÔÂýÙþö:Qmÿ¢÷Öå=~Dd…%H5ya0ÉC)VÃ4ʟ²ÉrLÉtÜF¸‰2LR-ºÄç%9ÄÈã5-5B-þÒÉ#5¿> ´ø@Ù_77Ú²‰oXyøå¤=¸,ˏsӀ€TðãkDv6¶/˜4@å®Dôl<¼t¹%QqS‡luR{„“×]KÿÔºKŸómi{üöÙ¤7ŸÎæWà‘Wo[fnC‰m“R;eJxkye†|.9T;Qó$=L> ³:Ò4²B9Q—ºsðV& ØÐÖ´Â þOJ#¨,d›ÛE¦Sƒ–¶¦îÚv£ÆT=+â\÷RêÕâ×àbÁD¢ØÊsT]´™cŸ´{:n–Šÿ_Ñ -à_’A–YýBáöbªÐñ‡Äh¯_Pç?n‰M.ûoÒ -s¤W™Ü‰W»-i·«[ÕÆø.«l—ncÓéâviMK”ÕÒ†™S²ìè;cÆPÇ?Rãö`Ô\L_vëÊ°‡t?ƒtêÍíœÿO“%Q¨aÀv`ÿ V®táî‚)Î?«È›Ì›\ԣŬk$hgÁԖ±%¸]9,4-QR0Ôöß°ÿV^\õ&ñ -ôS܊|E‡@ÉĊý¢¢f)kú2R0í.’ò€à‚AµÊ놔 éòÔqJª&ÒÚ,©)nK–UYê=%+i­kŒi×7¬ ¯ôX\ðƒJjÅ&rX$ЕÆ]±kÕ¸3-©4p¼Ó©§îšw:ëYí‰ÄÙkÂ2“VhœhÒ8AˆÌd^y¤c£‘šKüɋ0åá{uüoìekw§Ðé`:«ú"—=ç듾®«T³t¸äëpïëøÚ¢eŸ¢ëі7&‰$¾UPýÁõ¾7œ] ÿõ,çã÷î²¼7½‹ÓÒ¶(ì§-›]”¨itþtün>à«ñíO·õX jq9þuĀãrW®Êáå9ðqP·Ž*¿¤g{³ùÍ›ÒÓOCdÖë3dÔÙÜ6ùû­.³w½É /¹úa0zכ_Mí½u¿¿zy&ŽÞ<>{ó|[}™<ôxUW¿[ºÆгk ëýäy2îÏí(Ïlÿ{x$Àc _nƒTÑu¢ÃÏÊÙü¶sÚ½[*:–ÉóÛp7¤‹Ëòò´¼šýÜΣ›#݉åýãIÙsÁPÿã£Ç“Iïʞ˜ÂnÜîFüx…ž»òõ|XN^N–¼…·øüÝéùæüÛÿ‰%¯F~8á´Å¤_ðçûւhyõøµIc×þøgC7^—Ã7ã×®®K¯ÆÓô–þÑ#+SŒhþœ½pá›çS»Ò.Æv­?)¯zóá,êê÷ôç[jƒÌ$ÎþòâôGKã -ÞÚ§~»Žlƒ#+7&ƒ‹ùŒ/ñ¬ ÊgAsGo‰ÚY}Þ*Ï%MšÓô3ü3 —‘~ûÿŒ¦çï{“é÷Qéú¸íûhBãÓ GñøPË?>$VÆ£² —†c+¸.±‰šÞåÄݞÀ‹ÁèÒvX4!ÒÎ+Ý¢l@hÜü.'ÅÇ3E¬gJ3V à>àF+£ÉHßûDh/þô¾¹X€¶»1áÎ¾µóÇ7; þ>éýÓ´{P…ì:l>S?Ǻ9ƒ ^v«?k)O¯~݁ù½’| -W«?˜±—™ÑÝÂ^³_I÷¯ƒK8¦Ú`à}˝ßÖ21ÝBäÉûЈ´;¶¶&Kg ú­Ù"Ý‚²Üt $¥l"뺼½n´pӝ Ö•”]ŒgVÉÙî h\~hgô ”gãù¤_C*öÉÌb+&5?W8ëMޖ3«i€ÛjúüI£ ±üÐNLÿo_ýøLª§ãÉMoÕâ­Ð~5–k[W©Ž›?$B²QjÌ&½Ñô¶g1ö›maÕvcrü§øŸ&ãù'ãáx҈ڸùNкyD£Y9öú ÝCqó=¡p4~Ñn«ì •W˜ÞßpCãÙ¿7KìÏkzWw¶èÒøv6¸üŽ…Avªc֚߉~ܔ³ÞeoÖ»ƒÎݙÿqéÃuVdÔúµ"&eì¶wy¹(nðNš*lz;ž-ÂzÃ-lC"çòvÐõ0E'¸ÆÃIèÛãçÇóÙ¸óº7µRcðû’PÂè$Ðy7÷ߍç³ÎÛÉ8ŽKÖµLÇÃÞ¬ì\À!ªòSi]tn{·å¤3Ü̇¡&N˜.Фçƒn~$³eÔ VCl¿—Ó¡¥’ùJli{7oÜöí¤äI´±qÁ™Ö©^ÝTÄ}ØØ6îÃÆÆ¡"Kó”›R´ù¤7zߛžv‰ÊP¾š”Órò¾ì@ü¿óÃå`Ö» 3Òö¾]ñÖ³Ÿ1eÂ4"œuâ8p85¼(§×<qFt^—vͣɑ&•G^Îg·vBnx¨; æüBð<úùÍø6þ‘=Zφã‹Þðuy;N+“•xvöôo“áà¶ófÜ¡`qíŽÑ؎_²l0T7ç³rø—ÞÌrötÜï ƒÓJzEëç Ó=Riÿþ\ÐðjR¡ºI7‰äÚ»Çϟ·CSjÑþJÃ!MfüÌze¼-1ñà™]ˆçÈçgьMÖ5<®_µm_ǫ́¶áËÛ^?ÌX¥×6~j•ßPCm]sð“,µÎWvåçAù«åæ“ÁtÖõ遪\bNÿbâÅâóg³'/4àûÓáx<‰Ø¹±mvbÃ*;å -œob·0œÙªoLŒg‡Î‹\¬i{\Y°,¨²ÎK˜Þh6è؝°7åÕـ»vE-úRÛX97‹&çš^6á%ºÙª33’ã^`Âòûÿæ=¸Óò=$hWEIýa)H¯«Úž”ÃáÉxÎÓI¯ž¼¸4~øm4˜te[@í'k° *Håjvýel%ûxô—Ø «tnVM,dD<³‚B!äù™UžÐ|a7®š/‰æ“Õu†ƒQٙb„iÍì«k=³ûå"b+G_õ&®àôՓ§PWÂ.êʆJ“¯Òö‡›‹òòÕd ž©¿–Öâ¤v.«R•f»ô¯—P6G0v¯†½Qéö±X,cÄÔÉϽÑ`zm'zŒbÕXܒ:y·„ÇúnЂ*OLP)8zoßjõ!»wGÂwÕ[ú°÷Ç¿þÍ*Po-+Y–Í£Âγù…]rOǶC¯AN–&#M­aÏÄy[ËÌÎS‘mÆkÖbe…­Ý}ñ¬€3vœÊ>eŠ#`²:T¥ÿçV@±<¹òÌ4œ\^ëá¤)tCNò,oÎȐ/ù|tYþvVöǣ˖=L¦›^„e͈­zŽIú؁fD ãœT•á~»Of Ÿœ­Ôt HþòæÅi‡œ"gãSÛ ’žKûvÝ#gv§EAz;ûc9mðÌó›ÞÛòEïöM%ð¶²ù›'ƒXue‡’ Ѓ6™)j3~/œõ†ÍŸ±JûlÐï ›ð -KXT" bÝp<õ‡óK°¦ÇXV»}Ö{êÔªAó°ƒe—F`DÂt2Ò½Z=¥jGbÓS”U,ŠV¥ô²¤Õc”‹Üôevˆ*öz‹W%ÔÃvüÈé±vCf¶{LÇΩ ¬X5Ûf „7²2iöŒëä -ÒÖ?ô¿’„'dÞòÁUsrãƒbÛ®¦Û>¸<€+ù_;‹ŸÌoíà9 —×v°ûoaƒð2¨óˋW«fĂ ã~ôfkÙýV/éâVŒ.Ç¿Ö‹ _øúT¢Ÿ«úþ·ÇƒáeG®žÖ’µ¸o…64é:±:³ÈÖÅ'ܛܥ ÞKjŒ‘Bo~O-ÅQ£â¹]ì­6x—æZ`×Ré®mŽ÷N­QDÎIÎêøöï/ÊËÁü&òœþ£2-…ì<~¾Ö•[uÉ@`|1Á¼ÿ±Õ…Ñ]zâÍ­×Usk±íKo^Ÿ­4Æ+ÍÞ+<6±s?úÙY†Ç‹–a¥íËEss3³Dç‡Wg-¸­7±ËálÈ/×x3êíVpÌ5jÈ2q‘g"ûŒÆÁ†ï FhnÃù¬ZgxÍä¼~‚ڏþ9¾èÞÚY?±³±cKíàÕ½ápC³é»Áí…%4 -ÀÕ¶›”pYJ ]œlhÚ‡ADՄP ¨N²è™ŠüÁˆpüßÇÏGWãNä÷ßÄñpöèoåÅ£Ÿ—åøы±ÝÍþ±ž ·DÔÕMl©ûÓÙ°{éß!ÌÈ ,‚çüQصÉC·—7öçá¨y¿n/›£w'=Â#uóáövâÛ­é4ò ¯j¡»|“ËbÓ8g:W¢›¯jXIj-ºf%Æl“Ý¡µøÉâìÏÆ´ëè\oD=‰:’'ºr’ëÛ»TUŠ'óIÿºófR.¬¤µœŒXntݲQE/¿°¿ÈÎÕ­*¼\ƒl;ç× [l·4)°F¾7ˆ›Ër:x;Š} rì¸ðùµkqbKt7i؛^ f7½Ûæ¯:0Ë´'ݛàº_Õ¤?AÙYH•XG4åÍÈÊú>Éz#k›O.»ã \ÄЫ†—k[^Ùݚ äb$¹¶Ù­?œ¼vbà‹ßv×OF߈μEëÅfSz1¶ ßo tÚ¿ö?¬c®Q´äÛ\l4³Rœ-²‚Ê÷«xۀ¾á:nßÞ¼ë–#ˆ…¯×ÐlÊÅn7Îelïä{´Xšßî -¹ÂóeVÐ×@*ÄeG1q4‚ -/$@¬0^ÿGNCÇZnO¿Š:%®Ší¥3ƒ§˜¨àì¼ö¢l”×ýù8MoÇ(€P\±O0¿ÄU{Ü,äå,…ï‹ÿš®Þ§X™g Ld%eûÊ1UÇ`á*:S6“úU“êW(xôâW|X”Ñèj`ÔÏÔ@£q[oå`˜†ÀëÊÄ.Ã6Ë ç‹6¿Ûç“KKXPh•Ý 7왩loÁÊyØñ¢°µÔyÞÓÙCM2.)lÚ8 w;¥–$l‰ìãINŒ“j˚ U´¥n½ZÈÚ☶ÙáñԞŽ`Ø%k&XLÏàˆ™<{f0 -xÌñ4¨Þ̧›çÑt±~®ïÐEV‡Í3x9=<㠑ÜÆŸ{z»Dë뀵<þ=ÝL@uÐ9pœ>gð®mÏà=ûö™êç¸ûïÿ Þ·Øà@ž·ê¿~.ÿ³=ŸÏœ†ëõó¿Á¯ÿ§ã9éx.lÒH·£†¢[ÍÖÿý¿ásªø0ªùÿ?«Ób>eF tüŸÿžŽ—¨5”óf4]‚3†í‹Õë# ~|Xì”X$oý>dYŽˆ(‘/qS™ÖÓ9¼‰LVqà #‰3^åæ Y…ˆiút¢‚¼NÄ4mk|Ĩ@hfHUõh˜*"×/8^ -¦c!Ûxß®¬"/*£^d'.½2£­l7Û1¼ kÿÞPwÆH²nQŒÓ§:¶{`– ØÔpGå*,¦jpLÏ9’(ÐC‚Ä•ÃDE%–õ!_ÌÐø¿·‡eRI`~ ŽÉÿ`žtˆ°¼:£>SB\‹à1÷WKl¹K‹ ï®Øú °)¤t\,ÏuXÆ6‡Gv¦p´Ü8‘«81Ú²ª*&¿ñ¬&‰åՃ=ÜØðpÊ­ˆö>¥¥ÃèG½,& ½]¿ä*cjt>³‚吡´ŽÚÓb¶`eùëˆ@ý)ÄG«¹\ÜQkôãQµQ$–KKLŒÛÑð¤‡éá6~Äzò°„‹™^µÂÇ3¯"i7À/Dâ¹TpmÌÞ!fîÂeaŸçt²§"MŽ‚ÉU!‚R7„ëæqŠƆÀÔ.-OS8k\Þø ‹ˆe ^6~ÏëÑf¸XU°)Á醡Mb€²é?²òå5†r嫒\?(ÃöÞTûœ1±H(Cujšð¼“ï6Þ©àSŠ¨íé5ÌR”ÞÃ@kNg©Ã*Åꨌ&œ\0Zp¢ž*ÞôνõĪ†Ok¤ýj ;¶¢ÛPµ'ã‡Üú74ßhŠYÍdL-†Ž£Þ×Ìg|ºP¼™‹V<±PùËX‰Îc6ãª^HGGÇô_zn#ôñpßa‰Gl»cüXr9˜x¸¬90­Š§ä<_+Ç#ži=µxŽÓ‡q~«<é€þtö%äïåNé¿ï¤§g·%ÖÛò1Q¨Ÿ~­QŸîœM{ôíäßÊØ`Ò3¢8íMïÎü­ÚçW¢‘r´¤¡âíBßñÈ2ûkkÚörΚr“ƒð•ý랞}·ýÉU|Õ Í’¿§Ô¯¿Gò0òcHÉò>‰ÛTG`ÐÇTÞ߂O†}º0)h’öÀŸ>Q·ë6Ô :ÃÉ€ þ™¬ãÌØ[3¥~=ƒp$ñâ6X“o¶kC®‘îõݼ€)E}\–O_ÛWÛ@TE“K³ÏNhkR&Èo]%íF Yµw€`|ðEõ‚š0ÄH[ð /Öh6BŠ´3%ª}ʖù¡zsu]@Áfl®tlþJwÔ~„'o}´šìˆAÕ¤—Z%‹ì¾¹!¦×ØjêAϼšdz€Ð xLÌãëùþƉFúϚž9KûÌphÔ'}£f-øþÒi&ª©ä{zV_ìãûïЀIzº…ОoÒË Hk+éé$ªÙô_{ZüùœáÙúežMÍ,$ÀaôÇïÿ˜l9€ú~]JT˖R6mž”(ì0¸¦¶$ÓÎQ³ÆZÃ=5¥¨/0Œ‡'m¢Q</''@.† f1: ÓUì j -¦¹dz“—¹ë'KÙ¯¸ÑAä'’M±Ø¬Ém°/\/>rñÅeƒ"ŸØïñŒðgƒ£ªXÎ%EÑMĺ ÿdM³’#AD=—YߏP#ácÄwþN³&ÃΜúõ},3Ö²#ËÑ+ØÝ-b6õÌj쮵LNgNÍ3GxÜüHø{®¶pÞó«¯sm.c·‚bË\NK)&ѨL¬€ÙDƒéd¹»/jŠµËuý3°y2.•óT.Éçôž5¿¯ÂÙ´·ç²Fs?ðš}nj`^ãY6“öú“>{µ…xƒÌ·ljÚù³³$ÿN“urµimßŽôQ²²ì2¶í›+k°û?³_#øÙ·!鳖iÖiNόyïö—b‰™V'Ïpt¡ôÝpgãó×ä÷?é‘緝h¾Œüv†ÄGãsø[Ù#ˆ»qçÃ5؉HriÚ-²‘iÂX}ïÃ2ÄÑÎŒu“Äèœ1½îÛÜÉ#x ÚtòÏÁ§õ‹k¸pœþ=Öy“äyõ™¨ÿSôÛ`â'ɧ ÉO ðƒ²!Iö΃DýÜðpoQcÈÓÀ“uü0¨%Ã7ª­‰US¿¿4ÔÅe3F”L»,ø3I%r’ ŠÝ× õ‰zaŽ}€OCæü_@0èGèqñÔ‘sЇ©Å~D}%‡qæ+Ãõ‹ÀP?ƒ/ÌÁwúù—BM(0i¦ø=ŽÏ¯·H7’Ï(þÖԇð×fšp8XW“$†›.ӊêr9I_Œ9594Mø՜¬Ó¿íé+ †é·,Ò,:Âê—Á~ñTP¿,.?xG¨s³¯Ê ̚C ‚_ìß º£aŸ3¹Ëàí¹a‘A¡¥þšcT FP'~Õª^,iOSf?DšԎŽó „S£Rþœ½sMÐÚ°kÎÍæ.@]¡¯ ®eÁ·…–´Wö7ŒK“cÀ ‘ A|2; ¼àö 76D-lo4¦ùØt«ˆ‚˜YW_y_à`) 3³ay(ºG9.Àß·•°?ƒC,OunßR`Ěâ¨åáU와ðÁ`ËÓô³¤sŒ °ä©z HábkŒf6/KÐb£T"^ ‹HÄ8¶Ë° Â4C­`A¿ø²¦%Ñh•6Ù¸qÚúÅ̅ŸKÁÄœÊórö§Ò e5Ç/1…ŒXa×0@NJ/ãm]sžZôñÌx¹7Pg&&»xOïÒj.ãXÛ2j”%=·›c”¬ù^0q‡)OÏ#tñ–ÑLýž?zéRiŸÄ§”L›t5^ïF@[“`¬He ½«AÄþ“Ýr ¨·N­ù(À­]flk8“>›ËŽ©¬dr4OO-™<&Ê5Šç ‡†–ú¾Ulº¸Äôb¨XWÙíL¬ÐAÇ~fß:+_ 80;P¼=N#‚ÁÕJÑõ ®UŠ®Öˆ Ô çG)ì<Í»¿ä4£ÀÊqÈÓëÐ|YÒâX§˜D’3UtW|m†¯Ð´Diÿ€Bƒ”xFËAÅ£”ôó(Y‹Z’µ—ïÁ‰bŽô‹  -WõG}%Gºðç -0Gã?±ÉC‚n­ÊDµYd¶©p0Rº …Ò¨Ïga÷A.¹òÍ?:'ÜbCVÓ¹åËì³ZšUÆà“í”ÛiGÁ 5ìyã÷[–Ѝ"F5Q_Å­à·ó=CŽ?bUW¼© ÒjrÃ2øZzŒ®ÞR—úý҄À †¾`ŽRrY±íç}æaf‚úH?¹t½j¸w,Ù¡ÉzEÀ¥*ò4t_2É|9ØíæÏö¿-ºlfsþq½×Š¸lzç'ðËÅdí=þî2w×oôPÏݗDí­Þ‚ª>ó¢ýç¦)bk üËóè(ï«Ü±:=ȃ`Ä ßš!ËlüpømB#d¨ÒŽ!a"þŠeŠ˜S¬óê.™OzÎI‚´5Þ:|öÁpÉξhxöŽE¼ÍØâm1Ÿµ˜m°®6P¬l“ 8®>²ÙYó §ëŽGFýM¼]³B¿ÖúˆÁ?D0¡äíéâÁò# š €Ak2Qª)»“y½å¿Ôlc—/a DÞ6†‡ôåNvsöOn'‹mcl$p-t;K-Ž _zfÿ²XfŸBýñLª*¬ X¿5 8̙mì&s©Ò -5 ‘Í[ÖÜ}?%J]rÂrè×ÒÛ$=Ym š´é™1F¤Sy…RûVuP†êÌj¿zCÓÔFUþݙ\9>HÐo}ÃÉ"¡·fà;3è¿|RƔ¹&¾OöMìöËRàÁ>ý @F°Ï yfäì-ø’ âߟÈt@áå9 ªÊ®Îæ ×Ôqg¦™~u4Kòž™93¶_ )XÜ° ä¾[Äš†ta½øLz[G¢fyŸ'>Ölî%÷íO.ÉÉI/p{R uÀ¼:ӅϲJ ¨àՑºØ𠃾žè Ýô  ,¹ -èmé¢ÉlâDZ¶˜¿,á¾YƒÚðL_ÿÅÅ&ª«njÕâ›áç\¯Ý ُ·ô§ º –y®ñÊُ¤·á°s/(0jˆÂg.B÷Á¹È^\ù›ÍB c­d=["›îæ-b“ãµóZÃßÛÏ/® sHóZµ,þ·q¸*è(<훗Ȟz›‡Û¶G6é%uoö;·>YŒ°ÝÅlø„D‰º#8[*¿”Lóur©·T+Æ -|4-Q>•ƒæˆÔû°Òñ=&6ÒdA8†Û;ä”·ô:8ÀF-ù|¯Ù}>’^•½œ€L¯e_§IÏê?ÛÔB«÷úöT›ha+²¤NŠðªÛñ.X™9I¸oª¡L)Nîp±œ[Ä?؃gÈ¡ã ÿ÷ä-= þ83½éÉ @iðï`lY ßMl«½@Y€1 £'_ÜðÁ°bŒŒ¢¯>·•—‰L#á~ yržÕŽ%ŠeЃͣc-•øžgSñùG^ÿJAç2!hE7IXþâ­Fa˜¤OØp_Öiã¡ötìÌDÊ“q™-hÉ-½ÿ -¦+9WJþãF{‰äV•µ5êÏåãû^¸Ë.âГuæ]5@#†xkÖ8cG}ÅsÚñ1±ÇCoKLr>mv“¢]Bì¾Ý'\åä†<Ç -g\9§ýÝ´@Oc$_=§óýã1me3³þ¥ (²»O®«Qï%ÑÔ´àD[ö’Ë0iÏ󸆝7Ð‰Ùۊ…ã÷Oî%«)źþ)=Û"tçèÜ Nljs_n£o?´ !(zeõ¿áò.Ó¹èËÈAe·zG¶ßpÖT˜´¡ú¹E'=ô¡"q¶ -¦Ûb2¼‡pHJ¹?´oȤhã±e<ÝéðMÉHGàÓĉõAm=_´éÉ$¼öR ² R5Aãìg] Hib‡”6[ÞdÆÞ mw˜EðeLøë•,X‡î{b›˜]° ¾@@¸ìÄ*bªXݟ‰FàQµe娀ámÖ@œÀvnl„+–­Òú!2ãîÁ›Žçw{¦±m e=EP¹n|…ÜšHä°¾{œV÷‰œ^åìwråë‘¦A;Z}Ðãᷜ!ëøÙg‘;WÜVQɛ‰äjµûêùüsù=׋QfDDŒ¸Mwé£^$VÃ)ô•è ‰H|l˧´­ºŸ0Ôò̎œ;oCf¬õ}CJ«¯4‡l&ð‘0þ}þ£ŒÔéðlm0ÿÏÇ‘RAðïŒCŒhhý†4Â팵j´öíbçÓ.Zû±¤ ³YÐíxd•5SÍ -èÂÞê2ìå}ê-ü¡˜è±äx%šÒ«©fîBõZ՝ ](B‹»L«ì`åô†é[Åýy&ÈOÐAoϚŠöVŠl®áiÈ°³þ0ã £û5-^ÆÆÓ ÖyNF»9vH öÛ« ó@ÜáÙyz2â­%íÄ~ÁZjåøöd°$ñz6ŸÇWˆ΍‰2ûrŒµ„ - £¶ )‘J¢n‹ƒµ™[6͌ÏÚA"`wh!AQÑ' 2p>m¦IÏr2ñµšß­€?–ʧ~?'Z¨…i㑚»Ÿ.•"Z֟-üY8;4dâáï&Gý5+”\¶ý0ýÞó]âcåmóXò°?š;Út©èþNÔuɝwe‚ Þ{þÆà¼íR¯é¹×§ØÎ_ È¢{K¨I–}6’ÓDÉò*–M1ŠæiGZçx7X_ã~m9€‘|§üõÉ6’ÛéûvN`B“ɸr -ïɕlä:½Î¬Í)ÉÙÿ¨&oýÑ9ûó}þ…‘!F¤<Ù7¶†çb͉Ó­áím°ôM$Íh~dY¯Ë¾kNE,„×o ȵý3Àa÷°¸Ú™ÿ¶h4ý „>HƒÁeü¯ &¿nó̜Ó?mpfíˆc‚ˆ¼í0C*ÂWÒi¤- ç8b떒‰€­WÄ°Ȅ¸8(À>³@´è—2Vrœ¨–òП;ïBd¸xcªiÁY1ý ÛÛ¿´3óD³àv‘éwù°{W¤ý¯Yýü£™M9û%ÙyÖ| -o3cŸÙ›¬˜Í ÿ¦P³ -lؔFP²@%kT­ïeìÝÀ<éi»í ,ú¶y¢‘>Z|ûÒ0ö -4hо"$ ۋå5< --_Óߋ®‘­{b!õœAk©>ܵÔo|bOV©¶@ \µ/]ÖTJï=ۖ›¿@ÀÙĪ©Þ̨‘ñrl’ºå‰üYºcJ/ˆÌ/(¦ˆãýŒ=-3üù³%61Í{öÇô킛â+]ÔÌl€tçƒ~¸PÍøBæÌfš¥eG@p4ß(s(ü™„/ÊÈÏF?øBºoUÑPÞàÀš©Xƒ`Zm`/5Ž™q4zkvú`3ó©ÎÛ0°<4è;ú‰Æïø‡ø¿¢OlN¡ ^ô\Eé=G˜%4drB®’„ jJL¶£)ʓjmóáh -o5ØR …W‹á}`A‘JYrbѝ‹Íru<9ÆØÝæ¦ÿïÿþ?þßÿS>X’þÙq|˜ö‚äÊÂfù\^OxV%~{ÝðL+çÕi±[M‚‹—ØfõVî}>D¥‚‡éFš‹­d›Âš,¥éá"A¼jL×;ì),³]Nåˆþî¿NÕ vٝ‡û%ºô¿´ët0Æ co`„2ö7÷æý0/Ž"ù•à]ç2£ÎÒ -*j/¬‡EÅEŸ¸±„E(" O™BpÙL˜ìKHºè)I’Óùb1Á¼|úŠ_ʼnG¢Z£Þ¿5Ö9 §µb·Æ~OnøÉå‰ÔBnöEý„^„ݱÆ) $ÖÜ2¯ûxB3ʾuY_?|¿“ý礱 &]Fc/ûû¦æ×Ø~ÿz›9ž×Xkš/IÿiÒØ*œÃ]j¬ÑœÆà9ºõ54O¬ú%ò?Åg€RL¦‡ä9c­”ÛéRASgÞ¦¡ÍÌá謗šn>ZóoZâP=æŽ5<®VÄ Î?!“å%¢ùá Bç ˜È±ˆTŸNςP»_D¶‘¬‰ÎU›ÝÁÛD_ª‹Ê‡Øt‰œn[–„j,–=) 7_cWB5#¨O([ZmÛýâ=Á/=ۋ¥ é£4Ôw£Q@Pž†?·BPÁ®eøP¡¶|øn>8À<¨¡·9™;E¡öí7I¨~ç¬nä BJÃG4æÃ1d=ŠC}÷÷2¾€z4F»¤T/’ÌÆä4'>]ùÛ ¯ÅçªÍ½º½ï\ƒJdKµ$® i_¼oLjw@d·†8ԜþÕPžþ6Å Bž–«ZRHÎìÇ/5óµÌò0¬5q°åj~°öî-;@õïát˅·oj×nÌÕïu8zâP=½$Q^×übP˜£¶ =ÊÝqB­®¦yI¨%Ç~g“€úi%êåýAE”&˜nÉÝ/g³1(ÔFaQ„Z¯ø?bPá¾€ÓD‹èő\¶ë“%, -µÕ=JBm™¦ƒ‚ -õ—Ó­m{,)5cmLJ”(Ԟ­ÑƒJÒ>ݟ¶QNJ ùËG|¬âPߚ‹eèåÍ& -µßï TtÞ\Nw;™æRP+ÄO¦œ‡šm’ÚΩV@Eþ3È¡ov=ݑÛ,Ø<Ö %㦠µ§Ÿ=…gwŠ€PmP«¯¦}?ӉÃí91¼Óµ†¶] u´ ¾Ì>µ3Օì’>£ø 2oŸ9ÕÎA…`èƒöͮ߸Ãïjê$Dr&óç  ÆL›€/'Vš=¹õ¡T‰Ï§Ö×ÀÛ' ,×i­q…6#‰·gƒÆ=YïÄßzÌ;*jË;•jpQYH¼í¾™H5C½½z¯D9îv¡·p{^ðû^Œ(Ä<¨ÈÛQž”|RoSDEÓÞrHóô2Du\øúù€¨§–'‰·Ÿ6¢ÞÒi¤Þ: ˜F¼b’jà%šš½CümDCÎ?ýö’eå‰VSóÊ"M¸ã<ŸE¢5·Ç¨Ÿ_¾-m}0!õöhû2)Á[ iŸïDOçÿ–úùñÝéY$Þ~ù‰ï¿™Mêm‚é7Ãn©qbà%Þ¤ÃRòJ¼šÈà«"´‘ŽLúY‰Ÿêd©¦-J¼oÉ·¥k!´‰™ìþ• â?÷ö7päÔë:¾kŒæâzë2FMyþÛÔ=ùx”j d„®ÓJñÿ°·)»å×ÑL“†5¹=¾Q¬ˆÒà<¶Ȟ’€ú¦IæX‹óú?ôS1ò%î<SÙFÌßM÷²ÝFº—‰8À3"›J:Æ©TÒY²âúÝÏË -ÇMÄ@ëÜFJ*®ӃªÐ'ǝ•ÀÆH8_;g¸G>¯œEXuVç\¼ŽÌ`/i3Ç@-ôÎã½­Ëøún§Î¨ñå4˜êý…ªÐVª§Û‘†ªÍNœ¨ ©BPÔ ô ¡Ô¨9{/§M é,T7j uƒ05·âaXk¡zêzäØb­‘tHBEºTŸê_âP=ÝOJÅÅó¼vIBEº$T¨L8¨p6<ÀSi¨·ZG*4$1 -ç@ÐHM·v±´º†>Ñä’o‡˜ Ý4¬ªKÏWY];ó;Õò J[+ûøV$Þ&΁JnüLqÆ$ÙQ|†A.·÷㤭IÚØ?ŸÌÚÐÂÀ9DíŽg,³n`˜í.únØÂBQ½Çy„_ô¾¼ ?pIۜtÌìlS‚¥¡z˜E­xÖ¹ô2Ì5ßÁWà ýgØÁ¤iÚÆÆì`Ðø3Mf¾9Z¤çŒ :šy¡ÿØ*[ -A”H/°‚9:Lñpˆ£>éü¦_ Aƒeƈ‚ü°Ø&c²elÔ¥$f@ÄÌâÏ*þÐ3Dº·è ß5Ü ùFHv’ìŸ\ÉYC CW”ÖppF*.=|JíXI)ÒbWúÖ5DŠ5É°õJ|ISDØ&èŠ3tɑ½8Íçº;yú∋&hiú"f¤¶«ûò¨G²À¾µªÞAaB õÌÚ(ã‹Ï…Û .ÔµíxØùƒî!˜+V$'’Ãú`ÍãBf¢MÉíÙµ$GD°zô‡FŸ˜{¢/óÕnOœ‹oOJµ™\Œ,•ULŽZ|~¼ÉÙuò“£þLßÊ!ŠæÜû -·ç7/5/qšïgˆéqٖŸšÍå’ (ì Üâäž+‚<ÒÀj¥ÀÍ@úà†³™žšNš‚X‚¦4ÑÞFGÉÞ$»Âiþ$wpäÚ«˜µØîãk`DYhr*È,èàlB`ÅƲ'“m ³®ïs²„&L;V$Vþ¡‡OY°/ ̐Ïy]ْ&4&JñÀÆf•1K9>%¦Y­‰IgÜ -ÓHã/‹g±,ËÀAþГçB¼c Ì«s”:©D¥I¾(É­pNÀb©íÉ?©T/ò$GõƼ -¡ -9H1Ç,ÄWP£„¯×‘I~LHaÃr%{Á¢ø°X1OJÖãI'wzr+¨â0(]êe¥ ’F€/£‚¬wÅ"ž64Ó1ý›¶Äº¢ÖæêÞøŒòÀpÖyÑÛ̸ï<i -ß5Ӝ…L½Ç!MÀÝ®Fm cl6§è^ Ýº’¾$?JΜØL³Nþxçyþá/'늟ÙyèžÉËó4\ú À”–ÚGmÏ\*߅ e͐rÉ#hàPmo™$‡¸b©¢Z 7FñŒ?P 9À`\w£E’ ‘P-ÐC{ñ3ë=ÊbÊ#òm2jÂÄEÁaqvp0¢¿àÌz<ó_²ù>n4×p©òWÈ"¥PqX¼1tjY Ôêbïà -¨ƒà¯ žÈÏðd5ŠÍÎæjÄ+IBÊõl¹ƒ€O¼1SúDZ’ÙÌðøë¤NuR ÕhD¹¯½$EÐFHõø’ÝìbøB½ ;ô%¾®Üì<|ñwºƒ9Öx›}]äov 5NÑåև´ZUÆY£Ãº(£ -^r©CZB¾‘”EAÉ` lÈE‡tˆ4ÞiQYݱV£"99*,AÉâÖ÷Ä=†š ˜Ööî) OYÜr+o×ã-UñÌgðªD¼óâÆ{¹D¶SØvdZ'n’à‹Ù±ÐûI f»c͍ÿl”ª¬¤}¹»ÒU66ŽÙðI+Ö$å͆B)Yê\,¡s‘9=å,¢*¤ä]‰.Þ¸obÍWó=äNô®$<Uš±qrÕ4üƒ›75SzñÜÈ -pJ+]œ€7°€ÁÉÇÄ‘K~b.DÿäS8—FÒ9üŒ´Îˆ9uÁ§xfZ+ÏÛ}Òæ‡NýFï>¯Üû÷F©9eÌ[°7ÖJ+¿oTXiAoò»P‡†›‡¼×ŒWÎlô"á)TîÈrÕpÄ=ì¨#ëCæ…K6wudW1:Fþ,D½9î8VY¤1±Ù|©vvw»'0fzhf7?p`<¯‘JO¡$6'—OcåèñbÜ ¨6^³€»g!â9VċNónî†ÖœWÉ÷rÜ t%ÂÝè ‹k}P ·«¸›„ Úôë[Á.*¤)M±#5ìD¾*:¬†“(Ç)©û#…}k}ehéÂ&²hV9Ÿ큄œœà·rPG³e RdƌgjCUDW -¼+H:²UJlÇqÙÓófŸ0èM™ãr¶N%¦ÛRP!Æq8.ëîä•nb6Z9~À”4³QìHRð—ìEpz²ÝUAõªÝòŽ|ŎÔÆ4±‘)’ûõv›‘›;q±œÅ9«ð|jË*tݛR -;íGHÿ_Òqœ¨®ú|½ÉJÿb‡£”åöv£ô¯+©õ>äXj+9Ö@G÷ŸFTòEåîà$4iË/ÚN¹#Rò|”?Ř ©µ_>ÊŽ!Šîž!ӕJ†D a -ŒäóÄÚB³¸ÐI~2I«¬›h{ -w¦” è7 -Á">ÔÛÕû\r`h“Ë›ä8/i>ùÕä{qeU&° -5ò§˜W -;²6oéˆ=©1adÁ·u*ï315Εìtí‚cJŒ¡Ê-©ÆuåŽ)<4ò4‘è8! -’_¡ûªMÆ·ÙÌRåIm4ìÊ+·6W¹`o -´|…1ŕìj ×ÈÂ@Gœ »È0§¶7‰m?:ŠEúb`pÊPŒ¿Dc’¶& 7³6‹¾=~áõ6ف(UÓë€òö¢Õßܪ5¤u“s&ÔÇûÙFô=ƒrù˜Ç¤óYesùž°¤¥»Òùð­Ë\¾'üŠ‰{Òùäsùž¸ÔÅûÒù0¨"¹|x ò]é|ò¹|Oxêâ=é|ò¹||êŽt>ù\¾'ù\¾'~êâíé|ò¹|ô±v:Ÿ|."èG¤óÉçòѳ¹.-“€ÇÚXž’À'¶W1&5b0,¥XñÊV^r§ÃÒB/À́·Ÿi¾`ìºÇ@ün¼*~]ÆSø™æ¤n@“ßv‘æsÊÆSÊäòeCþD=…2½)EyIÌð"cEEŸê^ºî@ü@>q•Ÿ&3,%C—̘vúÚü½+ØNÞÑu·Á ¿z’/¡!&™{|< -Íïnó˜Ü—N09ñpÅ´»kãKÄì0íîjKóå”Ò•j”RڝúøiÖ p#br“–‚Zm¢˜š¯èȵˆÈÂü¤ˆ©Ž\gEcŠê¼×¡v U^ Ñ¤× •Ï¨¼ÊÐ͖.91Ï¢"ahãÛ¡lã[Tr1AÈÈ9rÒGž§*-pR’1®É)쟯Jx‘É)ä dbù70¢ ³qIçÈM%“p„b¶Rä}N.ò¾úÁZ¤Öð‰Î)TŠ¼WŸS(”þ„gä_‘S(°z*Qd!ݛB†ÚQštKÚõ4•¯1¸¦7ißÇ-HSÈÿ¹iî{zãۋ© /yATT -–BúŽ*17/4‹$-qÛ^]êž ßè­’>ˆö9©È«çy1}P,æV…>xŠ)$Ÿpr5×î“F}®ïƒ×AôHˆÜã"PqÙå–B‹RʞÄ*áÂmþ±"£¨I¦ý‰î[PĈjC„¤U])aï⼓gà”<‚)]F©ò0¹Sú ÌÔý>ÎObXÂ2½ø¦AƒÃô*‡rõtZÖEpÒÍrÚ_Arïs{žåŠ¨R½oÅBœ0Jû+\g ’É`ã{\èž*é@9G7¦'ö’SÑa]e½‘ -²x UÉYožØÇÔ ë:ëPâۍ_OBë L‹ºÇzƒQÚºx·õÆ­™ôbšÙ¨Ô*Š×[o¤íëâÝÖ09I&dD}>œJë͓Ü=P(î^ë L†scFÈ[㒊*¬7ô¾QÌ”¶Þ¨Êb%ˆ «„d/œAú‰ÉôRHU%H—$c.ž®É ÕRRs¸Œèrǚ~ɬ*®=+qQº’Ī&gVK¥Èž&N¨%•ÁJil0‚oë¼1ÅO™ãRº§BŠŸšŒVÙL%bÊØéԄ`’2› -Zj' ÂÃ4 -²à™4EàcÊ®‹›3óÚ“œ÷èÌ<ù°ë‡eæ)RÚc2ó(ëàErÞõÉgæ] {Of.CcÉyÎÌ»T -ÕF^•™'jÅ¡ÈÌ££$óD”™GGÞ “ó™'±6ÎÌSÐÖ¤üB¹Öö‰ÿðÈSˆ_Wz º"UJ*B/Ao®Gp€óº -§—¨h€\6!c ^.âop£Žø*¶âpDm6¨£»¯@½Ð›QEä½"w“¼àX4ò^Uˆ5Ò£á~Ì|¥äqHǪ؏ݻ.»em3£Ò/êC¡{áRÁÓ$C¡{Õ ®2¢zJ,Zâjrk=èªcԑÒ]8jT\ÔѕûQüXk=d?¶$GÜf£RðG½®ºÒ*°ÙB&À /–೫Õn ?êCò~fµ8l?4I¶ýÐ$Ùöƒ’d¿öH’%µöÇ$ɂŽ“$ ;º?Iöò$Y˜F§|ѵ0vP2 l™«`UÅ/ñÃy ¯¸ÜƒÃÝf0šÙ`yywÇ -‰%åñŽ55±BüiªÕî±µ‘T𐔇mO:/ïIÊ»]÷¼*)OÚxÿФ<:ÈB!]ó't3l_þlQ©ÁŽ’<Šn1¾ .ûŠs¡|ûý[=Nd‘…'ß|%´½¨ éjÃ3ØITî»E²é -¯PVöL ¹›‡!cw¢3ðI*W9ëZ0&Á}æ|²ÀîåÃ]9i>‰î È+(ÿ¡Gåãë FÁÌb=`h,¥0©±¥?Ú[«_‡åÖK#ჟÞaӔÆ^x gg駧×í4cŸâ—У2ÂpË-/íîÝIà˜æ%Àú-^œ–Ÿvgé?–’É~ó—\Ú]ß. •È&}U ¨>ÊÍz’NöëË¥Ýi¼ÒPs¹C—…ê©S(Ñ|˔•«Å?0¨‚záUóíI2ÙÏûk‰·-;©T´®\Úݜ@}â×)üÎK'û½,­‘Ô¡ ÔâKÂÜÆyQ' Uó¥ó5¥0l“MöÓf ÁÒÂ}kGðÑ'&)ðµf»w£öžäLÌ@ü™V®¶Â‹”©í&,«§ÂlwEe=É>)×ÂS*´¢f†Ob·Áݜ«ªÆŠZÄ+”Ÿ¸bß³²çKªp;©tU>N)|XbŸ˜öq­ÍFEbŸ˜– n¶»+±O,«OR†¾=±O̊Hˆ™Ø'–Õ‡öÍcûÄȇõ­=.±OÚÜýÐÄ>±ðŒC?*±O1ò1‰}b~ /î=‰}üu¥²úd+·&öIxqØ'“±òÈÄ>µwtݙ؇Åû³Y}¸Šû Ä>±Ã‰²@=4±OlL¸ëûA‰}bY}‚ˆ®G$ö‰­!»o—Ø'Öã,~`bŸXVŸXÆʝ‰}7#íºÄ>%¤=(±O,«ïZ¤©HìËê{’Èôº#±OL&}f}ߟØ'Æ{°CúQ‰}bÎJ÷|hb¿ƒ¢Š{cbŸØZK;VnNìÃW‰ñÌȝ77&öI螒¹1±C+c>I'”ÝšØ'6¥'ìæ$)yëN‘Š/҇LiE¹C.QÄ_鈸u{ö•"߈¨â§$r<¨Š_T¤„Ÿ¨È¡UŠ5€1R¥ŒÒÅòSõÕÑ$©RÍ^‹ºåû•>~ÅüåJî)ÕêÓeÈ–š­jLŒª–ÙÈ Êw³‘T™ÜúàÒÉW™ŠB•é2°Ih3“Ð=õÿnLžãÌ̒q6*åu•ÅÿJ“_‚»‹ÿQV¥ú*súqEø]Åÿ09M¦þŸúT)‰â×!o,þ'n„Öÿ»2_ê²øßÓŅçbõÿnˆ ÇVƞÉñ ʕIž{\ŽÇ®ô˜;ÉÑڄjwg•äã;¸€KŜ>±Çk£»áÂß]%¨$i|£X¶O:2DuzªØ§@§.H bǯŽ %ëñü'fÓ¥: “y'O[»Êa­úªóËäBâÁP=ò¶ôkB­Fð˜P+t7Áý”p®&ÊJM"æ<)¨ž(+F*;ºæ ”ƒÝ´/zz.ß\i÷&}I¢šâõÂlß¿©é"Û÷oªìRŸ€ö7UUYDî "½YT16ì0“Äf}ƒ°©bmpeSÎ9¤¸Ëíu¯¼ßS•±0urcbLó¡Å›+îؤPÜÊZÛ«„{ 5 -Õ¢»GÆàz‘½¦£\c@ut[…o¾~;’‰Fº.,l‘Š{œÅ@&»Üà™H -Å-Æûêþ‰F¦à¥ÿn܏XW¬õ­T÷O¥¨~oÝ?FT—,ýweêDÝ¿kUÜëþ‰küÒ÷ÌëÂfs]±>aoÊuÿbÙlߛêþ©¾¾=÷µ¿;¿ ’únÞPŸíKjEUK– ¯Ëö%µ×՗7¦@œOUä}(&b2©÷œFpkGªŒ_ -]¨£û²}Q/Ôéy¶o[ön»8:=¯É¾¿ˆÚQUE'Ùs©.£v`YSþD5ƒ‰ÅـÙËìÇ+©:ÈW%}¬‰çRÉeˍ¤­}4¥©VðAo¿*b…Ú½Äö½-UlO‰T¤â?H÷äõü ÝS␠-™2“Š£Ðü†%›Ku­Ä8¢·B0àñ#®Ÿƒ‰rì&x¾÷†¼Û”C:”c -O‚;ïe2Óî¹Uëi+†9:r®\Io”ZÉ&åð«8GŸTì ÔJ•ôF¡:}+† Æ${ˈê¼[nG½•(@zÊÇÃÁu‚¹QtÂ`1؅©† ø'®±ŽE˜b˜By†w9¨g—Ï @ý‰—#w8’/*"h~i:­+Ï̋h ’™y‡óC:‚‰¸æÂJ|V®4HÕA6[­'—…øG -ôA"âì­. Õ@c)¨É9æxKÖ±éòs䎺ߩTf^ Ýë×ì\™yf,ð‰­‡!ùÕ% •È‰7 ¨>þcíê‹A`àteÒµÙ£GjÎöӒ„jœšü¿˜¡K˜萃Z6JB=›QT†JDŒÛ¼¥øè½æTo²VÓ®^oxÌF¢©O·ïg:UÅ.½¿4õÑ'LÑùJÄQ,È´¾°ÀdÏé3‹=ùTDgÒ -»ˆGé3ý² i¨ŒeN/¥h$™ª|"sHêHR}\WhPÌ·vEJ¢Û»ÈGSدHIT>j¤¢®JI”@éE>¢@€º6%Q•z(t¯ò§tUæ’B>¢´&]mŠÏë¦b…8ø‹âjÔEnããŠ*™T¬;”ùÇÅ -…<í*VH›To- ¨¶X!k¶ûg‹"JƒÃúg‹â‘÷ÿ`±BqóÖT´ì(’«©á(Ýj…W;dÃàî-xȐªxµÃk£í$ Þr«Õ %'÷ˆ[­¸‚‡wÅ@©/x(Ÿøô€[­PÁÃÜj¥¦à¡º|Ï» r3zˆôM£²Õ1Å㾂‡W&”ÝZðPHüj‡0·<”ŸÜ“l}Ï+ -ÊW;”±u^WðP~J”¨þ€‚‡ŠÁ°)x(_Œæi÷<”ßƬ¨.Lº¶à¡üÉ'”Ón.xÈ º¨v(ªßÜRðP>. »¾¯à¡ŠT’G<”¯vȞ7÷<¼²Ná­ù½«^ˆo,x(®FƒyLÁCy ÍÓî/x(›CŪ?*[MºÚ!®ÜUðPÞσdG<”ñ–´Ü^[ðP* wEܙrzS`#<. r1•+xx¸§à!Kn¢Õ/l6·<”ïåI²Náý)XµÃûRIš’ºÀÛ¬.´WEÁCùÚ'ö~v?ÞVðPþæNñ¸³à!›ø%š±ý„'-©Oº,x¨‚§=¢à¡|µÃûEuºàáÒ±Õ à!Ӌ¸Æ}q¬][ðP±D¡ ³¹¡à¡\¢ÇמÖ=ï/x(JdlµÃûxZ[­ðƒû=ï*x(/ü`Ñ÷<ä.–|­uP²àáõ¹¸7<í…eÅò+W<¼=¢K¤àá­©úOt†äÝyûñ¢Ú!晬:ñj‡4O»¿à¡|%Ü> à¡¼vÏ ía‰WâÕ¯°uò‘&,xx»îyUÁC)~HU;|TˆbJ¾Úá“àjý› ÊW;¤EŽû Ê'éŠÒ7<”¯v¨$§©Oҕ­vˆ!ï*xx‹dsCÁCÉÕD ¾ë[®7…‚‡ªâ:ï/x(V “ªð¸˜ž.e7ðLú¬ ‰‹0ÖÌH6Ĭr --Âà™ ¿—÷ç'QR©$Uí&/°@ï)Žðü´Ö Ž”ŸÀæa µ›RЕ 8i0MяEÜyŠd ]w£Ú4j³ºòÖÆûð yù²4Ðj¤1öó¿Çë_ÂŽîƒÖHø£km,–["“ùs™?{ˆÈ–jнJd·‹2‘«íD¹ð6 Êëٜ¨®¦¿D½âÂ¢E4¿3¢EœVD«ÿz&Úö–‰èٚfâ{¤­ý~gF >Ü'âÇÝ1?Síp8dœ‡ã×6|8“›s8¦£Ño€rÂÇ f›í‹I¾š Îâ­ïÞ\c1¼tÞõð*ùò^Ï ¿Ë­6è|3éV㗂'h¨Žþ:鈅IJԜm;ÏÛZ”ÀhÙFã…ÐO'àñûV”ÐkƒR^G˜àZÖؓ]V “®°J -ð…‘–«…<#ç=ñ雇7»•›îÅ\=æŽ5â6Ɖl²”$²³q‘ÈUßÖG]ß7‚É´`tŸ±¾Þ> gv y¢2$kD¦å ú‡„³:µ „0þ6â•2ü1­9+-69î4âd*ÿ× 1GÞ<»Ó؂iÀi˜÷[ÕèӁ,ü”ÑXkÚ$• l]yÊl»²Æ²×¹÷š´³gÈÉ]VÈDõ¤%E†˜Ôbè$áÔñpYs@ ”͸*ð©¾#móy|jí‘úO8—Zú¹[\ŸÂäp¢¯CšèOS øEÞL4÷Vjßä­ô“É¿Úé¯eÝà§Ìx¹NoH¬·åc¢ÔnùQ¡“˜?K¤Øü0ã,Y¬iÛË9kÊ -¤-õ2`Øw6ü]“œ°/ø‹ù+0ZÆåi—¤“ ™Á¢éÌÄÄd -¡ghmrq+Û¾Ofú¡Ó>kç^ ({ð¬ì¤d'g®J@ó±Õ­½xÁpÞ¨²¯ä¨ÿ2d†X³¢RŽ§v$DUÍÎҒ°”jԊûR.ø•@iä8_E_é~ǽO’^¹nÖê¬Ô—nð¶aCo]f_h‚!­á Àf}€p­ê/[Ð܏‡‰–g{lú)R².E_–/7œ\iè’À†H:uLjµ>ø¢MÏ[Âÿ=1Ѳ@ÒeîÕ5ôÒv?]ìŠü¸õ‘È¢%—ù½8ì²ç@Ŷ\ƒþÑoçºósç—Nυ†ÀP#ú OþØwk¦ÕÉÃٌ°Ùü´5)¸ÏÃîXãô‘\9æ–ÄûxVN— -š:§FLÒk&1àrg3Iº_΅)õۉ&â6¸šŠŸ^úSz¸`Û¹év­uB0&QM5¾³é•vœøh|3#{¼ ä„rÝàOï‘ÓÎG1 ežÊÔ^míy@uFgqÔ÷’:§{Ùi'­›œ3©ï¢.Ÿ9|FÞÕ(¶Í¾[¥lPߜ&ƵŸr¦Ü·À±ž,Ãý2w¬CV`äB½Å5=h°[j‹ˆaXi -†¬àÜI&Uá['»†_à«ð/iBŽ%ðçu¾ú-¥­Õ=4‡ ™ö ‡ŒÛQ‚<äŸ= ‰µÔ>Ÿ¾û#”PØ駨f:ëÇ¿èÆüa|Ò¤Íø CgJfœMOVø̊?+[!g*QLrRgºÙ€“f'Õ—«äJ»É’v}ác6of´–”˜•+k®´ýӊ+\¾ -$ ?™ùŠoOE<°Ó=ÅN½£\Ü7‚‚Ÿ÷•ÙÍóFÝdA³UûdôuäÈèÒü²î“¶Ý:f¹\^Òºôi5ªI÷öÚ­_ð/ôU38£Ý;QìŒÌ†IZքêKÙ+4ÂbvaF>%a¾Ö3bò²I¯c~Íd(FJ”v»R‘‡Ó’Ð3X»‚:@’Íëϋ°óè}Ä¡À™*wn蹊˜Ø†ži^»kF€<6y7t@ÆÓ}ç:€â Á»Í -ûp>¹>êT´Q¦˜(Øþ ÜiF—yôC¹ËDæúsJQfúÙpoAÏҖZ+`,#/»Ù&˜˜E•[‡˜;ÿ=„W¢{Ϛ¥î1za6Å>WX 䤐Ґ” ¯?؋;àýA-WU+¸Ñƒ[R´Í֙¡dèC²ûɈÏTYö/Š xr`D¤ƒ'M¢Ò©ig '´j<ÇO’W‘˜ _è¸áàê*ýH!!îfx…‡—ˆæ‡ÁƒÇÉáAP(žºñŒBBúXçՋg‘pþ¬²Hè0|<ØTàÁ¯™L4†±* ¨0%ÒqH€³¡–E1²x¤·QÒ\b‘ÿvhÿšòÄÀ(…ð #hZöW—4\gÇøZ‘":®€B¤k^PKiò} _èíIŸ79«ä8T §‰àläû@&º;&‚jÁ0H»mELøŠÈ‘6b6 u ûÀVïC-6M6!딜H,´Ü0}XûËDÆQƒMJŽGßD>]±w#møí̔ˆD]BÔH²«Ï¿Tˆ¢4®é”FI³wR8!÷ !æNJÃ1q+¥áÈPLj…¤Ên|Ä:% ïã‚Z±}«ˆM J»wEÌL ¤‰!C®yn,ÖÁűf–ÚûjWÄÌ­GWiêIˬ‚‹u€ÚñU½i"ܒ -6…4U‘bbjAËÐf‡´Æ˜þªÑ}¸Ž}þ ,ò•;¤eaáÈóÆAPænUG“ä pÚ¼‘uZÄÈóšsɂh““¡oÙìW²K°¯ß§P‘ûêևR%ÖY<ý›BA6o㛛á͊==`ïACj^c«šmH3…^ÚvHÙkqåх©/¶ß¿ -4½á! :ªkl­ï,ÿNƚ𗸎”^°Æ`/£ö”ß(='d!f¨®œ.wÔ|Ó´͙…‘dˆúhKmˆ°ƒAL“”pû°F}æb  䲉Zê•@G¯ùÃ!ú:JǬõF:fšôÈd0éG¢º”ÉIG»p;ik®¬më!mmZ{¸ð2ÂÙ퐌º ´ü\ÍÀ¡€ZÆ9Æ÷ àËBáYà’]k†õFQVœ•Ó˚¬­Bû'k\ Í7Æf6’ñl靹k¨K8õiÿIc8#P»=ñ$ZWÏujt¬Îàl¢§{aÒ$Yõt¯’±Á1¹9ç¸cÖ:oÄyši+|‹Y÷ò}`ÈÊcIN҈,Üɀ;šôb]–,Ú8 -Æ0G`Âi æ2É -ªíæ¯l4¼)¥sväúÙæ\ɞ;ÏA '?ZdÃF/³zÌwÏ0Ú+a'J¦j -üéd©}́}²u²î¤ÁèCE*"áMç‰9Ý*²{!ãªÁýr>f‰YÅR¥l²`ÂßëA‘3îÁ†²'¹Œ±rô©)ñGîÿ3棬OZë2ëwq·Aã˂Nn—E„Þ(2ï |`0Qw"“¯ÑÁ#eËsÙ4ÐÜ‚UåCàkàZx#H‡¥îËÈ ÄtŠÅã)ÄèޔßÓºkñ@ØtÖÿ‹»~\ý×ÔùfóÄ܆Ê<‰=«lM>×`œ}ş}í=и§ž±1·Ð-71ô#mØ?[ÖHA‰…äh¯‡) a?ØÐw¢Ý~‡›×á6üä+'nC;Ÿc׺'d^ƒ³¡,læpÀeš7ÓdÞïóÓQ3EŽÊ˜;±h.Nï_Ð%ûE;üyYqŒ‚ -ðwm}UȅEõ}ݽ`&BÐäÄY ˆ‰é£‹,í0~ÝÈ[ó¥^íåt¹~Ú³(áŒzL”~Cí¸ÖÌ·»ðaó^0¾ëâšï1!ƒ#´1ö3geƒÌ¬ÐªXǀe"?`O­àÁ¡³ÑöGo—¶ ;O&…šÕ;ŒÓGlš¶±1Ög€¢4F¿Úm H‚ŸÐZr0¿Ì:6'p±ñwÍøÖüfÎ"ŒüŽ´¯,újÅ^ õ©WÎ!Mq~´o°›1æEXÂBû2f\FÃ\Y˺ÕÞ0ó5¤´\ß1fßÙ±Žr»Ÿ9 >42CW[ÞWöQÞ»XSs&œïq ;ÄŠ÷ϲ6ˆ' vz¦—ÐP€d hÎù^uŽl(~|m’èG”SÕùþéf=uà\ÒEtÈ¡ 81tËb~„‡tϞv#öÌúÃbð#‰HeÂRYt‰y¸èz£në’a±<9"nœ6҅ɫFpÞS³i¸0‡œy5Ð1μ¡‡ý€9i²U‘ÀFSð¨é¤i~Ô!ó(˜Á§O’&ÚQ߅¢» .°d£¡›ù4ñ >èõ]~ .íHÐ_;Œ‡jùI0Ÿú$;œwj€7¾=G®¾Æ= =u•ý =›åڇFÓ¾y–úõe«ÉU@ÀDÊs:ÚÅÃü¡ü±[Áïpî—1M2§>Aæȸ |’̧ çӇÿéÏs1突µ˜£aË®…¶ÎìOå%Hù ƒ£Ÿ(æ¬ÐÑùí£P‡Ð!æÄð¯—ä_F:æ 0"O³µÞ·4";K*,…áÑÆ{‡s¡}7°‘GÆóå ¬ƒôŽóz(]š½!+ $ž(%.°^6ð‹ÜÕyŠ@„‰ôŽ':岘ÞwJä—ÆÆ÷˜2/ GïÝ Ã(—Xêe„žQ]²Ñ›$äÁ%À]ü­|êg™˜ð¸[™`|[%gJɽü -ù€ÐÝ"o¦nŠ¦i 2¤lÔcŠqS„éï”.oÏBgÇÞy>ö™MÍÂ%‰ü¯èÓ¿üA·÷ýq~œWÓCõ°˜/6Ïà,B¡3Q Éæf²Í¦ÓÆô¿Néíø¼žnNÏ¡gg¢ž*Þôt¼LŸm4ƒò³œÃN+Mán) y“éY0·Ìë>^‡éэ -U/ã®±‡9”í úö¢± &Ÿ›+[טòGüÚ¥ÜÔ/Σôě,ºôô’a>p6útÀ©±™ãq¤ZÂHŸ78Ã7ø"¦±'܍­ÒÉ«ˆô‘ ó¡ÖæQ‘>’a>HÃSéÃ1ô+¤Nd€ìVJjÀ½Òáy‚yQå8xŸæW¹W ܃Û çê}:Ük@„²€½öe¥vÝ÷ñ#¹tº›ÕJ œÈ€‚4ÿ)©;â˜Njàú£õÕFjàD6h某8‘“/5p"œÍ?&5p"¾o.5p"#-5ÈÇî2šXHڜ†NËw’<:[«Ÿ²Ýјßz&š‰žCïÁæc54æÅ*ª±oj_±Ŋ¨Ð‹öÚ¥ØØ< 䯱<±·ÆþI·îíŒÂå1q -«"‘ÀÀXœ ëšÎ:éƒÝè2Æ5ßhéëL9lÈXêú>G -ÎEçä ‘…-dEº9ài™¢Xî§;Öz+ H…­ÐG Ÿ¥yÚ7½\‰€Á±!͒'l}?#Ô1V¦„Pr!=TÎN€ -z#sMS€kh )7÷@¤½9èÐ}œ -ÊU Š“bü;×t¡Å`¹¹«v¨Ðr.朶ìÄÌd›)e!äNjDZúL߈¨Ô„^ʔlÇCeƁÒE¨ÌÉtdûx¿ •±äž|b̈́ôl-ŒlNjê±W°¨S°ëæEõøtš—¤>-”tbÙNŽDv&z’f€â)“Ð"ÚÌ ‰’[‘;ó¬µgžuÎEucåBáñÔ:Dƒöùhp÷¾ŠPÄΨP•W—D¼’­é F²Ã9MnsӚÅâT?î2dG"^ݏNᡏ#¹>h$ôp$€áð¯> .ófBvnˆ×a}ybH`1r~;‹*WH^OH¸#n)z?©ˆ×¡„[‰ø­éqi¾+ pm :§’(/ú µVµƒxBõŒDú™l÷M$å°s[‹¦z"(ÁçŠ*‘íi ž,÷6Ô¹­‚¤©ETÐíJFÞ¸ܟ+’ÕÙ>v)Bt"*± ™$êà¨Íå“V¶žcù<¸÷XÓ\ro¦›ÂhlÓÏ[úçâN®û( ˆ-¦û(­ìqpHSšlý8q7¥M÷Q±1KQšê>ÊV›"•à Y(­ïwܳ"(r[¬HijûȕµÊûV>zJ‚ª¡ø úqlÂA@ƒ¿Š¢§âޗò+ìB÷­xå±I7rÉÛ³×푋AøÊ(Ñéž=’}¸qˆ:IüÎ{NŽfëcÔ¹ïHÍ­V.¾]n2ƒØ‘Ò¤%Äãëýö»ÈblupØÄY§Âф÷áK‰nvÉAˆ°Îq¬ÿæ«qük­™ ¨^’Š$Å욱'³:éó0WN}ƒ:Î}á3v*ʑ ÞªÂ ŠBît„ªð‚ÂÙð¡¬ÍU˜VÃ:'…¹5¬g²„{&yʶSf—š³ïžh¥}ó%³±¾O§êu?à5„“<ý‹xNÀ?ÓÎ_ˆ8@âÙ }ÀÐ Û£¯Ãõ´°™Lÿ‹~P?mÿa¸žð·‰Íi1\-†ÇÅfN;•¥0ÀŽ€B%Äà·"øôžýû™$ž+ϟßÄóä ¼ü€/Á¿“§ùžMæçN.EbWÁGÀãöº=τÃðú|ªSáò{¼‚ÃíòzÀ9‚.Òë >w†Oÿr{ýÏvOÀÿ Ô<×G}.ӟ]GÀO’ð;jGºIØt㙊N.æƒÃbþ{Œ·«óz#±Ú4FÀ¬6h²Žx¼Aب±»á˜|¤Ã šÀ ¸üpÐnÒáóA80ô€$jf©rõõpµº~7, -év³‹‚­ ³$Þ ³ }÷z^·d¸ýÏ ¿£n\® ÃÅ}½bÅÊÓÙið><ýª™f9I³ À5ÐV³ÃÓõå}8Ÿ6ÃÅ -rùqø?¦ÏÃÍf{ž¦;ðêy~˜Áš>·ÿ†OàØTJáÿ1¶—_ -endstream endobj 6 0 obj <> endobj 26 0 obj <> endobj 45 0 obj <> endobj 64 0 obj <> endobj 72 0 obj [/View/Design] endobj 73 0 obj <>>> endobj 53 0 obj [/View/Design] endobj 54 0 obj <>>> endobj 34 0 obj [/View/Design] endobj 35 0 obj <>>> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 84 0 obj [83 0 R] endobj 100 0 obj <> endobj xref -0 101 -0000000004 65535 f -0000000016 00000 n -0000000201 00000 n -0000045144 00000 n -0000000005 00000 f -0000000007 00000 f -0000170608 00000 n -0000000009 00000 f -0000045195 00000 n -0000000010 00000 f -0000000011 00000 f -0000000012 00000 f -0000000013 00000 f -0000000014 00000 f -0000000017 00000 f -0000171227 00000 n -0000171258 00000 n -0000000018 00000 f -0000000019 00000 f -0000000020 00000 f -0000000021 00000 f -0000000022 00000 f -0000000023 00000 f -0000000024 00000 f -0000000025 00000 f -0000000027 00000 f -0000170675 00000 n -0000000028 00000 f -0000000029 00000 f -0000000030 00000 f -0000000031 00000 f -0000000032 00000 f -0000000033 00000 f -0000000036 00000 f -0000171111 00000 n -0000171142 00000 n -0000000037 00000 f -0000000038 00000 f -0000000039 00000 f -0000000040 00000 f -0000000041 00000 f -0000000042 00000 f -0000000043 00000 f -0000000044 00000 f -0000000046 00000 f -0000170743 00000 n -0000000047 00000 f -0000000048 00000 f -0000000049 00000 f -0000000050 00000 f -0000000051 00000 f -0000000052 00000 f -0000000055 00000 f -0000170995 00000 n -0000171026 00000 n -0000000056 00000 f -0000000057 00000 f -0000000058 00000 f -0000000059 00000 f -0000000060 00000 f -0000000061 00000 f -0000000062 00000 f -0000000000 00000 f -0000000000 00000 f -0000170811 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000170879 00000 n -0000170910 00000 n -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000000000 00000 f -0000047239 00000 n -0000047055 00000 n -0000171343 00000 n -0000045567 00000 n -0000055928 00000 n -0000055815 00000 n -0000045927 00000 n -0000046493 00000 n -0000046541 00000 n -0000047123 00000 n -0000047154 00000 n -0000047455 00000 n -0000047723 00000 n -0000056002 00000 n -0000056198 00000 n -0000057266 00000 n -0000063713 00000 n -0000129302 00000 n -0000171368 00000 n -trailer -<<025EC4A9513F8B4B84067E8D2E8B1981>]>> -startxref -171562 -%%EOF diff --git a/net.mograsim.plugin.core.nl_de/.classpath b/net.mograsim.plugin.core.nl_de/.classpath deleted file mode 100644 index bc3587db..00000000 --- a/net.mograsim.plugin.core.nl_de/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/net.mograsim.plugin.core.nl_de/.gitignore b/net.mograsim.plugin.core.nl_de/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.plugin.core.nl_de/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.plugin.core.nl_de/.project b/net.mograsim.plugin.core.nl_de/.project deleted file mode 100644 index 8863fad2..00000000 --- a/net.mograsim.plugin.core.nl_de/.project +++ /dev/null @@ -1,29 +0,0 @@ - - - net.mograsim.plugin.core.nl_de - - - net.mograsim.plugin.core - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index cd95f141..00000000 --- a/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,7 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 diff --git a/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF b/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF deleted file mode 100644 index 4a3f56fa..00000000 --- a/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: German translation -Bundle-SymbolicName: net.mograsim.plugin.core.nl_de;singleton:=true -Bundle-Version: 0.1.0.qualifier -Bundle-Vendor: Mograsim Team -Fragment-Host: net.mograsim.plugin.core;bundle-version="0.1.0" -Automatic-Module-Name: net.mograsim.plugin.core.nl_de -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Bundle-Localization: OSGI-INF/l10n/bundle diff --git a/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties b/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties deleted file mode 100644 index 5f8222d7..00000000 --- a/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties +++ /dev/null @@ -1,34 +0,0 @@ -#Properties file for net.mograsim.plugin.core -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim Basis -content-type.name = Assembler -category.name = Mograsim -view.name = Beispiel AsmOpsEdit -e4view.name = Simulation und Visualisierung -extension.name = Mograsim Project Builder -extension.name.0 = Mograsim Project Nature -category.name.0 = Mograsim Project Nature commands -command.name = Mograsim Project Nature hinzufügen/entfernen -command.label = Sample builder deaktivieren -command.label.0 = Sample builder aktivieren -extension.name.1 = XML Problem -decorator.label = Resource Decorator -themeElementCategory.label = Mograsim -colorDefinition.label = Simulation Hintergrundfarbe -colorDefinition.description = The Background of the Simulation Visualisation -colorDefinition.label.0 = Simulation Vordergrundfarbe -colorDefinition.label.1 = Assembler Kommentarfarbe -colorDefinition.label.2 = Assembler Beschriftungsfarbe -colorDefinition.label.3 = Assembler Operationsfarbe -colorDefinition.label.4 = Assembler Zahlenfarbe -colorDefinition.label.5 = Simulation Farbe 1 -colorDefinition.label.6 = Simulation Farbe U -colorDefinition.label.7 = Simulation Farbe X -colorDefinition.label.8 = Simulation Farbe Z -colorDefinition.label.9 = Simulation Farbe 0 -colorDefinition.label.10 = Simulation Textfarbe -fontDefinition.label = Assembler Operation Textstil -view.name.0 = Simulation View -view.name.1 = Speicher -view.name.2 = Instruktionseditor -themeElementCategory.label.0 = Simulation \ No newline at end of file diff --git a/net.mograsim.plugin.core.nl_de/build.properties b/net.mograsim.plugin.core.nl_de/build.properties deleted file mode 100644 index 34520a00..00000000 --- a/net.mograsim.plugin.core.nl_de/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -bin.includes = META-INF/,\ - .,\ - OSGI-INF/ diff --git a/net.mograsim.plugin.core/.classpath b/net.mograsim.plugin.core/.classpath deleted file mode 100644 index 4a00becd..00000000 --- a/net.mograsim.plugin.core/.classpath +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.core/.gitignore b/net.mograsim.plugin.core/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.plugin.core/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.plugin.core/.project b/net.mograsim.plugin.core/.project deleted file mode 100644 index 29dcdb4f..00000000 --- a/net.mograsim.plugin.core/.project +++ /dev/null @@ -1,30 +0,0 @@ - - - net.mograsim.plugin.core - - - net.mograsim.logic.model - net.mograsim.logic.model.am2900 - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f8bd225a..00000000 --- a/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,456 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 3c8fadd6..00000000 --- a/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=false -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=true -sp_cleanup.convert_to_enhanced_for_loop=true -sp_cleanup.correct_indentation=true -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=true -sp_cleanup.never_use_blocks=true -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=true -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=true -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=true -sp_cleanup.remove_redundant_semicolons=true -sp_cleanup.remove_redundant_type_arguments=true -sp_cleanup.remove_trailing_whitespaces=true -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=true -sp_cleanup.remove_unused_imports=true -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=true -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=true -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.plugin.core/META-INF/MANIFEST.MF b/net.mograsim.plugin.core/META-INF/MANIFEST.MF deleted file mode 100644 index 6dfa9547..00000000 --- a/net.mograsim.plugin.core/META-INF/MANIFEST.MF +++ /dev/null @@ -1,36 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: %Bundle-Name -Bundle-SymbolicName: net.mograsim.plugin.core;singleton:=true -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.plugin;uses:="org.eclipse.ui.themes,org.eclipse.swt.widgets", - net.mograsim.plugin.asm, - net.mograsim.plugin.asm.editor, - net.mograsim.plugin.asm.editor.rules, - net.mograsim.plugin.nature, - net.mograsim.plugin.tables, - net.mograsim.plugin.tables.memory, - net.mograsim.plugin.tables.mi, - net.mograsim.plugin.util, - net.mograsim.plugin.views -Require-Bundle: org.eclipse.core.runtime, - org.eclipse.ui, - org.eclipse.jface.text, - org.eclipse.ui.editors, - org.eclipse.ui.genericeditor, - org.eclipse.core.filebuffers, - org.eclipse.core.resources, - org.eclipse.e4.ui.di, - org.eclipse.e4.ui.model.workbench, - org.eclipse.ui.themes;bundle-version="1.2.400", - net.mograsim.logic.model;bundle-version="0.1.0";visibility:=reexport, - net.mograsim.logic.model.am2900;bundle-version="0.1.0";visibility:=reexport, - javax.annotation;bundle-version="1.0.0", - net.mograsim.preferences;bundle-version="0.1.0", - net.mograsim.machine, - net.mograsim.plugin.core -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Automatic-Module-Name: net.mograsim.plugin.core -Bundle-Vendor: %Bundle-Vendor.0 -Bundle-Activator: net.mograsim.plugin.MograsimActivator -Bundle-ActivationPolicy: lazy diff --git a/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties b/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties deleted file mode 100644 index 856144a6..00000000 --- a/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties +++ /dev/null @@ -1,35 +0,0 @@ -#Properties file for net.mograsim.plugin.core -Bundle-Vendor = Mograsim Team -Bundle-Name = Mograsim core -content-type.name = Assembler -category.name = Mograsim -view.name = Sample AsmOpsEdit -e4view.name = Simulation und Visualisierung -extension.name = Mograsim Project Builder -extension.name.0 = Mograsim Project Nature -category.name.0 = Mograsim Project Nature commands -command.name = Add/RemoveMograsim Project Nature -command.label = Disable Sample builder -command.label.0 = Enable Sample builder -extension.name.1 = XML Problem -decorator.label = Resource Decorator -themeElementCategory.label = Mograsim -colorDefinition.label = Simulation Background -colorDefinition.description = The Background of the Simulation Visualisation -colorDefinition.label.0 = Simulation Foreground Color -colorDefinition.label.1 = Assembler Comment Color -colorDefinition.label.2 = Assembler Label Color -colorDefinition.label.3 = Assembler Operation Color -colorDefinition.label.4 = Assembler Number Color -colorDefinition.label.5 = Simulation Color 1 -colorDefinition.label.6 = Simulation Color U -colorDefinition.label.7 = Simulation Color X -colorDefinition.label.8 = Simulation Color Z -colorDefinition.label.9 = Simulation Color 0 -colorDefinition.label.10 = Simulation text color -fontDefinition.label = Assembler Operation Style -view.name.0 = Simulation View -view.name.1 = Memory -view.name.1 = Instruction Editor -themeElementCategory.label.0 = Simulation -Bundle-Vendor.0 = Mograsim Team \ No newline at end of file diff --git a/net.mograsim.plugin.core/build.properties b/net.mograsim.plugin.core/build.properties deleted file mode 100644 index 7a5784ee..00000000 --- a/net.mograsim.plugin.core/build.properties +++ /dev/null @@ -1,9 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = plugin.xml,\ - META-INF/,\ - .,\ - OSGI-INF/l10n/bundle.properties,\ - OSGI-INF/,\ - icons/ - \ No newline at end of file diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png deleted file mode 100644 index 51707352..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png deleted file mode 100644 index a0584969..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png deleted file mode 100644 index 3589af36..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png deleted file mode 100644 index 0eef2dd2..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png deleted file mode 100644 index 5fecefe8..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png deleted file mode 100644 index a0dc941a..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png deleted file mode 100644 index 5b287ad0..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png deleted file mode 100644 index 4d5f38ff..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png deleted file mode 100644 index 2b6b2e83..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png deleted file mode 100644 index cbb88e68..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png deleted file mode 100644 index ff9c9bfe..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png b/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png deleted file mode 100644 index bc2386bb..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png deleted file mode 100644 index 8ae04cda..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png deleted file mode 100644 index d7cc656b..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png deleted file mode 100644 index dedba0c0..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png deleted file mode 100644 index 771b0091..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png deleted file mode 100644 index 2018a5a4..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png deleted file mode 100644 index 9b294e7c..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png deleted file mode 100644 index 63e2e040..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png deleted file mode 100644 index 934402bd..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png deleted file mode 100644 index 2582dd58..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png deleted file mode 100644 index 06daaaf3..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png b/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png deleted file mode 100644 index 250e61fc..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png deleted file mode 100644 index 849cc254..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png deleted file mode 100644 index b99adf87..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png deleted file mode 100644 index be406743..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png deleted file mode 100644 index f5793ed7..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png deleted file mode 100644 index c2d6dc32..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png deleted file mode 100644 index 6860ac7b..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png deleted file mode 100644 index 5c0f9493..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png deleted file mode 100644 index 9723b914..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png b/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png deleted file mode 100644 index abd8fe4e..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png deleted file mode 100644 index 8972d910..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png deleted file mode 100644 index 881c9948..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png deleted file mode 100644 index 1c3c070d..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png deleted file mode 100644 index 54295a26..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png deleted file mode 100644 index 1bcc361f..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png deleted file mode 100644 index c842fdfd..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png deleted file mode 100644 index 25f277e1..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png deleted file mode 100644 index edf5f726..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png deleted file mode 100644 index 92cae0b7..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png deleted file mode 100644 index 6a9510f4..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png and /dev/null differ diff --git a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png b/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png deleted file mode 100644 index 1818767c..00000000 Binary files a/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png and /dev/null differ diff --git a/net.mograsim.plugin.core/plugin.xml b/net.mograsim.plugin.core/plugin.xml deleted file mode 100644 index dccf76c8..00000000 --- a/net.mograsim.plugin.core/plugin.xml +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %colorDefinition.description - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java deleted file mode 100644 index 8ff21f49..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.mograsim.plugin; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; - -public class AsmOps -{ - public static Set ops = new HashSet<>(); - public static Set>> listeners = new HashSet<>(); - - static - { - ops.add("add"); - ops.add("mul"); - ops.add("mov"); - ops.add("inc"); - } - - public static void setWords(Collection s) - { - if (ops.size() == s.size() && ops.containsAll(s)) - return; - ops.clear(); - ops.addAll(s); - update(); - } - - public static void addListener(Consumer> con) - { - listeners.add(con); - con.accept(ops); - } - - public static void removeListener(Consumer> con) - { - listeners.remove(con); - } - - public static void update() - { - listeners.forEach(c -> c.accept(ops)); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java deleted file mode 100644 index cc96edbb..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.mograsim.plugin; - -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -import net.mograsim.logic.model.am2900.machine.Am2900Machine; -import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; -import net.mograsim.machine.Machine; -import net.mograsim.machine.MachineRegistry; - -public class MachineContext -{ - private Machine machine; - private Set observers; - private static MachineContext instance; - - private MachineContext() - { - observers = new HashSet<>(); - } - - public static MachineContext getInstance() - { - if (instance == null) - { - instance = new MachineContext(); - // TODO don't hardcode the Am2900 - instance.setMachine(new Am2900Machine((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"))); - } - return instance; - } - - public Machine getMachine() - { - return machine; - } - - public void setMachine(Machine machine) - { - this.machine = machine; - notifyObservers(machine); - } - - public void registerObserver(ContextObserver ob) - { - observers.add(ob); - ob.setMachine(Optional.ofNullable(machine)); - } - - public void deregisterObserver(ContextObserver ob) - { - observers.remove(ob); - } - - private void notifyObservers(Machine machine) - { - observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine))); - } - - @FunctionalInterface - public static interface ContextObserver - { - void setMachine(Optional machine); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java deleted file mode 100644 index c17f5304..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.mograsim.plugin; - -import org.eclipse.ui.plugin.AbstractUIPlugin; - -import net.mograsim.machine.MachineRegistry; - -public final class MograsimActivator extends AbstractUIPlugin -{ - - public MograsimActivator() - { - MachineRegistry.reload(); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java deleted file mode 100644 index 5fcc1688..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.mograsim.plugin; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.themes.ITheme; -import org.eclipse.ui.themes.IThemePreview; - -import net.haspamelodica.swt.helper.swtobjectwrappers.Point; -import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.model.LogicExecuter; -import net.mograsim.logic.model.LogicUICanvas; -import net.mograsim.logic.model.model.LogicModelModifiable; -import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; -import net.mograsim.logic.model.model.components.atomic.ModelNotGate; -import net.mograsim.logic.model.model.components.atomic.ModelOrGate; -import net.mograsim.logic.model.model.wires.ModelWire; -import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; -import net.mograsim.logic.model.modeladapter.CoreModelParameters; -import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; -import net.mograsim.preferences.Preferences; - -public class SimulationPreview implements IThemePreview -{ - private LogicUICanvas ui; - private LogicExecuter exec; - private Preferences oldPreferences; - private Preferences currentThemePreferences; - - @Override - @SuppressWarnings("unused") - public void createControl(Composite parent, ITheme currentTheme) - { - oldPreferences = Preferences.current(); - - currentThemePreferences = new ThemePreferences(currentTheme); - // TODO this will change the global preferences; so if another LogicUICanvas redraws, it will use the "new" colors too. - Preferences.setPreferences(currentThemePreferences); - - LogicModelModifiable model = new LogicModelModifiable(); - CoreModelParameters params = new CoreModelParameters(); - params.gateProcessTime = 50; - params.wireTravelTime = 10; - - ModelManualSwitch rIn = new ModelManualSwitch(model, 1); - rIn.moveTo(10, 10); - ModelManualSwitch sIn = new ModelManualSwitch(model, 1); - sIn.moveTo(10, 70); - - ModelOrGate or1 = new ModelOrGate(model, 1); - or1.moveTo(70, 12.5); - new ModelWire(model, rIn.getOutputPin(), or1.getPin("A")); - - ModelOrGate or2 = new ModelOrGate(model, 1); - or2.moveTo(70, 62.5); - new ModelWire(model, sIn.getOutputPin(), or2.getPin("B")); - - ModelNotGate not1 = new ModelNotGate(model, 1); - not1.moveTo(110, 17.5); - new ModelWire(model, or1.getPin("Y"), not1.getPin("A")); - - ModelNotGate not2 = new ModelNotGate(model, 1); - not2.moveTo(110, 67.5); - new ModelWire(model, or2.getPin("Y"), not2.getPin("A")); - - ModelWireCrossPoint p1 = new ModelWireCrossPoint(model, 1); - p1.moveCenterTo(140, 22.5); - new ModelWire(model, not1.getPin("Y"), p1); - new ModelWire(model, p1, or2.getPin("A"), new Point(140, 35), new Point(50, 60), new Point(50, 67.5)); - - ModelWireCrossPoint p2 = new ModelWireCrossPoint(model, 1); - p2.moveCenterTo(140, 72.5); - new ModelWire(model, not2.getPin("Y"), p2); - new ModelWire(model, p2, or1.getPin("B"), new Point(140, 60), new Point(50, 35), new Point(50, 27.5)); - - ModelWireCrossPoint o1 = new ModelWireCrossPoint(model, 1); - o1.moveCenterTo(150, 22.5); - new ModelWire(model, p1, o1); - - ModelWireCrossPoint o2 = new ModelWireCrossPoint(model, 1); - o2.moveCenterTo(150, 72.5); - new ModelWire(model, p2, o2); - - Timeline t = LogicCoreAdapter.convert(model, params); - exec = new LogicExecuter(t); - - rIn.clicked(0, 0); - - ui = new LogicUICanvas(parent, SWT.NONE, model); - - ui.zoom(3.5, 10, 10); - exec.startLiveExecution(); - - currentTheme.addPropertyChangeListener(e -> ui.redraw()); - } - - @Override - public void dispose() - { - exec.stopLiveExecution(); - if (Preferences.current() == currentThemePreferences) - Preferences.setPreferences(oldPreferences); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java deleted file mode 100644 index 42da25d1..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.mograsim.plugin; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.resource.ColorRegistry; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.ui.statushandlers.StatusManager; -import org.eclipse.ui.themes.ITheme; - -import net.mograsim.preferences.ColorDefinition; -import net.mograsim.preferences.DefaultPreferences; -import net.mograsim.preferences.Preferences; - -// TODO proper getInt/getDouble implementation, maybe via own preferences page? -public class ThemePreferences extends Preferences -{ - private final ITheme theme; - - public ThemePreferences(ITheme theme) - { - this.theme = theme; - } - - @Override - public boolean getBoolean(String name) - { - return new DefaultPreferences().getBoolean(name); - } - - @Override - public int getInt(String name) - { - return new DefaultPreferences().getInt(name); - } - - @Override - public double getDouble(String name) - { - return new DefaultPreferences().getDouble(name); - } - - @Override - public ColorDefinition getColorDefinition(String name) - { - RGB rgb = getColorRegistry().getRGB(name); - if (rgb == null) - { - StatusManager.getManager().handle(new Status(IStatus.ERROR, "net.mograsim.plugin.core", "No color for name " + name)); - return null; - } - return new ColorDefinition(rgb.red, rgb.green, rgb.blue); - } - - @Override - public Color getColor(String name) - { - return getColorRegistry().get(name); - } - - private ColorRegistry getColorRegistry() - { - return theme.getColorRegistry(); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java deleted file mode 100644 index 580c3249..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.mograsim.plugin.asm; - -import static java.lang.String.format; - -import java.math.BigInteger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public final class AsmNumberUtil -{ - - private AsmNumberUtil() - { - - } - - private static final String sgnPat = "([-+]?)"; - private static final String binPat = "((?:[01]+_)*[01]+)"; - private static final String octPat = "((?:[0-7]+_)*[0-7]+)"; - private static final String decPat = "((?:[0-9]+_)*[0-9]+)"; - private static final String hexPat = "((?:[0-9a-f]+_)*[0-9a-f]+)"; - - private static final String preferredBinPat = "%1$s0b%2$s"; - private static final String preferredOctPat = "%s%sq"; - private static final String preferredDecPat = "%s%s"; - private static final String preferredHexPat = "%1$s0x%2$s"; - - static final Pattern numberBin = Pattern.compile(format(preferredBinPat + "|%1$s%2$sb", sgnPat, binPat), Pattern.CASE_INSENSITIVE); - static final Pattern numberOct = Pattern.compile(format(preferredOctPat, sgnPat, octPat), Pattern.CASE_INSENSITIVE); - static final Pattern numberDec = Pattern.compile(format(preferredDecPat, sgnPat, decPat)); - static final Pattern numberHex = Pattern.compile(format(preferredHexPat + "|%1$s%2$sh", sgnPat, hexPat), Pattern.CASE_INSENSITIVE); - static final Pattern numberFloat = Pattern.compile(format("%1$s%2$s(?:\\.%2$s)?(?:e%1$s%2$s)?", sgnPat, decPat), - Pattern.CASE_INSENSITIVE); - - public static boolean isPrefix(CharSequence cs, Pattern p) - { - Matcher m = p.matcher(cs); - return m.matches() || m.hitEnd(); - } - - public static boolean isBinary(CharSequence cs) - { - return numberBin.matcher(cs).matches(); - } - - public static boolean isOctal(CharSequence cs) - { - return numberOct.matcher(cs).matches(); - } - - public static boolean isDecimal(CharSequence cs) - { - return numberDec.matcher(cs).matches(); - } - - public static boolean isHexadecimal(CharSequence cs) - { - return numberHex.matcher(cs).matches(); - } - - public static boolean isFloatingPoint(CharSequence cs) - { - return numberFloat.matcher(cs).matches(); - } - - public static boolean isNumber(CharSequence cs) - { - return getType(cs) != NumberType.NONE; - } - - public static boolean quickCheckForNumber(CharSequence cs) - { - if (cs.length() == 0 || !isStart(cs.charAt(0))) - return false; - return cs.length() == 1 || isPart(cs.charAt(1)); - } - - public static boolean isStart(int c) - { - return isDigit(c) || c == '+' || c == '-'; - } - - public static boolean isDigit(int c) - { - return ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'); - } - - public static boolean isPart(int c) - { - return isDigit(c) || isMarker(Character.toLowerCase(c)); - } - - public static boolean isMarker(int lowerCase) - { - switch (lowerCase) - { - case '.': - case '_': - case '+': - case '-': - case 'e': - case 'x': - case 'b': - case 'q': - case 'h': - return true; - default: - return false; - } - } - - public static NumberType getType(CharSequence cs) - { - if (!quickCheckForNumber(cs)) - return NumberType.NONE; - if (isDecimal(cs)) - return NumberType.DECIMAL; - if (isHexadecimal(cs)) - return NumberType.HEXADECIMAL; - if (isBinary(cs)) - return NumberType.BINARY; - if (isOctal(cs)) - return NumberType.OCTAL; - if (isFloatingPoint(cs)) - return NumberType.FLOATINGPOINT; - return NumberType.NONE; - } - - /** - * Checks if the {@link CharSequence} is a prefix of a valid number, and returns the NumberType it is a prefix of. If a String is a - * prefix of multiple different {@link NumberType}s, the one with the smallest radix is returned. If no valid {@link NumberType} is - * found, {@link NumberType#NONE} is returned. - * - * @param cs The potential prefix - * @return The type the {@link CharSequence} is a prefix of - */ - public static NumberType prefixOfType(CharSequence cs) - { - if (isPrefix(cs, numberBin)) - return NumberType.BINARY; - if (isPrefix(cs, numberOct)) - return NumberType.OCTAL; - if (isPrefix(cs, numberDec)) - return NumberType.DECIMAL; - if (isPrefix(cs, numberHex)) - return NumberType.HEXADECIMAL; - if (isPrefix(cs, numberFloat)) - return NumberType.FLOATINGPOINT; - return NumberType.NONE; - } - - private static CharSequence extractSignAndDigits(NumberType type, CharSequence cs) - { - return type.numberPattern.matcher(cs).replaceAll("$1$2").replaceAll("_", ""); - } - - /** - * Computes the {@link BigInteger} value of a {@link CharSequence}, by determining the {@link NumberType} and parsing the number with - * the determined radix. - * - * @throws NumberFormatException if the {@link CharSequence} does not match any of the expected number patterns - */ - public static BigInteger valueOf(CharSequence cs) - { - NumberType type = getType(cs); - if (NumberType.NONE.equals(type)) - throw new NumberFormatException(); - return new BigInteger(extractSignAndDigits(type, cs).toString(), type.radix); - } - - /** - * Formats a {@link BigInteger} in accordance with the pattern associated with the supplied {@link NumberType} - */ - public static String toString(BigInteger number, NumberType type) - { - String pattern; - switch (type) - { - case BINARY: - pattern = preferredBinPat; - break; - case OCTAL: - pattern = preferredOctPat; - break; - default: - case DECIMAL: - pattern = preferredDecPat; - break; - case HEXADECIMAL: - pattern = preferredHexPat; - } - if (number.signum() < 0) - return String.format(pattern, "-", number.abs().toString(type.radix)); - return String.format(pattern, "", number.toString(type.radix)); - } - - public enum NumberType - { - NONE(-1, null), BINARY(2, AsmNumberUtil.numberBin), OCTAL(8, AsmNumberUtil.numberOct), DECIMAL(10, AsmNumberUtil.numberDec), - HEXADECIMAL(16, AsmNumberUtil.numberHex), FLOATINGPOINT(10, AsmNumberUtil.numberFloat); - - public final int radix; - final Pattern numberPattern; - - NumberType(int radix, Pattern numberPattern) - { - this.radix = radix; - this.numberPattern = numberPattern; - } - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java deleted file mode 100644 index cc0d0ffa..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java +++ /dev/null @@ -1,212 +0,0 @@ -package net.mograsim.plugin.asm; - -import java.util.Arrays; -import java.util.stream.Collectors; - -import javax.inject.Inject; - -import org.eclipse.e4.ui.di.Persist; -import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IAction; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.IToolBarManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.KeyListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.IActionBars; -import org.eclipse.ui.ISharedImages; -import org.eclipse.ui.IWorkbench; -import org.eclipse.ui.IWorkbenchActionConstants; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.part.ViewPart; - -import net.mograsim.plugin.AsmOps; - -/** - * This sample class demonstrates how to plug-in a new workbench view. The view shows data obtained from the model. The sample creates a - * dummy model on the fly, but a real implementation would connect to the model available either in this or another plug-in (e.g. the - * workspace). The view is connected to the model using a content provider. - *

- * The view uses a label provider to define how model objects should be presented in the view. Each view can present the same model objects - * using different labels and icons, if needed. Alternatively, a single label provider can be shared between views in order to ensure that - * objects of the same type are presented in the same way everywhere. - *

- */ - -public class AsmOpsEdit extends ViewPart -{ - - @Inject - private MPart part; - - /** - * The ID of the view as specified by the extension. - */ - public static final String ID = "plugintest.views.AsmOpsEdit"; - - @Inject - IWorkbench workbench; - - private Text txtInput; - private TableViewer viewer; - - private IAction saveAction; - - class ViewLabelProvider extends LabelProvider implements ITableLabelProvider - { - @Override - public String getColumnText(Object obj, int index) - { - return getText(obj); - } - - @Override - public Image getColumnImage(Object obj, int index) - { - return getImage(obj); - } - - @Override - public Image getImage(Object obj) - { - return workbench.getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT); - } - } - - @Override - public void createPartControl(Composite parent) - { - parent.setLayout(new GridLayout(1, false)); - - txtInput = new Text(parent, SWT.BORDER); - txtInput.setMessage("Enter new Asm OP"); - txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - txtInput.addKeyListener(new KeyListener() - { - - @Override - public void keyReleased(KeyEvent e) - { - // TODO Auto-generated method stub - - } - - @Override - public void keyPressed(KeyEvent e) - { - if (e.keyCode == SWT.CR || e.keyCode == SWT.LF) - { - String in = txtInput.getText().toLowerCase(); - if (in.startsWith("-")) - viewer.remove(in.substring(1).trim()); - else - viewer.add(in.trim()); - txtInput.setText(""); - part.setDirty(true); - save(); - } - } - }); - - viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); - - viewer.setContentProvider(ArrayContentProvider.getInstance()); - viewer.setInput(createInitialDataModel()); - viewer.setLabelProvider(new ViewLabelProvider()); - viewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); - - // Create the help context id for the viewer's control - workbench.getHelpSystem().setHelp(viewer.getControl(), "PluginTest.viewer"); - getSite().setSelectionProvider(viewer); - makeActions(); - contributeToActionBars(); - hookContextMenu(); - } - - private Object createInitialDataModel() - { - return AsmOps.ops; - } - - @Override - public void setFocus() - { - txtInput.setFocus(); - } - - @Persist - public void save() - { - AsmOps.setWords(Arrays.stream(viewer.getTable().getItems()).map(i -> (String) i.getData()).collect(Collectors.toList())); - viewer.refresh(); - } - - private void makeActions() - { - saveAction = new Action() - { - public void run() - { - save(); - part.setDirty(false); - } - }; - saveAction.setText("Save"); - saveAction.setToolTipText("Save Changes To ISA"); - saveAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); - } - - private void contributeToActionBars() - { - IActionBars bars = getViewSite().getActionBars(); - fillLocalPullDown(bars.getMenuManager()); - fillLocalToolBar(bars.getToolBarManager()); - } - - private void fillLocalPullDown(IMenuManager manager) - { - manager.add(saveAction); - } - - private void fillContextMenu(IMenuManager manager) - { - manager.add(saveAction); - // Other plug-ins can contribute there actions here - manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - } - - private void fillLocalToolBar(IToolBarManager manager) - { - manager.add(saveAction); - } - - private void hookContextMenu() - { - MenuManager menuMgr = new MenuManager("#PopupMenu"); - menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(new IMenuListener() - { - public void menuAboutToShow(IMenuManager manager) - { - AsmOpsEdit.this.fillContextMenu(manager); - } - }); - Menu menu = menuMgr.createContextMenu(viewer.getControl()); - viewer.getControl().setMenu(menu); - getSite().registerContextMenu(menuMgr, viewer); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java deleted file mode 100644 index 7198a27a..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.DocumentCommand; -import org.eclipse.jface.text.IAutoEditStrategy; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; - -public class AsmAutoEditStrategy implements IAutoEditStrategy -{ - - @Override - public void customizeDocumentCommand(IDocument document, DocumentCommand command) - { - if (!">".equals(command.text)) - { // NON-NLS-1 - return; - } - try - { - IRegion region = document.getLineInformationOfOffset(command.offset); - String line = document.get(region.getOffset(), command.offset - region.getOffset()); - int index = line.lastIndexOf('<'); - if (index != -1 && (index != line.length() - 1) && line.charAt(index + 1) != '/') - { - String tag = line.substring(index + 1); - command.caretOffset = command.offset + 1; - command.text += "= natureTag.length() -// && text.substring(offset - natureTag.length(), offset).equals(natureTag)) { -// IProjectNatureDescriptor[] natureDescriptors = workspace.getNatureDescriptors(); -// ICompletionProposal[] proposals = new ICompletionProposal[natureDescriptors.length]; -// for (int i = 0; i < natureDescriptors.length; i++) { -// IProjectNatureDescriptor descriptor = natureDescriptors[i]; -// proposals[i] = new CompletionProposal(descriptor.getNatureId(), offset, 0, -// descriptor.getNatureId().length()); -// } -// return proposals; -// } -// if (text.length() >= projectReferenceTag.length() -// && text.substring(offset - projectReferenceTag.length(), offset).equals(projectReferenceTag)) { -// IProject[] projects = workspace.getRoot().getProjects(); -// ICompletionProposal[] proposals = new ICompletionProposal[projects.length]; -// for (int i = 0; i < projects.length; i++) { -// proposals[i] = new CompletionProposal(projects[i].getName(), offset, 0, projects[i].getName().length()); -// } -// return proposals; -// } -// return new ICompletionProposal[0]; -// text. - return AsmOps.ops.stream().map(o -> new AsmOperationProposal(o, "", offset)).toArray(ICompletionProposal[]::new); - } - - @Override - public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) - { - return null; - } - - @Override - public char[] getCompletionProposalAutoActivationCharacters() - { - return new char[] { '\n', '\r' }; // NON-NLS-1 - } - - @Override - public char[] getContextInformationAutoActivationCharacters() - { - return null; - } - - @Override - public String getErrorMessage() - { - return null; - } - - @Override - public IContextInformationValidator getContextInformationValidator() - { - return null; - } - - private class AsmOperationProposal implements ICompletionProposal, ICompletionProposalExtension4 - { - - private String asmOp; - private String desc; - private int offset; - - public AsmOperationProposal(String asmOp, String desc, int offset) - { - this.asmOp = asmOp; - this.desc = desc; - this.offset = offset; - } - - @Override - public boolean isAutoInsertable() - { - return true; - } - - @Override - public void apply(IDocument document) - { - try - { - document.replace(offset, 0, asmOp); - } - catch (BadLocationException e) - { - // ignore - } - } - - @Override - public Point getSelection(IDocument document) - { - return new Point(offset + asmOp.length(), 0); - } - - @Override - public String getAdditionalProposalInfo() - { - return desc; - } - - @Override - public String getDisplayString() - { - return asmOp; - } - - @Override - public Image getImage() - { - return null; // TODO image? - } - - @Override - public IContextInformation getContextInformation() - { - return new IContextInformation() - { - - @Override - public String getInformationDisplayString() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public Image getImage() - { - // TODO Auto-generated method stub - return null; - } - - @Override - public String getContextDisplayString() - { - // TODO Auto-generated method stub - return null; - } - }; - } - - } - -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java deleted file mode 100644 index 91946bc7..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java +++ /dev/null @@ -1,77 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import java.io.StringReader; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.jface.text.DocumentEvent; -import org.eclipse.jface.text.IDocumentListener; -import org.xml.sax.InputSource; -import org.xml.sax.SAXParseException; - -public class AsmDocumentValidator implements IDocumentListener -{ - - private final IFile file; - private IMarker marker; - - AsmDocumentValidator(IFile file) - { - this.file = file; - } - - @Override - public void documentChanged(DocumentEvent event) - { - if (this.marker != null) - { - try - { - this.marker.delete(); - } - catch (CoreException e) - { - e.printStackTrace(); - } - this.marker = null; - } - try (StringReader reader = new StringReader(event.getDocument().get());) - { - DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - documentBuilder.parse(new InputSource(reader)); - } - catch (Exception ex) - { - try - { - this.marker = file.createMarker(IMarker.PROBLEM); - this.marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); - this.marker.setAttribute(IMarker.MESSAGE, ex.getMessage()); - if (ex instanceof SAXParseException) - { - SAXParseException saxParseException = (SAXParseException) ex; - int lineNumber = saxParseException.getLineNumber(); - int offset = event.getDocument().getLineInformation(lineNumber - 1).getOffset() + saxParseException.getColumnNumber() - - 1; - this.marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); - this.marker.setAttribute(IMarker.CHAR_START, offset); - this.marker.setAttribute(IMarker.CHAR_END, offset + 1); - } - } - catch (Exception e) - { - e.printStackTrace(); - } - } - } - - @Override - public void documentAboutToBeChanged(DocumentEvent event) - { - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java deleted file mode 100644 index 50ab95cd..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import org.eclipse.core.resources.IProjectNatureDescriptor; -import org.eclipse.core.resources.IWorkspace; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.ITextHover; -import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.Region; - -public class AsmHoverProvider implements ITextHover -{ - - @Override - public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) - { - // TODO this is logic for .project file to show nature description on hover. - // Replace with your language logic! - String contents = textViewer.getDocument().get(); - int offset = hoverRegion.getOffset(); - int endIndex = contents.indexOf("", offset); - if (endIndex == -1) - return ""; - int startIndex = contents.substring(0, offset).lastIndexOf(""); - if (startIndex == -1) - return ""; - String selection = contents.substring(startIndex + "".length(), endIndex); - - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - IProjectNatureDescriptor[] natureDescriptors = workspace.getNatureDescriptors(); - for (int i = 0; i < natureDescriptors.length; i++) - { - if (natureDescriptors[i].getNatureId().equals(selection)) - return natureDescriptors[i].getLabel(); - } - return ""; - } - - @Override - public IRegion getHoverRegion(ITextViewer textViewer, int offset) - { - return new Region(offset, 0); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java deleted file mode 100644 index 655160e0..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import org.eclipse.jface.resource.ColorRegistry; -import org.eclipse.jface.resource.FontRegistry; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.TextAttribute; -import org.eclipse.jface.text.presentation.PresentationReconciler; -import org.eclipse.jface.text.rules.DefaultDamagerRepairer; -import org.eclipse.jface.text.rules.EndOfLineRule; -import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.RuleBasedScanner; -import org.eclipse.jface.text.rules.Token; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.themes.ITheme; - -import net.mograsim.plugin.asm.editor.rules.AsmLabelRule; -import net.mograsim.plugin.asm.editor.rules.AsmNumberRule; -import net.mograsim.plugin.asm.editor.rules.InstructionRule; - -public class AsmPresentationReconciler extends PresentationReconciler -{ - - private final Token comment = new Token(null); -// private final Token std = new Token(null); - private final Token op = new Token(null); - private final Token label = new Token(null); - private final Token number = new Token(null); - - private IRule[] rules; - - public AsmPresentationReconciler() - { - RuleBasedScanner scanner = new RuleBasedScanner(); - rules = new IRule[4]; - rules[0] = new EndOfLineRule(";", comment); - rules[1] = new AsmLabelRule(label); - rules[2] = new InstructionRule(Token.UNDEFINED, op, true); - rules[3] = new AsmNumberRule(number); - - scanner.setRules(rules); - DefaultDamagerRepairer dr = new DefaultDamagerRepairer(scanner); - this.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); - this.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); - - ITheme current = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(); - updateStyle(current); - current.getColorRegistry().addListener(e -> updateStyle(current)); - current.getFontRegistry().addListener(e -> updateStyle(current)); - } - - void updateStyle(ITheme current) - { - ColorRegistry cr = current.getColorRegistry(); - FontRegistry fr = current.getFontRegistry(); - comment.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_comment_color"))); - op.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_operation_color"), null, 0, - fr.get("net.mograsim.plugin.asm_operation_font"))); - label.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_label_color"))); - number.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_number_color"))); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java deleted file mode 100644 index efee8a31..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import java.lang.ref.WeakReference; - -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.ITextViewer; -import org.eclipse.jface.text.reconciler.Reconciler; -import org.eclipse.jface.text.source.projection.ProjectionViewer; - -import net.mograsim.plugin.AsmOps; - -public class AsmReconciler extends Reconciler -{ - - private AsmReconcilerStrategy fStrategy; - - public AsmReconciler() - { - fStrategy = new AsmReconcilerStrategy(); - this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE); - } - - @Override - public void install(ITextViewer textViewer) - { - super.install(textViewer); - ProjectionViewer pViewer = (ProjectionViewer) textViewer; - fStrategy.setProjectionViewer(pViewer); - WeakReference tv = new WeakReference<>(textViewer); - AsmOps.addListener(ops -> - { - System.out.println("refresh"); - if (tv.get() != null) - tv.get().invalidateTextPresentation(); - }); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java deleted file mode 100644 index a3253a43..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java +++ /dev/null @@ -1,173 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.text.BadLocationException; -import org.eclipse.jface.text.IDocument; -import org.eclipse.jface.text.IRegion; -import org.eclipse.jface.text.Position; -import org.eclipse.jface.text.reconciler.DirtyRegion; -import org.eclipse.jface.text.reconciler.IReconcilingStrategy; -import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension; -import org.eclipse.jface.text.source.Annotation; -import org.eclipse.jface.text.source.projection.ProjectionAnnotation; -import org.eclipse.jface.text.source.projection.ProjectionViewer; - -public class AsmReconcilerStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension -{ - private IDocument document; - private String oldDocument; - private ProjectionViewer projectionViewer; - private List oldAnnotations = new ArrayList<>(); - private List oldPositions = new ArrayList<>(); - - @Override - public void setDocument(IDocument document) - { - this.document = document; - } - - public void setProjectionViewer(ProjectionViewer projectionViewer) - { - this.projectionViewer = projectionViewer; - } - - @Override - public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) - { - initialReconcile(); - } - - @Override - public void reconcile(IRegion partition) - { - initialReconcile(); - } - - @Override - public void initialReconcile() - { - if (document.get().equals(oldDocument)) - return; - oldDocument = document.get(); - - List positions = getNewPositionsOfAnnotations(); - - List positionsToRemove = new ArrayList<>(); - List annotationToRemove = new ArrayList<>(); - - for (Position position : oldPositions) - { - if (!positions.contains(position)) - { - projectionViewer.getProjectionAnnotationModel().removeAnnotation(oldAnnotations.get(oldPositions.indexOf(position))); - positionsToRemove.add(position); - annotationToRemove.add(oldAnnotations.get(oldPositions.indexOf(position))); - } else - { - positions.remove(position); - } - } - oldPositions.removeAll(positionsToRemove); - oldAnnotations.removeAll(annotationToRemove); - - for (Position position : positions) - { - Annotation annotation = new ProjectionAnnotation(); - projectionViewer.getProjectionAnnotationModel().addAnnotation(annotation, position); - oldPositions.add(position); - oldAnnotations.add(annotation); - } - } - - private static enum SearchingFor - { - START_OF_TAG, START_OF_WORD, END_OF_WORD, END_OF_LINE - } - - private List getNewPositionsOfAnnotations() - { - List positions = new ArrayList<>(); - Map startOfAnnotation = new HashMap<>(); - SearchingFor searchingFor = SearchingFor.START_OF_TAG; - - int characters = document.getLength(); - int currentCharIndex = 0; - - int wordStartIndex = 0; - int sectionStartIndex = 0; - String word = ""; - - try - { - while (currentCharIndex < characters) - { - char currentChar = document.getChar(currentCharIndex); - switch (searchingFor) - { - case START_OF_TAG: - if (currentChar == '<') - { - char nextChar = document.getChar(currentCharIndex + 1); - if (nextChar != '?') - { - sectionStartIndex = currentCharIndex; - searchingFor = SearchingFor.START_OF_WORD; - } - } - break; - case START_OF_WORD: - if (Character.isLetter(currentChar)) - { - wordStartIndex = currentCharIndex; - searchingFor = SearchingFor.END_OF_WORD; - } - break; - case END_OF_WORD: - if (!Character.isLetter(currentChar)) - { - word = document.get(wordStartIndex, currentCharIndex - wordStartIndex); - if (startOfAnnotation.containsKey(word)) - { - searchingFor = SearchingFor.END_OF_LINE; - } else - { - startOfAnnotation.put(word, sectionStartIndex); - searchingFor = SearchingFor.START_OF_TAG; - } - } - break; - case END_OF_LINE: - if (currentChar == '\n') - { - int start = startOfAnnotation.get(word); - if (document.getLineOfOffset(start) != document.getLineOfOffset(currentCharIndex)) - { - positions.add(new Position(start, currentCharIndex + 1 - start)); - } - startOfAnnotation.remove(word); - searchingFor = SearchingFor.START_OF_TAG; - } - break; - } - currentCharIndex++; - } - } - catch (BadLocationException e) - { - // skip the remainder of file due to error - } - return positions; - } - - @Override - public void setProgressMonitor(IProgressMonitor monitor) - { - // no progress monitor used - } - -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java deleted file mode 100644 index 8b0b5736..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.plugin.asm.editor; - -import org.eclipse.core.filebuffers.IDocumentSetupParticipant; -import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; -import org.eclipse.core.filebuffers.LocationKind; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IPath; -import org.eclipse.jface.text.IDocument; - -public class ValidatorDocumentSetupParticipant implements IDocumentSetupParticipant, IDocumentSetupParticipantExtension -{ - - @Override - public void setup(IDocument document) - { - } - - @Override - public void setup(IDocument document, IPath location, LocationKind locationKind) - { - if (locationKind == LocationKind.IFILE) - { - IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(location); - document.addDocumentListener(new AsmDocumentValidator(file)); - } - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java deleted file mode 100644 index b55e0b3c..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.mograsim.plugin.asm.editor.rules; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.text.rules.ICharacterScanner; -import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.Token; - -public class AsmLabelRule implements IRule -{ - - /** The token to be returned when this rule is successful */ - protected IToken fToken; - - /** - * Creates a rule which will return the specified token when a numerical sequence is detected. - * - * @param token the token to be returned - */ - public AsmLabelRule(IToken token) - { - Assert.isNotNull(token); - fToken = token; - } - - @Override - public IToken evaluate(ICharacterScanner scanner) - { - int c = scanner.read(); - int i = 1; - if (Character.isJavaIdentifierStart(c)) - { - do - { - c = scanner.read(); - i++; - } while (Character.isJavaIdentifierPart(c)); - if (c == ':') - return fToken; - return abort(scanner, i); - } - scanner.unread(); - return Token.UNDEFINED; - } - - private static IToken abort(ICharacterScanner scanner, int i) - { - for (int j = 0; j < i; j++) - scanner.unread(); - return Token.UNDEFINED; - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java deleted file mode 100644 index 728030dc..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.mograsim.plugin.asm.editor.rules; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.text.rules.ICharacterScanner; -import org.eclipse.jface.text.rules.IRule; -import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.Token; - -import net.mograsim.plugin.asm.AsmNumberUtil; - -public class AsmNumberRule implements IRule -{ - - /** The token to be returned when this rule is successful */ - protected IToken fToken; - - /** - * Creates a rule which will return the specified token when a numerical sequence is detected. - * - * @param token the token to be returned - */ - public AsmNumberRule(IToken token) - { - Assert.isNotNull(token); - fToken = token; - } - - @Override - public IToken evaluate(ICharacterScanner scanner) - { - int i = 1; - int c = scanner.read(); - if (!AsmNumberUtil.isStart(c)) - return abort(scanner, i); - StringBuilder sb = new StringBuilder(); - sb.appendCodePoint(c); - while (true) - { - c = scanner.read(); - i++; - if (AsmNumberUtil.isPart(c)) - sb.appendCodePoint(c); - else - break; - } - if (!AsmNumberUtil.isNumber(sb)) - return abort(scanner, i); - scanner.unread(); - return fToken; - } - - private static IToken abort(ICharacterScanner scanner, int i) - { - for (int j = 0; j < i; j++) - scanner.unread(); - return Token.UNDEFINED; - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java deleted file mode 100644 index df0f80b4..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.mograsim.plugin.asm.editor.rules; - -import java.util.Objects; -import java.util.Set; - -import org.eclipse.jface.text.rules.IToken; -import org.eclipse.jface.text.rules.IWordDetector; -import org.eclipse.jface.text.rules.WordRule; - -import net.mograsim.plugin.AsmOps; - -public class InstructionRule extends WordRule -{ - private final IToken instToken; - - public InstructionRule(IToken defaultToken, IToken instToken) - { - this(defaultToken, instToken, false); - } - - public InstructionRule(IToken defaultToken, IToken instToken, boolean ignoreCase) - { - super(new InstructionDetector(), Objects.requireNonNull(defaultToken), ignoreCase); - this.instToken = Objects.requireNonNull(instToken); - AsmOps.addListener(this::update); - } - - void update(Set words) - { - fWords.clear(); - words.forEach(s -> fWords.put(s, instToken)); - } - - static class InstructionDetector implements IWordDetector - { - @Override - public boolean isWordStart(char c) - { - return Character.isJavaIdentifierStart(c); - } - - @Override - public boolean isWordPart(char c) - { - return Character.isJavaIdentifierPart(c); - } - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java deleted file mode 100644 index 581b4a6f..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java +++ /dev/null @@ -1,82 +0,0 @@ -package net.mograsim.plugin.nature; - -import java.util.Iterator; -import org.eclipse.core.commands.*; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.ui.handlers.HandlerUtil; - -public class AddRemoveMograsimNatureHandler extends AbstractHandler -{ - - public Object execute(ExecutionEvent event) throws ExecutionException - { - ISelection selection = HandlerUtil.getCurrentSelection(event); - // - if (selection instanceof IStructuredSelection) - { - for (Iterator it = ((IStructuredSelection) selection).iterator(); it.hasNext();) - { - Object element = it.next(); - IProject project = null; - if (element instanceof IProject) - { - project = (IProject) element; - } else if (element instanceof IAdaptable) - { - project = ((IAdaptable) element).getAdapter(IProject.class); - } - if (project != null) - { - try - { - toggleNature(project); - } - catch (CoreException e) - { - // TODO log something - throw new ExecutionException("Failed to toggle nature", e); - } - } - } - } - - return null; - } - - /** - * Toggles sample nature on a project - * - * @param project to have sample nature added or removed - */ - private void toggleNature(IProject project) throws CoreException - { - IProjectDescription description = project.getDescription(); - String[] natures = description.getNatureIds(); - - for (int i = 0; i < natures.length; ++i) - { - if (MograsimNature.NATURE_ID.equals(natures[i])) - { - // Remove the nature - String[] newNatures = new String[natures.length - 1]; - System.arraycopy(natures, 0, newNatures, 0, i); - System.arraycopy(natures, i + 1, newNatures, i, natures.length - i - 1); - description.setNatureIds(newNatures); - project.setDescription(description, null); - return; - } - } - - // Add the nature - String[] newNatures = new String[natures.length + 1]; - System.arraycopy(natures, 0, newNatures, 0, natures.length); - newNatures[natures.length] = MograsimNature.NATURE_ID; - description.setNatureIds(newNatures); - project.setDescription(description, null); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java deleted file mode 100644 index 9fc0ea41..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java +++ /dev/null @@ -1,195 +0,0 @@ -package net.mograsim.plugin.nature; - -import java.util.Map; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IMarker; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.IResourceDelta; -import org.eclipse.core.resources.IResourceDeltaVisitor; -import org.eclipse.core.resources.IResourceVisitor; -import org.eclipse.core.resources.IncrementalProjectBuilder; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; -import org.xml.sax.helpers.DefaultHandler; - -public class MograsimBuilder extends IncrementalProjectBuilder -{ - - class SampleDeltaVisitor implements IResourceDeltaVisitor - { - @Override - public boolean visit(IResourceDelta delta) throws CoreException - { - IResource resource = delta.getResource(); - switch (delta.getKind()) - { - case IResourceDelta.ADDED: - // handle added resource - checkXML(resource); - break; - case IResourceDelta.REMOVED: - // handle removed resource - break; - case IResourceDelta.CHANGED: - // handle changed resource - checkXML(resource); - break; - } - // return true to continue visiting children. - return true; - } - } - - class SampleResourceVisitor implements IResourceVisitor - { - public boolean visit(IResource resource) - { - checkXML(resource); - // return true to continue visiting children. - return true; - } - } - - class XMLErrorHandler extends DefaultHandler - { - - private IFile file; - - public XMLErrorHandler(IFile file) - { - this.file = file; - } - - private void addMarker(SAXParseException e, int severity) - { - MograsimBuilder.this.addMarker(file, e.getMessage(), e.getLineNumber(), severity); - } - - public void error(SAXParseException exception) throws SAXException - { - addMarker(exception, IMarker.SEVERITY_ERROR); - } - - public void fatalError(SAXParseException exception) throws SAXException - { - addMarker(exception, IMarker.SEVERITY_ERROR); - } - - public void warning(SAXParseException exception) throws SAXException - { - addMarker(exception, IMarker.SEVERITY_WARNING); - } - } - - public static final String BUILDER_ID = "PluginTest.mograsimBuilder"; - - private static final String MARKER_TYPE = "PluginTest.xmlProblem"; - - private SAXParserFactory parserFactory; - - private void addMarker(IFile file, String message, int lineNumber, int severity) - { - try - { - IMarker marker = file.createMarker(MARKER_TYPE); - marker.setAttribute(IMarker.MESSAGE, message); - marker.setAttribute(IMarker.SEVERITY, severity); - if (lineNumber == -1) - { - lineNumber = 1; - } - marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); - } - catch (CoreException e) - { - } - } - - @Override - protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException - { - if (kind == FULL_BUILD) - { - fullBuild(monitor); - } else - { - IResourceDelta delta = getDelta(getProject()); - if (delta == null) - { - fullBuild(monitor); - } else - { - incrementalBuild(delta, monitor); - } - } - return null; - } - - protected void clean(IProgressMonitor monitor) throws CoreException - { - // delete markers set and files created - getProject().deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE); - } - - void checkXML(IResource resource) - { - if (resource instanceof IFile && resource.getName().endsWith(".xml")) - { - IFile file = (IFile) resource; - deleteMarkers(file); - XMLErrorHandler reporter = new XMLErrorHandler(file); - try - { - getParser().parse(file.getContents(), reporter); - } - catch (Exception e1) - { - } - } - } - - private void deleteMarkers(IFile file) - { - try - { - file.deleteMarkers(MARKER_TYPE, false, IResource.DEPTH_ZERO); - } - catch (CoreException ce) - { - } - } - - protected void fullBuild(final IProgressMonitor monitor) throws CoreException - { - try - { - getProject().accept(new SampleResourceVisitor()); - } - catch (CoreException e) - { - } - } - - private SAXParser getParser() throws ParserConfigurationException, SAXException - { - if (parserFactory == null) - { - parserFactory = SAXParserFactory.newInstance(); - } - return parserFactory.newSAXParser(); - } - - protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException - { - // the visitor does the work. - delta.accept(new SampleDeltaVisitor()); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java deleted file mode 100644 index 5422731e..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.mograsim.plugin.nature; - -import org.eclipse.core.resources.ICommand; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.resources.IProjectNature; -import org.eclipse.core.runtime.CoreException; - -public class MograsimNature implements IProjectNature -{ - - /** - * ID of this project nature - */ - public static final String NATURE_ID = "net.mograsim"; - - private IProject project; - - @Override - public void configure() throws CoreException - { - IProjectDescription desc = project.getDescription(); - ICommand[] commands = desc.getBuildSpec(); - - for (int i = 0; i < commands.length; ++i) - { - if (commands[i].getBuilderName().equals(MograsimBuilder.BUILDER_ID)) - { - return; - } - } - - ICommand[] newCommands = new ICommand[commands.length + 1]; - System.arraycopy(commands, 0, newCommands, 0, commands.length); - ICommand command = desc.newCommand(); - command.setBuilderName(MograsimBuilder.BUILDER_ID); - newCommands[newCommands.length - 1] = command; - desc.setBuildSpec(newCommands); - project.setDescription(desc, null); - } - - @Override - public void deconfigure() throws CoreException - { - IProjectDescription description = getProject().getDescription(); - ICommand[] commands = description.getBuildSpec(); - for (int i = 0; i < commands.length; ++i) - { - if (commands[i].getBuilderName().equals(MograsimBuilder.BUILDER_ID)) - { - ICommand[] newCommands = new ICommand[commands.length - 1]; - System.arraycopy(commands, 0, newCommands, 0, i); - System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1); - description.setBuildSpec(newCommands); - project.setDescription(description, null); - return; - } - } - } - - @Override - public IProject getProject() - { - return project; - } - - @Override - public void setProject(IProject project) - { - this.project = project; - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java deleted file mode 100644 index c94e440a..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.mograsim.plugin.tables; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.ColumnLabelProvider; - -import net.mograsim.plugin.asm.AsmNumberUtil; -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; - -public class AddressLabelProvider extends ColumnLabelProvider -{ - @Override - public String getText(Object element) - { - @SuppressWarnings("rawtypes") - TableRow row = (TableRow) element; - return AsmNumberUtil.toString(BigInteger.valueOf(row.address), NumberType.HEXADECIMAL); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java deleted file mode 100644 index dde6b015..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.mograsim.plugin.tables; - -import java.util.HashSet; -import java.util.Set; - -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; - -public class DisplaySettings -{ - private NumberType dataNumberType; - private final Set observers; - - public DisplaySettings() - { - this(NumberType.HEXADECIMAL); - } - - public DisplaySettings(NumberType dataNumberType) - { - this.dataNumberType = dataNumberType; - observers = new HashSet<>(); - } - - public NumberType getDataNumberType() - { - return dataNumberType; - } - - public void setDataNumberType(NumberType dataNumberType) - { - this.dataNumberType = dataNumberType; - notifyObservers(); - } - - void notifyObservers() - { - observers.forEach(r -> r.run()); - } - - public void addObserver(Runnable ob) - { - observers.add(ob); - } - - public void removeObserver(Runnable ob) - { - observers.remove(ob); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java deleted file mode 100644 index 1b371e28..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.mograsim.plugin.tables; - -import org.eclipse.jface.viewers.IContentProvider; -import org.eclipse.jface.viewers.ILazyContentProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Table; - -public class LazyTableViewer extends TableViewer -{ - public static Color highlightColor = Display.getDefault().getSystemColor(SWT.COLOR_YELLOW); - - public LazyTableViewer(Composite parent, int style) - { - super(parent, style | SWT.VIRTUAL); - } - - public LazyTableViewer(Composite parent) - { - super(parent); - } - - public LazyTableViewer(Table table) - { - super(table); - } - - public void highlightRow(int index, boolean highlight) - { - Table table = getTable(); - if (index < 0 || index >= table.getItemCount()) - return; - table.getItem(index).setBackground(highlight ? highlightColor : table.getBackground()); - System.out.println("Infinite loop!!!"); - ((ILazyContentProvider) getContentProvider()).updateElement(index); - } - - @Override - public void setContentProvider(IContentProvider provider) - { - if (!(provider instanceof ILazyContentProvider)) - throw new IllegalArgumentException("Content provider must be an ILazyContentProvider"); - super.setContentProvider(provider); - } - - @Override - public void refresh() - { - Table t = getTable(); - ILazyContentProvider provider = (ILazyContentProvider) getContentProvider(); - doClearAll(); - int startIndex = t.getTopIndex(); - int numRows = t.getBounds().height / t.getItemHeight(); - int endIndex = Integer.min(startIndex + numRows + 5, doGetItemCount()); - - for (int i = startIndex; i < endIndex; i++) - { - provider.updateElement(i); - } - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java deleted file mode 100644 index a1d81072..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.mograsim.plugin.tables; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.CellEditor; -import org.eclipse.jface.viewers.EditingSupport; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.TextCellEditor; - -import net.mograsim.plugin.asm.AsmNumberUtil; - -public abstract class NumberCellEditingSupport extends EditingSupport -{ - private final TableViewer viewer; - private final CellEditor editor; - private final DisplaySettings displaySettings; - - public NumberCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings) - { - super(viewer); - this.viewer = viewer; - this.displaySettings = displaySettings; - editor = new TextCellEditor(viewer.getTable()); - editor.setValidator(new NumberCellEditorValidator()); - } - - @Override - final protected boolean canEdit(Object element) - { - return true; - } - - @Override - final protected CellEditor getCellEditor(Object element) - { - return editor; - } - - @Override - final protected Object getValue(Object element) - { - return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType()); - } - - @Override - final protected void setValue(Object element, Object userInput) - { - try - { - setAsBigInteger(element, AsmNumberUtil.valueOf((String) userInput)); - } - catch (@SuppressWarnings("unused") NumberFormatException e) - { - setAsBigInteger(element, BigInteger.valueOf(0)); - } - viewer.update(element, null); - } - - protected abstract void setAsBigInteger(Object element, BigInteger value); - - protected abstract BigInteger getAsBigInteger(Object element); -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java deleted file mode 100644 index e0b445dd..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.plugin.tables; - -import org.eclipse.jface.viewers.ICellEditorValidator; - -import net.mograsim.plugin.asm.AsmNumberUtil; - -public class NumberCellEditorValidator implements ICellEditorValidator -{ - - @Override - public String isValid(Object value) - { - return AsmNumberUtil.NumberType.NONE.equals(AsmNumberUtil.getType((String) value)) ? (String) value + "is not a valid number" - : null; - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java deleted file mode 100644 index 6ee2c2b4..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.plugin.tables; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.ColumnLabelProvider; - -import net.mograsim.plugin.asm.AsmNumberUtil; - -public abstract class NumberColumnLabelProvider extends ColumnLabelProvider -{ - private DisplaySettings displaySettings; - - public NumberColumnLabelProvider(DisplaySettings displaySettings) - { - this.displaySettings = displaySettings; - } - - @Override - public String getText(Object element) - { - return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType()); - } - - public abstract BigInteger getAsBigInteger(Object element); -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java deleted file mode 100644 index b72df0e9..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.mograsim.plugin.tables; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; - -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; - -public class RadixSelector -{ - private final Composite parent; - private final DisplaySettings target; - private Label label; - private Combo combo; - - public RadixSelector(Composite parent, DisplaySettings target) - { - this.parent = parent; - this.target = target; - setupRadixSelector(); - } - - private void setupRadixSelector() - { - label = new Label(parent, SWT.NONE); - label.setText("Radix: "); - combo = new Combo(parent, SWT.READ_ONLY); - - String entries[] = new String[] { "Binary", "Octal", "Decimal", "Hexadecimal" }; - NumberType corTypes[] = new NumberType[] { NumberType.BINARY, NumberType.OCTAL, NumberType.DECIMAL, NumberType.HEXADECIMAL }; - combo.setItems(entries); - combo.select(3); - combo.addSelectionListener(new SelectionListener() - { - @Override - public void widgetSelected(SelectionEvent e) - { - int index = combo.getSelectionIndex(); - if (index == -1) - target.setDataNumberType(NumberType.HEXADECIMAL); - else - { - target.setDataNumberType(corTypes[index]); - } - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) - { - widgetSelected(e); - } - }); - } - - public Label getLabel() - { - return label; - } - - public Combo getCombo() - { - return combo; - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java deleted file mode 100644 index 46b7c5c3..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.mograsim.plugin.tables; - -public class TableRow -{ - public final T data; - public final long address; - - public TableRow(long address, T data) - { - this.data = data; - this.address = address; - } - - public T getData() - { - return data; - } - - public long getAddress() - { - return address; - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java deleted file mode 100644 index 46eefcd9..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.TableViewer; - -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.NumberCellEditingSupport; - -public class MemoryCellEditingSupport extends NumberCellEditingSupport -{ - public MemoryCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings) - { - super(viewer, displaySettings); - } - - @Override - protected void setAsBigInteger(Object element, BigInteger value) - { - MemoryTableRow row = (MemoryTableRow) element; - row.getMemory().setCellAsBigInteger(row.address, value); - } - - @Override - protected BigInteger getAsBigInteger(Object element) - { - MemoryTableRow row = (MemoryTableRow) element; - return row.getMemory().getCellAsBigInteger(row.address); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java deleted file mode 100644 index aaecc754..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java +++ /dev/null @@ -1,79 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import org.eclipse.jface.viewers.ILazyContentProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.swt.widgets.Display; - -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.MemoryObserver; - -public class MemoryTableContentProvider implements ILazyContentProvider, MemoryObserver -{ - private long lower; - private TableViewer viewer; - private final static int limit = 10_000; - private int amount = 0; - private MainMemory memory; - - public void setLowerBound(long lower) - { - if (memory != null) - this.lower = Long.min(memory.getDefinition().getMaximalAddress(), Long.max(memory.getDefinition().getMinimalAddress(), lower)); - else - this.lower = lower; - updateItemCount(); - } - - public void updateItemCount() - { - if (memory != null) - { - long size = memory.getDefinition().getMaximalAddress() - lower; - viewer.setItemCount(size > amount ? amount : (int) size); - } else - viewer.setItemCount(0); - } - - public long getLowerBound() - { - return lower; - } - - public void setAmount(int amount) - { - this.amount = Integer.min(amount, limit); - updateItemCount(); - } - - public int getAmount() - { - return amount; - } - - @Override - public void updateElement(int index) - { - long address = lower + index; - if (address <= memory.getDefinition().getMaximalAddress()) - viewer.replace(new MemoryTableRow(address, memory), index); - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) - { - this.viewer = (TableViewer) viewer; - this.memory = (MainMemory) newInput; - if (oldInput != null) - ((MainMemory) oldInput).deregisterObserver(this); - if (memory != null) - memory.registerObserver(this); - setLowerBound(0L); - } - - @Override - public void update(long address) - { - Display.getDefault().asyncExec(() -> updateElement((int) (address - lower))); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java deleted file mode 100644 index 81ee6e65..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import net.mograsim.machine.MainMemory; -import net.mograsim.plugin.tables.TableRow; - -public class MemoryTableRow extends TableRow -{ - public MemoryTableRow(long address, MainMemory memory) - { - super(address, memory); - } - - public MainMemory getMemory() - { - return getData(); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java deleted file mode 100644 index 09368807..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java +++ /dev/null @@ -1,175 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import java.math.BigInteger; -import java.util.Optional; - -import org.eclipse.jface.viewers.TableViewerColumn; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.VerifyListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.part.ViewPart; - -import net.mograsim.machine.Machine; -import net.mograsim.machine.MainMemory; -import net.mograsim.machine.MainMemoryDefinition; -import net.mograsim.machine.standard.memory.WordAddressableMemory; -import net.mograsim.plugin.MachineContext; -import net.mograsim.plugin.MachineContext.ContextObserver; -import net.mograsim.plugin.asm.AsmNumberUtil; -import net.mograsim.plugin.tables.AddressLabelProvider; -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.LazyTableViewer; -import net.mograsim.plugin.tables.NumberColumnLabelProvider; -import net.mograsim.plugin.tables.RadixSelector; - -public class MemoryView extends ViewPart implements ContextObserver -{ - private LazyTableViewer viewer; - private MemoryTableContentProvider provider; - private DisplaySettings displaySettings; - - @Override - public void createPartControl(Composite parent) - { - provider = new MemoryTableContentProvider(); - displaySettings = new DisplaySettings(); - - GridLayout layout = new GridLayout(6, false); - parent.setLayout(layout); - - createHeader(parent); - createViewer(parent); - - displaySettings.addObserver(() -> viewer.refresh()); - - setupContextBinding(); - } - - @SuppressWarnings("unused") - private void createHeader(Composite parent) - { - Label fromLabel = new Label(parent, SWT.NONE); - fromLabel.setText("Address: "); - Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH); - fromText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); - VerifyListener vl = new NumberVerifyListener(); - fromText.addVerifyListener(vl); - fromText.setText("0"); - fromText.addModifyListener(e -> - { - try - { - provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue()); - viewer.refresh(); - } - catch (NumberFormatException ex) - { - // Nothing to do here - } - }); - - Label amountLabel = new Label(parent, SWT.NONE); - amountLabel.setText("Number of cells: "); - Text amountText = new Text(parent, SWT.BORDER | SWT.SEARCH); - amountText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); - amountText.addVerifyListener(vl); - amountText.setText("0"); - amountText.addModifyListener(e -> - { - try - { - provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue()); - viewer.refresh(); - } - catch (NumberFormatException ex) - { - // Nothing to do here - } - }); - new RadixSelector(parent, displaySettings); - } - - private void createViewer(Composite parent) - { - viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); - createColumns(); - Table table = viewer.getTable(); - table.setHeaderVisible(true); - table.setLinesVisible(true); - viewer.setUseHashlookup(true); - viewer.setContentProvider(provider); - bindMainMemory(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE))); - getSite().setSelectionProvider(viewer); - - GridData gd = new GridData(); - gd.verticalAlignment = GridData.FILL; - gd.horizontalSpan = 6; - gd.grabExcessHorizontalSpace = true; - gd.grabExcessVerticalSpace = true; - gd.horizontalAlignment = GridData.FILL; - viewer.getControl().setLayoutData(gd); - } - - private void createColumns() - { - String[] titles = { "Address", "Data" }; - int[] bounds = { 100, 100 }; - - TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]); - col.setLabelProvider(new AddressLabelProvider()); - - col = createTableViewerColumn(titles[1], bounds[1]); - col.setLabelProvider(new NumberColumnLabelProvider(displaySettings) - { - @Override - public BigInteger getAsBigInteger(Object element) - { - MemoryTableRow row = (MemoryTableRow) element; - return row.getMemory().getCellAsBigInteger(row.address); - } - - }); - col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings)); - } - - private TableViewerColumn createTableViewerColumn(String title, int bound) - { - TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); - TableColumn column = viewerColumn.getColumn(); - column.setText(title); - column.setWidth(bound); - column.setResizable(true); - column.setMoveable(false); - return viewerColumn; - } - - @Override - public void setFocus() - { - viewer.getControl().setFocus(); - } - - private void bindMainMemory(MainMemory m) - { - viewer.setInput(m); - } - - private void setupContextBinding() - { - MachineContext.getInstance().registerObserver(this); - setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); - } - - @Override - public void setMachine(Optional machine) - { - if (machine.isPresent()) - bindMainMemory(machine.get().getMainMemory()); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java deleted file mode 100644 index 54d71762..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.mograsim.plugin.tables.memory; - -import org.eclipse.swt.events.VerifyEvent; -import org.eclipse.swt.events.VerifyListener; -import org.eclipse.swt.widgets.Text; - -import net.mograsim.plugin.asm.AsmNumberUtil; -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; - -public class NumberVerifyListener implements VerifyListener -{ - - @Override - public void verifyText(VerifyEvent e) - { - String text = computeModifiedText(e); - e.doit = !NumberType.NONE.equals(AsmNumberUtil.prefixOfType(text)); - } - - private static String computeModifiedText(VerifyEvent e) - { - String modifiedText = ((Text) e.getSource()).getText(); - modifiedText = modifiedText.substring(0, e.start).concat(e.text).concat(modifiedText.substring(e.end)); - return modifiedText; - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java deleted file mode 100644 index c3318b58..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.CellEditor; -import org.eclipse.jface.viewers.CheckboxCellEditor; -import org.eclipse.jface.viewers.EditingSupport; -import org.eclipse.jface.viewers.TableViewer; - -import net.mograsim.logic.core.types.Bit; -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.parameters.BooleanClassification; - -public class BooleanEditingSupport extends EditingSupport -{ - private final CheckboxCellEditor editor; - private final BooleanClassification boolClass; - private final TableViewer viewer; - private final int index; - - public BooleanEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index) - { - super(viewer); - this.viewer = viewer; - this.boolClass = (BooleanClassification) definition.getParameterClassification(index); - editor = new CheckboxCellEditor(viewer.getTable()); - this.index = index; - } - - @Override - protected boolean canEdit(Object element) - { - return true; - } - - @Override - protected CellEditor getCellEditor(Object element) - { - return editor; - } - - @Override - protected Object getValue(Object element) - { - return ((InstructionTableRow) element).data.getParameter(index).getValue().getMSBit(0).equals(Bit.ONE); - } - - @Override - protected void setValue(Object element, Object value) - { - ((InstructionTableRow) element).data.setParameter(index, boolClass.get((Boolean) value)); - viewer.update(element, null); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java deleted file mode 100644 index b8021b74..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.ILazyContentProvider; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.jface.viewers.Viewer; - -import net.mograsim.machine.mi.MicroInstructionMemory; - -public class InstructionTableContentProvider implements ILazyContentProvider -{ - private TableViewer viewer; - private MicroInstructionMemory memory; - private long minAddr = 0; - - @Override - public void updateElement(int index) - { - long address = memory.getDefinition().getMinimalAddress() + index; - viewer.replace(new InstructionTableRow(address, memory.getCell(address)), index); - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) - { - this.viewer = (TableViewer) viewer; - this.memory = (MicroInstructionMemory) newInput; - if (this.memory != null) - { - this.viewer.setItemCount((int) memory.size()); - this.minAddr = memory.getDefinition().getMinimalAddress(); - } - } - - public void update(long address) - { - updateElement((int) (address - minAddr)); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java deleted file mode 100644 index 677d1668..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import net.mograsim.machine.mi.MicroInstruction; -import net.mograsim.plugin.tables.TableRow; - -public class InstructionTableRow extends TableRow -{ - public InstructionTableRow(long address, MicroInstruction data) - { - super(address, data); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java deleted file mode 100644 index 3af070f3..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java +++ /dev/null @@ -1,249 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import java.io.File; -import java.io.IOException; -import java.util.Optional; - -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.EditingSupport; -import org.eclipse.jface.viewers.TableViewerColumn; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.ui.part.ViewPart; - -import net.mograsim.machine.Machine; -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.MicroInstructionMemory; -import net.mograsim.machine.mi.MicroInstructionMemoryParseException; -import net.mograsim.machine.mi.MicroInstructionMemoryParser; -import net.mograsim.machine.mi.parameters.ParameterClassification; -import net.mograsim.plugin.MachineContext; -import net.mograsim.plugin.MachineContext.ContextObserver; -import net.mograsim.plugin.tables.AddressLabelProvider; -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.LazyTableViewer; -import net.mograsim.plugin.tables.RadixSelector; -import net.mograsim.plugin.util.DropDownMenu; -import net.mograsim.plugin.util.DropDownMenu.DropDownEntry; - -public class InstructionView extends ViewPart implements ContextObserver -{ - private String saveLoc = null; - private LazyTableViewer viewer; - private TableViewerColumn[] columns = new TableViewerColumn[0]; - private MicroInstructionDefinition miDef; - private MicroInstructionMemory memory; - private DisplaySettings displaySettings; - private InstructionTableContentProvider provider; - private int highlighted = 0; - - @SuppressWarnings("unused") - @Override - public void createPartControl(Composite parent) - { - provider = new InstructionTableContentProvider(); - GridLayout layout = new GridLayout(3, false); - setupMenuButtons(parent); - - displaySettings = new DisplaySettings(); - new RadixSelector(parent, displaySettings); - - parent.setLayout(layout); - viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); - - Table table = viewer.getTable(); - table.setHeaderVisible(true); - table.setLinesVisible(true); - viewer.setUseHashlookup(true); - viewer.setContentProvider(provider); - getSite().setSelectionProvider(viewer); - - GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); - viewerData.horizontalSpan = 3; - viewer.getTable().setLayoutData(viewerData); - - displaySettings.addObserver(() -> viewer.refresh()); - MachineContext.getInstance().registerObserver(this); - setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); - } - - public void highlight(int index) - { - viewer.highlightRow(highlighted, false); - viewer.highlightRow(index, true); - viewer.getTable().setTopIndex(index); - } - - @SuppressWarnings("unused") - private void setupMenuButtons(Composite parent) - { - DropDownEntry open = new DropDownEntry("Open", (e) -> - { - FileDialog d = new FileDialog(parent.getShell(), SWT.NONE); - d.open(); - String filename = d.getFileName(); - if (!filename.equals("")) - open(d.getFilterPath() + File.separator + filename); - }); - - DropDownEntry save = new DropDownEntry("Save", (e) -> - { - if (saveLoc == null) - openSaveAsDialog(parent); - save(saveLoc); - }); - DropDownEntry saveAs = new DropDownEntry("SaveAs", (e) -> - { - openSaveAsDialog(parent); - save(saveLoc); - }); - new DropDownMenu(parent, "File", open, save, saveAs); - } - - private void openSaveAsDialog(Composite parent) - { - FileDialog d = new FileDialog(parent.getShell(), SWT.SAVE); - d.open(); - String filename = d.getFileName(); - if (!filename.equals("")) - saveLoc = d.getFilterPath() + File.separator + filename; - } - - public void bindMicroInstructionMemory(MicroInstructionMemory memory) - { - deleteColumns(); - this.memory = memory; - viewer.setInput(memory); - this.miDef = memory.getDefinition().getMicroInstructionDefinition(); - createColumns(); - } - - private void deleteColumns() - { - for (TableViewerColumn col : columns) - col.getColumn().dispose(); - } - - private void createColumns() - { - int size = miDef.size(); - columns = new TableViewerColumn[size + 1]; - - TableViewerColumn col = createTableViewerColumn("Address", 200); - columns[0] = col; - col.setLabelProvider(new AddressLabelProvider()); - - int bit = 0; - ParameterClassification[] classes = miDef.getParameterClassifications(); - - for (int i = 0; i < size; i++) - { - int startBit = bit; - int endBit = (bit = bit + classes[i].getExpectedBits()) - 1; - String name = startBit == endBit ? Integer.toString(startBit) : startBit + "..." + endBit; - int bounds = 20 + 20 * classes[i].getExpectedBits(); - - col = createTableViewerColumn(name, bounds); - columns[i + 1] = col; - createEditingAndLabel(col, miDef, i); - } - } - - private void createEditingAndLabel(TableViewerColumn col, MicroInstructionDefinition miDef, int index) - { - ParameterClassification parameterClassification = miDef.getParameterClassifications()[index]; - EditingSupport support; - ColumnLabelProvider provider; - switch (parameterClassification.getExpectedType()) - { - case BOOLEAN_IMMEDIATE: - support = new BooleanEditingSupport(viewer, miDef, index); - provider = new ParameterLabelProvider(index); - break; - case INTEGER_IMMEDIATE: - support = new IntegerEditingSupport(viewer, miDef, index, displaySettings, this.provider); - provider = new IntegerColumnLabelProvider(displaySettings, index); - break; - case MNEMONIC: - support = new MnemonicEditingSupport(viewer, miDef, index, this.provider); - provider = new ParameterLabelProvider(index); - break; - default: - throw new IllegalStateException( - "Unable to create EditingSupport for unknown ParameterType " + parameterClassification.getExpectedType()); - } - col.setEditingSupport(support); - col.setLabelProvider(provider); - col.getColumn().setToolTipText(miDef.getParameterDescription(index).orElse("")); - } - - private TableViewerColumn createTableViewerColumn(String title, int bound) - { - TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); - TableColumn column = viewerColumn.getColumn(); - column.setText(title); - column.setWidth(bound); - column.setResizable(true); - column.setMoveable(false); - return viewerColumn; - } - - private void open(String file) - { - if (miDef == null) - { - System.err.println("Failed to parse MicroprogrammingMemory from File. No MicroInstructionDefinition assigned."); - return; - } - try - { - MicroInstructionMemoryParser.parseMemory(memory, file); - viewer.refresh(); - saveLoc = file; - } - catch (IOException | MicroInstructionMemoryParseException e) - { - e.printStackTrace(); - } - } - - private void save(String file) - { - if (memory == null) - { - System.err.println("Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned."); - } - if (saveLoc != null) - { - try - { - MicroInstructionMemoryParser.write(memory, file); - } - catch (IOException e) - { - e.printStackTrace(); - } - } - } - - @Override - public void setFocus() - { - viewer.getControl().setFocus(); - } - - @Override - public void setMachine(Optional machine) - { - if (machine.isPresent()) - { - Machine actualMachine = machine.get(); - bindMicroInstructionMemory(actualMachine.getMicroInstructionMemory()); - } - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java deleted file mode 100644 index ce61581f..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import java.math.BigInteger; - -import net.mograsim.machine.mi.parameters.IntegerImmediate; -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.NumberColumnLabelProvider; - -public class IntegerColumnLabelProvider extends NumberColumnLabelProvider -{ - private int index; - - public IntegerColumnLabelProvider(DisplaySettings displaySettings, int index) - { - super(displaySettings); - this.index = index; - } - - @Override - public BigInteger getAsBigInteger(Object element) - { - return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java deleted file mode 100644 index d3b48ce4..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import java.math.BigInteger; - -import org.eclipse.jface.viewers.TableViewer; - -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.parameters.IntegerClassification; -import net.mograsim.machine.mi.parameters.IntegerImmediate; -import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.NumberCellEditingSupport; - -public class IntegerEditingSupport extends NumberCellEditingSupport -{ - private IntegerClassification classification; - private int index; - private InstructionTableContentProvider provider; - - public IntegerEditingSupport(TableViewer viewer, MicroInstructionDefinition miDef, int index, DisplaySettings displaySettings, - InstructionTableContentProvider provider) - { - super(viewer, displaySettings); - classification = (IntegerClassification) miDef.getParameterClassifications()[index]; - this.index = index; - this.provider = provider; - } - - @Override - protected void setAsBigInteger(Object element, BigInteger value) - { - InstructionTableRow row = ((InstructionTableRow) element); - row.data.setParameter(index, new IntegerImmediate(value, classification.getExpectedBits())); - provider.update(row.address); -// viewer.update(element, null); Does not do anything for some reason - } - - @Override - protected BigInteger getAsBigInteger(Object element) - { - return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java deleted file mode 100644 index 98181c46..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.ICellEditorValidator; - -import net.mograsim.machine.mi.parameters.MnemonicFamily; - -public class MnemonicCellEditorValidator implements ICellEditorValidator -{ - private MnemonicFamily family; - - public MnemonicCellEditorValidator(MnemonicFamily family) - { - this.family = family; - } - - @Override - public String isValid(Object value) - { - int index = (Integer) value; - return index >= 0 && index < family.size() ? null - : String.format("MnemonicFamily has %s elements, index %s is out of bounds", family.size(), value.toString()); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java deleted file mode 100644 index 765e4343..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.CellEditor; -import org.eclipse.jface.viewers.ComboBoxCellEditor; -import org.eclipse.jface.viewers.EditingSupport; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; - -import net.mograsim.machine.mi.MicroInstructionDefinition; -import net.mograsim.machine.mi.parameters.Mnemonic; -import net.mograsim.machine.mi.parameters.MnemonicFamily; - -public class MnemonicEditingSupport extends EditingSupport -{ - private final ComboBoxCellEditor editor; - private final MnemonicFamily family; - private final int index; - private InstructionTableContentProvider provider; - - public MnemonicEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index, - InstructionTableContentProvider provider) - { - super(viewer); - family = (MnemonicFamily) definition.getParameterClassifications()[index]; - editor = new ComboBoxCellEditor(viewer.getTable(), family.getStringValues(), SWT.READ_ONLY); - this.index = index; - editor.setValidator(new MnemonicCellEditorValidator(family)); - this.provider = provider; - } - - @Override - protected boolean canEdit(Object element) - { - return true; - } - - @Override - protected CellEditor getCellEditor(Object element) - { - return editor; - } - - @Override - protected Object getValue(Object element) - { - return ((Mnemonic) ((InstructionTableRow) element).data.getParameter(index)).ordinal(); - } - - @Override - protected void setValue(Object element, Object value) - { - InstructionTableRow row = ((InstructionTableRow) element); - row.data.setParameter(index, family.get((Integer) value)); - provider.update(row.address); - } - -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java deleted file mode 100644 index 5e06370a..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.mograsim.plugin.tables.mi; - -import org.eclipse.jface.viewers.ColumnLabelProvider; - -public class ParameterLabelProvider extends ColumnLabelProvider -{ - private final int index; - - public ParameterLabelProvider(int index) - { - super(); - this.index = index; - } - - @Override - public String getText(Object element) - { - return ((InstructionTableRow) element).data.getParameter(index).toString(); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java deleted file mode 100644 index ffa18575..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java +++ /dev/null @@ -1,86 +0,0 @@ -package net.mograsim.plugin.util; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.MenuItem; - -public class DropDownMenu -{ - private Button button; - - public DropDownMenu(Composite parent, String label, DropDownEntry... entries) - { - button = new Button(parent, SWT.PUSH); - button.setText(label); - setupDrowpDownMenu(entries); - } - - private void setupDrowpDownMenu(DropDownEntry[] entries) - { - Menu menu = new Menu(button); - for (DropDownEntry entry : entries) - { - MenuItem item = new MenuItem(menu, SWT.PUSH); - item.addSelectionListener(new SelectionListener() - { - @Override - public void widgetSelected(SelectionEvent e) - { - entry.listener.widgetSelected(e); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) - { - widgetSelected(e); - } - }); - item.setText(entry.title); - } - - button.addListener(SWT.Selection, new Listener() - { - @Override - public void handleEvent(Event event) - { - Rectangle rect = button.getBounds(); - Point pt = new Point(rect.x, rect.y + rect.height); - pt = button.getParent().toDisplay(pt); - menu.setLocation(pt.x, pt.y); - menu.setVisible(true); - } - }); - } - - public Button getButton() - { - return button; - } - - public static class DropDownEntry - { - public final String title; - public final EntrySelectedListener listener; - - public DropDownEntry(String title, EntrySelectedListener listener) - { - super(); - this.title = title; - this.listener = listener; - } - } - - @FunctionalInterface - public static interface EntrySelectedListener - { - public void widgetSelected(SelectionEvent e); - } -} diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java deleted file mode 100644 index 212f777c..00000000 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.mograsim.plugin.views; - -import javax.inject.Inject; - -import org.eclipse.e4.ui.model.application.ui.basic.MPart; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.part.ViewPart; - -import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; -import net.mograsim.logic.model.LogicExecuter; -import net.mograsim.logic.model.LogicUICanvas; -import net.mograsim.machine.Machine; -import net.mograsim.plugin.MachineContext; -import net.mograsim.plugin.ThemePreferences; -import net.mograsim.preferences.Preferences; - -public class LogicUIPart extends ViewPart -{ - @Inject - private MPart part; - - private LogicExecuter exec; - private LogicUICanvas ui; - - @Override - public void dispose() - { - if (exec != null) - exec.stopLiveExecution(); - } - - @Override - public void createPartControl(Composite parent) - { - // set preferences - Preferences.setPreferences(new ThemePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme())); - - Machine m = MachineContext.getInstance().getMachine(); - - // initialize UI - ui = new LogicUICanvas(parent, SWT.NONE, m.getModel()); - ui.addTransformListener((x, y, z) -> part.setDirty(z < 1)); - ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui); - userInput.buttonDrag = 3; - userInput.buttonZoom = 2; - userInput.enableUserInput(); - - // initialize executer - exec = new LogicExecuter(m.getTimeline()); - - // run it - exec.startLiveExecution(); - } - - @Override - public void setFocus() - { - ui.setFocus(); - } -} \ No newline at end of file diff --git a/net.mograsim.plugin.docs/.classpath b/net.mograsim.plugin.docs/.classpath deleted file mode 100644 index bc3587db..00000000 --- a/net.mograsim.plugin.docs/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/net.mograsim.plugin.docs/.gitignore b/net.mograsim.plugin.docs/.gitignore deleted file mode 100644 index 04b0082b..00000000 --- a/net.mograsim.plugin.docs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin/ -/html/* -!/html/.gitkeep \ No newline at end of file diff --git a/net.mograsim.plugin.docs/.project b/net.mograsim.plugin.docs/.project deleted file mode 100644 index bb1ec996..00000000 --- a/net.mograsim.plugin.docs/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.plugin.docs - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index cd95f141..00000000 --- a/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,7 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 diff --git a/net.mograsim.plugin.docs/META-INF/MANIFEST.MF b/net.mograsim.plugin.docs/META-INF/MANIFEST.MF deleted file mode 100644 index b895844a..00000000 --- a/net.mograsim.plugin.docs/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Mograsim docs -Bundle-SymbolicName: net.mograsim.plugin.docs;singleton:=true -Bundle-Version: 0.1.0.qualifier -Bundle-Vendor: Mograsim Team -Automatic-Module-Name: net.mograsim.plugin.docs -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: net.mograsim.plugin.core;bundle-version="0.1.0", - org.eclipse.help diff --git a/net.mograsim.plugin.docs/build.properties b/net.mograsim.plugin.docs/build.properties deleted file mode 100644 index 0b7cb312..00000000 --- a/net.mograsim.plugin.docs/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -bin.includes = plugin.xml,\ - META-INF/,\ - .,\ - html/,\ - *.xml diff --git a/net.mograsim.plugin.docs/html/.gitkeep b/net.mograsim.plugin.docs/html/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/net.mograsim.plugin.docs/plugin.xml b/net.mograsim.plugin.docs/plugin.xml deleted file mode 100644 index 29023f1d..00000000 --- a/net.mograsim.plugin.docs/plugin.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/toc.xml b/net.mograsim.plugin.docs/toc.xml deleted file mode 100644 index 4a82ec9d..00000000 --- a/net.mograsim.plugin.docs/toc.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/tocconcepts.xml b/net.mograsim.plugin.docs/tocconcepts.xml deleted file mode 100644 index d01f925e..00000000 --- a/net.mograsim.plugin.docs/tocconcepts.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/tocgettingstarted.xml b/net.mograsim.plugin.docs/tocgettingstarted.xml deleted file mode 100644 index 38f27e0b..00000000 --- a/net.mograsim.plugin.docs/tocgettingstarted.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/tocreference.xml b/net.mograsim.plugin.docs/tocreference.xml deleted file mode 100644 index 660cdecc..00000000 --- a/net.mograsim.plugin.docs/tocreference.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/tocsamples.xml b/net.mograsim.plugin.docs/tocsamples.xml deleted file mode 100644 index ddfa61e7..00000000 --- a/net.mograsim.plugin.docs/tocsamples.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.docs/toctasks.xml b/net.mograsim.plugin.docs/toctasks.xml deleted file mode 100644 index c96b94bb..00000000 --- a/net.mograsim.plugin.docs/toctasks.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/net.mograsim.plugin.feature/.project b/net.mograsim.plugin.feature/.project deleted file mode 100644 index dae1e84d..00000000 --- a/net.mograsim.plugin.feature/.project +++ /dev/null @@ -1,21 +0,0 @@ - - - net.mograsim.plugin.feature - - - net.mograsim.logic.model.am2900 - net.mograsim.plugin.branding - net.mograsim.plugin.core - net.mograsim.plugin.docs - - - - org.eclipse.pde.FeatureBuilder - - - - - - org.eclipse.pde.FeatureNature - - diff --git a/net.mograsim.plugin.feature/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.feature/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.feature/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.feature/build.properties b/net.mograsim.plugin.feature/build.properties deleted file mode 100644 index 64f93a9f..00000000 --- a/net.mograsim.plugin.feature/build.properties +++ /dev/null @@ -1 +0,0 @@ -bin.includes = feature.xml diff --git a/net.mograsim.plugin.feature/category.xml b/net.mograsim.plugin.feature/category.xml deleted file mode 100644 index b8eeab92..00000000 --- a/net.mograsim.plugin.feature/category.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - Mograsim - Modular Graphical Simulator - - - diff --git a/net.mograsim.plugin.feature/feature.xml b/net.mograsim.plugin.feature/feature.xml deleted file mode 100644 index 7e121014..00000000 --- a/net.mograsim.plugin.feature/feature.xml +++ /dev/null @@ -1,770 +0,0 @@ - - - - - Mograsim - Modular Graphical Simulator - -For teaching microprogramming, ISAs and circuit logic at the Technical University of Munich (TUM). -By Christian Femers, Daniel Kirschten and Fabian Stemmler - - - - Copyright (c) 2019 Christian Femers, Daniel Kirschten and Fabian Stemmler - -This program and the accompanying materials are made -available under the terms of the Eclipse Public License 2.0 -which is available at https://www.eclipse.org/legal/epl-2.0/ - -This Source Code may also be made available under the following Secondary -Licenses when the conditions for such availability set forth in the Eclipse -Public License, v. 2.0 are satisfied: GNU General Public License, version 2 -with the GNU Classpath Exception which is -available at https://www.gnu.org/software/classpath/license.html. - -SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - - - - This program and the accompanying materials are made available under the -terms of the Eclipse Public License 2.0 which is available at -http://www.eclipse.org/legal/epl-2.0, or GNU General Public License, -version 2 with the GNU Classpath Exception which is available at -https://www.gnu.org/software/classpath/license.html. - -Eclipse Public License - v 2.0 - - THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE - PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION - OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - - a) in the case of the initial Contributor, the initial content - Distributed under this Agreement, and - - b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - where such changes and/or additions to the Program originate from - and are Distributed by that particular Contributor. A Contribution - "originates" from a Contributor if it was added to the Program by - such Contributor itself or anyone acting on such Contributor's behalf. - Contributions do not include changes or additions to the Program that - are not Modified Works. - -"Contributor" means any person or entity that Distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which -are necessarily infringed by the use or sale of its Contribution alone -or when combined with the Program. - -"Program" means the Contributions Distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement -or any Secondary License (as applicable), including Contributors. - -"Derivative Works" shall mean any work, whether in Source Code or other -form, that is based on (or derived from) the Program and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. - -"Modified Works" shall mean any work in Source Code or other form that -results from an addition to, deletion from, or modification of the -contents of the Program, including, for purposes of clarity any new file -in Source Code form that contains any contents of the Program. Modified -Works shall not include works that contain only declarations, -interfaces, types, classes, structures, or files of the Program solely -in each case in order to link to, bind by name, or subclass the Program -or Modified Works thereof. - -"Distribute" means the acts of a) distributing or b) making available -in any manner that enables the transfer of a copy. - -"Source Code" means the form of a Program preferred for making -modifications, including but not limited to software source code, -documentation source, and configuration files. - -"Secondary License" means either the GNU General Public License, -Version 2.0, or any later versions of that license, including any -exceptions or additional permissions as identified by the initial -Contributor. - -2. GRANT OF RIGHTS - - a) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free copyright - license to reproduce, prepare Derivative Works of, publicly display, - publicly perform, Distribute and sublicense the Contribution of such - Contributor, if any, and such Derivative Works. - - b) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free patent - license under Licensed Patents to make, use, sell, offer to sell, - import and otherwise transfer the Contribution of such Contributor, - if any, in Source Code or other form. This patent license shall - apply to the combination of the Contribution and the Program if, at - the time the Contribution is added by the Contributor, such addition - of the Contribution causes such combination to be covered by the - Licensed Patents. The patent license shall not apply to any other - combinations which include the Contribution. No hardware per se is - licensed hereunder. - - c) Recipient understands that although each Contributor grants the - licenses to its Contributions set forth herein, no assurances are - provided by any Contributor that the Program does not infringe the - patent or other intellectual property rights of any other entity. - Each Contributor disclaims any liability to Recipient for claims - brought by any other entity based on infringement of intellectual - property rights or otherwise. As a condition to exercising the - rights and licenses granted hereunder, each Recipient hereby - assumes sole responsibility to secure any other intellectual - property rights needed, if any. For example, if a third party - patent license is required to allow Recipient to Distribute the - Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - - d) Each Contributor represents that to its knowledge it has - sufficient copyright rights in its Contribution, if any, to grant - the copyright license set forth in this Agreement. - - e) Notwithstanding the terms of any Secondary License, no - Contributor makes additional grants to any Recipient (other than - those set forth in this Agreement) as a result of such Recipient's - receipt of the Program under the terms of a Secondary License - (if permitted under the terms of Section 3). - -3. REQUIREMENTS - -3.1 If a Contributor Distributes the Program in any form, then: - - a) the Program must also be made available as Source Code, in - accordance with section 3.2, and the Contributor must accompany - the Program with a statement that the Source Code for the Program - is available under this Agreement, and informs Recipients how to - obtain it in a reasonable manner on or through a medium customarily - used for software exchange; and - - b) the Contributor may Distribute the Program under a license - different than this Agreement, provided that such license: - i) effectively disclaims on behalf of all other Contributors all - warranties and conditions, express and implied, including - warranties or conditions of title and non-infringement, and - implied warranties or conditions of merchantability and fitness - for a particular purpose; - - ii) effectively excludes on behalf of all other Contributors all - liability for damages, including direct, indirect, special, - incidental and consequential damages, such as lost profits; - - iii) does not attempt to limit or alter the recipients' rights - in the Source Code under section 3.2; and - - iv) requires any subsequent distribution of the Program by any - party to be under a license that satisfies the requirements - of this section 3. - -3.2 When the Program is Distributed as Source Code: - - a) it must be made available under this Agreement, or if the - Program (i) is combined with other material in a separate file or - files made available under a Secondary License, and (ii) the initial - Contributor attached to the Source Code the notice described in - Exhibit A of this Agreement, then the Program may be made available - under the terms of such Secondary Licenses, and - - b) a copy of this Agreement must be included with each copy of - the Program. - -3.3 Contributors may not remove or alter any copyright, patent, -trademark, attribution notices, disclaimers of warranty, or limitations -of liability ("notices") contained within the Program from any copy of -the Program which they Distribute, provided that Contributors may add -their own appropriate notices. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities -with respect to end users, business partners and the like. While this -license is intended to facilitate the commercial use of the Program, -the Contributor who includes the Program in a commercial product -offering should do so in a manner which does not create potential -liability for other Contributors. Therefore, if a Contributor includes -the Program in a commercial product offering, such Contributor -("Commercial Contributor") hereby agrees to defend and indemnify every -other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits -and other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such -Commercial Contributor in connection with its distribution of the Program -in a commercial product offering. The obligations in this section do not -apply to any claims or Losses relating to any actual or alleged -intellectual property infringement. In order to qualify, an Indemnified -Contributor must: a) promptly notify the Commercial Contributor in -writing of such claim, and b) allow the Commercial Contributor to control, -and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may -participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial -product offering, Product X. That Contributor is then a Commercial -Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Contributor's responsibility -alone. Under this section, the Commercial Contributor would have to -defend claims against the other Contributors related to those performance -claims and warranties, and if a court requires any other Contributor to -pay any damages as a result, the Commercial Contributor must pay -those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" -BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF -TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR -PURPOSE. Each Recipient is solely responsible for determining the -appropriateness of using and distributing the Program and assumes all -risks associated with its exercise of rights under this Agreement, -including but not limited to the risks and costs of program errors, -compliance with applicable laws, damage to or loss of data, programs -or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS -SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further -action by the parties hereto, such provision shall be reformed to the -minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Program itself (excluding combinations of the Program with other software -or hardware) infringes such Recipient's patent(s), then such Recipient's -rights granted under Section 2(b) shall terminate as of the date such -litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of -time after becoming aware of such noncompliance. If all Recipient's -rights under this Agreement terminate, Recipient agrees to cease use -and distribution of the Program as soon as reasonably practicable. -However, Recipient's obligations under this Agreement and any licenses -granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, -but in order to avoid inconsistency the Agreement is copyrighted and -may only be modified in the following manner. The Agreement Steward -reserves the right to publish new versions (including revisions) of -this Agreement from time to time. No one other than the Agreement -Steward has the right to modify this Agreement. The Eclipse Foundation -is the initial Agreement Steward. The Eclipse Foundation may assign the -responsibility to serve as the Agreement Steward to a suitable separate -entity. Each new version of the Agreement will be given a distinguishing -version number. The Program (including Contributions) may always be -Distributed subject to the version of the Agreement under which it was -received. In addition, after a new version of the Agreement is published, -Contributor may elect to Distribute the Program (including its -Contributions) under the new version. - -Except as expressly stated in Sections 2(a) and 2(b) above, Recipient -receives no rights or licenses to the intellectual property of any -Contributor under this Agreement, whether expressly, by implication, -estoppel or otherwise. All rights in the Program not expressly granted -under this Agreement are reserved. Nothing in this Agreement is intended -to be enforceable by any entity that is not a Contributor or Recipient. -No third-party beneficiary rights are created under this Agreement. - -Exhibit A - Form of Secondary Licenses Notice - -"This Source Code may also be made available under the following -Secondary Licenses when the conditions for such availability set forth -in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), -version(s), and exceptions or additional permissions here}." - - Simply including a copy of this Agreement, including this Exhibit A - is not sufficient to license the Source Code under Secondary Licenses. - - If it is not possible or desirable to put the notice in a particular - file, then You may include the notice in a location (such as a LICENSE - file in a relevant directory) where a recipient would be likely to - look for such a notice. - - You may add additional accurate notices of copyright ownership. - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. - -"CLASSPATH" EXCEPTION TO THE GPL - -Certain source files distributed by Oracle America and/or its affiliates are -subject to the following clarification and special exception to the GPL, but -only where Oracle has expressly included in the particular source file's header -the words "Oracle designates this particular file as subject to the "Classpath" -exception as provided by Oracle in the LICENSE file that accompanied this code." - - Linking this library statically or dynamically with other modules is making - a combined work based on this library. Thus, the terms and conditions of - the GNU General Public License cover the whole combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent modules, - and to copy and distribute the resulting executable under terms of your - choice, provided that you also meet, for each linked independent module, - the terms and conditions of the license of that module. An independent - module is a module which is not derived from or based on this library. If - you modify this library, you may extend this exception to your version of - the library, but you are not obligated to do so. If you do not wish to do - so, delete this exception statement from your version. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/net.mograsim.plugin.updatesite/.gitignore b/net.mograsim.plugin.updatesite/.gitignore deleted file mode 100644 index 8536068f..00000000 --- a/net.mograsim.plugin.updatesite/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/artifacts.jar -/content.jar -/features/ -/plugins/ diff --git a/net.mograsim.plugin.updatesite/.project b/net.mograsim.plugin.updatesite/.project deleted file mode 100644 index 4a4f372d..00000000 --- a/net.mograsim.plugin.updatesite/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - net.mograsim.plugin.updatesite - - - - - - org.eclipse.pde.UpdateSiteBuilder - - - - - - org.eclipse.pde.UpdateSiteNature - - diff --git a/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs b/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.plugin.updatesite/site.xml b/net.mograsim.plugin.updatesite/site.xml deleted file mode 100644 index a876812a..00000000 --- a/net.mograsim.plugin.updatesite/site.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - Provides updates for the modular graphical simulator (Mograsim) - - - - - - - Mograsim - Modular Graphical Simulator - - - diff --git a/net.mograsim.preferences/.classpath b/net.mograsim.preferences/.classpath deleted file mode 100644 index e801ebfb..00000000 --- a/net.mograsim.preferences/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/net.mograsim.preferences/.gitignore b/net.mograsim.preferences/.gitignore deleted file mode 100644 index ae3c1726..00000000 --- a/net.mograsim.preferences/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/net.mograsim.preferences/.project b/net.mograsim.preferences/.project deleted file mode 100644 index 0f30cb05..00000000 --- a/net.mograsim.preferences/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - net.mograsim.preferences - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.jdt.core.javanature - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs b/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs b/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 2aece3be..00000000 --- a/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,458 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=11 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning -org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=error -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error -org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning -org.eclipse.jdt.core.compiler.problem.unusedParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=11 -org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false -org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 -org.eclipse.jdt.core.formatter.align_type_members_on_columns=false -org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false -org.eclipse.jdt.core.formatter.align_with_spaces=false -org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 -org.eclipse.jdt.core.formatter.alignment_for_assignment=0 -org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 -org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 -org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 -org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 -org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 -org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 -org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 -org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 -org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 -org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 -org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 -org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 -org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 -org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 -org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 -org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 -org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 -org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_after_package=1 -org.eclipse.jdt.core.formatter.blank_lines_before_field=0 -org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 -org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 -org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 -org.eclipse.jdt.core.formatter.blank_lines_before_method=1 -org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 -org.eclipse.jdt.core.formatter.blank_lines_before_package=0 -org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 -org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 -org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line -org.eclipse.jdt.core.formatter.brace_position_for_block=next_line -org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line -org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line -org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line -org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line -org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line -org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line -org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true -org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false -org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false -org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true -org.eclipse.jdt.core.formatter.comment.format_block_comments=true -org.eclipse.jdt.core.formatter.comment.format_header=false -org.eclipse.jdt.core.formatter.comment.format_html=true -org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true -org.eclipse.jdt.core.formatter.comment.format_line_comments=true -org.eclipse.jdt.core.formatter.comment.format_source_code=true -org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false -org.eclipse.jdt.core.formatter.comment.indent_root_tags=false -org.eclipse.jdt.core.formatter.comment.indent_tag_description=false -org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert -org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert -org.eclipse.jdt.core.formatter.comment.line_length=140 -org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true -org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true -org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false -org.eclipse.jdt.core.formatter.compact_else_if=true -org.eclipse.jdt.core.formatter.continuation_indentation=2 -org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 -org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off -org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on -org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false -org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true -org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true -org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_empty_lines=false -org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true -org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true -org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false -org.eclipse.jdt.core.formatter.indentation.size=4 -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert -org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert -org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert -org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert -org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert -org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert -org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert -org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert -org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert -org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert -org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert -org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert -org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert -org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert -org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert -org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert -org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert -org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert -org.eclipse.jdt.core.formatter.join_lines_in_comments=true -org.eclipse.jdt.core.formatter.join_wrapped_lines=true -org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false -org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false -org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false -org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false -org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false -org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never -org.eclipse.jdt.core.formatter.lineSplit=140 -org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false -org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false -org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 -org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 -org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines -org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines -org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab -org.eclipse.jdt.core.formatter.tabulation.size=4 -org.eclipse.jdt.core.formatter.use_on_off_tags=true -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false -org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true -org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false -org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true -org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true -org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true -org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true -org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true -org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true -org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true -org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true -org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true -org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs b/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs deleted file mode 100644 index 8f2c0a47..00000000 --- a/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs +++ /dev/null @@ -1,63 +0,0 @@ -eclipse.preferences.version=1 -editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_MoGraSim -formatter_settings_version=16 -sp_cleanup.add_default_serial_version_id=true -sp_cleanup.add_generated_serial_version_id=false -sp_cleanup.add_missing_annotations=true -sp_cleanup.add_missing_deprecated_annotations=true -sp_cleanup.add_missing_methods=false -sp_cleanup.add_missing_nls_tags=false -sp_cleanup.add_missing_override_annotations=true -sp_cleanup.add_missing_override_annotations_interface_methods=true -sp_cleanup.add_serial_version_id=false -sp_cleanup.always_use_blocks=true -sp_cleanup.always_use_parentheses_in_expressions=false -sp_cleanup.always_use_this_for_non_static_field_access=false -sp_cleanup.always_use_this_for_non_static_method_access=false -sp_cleanup.convert_functional_interfaces=false -sp_cleanup.convert_to_enhanced_for_loop=false -sp_cleanup.correct_indentation=false -sp_cleanup.format_source_code=true -sp_cleanup.format_source_code_changes_only=false -sp_cleanup.insert_inferred_type_arguments=false -sp_cleanup.make_local_variable_final=true -sp_cleanup.make_parameters_final=false -sp_cleanup.make_private_fields_final=true -sp_cleanup.make_type_abstract_if_missing_method=false -sp_cleanup.make_variable_declarations_final=false -sp_cleanup.never_use_blocks=false -sp_cleanup.never_use_parentheses_in_expressions=true -sp_cleanup.on_save_use_additional_actions=false -sp_cleanup.organize_imports=false -sp_cleanup.qualify_static_field_accesses_with_declaring_class=false -sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true -sp_cleanup.qualify_static_member_accesses_with_declaring_class=false -sp_cleanup.qualify_static_method_accesses_with_declaring_class=false -sp_cleanup.remove_private_constructors=true -sp_cleanup.remove_redundant_modifiers=false -sp_cleanup.remove_redundant_semicolons=false -sp_cleanup.remove_redundant_type_arguments=false -sp_cleanup.remove_trailing_whitespaces=false -sp_cleanup.remove_trailing_whitespaces_all=true -sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true -sp_cleanup.remove_unnecessary_nls_tags=false -sp_cleanup.remove_unused_imports=false -sp_cleanup.remove_unused_local_variables=false -sp_cleanup.remove_unused_private_fields=true -sp_cleanup.remove_unused_private_members=false -sp_cleanup.remove_unused_private_methods=true -sp_cleanup.remove_unused_private_types=true -sp_cleanup.sort_members=false -sp_cleanup.sort_members_all=false -sp_cleanup.use_anonymous_class_creation=false -sp_cleanup.use_blocks=false -sp_cleanup.use_blocks_only_for_return_and_throw=false -sp_cleanup.use_lambda=true -sp_cleanup.use_parentheses_in_expressions=false -sp_cleanup.use_this_for_non_static_field_access=false -sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true -sp_cleanup.use_this_for_non_static_method_access=false -sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/net.mograsim.preferences/META-INF/MANIFEST.MF b/net.mograsim.preferences/META-INF/MANIFEST.MF deleted file mode 100644 index 315ec1ab..00000000 --- a/net.mograsim.preferences/META-INF/MANIFEST.MF +++ /dev/null @@ -1,10 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: Mograsim Preferences -Bundle-SymbolicName: net.mograsim.preferences -Bundle-Version: 0.1.0.qualifier -Export-Package: net.mograsim.preferences -Bundle-Vendor: Mograsim Team -Automatic-Module-Name: net.mograsim.preferences -Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.eclipse.swt;bundle-version="3.0.0" diff --git a/net.mograsim.preferences/build.properties b/net.mograsim.preferences/build.properties deleted file mode 100644 index b107977f..00000000 --- a/net.mograsim.preferences/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -source.. = src/ -bin.includes = META-INF/,\ - . diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java b/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java deleted file mode 100644 index 621de5f6..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.mograsim.preferences; - -/** - * A way to define a color with the possibility to use colors built into the system (called "system colors" in SWT). - *

- * A {@link ColorDefinition} is defined either by a {@link BuiltInColor} constant, in which case r==g==b==-1, or by red / green - * / blue components, in which case builtInColor==null - * - * @author Daniel Kirschten - */ -public class ColorDefinition -{ - /** - * The built-in color constant defining this color. - */ - public final ColorDefinition.BuiltInColor builtInColor; - /** - * The red color component defining this color. - */ - public final int r; - /** - * The green color component defining this color. - */ - public final int g; - /** - * The blue color component defining this color. - */ - public final int b; - - public ColorDefinition(ColorDefinition.BuiltInColor col) - { - if (col == null) - throw new IllegalArgumentException("Illegal built-in color: " + col); - this.builtInColor = col; - this.r = -1; - this.g = -1; - this.b = -1; - } - - public ColorDefinition(int r, int g, int b) - { - if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) - throw new IllegalArgumentException("Illegal color components: r=" + r + "; g=" + g + "; b=" + b); - this.builtInColor = null; - this.r = r; - this.g = g; - this.b = b; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = prime * result + b; - result = prime * result + ((builtInColor == null) ? 0 : builtInColor.hashCode()); - result = prime * result + g; - result = prime * result + r; - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ColorDefinition other = (ColorDefinition) obj; - if (b != other.b) - return false; - if (builtInColor != other.builtInColor) - return false; - if (g != other.g) - return false; - if (r != other.r) - return false; - return true; - } - - public static enum BuiltInColor - { - COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_DARK_RED, COLOR_GREEN, COLOR_DARK_GREEN, COLOR_YELLOW, COLOR_DARK_YELLOW, COLOR_BLUE, - COLOR_DARK_BLUE, COLOR_MAGENTA, COLOR_DARK_MAGENTA, COLOR_CYAN, COLOR_DARK_CYAN, COLOR_GRAY, COLOR_DARK_GRAY; - } - -} \ No newline at end of file diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java b/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java deleted file mode 100644 index f6f5d8dc..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.mograsim.preferences; - -import org.eclipse.swt.graphics.Color; - -public abstract class ColorManager -{ - private static ColorManager currentManager; - - public static void setColorManager(ColorManager manager) - { - if (manager == null) - throw new NullPointerException(); - currentManager = manager; - } - - public static ColorManager current() - { - if (currentManager == null) - currentManager = new SimpleColorManager(); - return currentManager; - } - - public abstract Color toColor(ColorDefinition col); - - public void clearCache() - { - // this method is intended to be overridden - } -} \ No newline at end of file diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java b/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java deleted file mode 100644 index 2f5c7c2a..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.mograsim.preferences; - -import net.mograsim.preferences.ColorDefinition.BuiltInColor; - -public class DefaultPreferences extends Preferences -{ - @Override - public boolean getBoolean(String name) - { - switch (name) - { - case "net.mograsim.logic.model.improvetext": - return true; - default: - throw new IllegalArgumentException("Unknown boolean preference name: " + name); - } - } - - @Override - public int getInt(String name) - { - switch (name) - { - default: - throw new IllegalArgumentException("Unknown int preference name: " + name); - } - } - - @Override - public double getDouble(String name) - { - switch (name) - { - case "net.mograsim.logic.model.linewidth.default": - return 0.5; - case "net.mograsim.logic.model.linewidth.wire.singlebit": - return 0.5; - case "net.mograsim.logic.model.linewidth.wire.multibit": - return 0.85; - default: - throw new IllegalArgumentException("Unknown double preference name: " + name); - } - } - - @Override - public ColorDefinition getColorDefinition(String name) - { - switch (name) - { - case "net.mograsim.logic.model.color.bit.one": - return new ColorDefinition(BuiltInColor.COLOR_GREEN); - case "net.mograsim.logic.model.color.bit.u": - return new ColorDefinition(BuiltInColor.COLOR_CYAN); - case "net.mograsim.logic.model.color.bit.x": - return new ColorDefinition(BuiltInColor.COLOR_RED); - case "net.mograsim.logic.model.color.bit.z": - return new ColorDefinition(BuiltInColor.COLOR_YELLOW); - case "net.mograsim.logic.model.color.bit.zero": - return new ColorDefinition(BuiltInColor.COLOR_GRAY); - case "net.mograsim.logic.model.color.background": - return new ColorDefinition(BuiltInColor.COLOR_WHITE); - case "net.mograsim.logic.model.color.foreground": - return new ColorDefinition(BuiltInColor.COLOR_BLACK); - case "net.mograsim.logic.model.color.text": - return new ColorDefinition(BuiltInColor.COLOR_BLACK); - default: - throw new IllegalArgumentException("Unknown color preference name: " + name); - } - } -} \ No newline at end of file diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java b/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java deleted file mode 100644 index f2498564..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.mograsim.preferences; - -import java.util.Objects; - -import org.eclipse.swt.graphics.Color; - -public abstract class Preferences -{ - private static Preferences currentPreferences; - - public static void setPreferences(Preferences preferences) - { - currentPreferences = Objects.requireNonNull(preferences); - } - - public static Preferences current() - { - if (currentPreferences == null) - currentPreferences = new DefaultPreferences(); - return currentPreferences; - } - - public abstract boolean getBoolean(String name); - - public abstract int getInt(String name); - - public abstract double getDouble(String name); - - public abstract ColorDefinition getColorDefinition(String name); - - public Color getColor(String name) - { - return ColorManager.current().toColor(getColorDefinition(name)); - } -} diff --git a/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java b/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java deleted file mode 100644 index 60b53110..00000000 --- a/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java +++ /dev/null @@ -1,95 +0,0 @@ -package net.mograsim.preferences; - -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Device; -import org.eclipse.swt.widgets.Display; - -import net.mograsim.preferences.ColorDefinition.BuiltInColor; - -public class SimpleColorManager extends ColorManager -{ - private static final Map systemColors = new HashMap<>(); - - private final Device device; - private final Map cachedColors; - - public SimpleColorManager() - { - this.device = Display.getCurrent(); - this.cachedColors = new HashMap<>(systemColors); - } - - @Override - public Color toColor(ColorDefinition col) - { - if (col == null) - return null; - Color cachedColor = cachedColors.get(col); - if (cachedColor != null) - return cachedColor; - if (col.builtInColor != null) - { - Color systemColor = device.getSystemColor(toSWTColorConstant(col.builtInColor)); - systemColors.put(col, systemColor); - cachedColors.put(col, systemColor); - return systemColor; - } - Color nonSystemColor = new Color(device, col.r, col.g, col.b); - cachedColors.put(col, nonSystemColor); - return nonSystemColor; - } - - @Override - public void clearCache() - { - cachedColors.entrySet().stream().filter(e -> !systemColors.containsKey(e.getKey())).map(Entry::getValue).forEach(Color::dispose); - cachedColors.clear(); - cachedColors.putAll(systemColors); - } - - public static int toSWTColorConstant(BuiltInColor col) - { - switch (col) - { - case COLOR_BLACK: - return SWT.COLOR_BLACK; - case COLOR_BLUE: - return SWT.COLOR_BLUE; - case COLOR_CYAN: - return SWT.COLOR_CYAN; - case COLOR_DARK_BLUE: - return SWT.COLOR_DARK_BLUE; - case COLOR_DARK_CYAN: - return SWT.COLOR_DARK_CYAN; - case COLOR_DARK_GRAY: - return SWT.COLOR_DARK_GRAY; - case COLOR_DARK_GREEN: - return SWT.COLOR_DARK_GREEN; - case COLOR_DARK_MAGENTA: - return SWT.COLOR_DARK_MAGENTA; - case COLOR_DARK_RED: - return SWT.COLOR_DARK_RED; - case COLOR_DARK_YELLOW: - return SWT.COLOR_DARK_YELLOW; - case COLOR_GRAY: - return SWT.COLOR_GRAY; - case COLOR_GREEN: - return SWT.COLOR_GREEN; - case COLOR_MAGENTA: - return SWT.COLOR_MAGENTA; - case COLOR_RED: - return SWT.COLOR_RED; - case COLOR_WHITE: - return SWT.COLOR_WHITE; - case COLOR_YELLOW: - return SWT.COLOR_YELLOW; - default: - throw new IllegalArgumentException("Unknown enum constant: " + col); - } - } -} diff --git a/net.mograsim.product/.project b/net.mograsim.product/.project deleted file mode 100644 index d95f9637..00000000 --- a/net.mograsim.product/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - net.mograsim.product - - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - - diff --git a/net.mograsim.product/.settings/org.eclipse.core.resources.prefs b/net.mograsim.product/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c02..00000000 --- a/net.mograsim.product/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/net.mograsim.product/NOTE b/net.mograsim.product/NOTE deleted file mode 100644 index c63784b3..00000000 --- a/net.mograsim.product/NOTE +++ /dev/null @@ -1,2 +0,0 @@ -Not really necessary, but you could still build it as an Eclipse RCP product (by using an appropriate target platform). -This would then be comparable to the pre-configured packages offered at eclipse.org. \ No newline at end of file diff --git a/net.mograsim.product/build.properties b/net.mograsim.product/build.properties deleted file mode 100644 index f63dee38..00000000 --- a/net.mograsim.product/build.properties +++ /dev/null @@ -1,3 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = . diff --git a/net.mograsim.product/net.mograsim.product b/net.mograsim.product/net.mograsim.product deleted file mode 100644 index 3bafb1f8..00000000 --- a/net.mograsim.product/net.mograsim.product +++ /dev/null @@ -1,705 +0,0 @@ - - - - - - - - - - - -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts - - - - - - - - - - - - - - - org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 - org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 - org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 - - - - https://www.eclipse.org/legal/epl-2.0/ - - This program and the accompanying materials are made available under the -terms of the Eclipse Public License 2.0 which is available at -http://www.eclipse.org/legal/epl-2.0, or GNU General Public License, -version 2 with the GNU Classpath Exception which is available at -https://www.gnu.org/software/classpath/license.html. - -Eclipse Public License - v 2.0 - - THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE - PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION - OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - - a) in the case of the initial Contributor, the initial content - Distributed under this Agreement, and - - b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - where such changes and/or additions to the Program originate from - and are Distributed by that particular Contributor. A Contribution - "originates" from a Contributor if it was added to the Program by - such Contributor itself or anyone acting on such Contributor's behalf. - Contributions do not include changes or additions to the Program that - are not Modified Works. - -"Contributor" means any person or entity that Distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which -are necessarily infringed by the use or sale of its Contribution alone -or when combined with the Program. - -"Program" means the Contributions Distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement -or any Secondary License (as applicable), including Contributors. - -"Derivative Works" shall mean any work, whether in Source Code or other -form, that is based on (or derived from) the Program and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. - -"Modified Works" shall mean any work in Source Code or other form that -results from an addition to, deletion from, or modification of the -contents of the Program, including, for purposes of clarity any new file -in Source Code form that contains any contents of the Program. Modified -Works shall not include works that contain only declarations, -interfaces, types, classes, structures, or files of the Program solely -in each case in order to link to, bind by name, or subclass the Program -or Modified Works thereof. - -"Distribute" means the acts of a) distributing or b) making available -in any manner that enables the transfer of a copy. - -"Source Code" means the form of a Program preferred for making -modifications, including but not limited to software source code, -documentation source, and configuration files. - -"Secondary License" means either the GNU General Public License, -Version 2.0, or any later versions of that license, including any -exceptions or additional permissions as identified by the initial -Contributor. - -2. GRANT OF RIGHTS - - a) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free copyright - license to reproduce, prepare Derivative Works of, publicly display, - publicly perform, Distribute and sublicense the Contribution of such - Contributor, if any, and such Derivative Works. - - b) Subject to the terms of this Agreement, each Contributor hereby - grants Recipient a non-exclusive, worldwide, royalty-free patent - license under Licensed Patents to make, use, sell, offer to sell, - import and otherwise transfer the Contribution of such Contributor, - if any, in Source Code or other form. This patent license shall - apply to the combination of the Contribution and the Program if, at - the time the Contribution is added by the Contributor, such addition - of the Contribution causes such combination to be covered by the - Licensed Patents. The patent license shall not apply to any other - combinations which include the Contribution. No hardware per se is - licensed hereunder. - - c) Recipient understands that although each Contributor grants the - licenses to its Contributions set forth herein, no assurances are - provided by any Contributor that the Program does not infringe the - patent or other intellectual property rights of any other entity. - Each Contributor disclaims any liability to Recipient for claims - brought by any other entity based on infringement of intellectual - property rights or otherwise. As a condition to exercising the - rights and licenses granted hereunder, each Recipient hereby - assumes sole responsibility to secure any other intellectual - property rights needed, if any. For example, if a third party - patent license is required to allow Recipient to Distribute the - Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - - d) Each Contributor represents that to its knowledge it has - sufficient copyright rights in its Contribution, if any, to grant - the copyright license set forth in this Agreement. - - e) Notwithstanding the terms of any Secondary License, no - Contributor makes additional grants to any Recipient (other than - those set forth in this Agreement) as a result of such Recipient's - receipt of the Program under the terms of a Secondary License - (if permitted under the terms of Section 3). - -3. REQUIREMENTS - -3.1 If a Contributor Distributes the Program in any form, then: - - a) the Program must also be made available as Source Code, in - accordance with section 3.2, and the Contributor must accompany - the Program with a statement that the Source Code for the Program - is available under this Agreement, and informs Recipients how to - obtain it in a reasonable manner on or through a medium customarily - used for software exchange; and - - b) the Contributor may Distribute the Program under a license - different than this Agreement, provided that such license: - i) effectively disclaims on behalf of all other Contributors all - warranties and conditions, express and implied, including - warranties or conditions of title and non-infringement, and - implied warranties or conditions of merchantability and fitness - for a particular purpose; - - ii) effectively excludes on behalf of all other Contributors all - liability for damages, including direct, indirect, special, - incidental and consequential damages, such as lost profits; - - iii) does not attempt to limit or alter the recipients' rights - in the Source Code under section 3.2; and - - iv) requires any subsequent distribution of the Program by any - party to be under a license that satisfies the requirements - of this section 3. - -3.2 When the Program is Distributed as Source Code: - - a) it must be made available under this Agreement, or if the - Program (i) is combined with other material in a separate file or - files made available under a Secondary License, and (ii) the initial - Contributor attached to the Source Code the notice described in - Exhibit A of this Agreement, then the Program may be made available - under the terms of such Secondary Licenses, and - - b) a copy of this Agreement must be included with each copy of - the Program. - -3.3 Contributors may not remove or alter any copyright, patent, -trademark, attribution notices, disclaimers of warranty, or limitations -of liability ("notices") contained within the Program from any copy of -the Program which they Distribute, provided that Contributors may add -their own appropriate notices. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities -with respect to end users, business partners and the like. While this -license is intended to facilitate the commercial use of the Program, -the Contributor who includes the Program in a commercial product -offering should do so in a manner which does not create potential -liability for other Contributors. Therefore, if a Contributor includes -the Program in a commercial product offering, such Contributor -("Commercial Contributor") hereby agrees to defend and indemnify every -other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits -and other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such -Commercial Contributor in connection with its distribution of the Program -in a commercial product offering. The obligations in this section do not -apply to any claims or Losses relating to any actual or alleged -intellectual property infringement. In order to qualify, an Indemnified -Contributor must: a) promptly notify the Commercial Contributor in -writing of such claim, and b) allow the Commercial Contributor to control, -and cooperate with the Commercial Contributor in, the defense and any -related settlement negotiations. The Indemnified Contributor may -participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial -product offering, Product X. That Contributor is then a Commercial -Contributor. If that Commercial Contributor then makes performance -claims, or offers warranties related to Product X, those performance -claims and warranties are such Commercial Contributor's responsibility -alone. Under this section, the Commercial Contributor would have to -defend claims against the other Contributors related to those performance -claims and warranties, and if a court requires any other Contributor to -pay any damages as a result, the Commercial Contributor must pay -those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" -BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF -TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR -PURPOSE. Each Recipient is solely responsible for determining the -appropriateness of using and distributing the Program and assumes all -risks associated with its exercise of rights under this Agreement, -including but not limited to the risks and costs of program errors, -compliance with applicable laws, damage to or loss of data, programs -or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT -PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS -SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST -PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of -the remainder of the terms of this Agreement, and without further -action by the parties hereto, such provision shall be reformed to the -minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity -(including a cross-claim or counterclaim in a lawsuit) alleging that the -Program itself (excluding combinations of the Program with other software -or hardware) infringes such Recipient's patent(s), then such Recipient's -rights granted under Section 2(b) shall terminate as of the date such -litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it -fails to comply with any of the material terms or conditions of this -Agreement and does not cure such failure in a reasonable period of -time after becoming aware of such noncompliance. If all Recipient's -rights under this Agreement terminate, Recipient agrees to cease use -and distribution of the Program as soon as reasonably practicable. -However, Recipient's obligations under this Agreement and any licenses -granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, -but in order to avoid inconsistency the Agreement is copyrighted and -may only be modified in the following manner. The Agreement Steward -reserves the right to publish new versions (including revisions) of -this Agreement from time to time. No one other than the Agreement -Steward has the right to modify this Agreement. The Eclipse Foundation -is the initial Agreement Steward. The Eclipse Foundation may assign the -responsibility to serve as the Agreement Steward to a suitable separate -entity. Each new version of the Agreement will be given a distinguishing -version number. The Program (including Contributions) may always be -Distributed subject to the version of the Agreement under which it was -received. In addition, after a new version of the Agreement is published, -Contributor may elect to Distribute the Program (including its -Contributions) under the new version. - -Except as expressly stated in Sections 2(a) and 2(b) above, Recipient -receives no rights or licenses to the intellectual property of any -Contributor under this Agreement, whether expressly, by implication, -estoppel or otherwise. All rights in the Program not expressly granted -under this Agreement are reserved. Nothing in this Agreement is intended -to be enforceable by any entity that is not a Contributor or Recipient. -No third-party beneficiary rights are created under this Agreement. - -Exhibit A - Form of Secondary Licenses Notice - -"This Source Code may also be made available under the following -Secondary Licenses when the conditions for such availability set forth -in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), -version(s), and exceptions or additional permissions here}." - - Simply including a copy of this Agreement, including this Exhibit A - is not sufficient to license the Source Code under Secondary Licenses. - - If it is not possible or desirable to put the notice in a particular - file, then You may include the notice in a location (such as a LICENSE - file in a relevant directory) where a recipient would be likely to - look for such a notice. - - You may add additional accurate notices of copyright ownership. - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. - -"CLASSPATH" EXCEPTION TO THE GPL - -Certain source files distributed by Oracle America and/or its affiliates are -subject to the following clarification and special exception to the GPL, but -only where Oracle has expressly included in the particular source file's header -the words "Oracle designates this particular file as subject to the "Classpath" -exception as provided by Oracle in the LICENSE file that accompanied this code." - - Linking this library statically or dynamically with other modules is making - a combined work based on this library. Thus, the terms and conditions of - the GNU General Public License cover the whole combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent modules, - and to copy and distribute the resulting executable under terms of your - choice, provided that you also meet, for each linked independent module, - the terms and conditions of the license of that module. An independent - module is a module which is not derived from or based on this library. If - you modify this library, you may extend this exception to your version of - the library, but you are not obligated to do so. If you do not wish to do - so, delete this exception statement from your version. - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/net.mograsim.logic.core/.classpath b/plugins/net.mograsim.logic.core/.classpath new file mode 100644 index 00000000..4a00becd --- /dev/null +++ b/plugins/net.mograsim.logic.core/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.logic.core/.project b/plugins/net.mograsim.logic.core/.project new file mode 100644 index 00000000..2f347c0a --- /dev/null +++ b/plugins/net.mograsim.logic.core/.project @@ -0,0 +1,29 @@ + + + net.mograsim.logic.core + + + net.mograsim.preferences + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.logic.core/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..e5f98893 --- /dev/null +++ b/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,468 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..94658822 --- /dev/null +++ b/plugins/net.mograsim.logic.core/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=false +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=true +sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.correct_indentation=true +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=true +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=true +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=true +sp_cleanup.remove_redundant_semicolons=true +sp_cleanup.remove_redundant_type_arguments=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=true +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=true +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=true +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.logic.core/META-INF/MANIFEST.MF b/plugins/net.mograsim.logic.core/META-INF/MANIFEST.MF new file mode 100644 index 00000000..2aff2ab9 --- /dev/null +++ b/plugins/net.mograsim.logic.core/META-INF/MANIFEST.MF @@ -0,0 +1,15 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: net.mograsim.logic.core +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.logic.core, + net.mograsim.logic.core.components, + net.mograsim.logic.core.components.gates, + net.mograsim.logic.core.timeline, + net.mograsim.logic.core.types, + net.mograsim.logic.core.wires +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Automatic-Module-Name: net.mograsim.logic.core +Bundle-Vendor: Mograsim Team +Require-Bundle: net.mograsim.preferences;bundle-version="0.1.0" diff --git a/plugins/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties b/plugins/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties new file mode 100644 index 00000000..8ea411e4 --- /dev/null +++ b/plugins/net.mograsim.logic.core/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,3 @@ +#Properties file for net.mograsim.logic.core +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim logic core \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/build.properties b/plugins/net.mograsim.logic.core/build.properties new file mode 100644 index 00000000..d6642e65 --- /dev/null +++ b/plugins/net.mograsim.logic.core/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/ diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java new file mode 100644 index 00000000..3a51c27c --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObservable.java @@ -0,0 +1,11 @@ +package net.mograsim.logic.core; + +public interface LogicObservable +{ + public void registerObserver(LogicObserver ob); + + public void deregisterObserver(LogicObserver ob); + + public void notifyObservers(); + +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java new file mode 100644 index 00000000..259fe4d7 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/LogicObserver.java @@ -0,0 +1,7 @@ +package net.mograsim.logic.core; + +@FunctionalInterface +public interface LogicObserver +{ + public void update(LogicObservable initiator); +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java new file mode 100644 index 00000000..c82f2b37 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/BasicCoreComponent.java @@ -0,0 +1,43 @@ +package net.mograsim.logic.core.components; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; + +/** + * A basic component that recomputes all outputs (with a delay), when it is updated. + * + * @author Fabian Stemmler + */ +public abstract class BasicCoreComponent extends CoreComponent implements LogicObserver +{ + private int processTime; + + /** + * + * @param processTime Amount of time this component takes to update its outputs. Must be more than 0, otherwise 1 is assumed. + * + * @author Fabian Stemmler + */ + public BasicCoreComponent(Timeline timeline, int processTime) + { + super(timeline); + this.processTime = processTime > 0 ? processTime : 1; + } + + @Override + public final void update(LogicObservable initiator) + { + update(); + } + + public void update() + { + TimelineEventHandler delayedUpdates = compute(); + if (delayedUpdates != null) + timeline.addEvent(delayedUpdates, processTime); + } + + protected abstract TimelineEventHandler compute(); +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java new file mode 100644 index 00000000..345bc0ab --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreBitDisplay.java @@ -0,0 +1,81 @@ +package net.mograsim.logic.core.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreBitDisplay extends BasicCoreComponent implements LogicObservable +{ + private Collection observers; + private final ReadEnd in; + private BitVector displayedValue; + + public CoreBitDisplay(Timeline timeline, ReadEnd in) + { + super(timeline, 1); + observers = new ArrayList<>(); + this.in = in; + in.registerObserver(this); + compute(); + } + + @Override + protected TimelineEventHandler compute() + { + BitVector newValues = in.getValues(); + return e -> + { + displayedValue = newValues; + notifyObservers(); + }; + } + + public BitVector getDisplayedValue() + { + return displayedValue; + } + + public boolean isDisplaying(Bit... values) + { + return displayedValue.equals(BitVector.of(values)); + } + + @Override + public List getAllInputs() + { + return List.of(in); + } + + @Override + public List getAllOutputs() + { + return List.of(); + } + + @Override + public void registerObserver(LogicObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(LogicObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers() + { + observers.forEach(ob -> ob.update(this)); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java new file mode 100644 index 00000000..0cccdfdd --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreClock.java @@ -0,0 +1,91 @@ +package net.mograsim.logic.core.components; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEvent; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreClock extends CoreComponent implements TimelineEventHandler, LogicObservable +{ + private Collection observers; + private boolean toggle = false; + private ReadWriteEnd out; + private int delta; + + /** + * + * @param out {@link CoreWire} the clock's impulses are fed into + * @param delta ticks between rising and falling edge + */ + public CoreClock(Timeline timeline, ReadWriteEnd out, int delta) + { + super(timeline); + this.delta = delta; + this.out = out; + this.observers = new HashSet<>(); + addToTimeline(); + } + + @Override + public void handle(TimelineEvent e) + { + addToTimeline(); + out.feedSignals(toggle ? Bit.ONE : Bit.ZERO); + toggle = !toggle; + notifyObservers(); + } + + public ReadWriteEnd getOut() + { + return out; + } + + public boolean isOn() + { + return !toggle; + } + + private void addToTimeline() + { + timeline.addEvent(this, delta); + } + + @Override + public List getAllInputs() + { + return List.of(); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } + + @Override + public void registerObserver(LogicObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(LogicObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers() + { + observers.forEach(ob -> ob.update(this)); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java new file mode 100644 index 00000000..734f48de --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreComponent.java @@ -0,0 +1,28 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public abstract class CoreComponent +{ + protected Timeline timeline; + + public CoreComponent(Timeline timeline) + { + this.timeline = timeline; + } + + /** + * Returns immutable list of all inputs to the {@link CoreComponent} (including e.g. the select bits to a MUX). Intended for + * visualization in the UI. + */ + public abstract List getAllInputs(); + + /** + * Returns immutable list of all outputs to the {@link CoreComponent}. Intended for visualization in the UI. + */ + public abstract List getAllOutputs(); +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java new file mode 100644 index 00000000..8f4fe428 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreDemux.java @@ -0,0 +1,92 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +/** + * Models a multiplexer. Takes an arbitrary amount of input {@link CoreWire}s, one of which, as determined by select, is put through to the + * output. + * + * @author Fabian Stemmler + * + */ +public class CoreDemux extends BasicCoreComponent +{ + private final ReadEnd select, in; + private final ReadWriteEnd[] outputs; + private final int outputSize; + private int selected = -1; + + /** + * Output {@link CoreWire}s and in must be of uniform width + * + * @param in Must be of uniform width with all outputs. + * @param select Indexes the output array to which the input is mapped. Must have enough bits to index all outputs. + * @param outputs One of these outputs receives the input signal, depending on the select bits + */ + public CoreDemux(Timeline timeline, int processTime, ReadEnd in, ReadEnd select, ReadWriteEnd... outputs) + { + super(timeline, processTime); + outputSize = in.width(); + + this.in = in; + this.outputs = outputs; + for (int i = 0; i < this.outputs.length; i++) + { + if (outputs[i].width() != outputSize) + throw new IllegalArgumentException("All DEMUX wire arrays must be of uniform width!"); + this.outputs[i] = outputs[i]; + } + + this.select = select; + select.registerObserver(this); + + int maxInputs = 1 << select.width(); + if (this.outputs.length > maxInputs) + throw new IllegalArgumentException("There are more outputs (" + this.outputs.length + ") to the DEMUX than supported by " + + select.width() + " select bits (" + maxInputs + ")."); + in.registerObserver(this); + } + + @Override + public TimelineEventHandler compute() + { + int selectValue = select.getValues().isBinary() ? (int) select.getValues().getUnsignedValueLong() : -1; + if (selectValue >= outputs.length) + selectValue = -1; + + boolean hasOldSelection = selected != selectValue && selected != -1; + int oldSelection = selected; + boolean hasNewSelection = selectValue != -1; + int newSelection = selectValue; + BitVector inputValues = in.getValues(); + + selected = selectValue; + + return e -> + { + if (hasOldSelection) + outputs[oldSelection].clearSignals(); + if (hasNewSelection) + outputs[newSelection].feedSignals(inputValues); + }; + } + + @Override + public List getAllInputs() + { + return List.of(in, select); + } + + @Override + public List getAllOutputs() + { + return List.of(outputs); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java new file mode 100644 index 00000000..b7e5d3a6 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreManualSwitch.java @@ -0,0 +1,109 @@ +package net.mograsim.logic.core.components; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +/** + * This class models a simple on/off (ONE/ZERO) switch for user interaction. + * + * @author Christian Femers + * + */ +public class CoreManualSwitch extends CoreComponent implements LogicObservable +{ + private Collection observers; + private ReadWriteEnd output; + private BitVector inputValues; + + public CoreManualSwitch(Timeline timeline, ReadWriteEnd output) + { + super(timeline); + observers = new ArrayList<>(); + this.output = output; + this.inputValues = output.getInputValues(); + } + + public void switchFullOn() + { + setState(BitVector.of(Bit.ONE, output.width())); + } + + public void switchFullOff() + { + setState(BitVector.of(Bit.ZERO, output.width())); + } + + public void toggle() + { + if (isFullOn()) + switchFullOff(); + else + switchFullOn(); + } + + public void setState(Bit bit) + { + setState(BitVector.of(bit)); + } + + public void setState(BitVector bits) + { + if (bits.length() != output.width()) + throw new IllegalArgumentException("Incorrect bit vector length"); + if (bits.equals(inputValues)) + return; + inputValues = bits; + output.feedSignals(bits); + notifyObservers(); + } + + public boolean isFullOn() + { + return BitVector.of(Bit.ONE, output.width()).equals(output.getInputValues()); + } + + public BitVector getValues() + { + return inputValues; + } + + @Override + public List getAllInputs() + { + return List.of(); + } + + @Override + public List getAllOutputs() + { + return List.of(output); + } + + @Override + public void registerObserver(LogicObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(LogicObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers() + { + observers.forEach(ob -> ob.update(this)); + } + +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java new file mode 100644 index 00000000..5b4220a5 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreMux.java @@ -0,0 +1,96 @@ +package net.mograsim.logic.core.components; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +/** + * Models a multiplexer. Takes an arbitrary amount of input {@link CoreWire}s, one of which, as determined by select, is put through to the + * output. + * + * @author Fabian Stemmler + * + */ +public class CoreMux extends BasicCoreComponent +{ + private ReadEnd select; + private ReadWriteEnd out; + private ReadEnd[] inputs; + private final int outputSize; + + /** + * Input {@link CoreWire}s and out must be of uniform width + * + * @param out Must be of uniform width with all inputs. + * @param select Indexes the input array which is to be mapped to the output. Must have enough bits to index all inputs. + * @param inputs One of these inputs is mapped to the output, depending on the select bits + */ + public CoreMux(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd select, ReadEnd... inputs) + { + super(timeline, processTime); + outputSize = out.width(); + + this.inputs = inputs.clone(); + for (int i = 0; i < this.inputs.length; i++) + { + if (inputs[i].width() != outputSize) + throw new IllegalArgumentException("All MUX wire arrays must be of uniform width!"); + inputs[i].registerObserver(this); + } + + this.select = select; + select.registerObserver(this); + + int maxInputs = 1 << select.width(); + if (this.inputs.length > maxInputs) + throw new IllegalArgumentException("There are more inputs (" + this.inputs.length + ") to the MUX than supported by " + + select.width() + " select bits (" + maxInputs + ")."); + + this.out = out; + } + + public ReadEnd getOut() + { + return out; + } + + public ReadEnd getSelect() + { + return select; + } + + @Override + public TimelineEventHandler compute() + { + int selectValue; + if (!select.getValues().isBinary() || (selectValue = (int) select.getValues().getUnsignedValueLong()) >= inputs.length) + { + return e -> out.clearSignals(); + } + + BitVector activeValues = inputs[selectValue].getValues(); + return e -> out.feedSignals(activeValues); + } + + @Override + public List getAllInputs() + { + ArrayList wires = new ArrayList<>(Arrays.asList(inputs)); + wires.add(select); + return Collections.unmodifiableList(wires); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java new file mode 100644 index 00000000..4b7a339f --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreTriStateBuffer.java @@ -0,0 +1,55 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreTriStateBuffer extends BasicCoreComponent +{ + ReadEnd in, enable; + ReadWriteEnd out; + + public CoreTriStateBuffer(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out, ReadEnd enable) + { + super(timeline, processTime); + if (in.width() != out.width()) + throw new IllegalArgumentException( + "Tri-state output must have the same amount of bits as the input. Input: " + in.width() + " Output: " + out.width()); + if (enable.width() != 1) + throw new IllegalArgumentException("Tri-state enable must have exactly one bit, not " + enable.width() + "."); + this.in = in; + in.registerObserver(this); + this.enable = enable; + enable.registerObserver(this); + this.out = out; + } + + @Override + protected TimelineEventHandler compute() + { + if (enable.getValue() == Bit.ONE) + { + BitVector inValues = in.getValues(); + return e -> out.feedSignals(inValues); + } + return e -> out.clearSignals(); + } + + @Override + public List getAllInputs() + { + return List.of(in, enable); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } + +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java new file mode 100644 index 00000000..6e6b0f15 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalMerger.java @@ -0,0 +1,85 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreUnidirectionalMerger extends CoreComponent implements LogicObserver +{ + private ReadWriteEnd out; + private ReadEnd[] inputs; + private int[] beginningIndex; + + /** + * + * @param union The output of merging n {@link CoreWire}s into one. Must have width = a1.width() + a2.width() + ... + an.width(). + * @param inputs The inputs to be merged into the union + */ + public CoreUnidirectionalMerger(Timeline timeline, ReadWriteEnd union, ReadEnd... inputs) + { + super(timeline); + this.inputs = inputs; + this.out = union; + this.beginningIndex = new int[inputs.length]; + + int width = 0; + for (int i = 0; i < inputs.length; i++) + { + beginningIndex[i] = width; + width += inputs[i].width(); + inputs[i].registerObserver(this); + } + + if (width != union.width()) + throw new IllegalArgumentException( + "The output of merging n WireArrays into one must have width = a1.width() + a2.width() + ... + an.width()."); + } + + public ReadEnd getInput(int index) + { + return inputs[index]; + } + + public ReadEnd getUnion() + { + return out; + } + + @Override + public void update(LogicObservable initiator) + { + int index = find(initiator); + int beginning = beginningIndex[index]; + out.feedSignals(beginning, inputs[index].getValues()); + } + + private int find(LogicObservable r) + { + for (int i = 0; i < inputs.length; i++) + if (inputs[i] == r) + return i; + return -1; + } + + public ReadEnd[] getInputs() + { + return inputs.clone(); + } + + @Override + public List getAllInputs() + { + return List.of(inputs); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java new file mode 100644 index 00000000..d77e1541 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/CoreUnidirectionalSplitter.java @@ -0,0 +1,60 @@ +package net.mograsim.logic.core.components; + +import java.util.List; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreUnidirectionalSplitter extends CoreComponent implements LogicObserver +{ + private ReadEnd input; + private ReadWriteEnd[] outputs; + + public CoreUnidirectionalSplitter(Timeline timeline, ReadEnd input, ReadWriteEnd... outputs) + { + super(timeline); + this.input = input; + this.outputs = outputs; + input.registerObserver(this); + int width = 0; + for (ReadEnd out : outputs) + width += out.width(); + + if (input.width() != width) + throw new IllegalArgumentException( + "The input of splitting one into n WireArrays must have width = a1.width() + a2.width() + ... + an.width()."); + } + + protected void compute() + { + BitVector inputBits = input.getValues(); + int startIndex = 0; + for (int i = 0; i < outputs.length; i++) + { + outputs[i].feedSignals(inputBits.subVector(startIndex, startIndex + outputs[i].width())); + startIndex += outputs[i].width(); + } + } + + @Override + public void update(LogicObservable initiator) + { + compute(); + } + + @Override + public List getAllInputs() + { + return List.of(input); + } + + @Override + public List getAllOutputs() + { + return List.of(outputs); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java new file mode 100644 index 00000000..d71e08e1 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreAndGate.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreAndGate extends MultiInputCoreGate +{ + public CoreAndGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::and, out, in); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java new file mode 100644 index 00000000..e847d0ec --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNandGate.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreNandGate extends MultiInputCoreGate +{ + public CoreNandGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::and, true, out, in); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java new file mode 100644 index 00000000..12336274 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNorGate.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreNorGate extends MultiInputCoreGate +{ + public CoreNorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::or, true, out, in); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java new file mode 100644 index 00000000..b7808be9 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreNotGate.java @@ -0,0 +1,53 @@ +package net.mograsim.logic.core.components.gates; + +import java.util.List; + +import net.mograsim.logic.core.components.BasicCoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreNotGate extends BasicCoreComponent +{ + private ReadEnd in; + private ReadWriteEnd out; + + public CoreNotGate(Timeline timeline, int processTime, ReadEnd in, ReadWriteEnd out) + { + super(timeline, processTime); + this.in = in; + in.registerObserver(this); + this.out = out; + } + + @Override + protected TimelineEventHandler compute() + { + BitVector values = in.getValues().not(); + return e -> out.feedSignals(values); + } + + public ReadEnd getIn() + { + return in; + } + + public ReadEnd getOut() + { + return out; + } + + @Override + public List getAllInputs() + { + return List.of(in); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java new file mode 100644 index 00000000..97d75c80 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreOrGate.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public class CoreOrGate extends MultiInputCoreGate +{ + public CoreOrGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::or, out, in); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java new file mode 100644 index 00000000..8bc98934 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/CoreXorGate.java @@ -0,0 +1,20 @@ +package net.mograsim.logic.core.components.gates; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +/** + * Outputs 1 when the number of 1 inputs is odd. + * + * @author Fabian Stemmler + */ +public class CoreXorGate extends MultiInputCoreGate +{ + public CoreXorGate(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime, BitVectorMutator::xor, out, in); + } + +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java new file mode 100644 index 00000000..010ae74f --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/components/gates/MultiInputCoreGate.java @@ -0,0 +1,64 @@ +package net.mograsim.logic.core.components.gates; + +import java.util.List; + +import net.mograsim.logic.core.components.BasicCoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.logic.core.types.MutationOperation; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +public abstract class MultiInputCoreGate extends BasicCoreComponent +{ + protected ReadEnd[] in; + protected ReadWriteEnd out; + protected final int width; + protected MutationOperation op; + protected boolean invert = false; + + protected MultiInputCoreGate(Timeline timeline, int processTime, MutationOperation op, ReadWriteEnd out, ReadEnd... in) + { + super(timeline, processTime); + this.op = op; + width = out.width(); + this.in = in.clone(); + if (in.length < 1) + throw new IllegalArgumentException(String.format("Cannot create gate with %d wires.", in.length)); + for (ReadEnd w : in) + { + if (w.width() != width) + throw new IllegalArgumentException("All wires connected to the gate must be of uniform length."); + w.registerObserver(this); + } + this.out = out; + } + + protected MultiInputCoreGate(Timeline timeline, int processTime, MutationOperation op, boolean invert, ReadWriteEnd out, ReadEnd... in) + { + this(timeline, processTime, op, out, in); + this.invert = invert; + } + + @Override + public List getAllInputs() + { + return List.of(in); + } + + @Override + public List getAllOutputs() + { + return List.of(out); + } + + @Override + public TimelineEventHandler compute() + { + BitVectorMutator mutator = BitVectorMutator.empty(); + for (ReadEnd w : in) + op.apply(mutator, w.getValues()); + return e -> out.feedSignals(invert ? mutator.toBitVector().not() : mutator.toBitVector()); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java new file mode 100644 index 00000000..9dbc31d4 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/Timeline.java @@ -0,0 +1,256 @@ +package net.mograsim.logic.core.timeline; + +import java.util.ArrayList; +import java.util.List; +import java.util.PriorityQueue; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; +import java.util.function.LongSupplier; + +/** + * Orders Events by the time they are due to be executed. Can execute Events individually. + * + * @author Fabian Stemmler + * + */ +public class Timeline +{ + private PriorityQueue events; + private LongSupplier time; + private long lastTimeUpdated = 0; + private long eventCounter = 0; + + private final List> eventAddedListener; + + public final LongSupplier stepByStepExec = () -> lastTimeUpdated; + public final LongSupplier realTimeExec = () -> System.currentTimeMillis(); + + /** + * Constructs a Timeline object. Per default the time function is set to step by step execution. + * + * @param initCapacity The initial capacity of the event queue. + */ + public Timeline(int initCapacity) + { + events = new PriorityQueue<>(initCapacity); + eventAddedListener = new ArrayList<>(); + time = stepByStepExec; + } + + /** + * @param timestamp exclusive + * @return true if the first event in queue is later than the given timestamp + */ + public BooleanSupplier laterThan(long timestamp) + { + return () -> timeCmp(events.peek().getTiming(), timestamp) > 0; + } + + /** + * @return true if there is at least one event enqueued. false otherwise + */ + public boolean hasNext() + { + return !events.isEmpty(); + } + + /** + * Executes all events at the next timestamp, at which there are any + */ + public void executeNext() + { + InnerEvent first = events.peek(); + if (first != null) + executeUntil(laterThan(first.getTiming()), -1); + } + + /** + * Executes all events enqueued in the {@link Timeline}. Use very carefully! Events may generate new events, causing an infinite loop. + */ + public void executeAll() + { + while (hasNext()) + executeNext(); + } + + /** + * Executes all events until a given condition is met. The simulation process can be constrained by a real world timestamp. + * + * @param condition the condition until which the events are be processed + * @param stopMillis the System.currentTimeMillis() when simulation definitely needs to stop. A value of -1 means no timeout. + * @return State of the event execution + * @formatter:off + * NOTHING_DONE if the {@link Timeline} was already empty + * EXEC_OUT_OF_TIME if the given maximum time was reached + * EXEC_UNTIL_CONDITION if the condition was met + * EXEC_UNTIL_EMPTY if events were executed until the {@link Timeline} was empty + * @formatter:on + */ + public ExecutionResult executeUntil(BooleanSupplier condition, long stopMillis) + { + if (events.isEmpty()) + { + lastTimeUpdated = getSimulationTime(); + return ExecutionResult.NOTHING_DONE; + } + int checkStop = 0; + while (hasNext() && !condition.getAsBoolean()) + { + InnerEvent event; + synchronized (events) + { + event = events.remove(); + } + lastTimeUpdated = event.getTiming(); + event.run(); + // Don't check after every run + checkStop = (checkStop + 1) % 10; + if (checkStop == 0 && System.currentTimeMillis() >= stopMillis) + return ExecutionResult.EXEC_OUT_OF_TIME; + } + lastTimeUpdated = getSimulationTime(); + return hasNext() ? ExecutionResult.EXEC_UNTIL_EMPTY : ExecutionResult.EXEC_UNTIL_CONDITION; + } + + /** + * Sets the function, which defines the current simulation time at any time. + * + * @param time The return value of calling this function is the current simulation time. + */ + public void setTimeFunction(LongSupplier time) + { + this.time = time; + } + + /** + * Calculates the current simulation time. + * + * @return The simulation time as defined by the time function. + */ + public long getSimulationTime() + { + return time.getAsLong(); + } + + /** + * Retrieves the timestamp of the next event. + * + * @return The timestamp of the next enqueued event, if the {@link Timeline} is not empty, -1 otherwise. + */ + public long nextEventTime() + { + if (!hasNext()) + return -1; + return events.peek().getTiming(); + } + + /** + * Clears the {@link Timeline} of enqueued events. + */ + public void reset() + { + synchronized (events) + { + events.clear(); + } + lastTimeUpdated = 0; + } + + /** + * Adds a listener, that is called when a {@link TimelineEvent} is added. + */ + public void addEventAddedListener(Consumer listener) + { + eventAddedListener.add(listener); + } + + /** + * Removes the listener, if possible. It will no longer be called when a {@link TimelineEvent} is added. + */ + public void removeEventAddedListener(Consumer listener) + { + eventAddedListener.remove(listener); + } + + /** + * Adds an Event to the {@link Timeline} + * + * @param function The {@link TimelineEventHandler} that will be executed, when the {@link InnerEvent} occurs on the timeline. + * @param relativeTiming The amount of MI ticks in which the {@link InnerEvent} is called, starting from the current time. + */ + public void addEvent(TimelineEventHandler function, int relativeTiming) + { + long timing = getSimulationTime() + relativeTiming; + TimelineEvent event = new TimelineEvent(timing); + synchronized (events) + { + events.add(new InnerEvent(function, event, eventCounter++)); + } + eventAddedListener.forEach(l -> l.accept(event)); + } + + private class InnerEvent implements Runnable, Comparable + { + private final TimelineEventHandler function; + private final TimelineEvent event; + private final long id; + + /** + * Creates an {@link InnerEvent} + * + * @param function {@link TimelineEventHandler} to be executed when the {@link InnerEvent} occurs + * @param timing Point in the MI simulation {@link Timeline}, at which the {@link InnerEvent} is executed; + */ + InnerEvent(TimelineEventHandler function, TimelineEvent event, long id) + { + this.function = function; + this.event = event; + this.id = id; + } + + public long getTiming() + { + return event.getTiming(); + } + + @Override + public void run() + { + function.handle(event); + } + + @Override + public String toString() + { + return event.toString(); + } + + @Override + public int compareTo(InnerEvent o) + { + int c1; + return (c1 = timeCmp(getTiming(), o.getTiming())) == 0 ? timeCmp(id, o.id) : c1; + } + } + + public static int timeCmp(long a, long b) + { + return Long.signum(a - b); + } + + @Override + public String toString() + { + String eventsString; + synchronized (events) + { + eventsString = events.toString(); + } + return String.format("Simulation time: %s, Last update: %d, Events: %s", getSimulationTime(), lastTimeUpdated, eventsString); + } + + public enum ExecutionResult + { + NOTHING_DONE, EXEC_UNTIL_EMPTY, EXEC_UNTIL_CONDITION, EXEC_OUT_OF_TIME + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java new file mode 100644 index 00000000..c46e6ad6 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEvent.java @@ -0,0 +1,30 @@ +package net.mograsim.logic.core.timeline; + +/** + * A class that stores all relevant information about an event in the {@link Timeline}. Currently, there is not much relevant information to + * store. + * + * @author Fabian Stemmler + * + */ +public class TimelineEvent +{ + private final long timing; + + TimelineEvent(long timing) + { + super(); + this.timing = timing; + } + + public long getTiming() + { + return timing; + } + + @Override + public String toString() + { + return "timestamp: " + timing; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java new file mode 100644 index 00000000..badbabcb --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/timeline/TimelineEventHandler.java @@ -0,0 +1,7 @@ +package net.mograsim.logic.core.timeline; + +@FunctionalInterface +public interface TimelineEventHandler +{ + public void handle(TimelineEvent e); +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java new file mode 100644 index 00000000..752fbb80 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/Bit.java @@ -0,0 +1,181 @@ +package net.mograsim.logic.core.types; + +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; + +/** + * stdlogic according to IEEE 1164 + */ +public enum Bit implements StrictLogicType +{ + U("U"), X("X"), ZERO("0"), ONE("1"), Z("Z"); + + private final String symbol; + + private Bit(String symbol) + { + this.symbol = symbol; + } + + /** + * Returns if the Bit is binary, this is only true for ZERO and ONE. + * + * @return true if and only if this == ONE || this == ZERO + */ + public boolean isBinary() + { + return this == ONE || this == ZERO; + } + + @Override + public Bit and(Bit other) + { + return fromTable(AND_TABLE, this, other); + } + + public static void and(Bit[] dst, Bit[] src) + { + for (int i = 0; i < dst.length; i++) + dst[i] = dst[i].and(src[i]); + } + + @Override + public Bit or(Bit other) + { + return fromTable(OR_TABLE, this, other); + } + + public static void or(Bit[] dst, Bit[] src) + { + for (int i = 0; i < dst.length; i++) + dst[i] = dst[i].or(src[i]); + } + + @Override + public Bit xor(Bit other) + { + return fromTable(XOR_TABLE, this, other); + } + + public static void xor(Bit[] dst, Bit[] src) + { + for (int i = 0; i < dst.length; i++) + dst[i] = dst[i].xor(src[i]); + } + + @Override + public Bit not() + { + switch (this) + { + case U: + return U; + case ONE: + return ZERO; + case ZERO: + return ONE; + default: + return X; + } + } + + public Bit[] makeArray(int length) + { + Bit[] bits = new Bit[length]; + Arrays.fill(bits, this); + return bits; + } + + public BitVector toVector() + { + return BitVector.of(this, 1); + } + + public BitVector toVector(int length) + { + return BitVector.of(this, length); + } + + @Override + public Bit join(Bit other) + { + return fromTable(JOIN_TABLE, this, other); + } + + public static void join(Bit[] dst, Bit[] src) + { + for (int i = 0; i < dst.length; i++) + dst[i] = dst[i].join(src[i]); + } + + @Override + public String toString() + { + return getSymbol(); + } + + public String getSymbol() + { + return symbol; + } + + public static Bit lastBitOf(int value) + { + return values()[2 + (value & 1)]; + } + + public static Bit of(boolean binaryValue) + { + return binaryValue ? ONE : ZERO; + } + + public static Bit parse(String s) + { + Bit bit = SYMBOL_MAP.get(s); + Objects.requireNonNull(bit, "No Bit found for symbol " + s); + return bit; + } + + public static Bit parse(String s, int symbolPosition) + { + return parse(s.substring(symbolPosition, symbolPosition + 1)); + } + + private static Bit fromTable(Bit[][] table, Bit a, Bit b) + { + return table[a.ordinal()][b.ordinal()]; + } + + static final Map SYMBOL_MAP = Map.of(U.symbol, U, X.symbol, X, ZERO.symbol, ZERO, ONE.symbol, ONE, Z.symbol, Z); + + // @formatter:off + private static final Bit[][] JOIN_TABLE = + { { U, U, U, U, U }, + { U, X, X, X, X }, + { U, X, ZERO, X, ZERO }, + { U, X, X, ONE, ONE }, + { U, X, ZERO, ONE, Z } }; + + private static final Bit[][] AND_TABLE = + { { U, U, ZERO, U, U }, + { U, X, ZERO, X, X }, + { ZERO, ZERO, ZERO, ZERO, ZERO }, + { U, X, ZERO, ONE, X }, + { U, X, ZERO, X, X } }; + + private static final Bit[][] OR_TABLE = + { { U, U, U, ONE, U }, + { U, X, X, ONE, X }, + { U, X, ZERO, ONE, X }, + { ONE, ONE, ONE, ONE, ONE }, + { U, X, X, ONE, X } }; + + private static final Bit[][] XOR_TABLE = + { { U, U, U, U, U }, + { U, X, X, X, X }, + { U, X, ZERO, ONE, X }, + { U, X, ONE, ZERO, X }, + { U, X, X, X, X } }; + // @formatter:on +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java new file mode 100644 index 00000000..13466949 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java @@ -0,0 +1,530 @@ +package net.mograsim.logic.core.types; + +import static java.lang.String.format; + +import java.math.BigInteger; +import java.util.Arrays; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.RandomAccess; +import java.util.function.BinaryOperator; +import java.util.function.UnaryOperator; + +/** + * Immutable class representing a {@link Bit}Vector + * + * @author Christian Femers + * + */ +public final class BitVector implements StrictLogicType, Iterable, RandomAccess +{ + public static final BitVector SINGLE_U = new BitVector(Bit.U); + public static final BitVector SINGLE_X = new BitVector(Bit.X); + public static final BitVector SINGLE_0 = new BitVector(Bit.ZERO); + public static final BitVector SINGLE_1 = new BitVector(Bit.ONE); + public static final BitVector SINGLE_Z = new BitVector(Bit.Z); + + private static final BitVector[] SINGLE_BIT_MAPPING = { SINGLE_U, SINGLE_X, SINGLE_0, SINGLE_1, SINGLE_Z }; + + private final Bit[] bits; + + private BitVector(Bit single) + { + Objects.requireNonNull(single); + bits = new Bit[] { single }; + } + + private BitVector(Bit[] bits) + { + this.bits = Objects.requireNonNull(bits); // do this first to "catch" bits==null before the foreach loop + for (Bit bit : bits) + if (bit == null) + throw new NullPointerException(); + } + + public static BitVector of(Bit... bits) + { + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].ordinal()]; + return new BitVector(bits.clone()); + } + + public static BitVector of(Bit bit, int length) + { + if (length == 1) + return SINGLE_BIT_MAPPING[bit.ordinal()]; + return new BitVector(bit.makeArray(length)); + } + + public static BitVector from(long value, int bits) + { + return from(BigInteger.valueOf(value), bits); + } + + public static BitVector from(BigInteger value, int bits) + { + Bit[] values = new Bit[bits]; + for (int i = 0; i < bits; i++) + values[bits - i - 1] = Bit.of(value.testBit(i)); + return new BitVector(values); + } + + public BitVectorMutator mutator() + { + return BitVectorMutator.of(this); + } + + /** + * Returns the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) + */ + public Bit getMSBit(int bitIndex) + { + return bits[bitIndex]; + } + + /** + * Returns the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) + */ + public Bit getLSBit(int bitIndex) + { + return bits[bits.length - bitIndex - 1]; + } + + public Bit[] getBits() + { + return bits.clone(); + } + + /** + * Checks if all bits are {@link Bit#isBinary() binary}. + * + * @see Bit#isBinary() + */ + public boolean isBinary() + { + for (int i = 0; i < bits.length; i++) + { + if (!bits[i].isBinary()) + return false; + } + return true; + } + + @Override + public BitVector join(BitVector t) + { + checkCompatibility(t); + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].join(t.bits[0]).ordinal()]; + return new BitVector(binOp(bits.clone(), t.bits, Bit::join)); + } + + @Override + public BitVector and(BitVector t) + { + checkCompatibility(t); + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].and(t.bits[0]).ordinal()]; + return new BitVector(binOp(bits.clone(), t.bits, Bit::and)); + } + + @Override + public BitVector or(BitVector t) + { + checkCompatibility(t); + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].or(t.bits[0]).ordinal()]; + return new BitVector(binOp(bits.clone(), t.bits, Bit::or)); + } + + @Override + public BitVector xor(BitVector t) + { + checkCompatibility(t); + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].xor(t.bits[0]).ordinal()]; + return new BitVector(binOp(bits.clone(), t.bits, Bit::xor)); + } + + @Override + public BitVector not() + { + if (bits.length == 1) + return SINGLE_BIT_MAPPING[bits[0].not().ordinal()]; + return new BitVector(unOp(bits.clone(), Bit::not)); + } + + public int length() + { + return bits.length; + } + + public BitVector concat(BitVector other) + { + Bit[] newBits = Arrays.copyOf(bits, length() + other.length()); + System.arraycopy(other.bits, 0, newBits, length(), other.length()); + return new BitVector(newBits); + } + + public BitVector subVector(int start) + { + return new BitVector(Arrays.copyOfRange(bits, start, length())); + } + + public BitVector subVector(int start, int end) + { + return new BitVector(Arrays.copyOfRange(bits, start, end)); + } + + private void checkCompatibility(BitVector bv) + { + if (length() != bv.length()) + throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", length(), bv.length())); + } + + static Bit[] binOp(Bit[] dest, Bit[] second, BinaryOperator op) + { + if (dest == null) + return second.clone(); + for (int i = 0; i < dest.length; i++) + { + dest[i] = op.apply(dest[i], second[i]); + } + return dest; + } + + static Bit[] unOp(Bit[] dest, UnaryOperator op) + { + if (dest == null) + return null; + for (int i = 0; i < dest.length; i++) + { + dest[i] = op.apply(dest[i]); + } + return dest; + } + + /** + * Class for comfortable and efficient manipulation of {@link BitVector}s, similar to {@link StringBuilder} + * + * @author Christian Femers + */ + public static final class BitVectorMutator implements LogicType + { + private Bit[] bits; + + private BitVectorMutator(Bit[] bits) + { + this.bits = bits; + } + + static BitVectorMutator of(BitVector bv) + { + return new BitVectorMutator(bv.getBits()); + } + + /** + * Returns a new mutator of the specified length, with all bits set to null. Use with care! + */ + public static BitVectorMutator ofLength(int length) + { + return new BitVectorMutator(new Bit[length]); + } + + /** + * Returns an empty mutator which has no bits set and will simply copy the values from the first binary operation performed. + *

+ * An empty BitVectorMutator must not be converted to BitVector or used to manipulate single bits until at least one two + * operand logic operation is performed. + */ + public static BitVectorMutator empty() + { + return new BitVectorMutator(null); + } + + /** + * @see #empty() + */ + public boolean isEmpty() + { + return bits == null; + } + + /** + * Produces the resulting, immutable {@link BitVector}
+ * + * @throws IllegalStateException if the mutator is (still) empty + */ + public BitVector toBitVector() + { + if (bits == null) + throw new IllegalStateException("cannot create a BitVector from an empty mutator"); + return new BitVector(bits); + } + + @Override + public BitVectorMutator join(BitVector t) + { + checkCompatibility(t); + bits = binOp(bits, t.bits, Bit::join); + return this; + } + + @Override + public BitVectorMutator and(BitVector t) + { + checkCompatibility(t); + bits = binOp(bits, t.bits, Bit::and); + return this; + } + + @Override + public BitVectorMutator or(BitVector t) + { + checkCompatibility(t); + bits = binOp(bits, t.bits, Bit::or); + return this; + } + + @Override + public BitVectorMutator xor(BitVector t) + { + checkCompatibility(t); + bits = binOp(bits, t.bits, Bit::xor); + return this; + } + + @Override + public BitVectorMutator not() + { + unOp(bits, Bit::not); + return this; + } + + /** + * Set the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) + */ + public void setMSBit(int bitIndex, Bit bit) + { + if (bits == null) + throw new IllegalStateException("cannot set a bit of an empty mutator"); + bits[bitIndex] = bit; + } + + /** + * Set the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) + */ + public void setLSBit(int bitIndex, Bit bit) + { + if (bits == null) + throw new IllegalStateException("cannot set a bit of an empty mutator"); + bits[bits.length - bitIndex - 1] = bit; + } + + /** + * Returns the most significant bit at bitIndex. (leftmost bit of a binary number at the given index) + */ + public Bit getMSBit(int bitIndex) + { + if (bits == null) + throw new IllegalStateException("cannot get a bit of an empty mutator"); + return bits[bitIndex]; + } + + /** + * Returns the least significant bit at bitIndex. (rightmost bit of a binary number at the given index) + */ + public Bit getLSBit(int bitIndex) + { + if (bits == null) + throw new IllegalStateException("cannot get a bit of an empty mutator"); + return bits[bits.length - bitIndex - 1]; + } + + public int length() + { + if (bits == null) + throw new IllegalStateException("cannot obtain a length of an empty mutator"); + return bits.length; + } + + private void checkCompatibility(BitVector bv) + { + if (bits != null && bits.length != bv.length()) + throw new IllegalArgumentException(format("BitVector length does not match: %d and %d", bits.length, bv.length())); + } + } + + /** + * @see Arrays#hashCode(Object[]) + */ + @Override + public int hashCode() + { + return Arrays.hashCode(bits); + } + + /** + * Does test for equality of values/content + * + * @see Object#equals(Object) + */ + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof BitVector)) + return false; + BitVector other = (BitVector) obj; + return Arrays.equals(bits, other.bits); + } + + /** + * Does test for equality of values/content, shifting the other BitVector by offset to the right.
+ * Therefore offset + other.length() <= this.wdith() needs to be true. + * + * @throws ArrayIndexOutOfBoundsException if offset + other.length() > this.length() + * + * @see Object#equals(Object) + */ + public boolean equalsWithOffset(BitVector other, int offset) + { + if (other == null) + return false; + return Arrays.equals(bits, offset, offset + other.length(), other.bits, 0, other.length()); + } + + /** + * All {@link Bit}s symbols concatenated together (MSB first) + * + * @see #parse(String) + */ + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(bits.length); + for (Bit bit : bits) + sb.append(bit); + return sb.toString(); + } + + /** + * Returns the value of the BitVector as BigInteger. + * + * @throws NumberFormatException if the BitVector is not {@link #isBinary() binary}. + */ + public BigInteger getUnsignedValue() + { + if (!isBinary()) + throw new NumberFormatException(this + " is not binary"); + byte[] bytes = new byte[(bits.length / 8 + (bits.length % 8 == 0 ? 0 : 1)) + 1]; + for (int i = bits.length - 1; i >= 0; i--) + { + if (Bit.ONE == bits[bits.length - i - 1]) + { + try + { + bytes[bytes.length - (i / 8) - 1] |= 1 << (i % 8); + } + catch (IndexOutOfBoundsException e) + { + e.printStackTrace(); + } + } + } + return new BigInteger(bytes); + } + + public long getUnsignedValueLong() + { + return getUnsignedValue().longValue(); + } + + /** + * Returns the value of the BitVector as BigInteger interpreted as a two's complement number. + * + * @throws NumberFormatException if the BitVector is not {@link #isBinary() binary}. + * + * @author Daniel Kirschten + */ + public BigInteger getSignedValue() + { + BigInteger unsignedValue = getUnsignedValue(); + if (bits[bits.length - 1] == Bit.ZERO) + return unsignedValue; + return unsignedValue.subtract(BitVector.of(Bit.ONE, bits.length).getUnsignedValue()).subtract(BigInteger.ONE);// TODO speed this up! + } + + public long getSignedValueLong() + { + return getSignedValue().longValue(); + } + + /** + * Parses a String containing solely {@link Bit} symbols (MSB first) + * + * @see #toString() + */ + public static BitVector parse(String s) + { + Bit[] values = new Bit[s.length()]; + for (int i = 0; i < s.length(); i++) + { + values[i] = Bit.parse(s, i); + } + return new BitVector(values); + } + + /** + * Changes a single Bit using the given operation. This can be used to set, clear or flip bits. + * + * @param msbIndex index of the MSB to be changed + * @param singleBitOperation the operation to perform on that Bit + * @return the resulting, new BitVektor + */ + public BitVector withBitChanged(int msbIndex, UnaryOperator singleBitOperation) + { + Bit[] newBits = bits.clone(); + newBits[msbIndex] = singleBitOperation.apply(newBits[msbIndex]); + return new BitVector(newBits); + } + + /** + * Iterate over the {@link Bit}s of the BitVector from MSB to LSB (left to right). + */ + @Override + public Iterator iterator() + { + return new Iterator<>() + { + private int pos = 0; + + @Override + public Bit next() + { + if (!hasNext()) + throw new NoSuchElementException(); + return getMSBit(pos++); + } + + @Override + public boolean hasNext() + { + return pos != length(); + } + }; + } + + public BitVector reverse() + { + int length = length(); + Bit[] other = new Bit[length]; + for (int i = 0, j = length - 1; i < length; i++, j--) + { + other[i] = bits[j]; + } + return new BitVector(other); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java new file mode 100644 index 00000000..5f645a2e --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVectorFormatter.java @@ -0,0 +1,54 @@ +package net.mograsim.logic.core.types; + +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorDefinition.BuiltInColor; +import net.mograsim.preferences.Preferences; + +public class BitVectorFormatter +{ + public static String formatValueAsString(ReadEnd end) + { + return formatAsString(end == null ? null : end.getValues()); + } + + public static String formatAsString(BitVector bitVector) + { + if (bitVector == null) + return "null"; + return bitVector.toString(); + } + + // TODO doesn't this belong to logic.model? + public static ColorDefinition formatAsColor(ReadEnd end) + { + return formatAsColor(end == null ? null : end.getValues()); + } + + public static ColorDefinition formatAsColor(BitVector bitVector) + { + // TODO maybe find a color assignment for multiple-bit bit vectors? + if (bitVector == null || bitVector.length() != 1) + return new ColorDefinition(BuiltInColor.COLOR_BLACK); + switch (bitVector.getLSBit(0)) + { + case ONE: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.one"); + case U: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.u"); + case X: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.x"); + case Z: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.z"); + case ZERO: + return Preferences.current().getColorDefinition("net.mograsim.logic.model.color.bit.zero"); + default: + throw new IllegalArgumentException("Unknown enum constant: " + bitVector.getLSBit(0)); + } + } + + private BitVectorFormatter() + { + throw new UnsupportedOperationException("No BitVectorFormatter instances"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java new file mode 100644 index 00000000..39ae6816 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/LogicType.java @@ -0,0 +1,130 @@ +package net.mograsim.logic.core.types; + +/** + * Interface for types that support the basic logic operations + * + * @author Christian Femers + * + * @param the logic type itself, to make the operations closed in T + * @param the operand type, may be the same as T, see {@link StrictLogicType} + */ +public interface LogicType, S> +{ + /** + * Determines the result when two signals meet each other directly, also called resolution (IEEE 1164) + * + * For example: + * + *

+	 * 0 joined 0 == 0
+	 * 1 joined 0 == X
+	 * 0 joined 1 == X
+	 * 1 joined 1 == 1
+	 * 
+ * + * @param t the second logic signal + * @return the resulting value + * @author Christian Femers + */ + T join(S t); + + /** + * Classical logic AND + * + * For example: + * + *
+	 * 0 AND 0 == 0
+	 * 1 AND 0 == 0
+	 * 0 AND 1 == 0
+	 * 1 AND 1 == 1
+	 * 
+ * + * @param t the second logic signal + * @return the resulting value + * @author Christian Femers + */ + T and(S t); + + /** + * Classical logic OR + * + * For example: + * + *
+	 * 0 OR 0 == 0
+	 * 1 OR 0 == 1
+	 * 0 OR 1 == 1
+	 * 1 OR 1 == 1
+	 * 
+ * + * @param t the second logic signal + * @return the resulting value + * @author Christian Femers + */ + T or(S t); + + /** + * Classical logic XOR (exclusive OR) + * + * For example: + * + *
+	 * 0 XOR 0 == 0
+	 * 1 XOR 0 == 1
+	 * 0 XOR 1 == 1
+	 * 1 XOR 1 == 0
+	 * 
+ * + * @param t the second logic signal + * @return the resulting value + * @author Christian Femers + */ + T xor(S t); + + /** + * Classical logic NOT (logical negation) + * + * For example: + * + *
+	 * NOT 0 == 1
+	 * NOT 1 == 0
+	 * 
+ * + * @return the resulting value + * @author Christian Femers + */ + T not(); + + /** + * {@link #and(Object) AND} and then {@link #not() NOT} + * + * @author Christian Femers + */ + default T nand(S t) + { + return and(t).not(); + } + + /** + * {@link #or(Object) OR} and then {@link #not() NOT} + * + * @author Christian Femers + */ + default T nor(S t) + { + return or(t).not(); + } + + /** + * {@link #xor(Object) XOR} and then {@link #not() NOT}
+ * Used to determine equality (alias parity, consistency) + * + * @author Christian Femers + */ + default T xnor(S t) + { + return xor(t).not(); + } +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java new file mode 100644 index 00000000..1fdae21c --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/MutationOperation.java @@ -0,0 +1,11 @@ +package net.mograsim.logic.core.types; + +import java.util.function.BiFunction; + +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; + +@FunctionalInterface +public interface MutationOperation extends BiFunction +{ + // no changes necessary, only for convenience and readability +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java new file mode 100644 index 00000000..c830b586 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/types/StrictLogicType.java @@ -0,0 +1,14 @@ +package net.mograsim.logic.core.types; + +/** + * Interface for types that support the basic logic operations only among themselves, making it mathematically closed + * + * @author Christian Femers + * @see LogicType + * + * @param the logic type itself to make the operations closed + */ +public interface StrictLogicType> extends LogicType +{ + // this is just a matter of type parameters +} diff --git a/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java new file mode 100644 index 00000000..13f54a01 --- /dev/null +++ b/plugins/net.mograsim.logic.core/src/net/mograsim/logic/core/wires/CoreWire.java @@ -0,0 +1,662 @@ +package net.mograsim.logic.core.wires; + +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.Z; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import net.mograsim.logic.core.LogicObservable; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; + +/** + * Represents an array of wires that can store n bits of information. + * + * @author Fabian Stemmler + * + */ +public class CoreWire +{ + public final String name; + private BitVector cachedValues; + public final int travelTime; + private List attached = new ArrayList<>(); + public final int width; + List inputs = new ArrayList<>(); + Timeline timeline; + private Bit[] bitsWithoutFusions; + FusedBit[] fusedBits; + + public CoreWire(Timeline timeline, int width, int travelTime) + { + this(timeline, width, travelTime, null); + } + + public CoreWire(Timeline timeline, int width, int travelTime, String name) + { + if (width < 1) + throw new IllegalArgumentException( + String.format("Tried to create an array of wires with width %d, but a width of less than 1 makes no sense.", width)); + this.name = name; + this.timeline = timeline; + this.width = width; + this.travelTime = travelTime; + initValues(); + } + + private void initValues() + { + cachedValues = U.toVector(width); + bitsWithoutFusions = cachedValues.getBits(); + } + + private void setNewValues(BitVector newValues) + { + cachedValues = newValues; + notifyObservers(); + } + + private void invalidateCachedValuesForAllFusedWires() + { + invalidateCachedValues(); + if (fusedBits != null) + for (FusedBit fusion : fusedBits) + if (fusion != null) + fusion.invalidateCachedValuesForAllParticipatingWires(); + } + + private void invalidateCachedValues() + { + cachedValues = null; + notifyObservers(); + } + + void recalculateValuesWithoutFusions() + { + Bit[] bits = new Bit[width]; + if (inputs.isEmpty()) + Arrays.fill(bits, U); + else + { + System.arraycopy(inputs.get(0).getInputValues().getBits(), 0, bits, 0, width); + for (int i = 1; i < inputs.size(); i++) + Bit.join(bits, inputs.get(i).getInputValues().getBits()); + } + bitsWithoutFusions = bits; + if (fusedBits == null) + setNewValues(BitVector.of(bits)); + else + invalidateCachedValuesForAllFusedWires(); + } + + private void recalculatedCachedValues() + { + Bit[] bits; + if (fusedBits == null) + bits = bitsWithoutFusions; + else + { + bits = new Bit[width]; + for (int i = 0; i < width; i++) + { + FusedBit fusion = fusedBits[i]; + if (fusion == null) + bits[i] = bitsWithoutFusions[i]; + else + bits[i] = fusion.getValue(); + } + } + cachedValues = BitVector.of(bits); + } + + /** + * Forces a Wire to take on specific values. If the new values differ from the old ones, the observers of the Wire will be notified. + * WARNING! Use this with care! The preferred way of writing the values is ReadWriteEnd.feedSignals(BitVector) + * + * @param values The values the Wire will have immediately after this method is called + */ + public void forceValues(BitVector values) + { + bitsWithoutFusions = values.getBits(); + invalidateCachedValuesForAllFusedWires(); + notifyObservers(); + } + + /** + * Returns the least significant bit (LSB) + */ + public Bit getValue() + { + return getValue(0); + } + + /** + * Returns the least significant bit (LSB) of the given index + */ + public Bit getValue(int index) + { + return getValues().getLSBit(index); + } + + public BitVector getValues(int start, int end) + { + return getValues().subVector(start, end); + } + + public BitVector getValues() + { + if (cachedValues == null) + recalculatedCachedValues(); + return cachedValues; + } + + /** + * Adds an {@link LogicObserver}, who will be notified when the value of the {@link CoreWire} is updated. + * + * @param ob The {@link LogicObserver} to be notified of changes. + * @return true if the given {@link LogicObserver} was not already registered, false otherwise + * + * @author Fabian Stemmler + */ + boolean attachEnd(ReadEnd end) + { + return attached.add(end); + } + + void detachEnd(ReadEnd end) + { + attached.remove(end); + } + + private void notifyObservers() + { + attached.forEach(ReadEnd::update); + } + + /** + * Create and register a {@link ReadWriteEnd} object, which is tied to this {@link CoreWire}. This {@link ReadWriteEnd} can be written + * to. + */ + public ReadWriteEnd createReadWriteEnd() + { + return new ReadWriteEnd(); + } + + /** + * Create a {@link ReadEnd} object, which is tied to this {@link CoreWire}. This {@link ReadEnd} cannot be written to. + */ + public ReadEnd createReadOnlyEnd() + { + return new ReadEnd(); + } + + void registerInput(ReadWriteEnd toRegister) + { + inputs.add(toRegister); + recalculateValuesWithoutFusions(); + } + + /** + * A {@link ReadEnd} feeds a constant signal into the {@link CoreWire} it is tied to. The combination of all inputs determines the + * {@link CoreWire}s final value. X dominates all other inputs Z does not affect the final value, unless there are no other inputs than + * Z 0 and 1 turn into X when they are mixed + * + * @author Fabian Stemmler + */ + public class ReadEnd implements LogicObservable + { + private List observers = new ArrayList<>(); + + ReadEnd() + { + super(); + CoreWire.this.attachEnd(this); + } + + public void update() + { + notifyObservers(); + } + + /** + * Included for convenient use on {@link CoreWire}s of width 1. + * + * @return The value of bit 0. + * + * @author Fabian Stemmler + */ + public Bit getValue() + { + return CoreWire.this.getValue(); + } + + /** + * @param index Index of the requested bit. + * @return The value of the indexed bit. + * + * @author Fabian Stemmler + */ + public Bit getValue(int index) + { + return CoreWire.this.getValue(index); + } + + public BitVector getValues() + { + return CoreWire.this.getValues(); + } + + /** + * @param start Start of the wanted segment. (inclusive) + * @param end End of the wanted segment. (exclusive) + * @return The values of the segment of {@link Bit}s indexed. + * + * @author Fabian Stemmler + */ + public BitVector getValues(int start, int end) + { + return CoreWire.this.getValues(start, end); + } + + @Override + public String toString() + { + return CoreWire.this.toString(); + } + + public void close() + { + inputs.remove(this); + detachEnd(this); + recalculateValuesWithoutFusions(); + } + + public int width() + { + return width; + } + + public CoreWire getWire() + { + return CoreWire.this; + } + + @Override + public void registerObserver(LogicObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(LogicObserver ob) + { + observers.remove(ob); + } + +// void registerCloseObserver(LogicObserver ob) +// { +// closeObserver.add(ob); +// } +// +// void deregisterCloseObserver(LogicObserver ob) +// { +// closeObserver.remove(ob); +// } + + @Override + public void notifyObservers() + { + observers.forEach(ob -> ob.update(this)); + } + } + + public class ReadWriteEnd extends ReadEnd + { + private boolean open; + private boolean isWriting; + private BitVector inputValues; + + ReadWriteEnd() + { + super(); + open = true; + isWriting = true; + initValues(); + registerInput(this); + } + + private void initValues() + { + inputValues = U.toVector(width); + } + + /** + * Sets the wires values. This takes up time, as specified by the {@link CoreWire}s travel time. + * + * @param newValues The new values the wires should take on. + * + * @author Fabian Stemmler + */ + public void feedSignals(Bit... newValues) + { + feedSignals(BitVector.of(newValues)); + } + + // TODO what if this is called multiple times at the same simulation time? (happens in component unit tests) + public void feedSignals(BitVector newValues) + { + if (newValues.length() != width) + throw new IllegalArgumentException( + String.format("Attempted to input %d bits instead of %d bits.", newValues.length(), width)); + if (!open) + throw new IllegalStateException("Attempted to write to closed WireArrayEnd."); + timeline.addEvent(e -> setValues(newValues), travelTime); + } + + /** + * Sets values of a subarray of wires. This takes up time, as specified by the {@link CoreWire}s travel time. + * + * @param bitVector The new values the wires should take on. + * @param startingBit The first index of the subarray of wires. + * + * @author Fabian Stemmler + */ + public void feedSignals(int startingBit, BitVector bitVector) + { + if (!open) + throw new IllegalStateException("Attempted to write to closed WireArrayEnd."); + timeline.addEvent(e -> setValues(startingBit, bitVector), travelTime); + } + + /** + * Sets the values that are being fed into the {@link CoreWire}. The preferred way of setting {@link ReadWriteEnd} values is via + * feedValues(...) with a delay. + */ + void setValues(int startingBit, BitVector newValues) + { + // index check covered in equals + if (!inputValues.equalsWithOffset(newValues, startingBit)) + { + Bit[] vals = inputValues.getBits(); + System.arraycopy(newValues.getBits(), 0, vals, startingBit, newValues.length()); + inputValues = BitVector.of(vals); + CoreWire.this.recalculateValuesWithoutFusions(); + } + } + + /** + * Sets the values that are being fed into the {@link CoreWire}. The preferred way of setting {@link ReadWriteEnd} values is via + * feedValues(...) with a delay. + */ + void setValues(BitVector newValues) + { + if (inputValues.equals(newValues)) + return; + inputValues = newValues; + CoreWire.this.recalculateValuesWithoutFusions(); + } + + /** + * @return The value (of bit 0) the {@link ReadEnd} is currently feeding into the associated {@link CoreWire}.Returns the least + * significant bit (LSB) + */ + public Bit getInputValue() + { + return getInputValue(0); + } + + /** + * @return The value which the {@link ReadEnd} is currently feeding into the associated {@link CoreWire} at the indexed {@link Bit}. + * Returns the least significant bit (LSB) + * + */ + public Bit getInputValue(int index) + { + return inputValues.getLSBit(index); + } + + /** + * @return A copy (safe to modify) of the values the {@link ReadEnd} is currently feeding into the associated {@link CoreWire}. + */ + public BitVector getInputValues() + { + return inputValues; + } + + public BitVector getInputValues(int start, int end) + { + return inputValues.subVector(start, end); + } + + /** + * {@link ReadEnd} now feeds Z into the associated {@link CoreWire}. + */ + public void clearSignals() + { + feedSignals(Z.toVector(width)); + } + + public BitVector wireValuesExcludingMe() + { + BitVectorMutator mutator = BitVectorMutator.empty(); + boolean modified = false; + for (ReadWriteEnd wireEnd : inputs) + { + if (wireEnd == this) + continue; + modified = true; + mutator.join(wireEnd.inputValues); + } + if (!modified) + mutator.join(BitVector.of(Bit.Z, width)); + return mutator.toBitVector(); + } + + @Override + public String toString() + { + return inputValues.toString(); + } + + @Override + public void close() + { + super.close(); + open = false; + } + + void setWriting(boolean isWriting) + { + if (this.isWriting != isWriting) + { + this.isWriting = isWriting; + if (isWriting) + inputs.add(this); + else + inputs.remove(this); + CoreWire.this.recalculateValuesWithoutFusions(); + } + } + + boolean isWriting() + { + return isWriting; + } + } + + @Override + public String toString() + { + String name = this.name == null ? String.format("0x%08x", hashCode()) : this.name; + return String.format("wire %s value: %s inputs: %s", name, getValues(), inputs); + } + + public static ReadEnd[] extractEnds(CoreWire[] w) + { + ReadEnd[] inputs = new ReadEnd[w.length]; + for (int i = 0; i < w.length; i++) + inputs[i] = w[i].createReadWriteEnd(); + return inputs; + } + + /** + * + * Fuses two wires together. If the bits change in one Wire, the other is changed accordingly immediately. Warning: The bits are + * permanently fused together. + * + * @param a The {@link CoreWire} to be fused with b + * @param b The {@link CoreWire} to be fused with a + */ + public static void fuse(CoreWire a, CoreWire b) + { + fuse(a, b, 0, 0, a.width); + } + + /** + * Fuses the selected bits of two wires together. If the bits change in one Wire, the other is changed accordingly immediately. Warning: + * The bits are permanently fused together. + * + * @param a The {@link CoreWire} to be (partially) fused with b + * @param b The {@link CoreWire} to be (partially) fused with a + * @param fromA The first bit of {@link CoreWire} a to be fused + * @param fromB The first bit of {@link CoreWire} b to be fused + * @param width The amount of bits to fuse + */ + public static void fuse(CoreWire a, CoreWire b, int fromA, int fromB, int width) + { + // iterate in this direction to be fail-fast (rely on the checks in fuse(Wire, Wire, int, int) + for (int i = width - 1; i >= 0; i--) + fuse(a, b, fromA + i, fromB + i); + } + + /** + * Fuses one bit of two wires together. If this bit changes in one Wire, the other is changed accordingly immediately. Warning: The bits + * are permanently fused together. + * + * @param a The {@link CoreWire} to be (partially) fused with b + * @param b The {@link CoreWire} to be (partially) fused with a + * @param bitA The bit of {@link CoreWire} a to be fused + * @param bitB The bit of {@link CoreWire} b to be fused + */ + public static void fuse(CoreWire a, CoreWire b, int bitA, int bitB) + { + if (bitA >= a.width) + throw new IllegalArgumentException("No bit " + bitA + " in " + a + " (width " + a.width + ")"); + if (bitB >= b.width) + throw new IllegalArgumentException("No bit " + bitB + " in " + b + " (width " + b.width + ")"); + if (a.fusedBits == null) + a.fusedBits = new FusedBit[a.width]; + if (b.fusedBits == null) + b.fusedBits = new FusedBit[b.width]; + FusedBit oldFusionA = a.fusedBits[bitA]; + FusedBit oldFusionB = b.fusedBits[bitB]; + if (oldFusionA == null) + if (oldFusionB == null) + { + FusedBit fusion = new FusedBit(); + fusion.addParticipatingWireBit(a, bitA); + fusion.addParticipatingWireBit(b, bitB); + } else + oldFusionB.addParticipatingWireBit(a, bitA); + else if (oldFusionB == null) + oldFusionA.addParticipatingWireBit(b, bitB); + else + oldFusionA.mergeOtherIntoThis(oldFusionB); + } + + private static class FusedBit + { + private final Set participatingWireBits; + + public FusedBit() + { + this.participatingWireBits = new HashSet<>(); + } + + public void addParticipatingWireBit(CoreWire w, int bit) + { + addParticipatingWireBit(new WireBit(w, bit)); + } + + private void addParticipatingWireBit(WireBit wb) + { + wb.wire.fusedBits[wb.bit] = this; + participatingWireBits.add(wb); + wb.wire.invalidateCachedValuesForAllFusedWires(); + } + + public void mergeOtherIntoThis(FusedBit other) + { + for (WireBit wb : other.participatingWireBits) + addParticipatingWireBit(wb); + } + + public void invalidateCachedValuesForAllParticipatingWires() + { + for (WireBit wb : participatingWireBits) + wb.wire.invalidateCachedValues(); + } + + public Bit getValue() + { + Bit result = null; + for (WireBit wb : participatingWireBits) + if (!wb.wire.inputs.isEmpty()) + { + Bit bit = wb.wire.bitsWithoutFusions[wb.bit]; + result = result == null ? bit : result.join(bit); + } + return result == null ? U : result; + } + } + + private static class WireBit + { + public final CoreWire wire; + public final int bit; + + public WireBit(CoreWire wire, int bit) + { + this.wire = wire; + this.bit = bit; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + bit; + result = prime * result + ((wire == null) ? 0 : wire.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + WireBit other = (WireBit) obj; + if (bit != other.bit) + return false; + if (wire == null) + { + if (other.wire != null) + return false; + } else if (!wire.equals(other.wire)) + return false; + return true; + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/.classpath b/plugins/net.mograsim.logic.model.am2900/.classpath new file mode 100644 index 00000000..34786681 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.classpath @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/plugins/net.mograsim.logic.model.am2900/.project b/plugins/net.mograsim.logic.model.am2900/.project new file mode 100644 index 00000000..494b451f --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.project @@ -0,0 +1,30 @@ + + + net.mograsim.logic.model.am2900 + + + net.mograsim.logic.model + SWTZoomableCanvas + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.logic.model.am2900/Am2904Testbench.json b/plugins/net.mograsim.logic.model.am2900/Am2904Testbench.json new file mode 100644 index 00000000..c7bec19f --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/Am2904Testbench.json @@ -0,0 +1,2341 @@ +{ + "width": 0.0, + "height": 0.0, + "interfacePins": [], + "innerScale": 1.0, + "submodel": { + "components": [ + { + "id": "Am2904", + "name": "Am2904#0", + "pos": { + "x": 220.0, + "y": 175.0 + } + }, + { + "id": "BitDisplay", + "name": "BitDisplay#0", + "pos": { + "x": 391.0, + "y": 150.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#1", + "pos": { + "x": 391.0, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#2", + "pos": { + "x": 391.0, + "y": 180.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#3", + "pos": { + "x": 391.0, + "y": 195.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#4", + "pos": { + "x": 365.0, + "y": 240.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#5", + "pos": { + "x": 365.0, + "y": 275.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#6", + "pos": { + "x": 365.0, + "y": 370.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#7", + "pos": { + "x": 365.0, + "y": 385.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#8", + "pos": { + "x": 365.0, + "y": 330.0 + }, + "params": 1 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#9", + "pos": { + "x": 365.0, + "y": 315.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#0", + "pos": { + "x": 255.0, + "y": 152.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#1", + "pos": { + "x": 170.0, + "y": 82.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#10", + "pos": { + "x": 160.0, + "y": 247.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#11", + "pos": { + "x": 160.0, + "y": 217.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#12", + "pos": { + "x": 160.0, + "y": 202.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#13", + "pos": { + "x": 60.0, + "y": 132.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#14", + "pos": { + "x": 165.0, + "y": 287.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#15", + "pos": { + "x": 140.0, + "y": 317.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#16", + "pos": { + "x": 140.0, + "y": 332.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#17", + "pos": { + "x": 140.0, + "y": 387.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#18", + "pos": { + "x": 140.0, + "y": 372.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#19", + "pos": { + "x": 140.0, + "y": 357.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#2", + "pos": { + "x": 170.0, + "y": 112.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#20", + "pos": { + "x": 140.0, + "y": 302.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#21", + "pos": { + "x": 55.0, + "y": 142.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#22", + "pos": { + "x": 60.0, + "y": 152.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#23", + "pos": { + "x": 60.0, + "y": 172.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#24", + "pos": { + "x": 55.0, + "y": 162.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#25", + "pos": { + "x": 55.0, + "y": 182.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#26", + "pos": { + "x": 60.0, + "y": 192.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#27", + "pos": { + "x": 60.0, + "y": 232.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#28", + "pos": { + "x": 55.0, + "y": 202.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#29", + "pos": { + "x": 55.0, + "y": 222.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#3", + "pos": { + "x": 55.0, + "y": 122.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#30", + "pos": { + "x": 60.0, + "y": 212.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#31", + "pos": { + "x": 55.0, + "y": 242.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#32", + "pos": { + "x": 300.0, + "y": 107.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#33", + "pos": { + "x": 300.0, + "y": 137.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#34", + "pos": { + "x": 300.0, + "y": 92.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#35", + "pos": { + "x": 300.0, + "y": 122.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#36", + "pos": { + "x": 300.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#37", + "pos": { + "x": 165.0, + "y": 270.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#38", + "pos": { + "x": 385.0, + "y": 220.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#4", + "pos": { + "x": 170.0, + "y": 127.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#5", + "pos": { + "x": 170.0, + "y": 142.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#6", + "pos": { + "x": 170.0, + "y": 157.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#7", + "pos": { + "x": 155.0, + "y": 172.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#8", + "pos": { + "x": 155.0, + "y": 187.5 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "ManualSwitch#9", + "pos": { + "x": 160.0, + "y": 232.5 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Merger#0", + "pos": { + "x": 85.0, + "y": 130.0 + }, + "params": { + "logicWidth": 13, + "orientation": "LEFT" + } + }, + { + "id": "TextComponent", + "name": "TextComponent#0", + "pos": { + "x": 140.0, + "y": 110.0 + }, + "params": "IZ" + }, + { + "id": "TextComponent", + "name": "TextComponent#1", + "pos": { + "x": 140.0, + "y": 125.0 + }, + "params": "IC" + }, + { + "id": "TextComponent", + "name": "TextComponent#10", + "pos": { + "x": 35.0, + "y": 240.0 + }, + "params": "I0" + }, + { + "id": "TextComponent", + "name": "TextComponent#11", + "pos": { + "x": 35.0, + "y": 120.0 + }, + "params": "I12" + }, + { + "id": "TextComponent", + "name": "TextComponent#12", + "pos": { + "x": 35.0, + "y": 220.0 + }, + "params": "I2" + }, + { + "id": "TextComponent", + "name": "TextComponent#13", + "pos": { + "x": 40.0, + "y": 190.0 + }, + "params": "I5" + }, + { + "id": "TextComponent", + "name": "TextComponent#14", + "pos": { + "x": 40.0, + "y": 230.0 + }, + "params": "I1" + }, + { + "id": "TextComponent", + "name": "TextComponent#15", + "pos": { + "x": 40.0, + "y": 210.0 + }, + "params": "I3" + }, + { + "id": "TextComponent", + "name": "TextComponent#16", + "pos": { + "x": 35.0, + "y": 200.0 + }, + "params": "I4" + }, + { + "id": "TextComponent", + "name": "TextComponent#17", + "pos": { + "x": 35.0, + "y": 180.0 + }, + "params": "I6" + }, + { + "id": "TextComponent", + "name": "TextComponent#18", + "pos": { + "x": 40.0, + "y": 170.0 + }, + "params": "I7" + }, + { + "id": "TextComponent", + "name": "TextComponent#19", + "pos": { + "x": 35.0, + "y": 160.0 + }, + "params": "I8" + }, + { + "id": "TextComponent", + "name": "TextComponent#2", + "pos": { + "x": 140.0, + "y": 140.0 + }, + "params": "IN" + }, + { + "id": "TextComponent", + "name": "TextComponent#20", + "pos": { + "x": 40.0, + "y": 150.0 + }, + "params": "I9" + }, + { + "id": "TextComponent", + "name": "TextComponent#21", + "pos": { + "x": 35.0, + "y": 140.0 + }, + "params": "I10" + }, + { + "id": "TextComponent", + "name": "TextComponent#22", + "pos": { + "x": 40.0, + "y": 130.0 + }, + "params": "I11" + }, + { + "id": "TextComponent", + "name": "TextComponent#23", + "pos": { + "x": 145.0, + "y": 285.0 + }, + "params": "CX" + }, + { + "id": "TextComponent", + "name": "TextComponent#24", + "pos": { + "x": 150.0, + "y": 80.0 + }, + "params": "C" + }, + { + "id": "TextComponent", + "name": "TextComponent#25", + "pos": { + "x": 225.0, + "y": 150.0 + }, + "params": "_OEY" + }, + { + "id": "TextComponent", + "name": "TextComponent#26", + "pos": { + "x": 416.0, + "y": 150.0 + }, + "params": "YZ" + }, + { + "id": "TextComponent", + "name": "TextComponent#27", + "pos": { + "x": 416.0, + "y": 165.0 + }, + "params": "YC" + }, + { + "id": "TextComponent", + "name": "TextComponent#28", + "pos": { + "x": 416.0, + "y": 180.0 + }, + "params": "YN" + }, + { + "id": "TextComponent", + "name": "TextComponent#29", + "pos": { + "x": 416.0, + "y": 195.0 + }, + "params": "YOVR" + }, + { + "id": "TextComponent", + "name": "TextComponent#3", + "pos": { + "x": 140.0, + "y": 155.0 + }, + "params": "IOVR" + }, + { + "id": "TextComponent", + "name": "TextComponent#30", + "pos": { + "x": 390.0, + "y": 240.0 + }, + "params": "CT" + }, + { + "id": "TextComponent", + "name": "TextComponent#31", + "pos": { + "x": 390.0, + "y": 275.0 + }, + "params": "C0" + }, + { + "id": "TextComponent", + "name": "TextComponent#32", + "pos": { + "x": 390.0, + "y": 315.0 + }, + "params": "SIOn" + }, + { + "id": "TextComponent", + "name": "TextComponent#33", + "pos": { + "x": 390.0, + "y": 330.0 + }, + "params": "QIOn" + }, + { + "id": "TextComponent", + "name": "TextComponent#34", + "pos": { + "x": 390.0, + "y": 370.0 + }, + "params": "SIO0" + }, + { + "id": "TextComponent", + "name": "TextComponent#35", + "pos": { + "x": 390.0, + "y": 385.0 + }, + "params": "QIO0" + }, + { + "id": "TextComponent", + "name": "TextComponent#36", + "pos": { + "x": 30.0, + "y": 300.0 + }, + "params": "enable S/QIOn input" + }, + { + "id": "TextComponent", + "name": "TextComponent#37", + "pos": { + "x": 30.0, + "y": 355.0 + }, + "params": "enable S/QIO0 input" + }, + { + "id": "TextComponent", + "name": "TextComponent#38", + "pos": { + "x": 110.0, + "y": 385.0 + }, + "params": "QIO0" + }, + { + "id": "TextComponent", + "name": "TextComponent#39", + "pos": { + "x": 110.0, + "y": 370.0 + }, + "params": "SIO0" + }, + { + "id": "TextComponent", + "name": "TextComponent#4", + "pos": { + "x": 115.0, + "y": 170.0 + }, + "params": "_CEM" + }, + { + "id": "TextComponent", + "name": "TextComponent#40", + "pos": { + "x": 110.0, + "y": 315.0 + }, + "params": "SIOn" + }, + { + "id": "TextComponent", + "name": "TextComponent#41", + "pos": { + "x": 110.0, + "y": 330.0 + }, + "params": "QIOn" + }, + { + "id": "TextComponent", + "name": "TextComponent#42", + "pos": { + "x": 270.0, + "y": 135.0 + }, + "params": "YOVR" + }, + { + "id": "TextComponent", + "name": "TextComponent#43", + "pos": { + "x": 270.0, + "y": 120.0 + }, + "params": "YN" + }, + { + "id": "TextComponent", + "name": "TextComponent#44", + "pos": { + "x": 270.0, + "y": 90.0 + }, + "params": "YZ" + }, + { + "id": "TextComponent", + "name": "TextComponent#45", + "pos": { + "x": 270.0, + "y": 105.0 + }, + "params": "YC" + }, + { + "id": "TextComponent", + "name": "TextComponent#46", + "pos": { + "x": 220.0, + "y": 75.0 + }, + "params": "enable Y input" + }, + { + "id": "TextComponent", + "name": "TextComponent#47", + "pos": { + "x": 145.0, + "y": 270.0 + }, + "params": "_SE" + }, + { + "id": "TextComponent", + "name": "TextComponent#48", + "pos": { + "x": 350.0, + "y": 220.0 + }, + "params": "_OECT" + }, + { + "id": "TextComponent", + "name": "TextComponent#5", + "pos": { + "x": 115.0, + "y": 185.0 + }, + "params": "_CEmu" + }, + { + "id": "TextComponent", + "name": "TextComponent#6", + "pos": { + "x": 125.0, + "y": 200.0 + }, + "params": "_EZ" + }, + { + "id": "TextComponent", + "name": "TextComponent#7", + "pos": { + "x": 125.0, + "y": 215.0 + }, + "params": "_EC" + }, + { + "id": "TextComponent", + "name": "TextComponent#8", + "pos": { + "x": 125.0, + "y": 230.0 + }, + "params": "_EN" + }, + { + "id": "TextComponent", + "name": "TextComponent#9", + "pos": { + "x": 125.0, + "y": 245.0 + }, + "params": "_EOVR" + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 175.0, + "y": 315.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#1", + "pos": { + "x": 175.0, + "y": 330.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#2", + "pos": { + "x": 175.0, + "y": 385.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#3", + "pos": { + "x": 175.0, + "y": 370.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#4", + "pos": { + "x": 335.0, + "y": 105.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#5", + "pos": { + "x": 335.0, + "y": 90.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#6", + "pos": { + "x": 335.0, + "y": 120.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#7", + "pos": { + "x": 335.0, + "y": 135.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 184.0, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 184.0, + "y": 309.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 369.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 374.0, + "y": 189.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 379.0, + "y": 199.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 209.0, + "y": 324.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 214.0, + "y": 339.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 354.0, + "y": 379.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 359.0, + "y": 389.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 344.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 359.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 359.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 364.0, + "y": 159.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "ManualSwitch#0", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OEY" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 280.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "C" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 215.0, + "y": 90.0 + }, + { + "x": 215.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "ManualSwitch#10", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 205.0, + "y": 220.0 + }, + { + "x": 205.0, + "y": 255.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#9", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EN" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 200.0, + "y": 240.0 + }, + { + "x": 200.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "I" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 105.0, + "y": 190.0 + }, + { + "x": 105.0, + "y": 265.0 + }, + { + "x": 210.0, + "y": 265.0 + }, + { + "x": 210.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "Cx" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 200.0, + "y": 295.0 + }, + { + "x": 200.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "YOVR" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YN" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 375.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#1", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "YZ" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 365.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "CT" + }, + "pin2": { + "compName": "BitDisplay#4", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 345.0, + "y": 235.0 + }, + { + "x": 345.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "C0" + }, + "pin2": { + "compName": "BitDisplay#5", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#2", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IZ" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 210.0, + "y": 120.0 + }, + { + "x": 210.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "SIOn" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 210.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "QIOn" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 215.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#1", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#15", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#16", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "IN" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "IN" + }, + "pin2": { + "compName": "ManualSwitch#17", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#18", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "IN" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "EN" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IC" + }, + "pin2": { + "compName": "ManualSwitch#4", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 205.0, + "y": 190.0 + }, + { + "x": 205.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "EN" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 200.0, + "y": 365.0 + }, + { + "x": 200.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#20", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "EN" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 200.0, + "y": 310.0 + }, + { + "x": 200.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#9", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 210.0, + "y": 375.0 + }, + { + "x": 345.0, + "y": 375.0 + }, + { + "x": 345.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "BitDisplay#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 350.0, + "y": 340.0 + }, + { + "x": 350.0, + "y": 380.0 + }, + { + "x": 215.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 210.0, + "y": 380.0 + }, + { + "x": 210.0, + "y": 385.0 + }, + { + "x": 355.0, + "y": 385.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "OUT" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 210.0, + "y": 390.0 + }, + { + "x": 210.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#7", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 360.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "BitDisplay#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#5", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IN" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 200.0, + "y": 150.0 + }, + { + "x": 200.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "SIO0" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 355.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "QIO0" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 360.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#3", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O12" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O11" + }, + "pin2": { + "compName": "ManualSwitch#13", + "pinName": "" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#21", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O10" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O9" + }, + "pin2": { + "compName": "ManualSwitch#22", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#24", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O8" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O7" + }, + "pin2": { + "compName": "ManualSwitch#23", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#25", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O6" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O5" + }, + "pin2": { + "compName": "ManualSwitch#26", + "pinName": "" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IOVR" + }, + "pin2": { + "compName": "ManualSwitch#6", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 195.0, + "y": 200.0 + }, + { + "x": 195.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#28", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O4" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O3" + }, + "pin2": { + "compName": "ManualSwitch#30", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#29", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O2" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O1" + }, + "pin2": { + "compName": "ManualSwitch#27", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#31", + "pinName": "" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "O0" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#7", + "pinName": "IN" + }, + "pin2": { + "compName": "ManualSwitch#33", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#35", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#6", + "pinName": "IN" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#4", + "pinName": "IN" + }, + "pin2": { + "compName": "ManualSwitch#32", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#34", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "IN" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "EN" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "ManualSwitch#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_CEM" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 190.0, + "y": 180.0 + }, + { + "x": 190.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "ManualSwitch#36", + "pinName": "" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 360.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#4", + "pinName": "EN" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#6", + "pinName": "EN" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#7", + "pinName": "EN" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 360.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#0", + "pinName": "" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "OUT" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 365.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "YC" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 370.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#4", + "pinName": "OUT" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 370.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_CEmu" + }, + "pin2": { + "compName": "ManualSwitch#8", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 185.0, + "y": 205.0 + }, + { + "x": 185.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#6", + "pinName": "OUT" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 375.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#2", + "pinName": "" + }, + "name": "unnamedWire#71", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#3", + "pinName": "" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 380.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#7", + "pinName": "OUT" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 380.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_SE" + }, + "pin2": { + "compName": "ManualSwitch#37", + "pinName": "" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 215.0, + "y": 260.0 + }, + { + "x": 215.0, + "y": 280.0 + } + ] + }, + { + "pin1": { + "compName": "ManualSwitch#38", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OECT" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 410.0, + "y": 230.0 + }, + { + "x": 410.0, + "y": 215.0 + }, + { + "x": 345.0, + "y": 215.0 + }, + { + "x": 345.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EZ" + }, + "pin2": { + "compName": "ManualSwitch#12", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EC" + }, + "pin2": { + "compName": "ManualSwitch#11", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 195.0, + "y": 215.0 + }, + { + "x": 195.0, + "y": 225.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "default", + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF b/plugins/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF new file mode 100644 index 00000000..08b14e04 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/META-INF/MANIFEST.MF @@ -0,0 +1,20 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: net.mograsim.logic.model.am2900;singleton:=true +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.logic.model.am2900, + net.mograsim.logic.model.am2900.components, + net.mograsim.logic.model.am2900.components.am2901, + net.mograsim.logic.model.am2900.components.am2904, + net.mograsim.logic.model.am2900.components.am2910, + net.mograsim.logic.model.am2900.machine, + net.mograsim.logic.model.examples +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.eclipse.osgi, + net.mograsim.machine;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.logic.core +Automatic-Module-Name: net.mograsim.logic.model.am2900 +Bundle-Vendor: Mograsim Team +Bundle-Activator: net.mograsim.logic.model.am2900.Am2900Loader +Bundle-ActivationPolicy: lazy diff --git a/plugins/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties b/plugins/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties new file mode 100644 index 00000000..3fe36700 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,3 @@ +#Properties file for net.mograsim.logic.model.am2900 +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim Am2900 logic \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/build.properties b/plugins/net.mograsim.logic.model.am2900/build.properties new file mode 100644 index 00000000..1eb041da --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/build.properties @@ -0,0 +1,6 @@ +source.. = src/,\ + components/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/,\ + plugin.xml diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json new file mode 100644 index 00000000..b97159cb --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/Am2900.json @@ -0,0 +1,6913 @@ +{ + "width": 504.0, + "height": 342.0, + "interfacePins": [], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "ManualSwitch", + "name": "@bz_pc_cpol", + "pos": { + "x": 120.0, + "y": 435.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "@c", + "pos": { + "x": 120.0, + "y": 350.0 + }, + "params": 1 + }, + { + "id": "dlatch80", + "name": "@dlatch80#1", + "pos": { + "x": 295.0, + "y": 675.0 + } + }, + { + "id": "ManualSwitch", + "name": "@ireg_cpol", + "pos": { + "x": 120.0, + "y": 410.0 + }, + "params": 1 + }, + { + "id": "ManualSwitch", + "name": "@mireg_cpol", + "pos": { + "x": 120.0, + "y": 385.0 + }, + "params": 1 + }, + { + "id": "Am2900MainMemory", + "name": "Am2900MainMemory#0", + "pos": { + "x": 35.0, + "y": 30.0 + } + }, + { + "id": "Am2900MicroInstructionMemory", + "name": "Am2900MicroInstructionMemory#0", + "pos": { + "x": 65.0, + "y": 565.0 + } + }, + { + "id": "Am2901", + "name": "Am2901#0", + "pos": { + "x": 725.0, + "y": 400.0 + } + }, + { + "id": "Am2901", + "name": "Am2901#1", + "pos": { + "x": 850.0, + "y": 400.0 + } + }, + { + "id": "Am2901", + "name": "Am2901#2", + "pos": { + "x": 975.0, + "y": 400.0 + } + }, + { + "id": "Am2901", + "name": "Am2901#3", + "pos": { + "x": 1110.0, + "y": 400.0 + } + }, + { + "id": "Am2904", + "name": "Am2904#0", + "pos": { + "x": 550.0, + "y": 405.0 + } + }, + { + "id": "Am2910", + "name": "Am2910#0", + "pos": { + "x": 405.0, + "y": 510.0 + } + }, + { + "id": "BitDisplay", + "name": "BitDisplay#1", + "pos": { + "x": 255.0, + "y": 30.0 + }, + "params": 16 + }, + { + "id": "BitDisplay", + "name": "BitDisplay#2", + "pos": { + "x": 255.0, + "y": 45.0 + }, + "params": 16 + }, + { + "id": "FixedOutput", + "name": "FixedOutput#0", + "pos": { + "x": 540.0, + "y": 270.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#1", + "pos": { + "x": 635.0, + "y": 380.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#2", + "pos": { + "x": 365.0, + "y": 505.0 + }, + "params": { + "bits": [ + "ONE" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#3", + "pos": { + "x": 455.0, + "y": 560.0 + }, + "params": { + "bits": [ + "ONE" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#4", + "pos": { + "x": 420.0, + "y": 570.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#5", + "pos": { + "x": 475.0, + "y": 505.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#6", + "pos": { + "x": 535.0, + "y": 370.0 + }, + "params": { + "bits": [ + "ZERO" + ] + } + }, + { + "id": "FixedOutput", + "name": "FixedOutput#7", + "pos": { + "x": 260.0, + "y": 370.0 + }, + "params": { + "bits": [ + null + ] + } + }, + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 395.0, + "y": 195.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 335.0, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 395.0, + "y": 220.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 935.0, + "y": 685.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 935.0, + "y": 710.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 190.0, + "y": 100.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 240.0, + "y": 525.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 555.0, + "y": 115.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 620.0, + "y": 160.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#11", + "pos": { + "x": 575.0, + "y": 115.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#12", + "pos": { + "x": 575.0, + "y": 195.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#13", + "pos": { + "x": 575.0, + "y": 235.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#14", + "pos": { + "x": 675.0, + "y": 150.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#15", + "pos": { + "x": 675.0, + "y": 245.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#16", + "pos": { + "x": 345.0, + "y": 830.0 + }, + "params": { + "logicWidth": 80, + "orientation": "UP_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#17", + "pos": { + "x": 405.0, + "y": 815.0 + }, + "params": { + "logicWidth": 12, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#18", + "pos": { + "x": 525.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#19", + "pos": { + "x": 660.0, + "y": 755.0 + }, + "params": { + "logicWidth": 13, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 620.0, + "y": 255.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#20", + "pos": { + "x": 575.0, + "y": 815.0 + }, + "params": { + "logicWidth": 6, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#21", + "pos": { + "x": 695.0, + "y": 815.0 + }, + "params": { + "logicWidth": 2, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#22", + "pos": { + "x": 655.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#23", + "pos": { + "x": 730.0, + "y": 770.0 + }, + "params": { + "logicWidth": 6, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#24", + "pos": { + "x": 690.0, + "y": 770.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#25", + "pos": { + "x": 660.0, + "y": 770.0 + }, + "params": { + "logicWidth": 2, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#26", + "pos": { + "x": 925.0, + "y": 815.0 + }, + "params": { + "logicWidth": 16, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#27", + "pos": { + "x": 895.0, + "y": 815.0 + }, + "params": { + "logicWidth": 3, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#28", + "pos": { + "x": 865.0, + "y": 815.0 + }, + "params": { + "logicWidth": 3, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#29", + "pos": { + "x": 835.0, + "y": 815.0 + }, + "params": { + "logicWidth": 3, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 205.0, + "y": 390.0 + }, + "params": { + "logicWidth": 8, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#30", + "pos": { + "x": 795.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#31", + "pos": { + "x": 745.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#32", + "pos": { + "x": 895.0, + "y": 800.0 + }, + "params": { + "logicWidth": 3, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#33", + "pos": { + "x": 835.0, + "y": 800.0 + }, + "params": { + "logicWidth": 3, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#34", + "pos": { + "x": 865.0, + "y": 800.0 + }, + "params": { + "logicWidth": 3, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#35", + "pos": { + "x": 835.0, + "y": 780.0 + }, + "params": { + "logicWidth": 9, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#36", + "pos": { + "x": 895.0, + "y": 330.0 + }, + "params": { + "logicWidth": 16, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#37", + "pos": { + "x": 895.0, + "y": 580.0 + }, + "params": { + "logicWidth": 16, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#38", + "pos": { + "x": 895.0, + "y": 565.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#39", + "pos": { + "x": 935.0, + "y": 565.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 205.0, + "y": 405.0 + }, + "params": { + "logicWidth": 12, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#40", + "pos": { + "x": 975.0, + "y": 565.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#41", + "pos": { + "x": 1015.0, + "y": 565.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "Splitter", + "name": "Splitter#42", + "pos": { + "x": 895.0, + "y": 345.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#43", + "pos": { + "x": 935.0, + "y": 345.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#44", + "pos": { + "x": 975.0, + "y": 345.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#45", + "pos": { + "x": 1015.0, + "y": 345.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#46", + "pos": { + "x": 310.0, + "y": 235.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#47", + "pos": { + "x": 620.0, + "y": 200.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#48", + "pos": { + "x": 365.0, + "y": 815.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN_ALT" + } + }, + { + "id": "Splitter", + "name": "Splitter#49", + "pos": { + "x": 620.0, + "y": 295.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "TextComponent", + "name": "TextComponent#0", + "pos": { + "x": 305.0, + "y": 30.0 + }, + "params": "D bus" + }, + { + "id": "TextComponent", + "name": "TextComponent#1", + "pos": { + "x": 305.0, + "y": 60.0 + }, + "params": "A bus" + }, + { + "id": "TextComponent", + "name": "TextComponent#13", + "pos": { + "x": 60.0, + "y": 385.0 + }, + "params": "mireg cpol" + }, + { + "id": "TextComponent", + "name": "TextComponent#14", + "pos": { + "x": 60.0, + "y": 415.0 + }, + "params": "ireg cpol" + }, + { + "id": "TextComponent", + "name": "TextComponent#15", + "pos": { + "x": 60.0, + "y": 435.0 + }, + "params": "bz/pc cpol" + }, + { + "id": "TextComponent", + "name": "TextComponent#3", + "pos": { + "x": 515.0, + "y": 110.0 + }, + "params": "asdf" + }, + { + "id": "TextComponent", + "name": "TextComponent#4", + "pos": { + "x": 60.0, + "y": 350.0 + }, + "params": "c" + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 990.0, + "y": 590.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#1", + "pos": { + "x": 990.0, + "y": 615.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#2", + "pos": { + "x": 425.0, + "y": 120.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#3", + "pos": { + "x": 425.0, + "y": 145.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#5", + "pos": { + "x": 205.0, + "y": 70.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 604.0, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 714.0, + "y": 394.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 819.0, + "y": 384.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 824.0, + "y": 389.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 329.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 474.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 419.0, + "y": 129.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 894.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 844.0, + "y": 794.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 984.0, + "y": 599.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 249.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 244.0, + "y": 59.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 839.0, + "y": 394.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 444.0, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 389.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 449.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 454.0, + "y": 59.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 389.0, + "y": 224.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 929.0, + "y": 714.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 819.0, + "y": 529.0 + }, + "params": 9 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 944.0, + "y": 529.0 + }, + "params": 9 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 1069.0, + "y": 529.0 + }, + "params": 9 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 244.0, + "y": 44.0 + }, + "params": 16 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 964.0, + "y": 394.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 564.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 569.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#32", + "pos": { + "x": 929.0, + "y": 699.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#33", + "pos": { + "x": 284.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#34", + "pos": { + "x": 294.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#35", + "pos": { + "x": 304.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#36", + "pos": { + "x": 339.0, + "y": 229.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#37", + "pos": { + "x": 824.0, + "y": 699.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#38", + "pos": { + "x": 234.0, + "y": 529.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#39", + "pos": { + "x": 234.0, + "y": 539.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 569.0, + "y": 234.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 559.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 1074.0, + "y": 389.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 1069.0, + "y": 384.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 944.0, + "y": 384.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 949.0, + "y": 389.0 + }, + "params": 4 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 860.0, + "y": 590.0 + } + }, + { + "id": "and", + "name": "and#1", + "pos": { + "x": 860.0, + "y": 610.0 + } + }, + { + "id": "and", + "name": "and#2", + "pos": { + "x": 905.0, + "y": 595.0 + } + }, + { + "id": "dff16", + "name": "dff16#0", + "pos": { + "x": 370.0, + "y": 105.0 + } + }, + { + "id": "dff16_invwe", + "name": "dff16_invwe#0", + "pos": { + "x": 490.0, + "y": 165.0 + } + }, + { + "id": "dlatch80", + "name": "dlatch80#0", + "pos": { + "x": 240.0, + "y": 675.0 + } + }, + { + "id": "inc", + "name": "inc#0", + "pos": { + "x": 315.0, + "y": 135.0 + }, + "params": 16 + }, + { + "id": "mux1_12", + "name": "mux1_12#0", + "pos": { + "x": 365.0, + "y": 420.0 + } + }, + { + "id": "mux1_16", + "name": "mux1_16#0", + "pos": { + "x": 255.0, + "y": 110.0 + } + }, + { + "id": "mux1_16", + "name": "mux1_16#1", + "pos": { + "x": 910.0, + "y": 215.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 635.0, + "y": 145.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#1", + "pos": { + "x": 635.0, + "y": 240.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 145.0, + "y": 380.0 + } + }, + { + "id": "xor", + "name": "xor#1", + "pos": { + "x": 145.0, + "y": 405.0 + } + }, + { + "id": "xor", + "name": "xor#2", + "pos": { + "x": 145.0, + "y": 430.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Am2904#0", + "pinName": "CT" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "_CC" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 675.0, + "y": 460.0 + }, + { + "x": 675.0, + "y": 355.0 + }, + { + "x": 470.0, + "y": 355.0 + }, + { + "x": 470.0, + "y": 505.0 + }, + { + "x": 400.0, + "y": 505.0 + }, + { + "x": 400.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Qn+3" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "Qn" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 835.0, + "y": 515.0 + }, + { + "x": 835.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "QIOn" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "Qn+3" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 540.0, + "y": 530.0 + }, + { + "x": 540.0, + "y": 660.0 + }, + { + "x": 1215.0, + "y": 660.0 + }, + { + "x": 1215.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "@mireg_cpol", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "Am2900MicroInstructionMemory#0", + "pinName": "D" + }, + "pin2": { + "compName": "dlatch80#0", + "pinName": "D" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 205.0, + "y": 615.0 + }, + { + "x": 205.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16_invwe#0", + "pinName": "C" + }, + "name": "unnamedWire#102", + "path": [ + { + "x": 255.0, + "y": 310.0 + }, + { + "x": 480.0, + "y": 310.0 + }, + { + "x": 480.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 390.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "O2" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 320.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "EN" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 450.0, + "y": 205.0 + }, + { + "x": 450.0, + "y": 140.0 + }, + { + "x": 435.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 390.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IN" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "F3" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 525.0, + "y": 425.0 + }, + { + "x": 525.0, + "y": 645.0 + }, + { + "x": 1105.0, + "y": 645.0 + }, + { + "x": 1105.0, + "y": 455.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "EN" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 435.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#111", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 930.0, + "y": 725.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 760.0, + "y": 165.0 + }, + { + "x": 760.0, + "y": 385.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "I" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 755.0, + "y": 390.0 + }, + { + "x": 755.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#117", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O37" + }, + "name": "unnamedWire#119", + "path": [ + { + "x": 830.0, + "y": 715.0 + }, + { + "x": 830.0, + "y": 810.0 + }, + { + "x": 715.0, + "y": 810.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "F\u003d0" + }, + "pin2": { + "compName": "and#1", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 720.0, + "y": 445.0 + }, + { + "x": 720.0, + "y": 535.0 + }, + { + "x": 840.0, + "y": 535.0 + }, + { + "x": 840.0, + "y": 625.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "name": "unnamedWire#120", + "path": [ + { + "x": 1015.0, + "y": 720.0 + }, + { + "x": 1015.0, + "y": 610.0 + }, + { + "x": 1000.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#121", + "path": [ + { + "x": 340.0, + "y": 700.0 + }, + { + "x": 340.0, + "y": 285.0 + }, + { + "x": 180.0, + "y": 285.0 + }, + { + "x": 180.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#122", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#123", + "path": [ + { + "x": 930.0, + "y": 690.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#1", + "pinName": "EN" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "name": "unnamedWire#124", + "path": [ + { + "x": 1000.0, + "y": 695.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "Am2900MainMemory#0", + "pinName": "A" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "Am2900MainMemory#0", + "pinName": "D" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "IN" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "S" + }, + "name": "unnamedWire#127", + "path": [ + { + "x": 310.0, + "y": 225.0 + }, + { + "x": 240.0, + "y": 225.0 + }, + { + "x": 240.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "D" + }, + "name": "unnamedWire#128", + "path": [ + { + "x": 335.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "A" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "Y" + }, + "name": "unnamedWire#129", + "path": [ + { + "x": 335.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#1", + "pinName": "F\u003d0" + }, + "pin2": { + "compName": "and#1", + "pinName": "A" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 845.0, + "y": 445.0 + }, + { + "x": 845.0, + "y": 615.0 + } + ] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "CI" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "name": "unnamedWire#130", + "path": [ + { + "x": 360.0, + "y": 145.0 + }, + { + "x": 360.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#131", + "path": [ + { + "x": 330.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#132", + "path": [] + }, + { + "pin1": { + "compName": "FixedOutput#7", + "pinName": "out" + }, + "pin2": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "name": "unnamedWire#133", + "path": [ + { + "x": 285.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "IN" + }, + "name": "unnamedWire#134", + "path": [ + { + "x": 420.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#5", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#135", + "path": [ + { + "x": 230.0, + "y": 80.0 + }, + { + "x": 230.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910#0", + "pinName": "_MAP" + }, + "pin2": { + "compName": "mux1_12#0", + "pinName": "S" + }, + "name": "unnamedWire#136", + "path": [ + { + "x": 420.0, + "y": 560.0 + }, + { + "x": 360.0, + "y": 560.0 + }, + { + "x": 360.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "Q" + }, + "name": "unnamedWire#137", + "path": [] + }, + { + "pin1": { + "compName": "@dlatch80#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "I" + }, + "name": "unnamedWire#138", + "path": [ + { + "x": 330.0, + "y": 760.0 + }, + { + "x": 330.0, + "y": 845.0 + }, + { + "x": 740.0, + "y": 845.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O22" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "_CCEN" + }, + "name": "unnamedWire#139", + "path": [ + { + "x": 565.0, + "y": 735.0 + }, + { + "x": 395.0, + "y": 735.0 + }, + { + "x": 395.0, + "y": 525.0 + } + ] + }, + { + "pin1": { + "compName": "and#1", + "pinName": "Y" + }, + "pin2": { + "compName": "and#2", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 900.0, + "y": 615.0 + }, + { + "x": 900.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O21" + }, + "name": "unnamedWire#140", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O20" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O2" + }, + "name": "unnamedWire#141", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O19" + }, + "name": "unnamedWire#142", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O18" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O0" + }, + "name": "unnamedWire#143", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "I" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "I" + }, + "name": "unnamedWire#144", + "path": [ + { + "x": 540.0, + "y": 730.0 + }, + { + "x": 400.0, + "y": 730.0 + }, + { + "x": 400.0, + "y": 535.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O17" + }, + "name": "unnamedWire#145", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O16" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O10" + }, + "name": "unnamedWire#146", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O15" + }, + "name": "unnamedWire#147", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O14" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O8" + }, + "name": "unnamedWire#148", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O13" + }, + "name": "unnamedWire#149", + "path": [] + }, + { + "pin1": { + "compName": "and#2", + "pinName": "A" + }, + "pin2": { + "compName": "and#0", + "pinName": "Y" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 900.0, + "y": 600.0 + }, + { + "x": 900.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O12" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O6" + }, + "name": "unnamedWire#150", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O11" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O10" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O4" + }, + "name": "unnamedWire#152", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O9" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O2" + }, + "name": "unnamedWire#154", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O7" + }, + "name": "unnamedWire#155", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O0" + }, + "name": "unnamedWire#156", + "path": [] + }, + { + "pin1": { + "compName": "mux1_12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "D" + }, + "name": "unnamedWire#157", + "path": [ + { + "x": 435.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_12#0", + "pinName": "I1" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "I" + }, + "name": "unnamedWire#158", + "path": [ + { + "x": 350.0, + "y": 480.0 + }, + { + "x": 350.0, + "y": 760.0 + }, + { + "x": 460.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "@dlatch80#1", + "pinName": "D" + }, + "pin2": { + "compName": "dlatch80#0", + "pinName": "Q" + }, + "name": "unnamedWire#159", + "path": [] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "B" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "F\u003d0" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 850.0, + "y": 605.0 + }, + { + "x": 850.0, + "y": 535.0 + }, + { + "x": 970.0, + "y": 535.0 + }, + { + "x": 970.0, + "y": 445.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#160", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#48", + "pinName": "O3" + }, + "name": "unnamedWire#161", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#48", + "pinName": "I" + }, + "name": "unnamedWire#162", + "path": [ + { + "x": 325.0, + "y": 640.0 + }, + { + "x": 380.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2900MicroInstructionMemory#0", + "pinName": "A" + }, + "name": "unnamedWire#163", + "path": [ + { + "x": 440.0, + "y": 565.0 + }, + { + "x": 205.0, + "y": 565.0 + }, + { + "x": 205.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O29" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_CEM" + }, + "name": "unnamedWire#164", + "path": [ + { + "x": 635.0, + "y": 780.0 + }, + { + "x": 505.0, + "y": 780.0 + }, + { + "x": 505.0, + "y": 400.0 + }, + { + "x": 555.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O30" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_CEmu" + }, + "name": "unnamedWire#165", + "path": [ + { + "x": 645.0, + "y": 775.0 + }, + { + "x": 500.0, + "y": 775.0 + }, + { + "x": 500.0, + "y": 395.0 + }, + { + "x": 595.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O23" + }, + "name": "unnamedWire#166", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O25" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O24" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O26" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O3" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "F\u003d0" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 1095.0, + "y": 445.0 + }, + { + "x": 1095.0, + "y": 540.0 + }, + { + "x": 855.0, + "y": 540.0 + }, + { + "x": 855.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O27" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O28" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O5" + }, + "name": "unnamedWire#171", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#22", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O31" + }, + "name": "unnamedWire#172", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O32" + }, + "pin2": { + "compName": "Splitter#22", + "pinName": "O1" + }, + "name": "unnamedWire#173", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#22", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O33" + }, + "name": "unnamedWire#174", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O34" + }, + "pin2": { + "compName": "Splitter#22", + "pinName": "O3" + }, + "name": "unnamedWire#175", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O35" + }, + "name": "unnamedWire#176", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O36" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O1" + }, + "name": "unnamedWire#177", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "I" + }, + "name": "unnamedWire#178", + "path": [ + { + "x": 755.0, + "y": 785.0 + }, + { + "x": 600.0, + "y": 785.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#22", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#24", + "pinName": "I" + }, + "name": "unnamedWire#179", + "path": [ + { + "x": 670.0, + "y": 790.0 + }, + { + "x": 705.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "and#2", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IZ" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 945.0, + "y": 600.0 + }, + { + "x": 945.0, + "y": 635.0 + }, + { + "x": 515.0, + "y": 635.0 + }, + { + "x": 515.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#25", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "I" + }, + "name": "unnamedWire#180", + "path": [ + { + "x": 665.0, + "y": 800.0 + }, + { + "x": 700.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O0" + }, + "name": "unnamedWire#181", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O1" + }, + "name": "unnamedWire#182", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#23", + "pinName": "O2" + }, + "name": "unnamedWire#183", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O3" + }, + "name": "unnamedWire#184", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#23", + "pinName": "O4" + }, + "name": "unnamedWire#185", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#23", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O5" + }, + "name": "unnamedWire#186", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#24", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O6" + }, + "name": "unnamedWire#187", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#24", + "pinName": "O1" + }, + "name": "unnamedWire#188", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#24", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O8" + }, + "name": "unnamedWire#189", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "OVR" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IOVR" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 1100.0, + "y": 450.0 + }, + { + "x": 1100.0, + "y": 650.0 + }, + { + "x": 530.0, + "y": 650.0 + }, + { + "x": 530.0, + "y": 430.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#24", + "pinName": "O3" + }, + "name": "unnamedWire#190", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#25", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O11" + }, + "name": "unnamedWire#191", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O12" + }, + "pin2": { + "compName": "Splitter#25", + "pinName": "O1" + }, + "name": "unnamedWire#192", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O73" + }, + "name": "unnamedWire#193", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O72" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O14" + }, + "name": "unnamedWire#194", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O71" + }, + "name": "unnamedWire#195", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O70" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O12" + }, + "name": "unnamedWire#196", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O69" + }, + "name": "unnamedWire#197", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O68" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O10" + }, + "name": "unnamedWire#198", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O67" + }, + "name": "unnamedWire#199", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "RAMn+3" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "RAMn" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 830.0, + "y": 510.0 + }, + { + "x": 830.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IC" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 1220.0, + "y": 520.0 + }, + { + "x": 1220.0, + "y": 640.0 + }, + { + "x": 520.0, + "y": 640.0 + }, + { + "x": 520.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O66" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O8" + }, + "name": "unnamedWire#200", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O65" + }, + "name": "unnamedWire#201", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O64" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O6" + }, + "name": "unnamedWire#202", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O63" + }, + "name": "unnamedWire#203", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O62" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O4" + }, + "name": "unnamedWire#204", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O61" + }, + "name": "unnamedWire#205", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O60" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O2" + }, + "name": "unnamedWire#206", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O59" + }, + "name": "unnamedWire#207", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O58" + }, + "pin2": { + "compName": "Splitter#26", + "pinName": "O0" + }, + "name": "unnamedWire#208", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#27", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O57" + }, + "name": "unnamedWire#209", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "Cn" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 840.0, + "y": 520.0 + }, + { + "x": 840.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O56" + }, + "pin2": { + "compName": "Splitter#27", + "pinName": "O1" + }, + "name": "unnamedWire#210", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#27", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O55" + }, + "name": "unnamedWire#211", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O54" + }, + "pin2": { + "compName": "Splitter#28", + "pinName": "O2" + }, + "name": "unnamedWire#212", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#28", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O53" + }, + "name": "unnamedWire#213", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O52" + }, + "pin2": { + "compName": "Splitter#28", + "pinName": "O0" + }, + "name": "unnamedWire#214", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#29", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O51" + }, + "name": "unnamedWire#215", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O50" + }, + "pin2": { + "compName": "Splitter#29", + "pinName": "O1" + }, + "name": "unnamedWire#216", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#29", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O49" + }, + "name": "unnamedWire#217", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#30", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O48" + }, + "name": "unnamedWire#218", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#30", + "pinName": "O2" + }, + "name": "unnamedWire#219", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#1", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "Cn" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 965.0, + "y": 520.0 + }, + { + "x": 965.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#30", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O46" + }, + "name": "unnamedWire#220", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#30", + "pinName": "O0" + }, + "name": "unnamedWire#221", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#31", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O40" + }, + "name": "unnamedWire#222", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#31", + "pinName": "O1" + }, + "name": "unnamedWire#223", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#31", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O42" + }, + "name": "unnamedWire#224", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#31", + "pinName": "O3" + }, + "name": "unnamedWire#225", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O10" + }, + "name": "unnamedWire#226", + "path": [ + { + "x": 680.0, + "y": 795.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#33", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#29", + "pinName": "I" + }, + "name": "unnamedWire#227", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#34", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#28", + "pinName": "I" + }, + "name": "unnamedWire#228", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#32", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#27", + "pinName": "I" + }, + "name": "unnamedWire#229", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#2", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "Cn" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 1090.0, + "y": 520.0 + }, + { + "x": 1090.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#32", + "pinName": "O0" + }, + "name": "unnamedWire#230", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#32", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#35", + "pinName": "O1" + }, + "name": "unnamedWire#231", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#32", + "pinName": "O2" + }, + "name": "unnamedWire#232", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#34", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#35", + "pinName": "O3" + }, + "name": "unnamedWire#233", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#34", + "pinName": "O1" + }, + "name": "unnamedWire#234", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#34", + "pinName": "O2" + }, + "name": "unnamedWire#235", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#33", + "pinName": "O0" + }, + "name": "unnamedWire#236", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#33", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#237", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#35", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#33", + "pinName": "O2" + }, + "name": "unnamedWire#238", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#35", + "pinName": "O7" + }, + "name": "unnamedWire#239", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "I" + }, + "name": "unnamedWire#240", + "path": [ + { + "x": 720.0, + "y": 730.0 + }, + { + "x": 545.0, + "y": 730.0 + }, + { + "x": 545.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "Am2900MainMemory#0", + "pinName": "RW" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O0" + }, + "name": "unnamedWire#241", + "path": [ + { + "x": 175.0, + "y": 100.0 + }, + { + "x": 175.0, + "y": 290.0 + }, + { + "x": 345.0, + "y": 290.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "I" + }, + "name": "unnamedWire#242", + "path": [ + { + "x": 590.0, + "y": 150.0 + }, + { + "x": 590.0, + "y": 335.0 + }, + { + "x": 240.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#42", + "pinName": "O3" + }, + "name": "unnamedWire#243", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#42", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O14" + }, + "name": "unnamedWire#244", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#42", + "pinName": "O1" + }, + "name": "unnamedWire#245", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#42", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O12" + }, + "name": "unnamedWire#246", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#43", + "pinName": "O3" + }, + "name": "unnamedWire#247", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#43", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O10" + }, + "name": "unnamedWire#248", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#43", + "pinName": "O1" + }, + "name": "unnamedWire#249", + "path": [] + }, + { + "pin1": { + "compName": "@c", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#43", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O8" + }, + "name": "unnamedWire#250", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#44", + "pinName": "O3" + }, + "name": "unnamedWire#251", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#44", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O6" + }, + "name": "unnamedWire#252", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#44", + "pinName": "O1" + }, + "name": "unnamedWire#253", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#44", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O4" + }, + "name": "unnamedWire#254", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#45", + "pinName": "O3" + }, + "name": "unnamedWire#255", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#45", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O2" + }, + "name": "unnamedWire#256", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#36", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#45", + "pinName": "O1" + }, + "name": "unnamedWire#257", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#45", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "O0" + }, + "name": "unnamedWire#258", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#38", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O15" + }, + "name": "unnamedWire#259", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "C" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 1090.0, + "y": 395.0 + }, + { + "x": 1090.0, + "y": 495.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O14" + }, + "pin2": { + "compName": "Splitter#38", + "pinName": "O2" + }, + "name": "unnamedWire#260", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#38", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O13" + }, + "name": "unnamedWire#261", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O12" + }, + "pin2": { + "compName": "Splitter#38", + "pinName": "O0" + }, + "name": "unnamedWire#262", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#39", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O11" + }, + "name": "unnamedWire#263", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O10" + }, + "pin2": { + "compName": "Splitter#39", + "pinName": "O2" + }, + "name": "unnamedWire#264", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#39", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O9" + }, + "name": "unnamedWire#265", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#39", + "pinName": "O0" + }, + "name": "unnamedWire#266", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#40", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O7" + }, + "name": "unnamedWire#267", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#40", + "pinName": "O2" + }, + "name": "unnamedWire#268", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#40", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O5" + }, + "name": "unnamedWire#269", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#2", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 965.0, + "y": 495.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#40", + "pinName": "O0" + }, + "name": "unnamedWire#270", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#41", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O3" + }, + "name": "unnamedWire#271", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#41", + "pinName": "O2" + }, + "name": "unnamedWire#272", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#41", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#37", + "pinName": "O1" + }, + "name": "unnamedWire#273", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#41", + "pinName": "O0" + }, + "name": "unnamedWire#274", + "path": [] + }, + { + "pin1": { + "compName": "mux1_16#1", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#36", + "pinName": "I" + }, + "name": "unnamedWire#275", + "path": [ + { + "x": 970.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_16#1", + "pinName": "S" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O74" + }, + "name": "unnamedWire#276", + "path": [ + { + "x": 905.0, + "y": 220.0 + }, + { + "x": 905.0, + "y": 210.0 + }, + { + "x": 1230.0, + "y": 210.0 + }, + { + "x": 1230.0, + "y": 760.0 + }, + { + "x": 1085.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#26", + "pinName": "I" + }, + "pin2": { + "compName": "mux1_16#1", + "pinName": "I0" + }, + "name": "unnamedWire#277", + "path": [ + { + "x": 1000.0, + "y": 740.0 + }, + { + "x": 1235.0, + "y": 740.0 + }, + { + "x": 1235.0, + "y": 205.0 + }, + { + "x": 900.0, + "y": 205.0 + }, + { + "x": 900.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#37", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#278", + "path": [ + { + "x": 970.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "name": "unnamedWire#279", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#1", + "pinName": "IN" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#280", + "path": [ + { + "x": 985.0, + "y": 625.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "IN" + }, + "name": "unnamedWire#281", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I1" + }, + "name": "unnamedWire#282", + "path": [ + { + "x": 420.0, + "y": 95.0 + }, + { + "x": 245.0, + "y": 95.0 + }, + { + "x": 245.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#283", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "name": "unnamedWire#284", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#285", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "name": "unnamedWire#286", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#287", + "path": [ + { + "x": 450.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "OUT" + }, + "name": "unnamedWire#288", + "path": [ + { + "x": 455.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "dff16_invwe#0", + "pinName": "D" + }, + "name": "unnamedWire#289", + "path": [ + { + "x": 475.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#1", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 840.0, + "y": 495.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#46", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#290", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O1" + }, + "pin2": { + "compName": "dff16_invwe#0", + "pinName": "_WE" + }, + "name": "unnamedWire#291", + "path": [ + { + "x": 355.0, + "y": 285.0 + }, + { + "x": 485.0, + "y": 285.0 + }, + { + "x": 485.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "name": "unnamedWire#292", + "path": [ + { + "x": 315.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "name": "unnamedWire#293", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "name": "unnamedWire#294", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "name": "unnamedWire#295", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#48", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O4" + }, + "name": "unnamedWire#296", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#48", + "pinName": "O1" + }, + "name": "unnamedWire#297", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#48", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O2" + }, + "name": "unnamedWire#298", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O11" + }, + "name": "unnamedWire#299", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#1", + "pinName": "Qn+3" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "Qn" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 960.0, + "y": 515.0 + }, + { + "x": 960.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O10" + }, + "name": "unnamedWire#300", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O9" + }, + "name": "unnamedWire#301", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#47", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#302", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "pin2": { + "compName": "Splitter#47", + "pinName": "O2" + }, + "name": "unnamedWire#303", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#47", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#304", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "pin2": { + "compName": "Splitter#47", + "pinName": "O0" + }, + "name": "unnamedWire#305", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#49", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_1" + }, + "name": "unnamedWire#306", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_2" + }, + "pin2": { + "compName": "Splitter#49", + "pinName": "O2" + }, + "name": "unnamedWire#307", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#49", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_3" + }, + "name": "unnamedWire#308", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_4" + }, + "pin2": { + "compName": "Splitter#49", + "pinName": "O0" + }, + "name": "unnamedWire#309", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "C" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 715.0, + "y": 495.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#47", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#30", + "pinName": "I" + }, + "name": "unnamedWire#310", + "path": [ + { + "x": 600.0, + "y": 215.0 + }, + { + "x": 600.0, + "y": 335.0 + }, + { + "x": 690.0, + "y": 335.0 + }, + { + "x": 690.0, + "y": 675.0 + }, + { + "x": 810.0, + "y": 675.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#31", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#49", + "pinName": "I" + }, + "name": "unnamedWire#311", + "path": [ + { + "x": 760.0, + "y": 785.0 + }, + { + "x": 800.0, + "y": 785.0 + }, + { + "x": 800.0, + "y": 685.0 + }, + { + "x": 700.0, + "y": 685.0 + }, + { + "x": 700.0, + "y": 345.0 + }, + { + "x": 610.0, + "y": 345.0 + }, + { + "x": 610.0, + "y": 310.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O44" + }, + "name": "unnamedWire#312", + "path": [ + { + "x": 605.0, + "y": 150.0 + }, + { + "x": 605.0, + "y": 340.0 + }, + { + "x": 695.0, + "y": 340.0 + }, + { + "x": 695.0, + "y": 680.0 + }, + { + "x": 805.0, + "y": 680.0 + }, + { + "x": 805.0, + "y": 800.0 + }, + { + "x": 785.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "S0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O39" + }, + "name": "unnamedWire#313", + "path": [ + { + "x": 615.0, + "y": 245.0 + }, + { + "x": 615.0, + "y": 350.0 + }, + { + "x": 705.0, + "y": 350.0 + }, + { + "x": 705.0, + "y": 690.0 + }, + { + "x": 795.0, + "y": 690.0 + }, + { + "x": 795.0, + "y": 790.0 + }, + { + "x": 735.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#35", + "pinName": "I" + }, + "name": "unnamedWire#314", + "path": [ + { + "x": 820.0, + "y": 735.0 + }, + { + "x": 875.0, + "y": 735.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#315", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "name": "unnamedWire#316", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "I" + }, + "name": "unnamedWire#317", + "path": [ + { + "x": 820.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "I" + }, + "name": "unnamedWire#318", + "path": [ + { + "x": 945.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "I" + }, + "name": "unnamedWire#319", + "path": [ + { + "x": 1070.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 715.0, + "y": 365.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "I" + }, + "name": "unnamedWire#320", + "path": [ + { + "x": 1205.0, + "y": 530.0 + }, + { + "x": 1205.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#38", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "Y" + }, + "name": "unnamedWire#321", + "path": [ + { + "x": 910.0, + "y": 545.0 + }, + { + "x": 1185.0, + "y": 545.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#39", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "Y" + }, + "name": "unnamedWire#322", + "path": [ + { + "x": 950.0, + "y": 550.0 + }, + { + "x": 1050.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#40", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "Y" + }, + "name": "unnamedWire#323", + "path": [ + { + "x": 990.0, + "y": 555.0 + }, + { + "x": 925.0, + "y": 555.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#41", + "pinName": "I" + }, + "name": "unnamedWire#324", + "path": [ + { + "x": 800.0, + "y": 560.0 + }, + { + "x": 1030.0, + "y": 560.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#45", + "pinName": "I" + }, + "name": "unnamedWire#325", + "path": [ + { + "x": 785.0, + "y": 375.0 + }, + { + "x": 1030.0, + "y": 375.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#44", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "D" + }, + "name": "unnamedWire#326", + "path": [ + { + "x": 990.0, + "y": 370.0 + }, + { + "x": 910.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#43", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "D" + }, + "name": "unnamedWire#327", + "path": [ + { + "x": 950.0, + "y": 365.0 + }, + { + "x": 1035.0, + "y": 365.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#42", + "pinName": "I" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "D" + }, + "name": "unnamedWire#328", + "path": [ + { + "x": 910.0, + "y": 360.0 + }, + { + "x": 1170.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#329", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Cn" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "C0" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 675.0, + "y": 505.0 + }, + { + "x": 675.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I0" + }, + "name": "unnamedWire#330", + "path": [ + { + "x": 250.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O8" + }, + "name": "unnamedWire#331", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#1", + "pinName": "" + }, + "name": "unnamedWire#332", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "BitDisplay#2", + "pinName": "" + }, + "name": "unnamedWire#333", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#334", + "path": [ + { + "x": 340.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#335", + "path": [ + { + "x": 185.0, + "y": 230.0 + }, + { + "x": 185.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "name": "unnamedWire#336", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O7" + }, + "name": "unnamedWire#337", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#338", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#339", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "C" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 445.0, + "y": 365.0981951658187 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O6" + }, + "name": "unnamedWire#340", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O5" + }, + "name": "unnamedWire#341", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O4" + }, + "name": "unnamedWire#342", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "mux1_12#0", + "pinName": "I0" + }, + "name": "unnamedWire#343", + "path": [ + { + "x": 260.0, + "y": 440.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#5", + "pinName": "EN" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "name": "unnamedWire#344", + "path": [ + { + "x": 215.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O38" + }, + "pin2": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "name": "unnamedWire#345", + "path": [ + { + "x": 725.0, + "y": 805.0 + }, + { + "x": 825.0, + "y": 805.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "name": "unnamedWire#346", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "name": "unnamedWire#347", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "dlatch80#0", + "pinName": "E" + }, + "name": "unnamedWire#348", + "path": [ + { + "x": 235.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#349", + "path": [] + }, + { + "pin1": { + "compName": "FixedOutput#1", + "pinName": "out" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OECT" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 660.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#350", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "@dlatch80#1", + "pinName": "E" + }, + "name": "unnamedWire#351", + "path": [ + { + "x": 290.0, + "y": 535.0 + }, + { + "x": 290.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "FixedOutput#2", + "pinName": "out" + }, + "pin2": { + "compName": "Am2910#0", + "pinName": "_RLD" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "Am2910#0", + "pinName": "CI" + }, + "pin2": { + "compName": "FixedOutput#3", + "pinName": "out" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 480.0, + "y": 540.0 + }, + { + "x": 480.0, + "y": 570.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910#0", + "pinName": "_OE" + }, + "pin2": { + "compName": "FixedOutput#4", + "pinName": "out" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 445.0, + "y": 580.0 + } + ] + }, + { + "pin1": { + "compName": "FixedOutput#5", + "pinName": "out" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_SE" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#2", + "pinName": "RAMn" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "RAMn+3" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 955.0, + "y": 410.0 + }, + { + "x": 955.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "FixedOutput#6", + "pinName": "out" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 560.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EZ" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EOVR" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 575.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EC" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EN" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "dff16_invwe#0", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O7" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O5" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "RAMn" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "RAMn+3" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 1080.0, + "y": 410.0 + }, + { + "x": 1080.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O3" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O2" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O0" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "FixedOutput#0", + "pinName": "out" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 570.0, + "y": 280.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O3" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 570.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O3" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O1" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#2", + "pinName": "Qn+3" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "Qn" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 1085.0, + "y": 515.0 + }, + { + "x": 1085.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O1" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_1" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_2" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_3" + }, + "name": "unnamedWire#69", + "path": [] + }, + { + "pin1": { + "compName": "Am2901#0", + "pinName": "Qn" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "QIO0" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 685.0, + "y": 420.0 + }, + { + "x": 685.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_4" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 610.0, + "y": 250.0 + }, + { + "x": 610.0, + "y": 270.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 610.0, + "y": 210.0 + }, + { + "x": 610.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O3" + }, + "name": "unnamedWire#73", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O1" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O3" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y2" + }, + "name": "unnamedWire#78", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O1" + }, + "name": "unnamedWire#79", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "SIO0" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "RAMn" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 680.0, + "y": 525.0 + }, + { + "x": 680.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y4" + }, + "name": "unnamedWire#80", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "A" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 820.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#0", + "pinName": "B" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 825.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "A" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 945.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#1", + "pinName": "B" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 950.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "A" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 1070.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#2", + "pinName": "B" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 1075.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "A" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 1205.0, + "y": 385.0 + }, + { + "x": 1205.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901#3", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 1210.0, + "y": 435.0 + }, + { + "x": 1210.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "SIOn" + }, + "pin2": { + "compName": "Am2901#3", + "pinName": "RAMn+3" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 535.0, + "y": 525.0 + }, + { + "x": 535.0, + "y": 655.0 + }, + { + "x": 1210.0, + "y": 655.0 + }, + { + "x": 1210.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "OUT" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 1245.0, + "y": 60.0 + }, + { + "x": 1245.0, + "y": 625.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#1", + "pinName": "I1" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 895.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 1240.0, + "y": 45.0 + }, + { + "x": 1240.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "xor#2", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "C" + }, + "name": "unnamedWire#94", + "path": [ + { + "x": 245.0, + "y": 270.0 + }, + { + "x": 365.0, + "y": 270.0 + }, + { + "x": 365.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "@bz_pc_cpol", + "pinName": "" + }, + "pin2": { + "compName": "xor#2", + "pinName": "B" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "@c", + "pinName": "" + }, + "pin2": { + "compName": "xor#2", + "pinName": "A" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "B" + }, + "pin2": { + "compName": "@ireg_cpol", + "pinName": "" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "A" + }, + "pin2": { + "compName": "@c", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "A" + }, + "pin2": { + "compName": "@c", + "pinName": "" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2900", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json new file mode 100644 index 00000000..7a0b4b2c --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/_rsLatch.json @@ -0,0 +1,253 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "_Q", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "_R", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "_S", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 7.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 40.0, + "y": 12.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 34.0, + "y": 16.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 64.0, + "y": 36.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_Q" + }, + "name": "_q", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "q", + "path": [ + { + "x": 35.0, + "y": 17.5 + }, + { + "x": 35.0, + "y": 7.5 + }, + { + "x": 65.0, + "y": 7.5 + }, + { + "x": 65.0, + "y": 12.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_S" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_R" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 35.0, + "y": 37.5 + }, + { + "x": 35.0, + "y": 27.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 65.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 65.0, + "y": 42.5 + }, + { + "x": 5.0, + "y": 42.5 + }, + { + "x": 5.0, + "y": 22.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "_rsLatch", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "wireForcing", + "params": { + "wiresToForce": [ + "q" + ], + "wiresToForceInverted": [ + "_q" + ] + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json new file mode 100644 index 00000000..270afa21 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901.json @@ -0,0 +1,4003 @@ +{ + "width": 90.0, + "height": 125.0, + "interfacePins": [ + { + "location": { + "x": 90.0, + "y": 15.0 + }, + "name": "A", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 90.0, + "y": 35.0 + }, + "name": "B", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 105.0 + }, + "name": "Cn", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 90.0, + "y": 120.0 + }, + "name": "Cn+4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 0.0 + }, + "name": "D", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "F3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "F\u003d0", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 90.0, + "y": 80.0 + }, + "name": "I", + "logicWidth": 9, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "OVR", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "Qn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 90.0, + "y": 115.0 + }, + "name": "Qn+3", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "RAMn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 90.0, + "y": 110.0 + }, + "name": "RAMn+3", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 75.0, + "y": 125.0 + }, + "name": "Y", + "logicWidth": 4, + "usage": "INPUT" + } + ], + "innerScale": 0.1, + "submodel": { + "components": [ + { + "id": "Am2901ALUInclSourceDecodeInclFunctionDecode", + "name": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pos": { + "x": 510.0, + "y": 620.0 + } + }, + { + "id": "Am2901DestDecode", + "name": "Am2901DestDecode#0", + "pos": { + "x": 380.0, + "y": 160.0 + } + }, + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 465.0, + "y": 190.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 420.0, + "y": 440.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 855.0, + "y": 760.0 + }, + "params": { + "logicWidth": 9, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 735.0, + "y": 1235.0 + }, + "params": { + "logicWidth": 4, + "orientation": "UP" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 670.0, + "y": 135.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 670.0, + "y": 335.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#5", + "pos": { + "x": 475.0, + "y": 615.0 + }, + "params": { + "logicWidth": 4, + "orientation": "DOWN" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 355.0, + "y": 920.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#1", + "pos": { + "x": 370.0, + "y": 850.0 + }, + "params": { + "logicWidth": 1, + "orientation": "DOWN" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#2", + "pos": { + "x": 400.0, + "y": 950.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#3", + "pos": { + "x": 400.0, + "y": 725.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT_ALT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 14.0, + "y": 714.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 459.0, + "y": 194.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 239.0, + "y": 929.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 244.0, + "y": 939.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 249.0, + "y": 949.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 254.0, + "y": 959.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 319.0, + "y": 929.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 334.0, + "y": 959.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 134.0, + "y": 1039.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 139.0, + "y": 1049.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 379.0, + "y": 529.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 394.0, + "y": 544.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 254.0, + "y": 749.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 434.0, + "y": 734.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 354.0, + "y": 504.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 359.0, + "y": 509.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 364.0, + "y": 514.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 369.0, + "y": 519.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 354.0, + "y": 449.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 359.0, + "y": 459.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 364.0, + "y": 469.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 369.0, + "y": 479.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 104.0, + "y": 769.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 134.0, + "y": 729.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 109.0, + "y": 779.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 114.0, + "y": 789.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#32", + "pos": { + "x": 109.0, + "y": 809.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#33", + "pos": { + "x": 114.0, + "y": 819.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#34", + "pos": { + "x": 119.0, + "y": 829.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#35", + "pos": { + "x": 104.0, + "y": 799.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#36", + "pos": { + "x": 109.0, + "y": 839.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#37", + "pos": { + "x": 114.0, + "y": 849.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#38", + "pos": { + "x": 119.0, + "y": 859.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#39", + "pos": { + "x": 414.0, + "y": 449.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 129.0, + "y": 739.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#40", + "pos": { + "x": 99.0, + "y": 964.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#41", + "pos": { + "x": 99.0, + "y": 764.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#42", + "pos": { + "x": 124.0, + "y": 889.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#43", + "pos": { + "x": 364.0, + "y": 889.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#44", + "pos": { + "x": 134.0, + "y": 894.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#45", + "pos": { + "x": 409.0, + "y": 894.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#46", + "pos": { + "x": 424.0, + "y": 1079.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 124.0, + "y": 749.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 349.0, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 344.0, + "y": 374.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 339.0, + "y": 384.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 334.0, + "y": 394.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 495.0, + "y": 180.0 + } + }, + { + "id": "dff4", + "name": "dff4#0", + "pos": { + "x": 200.0, + "y": 925.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#0", + "pos": { + "x": 720.0, + "y": 170.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#1", + "pos": { + "x": 260.0, + "y": 690.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 500.0, + "y": 350.0 + } + }, + { + "id": "or4", + "name": "or4#0", + "pos": { + "x": 375.0, + "y": 445.0 + } + }, + { + "id": "ram4", + "name": "ram4#0", + "pos": { + "x": 655.0, + "y": 170.0 + } + }, + { + "id": "sel3_4", + "name": "sel3_4#0", + "pos": { + "x": 145.0, + "y": 725.0 + } + }, + { + "id": "sel3_4", + "name": "sel3_4#1", + "pos": { + "x": 150.0, + "y": 925.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "Am2901DestDecode#0", + "pinName": "I6" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 845.0, + "y": 780.0 + }, + { + "x": 845.0, + "y": 305.0 + }, + { + "x": 375.0, + "y": 305.0 + }, + { + "x": 375.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I5" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 805.0, + "y": 790.0 + }, + { + "x": 805.0, + "y": 615.0 + }, + { + "x": 585.0, + "y": 615.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 15.0, + "y": 90.0 + }, + { + "x": 460.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "F3" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#100", + "path": [ + { + "x": 625.0, + "y": 645.0 + }, + { + "x": 625.0, + "y": 540.0 + }, + { + "x": 390.0, + "y": 540.0 + }, + { + "x": 390.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 395.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#102", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#104", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "name": "unnamedWire#105", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "or4#0", + "pinName": "A1" + }, + "name": "unnamedWire#106", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "or4#0", + "pinName": "A2" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "or4#0", + "pinName": "A3" + }, + "name": "unnamedWire#108", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "or4#0", + "pinName": "A4" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 355.0, + "y": 405.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 360.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 365.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 370.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 105.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#115", + "path": [ + { + "x": 110.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 115.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "name": "unnamedWire#117", + "path": [ + { + "x": 100.0, + "y": 960.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#119", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 460.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#120", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "name": "unnamedWire#121", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "name": "unnamedWire#122", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "name": "unnamedWire#123", + "path": [ + { + "x": 120.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "name": "unnamedWire#124", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#127", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#128", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "name": "unnamedWire#129", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 230.0, + "y": 715.0 + }, + { + "x": 230.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "name": "unnamedWire#130", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "name": "unnamedWire#131", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C1" + }, + "name": "unnamedWire#132", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C2" + }, + "name": "unnamedWire#133", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C3" + }, + "name": "unnamedWire#134", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "IN" + }, + "name": "unnamedWire#135", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "B1" + }, + "name": "unnamedWire#136", + "path": [ + { + "x": 105.0, + "y": 1000.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "B2" + }, + "name": "unnamedWire#137", + "path": [ + { + "x": 110.0, + "y": 1010.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "B3" + }, + "name": "unnamedWire#138", + "path": [ + { + "x": 115.0, + "y": 1020.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "B4" + }, + "name": "unnamedWire#139", + "path": [ + { + "x": 120.0, + "y": 1030.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "C" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 715.0, + "y": 750.0 + }, + { + "x": 715.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "D1" + }, + "name": "unnamedWire#140", + "path": [ + { + "x": 195.0, + "y": 730.0 + }, + { + "x": 195.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "D2" + }, + "name": "unnamedWire#141", + "path": [ + { + "x": 200.0, + "y": 740.0 + }, + { + "x": 200.0, + "y": 275.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "D3" + }, + "name": "unnamedWire#142", + "path": [ + { + "x": 205.0, + "y": 750.0 + }, + { + "x": 205.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "D4" + }, + "name": "unnamedWire#143", + "path": [ + { + "x": 210.0, + "y": 760.0 + }, + { + "x": 210.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "RAMWE" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#144", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#145" + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "WE" + }, + "name": "unnamedWire#146", + "path": [ + { + "x": 630.0, + "y": 185.0 + }, + { + "x": 630.0, + "y": 255.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "QWE" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "WE" + }, + "name": "unnamedWire#147", + "path": [ + { + "x": 450.0, + "y": 215.0 + }, + { + "x": 450.0, + "y": 245.0 + }, + { + "x": 190.0, + "y": 245.0 + }, + { + "x": 190.0, + "y": 980.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "YF" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#148", + "path": [ + { + "x": 435.0, + "y": 195.0 + }, + { + "x": 435.0, + "y": 355.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O0" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "D1" + }, + "name": "unnamedWire#149", + "path": [ + { + "x": 505.0, + "y": 630.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "Am2901DestDecode#0", + "pinName": "I8" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 835.0, + "y": 760.0 + }, + { + "x": 835.0, + "y": 315.0 + }, + { + "x": 365.0, + "y": 315.0 + }, + { + "x": 365.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#152", + "path": [ + { + "x": 555.0, + "y": 375.0 + }, + { + "x": 555.0, + "y": 520.0 + }, + { + "x": 740.0, + "y": 520.0 + }, + { + "x": 740.0, + "y": 1230.0 + }, + { + "x": 745.0, + "y": 1230.0 + } + ] + }, + { + "pin1": { + "compName": "or4#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#154", + "path": [ + { + "x": 415.0, + "y": 445.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#155", + "path": [ + { + "x": 415.0, + "y": 455.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F\u003d0" + }, + "name": "unnamedWire#156", + "path": [ + { + "x": 445.0, + "y": 450.0 + }, + { + "x": 445.0, + "y": 490.0 + }, + { + "x": 310.0, + "y": 490.0 + }, + { + "x": 310.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "name": "unnamedWire#157", + "path": [ + { + "x": 765.0, + "y": 1220.0 + }, + { + "x": 750.0, + "y": 1220.0 + }, + { + "x": 750.0, + "y": 510.0 + }, + { + "x": 565.0, + "y": 510.0 + }, + { + "x": 565.0, + "y": 355.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "name": "unnamedWire#158", + "path": [ + { + "x": 100.0, + "y": 1115.0 + }, + { + "x": 380.0, + "y": 1115.0 + }, + { + "x": 380.0, + "y": 930.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "IN" + }, + "name": "unnamedWire#159", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "C" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 255.0, + "y": 735.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#160", + "path": [ + { + "x": 100.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "OUT" + }, + "name": "unnamedWire#161", + "path": [ + { + "x": 100.0, + "y": 885.0 + }, + { + "x": 380.0, + "y": 885.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F3" + }, + "name": "unnamedWire#162", + "path": [ + { + "x": 5.0, + "y": 545.0 + }, + { + "x": 5.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "name": "unnamedWire#163", + "path": [ + { + "x": 550.0, + "y": 385.0 + }, + { + "x": 550.0, + "y": 525.0 + }, + { + "x": 735.0, + "y": 525.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#42", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#164", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#43", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "EN" + }, + "name": "unnamedWire#165", + "path": [ + { + "x": 395.0, + "y": 890.0 + }, + { + "x": 395.0, + "y": 860.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#43", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "name": "unnamedWire#166", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#43", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#42", + "pinName": "" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#44", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#44", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#45", + "pinName": "" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "C" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 255.0, + "y": 900.0 + }, + { + "x": 195.0, + "y": 900.0 + }, + { + "x": 195.0, + "y": 970.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "EN" + }, + "pin2": { + "compName": "WireCrossPoint#45", + "pinName": "" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "IN" + }, + "name": "unnamedWire#171", + "path": [ + { + "x": 395.0, + "y": 735.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "C4" + }, + "pin2": { + "compName": "WireCrossPoint#46", + "pinName": "" + }, + "name": "unnamedWire#172", + "path": [ + { + "x": 145.0, + "y": 1070.0 + }, + { + "x": 145.0, + "y": 1080.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#46", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "OUT" + }, + "name": "unnamedWire#173", + "path": [ + { + "x": 425.0, + "y": 960.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#46", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Qn+3" + }, + "name": "unnamedWire#174", + "path": [ + { + "x": 425.0, + "y": 1150.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "B0" + }, + "name": "unnamedWire#178", + "path": [ + { + "x": 635.0, + "y": 365.0 + }, + { + "x": 635.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "name": "unnamedWire#179", + "path": [] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "LSH" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 420.0, + "y": 205.0 + }, + { + "x": 420.0, + "y": 240.0 + }, + { + "x": 135.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "NSH" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 425.0, + "y": 165.0 + }, + { + "x": 425.0, + "y": 235.0 + }, + { + "x": 130.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I4" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 800.0, + "y": 800.0 + }, + { + "x": 800.0, + "y": 610.0 + }, + { + "x": 575.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901DestDecode#0", + "pinName": "RSH" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 430.0, + "y": 175.0 + }, + { + "x": 430.0, + "y": 230.0 + }, + { + "x": 125.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "SA" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "SB" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "SC" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#44", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "SA" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 135.0, + "y": 930.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "SB" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 130.0, + "y": 940.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "SC" + }, + "pin2": { + "compName": "WireCrossPoint#42", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 125.0, + "y": 950.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "B3" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 650.0, + "y": 245.0 + }, + { + "x": 650.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "B2" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 645.0, + "y": 235.0 + }, + { + "x": 645.0, + "y": 345.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I3" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 795.0, + "y": 810.0 + }, + { + "x": 795.0, + "y": 605.0 + }, + { + "x": 565.0, + "y": 605.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "B1" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 640.0, + "y": 355.0 + }, + { + "x": 640.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 490.0, + "y": 480.0 + }, + { + "x": 600.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "D4" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O3" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 475.0, + "y": 645.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O2" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "D3" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 485.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "D2" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O1" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 495.0, + "y": 635.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QA1" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D1" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QA2" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D2" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QA3" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D3" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QA4" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D4" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QB1" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D1" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 695.0, + "y": 215.0 + }, + { + "x": 695.0, + "y": 575.0 + }, + { + "x": 250.0, + "y": 575.0 + }, + { + "x": 250.0, + "y": 695.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I2" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 790.0, + "y": 820.0 + }, + { + "x": 790.0, + "y": 600.0 + }, + { + "x": 555.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QB2" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D2" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 700.0, + "y": 225.0 + }, + { + "x": 700.0, + "y": 570.0 + }, + { + "x": 245.0, + "y": 570.0 + }, + { + "x": 245.0, + "y": 705.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QB3" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D3" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 705.0, + "y": 235.0 + }, + { + "x": 705.0, + "y": 565.0 + }, + { + "x": 240.0, + "y": 565.0 + }, + { + "x": 240.0, + "y": 715.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "QB4" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D4" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 710.0, + "y": 245.0 + }, + { + "x": 710.0, + "y": 560.0 + }, + { + "x": 235.0, + "y": 560.0 + }, + { + "x": 235.0, + "y": 725.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cn" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Cn" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 55.0, + "y": 1050.0 + }, + { + "x": 55.0, + "y": 600.0 + }, + { + "x": 520.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "ram4#0", + "pinName": "A0" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 650.0, + "y": 175.0 + }, + { + "x": 650.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "A1" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 645.0, + "y": 155.0 + }, + { + "x": 645.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "A2" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 640.0, + "y": 145.0 + }, + { + "x": 640.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "pin2": { + "compName": "ram4#0", + "pinName": "A3" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 635.0, + "y": 135.0 + }, + { + "x": 635.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 765.0, + "y": 175.0 + }, + { + "x": 765.0, + "y": 80.0 + }, + { + "x": 350.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 770.0, + "y": 185.0 + }, + { + "x": 770.0, + "y": 75.0 + }, + { + "x": 345.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I1" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 785.0, + "y": 830.0 + }, + { + "x": 785.0, + "y": 595.0 + }, + { + "x": 545.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [ + { + "x": 775.0, + "y": 195.0 + }, + { + "x": 775.0, + "y": 70.0 + }, + { + "x": 340.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [ + { + "x": 780.0, + "y": 205.0 + }, + { + "x": 780.0, + "y": 65.0 + }, + { + "x": 335.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "A1" + }, + "name": "unnamedWire#56", + "path": [ + { + "x": 350.0, + "y": 655.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "A2" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 345.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "A3" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 340.0, + "y": 665.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "A4" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 335.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "I0" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 780.0, + "y": 840.0 + }, + { + "x": 780.0, + "y": 590.0 + }, + { + "x": 535.0, + "y": 590.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q1" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "B1" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 300.0, + "y": 695.0 + }, + { + "x": 300.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q2" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "B2" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 305.0, + "y": 705.0 + }, + { + "x": 305.0, + "y": 685.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q3" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "B3" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 310.0, + "y": 715.0 + }, + { + "x": 310.0, + "y": 690.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q4" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "B4" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 315.0, + "y": 725.0 + }, + { + "x": 315.0, + "y": 695.0 + } + ] + }, + { + "pin1": { + "compName": "dff4#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "dff4#0", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "dff4#0", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "dff4#0", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "name": "unnamedWire#69", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Qn" + }, + "pin2": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 80.0, + "y": 200.0 + }, + { + "x": 80.0, + "y": 965.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 245.0, + "y": 1095.0 + }, + { + "x": 130.0, + "y": 1095.0 + }, + { + "x": 130.0, + "y": 1050.0 + }, + { + "x": 135.0, + "y": 1050.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 250.0, + "y": 1100.0 + }, + { + "x": 135.0, + "y": 1100.0 + }, + { + "x": 135.0, + "y": 1055.0 + }, + { + "x": 140.0, + "y": 1055.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "C1" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "C2" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "C3" + }, + "name": "unnamedWire#76", + "path": [ + { + "x": 255.0, + "y": 1105.0 + }, + { + "x": 140.0, + "y": 1105.0 + }, + { + "x": 140.0, + "y": 1060.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "Am2901DestDecode#0", + "pinName": "I7" + }, + "name": "unnamedWire#77", + "path": [ + { + "x": 840.0, + "y": 770.0 + }, + { + "x": 840.0, + "y": 310.0 + }, + { + "x": 370.0, + "y": 310.0 + }, + { + "x": 370.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "RAMn" + }, + "pin2": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 75.0, + "y": 100.0 + }, + { + "x": 75.0, + "y": 765.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "A2" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 240.0, + "y": 1090.0 + }, + { + "x": 125.0, + "y": 1090.0 + }, + { + "x": 125.0, + "y": 1045.0 + }, + { + "x": 130.0, + "y": 1045.0 + }, + { + "x": 130.0, + "y": 970.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 755.0, + "y": 1225.0 + }, + { + "x": 745.0, + "y": 1225.0 + }, + { + "x": 745.0, + "y": 515.0 + }, + { + "x": 560.0, + "y": 515.0 + }, + { + "x": 560.0, + "y": 365.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Q1" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 320.0, + "y": 705.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Q2" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 325.0, + "y": 940.0 + }, + { + "x": 325.0, + "y": 710.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Q3" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 330.0, + "y": 950.0 + }, + { + "x": 330.0, + "y": 715.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Q4" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 335.0, + "y": 720.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "A3" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 135.0, + "y": 980.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#1", + "pinName": "A4" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 140.0, + "y": 990.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "D1" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "D2" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "D3" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "sel3_4#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "dff4#0", + "pinName": "D4" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 15.0, + "y": 950.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cn+4" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 615.0, + "y": 665.0 + }, + { + "x": 615.0, + "y": 1200.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "OVR" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "OVR" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 610.0, + "y": 675.0 + }, + { + "x": 610.0, + "y": 1125.0 + }, + { + "x": 95.0, + "y": 1125.0 + }, + { + "x": 95.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "F1" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 635.0, + "y": 625.0 + }, + { + "x": 635.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "F4" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 620.0, + "y": 655.0 + }, + { + "x": 620.0, + "y": 545.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#45", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#3", + "pinName": "EN" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C4" + }, + "name": "unnamedWire#96", + "path": [ + { + "x": 435.0, + "y": 795.0 + }, + { + "x": 195.0, + "y": 795.0 + }, + { + "x": 195.0, + "y": 880.0 + }, + { + "x": 140.0, + "y": 880.0 + }, + { + "x": 140.0, + "y": 870.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RAMn+3" + }, + "name": "unnamedWire#97", + "path": [ + { + "x": 455.0, + "y": 735.0 + }, + { + "x": 455.0, + "y": 1100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [ + { + "x": 380.0, + "y": 505.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclSourceDecodeInclFunctionDecode#0", + "pinName": "F2" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#99", + "path": [ + { + "x": 630.0, + "y": 635.0 + }, + { + "x": 630.0, + "y": 535.0 + }, + { + "x": 385.0, + "y": 535.0 + }, + { + "x": 385.0, + "y": 510.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "qreg": { + "id": "delegating", + "params": { + "delegateTarget": "dff4#0" + } + }, + "regs": { + "id": "delegating", + "params": { + "delegateTarget": "ram4#0" + } + } + }, + "atomicHighLevelStates": {} + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json new file mode 100644 index 00000000..90f0ad95 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json @@ -0,0 +1,725 @@ +{ + "width": 35.0, + "height": 60.0, + "interfacePins": [ + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "CinE", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "FN", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "I5", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "L", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "RN", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "SBE", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "SN", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 15.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 15.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 55.0, + "y": 45.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 55.0, + "y": 70.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 100.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 39.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 4.0, + "y": 44.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 9.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 9.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 9.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 9.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 49.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 49.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 39.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 100.0, + "y": 135.0 + } + }, + { + "id": "nand3", + "name": "nand3#0", + "pos": { + "x": 55.0, + "y": 10.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I5" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SN" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 10.0, + "y": 105.0 + }, + { + "x": 135.0, + "y": 105.0 + }, + { + "x": 135.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I3" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 50.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RN" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 50.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 50.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "CinE" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 40.0, + "y": 5.0 + }, + { + "x": 115.0, + "y": 5.0 + }, + { + "x": 115.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "C" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 40.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "nand3#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#27" + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#28" + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#29" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "L" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SBE" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 45.0, + "y": 45.0 + }, + { + "x": 45.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "FN" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 5.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "A" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 40.0 + }, + { + "x": 45.0, + "y": 40.0 + }, + { + "x": 45.0, + "y": 15.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901ALUFuncDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json new file mode 100644 index 00000000..9652a6d6 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json @@ -0,0 +1,1541 @@ +{ + "width": 35.0, + "height": 120.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "Cn", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "Cn+4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "F1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "F2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "F3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "F4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "I5", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "OVR", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "R1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "R2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "R3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "R4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "S2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 105.0 + }, + "name": "S3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 115.0 + }, + "name": "S4", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "Am2901ALUFuncDecode", + "name": "Am2901ALUFuncDecode#0", + "pos": { + "x": 20.0, + "y": 2.5 + } + }, + { + "id": "Am2901ALUOneBit", + "name": "Am2901ALUOneBit#0", + "pos": { + "x": 45.0, + "y": 80.0 + } + }, + { + "id": "Am2901ALUOneBit", + "name": "Am2901ALUOneBit#1", + "pos": { + "x": 45.0, + "y": 180.0 + } + }, + { + "id": "Am2901ALUOneBit", + "name": "Am2901ALUOneBit#2", + "pos": { + "x": 45.0, + "y": 280.0 + } + }, + { + "id": "Am2901ALUOneBit", + "name": "Am2901ALUOneBit#3", + "pos": { + "x": 45.0, + "y": 380.0 + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 24.0, + "y": 94.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 194.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 31.5, + "y": 244.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 31.5, + "y": 344.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 34.0, + "y": 154.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 34.0, + "y": 254.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 34.0, + "y": 354.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 36.5, + "y": 164.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 36.5, + "y": 264.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 36.5, + "y": 364.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 84.0, + "y": 374.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 84.0, + "y": 384.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 24.0, + "y": 294.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 26.5, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 26.5, + "y": 204.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 26.5, + "y": 304.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 29.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 29.0, + "y": 224.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 29.0, + "y": 324.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 31.5, + "y": 144.0 + }, + "params": 1 + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 95.0, + "y": 400.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I5" + }, + "pin2": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "I5" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 5.0, + "y": 20.0 + }, + { + "x": 5.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I4" + }, + "pin2": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "I4" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 10.0, + "y": 60.0 + }, + { + "x": 10.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "CinE" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 70.0, + "y": 7.5 + }, + { + "x": 70.0, + "y": 77.5 + }, + { + "x": 27.5, + "y": 77.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "CinE" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "CinE" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "CinE" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "CinE" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 27.5, + "y": 405.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "RN" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 57.5, + "y": 57.5 + }, + { + "x": 57.5, + "y": 65.0 + }, + { + "x": 30.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I3" + }, + "pin2": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "I3" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 15.0, + "y": 100.0 + }, + { + "x": 15.0, + "y": 27.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "RN" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "RN" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "RN" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "RN" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 30.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "SN" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 65.0, + "y": 27.5 + }, + { + "x": 65.0, + "y": 72.5 + }, + { + "x": 32.5, + "y": 72.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "SN" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "SN" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "SN" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "SBE" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 62.5, + "y": 37.5 + }, + { + "x": 62.5, + "y": 70.0 + }, + { + "x": 25.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "SN" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 32.5, + "y": 445.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "FN" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 60.0, + "y": 47.5 + }, + { + "x": 60.0, + "y": 67.5 + }, + { + "x": 35.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "FN" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "FN" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "FN" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "FN" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 35.0, + "y": 455.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUFuncDecode#0", + "pinName": "L" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 67.5, + "y": 17.5 + }, + { + "x": 67.5, + "y": 75.0 + }, + { + "x": 37.5, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "L" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "L" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "L" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "L" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 37.5, + "y": 465.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R1" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "R" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 10.0, + "y": 180.0 + }, + { + "x": 10.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R2" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "R" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 10.0, + "y": 220.0 + }, + { + "x": 10.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R3" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "R" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 10.0, + "y": 260.0 + }, + { + "x": 10.0, + "y": 315.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R4" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "R" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 20.0, + "y": 300.0 + }, + { + "x": 20.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "S" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 15.0, + "y": 340.0 + }, + { + "x": 15.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S2" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "S" + }, + "name": "unnamedWire#50", + "path": [ + { + "x": 5.0, + "y": 380.0 + }, + { + "x": 5.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S3" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "S" + }, + "name": "unnamedWire#51", + "path": [ + { + "x": 10.0, + "y": 420.0 + }, + { + "x": 10.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S4" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "S" + }, + "name": "unnamedWire#52", + "path": [ + { + "x": 10.0, + "y": 460.0 + }, + { + "x": 10.0, + "y": 435.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cn" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "Cin" + }, + "name": "unnamedWire#53", + "path": [ + { + "x": 5.0, + "y": 140.0 + }, + { + "x": 5.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#0", + "pinName": "Cout" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "Cin" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 85.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 175.0 + }, + { + "x": 40.0, + "y": 175.0 + }, + { + "x": 40.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#1", + "pinName": "Cout" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "Cin" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 85.0, + "y": 185.0 + }, + { + "x": 85.0, + "y": 275.0 + }, + { + "x": 40.0, + "y": 275.0 + }, + { + "x": 40.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#2", + "pinName": "Cout" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [ + { + "x": 85.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "Cin" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 40.0, + "y": 375.0 + }, + { + "x": 40.0, + "y": 385.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#3", + "pinName": "Cout" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#0", + "pinName": "F" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F1" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 90.0, + "y": 95.0 + }, + { + "x": 90.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#0", + "pinName": "CoutE" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#1", + "pinName": "F" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F2" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 95.0, + "y": 195.0 + }, + { + "x": 95.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#2", + "pinName": "F" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F3" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 100.0, + "y": 295.0 + }, + { + "x": 100.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUOneBit#3", + "pinName": "F" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F4" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 105.0, + "y": 395.0 + }, + { + "x": 105.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "A" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 90.0, + "y": 375.0 + }, + { + "x": 90.0, + "y": 405.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 85.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cn+4" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 130.0, + "y": 385.0 + }, + { + "x": 130.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "OVR" + }, + "name": "unnamedWire#66" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#1", + "pinName": "CoutE" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#2", + "pinName": "CoutE" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "Am2901ALUOneBit#3", + "pinName": "CoutE" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 25.0, + "y": 395.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901ALUInclDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json new file mode 100644 index 00000000..38b9bd59 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json @@ -0,0 +1,1346 @@ +{ + "width": 95.0, + "height": 110.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 70.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 0.0 + }, + "name": "Cn", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 95.0, + "y": 45.0 + }, + "name": "Cn+4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 95.0, + "y": 5.0 + }, + "name": "F1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 95.0, + "y": 15.0 + }, + "name": "F2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 95.0, + "y": 25.0 + }, + "name": "F3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 95.0, + "y": 35.0 + }, + "name": "F4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 25.0, + "y": 0.0 + }, + "name": "I0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 0.0 + }, + "name": "I1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 0.0 + }, + "name": "I2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 55.0, + "y": 0.0 + }, + "name": "I3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 65.0, + "y": 0.0 + }, + "name": "I4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 75.0, + "y": 0.0 + }, + "name": "I5", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 95.0, + "y": 55.0 + }, + "name": "OVR", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "Q1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 90.0 + }, + "name": "Q2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "Q3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 100.0 + }, + "name": "Q4", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "Am2901ALUInclDecode", + "name": "Am2901ALUInclDecode#0", + "pos": { + "x": 315.0, + "y": 15.0 + } + }, + { + "id": "Am2901SourceDecode", + "name": "Am2901SourceDecode#0", + "pos": { + "x": 155.0, + "y": 160.0 + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 209.0, + "y": 224.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 214.0, + "y": 234.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 219.0, + "y": 244.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 224.0, + "y": 254.0 + }, + "params": 1 + }, + { + "id": "sel2_4", + "name": "sel2_4#0", + "pos": { + "x": 235.0, + "y": 85.0 + } + }, + { + "id": "sel3_4", + "name": "sel3_4#0", + "pos": { + "x": 235.0, + "y": 190.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I5" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "I5" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 300.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cn" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "Cn" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 40.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 10.0, + "y": 100.0 + }, + { + "x": 10.0, + "y": 85.0 + }, + { + "x": 170.0, + "y": 85.0 + }, + { + "x": 170.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 55.0, + "y": 140.0 + }, + { + "x": 55.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 50.0, + "y": 160.0 + }, + { + "x": 50.0, + "y": 235.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 45.0, + "y": 180.0 + }, + { + "x": 45.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 40.0, + "y": 200.0 + }, + { + "x": 40.0, + "y": 255.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 210.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 215.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 220.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 225.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "I3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I3" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 220.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 25.0, + "y": 240.0 + }, + { + "x": 25.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 20.0, + "y": 260.0 + }, + { + "x": 20.0, + "y": 275.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 20.0, + "y": 280.0 + }, + { + "x": 20.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B4" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 20.0, + "y": 300.0 + }, + { + "x": 20.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q1" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C1" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 20.0, + "y": 340.0 + }, + { + "x": 20.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q2" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C2" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 25.0, + "y": 360.0 + }, + { + "x": 25.0, + "y": 315.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q3" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C3" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 30.0, + "y": 380.0 + }, + { + "x": 30.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I2" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "I2" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 180.0, + "y": 5.0 + }, + { + "x": 150.0, + "y": 5.0 + }, + { + "x": 150.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q4" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "C4" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 35.0, + "y": 400.0 + }, + { + "x": 35.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "SC" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "SQ" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 200.0, + "y": 215.0 + }, + { + "x": 200.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901SourceDecode#0", + "pinName": "RD" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "SA" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 195.0, + "y": 205.0 + }, + { + "x": 195.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901SourceDecode#0", + "pinName": "SB" + }, + "pin2": { + "compName": "sel3_4#0", + "pinName": "SB" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 205.0, + "y": 185.0 + }, + { + "x": 205.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "SA" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "SA" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "R1" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 275.0, + "y": 90.0 + }, + { + "x": 275.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "R2" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 280.0, + "y": 100.0 + }, + { + "x": 280.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "R3" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 285.0, + "y": 110.0 + }, + { + "x": 285.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "R4" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 290.0, + "y": 120.0 + }, + { + "x": 290.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "I1" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 140.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "S1" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 295.0, + "y": 195.0 + }, + { + "x": 295.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "S2" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 300.0, + "y": 205.0 + }, + { + "x": 300.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "S3" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 305.0, + "y": 215.0 + }, + { + "x": 305.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "sel3_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "S4" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 310.0, + "y": 225.0 + }, + { + "x": 310.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "F1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F1" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "F2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F2" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 375.0, + "y": 30.0 + }, + { + "x": 375.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "F3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F3" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 370.0, + "y": 40.0 + }, + { + "x": 370.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "F4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F4" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 365.0, + "y": 50.0 + }, + { + "x": 365.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "Cn+4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cn+4" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 360.0, + "y": 60.0 + }, + { + "x": 360.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "OVR" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "OVR" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 355.0, + "y": 70.0 + }, + { + "x": 355.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "Am2901SourceDecode#0", + "pinName": "I0" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 100.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I4" + }, + "pin2": { + "compName": "Am2901ALUInclDecode#0", + "pinName": "I4" + }, + "name": "unnamedWire#50", + "path": [ + { + "x": 260.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "Am2901SourceDecode#0", + "pinName": "RA" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "SB" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 205.0, + "y": 175.0 + }, + { + "x": 205.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 10.0, + "y": 40.0 + }, + { + "x": 10.0, + "y": 55.0 + }, + { + "x": 185.0, + "y": 55.0 + }, + { + "x": 185.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 10.0, + "y": 60.0 + }, + { + "x": 10.0, + "y": 65.0 + }, + { + "x": 180.0, + "y": 65.0 + }, + { + "x": 180.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 80.0 + }, + { + "x": 10.0, + "y": 75.0 + }, + { + "x": 175.0, + "y": 75.0 + }, + { + "x": 175.0, + "y": 130.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901ALUInclSourceDecodeInclFunctionDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json new file mode 100644 index 00000000..31cf8af2 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json @@ -0,0 +1,557 @@ +{ + "width": 35.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "Cin", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "CinE", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Cout", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "CoutE", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "F", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "FN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "L", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "R", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "RN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "S", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "SN", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 60.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 49.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 54.0, + "y": 69.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 10.0, + "y": 20.0 + } + }, + { + "id": "and", + "name": "and#1", + "pos": { + "x": 135.0, + "y": 20.0 + } + }, + { + "id": "fulladder", + "name": "fulladder#0", + "pos": { + "x": 60.0, + "y": 20.0 + } + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 90.0, + "y": 70.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 10.0, + "y": 190.0 + } + }, + { + "id": "xor", + "name": "xor#1", + "pos": { + "x": 10.0, + "y": 290.0 + } + }, + { + "id": "xor", + "name": "xor#2", + "pos": { + "x": 135.0, + "y": 70.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cin" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "CoutE" + }, + "pin2": { + "compName": "and#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 75.0 + }, + { + "x": 5.0, + "y": 10.0 + }, + { + "x": 130.0, + "y": 10.0 + }, + { + "x": 130.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 50.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "fulladder#0", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 50.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 55.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "fulladder#0", + "pinName": "C" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 55.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "fulladder#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 100.0, + "y": 25.0 + }, + { + "x": 100.0, + "y": 65.0 + }, + { + "x": 85.0, + "y": 65.0 + }, + { + "x": 85.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "fulladder#0", + "pinName": "Z" + }, + "pin2": { + "compName": "and#1", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 82.5, + "y": 65.0 + }, + { + "x": 82.5, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "xor#2", + "pinName": "A" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "CinE" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 7.5, + "y": 125.0 + }, + { + "x": 7.5, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "and#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cout" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "xor#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "F" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "R" + }, + "pin2": { + "compName": "xor#0", + "pinName": "A" + }, + "name": "unnamedWire#3" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "RN" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#4" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S" + }, + "pin2": { + "compName": "xor#1", + "pinName": "A" + }, + "name": "unnamedWire#5" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SN" + }, + "pin2": { + "compName": "xor#1", + "pinName": "B" + }, + "name": "unnamedWire#6" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "FN" + }, + "pin2": { + "compName": "xor#2", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 130.0, + "y": 375.0 + }, + { + "x": 130.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "L" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 87.5, + "y": 425.0 + }, + { + "x": 87.5, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "fulladder#0", + "pinName": "A" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901ALUOneBit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json new file mode 100644 index 00000000..27cd4f01 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json @@ -0,0 +1,1095 @@ +{ + "width": 35.0, + "height": 60.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I6", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I7", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "I8", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "LSH", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "NSH", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "QWE", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "RAMWE", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "RSH", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "YF", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 15.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 15.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 80.0, + "y": 145.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 110.0, + "y": 105.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#12", + "pos": { + "x": 115.0, + "y": 210.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 15.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 15.0, + "y": 150.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 50.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 50.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 50.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 50.0, + "y": 130.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 80.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 80.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 39.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 74.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 74.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 74.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 74.0, + "y": 159.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 109.0, + "y": 214.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 4.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 9.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 9.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 9.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 4.0, + "y": 154.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 39.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 44.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 44.0, + "y": 54.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I8" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 5.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I6" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 5.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 5.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 5.0, + "y": 5.0 + }, + { + "x": 40.0, + "y": 5.0 + }, + { + "x": 40.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 40.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 40.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "NSH" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 45.0, + "y": 5.0 + }, + { + "x": 135.0, + "y": 5.0 + }, + { + "x": 135.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 45.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 10.0, + "y": 115.0 + }, + { + "x": 45.0, + "y": 115.0 + }, + { + "x": 45.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 40.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 40.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 75.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 75.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RAMWE" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 125.0, + "y": 60.0 + }, + { + "x": 125.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "A" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 75.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "LSH" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 125.0, + "y": 140.0 + }, + { + "x": 125.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 75.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "B" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RSH" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 130.0, + "y": 20.0 + }, + { + "x": 130.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#41" + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "B" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 75.0, + "y": 170.0 + }, + { + "x": 105.0, + "y": 170.0 + }, + { + "x": 105.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 110.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#12", + "pinName": "A" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#12", + "pinName": "B" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 110.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "YF" + }, + "name": "unnamedWire#46" + }, + { + "pin1": { + "compName": "NandGate#12", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QWE" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I7" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 10.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901DestDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json new file mode 100644 index 00000000..25a64839 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json @@ -0,0 +1,1138 @@ +{ + "width": 35.0, + "height": 50.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "I2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "RA", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "RD", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "SA", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "SB", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "SQ", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 10.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 70.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 70.0, + "y": 130.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#12", + "pos": { + "x": 70.0, + "y": 170.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#13", + "pos": { + "x": 100.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#14", + "pos": { + "x": 100.0, + "y": 170.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 10.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 40.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 40.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 40.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 40.0, + "y": 130.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 40.0, + "y": 170.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 70.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 70.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 6.5, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 36.5, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 64.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 64.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 64.0, + "y": 139.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 94.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 94.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 4.0, + "y": 144.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 6.5, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 6.5, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 6.5, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 31.5, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 34.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 34.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 34.0, + "y": 134.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I2" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 5.0 + }, + { + "x": 35.0, + "y": 5.0 + }, + { + "x": 35.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 7.5, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 7.5, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 7.5, + "y": 112.5 + }, + { + "x": 32.5, + "y": 112.5 + }, + { + "x": 32.5, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 32.5, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 32.5, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 35.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 35.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 37.5, + "y": 35.0 + }, + { + "x": 65.0, + "y": 35.0 + }, + { + "x": 65.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 37.5, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#29" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 7.5, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "A" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 65.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 65.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 65.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "B" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 65.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 65.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "B" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 65.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#12", + "pinName": "A" + }, + "name": "unnamedWire#39" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 7.5, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#13", + "pinName": "A" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 95.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#13", + "pinName": "B" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 95.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RA" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SB" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SA" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#12", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#14", + "pinName": "A" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 95.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#14", + "pinName": "B" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 95.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#13", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SQ" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#14", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "RD" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#12", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 5.0, + "y": 195.0 + }, + { + "x": 65.0, + "y": 195.0 + }, + { + "x": 65.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 7.5, + "y": 55.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2901SourceDecode", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json new file mode 100644 index 00000000..424c5471 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904.json @@ -0,0 +1,5222 @@ +{ + "width": 120.0, + "height": 155.0, + "interfacePins": [ + { + "location": { + "x": 55.0, + "y": 0.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 120.0, + "y": 85.0 + }, + "name": "C0", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 120.0, + "y": 55.0 + }, + "name": "CT", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "Cx", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "I", + "logicWidth": 13, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "IC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "IN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "IOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "IZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 120.0, + "y": 125.0 + }, + "name": "QIO0", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 125.0 + }, + "name": "QIOn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 120.0 + }, + "name": "SIO0", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 120.0 + }, + "name": "SIOn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 10.0 + }, + "name": "YC", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 15.0 + }, + "name": "YN", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 20.0 + }, + "name": "YOVR", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 120.0, + "y": 5.0 + }, + "name": "YZ", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 5.0, + "y": 0.0 + }, + "name": "_CEM", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 0.0 + }, + "name": "_CEmu", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 15.0, + "y": 0.0 + }, + "name": "_EC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 20.0, + "y": 0.0 + }, + "name": "_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 25.0, + "y": 0.0 + }, + "name": "_EOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 0.0 + }, + "name": "_EZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 110.0, + "y": 0.0 + }, + "name": "_OECT", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 90.0, + "y": 0.0 + }, + "name": "_OEY", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 110.0 + }, + "name": "_SE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Am2904MSR", + "name": "Am2904MSR#0", + "pos": { + "x": 205.0, + "y": 90.0 + } + }, + { + "id": "Am2904RegCTInstrDecode", + "name": "Am2904RegCTInstrDecode#0", + "pos": { + "x": 180.0, + "y": 190.0 + } + }, + { + "id": "Am2904ShiftInstrDecode", + "name": "Am2904ShiftInstrDecode#0", + "pos": { + "x": 100.0, + "y": 495.0 + } + }, + { + "id": "Am2904TestLogic", + "name": "Am2904TestLogic#0", + "pos": { + "x": 260.0, + "y": 330.0 + } + }, + { + "id": "Am2904muSR", + "name": "Am2904muSR#0", + "pos": { + "x": 350.0, + "y": 95.0 + } + }, + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 230.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 140.0, + "y": 5.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 455.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 555.0, + "y": 235.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 325.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 325.0, + "y": 75.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 325.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 325.0, + "y": 35.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 185.0, + "y": 70.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 185.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 185.0, + "y": 30.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 185.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 165.0 + }, + "params": { + "logicWidth": 13, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 575.0, + "y": 40.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#10", + "pos": { + "x": 445.0, + "y": 300.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#11", + "pos": { + "x": 455.0, + "y": 635.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#12", + "pos": { + "x": 455.0, + "y": 710.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#13", + "pos": { + "x": 135.0, + "y": 645.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#14", + "pos": { + "x": 310.0, + "y": 645.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#15", + "pos": { + "x": 430.0, + "y": 535.0 + }, + "params": { + "logicWidth": 2, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#16", + "pos": { + "x": 20.0, + "y": 235.0 + }, + "params": { + "logicWidth": 6, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#17", + "pos": { + "x": 20.0, + "y": 185.0 + }, + "params": { + "logicWidth": 5, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#18", + "pos": { + "x": 15.0, + "y": 65.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#19", + "pos": { + "x": 520.0, + "y": 90.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 440.0, + "y": 90.0 + }, + "params": { + "logicWidth": 2, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#20", + "pos": { + "x": 20.0, + "y": 165.0 + }, + "params": { + "logicWidth": 2, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 465.0, + "y": 100.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 425.0, + "y": 150.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#5", + "pos": { + "x": 425.0, + "y": 190.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#6", + "pos": { + "x": 320.0, + "y": 310.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#7", + "pos": { + "x": 445.0, + "y": 340.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#8", + "pos": { + "x": 445.0, + "y": 380.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#9", + "pos": { + "x": 255.0, + "y": 430.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 540.0, + "y": 70.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#1", + "pos": { + "x": 400.0, + "y": 635.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#2", + "pos": { + "x": 240.0, + "y": 635.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#3", + "pos": { + "x": 550.0, + "y": 625.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#4", + "pos": { + "x": 550.0, + "y": 650.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#5", + "pos": { + "x": 575.0, + "y": 265.0 + }, + "params": { + "logicWidth": 1, + "orientation": "RIGHT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 274.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 189.0, + "y": 139.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 179.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 179.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 179.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 449.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 534.0, + "y": 104.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 334.0, + "y": 174.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 384.0, + "y": 164.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 349.0, + "y": 439.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 434.0, + "y": 674.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 264.0, + "y": 619.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 329.0, + "y": 124.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 289.0, + "y": 609.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 294.0, + "y": 614.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 359.0, + "y": 514.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 359.0, + "y": 594.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 149.0, + "y": 664.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 149.0, + "y": 674.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 299.0, + "y": 584.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 464.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 459.0, + "y": 349.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 559.0, + "y": 619.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 404.0, + "y": 114.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 249.0, + "y": 629.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 549.0, + "y": 239.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#32", + "pos": { + "x": 404.0, + "y": 169.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#33", + "pos": { + "x": 389.0, + "y": 204.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#34", + "pos": { + "x": 439.0, + "y": 684.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#35", + "pos": { + "x": 429.0, + "y": 664.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#36", + "pos": { + "x": 429.0, + "y": 619.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#37", + "pos": { + "x": 434.0, + "y": 644.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#38", + "pos": { + "x": 579.0, + "y": 609.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#39", + "pos": { + "x": 429.0, + "y": 609.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 224.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#40", + "pos": { + "x": 584.0, + "y": 624.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#41", + "pos": { + "x": 434.0, + "y": 614.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 569.0, + "y": 54.0 + }, + "params": 4 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 134.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 319.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 319.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 319.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 495.0, + "y": 60.0 + } + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 495.0, + "y": 280.0 + } + }, + { + "id": "mux1", + "name": "mux1#1", + "pos": { + "x": 275.0, + "y": 475.0 + } + }, + { + "id": "mux1", + "name": "mux1#2", + "pos": { + "x": 355.0, + "y": 445.0 + } + }, + { + "id": "mux1", + "name": "mux1#3", + "pos": { + "x": 395.0, + "y": 425.0 + } + }, + { + "id": "mux1", + "name": "mux1#4", + "pos": { + "x": 490.0, + "y": 530.0 + } + }, + { + "id": "mux1", + "name": "mux1#5", + "pos": { + "x": 445.0, + "y": 540.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 480.0, + "y": 85.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#1", + "pos": { + "x": 440.0, + "y": 135.0 + } + }, + { + "id": "mux2", + "name": "mux2#0", + "pos": { + "x": 470.0, + "y": 625.0 + } + }, + { + "id": "mux2", + "name": "mux2#1", + "pos": { + "x": 470.0, + "y": 700.0 + } + }, + { + "id": "mux2", + "name": "mux2#2", + "pos": { + "x": 325.0, + "y": 635.0 + } + }, + { + "id": "mux3", + "name": "mux3#0", + "pos": { + "x": 335.0, + "y": 300.0 + } + }, + { + "id": "mux3", + "name": "mux3#1", + "pos": { + "x": 155.0, + "y": 635.0 + } + }, + { + "id": "not4", + "name": "not4#0", + "pos": { + "x": 130.0, + "y": 40.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 535.0, + "y": 270.0 + } + }, + { + "id": "xor", + "name": "xor#1", + "pos": { + "x": 475.0, + "y": 320.0 + } + }, + { + "id": "xor", + "name": "xor#2", + "pos": { + "x": 315.0, + "y": 465.0 + } + }, + { + "id": "xor", + "name": "xor#3", + "pos": { + "x": 115.0, + "y": 740.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_MUX" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "MUX" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 325.0, + "y": 200.0 + }, + { + "x": 325.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O0" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#101", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_1" + }, + "name": "unnamedWire#102", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_2" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_3" + }, + "name": "unnamedWire#104", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_4" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "name": "unnamedWire#105", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 330.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_4" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_3" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O1" + }, + "name": "unnamedWire#108", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_2" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_1" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O3" + }, + "name": "unnamedWire#110", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 435.0, + "y": 355.0 + }, + { + "x": 435.0, + "y": 245.0 + }, + { + "x": 390.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 535.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Am2904TestLogic#0", + "pinName": "I" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 535.0, + "y": 260.0 + }, + { + "x": 385.0, + "y": 260.0 + }, + { + "x": 385.0, + "y": 290.0 + }, + { + "x": 255.0, + "y": 290.0 + }, + { + "x": 255.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y111" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I111" + }, + "name": "unnamedWire#114", + "path": [] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "I110" + }, + "pin2": { + "compName": "Am2904TestLogic#0", + "pinName": "Y110" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y101" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I101" + }, + "name": "unnamedWire#116", + "path": [] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "I100" + }, + "pin2": { + "compName": "Am2904TestLogic#0", + "pinName": "Y100" + }, + "name": "unnamedWire#117", + "path": [] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y011" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I011" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y010" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I010" + }, + "name": "unnamedWire#119", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O2" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "I001" + }, + "pin2": { + "compName": "Am2904TestLogic#0", + "pinName": "Y001" + }, + "name": "unnamedWire#120", + "path": [] + }, + { + "pin1": { + "compName": "Am2904TestLogic#0", + "pinName": "Y000" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "I000" + }, + "name": "unnamedWire#121", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#5", + "pinName": "EN" + }, + "name": "unnamedWire#122", + "path": [ + { + "x": 585.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#123", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "CT_MUX" + }, + "name": "unnamedWire#124", + "path": [ + { + "x": 210.0, + "y": 320.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O0" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "S0" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "S1" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O1" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O2" + }, + "pin2": { + "compName": "mux3#0", + "pinName": "S2" + }, + "name": "unnamedWire#127", + "path": [] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "CT_EXP" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#128", + "path": [ + { + "x": 230.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "mux3#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#129", + "path": [ + { + "x": 420.0, + "y": 310.0 + }, + { + "x": 420.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "A" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "CT_INV" + }, + "name": "unnamedWire#130", + "path": [ + { + "x": 415.0, + "y": 275.0 + }, + { + "x": 415.0, + "y": 280.0 + }, + { + "x": 220.0, + "y": 280.0 + } + ] + }, + { + "pin1": { + "compName": "xor#1", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#131", + "path": [ + { + "x": 515.0, + "y": 325.0 + }, + { + "x": 515.0, + "y": 315.0 + }, + { + "x": 490.0, + "y": 315.0 + }, + { + "x": 490.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "I" + }, + "name": "unnamedWire#132", + "path": [ + { + "x": 335.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#133", + "path": [ + { + "x": 390.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O2" + }, + "pin2": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "name": "unnamedWire#134", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#135", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "name": "unnamedWire#136", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "I" + }, + "name": "unnamedWire#137", + "path": [ + { + "x": 385.0, + "y": 250.0 + }, + { + "x": 430.0, + "y": 250.0 + }, + { + "x": 430.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "OEN" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#138", + "path": [ + { + "x": 240.0, + "y": 185.0 + }, + { + "x": 410.0, + "y": 185.0 + }, + { + "x": 410.0, + "y": 80.0 + }, + { + "x": 485.0, + "y": 80.0 + }, + { + "x": 485.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O0" + }, + "name": "unnamedWire#139", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O4" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#140", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "I12-11" + }, + "name": "unnamedWire#141", + "path": [ + { + "x": 105.0, + "y": 170.0 + }, + { + "x": 105.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "C0_MUX" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "I" + }, + "name": "unnamedWire#142", + "path": [ + { + "x": 250.0, + "y": 445.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#1", + "pinName": "I1" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#143", + "path": [ + { + "x": 270.0, + "y": 500.0 + }, + { + "x": 270.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "mu" + }, + "name": "unnamedWire#144", + "path": [ + { + "x": 185.0, + "y": 170.0 + }, + { + "x": 185.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#1", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O2" + }, + "name": "unnamedWire#145", + "path": [ + { + "x": 265.0, + "y": 490.0 + }, + { + "x": 265.0, + "y": 510.0 + }, + { + "x": 480.0, + "y": 510.0 + }, + { + "x": 480.0, + "y": 350.0 + }, + { + "x": 470.0, + "y": 350.0 + }, + { + "x": 470.0, + "y": 310.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1#1", + "pinName": "S0" + }, + "name": "unnamedWire#146", + "path": [ + { + "x": 270.0, + "y": 450.0 + }, + { + "x": 270.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#1", + "pinName": "Y" + }, + "pin2": { + "compName": "xor#2", + "pinName": "B" + }, + "name": "unnamedWire#147", + "path": [] + }, + { + "pin1": { + "compName": "xor#2", + "pinName": "A" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O0" + }, + "name": "unnamedWire#148", + "path": [ + { + "x": 290.0, + "y": 470.0 + }, + { + "x": 290.0, + "y": 460.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O2" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#149", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "I5-0" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 105.0, + "y": 260.0 + }, + { + "x": 105.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "S0" + }, + "name": "unnamedWire#150", + "path": [ + { + "x": 350.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "xor#2", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "I1" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "mux1#2", + "pinName": "I0" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Cx" + }, + "name": "unnamedWire#152", + "path": [ + { + "x": 300.0, + "y": 460.0 + }, + { + "x": 300.0, + "y": 465.0 + }, + { + "x": 240.0, + "y": 465.0 + }, + { + "x": 240.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#2", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#3", + "pinName": "I1" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "mux1#3", + "pinName": "I0" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#154", + "path": [] + }, + { + "pin1": { + "compName": "mux1#3", + "pinName": "S0" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O3" + }, + "name": "unnamedWire#155", + "path": [] + }, + { + "pin1": { + "compName": "mux1#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C0" + }, + "name": "unnamedWire#156", + "path": [ + { + "x": 560.0, + "y": 430.0 + }, + { + "x": 560.0, + "y": 425.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#4", + "pinName": "I1" + }, + "pin2": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "name": "unnamedWire#157", + "path": [ + { + "x": 485.0, + "y": 555.0 + }, + { + "x": 485.0, + "y": 620.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SIOn" + }, + "name": "unnamedWire#158", + "path": [ + { + "x": 55.0, + "y": 620.0 + }, + { + "x": 55.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "SIO0" + }, + "name": "unnamedWire#159", + "path": [ + { + "x": 580.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "I" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 75.0, + "y": 520.0 + }, + { + "x": 75.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#5", + "pinName": "I1" + }, + "pin2": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "name": "unnamedWire#160", + "path": [ + { + "x": 435.0, + "y": 565.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QIOn" + }, + "name": "unnamedWire#161", + "path": [ + { + "x": 435.0, + "y": 625.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "name": "unnamedWire#162", + "path": [ + { + "x": 580.0, + "y": 635.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#38", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "name": "unnamedWire#163", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#164", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "IN" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "Y" + }, + "name": "unnamedWire#165", + "path": [] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "SIO0_MUX" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "I" + }, + "name": "unnamedWire#166", + "path": [ + { + "x": 165.0, + "y": 500.0 + }, + { + "x": 165.0, + "y": 575.0 + }, + { + "x": 450.0, + "y": 575.0 + }, + { + "x": 450.0, + "y": 645.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O0" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I00" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O2" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "S1" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "S0" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O1" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IOVR" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O0" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 10.0, + "y": 125.0 + }, + { + "x": 10.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I10" + }, + "name": "unnamedWire#171", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O2" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#172", + "path": [ + { + "x": 485.0, + "y": 390.0 + }, + { + "x": 485.0, + "y": 515.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#173", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O1" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "S0" + }, + "name": "unnamedWire#174", + "path": [] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "S1" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O2" + }, + "name": "unnamedWire#175", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O0" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I00" + }, + "name": "unnamedWire#176", + "path": [] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#4", + "pinName": "IN" + }, + "name": "unnamedWire#177", + "path": [ + { + "x": 545.0, + "y": 710.0 + }, + { + "x": 545.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "QIO0_MUX" + }, + "name": "unnamedWire#178", + "path": [ + { + "x": 445.0, + "y": 720.0 + }, + { + "x": 445.0, + "y": 580.0 + }, + { + "x": 175.0, + "y": 580.0 + }, + { + "x": 175.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#36", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "name": "unnamedWire#179", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IN" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O1" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 5.0, + "y": 100.0 + }, + { + "x": 5.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I10" + }, + "name": "unnamedWire#180", + "path": [ + { + "x": 435.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I01" + }, + "name": "unnamedWire#181", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I11" + }, + "name": "unnamedWire#182", + "path": [ + { + "x": 440.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#183", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "S0" + }, + "name": "unnamedWire#184", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#185", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "I000" + }, + "name": "unnamedWire#186", + "path": [] + }, + { + "pin1": { + "compName": "mux3#1", + "pinName": "I001" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#187", + "path": [ + { + "x": 150.0, + "y": 685.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "SIOn_MUX" + }, + "name": "unnamedWire#188", + "path": [ + { + "x": 130.0, + "y": 655.0 + }, + { + "x": 130.0, + "y": 580.0 + }, + { + "x": 170.0, + "y": 580.0 + }, + { + "x": 170.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O2" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "S2" + }, + "name": "unnamedWire#189", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "IC" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O1" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "S1" + }, + "name": "unnamedWire#190", + "path": [] + }, + { + "pin1": { + "compName": "mux3#1", + "pinName": "I010" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#191", + "path": [ + { + "x": 105.0, + "y": 695.0 + }, + { + "x": 105.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "I011" + }, + "name": "unnamedWire#192", + "path": [ + { + "x": 110.0, + "y": 615.0 + }, + { + "x": 110.0, + "y": 705.0 + } + ] + }, + { + "pin1": { + "compName": "mux3#1", + "pinName": "I100" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#193", + "path": [ + { + "x": 115.0, + "y": 715.0 + }, + { + "x": 115.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "xor#3", + "pinName": "Y" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "I111" + }, + "name": "unnamedWire#194", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#195", + "path": [ + { + "x": 465.0, + "y": 495.0 + }, + { + "x": 345.0, + "y": 495.0 + }, + { + "x": 345.0, + "y": 585.0 + } + ] + }, + { + "pin1": { + "compName": "mux3#1", + "pinName": "I110" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O1" + }, + "name": "unnamedWire#196", + "path": [ + { + "x": 125.0, + "y": 735.0 + }, + { + "x": 125.0, + "y": 605.0 + }, + { + "x": 350.0, + "y": 605.0 + }, + { + "x": 350.0, + "y": 500.0 + }, + { + "x": 470.0, + "y": 500.0 + }, + { + "x": 470.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#2", + "pinName": "I01" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#197", + "path": [ + { + "x": 290.0, + "y": 675.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#2", + "pinName": "I10" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#198", + "path": [ + { + "x": 295.0, + "y": 685.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "I101" + }, + "name": "unnamedWire#199", + "path": [ + { + "x": 120.0, + "y": 585.0 + }, + { + "x": 120.0, + "y": 725.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_OVRRET" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "OVRRET" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 345.0, + "y": 210.0 + }, + { + "x": 345.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IZ" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O3" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 5.0, + "y": 50.0 + }, + { + "x": 5.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "xor#1", + "pinName": "B" + }, + "name": "unnamedWire#200", + "path": [ + { + "x": 465.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "mux2#2", + "pinName": "I11" + }, + "name": "unnamedWire#201", + "path": [ + { + "x": 300.0, + "y": 695.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "OEn" + }, + "name": "unnamedWire#202", + "path": [ + { + "x": 250.0, + "y": 540.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "OE0" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#203", + "path": [ + { + "x": 390.0, + "y": 550.0 + }, + { + "x": 390.0, + "y": 585.0 + }, + { + "x": 560.0, + "y": 585.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "xor#1", + "pinName": "A" + }, + "name": "unnamedWire#204", + "path": [ + { + "x": 460.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "xor#3", + "pinName": "A" + }, + "name": "unnamedWire#205", + "path": [ + { + "x": 460.0, + "y": 490.0 + }, + { + "x": 340.0, + "y": 490.0 + }, + { + "x": 340.0, + "y": 600.0 + }, + { + "x": 100.0, + "y": 600.0 + }, + { + "x": 100.0, + "y": 745.0 + } + ] + }, + { + "pin1": { + "compName": "xor#3", + "pinName": "B" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O0" + }, + "name": "unnamedWire#206", + "path": [ + { + "x": 95.0, + "y": 755.0 + }, + { + "x": 95.0, + "y": 590.0 + }, + { + "x": 355.0, + "y": 590.0 + }, + { + "x": 355.0, + "y": 505.0 + }, + { + "x": 475.0, + "y": 505.0 + }, + { + "x": 475.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#2", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "IN" + }, + "name": "unnamedWire#207", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O2" + }, + "pin2": { + "compName": "mux2#2", + "pinName": "S1" + }, + "name": "unnamedWire#208", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O1" + }, + "pin2": { + "compName": "mux2#2", + "pinName": "S0" + }, + "name": "unnamedWire#209", + "path": [] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_CINV" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "CINV" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 340.0, + "y": 220.0 + }, + { + "x": 340.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "I" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "QIOn_MUX" + }, + "name": "unnamedWire#210", + "path": [ + { + "x": 305.0, + "y": 655.0 + }, + { + "x": 305.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O0" + }, + "pin2": { + "compName": "mux2#2", + "pinName": "I00" + }, + "name": "unnamedWire#211", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "IN" + }, + "pin2": { + "compName": "mux3#1", + "pinName": "Y" + }, + "name": "unnamedWire#212", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_SE" + }, + "pin2": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "_SE" + }, + "name": "unnamedWire#213", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#3", + "pinName": "EN" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#214", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#4", + "pinName": "EN" + }, + "name": "unnamedWire#215", + "path": [ + { + "x": 575.0, + "y": 620.0 + }, + { + "x": 575.0, + "y": 645.0 + }, + { + "x": 560.0, + "y": 645.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "M" + }, + "name": "unnamedWire#216", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#32", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "I" + }, + "name": "unnamedWire#217", + "path": [ + { + "x": 405.0, + "y": 240.0 + }, + { + "x": 440.0, + "y": 240.0 + }, + { + "x": 440.0, + "y": 315.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#2", + "pinName": "EN" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#218", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "EN" + }, + "name": "unnamedWire#219", + "path": [ + { + "x": 410.0, + "y": 630.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 105.0, + "y": 80.0 + }, + { + "x": 105.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "name": "unnamedWire#220", + "path": [ + { + "x": 440.0, + "y": 595.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#5", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#4", + "pinName": "I0" + }, + "name": "unnamedWire#221", + "path": [] + }, + { + "pin1": { + "compName": "mux1#4", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "COVD_V" + }, + "name": "unnamedWire#222", + "path": [ + { + "x": 530.0, + "y": 535.0 + }, + { + "x": 530.0, + "y": 525.0 + }, + { + "x": 230.0, + "y": 525.0 + }, + { + "x": 230.0, + "y": 310.0 + }, + { + "x": 295.0, + "y": 310.0 + }, + { + "x": 295.0, + "y": 85.0 + }, + { + "x": 275.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#2", + "pinName": "OUT" + }, + "name": "unnamedWire#223", + "path": [ + { + "x": 265.0, + "y": 645.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#4", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "name": "unnamedWire#224", + "path": [ + { + "x": 585.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "MC_MUX" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "I" + }, + "name": "unnamedWire#226", + "path": [ + { + "x": 410.0, + "y": 560.0 + }, + { + "x": 410.0, + "y": 540.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1#5", + "pinName": "S0" + }, + "name": "unnamedWire#227", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1#4", + "pinName": "S0" + }, + "name": "unnamedWire#228", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#34", + "pinName": "" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I11" + }, + "name": "unnamedWire#229", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "I" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#35", + "pinName": "" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I01" + }, + "name": "unnamedWire#230", + "path": [ + { + "x": 430.0, + "y": 740.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "name": "unnamedWire#231", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#37", + "pinName": "" + }, + "pin2": { + "compName": "TriStateBuffer#1", + "pinName": "OUT" + }, + "name": "unnamedWire#232", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#233", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#234", + "path": [ + { + "x": 550.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_OECT" + }, + "name": "unnamedWire#235", + "path": [ + { + "x": 550.0, + "y": 215.0 + }, + { + "x": 565.0, + "y": 215.0 + }, + { + "x": 565.0, + "y": 25.0 + }, + { + "x": 550.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#5", + "pinName": "OUT" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "CT" + }, + "name": "unnamedWire#236", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#5", + "pinName": "IN" + }, + "pin2": { + "compName": "xor#0", + "pinName": "Y" + }, + "name": "unnamedWire#237", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "mux1#5", + "pinName": "I0" + }, + "name": "unnamedWire#238", + "path": [ + { + "x": 430.0, + "y": 555.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#39", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#239", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 190.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QIO0" + }, + "name": "unnamedWire#240", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#41", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#40", + "pinName": "" + }, + "name": "unnamedWire#242", + "path": [ + { + "x": 585.0, + "y": 615.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904MSR#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 300.0, + "y": 110.0 + }, + { + "x": 300.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "I" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "Am2904muSR#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 405.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#33", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "I" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "C" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 255.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "C" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 300.0, + "y": 60.0 + }, + { + "x": 300.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "MSR_MUX" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "MUX" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 200.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904ShiftInstrDecode#0", + "pinName": "MC_EN" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "COVD_EN" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 225.0, + "y": 570.0 + }, + { + "x": 225.0, + "y": 305.0 + }, + { + "x": 290.0, + "y": 305.0 + }, + { + "x": 290.0, + "y": 80.0 + }, + { + "x": 265.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 225.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_CEmu" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O0" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 320.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "_EOVR" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 390.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "_EN" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 380.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904muSR#0", + "pinName": "_EC" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 370.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904muSR#0", + "pinName": "_EZ" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 360.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "B" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_WEZ" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 305.0, + "y": 30.0 + }, + { + "x": 305.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_WEC" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 310.0, + "y": 240.0 + }, + { + "x": 310.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "YZ" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 595.0, + "y": 40.0 + }, + { + "x": 595.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YC" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "YN" + }, + "name": "unnamedWire#51", + "path": [ + { + "x": 595.0, + "y": 60.0 + }, + { + "x": 595.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YOVR" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#52", + "path": [ + { + "x": 590.0, + "y": 100.0 + }, + { + "x": 590.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "Y" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 570.0, + "y": 50.0 + }, + { + "x": 415.0, + "y": 50.0 + }, + { + "x": 415.0, + "y": 180.0 + }, + { + "x": 195.0, + "y": 180.0 + }, + { + "x": 195.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 135.0, + "y": 10.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_CEM" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 25.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "B" + }, + "pin2": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_WEN" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 315.0, + "y": 70.0 + }, + { + "x": 315.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "muSR_WEOVR" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 320.0, + "y": 260.0 + }, + { + "x": 320.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O2" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 180.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "_EOVR" + }, + "name": "unnamedWire#66", + "path": [ + { + "x": 245.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Am2904MSR#0", + "pinName": "_EN" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 235.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "_EC" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 225.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2904MSR#0", + "pinName": "_EZ" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 215.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 170.0, + "y": 45.0 + }, + { + "x": 170.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "B" + }, + "pin2": { + "compName": "not4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 175.0, + "y": 45.0 + }, + { + "x": 175.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#73", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 175.0, + "y": 75.0 + }, + { + "x": 175.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "A1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EZ" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 50.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EC" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A2" + }, + "name": "unnamedWire#76", + "path": [ + { + "x": 75.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "A3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EN" + }, + "name": "unnamedWire#77", + "path": [ + { + "x": 100.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A4" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 125.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 570.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O4" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#80", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 450.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_OEY" + }, + "name": "unnamedWire#82", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#83", + "path": [] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 550.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#85", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y2" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y4" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O1" + }, + "name": "unnamedWire#90", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#91", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O3" + }, + "name": "unnamedWire#92", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "I" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "Am2904RegCTInstrDecode#0", + "pinName": "Y_MUX" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#94", + "path": [ + { + "x": 190.0, + "y": 275.0 + }, + { + "x": 360.0, + "y": 275.0 + }, + { + "x": 360.0, + "y": 225.0 + }, + { + "x": 420.0, + "y": 225.0 + }, + { + "x": 420.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "S0" + }, + "name": "unnamedWire#95", + "path": [ + { + "x": 455.0, + "y": 100.0 + }, + { + "x": 455.0, + "y": 130.0 + }, + { + "x": 435.0, + "y": 130.0 + }, + { + "x": 435.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2904", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "msr": { + "id": "delegating", + "params": { + "delegateTarget": "Am2904MSR#0" + } + }, + "musr": { + "id": "delegating", + "params": { + "delegateTarget": "Am2904muSR#0" + } + } + }, + "atomicHighLevelStates": {} + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json new file mode 100644 index 00000000..927d41f8 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json @@ -0,0 +1,1936 @@ +{ + "width": 80.0, + "height": 75.0, + "interfacePins": [ + { + "location": { + "x": 50.0, + "y": 0.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 60.0, + "y": 0.0 + }, + "name": "COVD_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 70.0, + "y": 0.0 + }, + "name": "COVD_V", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "I", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 70.0 + }, + "name": "MUX", + "logicWidth": 3, + "usage": "INPUT" + }, + { + "location": { + "x": 80.0, + "y": 20.0 + }, + "name": "Q", + "logicWidth": 4, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 30.0 + }, + "name": "Y", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 20.0, + "y": 0.0 + }, + "name": "_EC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 30.0, + "y": 0.0 + }, + "name": "_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 40.0, + "y": 0.0 + }, + "name": "_EOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 0.0 + }, + "name": "_EZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "mu", + "logicWidth": 4, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 170.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 35.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 135.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 45.0, + "y": 340.0 + }, + "params": { + "logicWidth": 3, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 5.0, + "y": 235.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 385.0, + "y": 85.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 19.0, + "y": 224.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 364.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 74.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 74.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 34.0, + "y": 234.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 124.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 74.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 164.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 269.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 369.0, + "y": 94.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 374.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 379.0, + "y": 114.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 29.0, + "y": 284.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 39.0, + "y": 304.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 19.0, + "y": 194.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 79.0, + "y": 254.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 39.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 195.0, + "y": 50.0 + } + }, + { + "id": "dff4_finewe", + "name": "dff4_finewe#0", + "pos": { + "x": 325.0, + "y": 80.0 + } + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 280.0, + "y": 175.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 45.0, + "y": 80.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#1", + "pos": { + "x": 85.0, + "y": 220.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#2", + "pos": { + "x": 90.0, + "y": 30.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#3", + "pos": { + "x": 130.0, + "y": 170.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#4", + "pos": { + "x": 175.0, + "y": 120.0 + } + }, + { + "id": "not4", + "name": "not4#0", + "pos": { + "x": 45.0, + "y": 270.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 40.0, + "y": 190.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "C" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 250.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE4" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 200.0, + "y": 30.0 + }, + { + "x": 305.0, + "y": 30.0 + }, + { + "x": 305.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "mu" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 35.0, + "y": 95.0 + }, + { + "x": 35.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 30.0, + "y": 45.0 + }, + { + "x": 30.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 25.0, + "y": 55.0 + }, + { + "x": 25.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 20.0, + "y": 65.0 + }, + { + "x": 20.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EN" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE3" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 150.0, + "y": 25.0 + }, + { + "x": 310.0, + "y": 25.0 + }, + { + "x": 310.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "MUX" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "I" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 30.0, + "y": 245.0 + }, + { + "x": 30.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 60.0, + "y": 360.0 + }, + { + "x": 60.0, + "y": 335.0 + }, + { + "x": 20.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "Q4" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EC" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 100.0, + "y": 20.0 + }, + { + "x": 190.0, + "y": 20.0 + }, + { + "x": 190.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_1" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_2" + }, + "pin2": { + "compName": "not4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_3" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_4" + }, + "pin2": { + "compName": "not4#0", + "pinName": "Y4" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A1" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 365.0, + "y": 315.0 + }, + { + "x": 25.0, + "y": 315.0 + }, + { + "x": 25.0, + "y": 275.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 370.0, + "y": 320.0 + }, + { + "x": 30.0, + "y": 320.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A3" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 375.0, + "y": 325.0 + }, + { + "x": 35.0, + "y": 325.0 + }, + { + "x": 35.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 380.0, + "y": 330.0 + }, + { + "x": 40.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_4" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 30.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EZ" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE1" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 50.0, + "y": 15.0 + }, + { + "x": 320.0, + "y": 15.0 + }, + { + "x": 320.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_2" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 40.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_3" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 20.0, + "y": 175.0 + }, + { + "x": 40.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "S0" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "I1_1" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 40.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "I1_3" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "I0_4" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "I0_3" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "I0_2" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "I0_1" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 75.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_1" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "I0_1" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 35.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "I0_2" + }, + "pin2": { + "compName": "xor#0", + "pinName": "Y" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "I0_3" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 80.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "I0_4" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 25.0, + "y": 265.0 + }, + { + "x": 25.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "I1_1" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y2" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "I1_3" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y4" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 125.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "S0" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "S0" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 85.0, + "y": 175.0 + }, + { + "x": 85.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "Y4" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "D4" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 235.0, + "y": 155.0 + }, + { + "x": 235.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "D3" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "Y3" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 240.0, + "y": 155.0 + }, + { + "x": 240.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE2" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 235.0, + "y": 55.0 + }, + { + "x": 235.0, + "y": 20.0 + }, + { + "x": 315.0, + "y": 20.0 + }, + { + "x": 315.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "D1" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "Y1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 250.0, + "y": 135.0 + }, + { + "x": 250.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "Y4" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "I1_3" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1_4#3", + "pinName": "Y2" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#3", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "I1_1" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "I0_4" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "Y4" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 140.0, + "y": 165.0 + }, + { + "x": 140.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "I0_3" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 145.0, + "y": 55.0 + }, + { + "x": 145.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "I0_2" + }, + "pin2": { + "compName": "mux1_4#2", + "pinName": "Y2" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 150.0, + "y": 145.0 + }, + { + "x": 150.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "I0_1" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 155.0, + "y": 35.0 + }, + { + "x": 155.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#4", + "pinName": "S0" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 170.0, + "y": 340.0 + }, + { + "x": 170.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#83", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "COVD_EN" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 300.0, + "y": 10.0 + }, + { + "x": 270.0, + "y": 10.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 165.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "COVD_V" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 350.0, + "y": 70.0 + }, + { + "x": 265.0, + "y": 70.0 + }, + { + "x": 265.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#4", + "pinName": "Y2" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 245.0, + "y": 135.0 + }, + { + "x": 245.0, + "y": 145.0 + }, + { + "x": 275.0, + "y": 145.0 + }, + { + "x": 275.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "D2" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 320.0, + "y": 180.0 + }, + { + "x": 320.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 165.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 270.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#93", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "MSR", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "dff4_finewe#0", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json new file mode 100644 index 00000000..2c007e54 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json @@ -0,0 +1,774 @@ +{ + "width": 60.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "I", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 60.0, + "y": 10.0 + }, + "name": "Y000", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 20.0 + }, + "name": "Y001", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 30.0 + }, + "name": "Y010", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 40.0 + }, + "name": "Y011", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 50.0 + }, + "name": "Y100", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 60.0 + }, + "name": "Y101", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 70.0 + }, + "name": "Y110", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 60.0, + "y": 80.0 + }, + "name": "Y111", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 85.0, + "y": 20.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 45.0, + "y": 50.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 120.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 45.0, + "y": 105.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 80.0, + "y": 115.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 80.0, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 110.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 29.0, + "y": 129.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 34.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 39.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 79.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 79.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 19.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 24.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 39.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 74.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 74.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 24.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 40.0, + "y": 20.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "A" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 110.0, + "y": 20.0 + }, + { + "x": 110.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 20.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 40.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 115.0, + "y": 60.0 + }, + { + "x": 115.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y001" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 80.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y000" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 25.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y011" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 35.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y010" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y100" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 70.0, + "y": 115.0 + }, + { + "x": 70.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y101" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y110" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 30.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 75.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 40.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 25.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Y111" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 30.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 20.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 35.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Test\nlogic", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json new file mode 100644 index 00000000..2949d8da --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json @@ -0,0 +1,1128 @@ +{ + "width": 50.0, + "height": 65.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "CINV", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "I", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 30.0 + }, + "name": "M", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "MUX", + "logicWidth": 2, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "OVRRET", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 50.0, + "y": 10.0 + }, + "name": "Q", + "logicWidth": 4, + "usage": "OUTPUT" + }, + { + "location": { + "x": 20.0, + "y": 0.0 + }, + "name": "_EC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 30.0, + "y": 0.0 + }, + "name": "_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 40.0, + "y": 0.0 + }, + "name": "_EOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 0.0 + }, + "name": "_EZ", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 155.0, + "y": 135.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 125.0, + "y": 150.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 125.0, + "y": 130.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 135.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 185.0 + }, + "params": { + "logicWidth": 4, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 5.0, + "y": 95.0 + }, + "params": { + "logicWidth": 2, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 230.0, + "y": 30.0 + }, + "params": { + "logicWidth": 4, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 19.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 59.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 59.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 224.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 114.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 59.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "dff4_finewe", + "name": "dff4_finewe#0", + "pos": { + "x": 185.0, + "y": 25.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 25.0, + "y": 125.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#1", + "pos": { + "x": 65.0, + "y": 75.0 + } + }, + { + "id": "xor", + "name": "xor#0", + "pos": { + "x": 130.0, + "y": 105.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "Q2" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 20.0, + "y": 210.0 + }, + { + "x": 20.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 20.0, + "y": 165.0 + }, + { + "x": 20.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 20.0, + "y": 155.0 + }, + { + "x": 20.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 20.0, + "y": 145.0 + }, + { + "x": 20.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "MUX" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 20.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_4" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I1_3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_2" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "Q3" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I1_1" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_1" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 60.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_2" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "I0_3" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "I0_4" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 20.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "S0" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 20.0, + "y": 95.0 + }, + { + "x": 20.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "B" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 150.0, + "y": 150.0 + }, + { + "x": 150.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "OVRRET" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 115.0, + "y": 300.0 + }, + { + "x": 115.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 225.0, + "y": 175.0 + }, + { + "x": 120.0, + "y": 175.0 + }, + { + "x": 120.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "xor#0", + "pinName": "A" + }, + "name": "unnamedWire#34", + "path": [ + { + "x": 125.0, + "y": 90.0 + }, + { + "x": 125.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "CINV" + }, + "pin2": { + "compName": "xor#0", + "pinName": "B" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 105.0, + "y": 250.0 + }, + { + "x": 105.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "_WE1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EZ" + }, + "name": "unnamedWire#36", + "path": [ + { + "x": 180.0, + "y": 40.0 + }, + { + "x": 180.0, + "y": 5.0 + }, + { + "x": 50.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "C" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 55.0, + "y": 50.0 + }, + { + "x": 55.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE4" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 200.0, + "y": 20.0 + }, + { + "x": 165.0, + "y": 20.0 + }, + { + "x": 165.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "_WE3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EN" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 170.0, + "y": 60.0 + }, + { + "x": 170.0, + "y": 15.0 + }, + { + "x": 150.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 245.0, + "y": 45.0 + }, + { + "x": 245.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EC" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "_WE2" + }, + "name": "unnamedWire#40", + "path": [ + { + "x": 100.0, + "y": 10.0 + }, + { + "x": 175.0, + "y": 10.0 + }, + { + "x": 175.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "D1" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y1" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "xor#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "D2" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 170.0, + "y": 110.0 + }, + { + "x": 170.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "dff4_finewe#0", + "pinName": "D3" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y3" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#1", + "pinName": "Y4" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 115.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff4_finewe#0", + "pinName": "D4" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 180.0, + "y": 145.0 + }, + { + "x": 180.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 115.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 20.0, + "y": 135.0 + }, + { + "x": 20.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "M" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 20.0, + "y": 185.0 + }, + { + "x": 20.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 190.0 + }, + { + "x": 20.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 20.0, + "y": 205.0 + }, + { + "x": 20.0, + "y": 200.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "µSR", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "dff4_finewe#0", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json new file mode 100644 index 00000000..9a6e0ba7 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/am2910/Am2910.json @@ -0,0 +1,1159 @@ +{ + "width": 60.0, + "height": 45.0, + "interfacePins": [ + { + "location": { + "x": 40.0, + "y": 0.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 60.0, + "y": 30.0 + }, + "name": "CI", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 30.0, + "y": 0.0 + }, + "name": "D", + "logicWidth": 12, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "Y", + "logicWidth": 12, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "_CC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "_CCEN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 60.0, + "y": 5.0 + }, + "name": "_FULL", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 15.0, + "y": 45.0 + }, + "name": "_MAP", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 40.0, + "y": 45.0 + }, + "name": "_OE", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 45.0 + }, + "name": "_PL", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "_RLD", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 20.0, + "y": 45.0 + }, + "name": "_VECT", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Am2910InstrPLA", + "name": "Am2910InstrPLA#0", + "pos": { + "x": 70.0, + "y": 90.0 + } + }, + { + "id": "Am2910RegCntr", + "name": "Am2910RegCntr#0", + "pos": { + "x": 130.0, + "y": 15.0 + } + }, + { + "id": "Am2910SP", + "name": "Am2910SP#0", + "pos": { + "x": 240.0, + "y": 10.0 + } + }, + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 40.0, + "y": 45.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 10.0, + "y": 60.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 205.0, + "y": 195.0 + }, + "params": 1 + }, + { + "id": "TriStateBuffer", + "name": "TriStateBuffer#0", + "pos": { + "x": 165.0, + "y": 180.0 + }, + "params": { + "logicWidth": 12, + "orientation": "DOWN" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 259.0, + "y": 99.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 224.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 174.0, + "y": 174.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 164.0, + "y": 59.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 149.0, + "y": 9.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 4.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 234.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 199.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 234.0, + "y": 69.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 199.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "dff12", + "name": "dff12#0", + "pos": { + "x": 240.0, + "y": 105.0 + } + }, + { + "id": "inc", + "name": "inc#0", + "pos": { + "x": 240.0, + "y": 140.0 + }, + "params": 12 + }, + { + "id": "nor12", + "name": "nor12#0", + "pos": { + "x": 175.0, + "y": 50.0 + } + }, + { + "id": "ram5_12", + "name": "ram5_12#0", + "pos": { + "x": 240.0, + "y": 55.0 + } + }, + { + "id": "sel4_12", + "name": "sel4_12#0", + "pos": { + "x": 135.0, + "y": 110.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "YD" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "SA" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "YR" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "SB" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "nor12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2910InstrPLA#0", + "pinName": "R\u003d0" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 215.0, + "y": 60.0 + }, + { + "x": 215.0, + "y": 75.0 + }, + { + "x": 85.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "RWE" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "WE" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 105.0, + "y": 95.0 + }, + { + "x": 105.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "RDEC" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "DEC" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 110.0, + "y": 105.0 + }, + { + "x": 110.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "STKI0" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 225.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "STKI1" + }, + "pin2": { + "compName": "Am2910SP#0", + "pinName": "STKI1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 230.0, + "y": 165.0 + }, + { + "x": 230.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "Am2910SP#0", + "pinName": "STKI0" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 225.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "ram5_12#0", + "pinName": "WE" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "sel4_12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "inc#0", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 260.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "ram5_12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "C" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 185.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "YF" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "SC" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "D" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 205.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "B" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "nor12#0", + "pinName": "D" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "D" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "A" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 125.0, + "y": 10.0 + }, + { + "x": 125.0, + "y": 65.0 + }, + { + "x": 145.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_RLD" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "_RLD" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 50.0, + "y": 25.0 + }, + { + "x": 50.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#0", + "pinName": "IN" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Am2910InstrPLA#0", + "pinName": "PASS" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 65.0, + "y": 55.0 + }, + { + "x": 65.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_CC" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "YmuPC" + }, + "pin2": { + "compName": "sel4_12#0", + "pinName": "SD" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_CCEN" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 5.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#33", + "path": [ + { + "x": 35.0, + "y": 70.0 + }, + { + "x": 35.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910SP#0", + "pinName": "_FULL" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_FULL" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff12#0", + "pinName": "C" + }, + "name": "unnamedWire#35", + "path": [ + { + "x": 235.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "Am2910SP#0", + "pinName": "C" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "Am2910RegCntr#0", + "pinName": "C" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff12#0", + "pinName": "D" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "inc#0", + "pinName": "CI" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "CI" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "_PL" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_PL" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 75.0, + "y": 180.0 + }, + { + "x": 50.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "_MAP" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_MAP" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 85.0, + "y": 185.0 + }, + { + "x": 75.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Am2910InstrPLA#0", + "pinName": "_VECT" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_VECT" + }, + "name": "unnamedWire#44", + "path": [ + { + "x": 95.0, + "y": 190.0 + }, + { + "x": 100.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I" + }, + "pin2": { + "compName": "Am2910InstrPLA#0", + "pinName": "I" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 35.0, + "y": 125.0 + }, + { + "x": 35.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "dff12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "ram5_12#0", + "pinName": "C" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "TriStateBuffer#0", + "pinName": "OUT" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_OE" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 200.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "TriStateBuffer#0", + "pinName": "EN" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 230.0, + "y": 190.0 + }, + { + "x": 230.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "ram5_12#0", + "pinName": "D" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Am2910SP#0", + "pinName": "A" + }, + "pin2": { + "compName": "ram5_12#0", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Am2910SP#0", + "pinName": "B" + }, + "pin2": { + "compName": "ram5_12#0", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Am2910RegCntr#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 150.0, + "y": 60.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "Am2910", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "mupc": { + "id": "delegating", + "params": { + "delegateTarget": "dff12#0" + } + }, + "r": { + "id": "delegating", + "params": { + "delegateTarget": "Am2910RegCntr#0" + } + }, + "sp": { + "id": "delegating", + "params": { + "delegateTarget": "Am2910SP#0" + } + }, + "stack": { + "id": "delegating", + "params": { + "delegateTarget": "ram5_12#0" + } + } + }, + "atomicHighLevelStates": {} + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json new file mode 100644 index 00000000..459bca8d --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and.json @@ -0,0 +1,158 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 20.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 50.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 44.0, + "y": 24.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#1" + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 45.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 45.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#5" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "and", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json new file mode 100644 index 00000000..b8c98863 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/and41.json @@ -0,0 +1,355 @@ +{ + "width": 35.0, + "height": 50.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 24.0, + "y": 46.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 71.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 24.0, + "y": 96.5 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 30.0, + "y": 7.5 + } + }, + { + "id": "and", + "name": "and#1", + "pos": { + "x": 30.0, + "y": 32.5 + } + }, + { + "id": "and", + "name": "and#2", + "pos": { + "x": 30.0, + "y": 57.5 + } + }, + { + "id": "and", + "name": "and#3", + "pos": { + "x": 30.0, + "y": 82.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "and#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 25.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "and#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "and#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "and#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "and#2", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "and#3", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 25.0, + "y": 112.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and#3", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "and#2", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and#1", + "pinName": "B" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "and41", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json new file mode 100644 index 00000000..a2b45122 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/andor414.json @@ -0,0 +1,520 @@ +{ + "width": 35.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "C2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "C3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "C4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "and41", + "name": "and41#0", + "pos": { + "x": 15.0, + "y": 137.5 + } + }, + { + "id": "or_4", + "name": "or_4#0", + "pos": { + "x": 35.0, + "y": 37.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A1" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 10.0, + "y": 112.5 + }, + { + "x": 10.0, + "y": 142.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A2" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 137.5 + }, + { + "x": 5.0, + "y": 152.5 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 65.0, + "y": 152.5 + }, + { + "x": 65.0, + "y": 125.0 + }, + { + "x": 25.0, + "y": 125.0 + }, + { + "x": 25.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 60.0, + "y": 162.5 + }, + { + "x": 60.0, + "y": 130.0 + }, + { + "x": 20.0, + "y": 130.0 + }, + { + "x": 20.0, + "y": 102.5 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 55.0, + "y": 172.5 + }, + { + "x": 55.0, + "y": 135.0 + }, + { + "x": 15.0, + "y": 135.0 + }, + { + "x": 15.0, + "y": 112.5 + } + ] + }, + { + "pin1": { + "compName": "or_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 75.0, + "y": 42.5 + }, + { + "x": 75.0, + "y": 12.5 + } + ] + }, + { + "pin1": { + "compName": "or_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 80.0, + "y": 52.5 + }, + { + "x": 80.0, + "y": 37.5 + } + ] + }, + { + "pin1": { + "compName": "or_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "or_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 80.0, + "y": 72.5 + }, + { + "x": 80.0, + "y": 87.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A3" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A4" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 5.0, + "y": 187.5 + }, + { + "x": 5.0, + "y": 172.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "and41#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 10.0, + "y": 212.5 + }, + { + "x": 10.0, + "y": 182.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C1" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 10.0, + "y": 12.5 + }, + { + "x": 10.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C2" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 5.0, + "y": 37.5 + }, + { + "x": 5.0, + "y": 52.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C3" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C4" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 5.0, + "y": 87.5 + }, + { + "x": 5.0, + "y": 72.5 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "or_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 70.0, + "y": 142.5 + }, + { + "x": 70.0, + "y": 120.0 + }, + { + "x": 30.0, + "y": 120.0 + }, + { + "x": 30.0, + "y": 82.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "andor414", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json new file mode 100644 index 00000000..d8d7c36a --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/demux2.json @@ -0,0 +1,544 @@ +{ + "width": 35.0, + "height": 40.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y00", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y01", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y10", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y11", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 10.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 6.5, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 6.5, + "y": 16.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 36.5, + "y": 61.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 4.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 4.0, + "y": 41.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 31.5, + "y": 66.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 31.5, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 34.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "and", + "name": "and#0", + "pos": { + "x": 40.0, + "y": 2.5 + } + }, + { + "id": "and", + "name": "and#1", + "pos": { + "x": 40.0, + "y": 27.5 + } + }, + { + "id": "and", + "name": "and#2", + "pos": { + "x": 40.0, + "y": 52.5 + } + }, + { + "id": "and", + "name": "and#3", + "pos": { + "x": 40.0, + "y": 77.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "and#0", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 32.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "and#0", + "pinName": "B" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 35.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and#1", + "pinName": "A" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 37.5, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "and#1", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 35.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "and#2", + "pinName": "A" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 32.5, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "and#2", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and#3", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 37.5, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "and#3", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 32.5, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 7.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "and#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y00" + }, + "name": "unnamedWire#20" + }, + { + "pin1": { + "compName": "and#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y01" + }, + "name": "unnamedWire#21" + }, + { + "pin1": { + "compName": "and#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y10" + }, + "name": "unnamedWire#22" + }, + { + "pin1": { + "compName": "and#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y11" + }, + "name": "unnamedWire#23" + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 5.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 7.5, + "y": 62.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 5.0, + "y": 67.5 + }, + { + "x": 32.5, + "y": 67.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "demux2", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json new file mode 100644 index 00000000..2c771c07 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff.json @@ -0,0 +1,372 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "_Q", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 120.0, + "y": 20.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 9.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 19.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 94.0, + "y": 64.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 104.0, + "y": 34.0 + }, + "params": 1 + }, + { + "id": "_rsLatch", + "name": "_rsLatch#0", + "pos": { + "x": 40.0, + "y": 70.0 + } + }, + { + "id": "_rsLatch", + "name": "_rsLatch#1", + "pos": { + "x": 120.0, + "y": 45.0 + } + }, + { + "id": "nand3", + "name": "nand3#0", + "pos": { + "x": 40.0, + "y": 30.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#0", + "pinName": "_R" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 10.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "nand3#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#1", + "pinName": "_R" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 105.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "_rsLatch#1", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#13" + }, + { + "pin1": { + "compName": "_rsLatch#1", + "pinName": "_Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_Q" + }, + "name": "unnamedWire#14" + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "B" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 10.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 145.0, + "y": 30.0 + }, + { + "x": 145.0, + "y": 10.0 + }, + { + "x": 20.0, + "y": 10.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#0", + "pinName": "_S" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 20.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "C" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_rsLatch#0", + "pinName": "_Q" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 95.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "nand3#0", + "pinName": "A" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 30.0, + "y": 65.0 + }, + { + "x": 30.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#1", + "pinName": "_S" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 95.0, + "y": 50.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "dff", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "_rsLatch#1", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json new file mode 100644 index 00000000..188770f4 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff12_we.json @@ -0,0 +1,1313 @@ +{ + "width": 55.0, + "height": 45.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "D", + "logicWidth": 12, + "usage": "INPUT" + }, + { + "location": { + "x": 55.0, + "y": 20.0 + }, + "name": "Q", + "logicWidth": 12, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 70.0, + "y": 45.0 + }, + "params": { + "logicWidth": 12, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 255.0, + "y": 45.0 + }, + "params": { + "logicWidth": 12, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 124.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 124.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 179.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 124.0, + "y": 114.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 124.0, + "y": 144.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 124.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 269.0, + "y": 99.0 + }, + "params": 12 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 179.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 179.0, + "y": 164.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 179.0, + "y": 44.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 179.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#0", + "pos": { + "x": 185.0, + "y": 30.0 + } + }, + { + "id": "dff", + "name": "dff#1", + "pos": { + "x": 185.0, + "y": 60.0 + } + }, + { + "id": "dff", + "name": "dff#10", + "pos": { + "x": 185.0, + "y": 120.0 + } + }, + { + "id": "dff", + "name": "dff#11", + "pos": { + "x": 130.0, + "y": 100.0 + } + }, + { + "id": "dff", + "name": "dff#2", + "pos": { + "x": 130.0, + "y": 10.0 + } + }, + { + "id": "dff", + "name": "dff#3", + "pos": { + "x": 130.0, + "y": 40.0 + } + }, + { + "id": "dff", + "name": "dff#4", + "pos": { + "x": 130.0, + "y": 70.0 + } + }, + { + "id": "dff", + "name": "dff#5", + "pos": { + "x": 185.0, + "y": 150.0 + } + }, + { + "id": "dff", + "name": "dff#6", + "pos": { + "x": 185.0, + "y": 180.0 + } + }, + { + "id": "dff", + "name": "dff#7", + "pos": { + "x": 130.0, + "y": 160.0 + } + }, + { + "id": "dff", + "name": "dff#8", + "pos": { + "x": 130.0, + "y": 130.0 + } + }, + { + "id": "dff", + "name": "dff#9", + "pos": { + "x": 185.0, + "y": 90.0 + } + }, + { + "id": "mux1_12", + "name": "mux1_12#0", + "pos": { + "x": 15.0, + "y": 70.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 125.0, + "y": 5.0 + }, + { + "x": 180.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "dff#11", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#10", + "pinName": "D" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 115.0, + "y": 115.0 + }, + { + "x": 115.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "dff#8", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 110.0, + "y": 135.0 + }, + { + "x": 110.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "dff#5", + "pinName": "D" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 105.0, + "y": 135.0 + }, + { + "x": 105.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "dff#7", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 100.0, + "y": 165.0 + }, + { + "x": 100.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "dff#6", + "pinName": "D" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 95.0, + "y": 155.0 + }, + { + "x": 95.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "mux1_12#0", + "pinName": "S" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 5.0, + "y": 100.0 + }, + { + "x": 5.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "mux1_12#0", + "pinName": "I1" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 5.0, + "y": 175.0 + }, + { + "x": 5.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_12#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#2", + "pinName": "C" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "dff#3", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff#4", + "pinName": "C" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#11", + "pinName": "C" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff#8", + "pinName": "C" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "mux1_12#0", + "pinName": "I0" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 90.0 + }, + { + "x": 10.0, + "y": 205.0 + }, + { + "x": 270.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff#7", + "pinName": "C" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 125.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "dff#6", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 180.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dff#5", + "pinName": "C" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "dff#10", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dff#9", + "pinName": "C" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "C" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "dff#2", + "pinName": "D" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 85.0, + "y": 45.0 + }, + { + "x": 85.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff#0", + "pinName": "C" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "dff#0", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 90.0, + "y": 35.0 + }, + { + "x": 90.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O11" + }, + "pin2": { + "compName": "dff#2", + "pinName": "Q" + }, + "name": "unnamedWire#53", + "path": [ + { + "x": 250.0, + "y": 45.0 + }, + { + "x": 250.0, + "y": 25.0 + }, + { + "x": 170.0, + "y": 25.0 + }, + { + "x": 170.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "dff#0", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O10" + }, + "name": "unnamedWire#54", + "path": [ + { + "x": 240.0, + "y": 35.0 + }, + { + "x": 240.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O9" + }, + "pin2": { + "compName": "dff#3", + "pinName": "Q" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 235.0, + "y": 65.0 + }, + { + "x": 235.0, + "y": 55.0 + }, + { + "x": 170.0, + "y": 55.0 + }, + { + "x": 170.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "dff#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O8" + }, + "name": "unnamedWire#56", + "path": [ + { + "x": 230.0, + "y": 65.0 + }, + { + "x": 230.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "dff#4", + "pinName": "Q" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 170.0, + "y": 85.0 + }, + { + "x": 170.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "dff#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "dff#11", + "pinName": "Q" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 225.0, + "y": 105.0 + }, + { + "x": 225.0, + "y": 115.0 + }, + { + "x": 170.0, + "y": 115.0 + }, + { + "x": 170.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dff#3", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 95.0, + "y": 45.0 + }, + { + "x": 95.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#10", + "pinName": "Q" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 230.0, + "y": 115.0 + }, + { + "x": 230.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "dff#8", + "pinName": "Q" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 235.0, + "y": 125.0 + }, + { + "x": 235.0, + "y": 145.0 + }, + { + "x": 170.0, + "y": 145.0 + }, + { + "x": 170.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "dff#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 240.0, + "y": 155.0 + }, + { + "x": 240.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "dff#7", + "pinName": "Q" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 245.0, + "y": 145.0 + }, + { + "x": 245.0, + "y": 175.0 + }, + { + "x": 170.0, + "y": 175.0 + }, + { + "x": 170.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "dff#6", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 250.0, + "y": 185.0 + }, + { + "x": 250.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "dff#1", + "pinName": "D" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 100.0, + "y": 75.0 + }, + { + "x": 100.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "dff#4", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 105.0, + "y": 75.0 + }, + { + "x": 105.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "dff#9", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n12 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q12", + "q11", + "q10", + "q9", + "q8", + "q7", + "q6", + "q5", + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#6", + "subStateID": "q" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff#3", + "subStateID": "q" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff#0", + "subStateID": "q" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff#2", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#7", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#5", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#8", + "subStateID": "q" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff#10", + "subStateID": "q" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff#11", + "subStateID": "q" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff#9", + "subStateID": "q" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff#4", + "subStateID": "q" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff#1", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json new file mode 100644 index 00000000..6efc9033 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16.json @@ -0,0 +1,1601 @@ +{ + "width": 45.0, + "height": 55.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 25.0 + }, + "name": "Q", + "logicWidth": 16, + "usage": "TRISTATE" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 50.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 210.0, + "y": 50.0 + }, + "params": { + "logicWidth": 16, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 64.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 64.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 114.0, + "y": 139.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 114.0, + "y": 229.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 114.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 114.0, + "y": 169.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 114.0, + "y": 199.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 64.0, + "y": 89.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 64.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 64.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 64.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 64.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 114.0, + "y": 79.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 114.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#0", + "pos": { + "x": 70.0, + "y": 15.0 + } + }, + { + "id": "dff", + "name": "dff#1", + "pos": { + "x": 120.0, + "y": 35.0 + } + }, + { + "id": "dff", + "name": "dff#10", + "pos": { + "x": 120.0, + "y": 245.0 + } + }, + { + "id": "dff", + "name": "dff#11", + "pos": { + "x": 70.0, + "y": 225.0 + } + }, + { + "id": "dff", + "name": "dff#12", + "pos": { + "x": 70.0, + "y": 195.0 + } + }, + { + "id": "dff", + "name": "dff#13", + "pos": { + "x": 120.0, + "y": 155.0 + } + }, + { + "id": "dff", + "name": "dff#14", + "pos": { + "x": 120.0, + "y": 185.0 + } + }, + { + "id": "dff", + "name": "dff#15", + "pos": { + "x": 70.0, + "y": 165.0 + } + }, + { + "id": "dff", + "name": "dff#2", + "pos": { + "x": 120.0, + "y": 65.0 + } + }, + { + "id": "dff", + "name": "dff#3", + "pos": { + "x": 70.0, + "y": 45.0 + } + }, + { + "id": "dff", + "name": "dff#4", + "pos": { + "x": 120.0, + "y": 95.0 + } + }, + { + "id": "dff", + "name": "dff#5", + "pos": { + "x": 120.0, + "y": 125.0 + } + }, + { + "id": "dff", + "name": "dff#6", + "pos": { + "x": 70.0, + "y": 75.0 + } + }, + { + "id": "dff", + "name": "dff#7", + "pos": { + "x": 70.0, + "y": 105.0 + } + }, + { + "id": "dff", + "name": "dff#8", + "pos": { + "x": 70.0, + "y": 135.0 + } + }, + { + "id": "dff", + "name": "dff#9", + "pos": { + "x": 120.0, + "y": 215.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "dff#0", + "pinName": "D" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 20.0, + "y": 50.0 + }, + { + "x": 20.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "dff#1", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 25.0, + "y": 40.0 + }, + { + "x": 25.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "dff#15", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 45.0, + "y": 170.0 + }, + { + "x": 45.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#14", + "pinName": "D" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 40.0, + "y": 160.0 + }, + { + "x": 40.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "dff#12", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 35.0, + "y": 200.0 + }, + { + "x": 35.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "dff#9", + "pinName": "D" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 30.0, + "y": 180.0 + }, + { + "x": 30.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "dff#11", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 25.0, + "y": 230.0 + }, + { + "x": 25.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "dff#10", + "pinName": "D" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 20.0, + "y": 200.0 + }, + { + "x": 20.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#0", + "pinName": "C" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "C" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "dff#3", + "pinName": "D" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 30.0, + "y": 70.0 + }, + { + "x": 30.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#6", + "pinName": "C" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "dff#7", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff#8", + "pinName": "C" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff#15", + "pinName": "C" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dff#12", + "pinName": "C" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "dff#2", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 35.0, + "y": 70.0 + }, + { + "x": 35.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dff#11", + "pinName": "C" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 65.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "dff#10", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 115.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "dff#9", + "pinName": "C" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "dff#14", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "dff#13", + "pinName": "C" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "dff#5", + "pinName": "C" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "dff#6", + "pinName": "D" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 40.0, + "y": 90.0 + }, + { + "x": 40.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "dff#4", + "pinName": "C" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff#2", + "pinName": "C" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "C" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 65.0, + "y": 10.0 + }, + { + "x": 115.0, + "y": 10.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 10.0, + "y": 30.0 + }, + { + "x": 10.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O15" + }, + "pin2": { + "compName": "dff#0", + "pinName": "Q" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 200.0, + "y": 50.0 + }, + { + "x": 200.0, + "y": 30.0 + }, + { + "x": 110.0, + "y": 30.0 + }, + { + "x": 110.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "dff#4", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "dff#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O14" + }, + "name": "unnamedWire#50", + "path": [ + { + "x": 195.0, + "y": 40.0 + }, + { + "x": 195.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O13" + }, + "pin2": { + "compName": "dff#3", + "pinName": "Q" + }, + "name": "unnamedWire#51", + "path": [ + { + "x": 190.0, + "y": 70.0 + }, + { + "x": 190.0, + "y": 60.0 + }, + { + "x": 110.0, + "y": 60.0 + }, + { + "x": 110.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O12" + }, + "pin2": { + "compName": "dff#2", + "pinName": "Q" + }, + "name": "unnamedWire#52", + "path": [ + { + "x": 185.0, + "y": 80.0 + }, + { + "x": 185.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O11" + }, + "pin2": { + "compName": "dff#6", + "pinName": "Q" + }, + "name": "unnamedWire#53", + "path": [ + { + "x": 110.0, + "y": 90.0 + }, + { + "x": 110.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "dff#4", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O10" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O9" + }, + "pin2": { + "compName": "dff#7", + "pinName": "Q" + }, + "name": "unnamedWire#55", + "path": [ + { + "x": 160.0, + "y": 110.0 + }, + { + "x": 160.0, + "y": 120.0 + }, + { + "x": 110.0, + "y": 120.0 + }, + { + "x": 110.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "dff#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O8" + }, + "name": "unnamedWire#56", + "path": [ + { + "x": 165.0, + "y": 130.0 + }, + { + "x": 165.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "dff#8", + "pinName": "Q" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 170.0, + "y": 130.0 + }, + { + "x": 170.0, + "y": 150.0 + }, + { + "x": 110.0, + "y": 150.0 + }, + { + "x": 110.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "dff#13", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 175.0, + "y": 160.0 + }, + { + "x": 175.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "dff#15", + "pinName": "Q" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 180.0, + "y": 150.0 + }, + { + "x": 180.0, + "y": 180.0 + }, + { + "x": 110.0, + "y": 180.0 + }, + { + "x": 110.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "dff#7", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#14", + "pinName": "Q" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 185.0, + "y": 160.0 + }, + { + "x": 185.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "dff#12", + "pinName": "Q" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 190.0, + "y": 170.0 + }, + { + "x": 190.0, + "y": 210.0 + }, + { + "x": 110.0, + "y": 210.0 + }, + { + "x": 110.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "dff#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 195.0, + "y": 220.0 + }, + { + "x": 195.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "dff#11", + "pinName": "Q" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 200.0, + "y": 190.0 + }, + { + "x": 200.0, + "y": 240.0 + }, + { + "x": 110.0, + "y": 240.0 + }, + { + "x": 110.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "dff#10", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 205.0, + "y": 250.0 + }, + { + "x": 205.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "dff#5", + "pinName": "D" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 60.0, + "y": 120.0 + }, + { + "x": 60.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "dff#8", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 55.0, + "y": 140.0 + }, + { + "x": 55.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "dff#13", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 50.0, + "y": 140.0 + }, + { + "x": 50.0, + "y": 160.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n16 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q16", + "q15", + "q14", + "q13", + "q12", + "q11", + "q10", + "q9", + "q8", + "q7", + "q6", + "q5", + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#10", + "subStateID": "q" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff#7", + "subStateID": "q" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff#4", + "subStateID": "q" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff#6", + "subStateID": "q" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dff#2", + "subStateID": "q" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dff#3", + "subStateID": "q" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dff#1", + "subStateID": "q" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dff#0", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#11", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#9", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#12", + "subStateID": "q" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff#14", + "subStateID": "q" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff#15", + "subStateID": "q" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff#13", + "subStateID": "q" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff#8", + "subStateID": "q" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff#5", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json new file mode 100644 index 00000000..0d24ad3f --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_invwe.json @@ -0,0 +1,325 @@ +{ + "width": 45.0, + "height": 55.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 25.0 + }, + "name": "Q", + "logicWidth": 16, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "_WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 164.0, + "y": 99.0 + }, + "params": 16 + }, + { + "id": "dff16", + "name": "dff16#0", + "pos": { + "x": 110.0, + "y": 75.0 + } + }, + { + "id": "mux1_16", + "name": "mux1_16#0", + "pos": { + "x": 30.0, + "y": 75.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "mux1_16#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "D" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 95.0, + "y": 125.0 + }, + { + "x": 95.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "dff16#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "C" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 95.0, + "y": 20.0 + }, + { + "x": 95.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_WE" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "S" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I1" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 165.0, + "y": 205.0 + }, + { + "x": 10.0, + "y": 205.0 + }, + { + "x": 10.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I0" + }, + "name": "unnamedWire#68", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n16 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q" + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q1" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q10" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q11" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q12" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q13" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q14" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q15" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q16" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q2" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q3" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q4" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q5" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q6" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q7" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q8" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q9" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json new file mode 100644 index 00000000..09127e66 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff16_we.json @@ -0,0 +1,334 @@ +{ + "width": 45.0, + "height": 55.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 45.0, + "y": 25.0 + }, + "name": "Q", + "logicWidth": 16, + "usage": "TRISTATE" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.25, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 164.0, + "y": 99.0 + }, + "params": 16 + }, + { + "id": "dff16", + "name": "dff16#0", + "pos": { + "x": 110.0, + "y": 75.0 + } + }, + { + "id": "mux1_16", + "name": "mux1_16#0", + "pos": { + "x": 30.0, + "y": 75.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "mux1_16#0", + "pinName": "Y" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "D" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 95.0, + "y": 125.0 + }, + { + "x": 95.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "dff16#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "dff16#0", + "pinName": "C" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 95.0, + "y": 20.0 + }, + { + "x": 95.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "S" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I0" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 165.0, + "y": 205.0 + }, + { + "x": 20.0, + "y": 205.0 + }, + { + "x": 20.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "mux1_16#0", + "pinName": "I1" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 10.0, + "y": 100.0 + }, + { + "x": 10.0, + "y": 165.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n16 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q" + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q1" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q10" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q11" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q12" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q13" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q14" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q15" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q16" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q2" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q3" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q4" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q5" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q6" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q7" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q8" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff16#0", + "subStateID": "q9" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json new file mode 100644 index 00000000..cd203617 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4.json @@ -0,0 +1,742 @@ +{ + "width": 35.0, + "height": 60.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Q3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Q4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 104.0, + "y": 184.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 104.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 104.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 169.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 164.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 159.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 154.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#0", + "pos": { + "x": 115.0, + "y": 20.0 + } + }, + { + "id": "dff", + "name": "dff#1", + "pos": { + "x": 115.0, + "y": 70.0 + } + }, + { + "id": "dff", + "name": "dff#2", + "pos": { + "x": 115.0, + "y": 120.0 + } + }, + { + "id": "dff", + "name": "dff#3", + "pos": { + "x": 115.0, + "y": 170.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 55.0, + "y": 60.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#0", + "pinName": "C" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 105.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "dff#0", + "pinName": "D" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 100.0, + "y": 65.0 + }, + { + "x": 100.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 25.0, + "y": 25.0 + }, + { + "x": 25.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 20.0, + "y": 75.0 + }, + { + "x": 20.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 25.0, + "y": 125.0 + }, + { + "x": 25.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "dff#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q1" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "Q" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 25.0, + "y": 175.0 + }, + { + "x": 25.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "dff#2", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q3" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "dff#1", + "pinName": "D" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q4" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "Q" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "dff#2", + "pinName": "D" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 100.0, + "y": 85.0 + }, + { + "x": 100.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "dff#3", + "pinName": "D" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 95.0, + "y": 95.0 + }, + { + "x": 95.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 170.0, + "y": 205.0 + }, + { + "x": 50.0, + "y": 205.0 + }, + { + "x": 50.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 165.0, + "y": 210.0 + }, + { + "x": 45.0, + "y": 210.0 + }, + { + "x": 45.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 160.0, + "y": 215.0 + }, + { + "x": 40.0, + "y": 215.0 + }, + { + "x": 40.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 155.0, + "y": 220.0 + }, + { + "x": 35.0, + "y": 220.0 + }, + { + "x": 35.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "C" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "C" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#2", + "pinName": "C" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 225.0 + }, + { + "x": 20.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 275.0 + }, + { + "x": 10.0, + "y": 65.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n4 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#0", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#1", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#2", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#3", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json new file mode 100644 index 00000000..005cabe4 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff4_invwe.json @@ -0,0 +1,742 @@ +{ + "width": 35.0, + "height": 60.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Q3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Q4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "_WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 104.0, + "y": 184.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 104.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 104.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 169.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 164.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 159.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 154.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#0", + "pos": { + "x": 115.0, + "y": 20.0 + } + }, + { + "id": "dff", + "name": "dff#1", + "pos": { + "x": 115.0, + "y": 70.0 + } + }, + { + "id": "dff", + "name": "dff#2", + "pos": { + "x": 115.0, + "y": 120.0 + } + }, + { + "id": "dff", + "name": "dff#3", + "pos": { + "x": 115.0, + "y": 170.0 + } + }, + { + "id": "mux1_4", + "name": "mux1_4#0", + "pos": { + "x": 55.0, + "y": 60.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#0", + "pinName": "C" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 105.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "dff#0", + "pinName": "D" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 100.0, + "y": 65.0 + }, + { + "x": 100.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_1" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 25.0, + "y": 25.0 + }, + { + "x": 25.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_2" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 20.0, + "y": 75.0 + }, + { + "x": 20.0, + "y": 85.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 20.0, + "y": 125.0 + }, + { + "x": 20.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "dff#0", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q1" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "Q" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I0_4" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 25.0, + "y": 175.0 + }, + { + "x": 25.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dff#2", + "pinName": "Q" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q3" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "dff#1", + "pinName": "D" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q4" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "Q" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "dff#2", + "pinName": "D" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 100.0, + "y": 85.0 + }, + { + "x": 100.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "mux1_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "dff#3", + "pinName": "D" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 95.0, + "y": 95.0 + }, + { + "x": 95.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_1" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 170.0, + "y": 205.0 + }, + { + "x": 50.0, + "y": 205.0 + }, + { + "x": 50.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_2" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 165.0, + "y": 210.0 + }, + { + "x": 45.0, + "y": 210.0 + }, + { + "x": 45.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_3" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 160.0, + "y": 215.0 + }, + { + "x": 40.0, + "y": 215.0 + }, + { + "x": 40.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "I1_4" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 155.0, + "y": 220.0 + }, + { + "x": 35.0, + "y": 220.0 + }, + { + "x": 35.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#3", + "pinName": "C" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff#1", + "pinName": "C" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#2", + "pinName": "C" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 225.0 + }, + { + "x": 20.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_WE" + }, + "pin2": { + "compName": "mux1_4#0", + "pinName": "S0" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 275.0 + }, + { + "x": 10.0, + "y": 65.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n4 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#0", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#1", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#2", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#3", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json new file mode 100644 index 00000000..8c2a5b3b --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff8.json @@ -0,0 +1,859 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D", + "logicWidth": 8, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q", + "logicWidth": 8, + "usage": "TRISTATE" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 160.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 39.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 89.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 39.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 39.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 89.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 89.0, + "y": 44.0 + }, + "params": 1 + }, + { + "id": "dff", + "name": "dff#10", + "pos": { + "x": 95.0, + "y": 60.0 + } + }, + { + "id": "dff", + "name": "dff#11", + "pos": { + "x": 45.0, + "y": 40.0 + } + }, + { + "id": "dff", + "name": "dff#4", + "pos": { + "x": 45.0, + "y": 10.0 + } + }, + { + "id": "dff", + "name": "dff#5", + "pos": { + "x": 95.0, + "y": 90.0 + } + }, + { + "id": "dff", + "name": "dff#6", + "pos": { + "x": 95.0, + "y": 120.0 + } + }, + { + "id": "dff", + "name": "dff#7", + "pos": { + "x": 45.0, + "y": 100.0 + } + }, + { + "id": "dff", + "name": "dff#8", + "pos": { + "x": 45.0, + "y": 70.0 + } + }, + { + "id": "dff", + "name": "dff#9", + "pos": { + "x": 95.0, + "y": 30.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 40.0, + "y": 5.0 + }, + { + "x": 90.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "dff#11", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 30.0, + "y": 45.0 + }, + { + "x": 30.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#10", + "pinName": "D" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 25.0, + "y": 70.0 + }, + { + "x": 25.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "dff#8", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 25.0, + "y": 75.0 + }, + { + "x": 25.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "dff#5", + "pinName": "D" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 25.0, + "y": 90.0 + }, + { + "x": 25.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "dff#7", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 25.0, + "y": 105.0 + }, + { + "x": 25.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "dff#6", + "pinName": "D" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 20.0, + "y": 110.0 + }, + { + "x": 20.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff#11", + "pinName": "C" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff#8", + "pinName": "C" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff#7", + "pinName": "C" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 40.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "dff#6", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 90.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dff#5", + "pinName": "C" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "dff#10", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dff#9", + "pinName": "C" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff#4", + "pinName": "C" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "dff#4", + "pinName": "Q" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 155.0, + "y": 40.0 + }, + { + "x": 155.0, + "y": 25.0 + }, + { + "x": 85.0, + "y": 25.0 + }, + { + "x": 85.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "dff#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 150.0, + "y": 35.0 + }, + { + "x": 150.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "dff#11", + "pinName": "Q" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 145.0, + "y": 60.0 + }, + { + "x": 145.0, + "y": 55.0 + }, + { + "x": 85.0, + "y": 55.0 + }, + { + "x": 85.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "dff#10", + "pinName": "Q" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 140.0, + "y": 70.0 + }, + { + "x": 140.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "dff#8", + "pinName": "Q" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 140.0, + "y": 80.0 + }, + { + "x": 140.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "dff#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 140.0, + "y": 95.0 + }, + { + "x": 140.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "dff#7", + "pinName": "Q" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 140.0, + "y": 100.0 + }, + { + "x": 140.0, + "y": 115.0 + }, + { + "x": 85.0, + "y": 115.0 + }, + { + "x": 85.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dff#6", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 150.0, + "y": 125.0 + }, + { + "x": 150.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "dff#4", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 15.0 + }, + { + "x": 20.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "dff#9", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 25.0, + "y": 50.0 + }, + { + "x": 25.0, + "y": 35.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n8 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q8", + "q7", + "q6", + "q5", + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff#6", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff#7", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff#5", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff#8", + "subStateID": "q" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff#10", + "subStateID": "q" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff#11", + "subStateID": "q" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff#9", + "subStateID": "q" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff#4", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json new file mode 100644 index 00000000..e1f37bc6 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dff80.json @@ -0,0 +1,3563 @@ +{ + "width": 25.0, + "height": 165.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "D", + "logicWidth": 80, + "usage": "INPUT" + }, + { + "location": { + "x": 25.0, + "y": 85.0 + }, + "name": "Q", + "logicWidth": 80, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 15.0, + "y": 30.0 + }, + "params": { + "logicWidth": 80, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 90.0, + "y": 750.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#10", + "pos": { + "x": 30.0, + "y": 670.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#11", + "pos": { + "x": 30.0, + "y": 750.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#12", + "pos": { + "x": 90.0, + "y": 510.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#13", + "pos": { + "x": 90.0, + "y": 590.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#14", + "pos": { + "x": 90.0, + "y": 110.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#15", + "pos": { + "x": 90.0, + "y": 430.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#16", + "pos": { + "x": 90.0, + "y": 190.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#17", + "pos": { + "x": 90.0, + "y": 350.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#18", + "pos": { + "x": 90.0, + "y": 270.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#19", + "pos": { + "x": 90.0, + "y": 670.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 30.0, + "y": 30.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#20", + "pos": { + "x": 90.0, + "y": 30.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#21", + "pos": { + "x": 105.0, + "y": 30.0 + }, + "params": { + "logicWidth": 80, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 30.0, + "y": 110.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 30.0, + "y": 190.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#5", + "pos": { + "x": 30.0, + "y": 270.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#6", + "pos": { + "x": 30.0, + "y": 350.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#7", + "pos": { + "x": 30.0, + "y": 430.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#8", + "pos": { + "x": 30.0, + "y": 510.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#9", + "pos": { + "x": 30.0, + "y": 590.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 44.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 44.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 44.0, + "y": 214.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 44.0, + "y": 294.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 44.0, + "y": 454.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 44.0, + "y": 374.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 44.0, + "y": 614.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 44.0, + "y": 534.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 44.0, + "y": 694.0 + }, + "params": 1 + }, + { + "id": "dff8", + "name": "dff8#0", + "pos": { + "x": 50.0, + "y": 770.0 + } + }, + { + "id": "dff8", + "name": "dff8#1", + "pos": { + "x": 50.0, + "y": 690.0 + } + }, + { + "id": "dff8", + "name": "dff8#2", + "pos": { + "x": 50.0, + "y": 610.0 + } + }, + { + "id": "dff8", + "name": "dff8#3", + "pos": { + "x": 50.0, + "y": 530.0 + } + }, + { + "id": "dff8", + "name": "dff8#4", + "pos": { + "x": 50.0, + "y": 450.0 + } + }, + { + "id": "dff8", + "name": "dff8#5", + "pos": { + "x": 50.0, + "y": 370.0 + } + }, + { + "id": "dff8", + "name": "dff8#6", + "pos": { + "x": 50.0, + "y": 290.0 + } + }, + { + "id": "dff8", + "name": "dff8#7", + "pos": { + "x": 50.0, + "y": 210.0 + } + }, + { + "id": "dff8", + "name": "dff8#8", + "pos": { + "x": 50.0, + "y": 130.0 + } + }, + { + "id": "dff8", + "name": "dff8#9", + "pos": { + "x": 50.0, + "y": 50.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O79" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O78" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O69" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O59" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O3" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O58" + }, + "name": "unnamedWire#101", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O57" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O1" + }, + "name": "unnamedWire#102", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O56" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O55" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O7" + }, + "name": "unnamedWire#104", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O54" + }, + "name": "unnamedWire#105", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O53" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O5" + }, + "name": "unnamedWire#106", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O52" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O51" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O3" + }, + "name": "unnamedWire#108", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O50" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O68" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O49" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O1" + }, + "name": "unnamedWire#110", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O48" + }, + "name": "unnamedWire#111", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O7" + }, + "name": "unnamedWire#112", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O46" + }, + "name": "unnamedWire#113", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O5" + }, + "name": "unnamedWire#114", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O44" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O3" + }, + "name": "unnamedWire#116", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O42" + }, + "name": "unnamedWire#117", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O1" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O40" + }, + "name": "unnamedWire#119", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O67" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O39" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O7" + }, + "name": "unnamedWire#120", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O38" + }, + "name": "unnamedWire#121", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O37" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O5" + }, + "name": "unnamedWire#122", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O36" + }, + "name": "unnamedWire#123", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O35" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O3" + }, + "name": "unnamedWire#124", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O34" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O33" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O1" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O32" + }, + "name": "unnamedWire#127", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O31" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O7" + }, + "name": "unnamedWire#128", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O30" + }, + "name": "unnamedWire#129", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O66" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O29" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O5" + }, + "name": "unnamedWire#130", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O28" + }, + "name": "unnamedWire#131", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O27" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O3" + }, + "name": "unnamedWire#132", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O26" + }, + "name": "unnamedWire#133", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O25" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O1" + }, + "name": "unnamedWire#134", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O24" + }, + "name": "unnamedWire#135", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O23" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O7" + }, + "name": "unnamedWire#136", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O22" + }, + "name": "unnamedWire#137", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O21" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O5" + }, + "name": "unnamedWire#138", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O20" + }, + "name": "unnamedWire#139", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O65" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O19" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O3" + }, + "name": "unnamedWire#140", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O18" + }, + "name": "unnamedWire#141", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O17" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O1" + }, + "name": "unnamedWire#142", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O16" + }, + "name": "unnamedWire#143", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O7" + }, + "name": "unnamedWire#144", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O14" + }, + "name": "unnamedWire#145", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O5" + }, + "name": "unnamedWire#146", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O12" + }, + "name": "unnamedWire#147", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O3" + }, + "name": "unnamedWire#148", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O10" + }, + "name": "unnamedWire#149", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O64" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O1" + }, + "name": "unnamedWire#150", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O8" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "name": "unnamedWire#152", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O6" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "name": "unnamedWire#154", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O4" + }, + "name": "unnamedWire#155", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "name": "unnamedWire#156", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O2" + }, + "name": "unnamedWire#157", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "name": "unnamedWire#158", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O0" + }, + "name": "unnamedWire#159", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O63" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O7" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#9", + "pinName": "D" + }, + "name": "unnamedWire#160", + "path": [] + }, + { + "pin1": { + "compName": "dff8#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "I" + }, + "name": "unnamedWire#161", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#8", + "pinName": "D" + }, + "name": "unnamedWire#162", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#7", + "pinName": "D" + }, + "name": "unnamedWire#163", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#6", + "pinName": "D" + }, + "name": "unnamedWire#164", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#5", + "pinName": "D" + }, + "name": "unnamedWire#165", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#4", + "pinName": "D" + }, + "name": "unnamedWire#166", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#3", + "pinName": "D" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#2", + "pinName": "D" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#1", + "pinName": "D" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O62" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#0", + "pinName": "D" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#0", + "pinName": "Q" + }, + "name": "unnamedWire#171", + "path": [] + }, + { + "pin1": { + "compName": "dff8#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "I" + }, + "name": "unnamedWire#172", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#2", + "pinName": "Q" + }, + "name": "unnamedWire#173", + "path": [] + }, + { + "pin1": { + "compName": "dff8#3", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "I" + }, + "name": "unnamedWire#174", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#4", + "pinName": "Q" + }, + "name": "unnamedWire#175", + "path": [] + }, + { + "pin1": { + "compName": "dff8#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "I" + }, + "name": "unnamedWire#176", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#6", + "pinName": "Q" + }, + "name": "unnamedWire#177", + "path": [] + }, + { + "pin1": { + "compName": "dff8#7", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "I" + }, + "name": "unnamedWire#178", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "I" + }, + "pin2": { + "compName": "dff8#8", + "pinName": "Q" + }, + "name": "unnamedWire#179", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O61" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O5" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#180", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "I" + }, + "name": "unnamedWire#181", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#182", + "path": [ + { + "x": 45.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dff8#9", + "pinName": "C" + }, + "name": "unnamedWire#183", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dff8#8", + "pinName": "C" + }, + "name": "unnamedWire#184", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#185", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#186", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dff8#7", + "pinName": "C" + }, + "name": "unnamedWire#187", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#188", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dff8#6", + "pinName": "C" + }, + "name": "unnamedWire#189", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O60" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#190", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dff8#5", + "pinName": "C" + }, + "name": "unnamedWire#191", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#192", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dff8#4", + "pinName": "C" + }, + "name": "unnamedWire#193", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#194", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dff8#3", + "pinName": "C" + }, + "name": "unnamedWire#195", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#196", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dff8#2", + "pinName": "C" + }, + "name": "unnamedWire#197", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#198", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff8#1", + "pinName": "C" + }, + "name": "unnamedWire#199", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O77" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O59" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dff8#0", + "pinName": "C" + }, + "name": "unnamedWire#200", + "path": [ + { + "x": 45.0, + "y": 775.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O58" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O57" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O56" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O55" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O7" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O54" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O53" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O5" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O52" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O51" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O3" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O50" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O76" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O49" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O1" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O48" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O7" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O46" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O5" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O44" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O3" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O42" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O1" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O40" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O75" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O39" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O7" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O38" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O37" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O5" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O36" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O35" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O3" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O34" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O33" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O1" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O32" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O31" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O7" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O30" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O74" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O29" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O5" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O28" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O27" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O3" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O26" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O25" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O1" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O24" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O23" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O7" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O22" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O21" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O5" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O20" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O73" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O19" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O3" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O18" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O17" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O1" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O16" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O7" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O5" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O3" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "name": "unnamedWire#69", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O72" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O1" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "name": "unnamedWire#71", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O7" + }, + "name": "unnamedWire#72", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "name": "unnamedWire#73", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O5" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O3" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O1" + }, + "name": "unnamedWire#78", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "name": "unnamedWire#79", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O71" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O79" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O7" + }, + "name": "unnamedWire#80", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O78" + }, + "name": "unnamedWire#81", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O77" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O5" + }, + "name": "unnamedWire#82", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O76" + }, + "name": "unnamedWire#83", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O75" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O3" + }, + "name": "unnamedWire#84", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O74" + }, + "name": "unnamedWire#85", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O73" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O1" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O72" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O71" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O7" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O70" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O70" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O69" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O5" + }, + "name": "unnamedWire#90", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O68" + }, + "name": "unnamedWire#91", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O67" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O3" + }, + "name": "unnamedWire#92", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O66" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O65" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O1" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O64" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O63" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O7" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O62" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O61" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O5" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O60" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D flip flop\n80 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q80-73", + "q72-65", + "q64-57", + "q56-49", + "q48-41", + "q40-33", + "q32-25", + "q24-17", + "q16-9", + "q8-1" + ], + "vectorPartLengthes": [ + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q1" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q2" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q3" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q4" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q5" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q6" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q7" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q8" + } + }, + "q16-9": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q" + } + }, + "q17": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q1" + } + }, + "q18": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q2" + } + }, + "q19": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q3" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q2" + } + }, + "q20": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q4" + } + }, + "q21": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q5" + } + }, + "q22": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q6" + } + }, + "q23": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q7" + } + }, + "q24": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q8" + } + }, + "q24-17": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#2", + "subStateID": "q" + } + }, + "q25": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q1" + } + }, + "q26": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q2" + } + }, + "q27": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q3" + } + }, + "q28": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q4" + } + }, + "q29": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q5" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q3" + } + }, + "q30": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q6" + } + }, + "q31": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q7" + } + }, + "q32": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q8" + } + }, + "q32-25": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#3", + "subStateID": "q" + } + }, + "q33": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q1" + } + }, + "q34": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q2" + } + }, + "q35": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q3" + } + }, + "q36": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q4" + } + }, + "q37": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q5" + } + }, + "q38": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q6" + } + }, + "q39": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q7" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q4" + } + }, + "q40": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q8" + } + }, + "q40-33": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#4", + "subStateID": "q" + } + }, + "q41": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q1" + } + }, + "q42": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q2" + } + }, + "q43": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q3" + } + }, + "q44": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q4" + } + }, + "q45": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q5" + } + }, + "q46": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q6" + } + }, + "q47": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q7" + } + }, + "q48": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q8" + } + }, + "q48-41": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#5", + "subStateID": "q" + } + }, + "q49": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q1" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q5" + } + }, + "q50": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q2" + } + }, + "q51": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q3" + } + }, + "q52": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q4" + } + }, + "q53": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q5" + } + }, + "q54": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q6" + } + }, + "q55": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q7" + } + }, + "q56": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q8" + } + }, + "q56-49": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#6", + "subStateID": "q" + } + }, + "q57": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q1" + } + }, + "q58": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q2" + } + }, + "q59": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q3" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q6" + } + }, + "q60": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q4" + } + }, + "q61": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q5" + } + }, + "q62": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q6" + } + }, + "q63": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q7" + } + }, + "q64": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q8" + } + }, + "q64-57": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#7", + "subStateID": "q" + } + }, + "q65": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q1" + } + }, + "q66": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q2" + } + }, + "q67": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q3" + } + }, + "q68": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q4" + } + }, + "q69": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q5" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q7" + } + }, + "q70": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q6" + } + }, + "q71": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q7" + } + }, + "q72": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q8" + } + }, + "q72-65": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#8", + "subStateID": "q" + } + }, + "q73": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q1" + } + }, + "q74": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q2" + } + }, + "q75": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q3" + } + }, + "q76": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q4" + } + }, + "q77": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q5" + } + }, + "q78": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q6" + } + }, + "q79": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q7" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q8" + } + }, + "q8-1": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#0", + "subStateID": "q" + } + }, + "q80": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q8" + } + }, + "q80-73": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#9", + "subStateID": "q" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dff8#1", + "subStateID": "q1" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json new file mode 100644 index 00000000..3884fc0b --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch.json @@ -0,0 +1,267 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "E", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "_Q", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 15.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 34.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "_rsLatch", + "name": "_rsLatch#0", + "pos": { + "x": 45.0, + "y": 7.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "E" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 5.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 35.0, + "y": 25.0 + }, + { + "x": 10.0, + "y": 25.0 + }, + { + "x": 10.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_rsLatch#0", + "pinName": "_S" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_rsLatch#0", + "pinName": "_R" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 40.0, + "y": 37.5 + }, + { + "x": 40.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "_rsLatch#0", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "_rsLatch#0", + "pinName": "_Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_Q" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "dlatch", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "delegating", + "params": { + "delegateTarget": "_rsLatch#0", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json new file mode 100644 index 00000000..87f53700 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch4.json @@ -0,0 +1,405 @@ +{ + "width": 35.0, + "height": 50.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Q1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Q3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Q4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 14.0, + "y": 46.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 14.0, + "y": 71.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 14.0, + "y": 96.5 + }, + "params": 1 + }, + { + "id": "dlatch", + "name": "dlatch#0", + "pos": { + "x": 30.0, + "y": 7.5 + } + }, + { + "id": "dlatch", + "name": "dlatch#1", + "pos": { + "x": 30.0, + "y": 32.5 + } + }, + { + "id": "dlatch", + "name": "dlatch#2", + "pos": { + "x": 30.0, + "y": 57.5 + } + }, + { + "id": "dlatch", + "name": "dlatch#3", + "pos": { + "x": 30.0, + "y": 82.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 15.0, + "y": 112.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#3", + "pinName": "E" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "dlatch#3", + "pinName": "D" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#0", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q1" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#1", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q2" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#2", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q3" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#3", + "pinName": "Q" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q4" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#2", + "pinName": "E" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#1", + "pinName": "E" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#0", + "pinName": "E" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 15.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "dlatch#0", + "pinName": "D" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "dlatch#1", + "pinName": "D" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "dlatch#2", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "dlatch4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#0", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#1", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#2", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#3", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json new file mode 100644 index 00000000..c871a951 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch8.json @@ -0,0 +1,859 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "D", + "logicWidth": 8, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "E", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Q", + "logicWidth": 8, + "usage": "TRISTATE" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 160.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 39.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 89.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 39.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 39.0, + "y": 84.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 89.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 89.0, + "y": 44.0 + }, + "params": 1 + }, + { + "id": "dlatch", + "name": "dlatch#10", + "pos": { + "x": 95.0, + "y": 60.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#11", + "pos": { + "x": 45.0, + "y": 40.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#4", + "pos": { + "x": 45.0, + "y": 10.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#5", + "pos": { + "x": 95.0, + "y": 90.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#6", + "pos": { + "x": 95.0, + "y": 120.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#7", + "pos": { + "x": 45.0, + "y": 100.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#8", + "pos": { + "x": 45.0, + "y": 70.0 + } + }, + { + "id": "dlatch", + "name": "dlatch#9", + "pos": { + "x": 95.0, + "y": 30.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 40.0, + "y": 5.0 + }, + { + "x": 90.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "E" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#11", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 30.0, + "y": 45.0 + }, + { + "x": 30.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "dlatch#10", + "pinName": "D" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 25.0, + "y": 70.0 + }, + { + "x": 25.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#8", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 25.0, + "y": 75.0 + }, + { + "x": 25.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "dlatch#5", + "pinName": "D" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 25.0, + "y": 90.0 + }, + { + "x": 25.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#7", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 25.0, + "y": 105.0 + }, + { + "x": 25.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "dlatch#6", + "pinName": "D" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 20.0, + "y": 110.0 + }, + { + "x": 20.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#11", + "pinName": "E" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#8", + "pinName": "E" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#7", + "pinName": "E" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 40.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#6", + "pinName": "E" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 90.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#5", + "pinName": "E" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "dlatch#10", + "pinName": "E" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#9", + "pinName": "E" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dlatch#4", + "pinName": "E" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "dlatch#4", + "pinName": "Q" + }, + "name": "unnamedWire#57", + "path": [ + { + "x": 155.0, + "y": 40.0 + }, + { + "x": 155.0, + "y": 25.0 + }, + { + "x": 85.0, + "y": 25.0 + }, + { + "x": 85.0, + "y": 15.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 150.0, + "y": 35.0 + }, + { + "x": 150.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "dlatch#11", + "pinName": "Q" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 145.0, + "y": 60.0 + }, + { + "x": 145.0, + "y": 55.0 + }, + { + "x": 85.0, + "y": 55.0 + }, + { + "x": 85.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "dlatch#10", + "pinName": "Q" + }, + "name": "unnamedWire#60", + "path": [ + { + "x": 140.0, + "y": 70.0 + }, + { + "x": 140.0, + "y": 65.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "dlatch#8", + "pinName": "Q" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 140.0, + "y": 80.0 + }, + { + "x": 140.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 85.0 + }, + { + "x": 85.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 140.0, + "y": 95.0 + }, + { + "x": 140.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "dlatch#7", + "pinName": "Q" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 140.0, + "y": 100.0 + }, + { + "x": 140.0, + "y": 115.0 + }, + { + "x": 85.0, + "y": 115.0 + }, + { + "x": 85.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#6", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 150.0, + "y": 125.0 + }, + { + "x": 150.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "dlatch#4", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 15.0 + }, + { + "x": 20.0, + "y": 40.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "dlatch#9", + "pinName": "D" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 25.0, + "y": 50.0 + }, + { + "x": 25.0, + "y": 35.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D latch\n8 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q8", + "q7", + "q6", + "q5", + "q4", + "q3", + "q2", + "q1" + ], + "vectorPartLengthes": [ + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#6", + "subStateID": "q" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#7", + "subStateID": "q" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#5", + "subStateID": "q" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#8", + "subStateID": "q" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#10", + "subStateID": "q" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#11", + "subStateID": "q" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#9", + "subStateID": "q" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch#4", + "subStateID": "q" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json new file mode 100644 index 00000000..d46c7843 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/dlatch80.json @@ -0,0 +1,3563 @@ +{ + "width": 25.0, + "height": 165.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "D", + "logicWidth": 80, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "E", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 25.0, + "y": 85.0 + }, + "name": "Q", + "logicWidth": 80, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 15.0, + "y": 30.0 + }, + "params": { + "logicWidth": 80, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 90.0, + "y": 750.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#10", + "pos": { + "x": 30.0, + "y": 670.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#11", + "pos": { + "x": 30.0, + "y": 750.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#12", + "pos": { + "x": 90.0, + "y": 510.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#13", + "pos": { + "x": 90.0, + "y": 590.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#14", + "pos": { + "x": 90.0, + "y": 110.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#15", + "pos": { + "x": 90.0, + "y": 430.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#16", + "pos": { + "x": 90.0, + "y": 190.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#17", + "pos": { + "x": 90.0, + "y": 350.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#18", + "pos": { + "x": 90.0, + "y": 270.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#19", + "pos": { + "x": 90.0, + "y": 670.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 30.0, + "y": 30.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#20", + "pos": { + "x": 90.0, + "y": 30.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#21", + "pos": { + "x": 105.0, + "y": 30.0 + }, + "params": { + "logicWidth": 80, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#3", + "pos": { + "x": 30.0, + "y": 110.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#4", + "pos": { + "x": 30.0, + "y": 190.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#5", + "pos": { + "x": 30.0, + "y": 270.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#6", + "pos": { + "x": 30.0, + "y": 350.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#7", + "pos": { + "x": 30.0, + "y": 430.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#8", + "pos": { + "x": 30.0, + "y": 510.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "Splitter", + "name": "Splitter#9", + "pos": { + "x": 30.0, + "y": 590.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 44.0, + "y": 54.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 44.0, + "y": 134.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 44.0, + "y": 214.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 44.0, + "y": 294.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 44.0, + "y": 454.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 44.0, + "y": 374.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 44.0, + "y": 614.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 44.0, + "y": 534.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 44.0, + "y": 694.0 + }, + "params": 1 + }, + { + "id": "dlatch8", + "name": "dlatch8#0", + "pos": { + "x": 50.0, + "y": 770.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#1", + "pos": { + "x": 50.0, + "y": 690.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#2", + "pos": { + "x": 50.0, + "y": 610.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#3", + "pos": { + "x": 50.0, + "y": 530.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#4", + "pos": { + "x": 50.0, + "y": 450.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#5", + "pos": { + "x": 50.0, + "y": 370.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#6", + "pos": { + "x": 50.0, + "y": 290.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#7", + "pos": { + "x": 50.0, + "y": 210.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#8", + "pos": { + "x": 50.0, + "y": 130.0 + } + }, + { + "id": "dlatch8", + "name": "dlatch8#9", + "pos": { + "x": 50.0, + "y": 50.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O79" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O78" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O69" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O5" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O59" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O3" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O58" + }, + "name": "unnamedWire#101", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O57" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O1" + }, + "name": "unnamedWire#102", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O56" + }, + "name": "unnamedWire#103", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O55" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O7" + }, + "name": "unnamedWire#104", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O54" + }, + "name": "unnamedWire#105", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O53" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O5" + }, + "name": "unnamedWire#106", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O52" + }, + "name": "unnamedWire#107", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O51" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O3" + }, + "name": "unnamedWire#108", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O50" + }, + "name": "unnamedWire#109", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O68" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O49" + }, + "pin2": { + "compName": "Splitter#18", + "pinName": "O1" + }, + "name": "unnamedWire#110", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O48" + }, + "name": "unnamedWire#111", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O7" + }, + "name": "unnamedWire#112", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O46" + }, + "name": "unnamedWire#113", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O5" + }, + "name": "unnamedWire#114", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O44" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O3" + }, + "name": "unnamedWire#116", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O42" + }, + "name": "unnamedWire#117", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "O1" + }, + "name": "unnamedWire#118", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#17", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O40" + }, + "name": "unnamedWire#119", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O67" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O3" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O39" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O7" + }, + "name": "unnamedWire#120", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O38" + }, + "name": "unnamedWire#121", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O37" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O5" + }, + "name": "unnamedWire#122", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O36" + }, + "name": "unnamedWire#123", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O35" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O3" + }, + "name": "unnamedWire#124", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O34" + }, + "name": "unnamedWire#125", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O33" + }, + "pin2": { + "compName": "Splitter#15", + "pinName": "O1" + }, + "name": "unnamedWire#126", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O32" + }, + "name": "unnamedWire#127", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O31" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O7" + }, + "name": "unnamedWire#128", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O30" + }, + "name": "unnamedWire#129", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O66" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O29" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O5" + }, + "name": "unnamedWire#130", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O28" + }, + "name": "unnamedWire#131", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O27" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O3" + }, + "name": "unnamedWire#132", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O26" + }, + "name": "unnamedWire#133", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O25" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "O1" + }, + "name": "unnamedWire#134", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#12", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O24" + }, + "name": "unnamedWire#135", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O23" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O7" + }, + "name": "unnamedWire#136", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O22" + }, + "name": "unnamedWire#137", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O21" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O5" + }, + "name": "unnamedWire#138", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O20" + }, + "name": "unnamedWire#139", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O65" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O1" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O19" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O3" + }, + "name": "unnamedWire#140", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O18" + }, + "name": "unnamedWire#141", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O17" + }, + "pin2": { + "compName": "Splitter#13", + "pinName": "O1" + }, + "name": "unnamedWire#142", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O16" + }, + "name": "unnamedWire#143", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O7" + }, + "name": "unnamedWire#144", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O14" + }, + "name": "unnamedWire#145", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O5" + }, + "name": "unnamedWire#146", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O12" + }, + "name": "unnamedWire#147", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O3" + }, + "name": "unnamedWire#148", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O10" + }, + "name": "unnamedWire#149", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O64" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "O1" + }, + "name": "unnamedWire#150", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#19", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O8" + }, + "name": "unnamedWire#151", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "name": "unnamedWire#152", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O6" + }, + "name": "unnamedWire#153", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "name": "unnamedWire#154", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O4" + }, + "name": "unnamedWire#155", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "name": "unnamedWire#156", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O2" + }, + "name": "unnamedWire#157", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "name": "unnamedWire#158", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O0" + }, + "name": "unnamedWire#159", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O63" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O7" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#9", + "pinName": "D" + }, + "name": "unnamedWire#160", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#9", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "I" + }, + "name": "unnamedWire#161", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#8", + "pinName": "D" + }, + "name": "unnamedWire#162", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#7", + "pinName": "D" + }, + "name": "unnamedWire#163", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#6", + "pinName": "D" + }, + "name": "unnamedWire#164", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#5", + "pinName": "D" + }, + "name": "unnamedWire#165", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#4", + "pinName": "D" + }, + "name": "unnamedWire#166", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#3", + "pinName": "D" + }, + "name": "unnamedWire#167", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#2", + "pinName": "D" + }, + "name": "unnamedWire#168", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#1", + "pinName": "D" + }, + "name": "unnamedWire#169", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O62" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#0", + "pinName": "D" + }, + "name": "unnamedWire#170", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#0", + "pinName": "Q" + }, + "name": "unnamedWire#171", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#1", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#19", + "pinName": "I" + }, + "name": "unnamedWire#172", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#13", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#2", + "pinName": "Q" + }, + "name": "unnamedWire#173", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#3", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#12", + "pinName": "I" + }, + "name": "unnamedWire#174", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#15", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#4", + "pinName": "Q" + }, + "name": "unnamedWire#175", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#5", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#17", + "pinName": "I" + }, + "name": "unnamedWire#176", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#18", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#6", + "pinName": "Q" + }, + "name": "unnamedWire#177", + "path": [] + }, + { + "pin1": { + "compName": "dlatch8#7", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "I" + }, + "name": "unnamedWire#178", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "I" + }, + "pin2": { + "compName": "dlatch8#8", + "pinName": "Q" + }, + "name": "unnamedWire#179", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O61" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O5" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#180", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Q" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "I" + }, + "name": "unnamedWire#181", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "E" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#182", + "path": [ + { + "x": 45.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#9", + "pinName": "E" + }, + "name": "unnamedWire#183", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#8", + "pinName": "E" + }, + "name": "unnamedWire#184", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#185", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#186", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#7", + "pinName": "E" + }, + "name": "unnamedWire#187", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#188", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#6", + "pinName": "E" + }, + "name": "unnamedWire#189", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O60" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#190", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#5", + "pinName": "E" + }, + "name": "unnamedWire#191", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#192", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#4", + "pinName": "E" + }, + "name": "unnamedWire#193", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#194", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#3", + "pinName": "E" + }, + "name": "unnamedWire#195", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#196", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#2", + "pinName": "E" + }, + "name": "unnamedWire#197", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#198", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#1", + "pinName": "E" + }, + "name": "unnamedWire#199", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O77" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O59" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O3" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dlatch8#0", + "pinName": "E" + }, + "name": "unnamedWire#200", + "path": [ + { + "x": 45.0, + "y": 775.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O58" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O57" + }, + "pin2": { + "compName": "Splitter#4", + "pinName": "O1" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#4", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O56" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O55" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O7" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O54" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O53" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O5" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O52" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O51" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O3" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O50" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O76" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O49" + }, + "pin2": { + "compName": "Splitter#5", + "pinName": "O1" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#5", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O48" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O47" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O7" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O46" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O45" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O5" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O44" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O43" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O3" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O42" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O41" + }, + "pin2": { + "compName": "Splitter#6", + "pinName": "O1" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#6", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O40" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O75" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O39" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O7" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O38" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O37" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O5" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O36" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O35" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O3" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O34" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O33" + }, + "pin2": { + "compName": "Splitter#7", + "pinName": "O1" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#7", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O32" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O31" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O7" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O30" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O74" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O29" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O5" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O28" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O27" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O3" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O26" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O25" + }, + "pin2": { + "compName": "Splitter#8", + "pinName": "O1" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#8", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O24" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O23" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O7" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O22" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O21" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O5" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O20" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O73" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O19" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O3" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O18" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O17" + }, + "pin2": { + "compName": "Splitter#9", + "pinName": "O1" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#9", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O16" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O7" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O5" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O3" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "name": "unnamedWire#69", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O72" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "pin2": { + "compName": "Splitter#10", + "pinName": "O1" + }, + "name": "unnamedWire#70", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#10", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "name": "unnamedWire#71", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O7" + }, + "name": "unnamedWire#72", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "name": "unnamedWire#73", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O5" + }, + "name": "unnamedWire#74", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "name": "unnamedWire#75", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O3" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Splitter#11", + "pinName": "O1" + }, + "name": "unnamedWire#78", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#11", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "name": "unnamedWire#79", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O71" + }, + "pin2": { + "compName": "Splitter#3", + "pinName": "O7" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O79" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O7" + }, + "name": "unnamedWire#80", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O78" + }, + "name": "unnamedWire#81", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O77" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O5" + }, + "name": "unnamedWire#82", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O76" + }, + "name": "unnamedWire#83", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O75" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O3" + }, + "name": "unnamedWire#84", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O74" + }, + "name": "unnamedWire#85", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O73" + }, + "pin2": { + "compName": "Splitter#20", + "pinName": "O1" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#20", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O72" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O71" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O7" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O70" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#3", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O70" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O69" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O5" + }, + "name": "unnamedWire#90", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O68" + }, + "name": "unnamedWire#91", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O67" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O3" + }, + "name": "unnamedWire#92", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O2" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O66" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O65" + }, + "pin2": { + "compName": "Splitter#14", + "pinName": "O1" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#14", + "pinName": "O0" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O64" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O63" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O7" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O6" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O62" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#21", + "pinName": "O61" + }, + "pin2": { + "compName": "Splitter#16", + "pinName": "O5" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#16", + "pinName": "O4" + }, + "pin2": { + "compName": "Splitter#21", + "pinName": "O60" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "D latch\n80 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 30.0, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": {}, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "q80-73", + "q72-65", + "q64-57", + "q56-49", + "q48-41", + "q40-33", + "q32-25", + "q24-17", + "q16-9", + "q8-1" + ], + "vectorPartLengthes": [ + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8 + ] + } + }, + "q1": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q1" + } + }, + "q10": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q2" + } + }, + "q11": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q3" + } + }, + "q12": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q4" + } + }, + "q13": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q5" + } + }, + "q14": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q6" + } + }, + "q15": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q7" + } + }, + "q16": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q8" + } + }, + "q16-9": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q" + } + }, + "q17": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q1" + } + }, + "q18": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q2" + } + }, + "q19": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q3" + } + }, + "q2": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q2" + } + }, + "q20": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q4" + } + }, + "q21": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q5" + } + }, + "q22": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q6" + } + }, + "q23": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q7" + } + }, + "q24": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q8" + } + }, + "q24-17": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#2", + "subStateID": "q" + } + }, + "q25": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q1" + } + }, + "q26": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q2" + } + }, + "q27": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q3" + } + }, + "q28": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q4" + } + }, + "q29": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q5" + } + }, + "q3": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q3" + } + }, + "q30": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q6" + } + }, + "q31": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q7" + } + }, + "q32": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q8" + } + }, + "q32-25": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#3", + "subStateID": "q" + } + }, + "q33": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q1" + } + }, + "q34": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q2" + } + }, + "q35": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q3" + } + }, + "q36": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q4" + } + }, + "q37": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q5" + } + }, + "q38": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q6" + } + }, + "q39": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q7" + } + }, + "q4": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q4" + } + }, + "q40": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q8" + } + }, + "q40-33": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#4", + "subStateID": "q" + } + }, + "q41": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q1" + } + }, + "q42": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q2" + } + }, + "q43": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q3" + } + }, + "q44": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q4" + } + }, + "q45": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q5" + } + }, + "q46": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q6" + } + }, + "q47": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q7" + } + }, + "q48": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q8" + } + }, + "q48-41": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#5", + "subStateID": "q" + } + }, + "q49": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q1" + } + }, + "q5": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q5" + } + }, + "q50": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q2" + } + }, + "q51": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q3" + } + }, + "q52": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q4" + } + }, + "q53": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q5" + } + }, + "q54": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q6" + } + }, + "q55": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q7" + } + }, + "q56": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q8" + } + }, + "q56-49": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#6", + "subStateID": "q" + } + }, + "q57": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q1" + } + }, + "q58": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q2" + } + }, + "q59": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q3" + } + }, + "q6": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q6" + } + }, + "q60": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q4" + } + }, + "q61": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q5" + } + }, + "q62": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q6" + } + }, + "q63": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q7" + } + }, + "q64": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q8" + } + }, + "q64-57": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#7", + "subStateID": "q" + } + }, + "q65": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q1" + } + }, + "q66": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q2" + } + }, + "q67": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q3" + } + }, + "q68": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q4" + } + }, + "q69": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q5" + } + }, + "q7": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q7" + } + }, + "q70": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q6" + } + }, + "q71": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q7" + } + }, + "q72": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q8" + } + }, + "q72-65": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#8", + "subStateID": "q" + } + }, + "q73": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q1" + } + }, + "q74": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q2" + } + }, + "q75": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q3" + } + }, + "q76": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q4" + } + }, + "q77": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q5" + } + }, + "q78": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q6" + } + }, + "q79": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q7" + } + }, + "q8": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q8" + } + }, + "q8-1": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#0", + "subStateID": "q" + } + }, + "q80": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q8" + } + }, + "q80-73": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#9", + "subStateID": "q" + } + }, + "q9": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch8#1", + "subStateID": "q1" + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json new file mode 100644 index 00000000..4ba4b195 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/fulladder.json @@ -0,0 +1,204 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Z", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 57.5, + "y": 40.0 + }, + "params": 1 + }, + { + "id": "halfadder", + "name": "halfadder#0", + "pos": { + "x": 5.0, + "y": 40.0 + } + }, + { + "id": "halfadder", + "name": "halfadder#1", + "pos": { + "x": 45.0, + "y": 7.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "halfadder#1", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "halfadder#0", + "pinName": "A" + }, + "name": "unnamedWire#1" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "halfadder#0", + "pinName": "B" + }, + "name": "unnamedWire#2" + }, + { + "pin1": { + "compName": "halfadder#0", + "pinName": "Y" + }, + "pin2": { + "compName": "halfadder#1", + "pinName": "B" + }, + "name": "unnamedWire#3" + }, + { + "pin1": { + "compName": "halfadder#0", + "pinName": "_Z" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "halfadder#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "halfadder#1", + "pinName": "_Z" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 82.5, + "y": 22.5 + }, + { + "x": 82.5, + "y": 35.0 + }, + { + "x": 52.5, + "y": 35.0 + }, + { + "x": 52.5, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Z" + }, + "name": "unnamedWire#7" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "fulladder", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json new file mode 100644 index 00000000..d56f83e0 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/halfadder.json @@ -0,0 +1,337 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "_Z", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 40.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 40.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 65.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 34.0, + "y": 24.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 5.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 62.5, + "y": 12.5 + }, + { + "x": 62.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 62.5, + "y": 37.5 + }, + { + "x": 62.5, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 5.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 5.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_Z" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 80.0, + "y": 25.0 + }, + { + "x": 80.0, + "y": 37.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 35.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 35.0, + "y": 32.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "halfadder", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json new file mode 100644 index 00000000..3997209b --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1.json @@ -0,0 +1,248 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 7.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 35.0, + "y": 22.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 35.0, + "y": 47.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 60.0, + "y": 30.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 21.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#10" + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#4" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 5.0, + "y": 52.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#8" + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "mux1", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json new file mode 100644 index 00000000..9f1da98e --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_12.json @@ -0,0 +1,1845 @@ +{ + "width": 50.0, + "height": 80.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "I0", + "logicWidth": 12, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "I1", + "logicWidth": 12, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 50.0, + "y": 30.0 + }, + "name": "Y", + "logicWidth": 12, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 55.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 45.0 + }, + "params": { + "logicWidth": 12, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 245.0 + }, + "params": { + "logicWidth": 12, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 235.0, + "y": 95.0 + }, + "params": { + "logicWidth": 12, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 139.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 144.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 89.0, + "y": 4.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 84.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 49.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 49.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 84.0, + "y": 269.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 89.0, + "y": 279.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 84.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 89.0, + "y": 219.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 89.0, + "y": 159.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 84.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 144.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 84.0, + "y": 89.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 89.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 84.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 89.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 139.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 139.0, + "y": 169.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 144.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 144.0, + "y": 239.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 139.0, + "y": 229.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 144.0, + "y": 299.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 139.0, + "y": 289.0 + }, + "params": 1 + }, + { + "id": "sel1", + "name": "sel1#0", + "pos": { + "x": 150.0, + "y": 45.0 + } + }, + { + "id": "sel1", + "name": "sel1#1", + "pos": { + "x": 95.0, + "y": 85.0 + } + }, + { + "id": "sel1", + "name": "sel1#10", + "pos": { + "x": 95.0, + "y": 265.0 + } + }, + { + "id": "sel1", + "name": "sel1#11", + "pos": { + "x": 150.0, + "y": 345.0 + } + }, + { + "id": "sel1", + "name": "sel1#2", + "pos": { + "x": 150.0, + "y": 105.0 + } + }, + { + "id": "sel1", + "name": "sel1#3", + "pos": { + "x": 95.0, + "y": 25.0 + } + }, + { + "id": "sel1", + "name": "sel1#4", + "pos": { + "x": 95.0, + "y": 325.0 + } + }, + { + "id": "sel1", + "name": "sel1#5", + "pos": { + "x": 150.0, + "y": 165.0 + } + }, + { + "id": "sel1", + "name": "sel1#6", + "pos": { + "x": 95.0, + "y": 145.0 + } + }, + { + "id": "sel1", + "name": "sel1#7", + "pos": { + "x": 95.0, + "y": 205.0 + } + }, + { + "id": "sel1", + "name": "sel1#8", + "pos": { + "x": 150.0, + "y": 285.0 + } + }, + { + "id": "sel1", + "name": "sel1#9", + "pos": { + "x": 150.0, + "y": 225.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S1" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "sel1#3", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O11" + }, + "name": "unnamedWire#103", + "path": [ + { + "x": 210.0, + "y": 30.0 + }, + { + "x": 210.0, + "y": 95.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O10" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 205.0, + "y": 50.0 + }, + { + "x": 205.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "Y" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 200.0, + "y": 115.0 + }, + { + "x": 200.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#2", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O8" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 195.0, + "y": 110.0 + }, + { + "x": 195.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "Y" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 195.0, + "y": 135.0 + }, + { + "x": 195.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 200.0, + "y": 170.0 + }, + { + "x": 200.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "Y" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 205.0, + "y": 155.0 + }, + { + "x": 205.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 210.0, + "y": 230.0 + }, + { + "x": 210.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "Y" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 215.0, + "y": 175.0 + }, + { + "x": 215.0, + "y": 270.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#8", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 220.0, + "y": 290.0 + }, + { + "x": 220.0, + "y": 185.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "Y" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 225.0, + "y": 195.0 + }, + { + "x": 225.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#11", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 230.0, + "y": 350.0 + }, + { + "x": 230.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 50.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#10", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "S2" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S1" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 140.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#8", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "S1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 140.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "S1" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "S1" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "sel1#2", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "sel1#2", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "S1" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 145.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "S1" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S2" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 145.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S1" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 85.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S2" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 90.0, + "y": 340.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "S2" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "S1" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "I1" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 75.0, + "y": 45.0 + }, + { + "x": 75.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I1" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 70.0, + "y": 55.0 + }, + { + "x": 70.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I1" + }, + "name": "unnamedWire#66", + "path": [ + { + "x": 65.0, + "y": 65.0 + }, + { + "x": 65.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "I1" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 60.0, + "y": 75.0 + }, + { + "x": 60.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I1" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 55.0, + "y": 85.0 + }, + { + "x": 55.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I1" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 50.0, + "y": 95.0 + }, + { + "x": 50.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#1", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I1" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 45.0, + "y": 105.0 + }, + { + "x": 45.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I1" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 40.0, + "y": 115.0 + }, + { + "x": 40.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I1" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 35.0, + "y": 125.0 + }, + { + "x": 35.0, + "y": 290.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 30.0, + "y": 135.0 + }, + { + "x": 30.0, + "y": 310.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I1" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 25.0, + "y": 145.0 + }, + { + "x": 25.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I1" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 20.0, + "y": 155.0 + }, + { + "x": 20.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "S1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O11" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "I2" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 75.0, + "y": 245.0 + }, + { + "x": 75.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O10" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I2" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 70.0, + "y": 255.0 + }, + { + "x": 70.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I2" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 65.0, + "y": 265.0 + }, + { + "x": 65.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O8" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "I2" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 60.0, + "y": 275.0 + }, + { + "x": 60.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I2" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 55.0, + "y": 285.0 + }, + { + "x": 55.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I2" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 50.0, + "y": 295.0 + }, + { + "x": 50.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I2" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 45.0, + "y": 305.0 + }, + { + "x": 45.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I2" + }, + "name": "unnamedWire#89", + "path": [ + { + "x": 40.0, + "y": 315.0 + }, + { + "x": 40.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I2" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 35.0, + "y": 325.0 + }, + { + "x": 35.0, + "y": 300.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I2" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 30.0, + "y": 335.0 + }, + { + "x": 30.0, + "y": 320.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I2" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 45.0, + "y": 345.0 + }, + { + "x": 45.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I2" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 40.0, + "y": 355.0 + }, + { + "x": 40.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "MUX\n12 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 23.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json new file mode 100644 index 00000000..e29bbbf0 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_16.json @@ -0,0 +1,2384 @@ +{ + "width": 55.0, + "height": 110.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I0", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 90.0 + }, + "name": "I1", + "logicWidth": 16, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 55.0, + "y": 50.0 + }, + "name": "Y", + "logicWidth": 16, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 70.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 50.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 375.0 + }, + "params": { + "logicWidth": 16, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 260.0, + "y": 175.0 + }, + "params": { + "logicWidth": 16, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 164.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 169.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 169.0, + "y": 359.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 164.0, + "y": 349.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 169.0, + "y": 419.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 164.0, + "y": 409.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 109.0, + "y": 4.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 104.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 64.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 64.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 104.0, + "y": 389.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 109.0, + "y": 399.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 164.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 104.0, + "y": 329.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 109.0, + "y": 339.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 109.0, + "y": 279.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 104.0, + "y": 269.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 104.0, + "y": 209.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 109.0, + "y": 219.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 104.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 109.0, + "y": 159.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 109.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 104.0, + "y": 89.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 169.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 104.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 109.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 164.0, + "y": 169.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 169.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 169.0, + "y": 239.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 164.0, + "y": 229.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 164.0, + "y": 289.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 169.0, + "y": 299.0 + }, + "params": 1 + }, + { + "id": "sel1", + "name": "sel1#0", + "pos": { + "x": 115.0, + "y": 25.0 + } + }, + { + "id": "sel1", + "name": "sel1#1", + "pos": { + "x": 175.0, + "y": 45.0 + } + }, + { + "id": "sel1", + "name": "sel1#10", + "pos": { + "x": 115.0, + "y": 265.0 + } + }, + { + "id": "sel1", + "name": "sel1#11", + "pos": { + "x": 115.0, + "y": 325.0 + } + }, + { + "id": "sel1", + "name": "sel1#12", + "pos": { + "x": 175.0, + "y": 405.0 + } + }, + { + "id": "sel1", + "name": "sel1#13", + "pos": { + "x": 175.0, + "y": 345.0 + } + }, + { + "id": "sel1", + "name": "sel1#14", + "pos": { + "x": 115.0, + "y": 385.0 + } + }, + { + "id": "sel1", + "name": "sel1#15", + "pos": { + "x": 175.0, + "y": 465.0 + } + }, + { + "id": "sel1", + "name": "sel1#2", + "pos": { + "x": 115.0, + "y": 85.0 + } + }, + { + "id": "sel1", + "name": "sel1#3", + "pos": { + "x": 175.0, + "y": 105.0 + } + }, + { + "id": "sel1", + "name": "sel1#4", + "pos": { + "x": 175.0, + "y": 165.0 + } + }, + { + "id": "sel1", + "name": "sel1#5", + "pos": { + "x": 115.0, + "y": 205.0 + } + }, + { + "id": "sel1", + "name": "sel1#6", + "pos": { + "x": 175.0, + "y": 225.0 + } + }, + { + "id": "sel1", + "name": "sel1#7", + "pos": { + "x": 115.0, + "y": 145.0 + } + }, + { + "id": "sel1", + "name": "sel1#8", + "pos": { + "x": 115.0, + "y": 445.0 + } + }, + { + "id": "sel1", + "name": "sel1#9", + "pos": { + "x": 175.0, + "y": 285.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "S1" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "S2" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S1" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O14" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "Y" + }, + "name": "unnamedWire#100", + "path": [ + { + "x": 250.0, + "y": 185.0 + }, + { + "x": 250.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#2", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O13" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 245.0, + "y": 90.0 + }, + { + "x": 245.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O12" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "Y" + }, + "name": "unnamedWire#102", + "path": [ + { + "x": 240.0, + "y": 205.0 + }, + { + "x": 240.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#7", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O11" + }, + "name": "unnamedWire#103", + "path": [ + { + "x": 235.0, + "y": 150.0 + }, + { + "x": 235.0, + "y": 215.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#4", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O10" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 230.0, + "y": 170.0 + }, + { + "x": 230.0, + "y": 225.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "Y" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 225.0, + "y": 235.0 + }, + { + "x": 225.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O8" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 220.0, + "y": 230.0 + }, + { + "x": 220.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "Y" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 220.0, + "y": 255.0 + }, + { + "x": 220.0, + "y": 270.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 225.0, + "y": 290.0 + }, + { + "x": 225.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "Y" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 230.0, + "y": 275.0 + }, + { + "x": 230.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel1#13", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 235.0, + "y": 350.0 + }, + { + "x": 235.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#14", + "pinName": "Y" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 240.0, + "y": 295.0 + }, + { + "x": 240.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#12", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 245.0, + "y": 410.0 + }, + { + "x": 245.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "Y" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 250.0, + "y": 315.0 + }, + { + "x": 250.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#15", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 255.0, + "y": 470.0 + }, + { + "x": 255.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 65.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#14", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "sel1#14", + "pinName": "S2" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "sel1#15", + "pinName": "S1" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 165.0, + "y": 470.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "sel1#12", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "sel1#12", + "pinName": "S1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "S1" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "sel1#13", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "sel1#13", + "pinName": "S1" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "S1" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "sel1#4", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S1" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "sel1#3", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "S1" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "S2" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "sel1#1", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "S1" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S1" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "sel1#15", + "pinName": "S2" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 170.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "S1" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 105.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "S2" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 110.0, + "y": 460.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S2" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#58", + "path": [ + { + "x": 165.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#59", + "path": [ + { + "x": 170.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "S1" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O15" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I1" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O14" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I1" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 90.0, + "y": 60.0 + }, + { + "x": 90.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O13" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "I1" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 85.0, + "y": 70.0 + }, + { + "x": 85.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O12" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "I1" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 80.0, + "y": 80.0 + }, + { + "x": 80.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O11" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I1" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 75.0, + "y": 90.0 + }, + { + "x": 75.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O10" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I1" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 70.0, + "y": 100.0 + }, + { + "x": 70.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I1" + }, + "name": "unnamedWire#66", + "path": [ + { + "x": 65.0, + "y": 110.0 + }, + { + "x": 65.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O8" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I1" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 60.0, + "y": 120.0 + }, + { + "x": 60.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I1" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 55.0, + "y": 130.0 + }, + { + "x": 55.0, + "y": 290.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I1" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 50.0, + "y": 140.0 + }, + { + "x": 50.0, + "y": 310.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I1" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 45.0, + "y": 150.0 + }, + { + "x": 45.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#13", + "pinName": "I1" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 40.0, + "y": 160.0 + }, + { + "x": 40.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#14", + "pinName": "I1" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 35.0, + "y": 170.0 + }, + { + "x": 35.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#12", + "pinName": "I1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 30.0, + "y": 180.0 + }, + { + "x": 30.0, + "y": 430.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I1" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 25.0, + "y": 190.0 + }, + { + "x": 25.0, + "y": 470.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#15", + "pinName": "I1" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 20.0, + "y": 200.0 + }, + { + "x": 20.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O15" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I2" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 95.0, + "y": 375.0 + }, + { + "x": 95.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O14" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I2" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 90.0, + "y": 385.0 + }, + { + "x": 90.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "S1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O13" + }, + "pin2": { + "compName": "sel1#2", + "pinName": "I2" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 85.0, + "y": 395.0 + }, + { + "x": 85.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O12" + }, + "pin2": { + "compName": "sel1#3", + "pinName": "I2" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 80.0, + "y": 405.0 + }, + { + "x": 80.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O11" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I2" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 75.0, + "y": 415.0 + }, + { + "x": 75.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O10" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I2" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 70.0, + "y": 425.0 + }, + { + "x": 70.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O9" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I2" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 65.0, + "y": 435.0 + }, + { + "x": 65.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O8" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I2" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 60.0, + "y": 445.0 + }, + { + "x": 60.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I2" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 55.0, + "y": 455.0 + }, + { + "x": 55.0, + "y": 300.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I2" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 50.0, + "y": 465.0 + }, + { + "x": 50.0, + "y": 320.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I2" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 45.0, + "y": 475.0 + }, + { + "x": 45.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#13", + "pinName": "I2" + }, + "name": "unnamedWire#89", + "path": [ + { + "x": 40.0, + "y": 485.0 + }, + { + "x": 40.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#10", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#14", + "pinName": "I2" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 35.0, + "y": 495.0 + }, + { + "x": 35.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#12", + "pinName": "I2" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 30.0, + "y": 505.0 + }, + { + "x": 30.0, + "y": 440.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I2" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 25.0, + "y": 515.0 + }, + { + "x": 25.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#15", + "pinName": "I2" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 20.0, + "y": 525.0 + }, + { + "x": 20.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O15" + }, + "name": "unnamedWire#99", + "path": [ + { + "x": 255.0, + "y": 30.0 + }, + { + "x": 255.0, + "y": 175.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "MUX\n16 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 23.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json new file mode 100644 index 00000000..b5b16b89 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_4.json @@ -0,0 +1,503 @@ +{ + "width": 35.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I0_1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I0_2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "I0_3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "I0_4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "I1_1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "I1_2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "I1_3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "I1_4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 24.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 46.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 24.0, + "y": 81.5 + }, + "params": 1 + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 30.0, + "y": 7.5 + } + }, + { + "id": "mux1", + "name": "mux1#1", + "pos": { + "x": 30.0, + "y": 42.5 + } + }, + { + "id": "mux1", + "name": "mux1#2", + "pos": { + "x": 30.0, + "y": 77.5 + } + }, + { + "id": "mux1", + "name": "mux1#3", + "pos": { + "x": 30.0, + "y": 112.5 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "S0" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0_3" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "I0" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 5.0, + "y": 87.5 + }, + { + "x": 5.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1_3" + }, + "pin2": { + "compName": "mux1#2", + "pinName": "I1" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 20.0, + "y": 187.5 + }, + { + "x": 20.0, + "y": 102.5 + } + ] + }, + { + "pin1": { + "compName": "mux1#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#14" + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "mux1#3", + "pinName": "S0" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 25.0, + "y": 117.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0_4" + }, + "pin2": { + "compName": "mux1#3", + "pinName": "I0" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 5.0, + "y": 112.5 + }, + { + "x": 5.0, + "y": 127.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1_4" + }, + "pin2": { + "compName": "mux1#3", + "pinName": "I1" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 25.0, + "y": 212.5 + }, + { + "x": 25.0, + "y": 137.5 + } + ] + }, + { + "pin1": { + "compName": "mux1#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#18" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0_1" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 37.5 + }, + { + "x": 5.0, + "y": 22.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1_1" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 137.5 + }, + { + "x": 10.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "mux1#1", + "pinName": "S0" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0_2" + }, + "pin2": { + "compName": "mux1#1", + "pinName": "I0" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 5.0, + "y": 62.5 + }, + { + "x": 5.0, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1_2" + }, + "pin2": { + "compName": "mux1#1", + "pinName": "I1" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 15.0, + "y": 162.5 + }, + { + "x": 15.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "mux1#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "mux1_4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json new file mode 100644 index 00000000..4a34c7c8 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux1_8.json @@ -0,0 +1,1297 @@ +{ + "width": 40.0, + "height": 55.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "I0", + "logicWidth": 8, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "I1", + "logicWidth": 8, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 40.0, + "y": 25.0 + }, + "name": "Y", + "logicWidth": 8, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 15.0, + "y": 10.0 + }, + "params": 1 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": 5.0, + "y": 40.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": 5.0, + "y": 165.0 + }, + "params": { + "logicWidth": 8, + "orientation": "RIGHT" + } + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": 185.0, + "y": 90.0 + }, + "params": { + "logicWidth": 8, + "orientation": "LEFT" + } + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 69.0, + "y": 4.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 64.0, + "y": 19.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 9.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 9.0, + "y": 14.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 64.0, + "y": 149.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 69.0, + "y": 159.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 64.0, + "y": 89.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 69.0, + "y": 99.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 69.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 64.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 114.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 119.0, + "y": 59.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 119.0, + "y": 119.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 114.0, + "y": 109.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 119.0, + "y": 179.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 114.0, + "y": 169.0 + }, + "params": 1 + }, + { + "id": "sel1", + "name": "sel1#10", + "pos": { + "x": 75.0, + "y": 145.0 + } + }, + { + "id": "sel1", + "name": "sel1#11", + "pos": { + "x": 125.0, + "y": 225.0 + } + }, + { + "id": "sel1", + "name": "sel1#4", + "pos": { + "x": 75.0, + "y": 205.0 + } + }, + { + "id": "sel1", + "name": "sel1#5", + "pos": { + "x": 125.0, + "y": 45.0 + } + }, + { + "id": "sel1", + "name": "sel1#6", + "pos": { + "x": 75.0, + "y": 25.0 + } + }, + { + "id": "sel1", + "name": "sel1#7", + "pos": { + "x": 75.0, + "y": 85.0 + } + }, + { + "id": "sel1", + "name": "sel1#8", + "pos": { + "x": 125.0, + "y": 165.0 + } + }, + { + "id": "sel1", + "name": "sel1#9", + "pos": { + "x": 125.0, + "y": 105.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S1" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "Y" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 180.0, + "y": 90.0 + }, + { + "x": 180.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O6" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 175.0, + "y": 50.0 + }, + { + "x": 175.0, + "y": 100.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "Y" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 170.0, + "y": 110.0 + }, + { + "x": 170.0, + "y": 90.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "S2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O4" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 165.0, + "y": 110.0 + }, + { + "x": 165.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "Y" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 165.0, + "y": 130.0 + }, + { + "x": 165.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#8", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O2" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 170.0, + "y": 170.0 + }, + { + "x": 170.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "Y" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 175.0, + "y": 150.0 + }, + { + "x": 175.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#11", + "pinName": "Y" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 180.0, + "y": 230.0 + }, + { + "x": 180.0, + "y": 160.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "I" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#115", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 10.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#10", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "S2" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S1" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 115.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#8", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "S1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "sel1#9", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "S1" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "sel1#5", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "S1" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 120.0, + "y": 5.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 115.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "S2" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 120.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S1" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 65.0, + "y": 210.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "S2" + }, + "name": "unnamedWire#49", + "path": [ + { + "x": 70.0, + "y": 220.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I1" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 55.0, + "y": 40.0 + }, + { + "x": 55.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I1" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 50.0, + "y": 50.0 + }, + { + "x": 50.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I1" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 45.0, + "y": 60.0 + }, + { + "x": 45.0, + "y": 110.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I1" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 40.0, + "y": 70.0 + }, + { + "x": 40.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I1" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 35.0, + "y": 80.0 + }, + { + "x": 35.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 30.0, + "y": 90.0 + }, + { + "x": 30.0, + "y": 190.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I1" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 25.0, + "y": 100.0 + }, + { + "x": 25.0, + "y": 230.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I1" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 20.0, + "y": 110.0 + }, + { + "x": 20.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#76", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#77", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "S1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O7" + }, + "pin2": { + "compName": "sel1#6", + "pinName": "I2" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 55.0, + "y": 165.0 + }, + { + "x": 55.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O6" + }, + "pin2": { + "compName": "sel1#5", + "pinName": "I2" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 50.0, + "y": 175.0 + }, + { + "x": 50.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O5" + }, + "pin2": { + "compName": "sel1#7", + "pinName": "I2" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 45.0, + "y": 185.0 + }, + { + "x": 45.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O4" + }, + "pin2": { + "compName": "sel1#9", + "pinName": "I2" + }, + "name": "unnamedWire#89", + "path": [ + { + "x": 40.0, + "y": 195.0 + }, + { + "x": 40.0, + "y": 140.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#6", + "pinName": "S2" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "pin2": { + "compName": "sel1#10", + "pinName": "I2" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 35.0, + "y": 205.0 + }, + { + "x": 35.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "sel1#8", + "pinName": "I2" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 30.0, + "y": 215.0 + }, + { + "x": 30.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "pin2": { + "compName": "sel1#4", + "pinName": "I2" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 45.0, + "y": 225.0 + }, + { + "x": 45.0, + "y": 240.0 + } + ] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "sel1#11", + "pinName": "I2" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 40.0, + "y": 235.0 + }, + { + "x": 40.0, + "y": 260.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#98", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "MUX\n8 bit", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 23.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json new file mode 100644 index 00000000..91d1220e --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux2.json @@ -0,0 +1,434 @@ +{ + "width": 70.0, + "height": 70.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 30.0 + }, + "name": "I00", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "I01", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "I10", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "I11", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 70.0, + "y": 10.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 30.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 24.0, + "y": 29.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 54.0, + "y": 39.0 + }, + "params": 1 + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 115.0, + "y": 20.0 + } + }, + { + "id": "sel1", + "name": "sel1#0", + "pos": { + "x": 60.0, + "y": 35.0 + } + }, + { + "id": "sel1", + "name": "sel1#1", + "pos": { + "x": 60.0, + "y": 100.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "S2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 55.0, + "y": 25.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "S2" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 25.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "S1" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 55.0, + "y": 105.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 25.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I00" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I1" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 35.0, + "y": 75.0 + }, + { + "x": 35.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I01" + }, + "pin2": { + "compName": "sel1#0", + "pinName": "I2" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 40.0, + "y": 100.0 + }, + { + "x": 40.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I10" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I1" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I11" + }, + "pin2": { + "compName": "sel1#1", + "pinName": "I2" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 20.0, + "y": 150.0 + }, + { + "x": 20.0, + "y": 135.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "sel1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 105.0, + "y": 40.0 + }, + { + "x": 105.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "sel1#1", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 105.0, + "y": 105.0 + }, + { + "x": 105.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "S0" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 15.0, + "y": 25.0 + }, + { + "x": 15.0, + "y": 10.0 + }, + { + "x": 85.0, + "y": 10.0 + }, + { + "x": 85.0, + "y": 25.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "mux2", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json new file mode 100644 index 00000000..ac5aa8ae --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/mux3.json @@ -0,0 +1,483 @@ +{ + "width": 80.0, + "height": 120.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 40.0 + }, + "name": "I000", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 50.0 + }, + "name": "I001", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 60.0 + }, + "name": "I010", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 70.0 + }, + "name": "I011", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 80.0 + }, + "name": "I100", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 90.0 + }, + "name": "I101", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 100.0 + }, + "name": "I110", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 110.0 + }, + "name": "I111", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 30.0 + }, + "name": "S0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 20.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 10.0 + }, + "name": "S2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 80.0, + "y": 10.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 19.0, + "y": 104.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 24.0, + "y": 94.0 + }, + "params": 1 + }, + { + "id": "mux1", + "name": "mux1#0", + "pos": { + "x": 125.0, + "y": 20.0 + } + }, + { + "id": "mux2", + "name": "mux2#0", + "pos": { + "x": 35.0, + "y": 185.0 + } + }, + { + "id": "mux2", + "name": "mux2#1", + "pos": { + "x": 35.0, + "y": 85.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 20.0, + "y": 75.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 25.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "I11" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I011" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 15.0, + "y": 145.0 + }, + { + "x": 15.0, + "y": 175.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "I00" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I100" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 10.0, + "y": 215.0 + }, + { + "x": 10.0, + "y": 200.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I101" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I01" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "I10" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I110" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 10.0, + "y": 235.0 + }, + { + "x": 10.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I111" + }, + "pin2": { + "compName": "mux2#0", + "pinName": "I11" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 15.0, + "y": 275.0 + }, + { + "x": 15.0, + "y": 245.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I1" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 115.0, + "y": 195.0 + }, + { + "x": 115.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "Y" + }, + "pin2": { + "compName": "mux1#0", + "pinName": "I0" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 110.0, + "y": 95.0 + }, + { + "x": 110.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "S0" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "S2" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "S1" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "S1" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 25.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#0", + "pinName": "S0" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 20.0, + "y": 205.0 + } + ] + }, + { + "pin1": { + "compName": "mux1#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I000" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I00" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 10.0, + "y": 100.0 + }, + { + "x": 10.0, + "y": 115.0 + } + ] + }, + { + "pin1": { + "compName": "mux2#1", + "pinName": "I01" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "I001" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I010" + }, + "pin2": { + "compName": "mux2#1", + "pinName": "I10" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 10.0, + "y": 150.0 + }, + { + "x": 10.0, + "y": 135.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "mux3", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json new file mode 100644 index 00000000..ced22619 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/nand3.json @@ -0,0 +1,219 @@ +{ + "width": 35.0, + "height": 30.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 10.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 35.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 62.5, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 31.5, + "y": 24.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#1" + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 32.5, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 32.5, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 57.5, + "y": 25.0 + }, + { + "x": 57.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 60.0, + "y": 62.5 + }, + { + "x": 60.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#7", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "nand3", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json new file mode 100644 index 00000000..4b4e51f1 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/not4.json @@ -0,0 +1,401 @@ +{ + "width": 35.0, + "height": 40.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 30.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 30.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 30.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 30.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 14.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 14.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 14.0, + "y": 61.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 14.0, + "y": 86.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 15.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 15.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 15.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 15.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 15.0, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 15.0, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 15.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 15.0, + "y": 42.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "not4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json new file mode 100644 index 00000000..33e50e58 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or4.json @@ -0,0 +1,558 @@ +{ + "width": 35.0, + "height": 40.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 20.0, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 20.0, + "y": 65.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 20.0, + "y": 115.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 20.0, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 50.0, + "y": 40.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 50.0, + "y": 140.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 110.0, + "y": 40.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 110.0, + "y": 140.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 140.0, + "y": 90.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 14.0, + "y": 24.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 14.0, + "y": 74.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 14.0, + "y": 124.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 14.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 104.0, + "y": 49.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 104.0, + "y": 149.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 15.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 15.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#12" + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#13" + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#14" + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#15" + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 105.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 105.0, + "y": 55.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 105.0, + "y": 145.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 105.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#22" + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#23" + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#24" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 15.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 15.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 15.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 15.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 15.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 15.0, + "y": 80.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "or4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json new file mode 100644 index 00000000..46801b2f --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/or_4.json @@ -0,0 +1,897 @@ +{ + "width": 35.0, + "height": 80.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 15.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 15.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 65.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 65.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 15.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 15.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 15.0, + "y": 102.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 15.0, + "y": 127.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 15.0, + "y": 152.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 15.0, + "y": 177.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 65.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 65.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 6.5, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 6.5, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 6.5, + "y": 61.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 6.5, + "y": 86.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 6.5, + "y": 111.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 6.5, + "y": 136.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 6.5, + "y": 161.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 6.5, + "y": 186.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#10", + "path": [ + { + "x": 7.5, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#11", + "path": [ + { + "x": 7.5, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 7.5, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 7.5, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 7.5, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 7.5, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 7.5, + "y": 107.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [ + { + "x": 7.5, + "y": 117.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 7.5, + "y": 132.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [ + { + "x": 7.5, + "y": 142.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 7.5, + "y": 157.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 7.5, + "y": 167.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 7.5, + "y": 182.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 7.5, + "y": 192.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 40.0, + "y": 12.5 + }, + { + "x": 40.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 45.0, + "y": 112.5 + }, + { + "x": 45.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 40.0, + "y": 37.5 + }, + { + "x": 40.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 50.0, + "y": 137.5 + }, + { + "x": 50.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 40.0, + "y": 62.5 + }, + { + "x": 40.0, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "B" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 55.0, + "y": 162.5 + }, + { + "x": 55.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 40.0, + "y": 87.5 + }, + { + "x": 40.0, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "B" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 60.0, + "y": 187.5 + }, + { + "x": 60.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B4" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 7.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 7.5, + "y": 17.5 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "or_4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json new file mode 100644 index 00000000..37322570 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram2.json @@ -0,0 +1,3029 @@ +{ + "width": 35.0, + "height": 90.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "B0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "QA1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "QA2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "QA3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "QA4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "QB1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "QB2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 65.0 + }, + "name": "QB3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 75.0 + }, + "name": "QB4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.1, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 109.0, + "y": 154.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 104.0, + "y": 164.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 44.0, + "y": 499.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 49.0, + "y": 509.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 34.0, + "y": 629.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 39.0, + "y": 639.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 44.0, + "y": 649.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 49.0, + "y": 659.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 129.0, + "y": 329.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 124.0, + "y": 339.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 119.0, + "y": 349.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 114.0, + "y": 359.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 99.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 129.0, + "y": 479.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 124.0, + "y": 489.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 119.0, + "y": 499.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 114.0, + "y": 509.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 129.0, + "y": 629.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 124.0, + "y": 639.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 119.0, + "y": 649.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 114.0, + "y": 659.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#28", + "pos": { + "x": 129.0, + "y": 779.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#29", + "pos": { + "x": 124.0, + "y": 789.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 94.0, + "y": 184.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#30", + "pos": { + "x": 119.0, + "y": 799.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#31", + "pos": { + "x": 114.0, + "y": 809.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 34.0, + "y": 549.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 39.0, + "y": 649.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 44.0, + "y": 749.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 49.0, + "y": 809.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 34.0, + "y": 479.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 39.0, + "y": 489.0 + }, + "params": 1 + }, + { + "id": "and41", + "name": "and41#0", + "pos": { + "x": 130.0, + "y": 150.0 + } + }, + { + "id": "and41", + "name": "and41#1", + "pos": { + "x": 235.0, + "y": 375.0 + } + }, + { + "id": "and41", + "name": "and41#2", + "pos": { + "x": 135.0, + "y": 325.0 + } + }, + { + "id": "andor414", + "name": "andor414#0", + "pos": { + "x": 235.0, + "y": 485.0 + } + }, + { + "id": "andor414", + "name": "andor414#1", + "pos": { + "x": 235.0, + "y": 635.0 + } + }, + { + "id": "andor414", + "name": "andor414#2", + "pos": { + "x": 235.0, + "y": 785.0 + } + }, + { + "id": "andor414", + "name": "andor414#3", + "pos": { + "x": 135.0, + "y": 435.0 + } + }, + { + "id": "andor414", + "name": "andor414#4", + "pos": { + "x": 135.0, + "y": 585.0 + } + }, + { + "id": "andor414", + "name": "andor414#5", + "pos": { + "x": 135.0, + "y": 735.0 + } + }, + { + "id": "demux2", + "name": "demux2#0", + "pos": { + "x": 55.0, + "y": 45.0 + } + }, + { + "id": "demux2", + "name": "demux2#1", + "pos": { + "x": 55.0, + "y": 150.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#0", + "pos": { + "x": 55.0, + "y": 325.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#1", + "pos": { + "x": 55.0, + "y": 475.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#2", + "pos": { + "x": 55.0, + "y": 625.0 + } + }, + { + "id": "dlatch4", + "name": "dlatch4#3", + "pos": { + "x": 55.0, + "y": 775.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A0" + }, + "pin2": { + "compName": "demux2#0", + "pinName": "S0" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "demux2#0", + "pinName": "S1" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 10.0, + "y": 150.0 + }, + { + "x": 10.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A3" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A4" + }, + "name": "unnamedWire#100", + "path": [] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C1" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 290.0, + "y": 380.0 + }, + { + "x": 290.0, + "y": 445.0 + }, + { + "x": 230.0, + "y": 445.0 + }, + { + "x": 230.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C2" + }, + "name": "unnamedWire#102", + "path": [ + { + "x": 285.0, + "y": 390.0 + }, + { + "x": 285.0, + "y": 440.0 + }, + { + "x": 225.0, + "y": 440.0 + }, + { + "x": 225.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C3" + }, + "name": "unnamedWire#103", + "path": [ + { + "x": 280.0, + "y": 400.0 + }, + { + "x": 280.0, + "y": 435.0 + }, + { + "x": 220.0, + "y": 435.0 + }, + { + "x": 220.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C4" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 275.0, + "y": 410.0 + }, + { + "x": 275.0, + "y": 430.0 + }, + { + "x": 215.0, + "y": 430.0 + }, + { + "x": 215.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C1" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 290.0, + "y": 490.0 + }, + { + "x": 290.0, + "y": 595.0 + }, + { + "x": 230.0, + "y": 595.0 + }, + { + "x": 230.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C2" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 285.0, + "y": 500.0 + }, + { + "x": 285.0, + "y": 590.0 + }, + { + "x": 225.0, + "y": 590.0 + }, + { + "x": 225.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C3" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 280.0, + "y": 510.0 + }, + { + "x": 280.0, + "y": 585.0 + }, + { + "x": 220.0, + "y": 585.0 + }, + { + "x": 220.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C4" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 275.0, + "y": 520.0 + }, + { + "x": 275.0, + "y": 580.0 + }, + { + "x": 215.0, + "y": 580.0 + }, + { + "x": 215.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C1" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 290.0, + "y": 640.0 + }, + { + "x": 290.0, + "y": 745.0 + }, + { + "x": 230.0, + "y": 745.0 + }, + { + "x": 230.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A4" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C2" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 285.0, + "y": 650.0 + }, + { + "x": 285.0, + "y": 740.0 + }, + { + "x": 225.0, + "y": 740.0 + }, + { + "x": 225.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C3" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 280.0, + "y": 660.0 + }, + { + "x": 280.0, + "y": 735.0 + }, + { + "x": 220.0, + "y": 735.0 + }, + { + "x": 220.0, + "y": 810.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C4" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 275.0, + "y": 670.0 + }, + { + "x": 275.0, + "y": 730.0 + }, + { + "x": 215.0, + "y": 730.0 + }, + { + "x": 215.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA1" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 300.0, + "y": 790.0 + }, + { + "x": 300.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA2" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 305.0, + "y": 800.0 + }, + { + "x": 305.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA3" + }, + "name": "unnamedWire#115", + "path": [ + { + "x": 310.0, + "y": 810.0 + }, + { + "x": 310.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA4" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 315.0, + "y": 820.0 + }, + { + "x": 315.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C1" + }, + "name": "unnamedWire#117", + "path": [ + { + "x": 190.0, + "y": 330.0 + }, + { + "x": 190.0, + "y": 430.0 + }, + { + "x": 130.0, + "y": 430.0 + }, + { + "x": 130.0, + "y": 440.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C2" + }, + "name": "unnamedWire#118", + "path": [ + { + "x": 185.0, + "y": 340.0 + }, + { + "x": 185.0, + "y": 425.0 + }, + { + "x": 125.0, + "y": 425.0 + }, + { + "x": 125.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C3" + }, + "name": "unnamedWire#119", + "path": [ + { + "x": 180.0, + "y": 350.0 + }, + { + "x": 180.0, + "y": 420.0 + }, + { + "x": 120.0, + "y": 420.0 + }, + { + "x": 120.0, + "y": 460.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "and41#0", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 5.0, + "y": 450.0 + }, + { + "x": 5.0, + "y": 300.0 + }, + { + "x": 125.0, + "y": 300.0 + }, + { + "x": 125.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C4" + }, + "name": "unnamedWire#120", + "path": [ + { + "x": 175.0, + "y": 360.0 + }, + { + "x": 175.0, + "y": 415.0 + }, + { + "x": 115.0, + "y": 415.0 + }, + { + "x": 115.0, + "y": 470.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C1" + }, + "name": "unnamedWire#121", + "path": [ + { + "x": 190.0, + "y": 440.0 + }, + { + "x": 190.0, + "y": 580.0 + }, + { + "x": 130.0, + "y": 580.0 + }, + { + "x": 130.0, + "y": 590.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C2" + }, + "name": "unnamedWire#122", + "path": [ + { + "x": 185.0, + "y": 450.0 + }, + { + "x": 185.0, + "y": 575.0 + }, + { + "x": 125.0, + "y": 575.0 + }, + { + "x": 125.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C3" + }, + "name": "unnamedWire#123", + "path": [ + { + "x": 180.0, + "y": 460.0 + }, + { + "x": 180.0, + "y": 570.0 + }, + { + "x": 120.0, + "y": 570.0 + }, + { + "x": 120.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C4" + }, + "name": "unnamedWire#124", + "path": [ + { + "x": 175.0, + "y": 470.0 + }, + { + "x": 175.0, + "y": 565.0 + }, + { + "x": 115.0, + "y": 565.0 + }, + { + "x": 115.0, + "y": 620.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C1" + }, + "name": "unnamedWire#125", + "path": [ + { + "x": 190.0, + "y": 590.0 + }, + { + "x": 190.0, + "y": 730.0 + }, + { + "x": 130.0, + "y": 730.0 + }, + { + "x": 130.0, + "y": 740.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C2" + }, + "name": "unnamedWire#126", + "path": [ + { + "x": 185.0, + "y": 600.0 + }, + { + "x": 185.0, + "y": 725.0 + }, + { + "x": 125.0, + "y": 725.0 + }, + { + "x": 125.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C3" + }, + "name": "unnamedWire#127", + "path": [ + { + "x": 180.0, + "y": 610.0 + }, + { + "x": 180.0, + "y": 720.0 + }, + { + "x": 120.0, + "y": 720.0 + }, + { + "x": 120.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C4" + }, + "name": "unnamedWire#128", + "path": [ + { + "x": 175.0, + "y": 620.0 + }, + { + "x": 175.0, + "y": 715.0 + }, + { + "x": 115.0, + "y": 715.0 + }, + { + "x": 115.0, + "y": 770.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB1" + }, + "name": "unnamedWire#129", + "path": [ + { + "x": 190.0, + "y": 740.0 + }, + { + "x": 190.0, + "y": 880.0 + }, + { + "x": 325.0, + "y": 880.0 + }, + { + "x": 325.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "C" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 185.0, + "y": 155.0 + }, + { + "x": 185.0, + "y": 250.0 + }, + { + "x": 30.0, + "y": 250.0 + }, + { + "x": 30.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB2" + }, + "name": "unnamedWire#130", + "path": [ + { + "x": 185.0, + "y": 750.0 + }, + { + "x": 185.0, + "y": 885.0 + }, + { + "x": 330.0, + "y": 885.0 + }, + { + "x": 330.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB3" + }, + "name": "unnamedWire#131", + "path": [ + { + "x": 180.0, + "y": 760.0 + }, + { + "x": 180.0, + "y": 890.0 + }, + { + "x": 335.0, + "y": 890.0 + }, + { + "x": 335.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB4" + }, + "name": "unnamedWire#132", + "path": [ + { + "x": 175.0, + "y": 770.0 + }, + { + "x": 175.0, + "y": 895.0 + }, + { + "x": 340.0, + "y": 895.0 + }, + { + "x": 340.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "C" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 180.0, + "y": 165.0 + }, + { + "x": 180.0, + "y": 245.0 + }, + { + "x": 25.0, + "y": 245.0 + }, + { + "x": 25.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "C" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 175.0, + "y": 175.0 + }, + { + "x": 175.0, + "y": 240.0 + }, + { + "x": 20.0, + "y": 240.0 + }, + { + "x": 20.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "C" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 170.0, + "y": 185.0 + }, + { + "x": 170.0, + "y": 235.0 + }, + { + "x": 15.0, + "y": 235.0 + }, + { + "x": 15.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B0" + }, + "pin2": { + "compName": "demux2#1", + "pinName": "S0" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 250.0 + }, + { + "x": 5.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 50.0, + "y": 850.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D1" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 35.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D2" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 40.0, + "y": 340.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D3" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 45.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#0", + "pinName": "D4" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 50.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D1" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D2" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D3" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#1", + "pinName": "D4" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "demux2#1", + "pinName": "S1" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 350.0 + }, + { + "x": 10.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "D1" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "D2" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "D3" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#2", + "pinName": "D4" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y00" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "D1" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 35.0, + "y": 780.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "D2" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 40.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "D3" + }, + "name": "unnamedWire#43", + "path": [ + { + "x": 45.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "dlatch4#3", + "pinName": "D4" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "name": "unnamedWire#45", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "name": "unnamedWire#46", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "name": "unnamedWire#47", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#0", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "name": "unnamedWire#48", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y01" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#1", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#2", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#2", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#2", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#2", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#3", + "pinName": "Q1" + }, + "pin2": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#3", + "pinName": "Q2" + }, + "pin2": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#3", + "pinName": "Q3" + }, + "pin2": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y10" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "dlatch4#3", + "pinName": "Q4" + }, + "pin2": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y00" + }, + "pin2": { + "compName": "and41#1", + "pinName": "B" + }, + "name": "unnamedWire#61", + "path": [ + { + "x": 210.0, + "y": 50.0 + }, + { + "x": 210.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y01" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "B" + }, + "name": "unnamedWire#62", + "path": [ + { + "x": 205.0, + "y": 60.0 + }, + { + "x": 205.0, + "y": 570.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y10" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "B" + }, + "name": "unnamedWire#63", + "path": [ + { + "x": 200.0, + "y": 70.0 + }, + { + "x": 200.0, + "y": 720.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y11" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "B" + }, + "name": "unnamedWire#64", + "path": [ + { + "x": 195.0, + "y": 80.0 + }, + { + "x": 195.0, + "y": 870.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "B" + }, + "name": "unnamedWire#65", + "path": [ + { + "x": 110.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "B" + }, + "name": "unnamedWire#66", + "path": [ + { + "x": 105.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "B" + }, + "name": "unnamedWire#67", + "path": [ + { + "x": 100.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "B" + }, + "name": "unnamedWire#68", + "path": [ + { + "x": 95.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A1" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 130.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y11" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A2" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 125.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A3" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 120.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A4" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 115.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A1" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 130.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A2" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 125.0, + "y": 540.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A3" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 120.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A4" + }, + "name": "unnamedWire#76", + "path": [ + { + "x": 115.0, + "y": 560.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A1" + }, + "name": "unnamedWire#77", + "path": [ + { + "x": 130.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A2" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 125.0, + "y": 690.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A3" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 120.0, + "y": 700.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A4" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 115.0, + "y": 710.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A1" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 130.0, + "y": 830.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A2" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 125.0, + "y": 840.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A3" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 120.0, + "y": 850.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#31", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A4" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 115.0, + "y": 860.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A1" + }, + "name": "unnamedWire#85", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A2" + }, + "name": "unnamedWire#86", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A3" + }, + "name": "unnamedWire#87", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A4" + }, + "name": "unnamedWire#88", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A1" + }, + "name": "unnamedWire#89", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A2" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A2" + }, + "name": "unnamedWire#90", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A3" + }, + "name": "unnamedWire#91", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A4" + }, + "name": "unnamedWire#92", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A1" + }, + "name": "unnamedWire#93", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A2" + }, + "name": "unnamedWire#94", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A3" + }, + "name": "unnamedWire#95", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A4" + }, + "name": "unnamedWire#96", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#28", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A1" + }, + "name": "unnamedWire#97", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#29", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A2" + }, + "name": "unnamedWire#98", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#30", + "pinName": "" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A3" + }, + "name": "unnamedWire#99", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "ram2", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "c00": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch4#0" + } + }, + "c01": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch4#1" + } + }, + "c10": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch4#2" + } + }, + "c11": { + "id": "delegating", + "params": { + "delegateTarget": "dlatch4#3" + } + } + }, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "c11.q", + "c10.q", + "c01.q", + "c00.q" + ], + "vectorPartLengthes": [ + 4, + 4, + 4, + 4 + ] + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json new file mode 100644 index 00000000..de91b6be --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/ram4.json @@ -0,0 +1,3525 @@ +{ + "width": 35.0, + "height": 130.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "B0", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "D1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 105.0 + }, + "name": "D2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 115.0 + }, + "name": "D3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 125.0 + }, + "name": "D4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "QA1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "QA2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "QA3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "QA4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 45.0 + }, + "name": "QB1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 55.0 + }, + "name": "QB2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 65.0 + }, + "name": "QB3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 75.0 + }, + "name": "QB4", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "WE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 0.1, + "submodel": { + "components": [ + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 229.0, + "y": 154.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 224.0, + "y": 164.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#10", + "pos": { + "x": 69.0, + "y": 704.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#11", + "pos": { + "x": 74.0, + "y": 714.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#12", + "pos": { + "x": 59.0, + "y": 834.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#13", + "pos": { + "x": 64.0, + "y": 844.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#14", + "pos": { + "x": 69.0, + "y": 854.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#15", + "pos": { + "x": 74.0, + "y": 864.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#16", + "pos": { + "x": 39.0, + "y": 484.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#17", + "pos": { + "x": 44.0, + "y": 494.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#18", + "pos": { + "x": 49.0, + "y": 504.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#19", + "pos": { + "x": 54.0, + "y": 514.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 219.0, + "y": 174.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#20", + "pos": { + "x": 39.0, + "y": 634.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#21", + "pos": { + "x": 44.0, + "y": 644.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#22", + "pos": { + "x": 49.0, + "y": 654.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#23", + "pos": { + "x": 54.0, + "y": 664.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#24", + "pos": { + "x": 39.0, + "y": 334.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#25", + "pos": { + "x": 44.0, + "y": 349.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#26", + "pos": { + "x": 49.0, + "y": 649.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#27", + "pos": { + "x": 54.0, + "y": 749.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 214.0, + "y": 184.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 59.0, + "y": 534.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 64.0, + "y": 544.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#6", + "pos": { + "x": 69.0, + "y": 554.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#7", + "pos": { + "x": 74.0, + "y": 564.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#8", + "pos": { + "x": 59.0, + "y": 684.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#9", + "pos": { + "x": 64.0, + "y": 694.0 + }, + "params": 1 + }, + { + "id": "and41", + "name": "and41#0", + "pos": { + "x": 235.0, + "y": 150.0 + } + }, + { + "id": "and41", + "name": "and41#1", + "pos": { + "x": 250.0, + "y": 375.0 + } + }, + { + "id": "and41", + "name": "and41#2", + "pos": { + "x": 155.0, + "y": 325.0 + } + }, + { + "id": "andor414", + "name": "andor414#0", + "pos": { + "x": 250.0, + "y": 485.0 + } + }, + { + "id": "andor414", + "name": "andor414#1", + "pos": { + "x": 250.0, + "y": 635.0 + } + }, + { + "id": "andor414", + "name": "andor414#2", + "pos": { + "x": 250.0, + "y": 785.0 + } + }, + { + "id": "andor414", + "name": "andor414#3", + "pos": { + "x": 155.0, + "y": 435.0 + } + }, + { + "id": "andor414", + "name": "andor414#4", + "pos": { + "x": 155.0, + "y": 585.0 + } + }, + { + "id": "andor414", + "name": "andor414#5", + "pos": { + "x": 155.0, + "y": 735.0 + } + }, + { + "id": "demux2", + "name": "demux2#0", + "pos": { + "x": 55.0, + "y": 45.0 + } + }, + { + "id": "demux2", + "name": "demux2#1", + "pos": { + "x": 55.0, + "y": 150.0 + } + }, + { + "id": "ram2", + "name": "ram2#0", + "pos": { + "x": 80.0, + "y": 330.0 + } + }, + { + "id": "ram2", + "name": "ram2#1", + "pos": { + "x": 80.0, + "y": 480.0 + } + }, + { + "id": "ram2", + "name": "ram2#2", + "pos": { + "x": 80.0, + "y": 630.0 + } + }, + { + "id": "ram2", + "name": "ram2#3", + "pos": { + "x": 80.0, + "y": 780.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A0" + }, + "pin2": { + "compName": "demux2#0", + "pinName": "S0" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "demux2#0", + "pinName": "S1" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 10.0, + "y": 150.0 + }, + { + "x": 10.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A3" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QA4" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A4" + }, + "name": "unnamedWire#100", + "path": [ + { + "x": 140.0, + "y": 365.0 + }, + { + "x": 140.0, + "y": 360.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QA1" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A1" + }, + "name": "unnamedWire#101", + "path": [ + { + "x": 140.0, + "y": 485.0 + }, + { + "x": 140.0, + "y": 480.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QA2" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A2" + }, + "name": "unnamedWire#102", + "path": [ + { + "x": 140.0, + "y": 495.0 + }, + { + "x": 140.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QA3" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A3" + }, + "name": "unnamedWire#103", + "path": [ + { + "x": 140.0, + "y": 505.0 + }, + { + "x": 140.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QA4" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "A4" + }, + "name": "unnamedWire#104", + "path": [ + { + "x": 140.0, + "y": 515.0 + }, + { + "x": 140.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QA1" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A1" + }, + "name": "unnamedWire#105", + "path": [ + { + "x": 140.0, + "y": 635.0 + }, + { + "x": 140.0, + "y": 630.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QA2" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A2" + }, + "name": "unnamedWire#106", + "path": [ + { + "x": 140.0, + "y": 645.0 + }, + { + "x": 140.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QA3" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A3" + }, + "name": "unnamedWire#107", + "path": [ + { + "x": 140.0, + "y": 655.0 + }, + { + "x": 140.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QA4" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "A4" + }, + "name": "unnamedWire#108", + "path": [ + { + "x": 140.0, + "y": 665.0 + }, + { + "x": 140.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QA1" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A1" + }, + "name": "unnamedWire#109", + "path": [ + { + "x": 140.0, + "y": 785.0 + }, + { + "x": 140.0, + "y": 780.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A4" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QA2" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A2" + }, + "name": "unnamedWire#110", + "path": [ + { + "x": 140.0, + "y": 795.0 + }, + { + "x": 140.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QA3" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A3" + }, + "name": "unnamedWire#111", + "path": [ + { + "x": 140.0, + "y": 805.0 + }, + { + "x": 140.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QA4" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "A4" + }, + "name": "unnamedWire#112", + "path": [ + { + "x": 140.0, + "y": 815.0 + }, + { + "x": 140.0, + "y": 810.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C1" + }, + "name": "unnamedWire#113", + "path": [ + { + "x": 305.0, + "y": 380.0 + }, + { + "x": 305.0, + "y": 445.0 + }, + { + "x": 245.0, + "y": 445.0 + }, + { + "x": 245.0, + "y": 490.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C2" + }, + "name": "unnamedWire#114", + "path": [ + { + "x": 300.0, + "y": 390.0 + }, + { + "x": 300.0, + "y": 440.0 + }, + { + "x": 240.0, + "y": 440.0 + }, + { + "x": 240.0, + "y": 500.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C3" + }, + "name": "unnamedWire#115", + "path": [ + { + "x": 295.0, + "y": 400.0 + }, + { + "x": 295.0, + "y": 435.0 + }, + { + "x": 235.0, + "y": 435.0 + }, + { + "x": 235.0, + "y": 510.0 + } + ] + }, + { + "pin1": { + "compName": "and41#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "C4" + }, + "name": "unnamedWire#116", + "path": [ + { + "x": 290.0, + "y": 410.0 + }, + { + "x": 290.0, + "y": 430.0 + }, + { + "x": 230.0, + "y": 430.0 + }, + { + "x": 230.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C1" + }, + "name": "unnamedWire#117", + "path": [ + { + "x": 305.0, + "y": 490.0 + }, + { + "x": 305.0, + "y": 595.0 + }, + { + "x": 245.0, + "y": 595.0 + }, + { + "x": 245.0, + "y": 640.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C2" + }, + "name": "unnamedWire#118", + "path": [ + { + "x": 300.0, + "y": 500.0 + }, + { + "x": 300.0, + "y": 590.0 + }, + { + "x": 240.0, + "y": 590.0 + }, + { + "x": 240.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C3" + }, + "name": "unnamedWire#119", + "path": [ + { + "x": 295.0, + "y": 510.0 + }, + { + "x": 295.0, + "y": 585.0 + }, + { + "x": 235.0, + "y": 585.0 + }, + { + "x": 235.0, + "y": 660.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "WE" + }, + "pin2": { + "compName": "and41#0", + "pinName": "B" + }, + "name": "unnamedWire#12", + "path": [ + { + "x": 15.0, + "y": 850.0 + }, + { + "x": 15.0, + "y": 195.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "C4" + }, + "name": "unnamedWire#120", + "path": [ + { + "x": 290.0, + "y": 520.0 + }, + { + "x": 290.0, + "y": 580.0 + }, + { + "x": 230.0, + "y": 580.0 + }, + { + "x": 230.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C1" + }, + "name": "unnamedWire#121", + "path": [ + { + "x": 305.0, + "y": 640.0 + }, + { + "x": 305.0, + "y": 745.0 + }, + { + "x": 245.0, + "y": 745.0 + }, + { + "x": 245.0, + "y": 790.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C2" + }, + "name": "unnamedWire#122", + "path": [ + { + "x": 300.0, + "y": 650.0 + }, + { + "x": 300.0, + "y": 740.0 + }, + { + "x": 240.0, + "y": 740.0 + }, + { + "x": 240.0, + "y": 800.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C3" + }, + "name": "unnamedWire#123", + "path": [ + { + "x": 295.0, + "y": 660.0 + }, + { + "x": 295.0, + "y": 735.0 + }, + { + "x": 235.0, + "y": 735.0 + }, + { + "x": 235.0, + "y": 810.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#1", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "C4" + }, + "name": "unnamedWire#124", + "path": [ + { + "x": 290.0, + "y": 670.0 + }, + { + "x": 290.0, + "y": 730.0 + }, + { + "x": 230.0, + "y": 730.0 + }, + { + "x": 230.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB1" + }, + "name": "unnamedWire#125", + "path": [ + { + "x": 330.0, + "y": 790.0 + }, + { + "x": 330.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB2" + }, + "name": "unnamedWire#126", + "path": [ + { + "x": 335.0, + "y": 800.0 + }, + { + "x": 335.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB3" + }, + "name": "unnamedWire#127", + "path": [ + { + "x": 340.0, + "y": 810.0 + }, + { + "x": 340.0, + "y": 650.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#2", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QB4" + }, + "name": "unnamedWire#128", + "path": [ + { + "x": 345.0, + "y": 820.0 + }, + { + "x": 345.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C1" + }, + "name": "unnamedWire#129", + "path": [ + { + "x": 210.0, + "y": 330.0 + }, + { + "x": 210.0, + "y": 430.0 + }, + { + "x": 150.0, + "y": 430.0 + }, + { + "x": 150.0, + "y": 440.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "WE" + }, + "name": "unnamedWire#13", + "path": [ + { + "x": 290.0, + "y": 155.0 + }, + { + "x": 290.0, + "y": 230.0 + }, + { + "x": 35.0, + "y": 230.0 + }, + { + "x": 35.0, + "y": 375.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C2" + }, + "name": "unnamedWire#130", + "path": [ + { + "x": 205.0, + "y": 340.0 + }, + { + "x": 205.0, + "y": 425.0 + }, + { + "x": 145.0, + "y": 425.0 + }, + { + "x": 145.0, + "y": 450.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C3" + }, + "name": "unnamedWire#131", + "path": [ + { + "x": 200.0, + "y": 350.0 + }, + { + "x": 200.0, + "y": 420.0 + }, + { + "x": 140.0, + "y": 420.0 + }, + { + "x": 140.0, + "y": 460.0 + } + ] + }, + { + "pin1": { + "compName": "and41#2", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "C4" + }, + "name": "unnamedWire#132", + "path": [ + { + "x": 195.0, + "y": 360.0 + }, + { + "x": 195.0, + "y": 415.0 + }, + { + "x": 135.0, + "y": 415.0 + }, + { + "x": 135.0, + "y": 470.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C1" + }, + "name": "unnamedWire#133", + "path": [ + { + "x": 210.0, + "y": 440.0 + }, + { + "x": 210.0, + "y": 580.0 + }, + { + "x": 150.0, + "y": 580.0 + }, + { + "x": 150.0, + "y": 590.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C2" + }, + "name": "unnamedWire#134", + "path": [ + { + "x": 205.0, + "y": 450.0 + }, + { + "x": 205.0, + "y": 575.0 + }, + { + "x": 145.0, + "y": 575.0 + }, + { + "x": 145.0, + "y": 600.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C3" + }, + "name": "unnamedWire#135", + "path": [ + { + "x": 200.0, + "y": 460.0 + }, + { + "x": 200.0, + "y": 570.0 + }, + { + "x": 140.0, + "y": 570.0 + }, + { + "x": 140.0, + "y": 610.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#3", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "C4" + }, + "name": "unnamedWire#136", + "path": [ + { + "x": 195.0, + "y": 470.0 + }, + { + "x": 195.0, + "y": 565.0 + }, + { + "x": 135.0, + "y": 565.0 + }, + { + "x": 135.0, + "y": 620.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y1" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C1" + }, + "name": "unnamedWire#137", + "path": [ + { + "x": 210.0, + "y": 590.0 + }, + { + "x": 210.0, + "y": 730.0 + }, + { + "x": 150.0, + "y": 730.0 + }, + { + "x": 150.0, + "y": 740.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y2" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C2" + }, + "name": "unnamedWire#138", + "path": [ + { + "x": 205.0, + "y": 600.0 + }, + { + "x": 205.0, + "y": 725.0 + }, + { + "x": 145.0, + "y": 725.0 + }, + { + "x": 145.0, + "y": 750.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y3" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C3" + }, + "name": "unnamedWire#139", + "path": [ + { + "x": 200.0, + "y": 610.0 + }, + { + "x": 200.0, + "y": 720.0 + }, + { + "x": 140.0, + "y": 720.0 + }, + { + "x": 140.0, + "y": 760.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "WE" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 285.0, + "y": 165.0 + }, + { + "x": 285.0, + "y": 225.0 + }, + { + "x": 30.0, + "y": 225.0 + }, + { + "x": 30.0, + "y": 525.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#4", + "pinName": "Y4" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "C4" + }, + "name": "unnamedWire#140", + "path": [ + { + "x": 195.0, + "y": 620.0 + }, + { + "x": 195.0, + "y": 715.0 + }, + { + "x": 135.0, + "y": 715.0 + }, + { + "x": 135.0, + "y": 770.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y1" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA1" + }, + "name": "unnamedWire#141", + "path": [ + { + "x": 210.0, + "y": 740.0 + }, + { + "x": 210.0, + "y": 880.0 + }, + { + "x": 310.0, + "y": 880.0 + }, + { + "x": 310.0, + "y": 50.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y2" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA2" + }, + "name": "unnamedWire#142", + "path": [ + { + "x": 205.0, + "y": 750.0 + }, + { + "x": 205.0, + "y": 885.0 + }, + { + "x": 315.0, + "y": 885.0 + }, + { + "x": 315.0, + "y": 150.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y3" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA3" + }, + "name": "unnamedWire#143", + "path": [ + { + "x": 200.0, + "y": 760.0 + }, + { + "x": 200.0, + "y": 890.0 + }, + { + "x": 320.0, + "y": 890.0 + }, + { + "x": 320.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "andor414#5", + "pinName": "Y4" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "QA4" + }, + "name": "unnamedWire#144", + "path": [ + { + "x": 195.0, + "y": 770.0 + }, + { + "x": 195.0, + "y": 895.0 + }, + { + "x": 325.0, + "y": 895.0 + }, + { + "x": 325.0, + "y": 350.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "WE" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 280.0, + "y": 175.0 + }, + { + "x": 280.0, + "y": 220.0 + }, + { + "x": 25.0, + "y": 220.0 + }, + { + "x": 25.0, + "y": 675.0 + } + ] + }, + { + "pin1": { + "compName": "and41#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "WE" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 275.0, + "y": 185.0 + }, + { + "x": 275.0, + "y": 215.0 + }, + { + "x": 20.0, + "y": 215.0 + }, + { + "x": 20.0, + "y": 825.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "A0" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B0" + }, + "pin2": { + "compName": "demux2#1", + "pinName": "S0" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 450.0 + }, + { + "x": 5.0, + "y": 155.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "A1" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 45.0, + "y": 345.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "B0" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 50.0, + "y": 355.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "B1" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 55.0, + "y": 365.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "A0" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "A1" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "B0" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "B1" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#16", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#17", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#18", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "demux2#1", + "pinName": "S1" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 550.0 + }, + { + "x": 10.0, + "y": 165.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#26", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#19", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "A0" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "A1" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "B0" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "B1" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#20", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "A0" + }, + "name": "unnamedWire#37", + "path": [ + { + "x": 40.0, + "y": 785.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#21", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "A1" + }, + "name": "unnamedWire#38", + "path": [ + { + "x": 45.0, + "y": 795.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#22", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "B0" + }, + "name": "unnamedWire#39", + "path": [ + { + "x": 50.0, + "y": 805.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y00" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#23", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "B1" + }, + "name": "unnamedWire#41", + "path": [ + { + "x": 55.0, + "y": 815.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "WireCrossPoint#24", + "pinName": "" + }, + "name": "unnamedWire#42", + "path": [ + { + "x": 40.0, + "y": 250.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "WireCrossPoint#25", + "pinName": "" + }, + "name": "unnamedWire#43", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "WireCrossPoint#27", + "pinName": "" + }, + "name": "unnamedWire#44", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "D1" + }, + "name": "unnamedWire#45", + "path": [ + { + "x": 60.0, + "y": 385.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "D2" + }, + "name": "unnamedWire#46", + "path": [ + { + "x": 65.0, + "y": 395.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "D3" + }, + "name": "unnamedWire#47", + "path": [ + { + "x": 70.0, + "y": 405.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "ram2#0", + "pinName": "D4" + }, + "name": "unnamedWire#48", + "path": [ + { + "x": 75.0, + "y": 415.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "D1" + }, + "name": "unnamedWire#49", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y01" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "D2" + }, + "name": "unnamedWire#50", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "D3" + }, + "name": "unnamedWire#51", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "ram2#1", + "pinName": "D4" + }, + "name": "unnamedWire#52", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "name": "unnamedWire#53", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "name": "unnamedWire#54", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#6", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "name": "unnamedWire#55", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#7", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "name": "unnamedWire#56", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "D1" + }, + "name": "unnamedWire#57", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "D2" + }, + "name": "unnamedWire#58", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "D3" + }, + "name": "unnamedWire#59", + "path": [] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y10" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "ram2#2", + "pinName": "D4" + }, + "name": "unnamedWire#60", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#8", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#61", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#9", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#62", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#10", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#63", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#11", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#64", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "D1" + }, + "name": "unnamedWire#65", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "D2" + }, + "name": "unnamedWire#66", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "D3" + }, + "name": "unnamedWire#67", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "pin2": { + "compName": "ram2#3", + "pinName": "D4" + }, + "name": "unnamedWire#68", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D1" + }, + "pin2": { + "compName": "WireCrossPoint#12", + "pinName": "" + }, + "name": "unnamedWire#69", + "path": [ + { + "x": 60.0, + "y": 950.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#1", + "pinName": "Y11" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D2" + }, + "pin2": { + "compName": "WireCrossPoint#13", + "pinName": "" + }, + "name": "unnamedWire#70", + "path": [ + { + "x": 65.0, + "y": 1050.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D3" + }, + "pin2": { + "compName": "WireCrossPoint#14", + "pinName": "" + }, + "name": "unnamedWire#71", + "path": [ + { + "x": 70.0, + "y": 1150.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "D4" + }, + "pin2": { + "compName": "WireCrossPoint#15", + "pinName": "" + }, + "name": "unnamedWire#72", + "path": [ + { + "x": 75.0, + "y": 1250.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y00" + }, + "pin2": { + "compName": "and41#2", + "pinName": "B" + }, + "name": "unnamedWire#73", + "path": [ + { + "x": 135.0, + "y": 50.0 + }, + { + "x": 135.0, + "y": 370.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y01" + }, + "pin2": { + "compName": "andor414#3", + "pinName": "B" + }, + "name": "unnamedWire#74", + "path": [ + { + "x": 130.0, + "y": 60.0 + }, + { + "x": 130.0, + "y": 520.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y10" + }, + "pin2": { + "compName": "andor414#4", + "pinName": "B" + }, + "name": "unnamedWire#75", + "path": [ + { + "x": 125.0, + "y": 70.0 + }, + { + "x": 125.0, + "y": 670.0 + } + ] + }, + { + "pin1": { + "compName": "demux2#0", + "pinName": "Y11" + }, + "pin2": { + "compName": "andor414#5", + "pinName": "B" + }, + "name": "unnamedWire#76", + "path": [ + { + "x": 120.0, + "y": 80.0 + }, + { + "x": 120.0, + "y": 820.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and41#1", + "pinName": "B" + }, + "name": "unnamedWire#77", + "path": [ + { + "x": 230.0, + "y": 420.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "B" + }, + "name": "unnamedWire#78", + "path": [ + { + "x": 225.0, + "y": 570.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "B" + }, + "name": "unnamedWire#79", + "path": [ + { + "x": 220.0, + "y": 720.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A1" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "B" + }, + "name": "unnamedWire#80", + "path": [ + { + "x": 215.0, + "y": 870.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QB1" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A1" + }, + "name": "unnamedWire#81", + "path": [ + { + "x": 140.0, + "y": 375.0 + }, + { + "x": 140.0, + "y": 380.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QB2" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A2" + }, + "name": "unnamedWire#82", + "path": [ + { + "x": 140.0, + "y": 385.0 + }, + { + "x": 140.0, + "y": 390.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QB3" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A3" + }, + "name": "unnamedWire#83", + "path": [ + { + "x": 140.0, + "y": 395.0 + }, + { + "x": 140.0, + "y": 400.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QB4" + }, + "pin2": { + "compName": "and41#1", + "pinName": "A4" + }, + "name": "unnamedWire#84", + "path": [ + { + "x": 140.0, + "y": 405.0 + }, + { + "x": 140.0, + "y": 410.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QB1" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A1" + }, + "name": "unnamedWire#85", + "path": [ + { + "x": 140.0, + "y": 525.0 + }, + { + "x": 140.0, + "y": 530.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QB2" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A2" + }, + "name": "unnamedWire#86", + "path": [ + { + "x": 140.0, + "y": 535.0 + }, + { + "x": 140.0, + "y": 540.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QB3" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A3" + }, + "name": "unnamedWire#87", + "path": [ + { + "x": 140.0, + "y": 545.0 + }, + { + "x": 140.0, + "y": 550.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#1", + "pinName": "QB4" + }, + "pin2": { + "compName": "andor414#0", + "pinName": "A4" + }, + "name": "unnamedWire#88", + "path": [ + { + "x": 140.0, + "y": 555.0 + }, + { + "x": 140.0, + "y": 560.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QB1" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A1" + }, + "name": "unnamedWire#89", + "path": [ + { + "x": 140.0, + "y": 675.0 + }, + { + "x": 140.0, + "y": 680.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "and41#0", + "pinName": "A2" + }, + "name": "unnamedWire#9", + "path": [] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QB2" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A2" + }, + "name": "unnamedWire#90", + "path": [ + { + "x": 140.0, + "y": 685.0 + }, + { + "x": 140.0, + "y": 690.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QB3" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A3" + }, + "name": "unnamedWire#91", + "path": [ + { + "x": 140.0, + "y": 695.0 + }, + { + "x": 140.0, + "y": 700.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#2", + "pinName": "QB4" + }, + "pin2": { + "compName": "andor414#1", + "pinName": "A4" + }, + "name": "unnamedWire#92", + "path": [ + { + "x": 140.0, + "y": 705.0 + }, + { + "x": 140.0, + "y": 710.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QB1" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A1" + }, + "name": "unnamedWire#93", + "path": [ + { + "x": 140.0, + "y": 825.0 + }, + { + "x": 140.0, + "y": 830.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QB2" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A2" + }, + "name": "unnamedWire#94", + "path": [ + { + "x": 140.0, + "y": 835.0 + }, + { + "x": 140.0, + "y": 840.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QB3" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A3" + }, + "name": "unnamedWire#95", + "path": [ + { + "x": 140.0, + "y": 845.0 + }, + { + "x": 140.0, + "y": 850.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#3", + "pinName": "QB4" + }, + "pin2": { + "compName": "andor414#2", + "pinName": "A4" + }, + "name": "unnamedWire#96", + "path": [ + { + "x": 140.0, + "y": 855.0 + }, + { + "x": 140.0, + "y": 860.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QA1" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A1" + }, + "name": "unnamedWire#97", + "path": [ + { + "x": 140.0, + "y": 335.0 + }, + { + "x": 140.0, + "y": 330.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QA2" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A2" + }, + "name": "unnamedWire#98", + "path": [ + { + "x": 140.0, + "y": 345.0 + }, + { + "x": 140.0, + "y": 340.0 + } + ] + }, + { + "pin1": { + "compName": "ram2#0", + "pinName": "QA3" + }, + "pin2": { + "compName": "and41#2", + "pinName": "A3" + }, + "name": "unnamedWire#99", + "path": [ + { + "x": 140.0, + "y": 355.0 + }, + { + "x": 140.0, + "y": 350.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "ram4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "c00": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0" + } + }, + "c0000": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0", + "prefix": "c00" + } + }, + "c0001": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1", + "prefix": "c00" + } + }, + "c0010": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2", + "prefix": "c00" + } + }, + "c0011": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3", + "prefix": "c00" + } + }, + "c01": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1" + } + }, + "c0100": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0", + "prefix": "c01" + } + }, + "c0101": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1", + "prefix": "c01" + } + }, + "c0110": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2", + "prefix": "c01" + } + }, + "c0111": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3", + "prefix": "c01" + } + }, + "c10": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2" + } + }, + "c1000": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0", + "prefix": "c10" + } + }, + "c1001": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1", + "prefix": "c10" + } + }, + "c1010": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2", + "prefix": "c10" + } + }, + "c1011": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3", + "prefix": "c10" + } + }, + "c11": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3" + } + }, + "c1100": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#0", + "prefix": "c11" + } + }, + "c1101": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#1", + "prefix": "c11" + } + }, + "c1110": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#2", + "prefix": "c11" + } + }, + "c1111": { + "id": "delegating", + "params": { + "delegateTarget": "ram2#3", + "prefix": "c11" + } + } + }, + "atomicHighLevelStates": { + "q": { + "id": "bitVectorSplitting", + "params": { + "vectorPartTargets": [ + "c11.q", + "c10.q", + "c01.q", + "c00.q" + ], + "vectorPartLengthes": [ + 16, + 16, + 16, + 16 + ] + } + } + } + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json new file mode 100644 index 00000000..afd89f18 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel1.json @@ -0,0 +1,214 @@ +{ + "width": 35.0, + "height": 40.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "I1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "I2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "S1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "S2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 35.0, + "y": 30.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 35.0, + "y": 55.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 60.0, + "y": 40.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S1" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 25.0, + "y": 12.5 + }, + { + "x": 25.0, + "y": 35.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "S2" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 15.0, + "y": 37.5 + }, + { + "x": 15.0, + "y": 60.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#10" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I1" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 25.0, + "y": 62.5 + }, + { + "x": 25.0, + "y": 45.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I2" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 15.0, + "y": 87.5 + }, + { + "x": 15.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#8" + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "sel1", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json new file mode 100644 index 00000000..22f3ce64 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel2_4.json @@ -0,0 +1,863 @@ +{ + "width": 35.0, + "height": 100.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "B4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "SA", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "SB", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 20.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 20.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#10", + "pos": { + "x": 65.0, + "y": 52.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#11", + "pos": { + "x": 65.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 20.0, + "y": 102.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 20.0, + "y": 152.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 20.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 20.0, + "y": 77.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 20.0, + "y": 127.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 20.0, + "y": 177.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#8", + "pos": { + "x": 65.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#9", + "pos": { + "x": 65.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 6.5, + "y": 16.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 6.5, + "y": 66.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 6.5, + "y": 116.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#3", + "pos": { + "x": 4.0, + "y": 41.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#4", + "pos": { + "x": 4.0, + "y": 91.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#5", + "pos": { + "x": 4.0, + "y": 141.5 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 15.0, + "y": 62.5 + }, + { + "x": 15.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 17.5, + "y": 87.5 + }, + { + "x": 17.5, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#10" + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#11" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#12" + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#13" + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#14" + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [ + { + "x": 7.5, + "y": 167.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "name": "unnamedWire#16" + }, + { + "pin1": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#17" + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "name": "unnamedWire#18" + }, + { + "pin1": { + "compName": "WireCrossPoint#4", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#19" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 17.5, + "y": 112.5 + }, + { + "x": 17.5, + "y": 107.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#20" + }, + { + "pin1": { + "compName": "WireCrossPoint#5", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#21", + "path": [ + { + "x": 5.0, + "y": 192.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "A" + }, + "name": "unnamedWire#22", + "path": [ + { + "x": 42.5, + "y": 12.5 + }, + { + "x": 42.5, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#8", + "pinName": "B" + }, + "name": "unnamedWire#23", + "path": [ + { + "x": 45.0, + "y": 37.5 + }, + { + "x": 45.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "A" + }, + "name": "unnamedWire#24", + "path": [ + { + "x": 47.5, + "y": 62.5 + }, + { + "x": 47.5, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#9", + "pinName": "B" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 50.0, + "y": 87.5 + }, + { + "x": 50.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 52.5, + "y": 112.5 + }, + { + "x": 52.5, + "y": 57.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#10", + "pinName": "B" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 55.0, + "y": 137.5 + }, + { + "x": 55.0, + "y": 67.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "A" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 57.5, + "y": 162.5 + }, + { + "x": 57.5, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#11", + "pinName": "B" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 60.0, + "y": 187.5 + }, + { + "x": 60.0, + "y": 92.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 17.5, + "y": 137.5 + }, + { + "x": 17.5, + "y": 157.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#8", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#9", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#10", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#11", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 10.0, + "y": 162.5 + }, + { + "x": 10.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 12.5, + "y": 187.5 + }, + { + "x": 12.5, + "y": 82.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 15.0, + "y": 212.5 + }, + { + "x": 15.0, + "y": 132.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B4" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 10.0, + "y": 237.5 + }, + { + "x": 10.0, + "y": 182.5 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SA" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#8" + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SB" + }, + "pin2": { + "compName": "WireCrossPoint#3", + "pinName": "" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "sel2_4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json new file mode 100644 index 00000000..c16624c8 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/sel3_4.json @@ -0,0 +1,937 @@ +{ + "width": 35.0, + "height": 150.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 35.0 + }, + "name": "A1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 45.0 + }, + "name": "A2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 55.0 + }, + "name": "A3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 65.0 + }, + "name": "A4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 75.0 + }, + "name": "B1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 85.0 + }, + "name": "B2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 95.0 + }, + "name": "B3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 105.0 + }, + "name": "B4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 115.0 + }, + "name": "C1", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 125.0 + }, + "name": "C2", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 135.0 + }, + "name": "C3", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 145.0 + }, + "name": "C4", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "SA", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "SB", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 25.0 + }, + "name": "SC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y1", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 15.0 + }, + "name": "Y2", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 25.0 + }, + "name": "Y3", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 35.0, + "y": 35.0 + }, + "name": "Y4", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.2, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 50.0, + "y": 570.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 50.0, + "y": 620.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 50.0, + "y": 670.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 50.0, + "y": 720.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#4", + "pos": { + "x": 152.5, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#5", + "pos": { + "x": 152.5, + "y": 65.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#6", + "pos": { + "x": 152.5, + "y": 115.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#7", + "pos": { + "x": 152.5, + "y": 165.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 29.0, + "y": 584.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 29.0, + "y": 634.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 29.0, + "y": 684.0 + }, + "params": 1 + }, + { + "id": "not4", + "name": "not4#0", + "pos": { + "x": 75.0, + "y": 250.0 + } + }, + { + "id": "sel2_4", + "name": "sel2_4#0", + "pos": { + "x": 35.0, + "y": 250.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SA" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "SA" + }, + "name": "unnamedWire#0", + "path": [ + { + "x": 25.0, + "y": 25.0 + }, + { + "x": 25.0, + "y": 255.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SB" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "SB" + }, + "name": "unnamedWire#1", + "path": [ + { + "x": 20.0, + "y": 75.0 + }, + { + "x": 20.0, + "y": 265.0 + } + ] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A1" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A2" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A3" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "sel2_4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "not4#0", + "pinName": "A4" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SC" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#14", + "path": [ + { + "x": 30.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#16", + "path": [ + { + "x": 30.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#18", + "path": [ + { + "x": 30.0, + "y": 125.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A1" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A1" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 15.0, + "y": 175.0 + }, + { + "x": 15.0, + "y": 275.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#20", + "path": [ + { + "x": 30.0, + "y": 735.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C1" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C2" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C3" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C4" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y1" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "A" + }, + "name": "unnamedWire#25", + "path": [ + { + "x": 115.0, + "y": 255.0 + }, + { + "x": 115.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y2" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "A" + }, + "name": "unnamedWire#26", + "path": [ + { + "x": 120.0, + "y": 265.0 + }, + { + "x": 120.0, + "y": 70.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y3" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "A" + }, + "name": "unnamedWire#27", + "path": [ + { + "x": 125.0, + "y": 275.0 + }, + { + "x": 125.0, + "y": 120.0 + } + ] + }, + { + "pin1": { + "compName": "not4#0", + "pinName": "Y4" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "A" + }, + "name": "unnamedWire#28", + "path": [ + { + "x": 130.0, + "y": 285.0 + }, + { + "x": 130.0, + "y": 170.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#4", + "pinName": "B" + }, + "name": "unnamedWire#29", + "path": [ + { + "x": 135.0, + "y": 580.0 + }, + { + "x": 135.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A2" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A2" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 10.0, + "y": 225.0 + }, + { + "x": 10.0, + "y": 285.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#5", + "pinName": "B" + }, + "name": "unnamedWire#30", + "path": [ + { + "x": 140.0, + "y": 630.0 + }, + { + "x": 140.0, + "y": 80.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#6", + "pinName": "B" + }, + "name": "unnamedWire#31", + "path": [ + { + "x": 145.0, + "y": 680.0 + }, + { + "x": 145.0, + "y": 130.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#7", + "pinName": "B" + }, + "name": "unnamedWire#32", + "path": [ + { + "x": 150.0, + "y": 730.0 + }, + { + "x": 150.0, + "y": 180.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#4", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y1" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#5", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y2" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#6", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y3" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#7", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y4" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A3" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A3" + }, + "name": "unnamedWire#4", + "path": [ + { + "x": 5.0, + "y": 275.0 + }, + { + "x": 5.0, + "y": 295.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A4" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "A4" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 5.0, + "y": 325.0 + }, + { + "x": 5.0, + "y": 305.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B1" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B1" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 10.0, + "y": 375.0 + }, + { + "x": 10.0, + "y": 315.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B2" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B2" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 15.0, + "y": 425.0 + }, + { + "x": 15.0, + "y": 325.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B3" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B3" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 20.0, + "y": 475.0 + }, + { + "x": 20.0, + "y": 335.0 + } + ] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B4" + }, + "pin2": { + "compName": "sel2_4#0", + "pinName": "B4" + }, + "name": "unnamedWire#9", + "path": [ + { + "x": 25.0, + "y": 525.0 + }, + { + "x": 25.0, + "y": 345.0 + } + ] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "sel3_4", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json new file mode 100644 index 00000000..2eff80ef --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/components/net/mograsim/logic/model/am2900/components/xor.json @@ -0,0 +1,285 @@ +{ + "width": 35.0, + "height": 20.0, + "interfacePins": [ + { + "location": { + "x": 0.0, + "y": 5.0 + }, + "name": "A", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 0.0, + "y": 15.0 + }, + "name": "B", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 35.0, + "y": 5.0 + }, + "name": "Y", + "logicWidth": 1, + "usage": "OUTPUT" + } + ], + "innerScale": 0.4, + "submodel": { + "components": [ + { + "id": "NandGate", + "name": "NandGate#0", + "pos": { + "x": 7.5, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#1", + "pos": { + "x": 35.0, + "y": 2.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#2", + "pos": { + "x": 35.0, + "y": 27.5 + }, + "params": 1 + }, + { + "id": "NandGate", + "name": "NandGate#3", + "pos": { + "x": 62.5, + "y": 15.0 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#0", + "pos": { + "x": 4.0, + "y": 11.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#1", + "pos": { + "x": 4.0, + "y": 36.5 + }, + "params": 1 + }, + { + "id": "WireCrossPoint", + "name": "WireCrossPoint#2", + "pos": { + "x": 29.0, + "y": 24.0 + }, + "params": 1 + } + ], + "wires": [ + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "A" + }, + "pin2": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "B" + }, + "pin2": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "NandGate#2", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "B" + }, + "name": "unnamedWire#10" + }, + { + "pin1": { + "compName": "NandGate#3", + "pinName": "Y" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "Y" + }, + "name": "unnamedWire#11" + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "A" + }, + "name": "unnamedWire#2", + "path": [ + { + "x": 5.0, + "y": 20.0 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#0", + "pinName": "B" + }, + "name": "unnamedWire#3", + "path": [ + { + "x": 5.0, + "y": 30.0 + } + ] + }, + { + "pin1": { + "compName": "NandGate#0", + "pinName": "Y" + }, + "pin2": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "name": "unnamedWire#4" + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "B" + }, + "name": "unnamedWire#5", + "path": [ + { + "x": 30.0, + "y": 17.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#2", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "A" + }, + "name": "unnamedWire#6", + "path": [ + { + "x": 30.0, + "y": 32.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#0", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#1", + "pinName": "A" + }, + "name": "unnamedWire#7", + "path": [ + { + "x": 5.0, + "y": 7.5 + } + ] + }, + { + "pin1": { + "compName": "WireCrossPoint#1", + "pinName": "" + }, + "pin2": { + "compName": "NandGate#2", + "pinName": "B" + }, + "name": "unnamedWire#8", + "path": [ + { + "x": 5.0, + "y": 42.5 + } + ] + }, + { + "pin1": { + "compName": "NandGate#1", + "pinName": "Y" + }, + "pin2": { + "compName": "NandGate#3", + "pinName": "A" + }, + "name": "unnamedWire#9" + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "simpleRectangularLike", + "symbolRendererParams": { + "centerText": "xor", + "centerTextHeight": 5.0, + "horizontalComponentCenter": 17.5, + "pinLabelHeight": 3.5, + "pinLabelMargin": 0.5 + }, + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "default", + "version": "0.1.5" +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/plugin.xml b/plugins/net.mograsim.logic.model.am2900/plugin.xml new file mode 100644 index 00000000..7a324ad9 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/plugin.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java new file mode 100644 index 00000000..10cf1412 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/Am2900Loader.java @@ -0,0 +1,39 @@ +package net.mograsim.logic.model.am2900; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import net.mograsim.logic.model.serializing.ClassLoaderBasedResourceLoader; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.MachineLoader; + +public class Am2900Loader implements BundleActivator +{ + // TODO use dff16 in dff16_we & dff16_invwe + private static AtomicBoolean activated = new AtomicBoolean(false); + + @Override + public void start(BundleContext context) throws Exception + { + setup(); + } + + @Override + public void stop(BundleContext context) throws Exception + { + // nothing + } + + public static void setup() + { + if (activated.getAndSet(true)) + return; + ClassLoaderBasedResourceLoader resourceLoader = ClassLoaderBasedResourceLoader.create(Am2900Loader.class.getClassLoader()); + IndirectModelComponentCreator.registerResourceLoader(resourceLoader, "Am2900Loader"); + IndirectModelComponentCreator.loadStandardComponentIDs(Am2900Loader.class.getResourceAsStream("standardComponentIDMapping.json")); + MachineLoader.setup(); +// System.out.println("SETUP DONE"); // TODO: Debug + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java new file mode 100644 index 00000000..4450e07b --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemory.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.components; + +import net.mograsim.logic.model.am2900.machine.Am2900Machine; +import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.standard.memory.ModelWordAddressableMemory; + +public class ModelAm2900MainMemory extends ModelWordAddressableMemory +{ + public ModelAm2900MainMemory(LogicModelModifiable model, String name) + { + super(model, Am2900MachineDefinition.getInstance().getMainMemoryDefinition(), name); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Am2900MainMemory"; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new ModelAm2900MainMemoryAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MainMemory.class.getCanonicalName(), (m, p, n) -> + { + return new ModelAm2900MainMemory(m, n); + }); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java new file mode 100644 index 00000000..e5e34ebb --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MainMemoryAdapter.java @@ -0,0 +1,34 @@ +package net.mograsim.logic.model.am2900.components; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; +import net.mograsim.machine.standard.memory.CoreWordAddressableMemory; + +public class ModelAm2900MainMemoryAdapter implements ComponentAdapter +{ + + @Override + public Class getSupportedClass() + { + return ModelAm2900MainMemory.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MainMemory modelComponent, + Map logicWiresPerPin) + { + ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd(); + ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd(); + ReadEnd mode = logicWiresPerPin.get(modelComponent.getReadWritePin()).createReadOnlyEnd(); + CoreWordAddressableMemory mem = new CoreWordAddressableMemory(timeline, 2, modelComponent.getMachine().getMainMemory(), data, mode, + address); + modelComponent.setCoreModelBinding(mem); + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java new file mode 100644 index 00000000..cfd54c52 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemory.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.components; + +import net.mograsim.logic.model.am2900.machine.Am2900Machine; +import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.mi.components.ModelMicroInstructionMemory; + +public class ModelAm2900MicroInstructionMemory extends ModelMicroInstructionMemory +{ + public ModelAm2900MicroInstructionMemory(LogicModelModifiable model, String name) + { + super(model, Am2900MachineDefinition.getInstance().getMicroInstructionMemoryDefinition(), name); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new ModelAm2900MicroInstructionMemoryAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelAm2900MicroInstructionMemory.class.getCanonicalName(), (m, p, n) -> + { + return new ModelAm2900MicroInstructionMemory(m, n); + }); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Am2900MicroInstructionMemory"; + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java new file mode 100644 index 00000000..895c58a5 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/ModelAm2900MicroInstructionMemoryAdapter.java @@ -0,0 +1,34 @@ +package net.mograsim.logic.model.am2900.components; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; +import net.mograsim.machine.mi.components.CoreMicroInstructionMemory; + +public class ModelAm2900MicroInstructionMemoryAdapter implements ComponentAdapter +{ + + @Override + public Class getSupportedClass() + { + return ModelAm2900MicroInstructionMemory.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelAm2900MicroInstructionMemory modelComponent, + Map logicWiresPerPin) + { + ReadWriteEnd data = logicWiresPerPin.get(modelComponent.getDataPin()).createReadWriteEnd(); + ReadEnd address = logicWiresPerPin.get(modelComponent.getAddressPin()).createReadOnlyEnd(); + CoreMicroInstructionMemory mem = new CoreMicroInstructionMemory(timeline, 2, + modelComponent.getMachine().getMicroInstructionMemory(), data, address); + modelComponent.setCoreModelBinding(mem); + } + +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java new file mode 100644 index 00000000..14500d5c --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff12.java @@ -0,0 +1,87 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modeldff12 extends SimpleRectangularHardcodedModelComponent +{ + public Modeldff12(LogicModelModifiable model, String name) + { + super(model, "dff12", name, "D flip flop\n12 bits", false); + setSize(40, 20); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 20), Position.TOP); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 10), Position.RIGHT); + addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] QC = (Bit[]) lastState; + if (QC == null) + { + QC = new Bit[13]; + Arrays.fill(QC, U); + } + + Bit CVal = readEnds.get("C").getValue(); + + if (QC[12] == ZERO && CVal == ONE) + System.arraycopy(readEnds.get("D").getValues().getBits(), 0, QC, 0, 12); + + readWriteEnds.get("Y").feedSignals(Arrays.copyOfRange(QC, 0, 12)); + QC[12] = CVal; + + return QC; + } + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + switch (stateID) + { + case "q": + return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12)); + default: + return super.getHighLevelState(state, stateID); + } + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + switch (stateID) + { + case "q": + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 12) + throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); + System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12); + return lastState; + default: + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modeldff12.class.getCanonicalName(), (m, p, n) -> new Modeldff12(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java new file mode 100644 index 00000000..a3e7047e --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modeldff4_finewe.java @@ -0,0 +1,110 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modeldff4_finewe extends SimpleRectangularHardcodedModelComponent +{ + public Modeldff4_finewe(LogicModelModifiable model, String name) + { + super(model, "dff4_finewe", name, "D flip flop\n4 bits", false); + setSize(35, 90); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "_WE1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(model, this, "_WE2", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(model, this, "_WE3", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); + addPin(new Pin(model, this, "_WE4", 1, PinUsage.INPUT, 0, 45), Position.RIGHT); + addPin(new Pin(model, this, "D1", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); + addPin(new Pin(model, this, "D2", 1, PinUsage.INPUT, 0, 65), Position.RIGHT); + addPin(new Pin(model, this, "D3", 1, PinUsage.INPUT, 0, 75), Position.RIGHT); + addPin(new Pin(model, this, "D4", 1, PinUsage.INPUT, 0, 85), Position.RIGHT); + addPin(new Pin(model, this, "Q1", 1, PinUsage.OUTPUT, 35, 5), Position.LEFT); + addPin(new Pin(model, this, "Q2", 1, PinUsage.OUTPUT, 35, 15), Position.LEFT); + addPin(new Pin(model, this, "Q3", 1, PinUsage.OUTPUT, 35, 25), Position.LEFT); + addPin(new Pin(model, this, "Q4", 1, PinUsage.OUTPUT, 35, 35), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] QC = (Bit[]) lastState; + if (QC == null) + QC = new Bit[] { U, U, U, U, U }; + + Bit CVal = readEnds.get("C").getValue(); + + if (QC[0] == ZERO && CVal == ONE) + for (int i = 1; i < 5; i++) + { + Bit WEiVal = readEnds.get("_WE" + i).getValue(); + if (WEiVal == X || WEiVal == Z) + QC[i] = X; + else if (WEiVal == U) + QC[i] = U; + else if (WEiVal == ZERO) + QC[i] = readEnds.get("D" + i).getValue(); + } + + QC[0] = CVal; + + readWriteEnds.get("Q1").feedSignals(QC[1]); + readWriteEnds.get("Q2").feedSignals(QC[2]); + readWriteEnds.get("Q3").feedSignals(QC[3]); + readWriteEnds.get("Q4").feedSignals(QC[4]); + + return QC; + } + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + switch (stateID) + { + case "q": + return BitVector.of(Arrays.copyOfRange((Bit[]) state, 1, 5)); + default: + return super.getHighLevelState(state, stateID); + } + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + switch (stateID) + { + case "q": + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 4) + throw new IllegalArgumentException("Expected BitVector of length 4, not " + newHighLevelStateCasted.length()); + System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 1, 4); + return lastState; + default: + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modeldff4_finewe.class.getCanonicalName(), + (m, p, n) -> new Modeldff4_finewe(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java new file mode 100644 index 00000000..981c8488 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelinc.java @@ -0,0 +1,78 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modelinc extends SimpleRectangularHardcodedModelComponent +{ + private final int logicWidth; + + public Modelinc(LogicModelModifiable model, String name, int logicWidth) + { + super(model, "inc", name, "Incrementer", false); + this.logicWidth = logicWidth; + setSize(40, 20); + addPin(new Pin(model, this, "A", logicWidth, PinUsage.INPUT, 20, 20), Position.TOP); + addPin(new Pin(model, this, "CI", 1, PinUsage.INPUT, 40, 10), Position.LEFT); + addPin(new Pin(model, this, "Y", logicWidth, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] ABits = readEnds.get("A").getValues().getBits(); + Bit CIVal = readEnds.get("CI").getValue(); + Bit[] YBits = new Bit[logicWidth]; + if (CIVal == X) + Arrays.fill(YBits, X); + else if (CIVal == U) + Arrays.fill(YBits, U); + else if (CIVal == Z) + Arrays.fill(YBits, X); + else if (CIVal == ZERO) + YBits = ABits; + else + { + Bit carry = Bit.ONE; + // TODO extract to helper. This code almost also exists in ModelAm2910RegCntr. + for (int i = logicWidth - 1; i >= 0; i--) + { + Bit a = ABits[i]; + YBits[i] = a.xor(carry); + carry = a.and(carry); + } + } + readWriteEnds.get("Y").feedSignals(YBits); + return null; + } + + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modelinc.class.getCanonicalName(), + (m, p, n) -> new Modelinc(m, n, p.getAsInt())); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java new file mode 100644 index 00000000..4304d4a2 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelnor12.java @@ -0,0 +1,61 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modelnor12 extends SimpleRectangularHardcodedModelComponent +{ + public Modelnor12(LogicModelModifiable model, String name) + { + super(model, "nor12", name, "=0", false); + setSize(35, 20); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 0, 10), Position.RIGHT); + addPin(new Pin(model, this, "Y", 1, PinUsage.OUTPUT, 35, 10), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + readWriteEnds.get("Y").feedSignals(getResult(readEnds.get("D").getValues().getBits())); + return null; + } + + private static Bit getResult(Bit[] DValArr) + { + for (int i = 0; i < 12; i++) + if (DValArr[i] == X) + return X; + for (int i = 0; i < 12; i++) + if (DValArr[i] == U) + return U; + for (int i = 0; i < 12; i++) + if (DValArr[i] == ONE) + return ZERO; + for (int i = 0; i < 12; i++) + if (DValArr[i] == Z) + return X; + return ONE; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modelnor12.class.getCanonicalName(), (m, p, n) -> new Modelnor12(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java new file mode 100644 index 00000000..53c9960d --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelram5_12.java @@ -0,0 +1,121 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modelram5_12 extends SimpleRectangularHardcodedModelComponent +{ + public Modelram5_12(LogicModelModifiable model, String name) + { + super(model, "ram5_12", name, "RAM\n5 x 12 Bit", false); + setSize(40, 40); + addPin(new Pin(model, this, "A", 3, PinUsage.INPUT, 10, 0), Position.BOTTOM); + addPin(new Pin(model, this, "B", 3, PinUsage.INPUT, 30, 0), Position.BOTTOM); + addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 0, 30), Position.RIGHT); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 40), Position.TOP); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + BitVector[] memC = (BitVector[]) lastState; + if (memC == null) + { + memC = new BitVector[6]; + Arrays.fill(memC, 0, 5, BitVector.of(U, 12)); + memC[5] = BitVector.of(U); + } + BitVector CVal = readEnds.get("C").getValues(); + BitVector oldC = memC[5]; + // TODO is the timing right? + if (oldC.getLSBit(0) == ZERO && CVal.getLSBit(0) == ONE && readEnds.get("WE").getValue() == ONE) + { + int BInt = getAsInt(readEnds.get("B").getValues()); + if (BInt == -1 || BInt > 4) + Arrays.fill(memC, BitVector.of(X, 12)); + else if (BInt == -2) + Arrays.fill(memC, BitVector.of(U, 12)); + else + memC[BInt] = readEnds.get("D").getValues(); + } + int AInt = getAsInt(readEnds.get("A").getValues()); + BitVector YVal = AInt == -1 || AInt > 4 ? BitVector.of(X, 12) : AInt == -2 ? BitVector.of(U, 12) : memC[AInt]; + readWriteEnds.get("Y").feedSignals(YVal); + memC[5] = CVal; + return memC; + } + + /** + * -1 means X, -2 means U + */ + private static int getAsInt(BitVector vect) + { + Bit[] bits = vect.getBits(); + for (int i = 0; i < 3; i++) + if (bits[i] == X) + return -1; + for (int i = 0; i < 3; i++) + if (bits[i] == U) + return -2; + for (int i = 0; i < 3; i++) + if (bits[i] == Z) + return -1; + return (bits[0] == ONE ? 4 : 0) + (bits[1] == ONE ? 2 : 0) + (bits[2] == ONE ? 1 : 0); + } + + Pattern stateIDPattern = Pattern.compile("c(0[10][10]|100)"); + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + Matcher m = stateIDPattern.matcher(stateID); + if (m.matches()) + return ((BitVector[]) state)[Integer.parseInt(m.group(1), 2)]; + return super.getHighLevelState(state, stateID); + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + Matcher m = stateIDPattern.matcher(stateID); + if (m.matches()) + { + int addr = Integer.parseInt(m.group(1), 2); + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 12) + throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); + BitVector[] memC = (BitVector[]) lastState; + memC[addr] = newHighLevelStateCasted; + return memC; + } + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modelram5_12.class.getCanonicalName(), (m, p, n) -> new Modelram5_12(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java new file mode 100644 index 00000000..7cce14a3 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/Modelsel4_12.java @@ -0,0 +1,87 @@ +package net.mograsim.logic.model.am2900.components; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class Modelsel4_12 extends SimpleRectangularHardcodedModelComponent +{ + public Modelsel4_12(LogicModelModifiable model, String name) + { + super(model, "sel4_12", name, "4-way SEL\n12 bit", false); + setSize(80, 40); + addPin(new Pin(model, this, "SA", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "SB", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(model, this, "SC", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(model, this, "SD", 1, PinUsage.INPUT, 0, 35), Position.RIGHT); + addPin(new Pin(model, this, "A", 12, PinUsage.INPUT, 10, 0), Position.BOTTOM); + addPin(new Pin(model, this, "B", 12, PinUsage.INPUT, 30, 0), Position.BOTTOM); + addPin(new Pin(model, this, "C", 12, PinUsage.INPUT, 50, 0), Position.BOTTOM); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 70, 0), Position.BOTTOM); + addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 40, 40), Position.TOP); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit SAVal = readEnds.get("SA").getValue(); + Bit SBVal = readEnds.get("SB").getValue(); + Bit SCVal = readEnds.get("SC").getValue(); + Bit SDVal = readEnds.get("SD").getValue(); + BitVector YVal; + if (SAVal == X || SBVal == X || SCVal == X || SDVal == X) + YVal = BitVector.of(X, 12); + else if (SAVal == U || SBVal == U || SCVal == U || SDVal == U) + YVal = BitVector.of(U, 12); + else if (SAVal == Z || SBVal == Z || SCVal == Z || SDVal == Z) + YVal = BitVector.of(X, 12); + else + { + YVal = null; + if (SAVal == ONE) + YVal = readEnds.get("A").getValues(); + if (SBVal == ONE) + if (YVal != null) + YVal = BitVector.of(X, 12); + else + YVal = readEnds.get("B").getValues(); + if (SCVal == ONE) + if (YVal != null) + YVal = BitVector.of(X, 12); + else + YVal = readEnds.get("C").getValues(); + if (SDVal == ONE) + if (YVal != null) + YVal = BitVector.of(X, 12); + else + YVal = readEnds.get("D").getValues(); + if (YVal == null) + YVal = BitVector.of(ZERO, 12); + } + + readWriteEnds.get("Y").feedSignals(YVal); + return null; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(Modelsel4_12.class.getCanonicalName(), (m, p, n) -> new Modelsel4_12(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java new file mode 100644 index 00000000..880d17c9 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904RegCTInstrDecode.java @@ -0,0 +1,286 @@ +package net.mograsim.logic.model.am2900.components.am2904; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2904RegCTInstrDecode extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2904RegCTInstrDecode(LogicModelModifiable model, String name) + { + super(model, "Am2904RegCTInstrDecode", name, "Instruction\ndecode", false); + setSize(80, 80); + addPin(new Pin(model, this, "I12-11", 2, PinUsage.INPUT, 0, 30), Position.RIGHT); + addPin(new Pin(model, this, "I5-0", 6, PinUsage.INPUT, 0, 50), Position.RIGHT); + // muSR MUX: + // 00: 0 + // 01: 1 + // 10: M + // 11: I + addPin(new Pin(model, this, "muSR_MUX", 2, PinUsage.OUTPUT, 80, 10), Position.LEFT); + addPin(new Pin(model, this, "muSR_OVRRET", 1, PinUsage.OUTPUT, 80, 20), Position.LEFT); + addPin(new Pin(model, this, "muSR_CINV", 1, PinUsage.OUTPUT, 80, 30), Position.LEFT); + addPin(new Pin(model, this, "muSR_WEZ", 1, PinUsage.OUTPUT, 80, 40), Position.LEFT); + addPin(new Pin(model, this, "muSR_WEC", 1, PinUsage.OUTPUT, 80, 50), Position.LEFT); + addPin(new Pin(model, this, "muSR_WEN", 1, PinUsage.OUTPUT, 80, 60), Position.LEFT); + addPin(new Pin(model, this, "muSR_WEOVR", 1, PinUsage.OUTPUT, 80, 70), Position.LEFT); + // MSR MUX: + // 000: 0 + // 001: 1 + // 010: mu + // 011: Y + // 100: I + // 101: I, invert C + // 110: Swap OVR and C + // 111: _M + addPin(new Pin(model, this, "MSR_MUX", 3, PinUsage.OUTPUT, 20, 0), Position.BOTTOM); + addPin(new Pin(model, this, "OEN", 1, PinUsage.OUTPUT, 60, 0), Position.BOTTOM); + // Y MUX: + // 00: mu + // 01: mu + // 10: M + // 11: I + addPin(new Pin(model, this, "Y_MUX", 2, PinUsage.OUTPUT, 10, 80), Position.TOP); + // CT MUX: + // see Am2900 Family Data Book, Am2904, Table 4 (CT_MUX2-0 = I3-1) + addPin(new Pin(model, this, "CT_MUX", 3, PinUsage.OUTPUT, 30, 80), Position.TOP); + addPin(new Pin(model, this, "CT_INV", 1, PinUsage.OUTPUT, 40, 80), Position.TOP); + addPin(new Pin(model, this, "CT_EXP", 1, PinUsage.OUTPUT, 50, 80), Position.TOP); + // C0 MUX: + // 00xx: 0 + // 01xx: 1 + // 10xx: CX + // 1100: muC + // 1101: _muC + // 1110: MC + // 1111: _MC + addPin(new Pin(model, this, "C0_MUX", 4, PinUsage.OUTPUT, 70, 80), Position.TOP); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] I5_0Bits = readEnds.get("I5-0").getValues().getBits(); + Bit[] I12_11Bits = readEnds.get("I12-11").getValues().getBits(); + int IAsInt = 0; + for (int i = 0; i < 6; i++) + switch (I5_0Bits[5 - i]) + { + case ONE: + IAsInt |= 1 << i; + break; + case U: + for (ReadWriteEnd e : readWriteEnds.values()) + e.feedSignals(BitVector.of(U, e.width())); + return null; + case X: + case Z: + for (ReadWriteEnd e : readWriteEnds.values()) + e.feedSignals(BitVector.of(X, e.width())); + return null; + case ZERO: + break; + default: + throw new IllegalArgumentException("Unknown enum constant: " + I5_0Bits[i]); + } + switch (IAsInt) + { + case 0: + case 2: + readWriteEnds.get("muSR_MUX").feedSignals(ONE, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 1: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 3: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 6: + case 7: + readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ONE); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 8: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 9: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 10: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 11: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 12: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 13: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ZERO); + break; + case 14: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ZERO); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 15: + readWriteEnds.get("muSR_MUX").feedSignals(ZERO, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ZERO); + readWriteEnds.get("muSR_WEC").feedSignals(ZERO); + readWriteEnds.get("muSR_WEN").feedSignals(ZERO); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + case 24: + case 25: + case 40: + case 41: + case 56: + case 57: + readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ONE); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + break; + default: + readWriteEnds.get("muSR_MUX").feedSignals(ONE, ONE); + readWriteEnds.get("muSR_OVRRET").feedSignals(ZERO); + readWriteEnds.get("muSR_CINV").feedSignals(ZERO); + readWriteEnds.get("muSR_WEZ").feedSignals(ONE); + readWriteEnds.get("muSR_WEC").feedSignals(ONE); + readWriteEnds.get("muSR_WEN").feedSignals(ONE); + readWriteEnds.get("muSR_WEOVR").feedSignals(ONE); + } + switch (IAsInt) + { + case 0: + readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ONE, ONE); + break; + case 1: + readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 2: + readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ONE, ZERO); + break; + case 3: + readWriteEnds.get("MSR_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 4: + readWriteEnds.get("MSR_MUX").feedSignals(ONE, ONE, ZERO); + break; + case 5: + readWriteEnds.get("MSR_MUX").feedSignals(ONE, ONE, ONE); + break; + case 8: + case 9: + case 24: + case 25: + case 40: + case 41: + case 56: + case 57: + readWriteEnds.get("MSR_MUX").feedSignals(ONE, ZERO, ONE); + break; + default: + readWriteEnds.get("MSR_MUX").feedSignals(ONE, ZERO, ZERO); + break; + } + readWriteEnds.get("OEN").feedSignals(I5_0Bits[0].or(I5_0Bits[1]).or(I5_0Bits[2]).or(I5_0Bits[3]).or(I5_0Bits[4]).or(I5_0Bits[5])); + readWriteEnds.get("Y_MUX").feedSignals(I5_0Bits[0], I5_0Bits[1]); + readWriteEnds.get("CT_INV").feedSignals(I5_0Bits[5]); + readWriteEnds.get("CT_MUX").feedSignals(I5_0Bits[2], I5_0Bits[3], I5_0Bits[4]); + readWriteEnds.get("CT_EXP").feedSignals((IAsInt & 0b111110) == 0b001110 ? ONE : ZERO); + readWriteEnds.get("C0_MUX").feedSignals(I12_11Bits[0], I12_11Bits[1], I5_0Bits[0], + I5_0Bits[2].and(I5_0Bits[3].not()).and(I5_0Bits[4].not())); + return null; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2904RegCTInstrDecode.class.getCanonicalName(), + (m, p, n) -> new ModelAm2904RegCTInstrDecode(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java new file mode 100644 index 00000000..3e97cc6c --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/ModelAm2904ShiftInstrDecode.java @@ -0,0 +1,323 @@ +package net.mograsim.logic.model.am2900.components.am2904; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.Z; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2904ShiftInstrDecode extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2904ShiftInstrDecode(LogicModelModifiable model, String name) + { + super(model, "Am2904ShiftInstrDecode", name, "Shift \ninstruction\ndecode", false); + setSize(60, 80); + addPin(new Pin(model, this, "I", 5, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(model, this, "_SE", 1, PinUsage.INPUT, 0, 55), Position.RIGHT); + // SIO0 MUX: + // 000: 0 + // 001: 1 + // 01x: SIOn + // 10x: QIOn + // 11x: MC + addPin(new Pin(model, this, "SIO0_MUX", 3, PinUsage.OUTPUT, 60, 5), Position.LEFT); + // SIOn MUX: + // 000: 0 + // 001: 1 + // 010: SIO0 + // 011: QIO0 + // 100: MC + // 101: MN + // 110: IC + // 111: IN xor IVOR + addPin(new Pin(model, this, "SIOn_MUX", 3, PinUsage.OUTPUT, 60, 15), Position.LEFT); + // QIO0 MUX: + // 000: 0 + // 001: 1 + // 01x: SIOn + // 10x: QIOn + // 11x: MC + addPin(new Pin(model, this, "QIO0_MUX", 3, PinUsage.OUTPUT, 60, 25), Position.LEFT); + // QIOn MUX: + // 000: 0 + // 001: 1 + // 01x: SIO0 + // 10x: QIO0 + // 11x: MN + addPin(new Pin(model, this, "QIOn_MUX", 3, PinUsage.OUTPUT, 60, 35), Position.LEFT); + addPin(new Pin(model, this, "OEn", 1, PinUsage.OUTPUT, 60, 45), Position.LEFT); + addPin(new Pin(model, this, "OE0", 1, PinUsage.OUTPUT, 60, 55), Position.LEFT); + // 00: SIO0 + // 01: QIO0 + // 1x: SIOn + addPin(new Pin(model, this, "MC_MUX", 2, PinUsage.OUTPUT, 60, 65), Position.LEFT); + addPin(new Pin(model, this, "MC_EN", 1, PinUsage.OUTPUT, 60, 75), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit _SE = readEnds.get("_SE").getValue(); + BitVector I = readEnds.get("I").getValues(); + readWriteEnds.get("OEn").feedSignals(I.getMSBit(0).not().and(_SE.not())); + readWriteEnds.get("OE0").feedSignals(I.getMSBit(0).and(_SE.not())); + if (_SE == Z || _SE == X) + { + readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("MC_MUX").feedSignals(X, X); + readWriteEnds.get("MC_EN").feedSignals(X); + return null; + } else if (_SE == U) + { + + readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U); + readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U); + readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U); + readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U); + readWriteEnds.get("MC_MUX").feedSignals(U, U); + readWriteEnds.get("MC_EN").feedSignals(U); + return null; + } else if (_SE == ONE) + { + readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("MC_MUX").feedSignals(X, X); + readWriteEnds.get("MC_EN").feedSignals(ZERO); + return null; + } + if (!I.isBinary()) + { + Bit val = null; + for (Bit b : I.getBits()) + if (!b.isBinary()) + { + val = b; + break; + } + readWriteEnds.get("SIO0_MUX").feedSignals(val, val, val); + readWriteEnds.get("SIOn_MUX").feedSignals(val, val, val); + readWriteEnds.get("QIO0_MUX").feedSignals(val, val, val); + readWriteEnds.get("QIOn_MUX").feedSignals(val, val, val); + readWriteEnds.get("MC_MUX").feedSignals(val, val); + readWriteEnds.get("MC_EN").feedSignals(val); + return null; + } + int IAsInt = I.getUnsignedValue().intValue(); + if (IAsInt < 16) + { + readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X); + switch (IAsInt) + { + case 0: + case 2: + case 6: + case 7: + readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 1: + case 3: + readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 4: + case 9: + case 12: + readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ZERO); + break; + case 5: + readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ONE); + break; + case 8: + case 10: + readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ZERO); + break; + case 11: + readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ZERO); + break; + case 13: + case 15: + readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ONE); + break; + case 14: + readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ONE); + break; + default: + throw new IllegalStateException("can't happen"); + } + switch (IAsInt) + { + case 0: + readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 1: + readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 2: + readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ONE, X); + break; + case 3: + case 4: + case 5: + case 6: + case 7: + case 11: + case 12: + case 13: + case 14: + case 15: + readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ONE, X); + break; + case 8: + case 9: + case 10: + readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ZERO, X); + break; + default: + throw new IllegalStateException("can't happen"); + } + } else + { + readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X); + readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X); + switch (IAsInt) + { + case 16: + case 18: + readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 17: + case 19: + readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 20: + case 21: + case 22: + case 23: + case 28: + case 29: + case 30: + case 31: + readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X); + break; + case 24: + case 26: + readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X); + break; + case 25: + case 27: + readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ONE, X); + break; + default: + throw new IllegalStateException("can't happen"); + } + switch (IAsInt) + { + case 16: + case 18: + case 20: + case 22: + case 27: + readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ZERO); + break; + case 17: + case 19: + case 21: + case 23: + readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ONE); + break; + case 24: + case 25: + case 26: + readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X); + break; + case 28: + case 30: + readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X); + break; + case 29: + case 31: + readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ONE, X); + break; + default: + throw new IllegalStateException("can't happen"); + } + } + // MC + switch (IAsInt) + { + case 0: + case 1: + case 3: + case 4: + case 5: + case 6: + case 10: + case 11: + case 14: + case 15: + case 18: + case 19: + case 22: + case 23: + case 26: + case 27: + case 30: + case 31: + readWriteEnds.get("MC_EN").feedSignals(ZERO); + readWriteEnds.get("MC_MUX").feedSignals(X, X); + break; + case 2: + case 8: + case 9: + readWriteEnds.get("MC_EN").feedSignals(ONE); + readWriteEnds.get("MC_MUX").feedSignals(ZERO, ZERO); + break; + case 7: + case 12: + case 13: + readWriteEnds.get("MC_EN").feedSignals(ONE); + readWriteEnds.get("MC_MUX").feedSignals(ZERO, ONE); + break; + case 16: + case 17: + case 20: + case 21: + case 24: + case 25: + case 28: + case 29: + readWriteEnds.get("MC_EN").feedSignals(ONE); + readWriteEnds.get("MC_MUX").feedSignals(ONE, X); + break; + default: + throw new IllegalStateException("can't happen"); + } + return null; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2904ShiftInstrDecode.class.getCanonicalName(), + (m, p, n) -> new ModelAm2904ShiftInstrDecode(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java new file mode 100644 index 00000000..a96b6795 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910InstrPLA.java @@ -0,0 +1,267 @@ +package net.mograsim.logic.model.am2900.components.am2910; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2910InstrPLA extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2910InstrPLA(LogicModelModifiable model, String name) + { + super(model, "Am2910InstrPLA", name, "Instr.\nPLA", false); + setSize(30, 85); + addPin(new Pin(model, this, "PASS", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "I", 4, PinUsage.INPUT, 0, 20), Position.RIGHT); + addPin(new Pin(model, this, "R=0", 1, PinUsage.INPUT, 15, 0), Position.BOTTOM); + addPin(new Pin(model, this, "_PL", 1, PinUsage.OUTPUT, 5, 85), Position.TOP); + addPin(new Pin(model, this, "_MAP", 1, PinUsage.OUTPUT, 15, 85), Position.TOP); + addPin(new Pin(model, this, "_VECT", 1, PinUsage.OUTPUT, 25, 85), Position.TOP); + addPin(new Pin(model, this, "RWE", 1, PinUsage.OUTPUT, 30, 5), Position.LEFT); + addPin(new Pin(model, this, "RDEC", 1, PinUsage.OUTPUT, 30, 15), Position.LEFT); + addPin(new Pin(model, this, "YD", 1, PinUsage.OUTPUT, 30, 25), Position.LEFT); + addPin(new Pin(model, this, "YR", 1, PinUsage.OUTPUT, 30, 35), Position.LEFT); + addPin(new Pin(model, this, "YF", 1, PinUsage.OUTPUT, 30, 45), Position.LEFT); + addPin(new Pin(model, this, "YmuPC", 1, PinUsage.OUTPUT, 30, 55), Position.LEFT); + addPin(new Pin(model, this, "STKI0", 1, PinUsage.OUTPUT, 30, 65), Position.LEFT); + addPin(new Pin(model, this, "STKI1", 1, PinUsage.OUTPUT, 30, 75), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + ReadEnd PASS = readEnds.get("PASS"); + ReadEnd I = readEnds.get("I"); + ReadEnd Req0 = readEnds.get("R=0"); + ReadWriteEnd _PL = readWriteEnds.get("_PL"); + ReadWriteEnd _MAP = readWriteEnds.get("_MAP"); + ReadWriteEnd _VECT = readWriteEnds.get("_VECT"); + ReadWriteEnd RWE = readWriteEnds.get("RWE"); + ReadWriteEnd RDEC = readWriteEnds.get("RDEC"); + ReadWriteEnd YD = readWriteEnds.get("YD"); + ReadWriteEnd YR = readWriteEnds.get("YR"); + ReadWriteEnd YF = readWriteEnds.get("YF"); + ReadWriteEnd YmuPC = readWriteEnds.get("YmuPC"); + ReadWriteEnd STKI0 = readWriteEnds.get("STKI0"); + ReadWriteEnd STKI1 = readWriteEnds.get("STKI1"); + + Bit PASSVal = PASS.getValue(); + Bit I3Val = I.getValue(3); + Bit I2Val = I.getValue(2); + Bit I1Val = I.getValue(1); + Bit I0Val = I.getValue(0); + Bit Req0Val = Req0.getValue(); + + if (!I3Val.isBinary() || !I2Val.isBinary() || !I1Val.isBinary() || !I0Val.isBinary()) + if ((I3Val == U || I3Val.isBinary()) || (I2Val == U || I2Val.isBinary()) || (I1Val == U || I1Val.isBinary()) + || (I0Val == U || I0Val.isBinary())) + { + _PL.feedSignals(U); + _MAP.feedSignals(U); + _VECT.feedSignals(U); + RWE.feedSignals(U); + RDEC.feedSignals(U); + YD.feedSignals(U); + YR.feedSignals(U); + YF.feedSignals(U); + YmuPC.feedSignals(U); + STKI0.feedSignals(U); + STKI1.feedSignals(U); + } else + { + _PL.feedSignals(X); + _MAP.feedSignals(X); + _VECT.feedSignals(X); + RWE.feedSignals(X); + RDEC.feedSignals(X); + YD.feedSignals(X); + YR.feedSignals(X); + YF.feedSignals(X); + YmuPC.feedSignals(X); + STKI0.feedSignals(X); + STKI1.feedSignals(X); + } + else + { + int IAsInt = (I3Val == ONE ? 8 : 0) + (I2Val == ONE ? 4 : 0) + (I1Val == ONE ? 2 : 0) + (I0Val == ONE ? 1 : 0); + Bit _PLVal = ONE; + Bit _MAPVal = ONE; + Bit _VECTVal = ONE; + if (IAsInt == 2) + _MAPVal = ZERO; + else if (IAsInt == 6) + _VECTVal = ZERO; + else + _PLVal = ZERO; + _PL.feedSignals(_PLVal); + _MAP.feedSignals(_MAPVal); + _VECT.feedSignals(_VECTVal); + if (IAsInt == 8 || IAsInt == 9 || IAsInt == 15) + { + RWE.feedSignals(Req0Val); + RDEC.feedSignals(Req0Val);// "forward" X/U/Z + } else if (IAsInt == 4) + { + RWE.feedSignals(PASSVal); + RDEC.feedSignals(PASSVal == ONE ? ZERO : PASSVal);// "forward" X/U/Z + } else + { + RWE.feedSignals(ZERO); + RDEC.feedSignals(ZERO); + } + if (!PASSVal.isBinary()) + { + YD.feedSignals(PASSVal);// "forward" X/U/Z + YR.feedSignals(PASSVal);// "forward" X/U/Z + YF.feedSignals(PASSVal);// "forward" X/U/Z + YmuPC.feedSignals(PASSVal);// "forward" X/U/Z + } else + { + Bit YDVal = ZERO; + Bit YRVal = ZERO; + Bit YFVal = ZERO; + Bit YmuPCVal = ZERO; + switch (IAsInt + (PASSVal == ONE ? 16 : 0)) + { + case 0: + case 0 + 16: + break; + case 2: + case 1 + 16: + case 2 + 16: + case 3 + 16: + case 5 + 16: + case 6 + 16: + case 7 + 16: + case 11 + 16: + YDVal = ONE; + break; + case 5: + case 7: + YRVal = ONE; + break; + case 13: + case 10 + 16: + YFVal = ONE; + break; + case 1: + case 3: + case 4: + case 6: + case 10: + case 11: + case 12: + case 14: + case 4 + 16: + case 12 + 16: + case 13 + 16: + case 14 + 16: + case 15 + 16: + YmuPCVal = ONE; + break; + case 8: + case 8 + 16: + YFVal = Req0Val.not();// "forward" X/U/Z + YmuPCVal = Req0Val;// "forward" X/U/Z + break; + case 9: + case 9 + 16: + YDVal = Req0Val.not();// "forward" X/U/Z + YmuPCVal = Req0Val;// "forward" X/U/Z + break; + case 15: + YFVal = Req0Val.not();// "forward" X/U/Z + YDVal = Req0Val;// "forward" X/U/Z + break; + default: + throw new IllegalStateException("shouldn't happen"); + } + YD.feedSignals(YDVal); + YR.feedSignals(YRVal); + YF.feedSignals(YFVal); + YmuPC.feedSignals(YmuPCVal); + Bit STKI0Val; + Bit STKI1Val; + switch (IAsInt + (PASSVal == ONE ? 16 : 0)) + { + case 1: + case 2: + case 3: + case 6: + case 7: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 2 + 16: + case 3 + 16: + case 6 + 16: + case 7 + 16: + case 9 + 16: + case 12 + 16: + case 14 + 16: + // HOLD + STKI1Val = ZERO; + STKI0Val = ZERO; + break; + case 4: + case 5: + case 1 + 16: + case 4 + 16: + case 5 + 16: + // PUSH + STKI1Val = ZERO; + STKI0Val = ONE; + break; + case 0: + case 0 + 16: + // CLEAR + STKI1Val = ONE; + STKI0Val = ZERO; + break; + case 10 + 16: + case 11 + 16: + case 13 + 16: + case 15 + 16: + // POP + STKI1Val = ONE; + STKI0Val = ONE; + break; + case 8: + case 15: + case 8 + 16: + STKI1Val = Req0Val;// "forward" X/U/Z + STKI0Val = Req0Val;// "forward" X/U/Z + break; + default: + throw new IllegalStateException("shouldn't happen"); + } + STKI0.feedSignals(STKI0Val); + STKI1.feedSignals(STKI1Val); + } + } + return null; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2910InstrPLA.class.getCanonicalName(), + (m, p, n) -> new ModelAm2910InstrPLA(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java new file mode 100644 index 00000000..0c101bb4 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910RegCntr.java @@ -0,0 +1,113 @@ +package net.mograsim.logic.model.am2900.components.am2910; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Arrays; +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2910RegCntr extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2910RegCntr(LogicModelModifiable model, String name) + { + super(model, "Am2910RegCntr", name, "Register/\nCounter", false); + setSize(40, 40); + addPin(new Pin(model, this, "D", 12, PinUsage.INPUT, 20, 0), Position.BOTTOM); + addPin(new Pin(model, this, "_RLD", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "WE", 1, PinUsage.INPUT, 0, 20), Position.RIGHT); + addPin(new Pin(model, this, "DEC", 1, PinUsage.INPUT, 0, 30), Position.RIGHT); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 40, 20), Position.LEFT); + addPin(new Pin(model, this, "Y", 12, PinUsage.OUTPUT, 20, 40), Position.TOP); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + Bit[] QC = (Bit[]) lastState; + if (QC == null) + { + QC = new Bit[13]; + Arrays.fill(QC, U); + } + + ReadEnd D = readEnds.get("D"); + ReadEnd _RLD = readEnds.get("_RLD"); + ReadEnd WE = readEnds.get("WE"); + ReadEnd DEC = readEnds.get("DEC"); + ReadEnd C = readEnds.get("C"); + ReadWriteEnd Y = readWriteEnds.get("Y"); + + Bit oldCVal = QC[12]; + Bit CVal = C.getValue(); + + // TODO handle U/X/Z + if (oldCVal == ZERO && CVal == ONE) + { + if ((DEC.getValue() == ZERO && WE.getValue() == ONE) || _RLD.getValue() == ZERO) + System.arraycopy(D.getValues().getBits(), 0, QC, 0, 12); + else if (WE.getValue() == ONE) + { + Bit carry = Bit.ZERO; + // TODO extract to helper. This code almost also exists in Modelinc. + for (int i = 11; i >= 0; i--) + { + Bit a = QC[i]; + QC[i] = a.xnor(carry); + carry = a.or(carry); + } + } + } + QC[12] = CVal; + Y.feedSignals(Arrays.copyOfRange(QC, 0, 12)); + + return QC; + } + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + switch (stateID) + { + case "q": + return BitVector.of(Arrays.copyOfRange((Bit[]) state, 0, 12)); + default: + return super.getHighLevelState(state, stateID); + } + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + switch (stateID) + { + case "q": + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 12) + throw new IllegalArgumentException("Expected BitVector of length 12, not " + newHighLevelStateCasted.length()); + System.arraycopy(newHighLevelStateCasted.getBits(), 0, lastState, 0, 12); + return lastState; + default: + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2910RegCntr.class.getCanonicalName(), + (m, p, n) -> new ModelAm2910RegCntr(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java new file mode 100644 index 00000000..a99fe0d5 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/ModelAm2910SP.java @@ -0,0 +1,134 @@ +package net.mograsim.logic.model.am2900.components.am2910; + +import static net.mograsim.logic.core.types.Bit.ONE; +import static net.mograsim.logic.core.types.Bit.U; +import static net.mograsim.logic.core.types.Bit.X; +import static net.mograsim.logic.core.types.Bit.ZERO; + +import java.util.Map; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class ModelAm2910SP extends SimpleRectangularHardcodedModelComponent +{ + public ModelAm2910SP(LogicModelModifiable model, String name) + { + super(model, "Am2910SP", name, "Stack\npointer", false); + setSize(40, 30); + addPin(new Pin(model, this, "STKI0", 1, PinUsage.INPUT, 0, 5), Position.RIGHT); + addPin(new Pin(model, this, "STKI1", 1, PinUsage.INPUT, 0, 15), Position.RIGHT); + addPin(new Pin(model, this, "C", 1, PinUsage.INPUT, 0, 25), Position.RIGHT); + addPin(new Pin(model, this, "A", 3, PinUsage.OUTPUT, 10, 30), Position.TOP); + addPin(new Pin(model, this, "B", 3, PinUsage.OUTPUT, 30, 30), Position.TOP); + addPin(new Pin(model, this, "_FULL", 1, PinUsage.OUTPUT, 40, 15), Position.LEFT); + + init(); + } + + @Override + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + BitAndInt SPC = (BitAndInt) lastState; + if (SPC == null) + { + SPC = new BitAndInt(); + SPC.bit = U; + SPC.i = -2; + } + int SP = SPC.i; + + Bit STKI0Val = readEnds.get("STKI0").getValue(); + Bit STKI1Val = readEnds.get("STKI1").getValue(); + Bit CVal = readEnds.get("C").getValue(); + if (SPC.bit == ZERO && CVal == ONE) + if (STKI0Val == U && STKI1Val == U) + SP = -2; + else if (!STKI0Val.isBinary() || !STKI1Val.isBinary()) + SP = -1; + else if (STKI0Val == ONE && STKI1Val == ZERO) + { + // PUSH + if (SP >= 0) + SP = SP == 5 ? 5 : SP + 1; + } else if (STKI0Val == ZERO && STKI1Val == ONE) + // CLEAR + SP = 0; + else if (STKI0Val == ONE && STKI1Val == ONE) + // POP + SP = SP <= 0 ? SP : SP - 1; + readWriteEnds.get("A").feedSignals(getAsBitVector(SP == 0 ? 7 : SP < 0 ? SP : SP - 1)); + readWriteEnds.get("B").feedSignals(getAsBitVector(SP == 5 ? 4 : SP)); + readWriteEnds.get("_FULL").feedSignals(SP == -2 ? U : SP == -1 ? X : SP == 5 ? ZERO : ONE); + + SPC.i = SP; + SPC.bit = CVal; + return SPC; + } + + @Override + protected Object getHighLevelState(Object state, String stateID) + { + switch (stateID) + { + case "q": + return getAsBitVector(((BitAndInt) state).i); + default: + return super.getHighLevelState(state, stateID); + } + } + + @Override + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + switch (stateID) + { + case "q": + int i; + BitVector newHighLevelStateCasted = (BitVector) newHighLevelState; + if (newHighLevelStateCasted.length() != 3) + throw new IllegalArgumentException("Expected BitVector of length 3, not " + newHighLevelStateCasted.length()); + if (newHighLevelStateCasted.isBinary()) + i = newHighLevelStateCasted.getUnsignedValue().intValue(); + else + i = -1;// this makes setting to U impossible + if (i > 5) + throw new IllegalArgumentException("Given value not in range (0-5 incl.): " + i); + ((BitAndInt) lastState).i = i; + return lastState; + default: + return super.setHighLevelState(lastState, stateID, newHighLevelState); + } + } + + private static class BitAndInt + { + Bit bit; + int i; + } + + /** + * -1 means X, -2 means U + */ + private static BitVector getAsBitVector(int i) + { + if (i == -1) + return BitVector.of(X, 3); + if (i == -2) + return BitVector.of(U, 3); + return BitVector.of((i & 0b100) > 0 ? ONE : ZERO, (i & 0b10) > 0 ? ONE : ZERO, (i & 0b1) > 0 ? ONE : ZERO); + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelAm2910SP.class.getCanonicalName(), (m, p, n) -> new ModelAm2910SP(m, n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java new file mode 100644 index 00000000..0a0787cc --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java @@ -0,0 +1,104 @@ +package net.mograsim.logic.model.am2900.machine; + +import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory; +import net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MachineDefinition; +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.Register; +import net.mograsim.machine.mi.MicroInstructionMemory; +import net.mograsim.machine.mi.StandardMicroInstructionMemory; +import net.mograsim.machine.standard.memory.WordAddressableMemory; + +public class Am2900Machine implements Machine +{ + private Am2900MachineDefinition machineDefinition; + private LogicModelModifiable logicModel; + private Timeline timeline; + private MainMemory mainMemory; + private MicroInstructionMemory instMemory; + private CoreClock clock; + + public Am2900Machine(Am2900MachineDefinition am2900MachineDefinition) + { + this.machineDefinition = am2900MachineDefinition; + logicModel = new LogicModelModifiable(); + IndirectModelComponentCreator.createComponent(logicModel, + "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", "Am2900"); + CoreModelParameters params = new CoreModelParameters(); + params.gateProcessTime = 50; + params.wireTravelTime = 10; + mainMemory = new WordAddressableMemory(am2900MachineDefinition.getMainMemoryDefinition()); + instMemory = new StandardMicroInstructionMemory(am2900MachineDefinition.getMicroInstructionMemoryDefinition()); + logicModel.getComponentBySubmodelPath("Am2900.Am2900MainMemory#0", ModelAm2900MainMemory.class).setMachine(this); + logicModel.getComponentBySubmodelPath("Am2900.Am2900MicroInstructionMemory#0", ModelAm2900MicroInstructionMemory.class) + .setMachine(this); + timeline = LogicCoreAdapter.convert(logicModel, params); + } + + @Override + public MachineDefinition getDefinition() + { + return machineDefinition; + } + + @Override + public void reset() + { + // TODO Auto-generated method stub + + } + + @Override + public LogicModel getModel() + { + return logicModel; + } + + @Override + public Timeline getTimeline() + { + return timeline; + } + + @Override + public CoreClock getClock() + { + return clock; + } + + @Override + public BitVector getRegister(Register r) + { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setRegister(Register r, BitVector value) + { + // TODO Auto-generated method stub + + } + + @Override + public MainMemory getMainMemory() + { + return mainMemory; + } + + @Override + public MicroInstructionMemory getMicroInstructionMemory() + { + return instMemory; + } + +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java new file mode 100644 index 00000000..0ac06ea7 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MachineDefinition.java @@ -0,0 +1,63 @@ +package net.mograsim.logic.model.am2900.machine; + +import java.util.Objects; +import java.util.Set; + +import net.mograsim.machine.ISASchema; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MachineDefinition; +import net.mograsim.machine.MachineRegistry; +import net.mograsim.machine.MainMemoryDefinition; +import net.mograsim.machine.Register; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public class Am2900MachineDefinition implements MachineDefinition +{ + private MainMemoryDefinition memoryDefinition = new Am2900MainMemoryDefinition(); + private MicroInstructionMemoryDefinition microInstMemoryDefinition = new Am2900MicroInstructionMemoryDefinition(); + private final static Am2900MachineDefinition instance = new Am2900MachineDefinition(); + + public static Am2900MachineDefinition getInstance() + { + return Objects.requireNonNullElseGet((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"), + () -> instance); + } + + @Override + public Machine createNew() + { + return new Am2900Machine(this); + } + + @Override + public ISASchema getISASchema() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public Set getRegisters() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public int getAddressBits() + { + return 16; + } + + @Override + public MainMemoryDefinition getMainMemoryDefinition() + { + return memoryDefinition; + } + + @Override + public MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition() + { + return microInstMemoryDefinition; + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java new file mode 100644 index 00000000..478ec242 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MainMemoryDefinition.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.machine; + +import net.mograsim.machine.MainMemoryDefinition; + +public class Am2900MainMemoryDefinition implements MainMemoryDefinition +{ + + @Override + public int getMemoryAddressBits() + { + return 16; + } + + @Override + public long getMinimalAddress() + { + return 0; + } + + @Override + public long getMaximalAddress() + { + return 0xFFFF; + } + + @Override + public int getCellWidth() + { + return 16; + } + +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java new file mode 100644 index 00000000..3657bed9 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionDefinition.java @@ -0,0 +1,112 @@ +package net.mograsim.logic.model.am2900.machine; + +import java.util.Arrays; +import java.util.Optional; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.BooleanClassification; +import net.mograsim.machine.mi.parameters.IntegerClassification; +import net.mograsim.machine.mi.parameters.MnemonicFamily; +import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair; +import net.mograsim.machine.mi.parameters.ParameterClassification; + +public class Am2900MicroInstructionDefinition implements MicroInstructionDefinition +{ + private static final BooleanClassification interruptEnable = new BooleanClassification(false, "IE", "Dis"); + // not implemented, because not documented. + private static final MnemonicFamily interruptInstructions = new MnemonicFamily("X", new MnemonicPair("X", BitVector.of(Bit.ZERO, 4))); + private static final BooleanClassification kmux = new BooleanClassification(false, "D", "K"); + private static final MnemonicFamily am2901SrcInstructions = new MnemonicFamily("AB", "AQ", "AB", "ZQ", "ZB", "ZA", "DA", "DQ", "DZ"); + private static final MnemonicFamily am2901FuncInstructions = new MnemonicFamily("ADD", "ADD", "SUBR", "SUBS", "OR", "AND", "NOTRS", + "EXOR", "EXNOR"); + private static final MnemonicFamily am2901DestInstructions = new MnemonicFamily("NOP", "QREG", "NOP", "RAMA", "RAMF", "RAMQD", "RAMD", + "RAMQU", "RAMU"); + private static final IntegerClassification register = new IntegerClassification(0, 4); + private static final BooleanClassification registerSelect = new BooleanClassification(false, "MR", "IR"); + private static final BooleanClassification abus = new BooleanClassification(true, "H", "AB"); + private static final BooleanClassification dbus = new BooleanClassification(true, "H", "DB"); + private static final MnemonicFamily am2904CarryInstructions = new MnemonicFamily("CI0", "CI0", "CI1", "CIX", "CIC"); + private static final MnemonicFamily am2904ShiftInstructions = new MnemonicFamily("RSL / LSLCO", "RSL / LSLCO", "RSH / LSHCO", + "RSCONI / LSL", "RSDH / LSH", "RSDC / LSDLCO", "RSDN / LSDHCO", "RSDL / LSDL", "RSDCO / LSDH", "RSRCO / LSCRO", + "RSRCIO / LSCRIO", "RSR / LSR", "RSDIC / LSLICI", "RSDRCI / LSDCIO", "RSDRCO / LSDRCO", "RSDXOR / LSDCI", "RSDR / LDSR"); +// private static final MnemonicFamily am2904StatusInstructions = new MnemonicFamily( +// new String[] { "MI_Zero", "MI_NotZero", "MI_UGTEQ", "MI_ULT", "MI_UGT", "MI_ULTEQ", "MI_SGTEQ", "MI_SLT", "MI_SGT", "MI_SLTEQ", +// "MA_Zero", "MA_NotZero", "MA_UGTEQ", "MA_ULT", "MA_UGT", "MA_ULTEQ", "MA_SGTEQ", "MA_SLT", "MA_SGT", "MA_SLTEQ" }, +// new long[] { 0b01_0101, 0b01_0100, 0b01_1101, 0b01_1100, 0b01_1110, 0b01_1111, 0b01_0010, 0b01_0011, 0b01_0000, 0b01_0001, +// 0b10_0101, 0b10_0100, 0b10_1101, 0b10_1100, 0b10_1110, 0b10_1111, 0b10_0010, 0b10_0011, 0b10_0000, 0b10_0001 }, +// 6); + // TODO: Maybe "X" and "notX" are swapped. + private static final MnemonicFamily am2904StatusInstructions = new MnemonicFamily("Load_Load_I_Z", "LoadM_LoadY_µ_NxorOVRorZ", + "Set_Set_µ_NxnorOVRornotZ", "Swap_Swap_µ_NxorOVR", "Reset_Reset_µ_NxnorOVR", "Load_LoadForShiftThroughOvr_µ_Z", + "Load_Invert_µ_notZ", "LoadOvrRetain_Load_µ_OVR", "LoadOvrRetain_Load_µ_notOVR", "ResetZ_LoadCarryInvert_µ_CorZ", + "SetZ_LoadCarryInvert_µ_notCandnotZ", "ResetC_Load_µ_C", "SetC_Load_µ_notC", "ResetN_Load_µ_notCorZ", "SetN_Load_µ_CandnotZ", + "ResetOvr_Load_IM_NxorN", "SetOvr_Load_IM_NxnorN", "Load_Load_µ_NxorOVRorZ", "Load_Load_µ_NxnorOVRornotZ", + "Load_Load_µ_NxorOVR", "Load_Load_µ_NxnorOVR", "Load_Load_µ_Z", "Load_Load_µ_notZ", "Load_Load_µ_OVR", "Load_Load_µ_notOVR", + "LoadCarryInvert_LoadCarryInvert_µ_CorZ", "LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ", "Load_Load_µ_C", "Load_Load_µ_notC", + "Load_Load_µ_notCorZ", "Load_Load_µ_CandnotZ", "Load_Load_µ_N", "Load_Load_µ_notN", "Load_Load_M_NxorOVRorZ", + "Load_Load_M_NxnorOVRornotZ", "Load_Load_M_NxorOVR", "Load_Load_M_NxnorOVR", "Load_Load_M_Z", "Load_Load_M_notZ", + "Load_Load_M_OVR", "Load_Load_M_notOVR", "LoadCarryInvert_LoadCarryInvert_M_CorZ", + "LoadCarryInvert_LoadCarryInvert_M_notCandnotZ", "Load_Load_M_C", "Load_Load_M_notC", "Load_Load_M_notCorZ", + "Load_Load_M_CandnotZ", "Load_Load_M_N", "Load_Load_M_notN", "Load_Load_I_NxorOVRorZ", "Load_Load_I_NxnorOVRornotZ", + "Load_Load_I_NxorOVR", "Load_Load_I_NxnorOVR", "Load_Load_I_Z", "Load_Load_I_notZ", "Load_Load_I_OVR", "Load_Load_I_notOVR", + "LoadCarryInvert_LoadCarryInvert_I_notCorZ", "LoadCarryInvert_LoadCarryInvert_I_CandnotZ", "Load_Load_I_C", "Load_Load_I_notC", + "Load_Load_I_notCorZ", "Load_Load_I_CandnotZ", "Load_Load_I_N", "Load_Load_I_notN"); + private static final BooleanClassification ccen = new BooleanClassification(true, "PS", "C"); + private static final MnemonicFamily am2910Instructions = new MnemonicFamily("CONT", "JZ", "CJS", "JMAP", "CJP", "PUSH", "JSRP", "CJV", + "JRP", "RFCT", "RPCT", "CRTN", "CJPP", "LDCT", "LOOP", "CONT", "TWB"); + + private static final IntegerClassification constant_12bit = new IntegerClassification(0, 12); + private static final IntegerClassification constant_16bit = new IntegerClassification(0, 16); + private static final BooleanClassification hE = new BooleanClassification(true, "H", "E"); + private static final BooleanClassification hI = new BooleanClassification(true, "H", "I"); + private static final BooleanClassification hL = new BooleanClassification(true, "H", "L"); + private static final BooleanClassification rW = new BooleanClassification(true, "R", "W"); + + private static final ParameterClassification[] classes = { interruptEnable, interruptInstructions, kmux, constant_16bit, + am2901SrcInstructions, am2901FuncInstructions, am2901DestInstructions, register, registerSelect, register, registerSelect, abus, + dbus, am2904CarryInstructions, am2904ShiftInstructions, hL, hL, am2904StatusInstructions, ccen, am2910Instructions, + constant_12bit, hL, hE, hI, hE, hL, rW }; + + private static final String[] paramDesc = { "Allow interrupts?", "Interrupt instructions; omitted for simplicity", + "Get D-input from data bus/constant value", "Constant value", "Operand sources for ALU operation", "ALU operation", + "Destination of ALU calculation", "Register for A-operand", "Get A-operand from instruction register/micro instruction?", + "Register for B-operand", "Get B-operand from instruction register/micro instruction?", + "Put data from Y-output on address bus?", "Put data from Y-output on data bus?", "Source for carry-in", "Shift instructions", + "Modify micro status register?", "Modify macro status register?", "Operations on the status register", + "Is conditional jump enabled?", "Instructions for the micro instruction pointer", "Absolute address of a micro instruction", + "Load instruction pointer from data bus?", "Put instruction pointer on data bus?", "Increment instruction pointer?", + "Put instruction pointer on address bus?", "Load instruction register from data bus?", "Read from/Write to main memory?" }; + + @Override + public ParameterClassification[] getParameterClassifications() + { + return classes; + } + + @Override + public ParameterClassification getParameterClassification(int index) + { + return classes[index]; + } + + @Override + public Optional getParameterDescription(int index) + { + return Optional.of(paramDesc[index]); + } + + public static void main(String[] args) + { + String s = "new BooleanClassification(\"R\", \"W\"), hL, new BooleanClassification(\"H\", \"E\"),\r\n" + + " new BooleanClassification(\"H\", \"I\"), new BooleanClassification(\"H\", \"E\"), hL, new IntegerClassification(12), am2910Instructions,\r\n" + + " new BooleanClassification(\"PS\", \"C\"), am2904StatusInstructions, hL, hL, am2904ShiftInstructions, am2904CarryInstructions,\r\n" + + " new BooleanClassification(\"H\", \"DB\"), new BooleanClassification(\"H\", \"AB\"), registerSelect, register, registerSelect, register,\r\n" + + " am2901DestInstructions, am2901FuncInstructions, am2901SrcInstructions, new IntegerClassification(16),\r\n" + + " new BooleanClassification(\"D\", \"K\"), interruptInstructions, new BooleanClassification(\"Dis\", \"IE\")"; + s = s.replaceAll("[\r\n\t]", ""); + System.out.print(Arrays.stream(s.split(", new")).reduce((a, b) -> b + ", new" + a)); +// System.out.println(Arrays.stream(paramDesc).reduce("", (a, b) -> String.format("\"%s\", %s", b, a))); + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java new file mode 100644 index 00000000..01b83212 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900MicroInstructionMemoryDefinition.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.am2900.machine; + +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public class Am2900MicroInstructionMemoryDefinition implements MicroInstructionMemoryDefinition +{ + + @Override + public int getMemoryAddressBits() + { + return 12; + } + + @Override + public long getMinimalAddress() + { + return 0; + } + + @Override + public long getMaximalAddress() + { + return 4096; + } + + @Override + public MicroInstructionDefinition getMicroInstructionDefinition() + { + return new Am2900MicroInstructionDefinition(); + } +} diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json new file mode 100644 index 00000000..b753895c --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/standardComponentIDMapping.json @@ -0,0 +1,68 @@ +{ + "version": "0.1.0", + "map": { + "Am2900MainMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory", + "Am2900MicroInstructionMemory": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory", + "Am2904RegCTInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904RegCTInstrDecode", + "Am2904ShiftInstrDecode": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2904.ModelAm2904ShiftInstrDecode", + "Am2910InstrPLA": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910InstrPLA", + "Am2910RegCntr": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910RegCntr", + "Am2910SP": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.am2910.ModelAm2910SP", + "dff12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff12", + "dff4_finewe": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modeldff4_finewe", + "inc": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelinc", + "nor12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelnor12", + "ram5_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelram5_12", + "sel4_12": "resloader:Am2900Loader:class:net.mograsim.logic.model.am2900.components.Modelsel4_12", + "Am2900": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", + "Am2901": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901.json", + "Am2901ALUFuncDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUFuncDecode.json", + "Am2901ALUInclDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclDecode.json", + "Am2901ALUInclSourceDecodeInclFunctionDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUInclSourceDecodeInclFunctionDecode.json", + "Am2901ALUOneBit": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901ALUOneBit.json", + "Am2904": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904.json", + "Am2910": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2910/Am2910.json", + "Am2904MSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904MSR.json", + "Am2904muSR": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904muSR.json", + "Am2904TestLogic": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2904/Am2904TestLogic.json", + "Am2901DestDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901DestDecode.json", + "Am2901SourceDecode": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/am2901/Am2901SourceDecode.json", + "_rsLatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/_rsLatch.json", + "and": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and.json", + "and41": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/and41.json", + "andor414": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/andor414.json", + "demux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/demux2.json", + "dff": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff.json", + "dff4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4.json", + "dff4_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff4_invwe.json", + "dff8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff8.json", + "dff12_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff12_we.json", + "dff16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16.json", + "dff16_we": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_we.json", + "dff16_invwe": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff16_invwe.json", + "dff80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dff80.json", + "dlatch": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch.json", + "dlatch4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch4.json", + "dlatch8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch8.json", + "dlatch80": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/dlatch80.json", + "fulladder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/fulladder.json", + "halfadder": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/halfadder.json", + "mux1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1.json", + "mux1_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_4.json", + "mux1_8": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_8.json", + "mux1_12": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_12.json", + "mux1_16": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux1_16.json", + "mux2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux2.json", + "mux3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/mux3.json", + "nand3": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/nand3.json", + "not4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/not4.json", + "or4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or4.json", + "or_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/or_4.json", + "ram2": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram2.json", + "ram4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/ram4.json", + "sel1": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel1.json", + "sel2_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel2_4.json", + "sel3_4": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/sel3_4.json", + "xor": "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/xor.json" + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java new file mode 100644 index 00000000..7a161348 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GenerateDff80HighLevelStateHandler.java @@ -0,0 +1,74 @@ +package net.mograsim.logic.model.examples; + +import java.util.ArrayList; + +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler.BitVectorSplittingAtomicHighLevelStateHandlerParams; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler.DelegatingAtomicHighLevelStateHandlerParams; + +public class GenerateDff80HighLevelStateHandler +{ + public static void main(String[] args) + { + Am2900Loader.setup(); + LogicModelModifiable model = new LogicModelModifiable(); + DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, null, null, null); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#0");// LSB + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#1"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#2"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#3"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#4"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#5"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#6"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#7"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#8"); + IndirectModelComponentCreator.createComponent(comp.getSubmodelModifiable(), "dff8", "dff8#9");// MSB + + StandardHighLevelStateHandler hlsh = new StandardHighLevelStateHandler(comp); + comp.setHighLevelStateHandler(hlsh); + BitVectorSplittingAtomicHighLevelStateHandlerParams p = new BitVectorSplittingAtomicHighLevelStateHandlerParams(); + p.vectorPartLengthes = new ArrayList<>(); + p.vectorPartTargets = new ArrayList<>(); + for (int i = 0; i < 10; i++) + { + addHandlersForByte(comp, hlsh, i, p); + } + hlsh.addAtomicHighLevelState("q", new BitVectorSplittingAtomicHighLevelStateHandler(comp, p)); + + System.out.println(comp.getHighLevelStateHandler().getParamsForSerializingJSON(new IdentifyParams())); + } + + private static void addHandlersForByte(SubmodelComponent comp, StandardHighLevelStateHandler hlsh, int LSByteIndex, + BitVectorSplittingAtomicHighLevelStateHandlerParams p2) + { + // TODO remove the "+ 1" as soon as HighLevelStates count from 0 + // Also replace the 1 in "bitIndexInByte = 1" below with a 0 + int LSBitIndex = LSByteIndex * 8 + 1; + int MSBitIndex = LSBitIndex + 7; + String dffThisByte = "dff8#" + LSByteIndex; + String thisByteHLSID = "q" + MSBitIndex + "-" + LSBitIndex; + + p2.vectorPartLengthes.add(0, 8); + p2.vectorPartTargets.add(0, thisByteHLSID); + + DelegatingAtomicHighLevelStateHandlerParams p = new DelegatingAtomicHighLevelStateHandlerParams(); + p.delegateTarget = dffThisByte; + p.subStateID = "q"; + hlsh.addAtomicHighLevelState(thisByteHLSID, new DelegatingAtomicHighLevelStateHandler(comp, p)); + for (int bitIndexOuter = LSBitIndex, bitIndexInByte = 1; bitIndexOuter <= MSBitIndex; bitIndexOuter++, bitIndexInByte++) + { + p = new DelegatingAtomicHighLevelStateHandlerParams(); + p.delegateTarget = dffThisByte; + p.subStateID = "q" + bitIndexInByte; + hlsh.addAtomicHighLevelState("q" + bitIndexOuter, new DelegatingAtomicHighLevelStateHandler(comp, p)); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java new file mode 100644 index 00000000..1e654c80 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ModelComponentTestbench.java @@ -0,0 +1,58 @@ +package net.mograsim.logic.model.examples; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelComponentTestbench +{ + public static void main(String[] args) + { + SimpleLogicUIStandalone.executeVisualisation(ModelComponentTestbench::createTestbench); + } + + @SuppressWarnings("unused") // for ModelWires being created + public static void createTestbench(LogicModelModifiable model) + { + Am2900Loader.setup(); + ModelComponent comp = IndirectModelComponentCreator.createComponent(model, "Am2900"); + + List inputPinNames = new ArrayList<>(); + List outputPinNames = new ArrayList<>(); + for (Pin p : comp.getPins().values()) + if (p.usage == PinUsage.INPUT) + inputPinNames.add(p.name); + else + outputPinNames.add(p.name); + + inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); + outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); + + comp.moveTo(100, 0); + for (int i = 0; i < inputPinNames.size(); i++) + { + String pinName = inputPinNames.get(i); + ModelManualSwitch sw = new ModelManualSwitch(model, comp.getPin(pinName).logicWidth); + sw.moveTo(0, 20 * i); + new ModelWire(model, comp.getPin(pinName), sw.getOutputPin()); + } + for (int i = 0; i < outputPinNames.size(); i++) + { + String pinName = outputPinNames.get(i); + ModelBitDisplay bd = new ModelBitDisplay(model, comp.getPin(pinName).logicWidth); + bd.moveTo(200, 20 * i); + new ModelWire(model, comp.getPin(pinName), bd.getInputPin()); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java new file mode 100644 index 00000000..f34bf342 --- /dev/null +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/ReserializeAndVerifyJSONs.java @@ -0,0 +1,363 @@ +package net.mograsim.logic.model.examples; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.Scanner; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; + +public class ReserializeAndVerifyJSONs +{ + public static double GRIDSIZE = 2.5; + public static boolean changePinUsages = false; + public static boolean changeComponentNames = false; + public static boolean snapWCPs = true; + public static boolean warnNonSnappedPoints = true; + public static boolean warnNonVertHorizLines = true; + public static boolean warnRedundantWires = true; + + public static void main(String[] args) throws IOException + { + Am2900Loader.setup(); + try (Scanner sysin = new Scanner(System.in)) + { + System.out.print("Directory to search for JSONs in / JSON file to reserialize >"); + Path root = Paths.get(sysin.nextLine()); + if (!Files.exists(root)) + throw new IllegalArgumentException("Path doesn't exist"); + if (Files.isRegularFile(root)) + reserializeJSON(root, sysin); + else + { + System.out.print("Recursive? >"); + boolean recursive = Boolean.valueOf(sysin.nextLine()); + try (Stream jsons = recursive ? Files.walk(root) : Files.list(root)) + { + jsons.filter(Files::isRegularFile).filter(p -> p.getFileName().toString().endsWith(".json")) + .forEach(j -> reserializeJSON(j, sysin)); + } + } + } + } + + public static void reserializeJSON(Path componentPath, Scanner sysin) + { + try + { + DeserializedSubmodelComponent comp = (DeserializedSubmodelComponent) IndirectModelComponentCreator + .createComponent(new LogicModelModifiable(), "jsonfile:" + componentPath.toString()); + System.out.println("Reserializing " + componentPath); + LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); + Map componentNameRemapping = new HashMap<>(); + + if (changePinUsages) + changePinUsages(sysin, comp); + if (changeComponentNames) + changeComponentNames(sysin, submodelModifiable, componentNameRemapping); + if (snapWCPs) + snapWCPs(submodelModifiable); + if (warnNonSnappedPoints) + warnNonSnappedPoints(comp, submodelModifiable); + if (warnNonVertHorizLines) + warnNonVertHorizLines(submodelModifiable); + if (warnRedundantWires) + warnRedundantWires(submodelModifiable); + + SubmodelComponentSerializer.serialize(comp, componentPath.toString()); + + if (changeComponentNames) + changeComponentNames_AfterSerialization(sysin, comp, componentNameRemapping); + } + catch (Exception e) + { + System.err.println("An error occurred visiting " + componentPath + ":"); + e.printStackTrace(); + } + } + + private static void warnRedundantWires(LogicModelModifiable submodelModifiable) + { + Map> connectedPinGroups = new HashMap<>(); + submodelModifiable.getComponentsByName().values().stream().map(ModelComponent::getPins).map(Map::values).flatMap(Collection::stream) + .forEach(p -> connectedPinGroups.put(p, new HashSet<>(Arrays.asList(p)))); + submodelModifiable.getWiresByName().values().forEach(w -> + { + Pin pin1 = w.getPin1(); + Pin pin2 = w.getPin2(); + Set pin1Group = connectedPinGroups.get(pin1); + Set pin2Group = connectedPinGroups.get(pin2); + if (pin1Group == pin2Group) + System.out.println(" Wire " + w.name + " connecting " + pin1 + " and " + pin2 + " is redundant"); + else + { + pin1Group.addAll(pin2Group); + pin2Group.forEach(p -> connectedPinGroups.put(p, pin1Group)); + } + }); + } + + private static void changePinUsages(Scanner sysin, DeserializedSubmodelComponent comp) + { + comp.getSupermodelPins().entrySet().stream().sorted(Comparator.comparing(Entry::getKey)).map(Entry::getValue).forEach(pin -> + { + PinUsage usage = null; + while (usage == null) + try + { + System.out.print(" Usage for interface pin " + pin.name + " (empty: " + pin.usage + ") >"); + String usageStr = sysin.nextLine().toUpperCase(); + usage = usageStr.equals("") ? pin.usage + : usageStr.equals("I") ? PinUsage.INPUT + : usageStr.equals("O") ? PinUsage.OUTPUT + : usageStr.equals("T") ? PinUsage.TRISTATE : PinUsage.valueOf(usageStr); + } + catch (@SuppressWarnings("unused") IllegalArgumentException e) + { + System.err.println(" Illegal usage"); + } + setInterfacePinUsage(comp, pin, usage); + }); + } + + private static void changeComponentNames(Scanner sysin, LogicModelModifiable submodelModifiable, + Map componentNameRemapping) + { + componentNameRemapping.put(SubmodelComponent.SUBMODEL_INTERFACE_NAME, SubmodelComponent.SUBMODEL_INTERFACE_NAME); + LogicModelModifiable tempModel = new LogicModelModifiable(); + IdentifyParams iP = new IdentifyParams(); + submodelModifiable.getComponentsByName().entrySet().stream() + .filter(e -> !e.getKey().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)) + .sorted(Comparator.comparing(Entry::getKey, ReserializeAndVerifyJSONs::compareStringsWithIntegers)).forEach(e -> + { + String oldName = e.getKey(); + ModelComponent subcomp = e.getValue(); + String defaultName = tempModel.getDefaultComponentName(subcomp); + String newName = null; + while (newName == null) + { + System.out.print(" New name for component " + oldName + " of type " + subcomp.getIDForSerializing(iP) + " (empty: " + + defaultName + ") >"); + newName = sysin.nextLine(); + if (newName.equals("")) + newName = defaultName; + if (tempModel.getComponentsByName().containsKey(newName)) + { + System.err.println(" There already is a component with that name"); + newName = null; + } + } + componentNameRemapping.put(oldName, newName); + IndirectModelComponentCreator + .createComponent(tempModel, subcomp.getIDForSerializing(iP), subcomp.getParamsForSerializingJSON(iP), newName) + .moveTo(subcomp.getPosX(), subcomp.getPosY()); + }); + SubmodelInterface tempSubmodelInterface = new SubmodelInterface(tempModel); + for (Pin p : submodelModifiable.getComponentsByName().get(SubmodelComponent.SUBMODEL_INTERFACE_NAME).getPins().values()) + tempSubmodelInterface + .addPin(new Pin(tempModel, tempSubmodelInterface, p.name, p.logicWidth, p.usage, p.getRelX(), p.getRelY())); + for (ModelWire w : submodelModifiable.getWiresByName().values()) + createWire(componentNameRemapping::get, tempModel, w); + + Optional o; + while ((o = submodelModifiable.getComponentsByName().values().stream() + .filter(c -> !c.getName().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)).findAny()).isPresent()) + submodelModifiable.destroyComponent(o.get()); + + tempModel.getComponentsByName().values().stream().filter(c -> !c.getName().equals(SubmodelComponent.SUBMODEL_INTERFACE_NAME)) + .forEach(c -> IndirectModelComponentCreator + .createComponent(submodelModifiable, c.getIDForSerializing(iP), c.getParamsForSerializingJSON(iP), c.getName()) + .moveTo(c.getPosX(), c.getPosY())); + for (ModelWire w : tempModel.getWiresByName().values()) + createWire(Function.identity(), submodelModifiable, w); + } + + private static void changeComponentNames_AfterSerialization(Scanner sysin, DeserializedSubmodelComponent comp, + Map componentNameRemapping) + { + if (comp.getHighLevelStateHandler() == null || !(comp.getHighLevelStateHandler() instanceof DefaultHighLevelStateHandler)) + { + System.out.println(" A non-default HighLevelStateHandler was detected. Check for changes there manually."); + System.out.print(" Empty line to continue to next component, old component name to get new component name >"); + for (String line = sysin.nextLine(); !line.equals(""); line = sysin.nextLine()) + System.out.println(" " + line + "->" + componentNameRemapping.get(line) + " >"); + } + } + + private static void snapWCPs(LogicModelModifiable submodelModifiable) + { + submodelModifiable.getComponentsByName().values().stream().filter(c -> c instanceof ModelWireCrossPoint).forEach(c -> + { + double x = c.getPosX(); + double y = c.getPosY(); + double newX = x % GRIDSIZE == 0 ? x - 1 : x; + double newY = y % GRIDSIZE == 0 ? y - 1 : y; + if (x != newX || y != newY) + { + c.moveTo(newX, newY); + System.out.println(" Snapping WCP " + c.getName()); + } + }); + } + + private static void warnNonSnappedPoints(DeserializedSubmodelComponent comp, LogicModelModifiable submodelModifiable) + { + if (comp.getWidth() % GRIDSIZE != 0 || comp.getHeight() % GRIDSIZE != 0) + System.out.println(" Size is not snapped to grid: " + comp.getWidth() + "," + comp.getHeight()); + submodelModifiable.getComponentsByName().values().forEach(c -> + { + double x = c.getPosX(); + double y = c.getPosY(); + if (c instanceof ModelWireCrossPoint) + { + x++; + y++; + } + if (x % GRIDSIZE != 0 || y % GRIDSIZE != 0) + System.out.println(" Component " + c.getName() + " (type " + c.getIDForSerializing(new IdentifyParams()) + + ") is not snapped to grid: " + x + "," + y); + }); + submodelModifiable.getWiresByName().values().forEach(w -> + { + Point[] p = w.getPath(); + if (p != null) + for (int i = 0; i < p.length; i++) + if (p[i].x % GRIDSIZE != 0 || p[i].y % GRIDSIZE != 0) + System.out.println(" Wire " + w.name + " path point #" + i + " is not snapped to grid: " + p[i].x + "," + p[i].y); + }); + comp.getPins().values().forEach(p -> + { + if (p.getRelX() % GRIDSIZE != 0 || p.getRelY() % GRIDSIZE != 0) + System.out.println(" Interface point " + p.name + " is not snapped to grid: " + p.getRelX() + "," + p.getRelY()); + }); + } + + private static void warnNonVertHorizLines(LogicModelModifiable submodelModifiable) + { + submodelModifiable.getWiresByName().values().forEach(w -> + { + double[] p = w.getEffectivePath(); + for (int i = 1; i < p.length / 2; i++) + { + double x1 = p[2 * i - 2]; + double y1 = p[2 * i - 1]; + double x2 = p[2 * i + 0]; + double y2 = p[2 * i + 1]; + if (x1 != x2 && y1 != y2) + System.out.println(" Wire " + w.name + " part #" + (i - 1) + " is neither vertical nor horizontal"); + } + }); + } + + private static ModelWire createWire(Function componentNameRemapping, LogicModelModifiable tempModelForDefaultNames, + ModelWire w) + { + return new ModelWire(tempModelForDefaultNames, w.name, + getRemappedPin(componentNameRemapping, tempModelForDefaultNames, w.getPin1()), + getRemappedPin(componentNameRemapping, tempModelForDefaultNames, w.getPin2()), w.getPath()); + } + + private static Pin getRemappedPin(Function componentNameRemapping, LogicModelModifiable tempModelForDefaultNames, + Pin pin) + { + return tempModelForDefaultNames.getComponentsByName().get(componentNameRemapping.apply(pin.component.getName())).getPin(pin.name); + } + + private static int compareStringsWithIntegers(String a, String b) + { + int aLoc = 0; + int bLoc = 0; + for (;;) + { + if (aLoc == a.length()) + { + if (bLoc == b.length()) + return 0; + return -1; + } + if (bLoc == b.length()) + return 1; + int aInt = 0; + int aIntLen = 0; + char nextCharA; + for (;;) + { + nextCharA = a.charAt(aLoc++); + if (nextCharA < '0' || nextCharA > '9') + break; + aIntLen++; + aInt = aInt * 10 + nextCharA - '0'; + if (aLoc == a.length()) + break; + } + int bInt = 0; + int bIntLen = 0; + char nextCharB; + for (;;) + { + nextCharB = b.charAt(bLoc++); + if (nextCharB < '0' || nextCharB > '9') + break; + bIntLen++; + bInt = bInt * 10 + nextCharB - '0'; + if (bLoc == b.length()) + break; + } + if (aIntLen != 0) + { + if (bIntLen == 0) + return -1; + int comp = Integer.compare(aInt, bInt); + if (comp != 0) + return comp; + } else + { + if (bIntLen != 0) + return 1; + int comp = Character.compare(nextCharA, nextCharB); + if (comp != 0) + return comp; + } + } + } + + private static void setInterfacePinUsage(DeserializedSubmodelComponent comp, Pin interfacePin, PinUsage usage) + { + Set wiresConnectedToPin = comp.submodel.getWiresByName().values().stream() + .filter(w -> w.getPin1() == interfacePin || w.getPin2() == interfacePin).collect(Collectors.toSet()); + LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); + wiresConnectedToPin.forEach(submodelModifiable::destroyWire); + comp.removeSubmodelInterface(interfacePin.name); + comp.addSubmodelInterface(new MovablePin(submodelModifiable, comp, interfacePin.name, interfacePin.logicWidth, usage, + interfacePin.getRelX(), interfacePin.getRelY())); + wiresConnectedToPin.forEach(w -> new ModelWire(submodelModifiable, w.getPin1(), w.getPin2())); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/.classpath b/plugins/net.mograsim.logic.model.editor/.classpath new file mode 100644 index 00000000..c4b0fff7 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.logic.model.editor/.project b/plugins/net.mograsim.logic.model.editor/.project new file mode 100644 index 00000000..4f792a69 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.project @@ -0,0 +1,28 @@ + + + net.mograsim.logic.model.editor + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF b/plugins/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF new file mode 100644 index 00000000..283c286d --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/META-INF/MANIFEST.MF @@ -0,0 +1,16 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Editor +Bundle-SymbolicName: net.mograsim.logic.model.editor +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.logic.model.editor, + net.mograsim.logic.model.editor.handles, + net.mograsim.logic.model.editor.states, + net.mograsim.logic.model.editor.ui, + net.mograsim.logic.model.editor.util +Require-Bundle: net.mograsim.logic.model;bundle-version="0.1.0", + net.mograsim.preferences;bundle-version="0.1.0", + net.mograsim.logic.model.am2900;bundle-version="0.1.0" +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Automatic-Module-Name: net.mograsim.logic.model.editor +Bundle-Vendor: Mograsim Team diff --git a/plugins/net.mograsim.logic.model.editor/build.properties b/plugins/net.mograsim.logic.model.editor/build.properties new file mode 100644 index 00000000..d1763276 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/build.properties @@ -0,0 +1,3 @@ +source.. = src/ +bin.includes = META-INF/,\ + .,\ \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java new file mode 100644 index 00000000..90baafb5 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Editor.java @@ -0,0 +1,253 @@ +package net.mograsim.logic.model.editor; + +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonParser; +import com.google.gson.JsonSyntaxException; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.editor.handles.ComponentHandle; +import net.mograsim.logic.model.editor.handles.Handle; +import net.mograsim.logic.model.editor.handles.HandleManager; +import net.mograsim.logic.model.editor.handles.PinHandle; +import net.mograsim.logic.model.editor.states.StateManager; +import net.mograsim.logic.model.editor.ui.DialogManager; +import net.mograsim.logic.model.editor.ui.EditorGUI; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer; + +public final class Editor +{ + final Selection selection = new Selection(); + final Set copyBuffer = new HashSet<>(); + public final DeserializedSubmodelComponent toBeEdited; + public final HandleManager handleManager; + public final EditorGUI gui; + public final StateManager stateManager; + private final SaveLoadManager saveManager; + private Snapping snapping = Snapping.ABSOLUTE; + private double snapX = 5, snapY = 5; + public final DialogManager dialogManager; + public final EditorUserInput userInput; + + public Editor(DeserializedSubmodelComponent toBeEdited) + { + this.toBeEdited = toBeEdited; + handleManager = new HandleManager(this); + gui = new EditorGUI(this); + userInput = new EditorUserInput(this); + stateManager = new StateManager(this); + handleManager.init(); + saveManager = new SaveLoadManager(this); + dialogManager = new DialogManager(gui.shell); + + gui.open(); + } + + public LogicModelModifiable getSubmodel() + { + return toBeEdited.getSubmodelModifiable(); + } + + public Selection getSelection() + { + return selection; + } + + // TODO: Remove this error prone method: Relative offset may change between multiple moves, + // because Handles have different ways of responding to reqMove(...), causing strange behaviour + @Deprecated + public void moveSelection(double x, double y) + { + Point ref = selection.getTopLeft(); + Point snapped = new Point(x, y); + applySnapping(snapped); + + for (Handle c : selection) + { + double newX, newY; + newX = snapped.x + c.getPosX() - ref.x; + newY = snapped.y + c.getPosY() - ref.y; + c.reqMove(newX, newY); + } + } + + public void moveHandles(double x, double y, Map handleOffsetMap) + { + Point snapped = new Point(x, y); + applySnapping(snapped); + + for (Handle c : handleOffsetMap.keySet()) + { + Point offset = handleOffsetMap.get(c); + double newX, newY; + newX = snapped.x + offset.x; + newY = snapped.y + offset.y; + c.reqMove(newX, newY); + } + } + + public void deleteSelection() + { + selection.forEach(h -> h.reqDelete()); + selection.clear(); + } + + public void copy() + { + copyBuffer.clear(); + Point refPoint = selection.getTopLeft(); + for (Handle h : selection) + { + Optional cInfo = h.reqCopy(refPoint); + if (cInfo.isPresent()) + copyBuffer.add(cInfo.get()); + } + } + + public void paste(double x, double y) + { + selection.clear(); + for (ComponentInfo info : copyBuffer) + { + ModelComponent comp = addComponent(info.identifier, info.params); + ComponentHandle h = handleManager.getHandle(comp); + h.reqMove(info.relX, info.relY); + selection.add(h); + } + moveSelection(x, y); + } + + public void save() + { + saveManager.save(); + } + + public void saveAs() + { + saveManager.openSaveAsDialog(); + } + + public void addComponent(double x, double y) + { + boolean successful = false; + JsonElement params = JsonNull.INSTANCE; + outer: while (!successful) + { + String selected = gui.getAddListSelected(); + try + { + ModelComponent c = addComponent(selected, params); + selection.clear(); + selection.add(handleManager.getHandle(c)); + moveSelection(x, y); + successful = true; + } + catch (@SuppressWarnings("unused") UnsupportedOperationException | JsonSyntaxException | NumberFormatException + | NullPointerException e) + { + String result = DialogManager.openMultiLineTextDialog("Add component", "Create", "Cancel", "Parameters:"); + if (result == null) + break outer; + params = new JsonParser().parse(result); + } + } + } + + private ModelComponent addComponent(String identifier, JsonElement params) + { + return IndirectModelComponentCreator.createComponent(toBeEdited.getSubmodelModifiable(), identifier, params); + } + + public void duplicate() + { + copy(); + Point origin = selection.getTopLeft(); + paste(origin.x + 20, origin.y + 20); + } + + private void applySnapping(Point newP) + { + switch (snapping) + { + case OFF: + break; + case ABSOLUTE: + newP.x = (int) (newP.x / snapX + .5) * snapX; + newP.y = (int) (newP.y / snapY + .5) * snapY; + break; + default: + break; + } + } + + public static class ComponentInfo + { + public final double relX, relY; + public final String identifier; + public final JsonElement params; + + public ComponentInfo(double relX, double relY, String identifier, JsonElement params) + { + this.relX = relX; + this.relY = relY; + this.identifier = identifier; + this.params = params; + } + } + + @SuppressWarnings("unused") + public void addWire(PinHandle a, PinHandle b) + { + new ModelWire(toBeEdited.getSubmodelModifiable(), a.getPin(), b.getPin(), new Point[0]); + } + + public static enum Snapping + { + OFF, ABSOLUTE; + + @Override + public String toString() + { + return super.toString().toLowerCase(); + } + } + + public static void main(String[] args) + { + Am2900Loader.setup(); + openNewEditor(); +// SaveLoadManager.openLoadDialog(); + } + + public static void openNewEditor() + { + DeserializedSubmodelComponent toBeEdited = new DeserializedSubmodelComponent(new LogicModelModifiable(), null, null, null); + toBeEdited.setOutlineRenderer(new DefaultOutlineRenderer(toBeEdited)); + toBeEdited.setSymbolRenderer(new DefaultSymbolRenderer(toBeEdited)); + toBeEdited.setHighLevelStateHandler(new DefaultHighLevelStateHandler()); + new Editor(toBeEdited); + } + + public Snapping getSnapping() + { + return snapping; + } + + public void setSnapping(Snapping snapping) + { + this.snapping = snapping; + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java new file mode 100644 index 00000000..feae04f3 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/EditorUserInput.java @@ -0,0 +1,111 @@ +package net.mograsim.logic.model.editor; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.ui.EditorGUI; + +public class EditorUserInput +{ + private final EditorGUI gui; + + public EditorUserInput(Editor editor) + { + this.gui = editor.gui; + gui.logicCanvas.addMouseListener(new MouseListener() + { + @Override + public void mouseDoubleClick(MouseEvent e) + { + // TODO Auto-generated method stub + } + + @Override + public void mouseDown(MouseEvent e) + { + Point clicked = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y); + switch (e.button) + { + case 1: + editor.handleManager.click(clicked, e.stateMask); + break; + } + + } + + @Override + public void mouseUp(MouseEvent e) + { + } + }); + + gui.logicCanvas.addMouseMoveListener((e) -> + { + Point dest = editor.gui.logicCanvas.canvasToWorldCoords(e.x, e.y); + editor.stateManager.mouseMoved(dest.x, dest.y); + }); + + gui.logicCanvas.addKeyListener(new KeyListener() + { + + @Override + public void keyReleased(KeyEvent e) + { + // TODO Auto-generated method stub + + } + + @Override + public void keyPressed(KeyEvent e) + { + switch (e.keyCode) + { + case 'c': + if ((e.stateMask & SWT.CTRL) == SWT.CTRL) + editor.stateManager.copy(); + break; + case 'v': + if ((e.stateMask & SWT.CTRL) == SWT.CTRL) + editor.stateManager.paste(); + break; + case 'd': + if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) + editor.stateManager.duplicate(); + break; + case 'g': + editor.stateManager.grab(); + break; + case 'r': + editor.stateManager.delete(); + break; + case 's': + if ((e.stateMask & SWT.CTRL) == SWT.CTRL) + editor.save(); + break; + case 'a': + if ((e.stateMask & SWT.SHIFT) == SWT.SHIFT) + editor.stateManager.add(); + break; + case 'h': + editor.stateManager.boxSelect(); + break; + } + + } + }); + } + + public Point getCanvasMousePosition() + { + return new Point(gui.logicCanvas.toControl(gui.display.getCursorLocation())); + } + + public Point getWorldMousePosition() + { + return gui.logicCanvas.canvasToWorldCoords(getCanvasMousePosition()); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java new file mode 100644 index 00000000..bbe202b1 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/SaveLoadManager.java @@ -0,0 +1,75 @@ +package net.mograsim.logic.model.editor; + +import java.io.IOException; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Shell; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; + +public class SaveLoadManager +{ + private String savePath = null; + private Editor editor; + + public SaveLoadManager(Editor editor) + { + this.editor = editor; + } + + public void save() + { + if (savePath == null) + openSaveAsDialog(); + else + innerSave(); + } + + public void openSaveAsDialog() + { + Shell fdShell = new Shell(); + FileDialog fd = new FileDialog(fdShell, SWT.SAVE); + fd.setText("Save as..."); + fd.setFilterExtensions(new String[] { "*.json" }); + String result = fd.open(); + fdShell.dispose(); + if (result != null) + { + savePath = result; + innerSave(); + } + } + + private void innerSave() + { + try + { + SubmodelComponentSerializer.serialize(editor.toBeEdited, savePath); + } + catch (IOException e) + { + savePath = null; + System.err.println("Failed to save component!"); + e.printStackTrace(); + } + } + + public static void openLoadDialog() throws IOException + { + Shell fdShell = new Shell(); + FileDialog fd = new FileDialog(fdShell, SWT.OPEN); + fd.setText("Load component..."); + fd.setFilterExtensions(new String[] { "*.json" }); + String result = fd.open(); + fdShell.dispose(); + if (result != null) + { + new Editor((DeserializedSubmodelComponent) IndirectModelComponentCreator.createComponent(new LogicModelModifiable(), + "jsonfile:" + result)); + } + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java new file mode 100644 index 00000000..bc225eb7 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/Selection.java @@ -0,0 +1,132 @@ +package net.mograsim.logic.model.editor; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.function.DoubleBinaryOperator; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.editor.handles.Handle; + +public class Selection implements Iterable +{ + private Set selection = new HashSet<>(); + + public Map calculateOffsets() + { + Map offsets = new HashMap<>(); + Point ref = getTopLeft(); + selection.forEach(h -> offsets.put(h, new Point(h.getPosX() - ref.x, h.getPosY() - ref.y))); + return offsets; + } + + public Rectangle getBounds() + { + Point pos1 = getTopLeft(); + Point pos2 = getBottomRight(); + return new Rectangle(pos1.x, pos1.y, pos2.x - pos1.x, pos2.y - pos1.y); + } + + public double getWidth() + {// TODO: Compute this more efficiently + return getTopRight().x - getTopLeft().x; + } + + public double getHeight() + { + return getBottomLeft().y - getTopLeft().y; + } + + public Point getTopLeft() + { + return getCorner(Double.MAX_VALUE, Double::min, r -> 0, Double.MAX_VALUE, Double::min, r -> 0); + } + + public Point getTopRight() + { + return getCorner(-Double.MAX_VALUE, Double::max, r -> r.width, Double.MAX_VALUE, Double::min, r -> 0); + } + + public Point getBottomLeft() + { + return getCorner(Double.MAX_VALUE, Double::min, r -> 0, -Double.MAX_VALUE, Double::max, r -> r.height); + } + + public Point getBottomRight() + { + return getCorner(-Double.MAX_VALUE, Double::max, r -> r.width, -Double.MAX_VALUE, Double::max, r -> r.height); + } + + public Point getCorner(double xIdentity, DoubleBinaryOperator xOp, Offset xOffset, double yIdentity, DoubleBinaryOperator yOp, + Offset yOffset) + { + double x = xIdentity, y = yIdentity; + for (Handle c : selection) + { + Rectangle bounds = c.getBounds(); + x = xOp.applyAsDouble(x, bounds.x + xOffset.computeOffset(bounds)); + y = yOp.applyAsDouble(y, bounds.y + yOffset.computeOffset(bounds)); + } + return new Point(x, y); + } + + private static interface Offset + { + public double computeOffset(Rectangle bounds); + } + + public void add(Handle h) + { + selection.add(h); + h.onSelect(); + } + + public void remove(Handle h) + { + selection.remove(h); + h.onDeselect(); + } + + public void clear() + { + selection.forEach(h -> h.onDeselect()); + selection.clear(); + } + + public int size() + { + return selection.size(); + } + + public boolean contains(Handle h) + { + return selection.contains(h); + } + + public void addAll(Collection handles) + { + handles.forEach(h -> h.onSelect()); + selection.addAll(handles); + } + + @Override + public Iterator iterator() + { + return selection.iterator(); + } + + @Override + public String toString() + { + return selection.toString(); + } + + public boolean isEmpty() + { + return selection.isEmpty(); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java new file mode 100644 index 00000000..14868e94 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/ComponentHandle.java @@ -0,0 +1,107 @@ +package net.mograsim.logic.model.editor.handles; + +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.editor.Editor.ComponentInfo; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; + +public class ComponentHandle extends Handle +{ + private final LogicModelModifiable model; + public final ModelComponent parent; + private final static double POS_OFFSET = 2.0d; + private final static double LENGTH_OFFSET = POS_OFFSET * 2; + boolean selected = false; + + public ComponentHandle(LogicModelModifiable model, ModelComponent parent) + { + super(4); + this.model = model; + this.parent = parent; + Rectangle bounds = parent.getBounds(); + setSize(bounds.width, bounds.height); + parent.addComponentResizedListener((c) -> + { + Rectangle pBounds = c.getBounds(); + setSize(pBounds.width, pBounds.height); + }); + moveTo(parent.getPosX(), parent.getPosY()); + } + + @Override + protected void moveTo(double x, double y) + { + super.moveTo(x, y); + parent.moveTo(x, y); + } + + @Override + protected void render(GeneralGC gc) + { + if (selected) + { + gc.setLineWidth(2); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); + Rectangle bounds = getBounds(); + bounds.x -= POS_OFFSET; + bounds.y -= POS_OFFSET; + bounds.width += LENGTH_OFFSET; + bounds.height += LENGTH_OFFSET; + gc.drawRectangle(bounds); + Font oldFont = gc.getFont(); + gc.setFont(new Font(oldFont.getName(), 5, oldFont.getStyle())); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK)); + gc.drawText(parent.getName(), bounds.x, bounds.y, true); + gc.setFont(oldFont); + } + } + + @Override + public void reqMove(double x, double y) + { + moveTo(x, y); + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + public void reqDelete() + { + model.destroyComponent(parent); + } + + @Override + public Optional reqCopy(Point refPoint) + { + IdentifyParams idParams = new IdentifyParams(); + return Optional.of(new ComponentInfo(parent.getPosX() - refPoint.x, parent.getPosY() - refPoint.y, + parent.getIDForSerializing(idParams), parent.getParamsForSerializingJSON(idParams))); + } + + @Override + public HandleType getType() + { + return HandleType.COMPONENT; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java new file mode 100644 index 00000000..959fb896 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/CornerHandle.java @@ -0,0 +1,71 @@ +package net.mograsim.logic.model.editor.handles; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; + +public class CornerHandle extends Handle +{ + private final static int LENGTH = 5; + private final DeserializedSubmodelComponent toBeEdited; + private boolean selected; + + public CornerHandle(DeserializedSubmodelComponent toBeEdited) + { + super(0); + this.toBeEdited = toBeEdited; + setSize(LENGTH, LENGTH); + initPos(); + } + + @Override + protected void render(GeneralGC gc) + { + gc.setBackground(Display.getCurrent().getSystemColor(selected ? SWT.COLOR_YELLOW : SWT.COLOR_DARK_GREEN)); + gc.fillRectangle(getPosX(), getPosY(), LENGTH, LENGTH); + } + + private void initPos() + { + Rectangle bounds = toBeEdited.getBounds(); + double subScale = toBeEdited.getSubmodelScale(); + moveTo(bounds.width / subScale, bounds.height / subScale); + } + + @Override + public void reqMove(double x, double y) + { + moveTo(x, y); + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + protected void moveTo(double x, double y) + { + super.moveTo(x, y); + double subScale = toBeEdited.getSubmodelScale(); + toBeEdited.setSize(x * subScale, y * subScale); + } + + @Override + public HandleType getType() + { + return HandleType.CORNER; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java new file mode 100644 index 00000000..cbfe2a2a --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/Handle.java @@ -0,0 +1,150 @@ +package net.mograsim.logic.model.editor.handles; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.editor.Editor.ComponentInfo; +import net.mograsim.logic.model.editor.states.EditorState; + +public abstract class Handle +{ + private final Rectangle bounds; + private final Collection redrawListeners, destroyListeners; + private final int priority; + + public Handle(int priority) + { + this.priority = priority; + redrawListeners = new ArrayList<>(); + destroyListeners = new ArrayList<>(); + bounds = new Rectangle(0, 0, 0, 0); + callRedrawListeners(); + } + + final public void render(GeneralGC gc, Rectangle visibleRegion) + { + if (bounds.intersects(visibleRegion)) + render(gc); + } + + protected abstract void render(GeneralGC gc); + + protected void setSize(double width, double height) + { + bounds.width = width; + bounds.height = height; + callRedrawListeners(); + } + + protected void moveTo(double x, double y) + { + bounds.x = x; + bounds.y = y; + callRedrawListeners(); + } + + public Rectangle getBounds() + { + return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); + } + + public void addRedrawListener(Runnable listener) + { + redrawListeners.add(listener); + } + + public void removeRedrawListener(Runnable listener) + { + redrawListeners.remove(listener); + } + + protected void callRedrawListeners() + { + redrawListeners.forEach(l -> l.run()); + } + + public double getPosX() + { + return bounds.x; + } + + public double getPosY() + { + return bounds.y; + } + + void destroy() + { + destroyListeners.forEach(l -> l.run()); + } + + public void addDestroyListener(Runnable listener) + { + redrawListeners.add(listener); + } + + public void removeDestroyListener(Runnable listener) + { + redrawListeners.remove(listener); + } + + public boolean contains(double x, double y) + { + return bounds.contains(x, y); + } + + public boolean contains(Point p) + { + return contains(p.x, p.y); + } + + /** + * Register a mouse click + * + * @param x Coordinate of the click in the world, not the display context + * @param y Coordinate of the click in the world, not the display context + * @return true if the click was consumed, false otherwise + */ + public boolean click(double x, double y, int stateMask, EditorState state) + { + if (contains(x, y)) + return state.clickedHandle(new HandleClickInfo(this, stateMask)); + return false; + } + + //@formatter:off + public void reqMove(double x, double y) {} + public void reqDelete() {} + public Optional reqCopy(Point refPoint) { return Optional.empty(); } + public void onSelect() {} + public void onDeselect() {} + //@formatter:on + + public final int getPriority() + { + return priority; + } + + public abstract HandleType getType(); + + public static enum HandleType + { + COMPONENT, STATIC_PIN, INTERFACE_PIN, WIRE_POINT, WIRE, CORNER; + } + + public static class HandleClickInfo + { + public final int stateMask; + public final Handle clicked; + + HandleClickInfo(Handle clicked, int stateMask) + { + this.clicked = clicked; + this.stateMask = stateMask; + } + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java new file mode 100644 index 00000000..0a33509c --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/HandleManager.java @@ -0,0 +1,390 @@ +package net.mograsim.logic.model.editor.handles; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.states.EditorState; +import net.mograsim.logic.model.editor.util.PrioritySet; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; + +public class HandleManager +{ + private final Map handlePerPin; + private final Map handlePerInterfacePin; + private final Map> pointHandlesPerWire; + private final Map handlePerWire; + private final Set handles; + private final Set wirePointHandles; + private final Map handlePerComp; + + private final Collection> handleAddedListeners; + private final Collection> handleRemovedListeners; + private final Editor editor; + private boolean initialized = false; + + public HandleManager(Editor editor) + { + this.editor = editor; + handlePerPin = new HashMap<>(); + handlePerInterfacePin = new HashMap<>(); + pointHandlesPerWire = new HashMap<>(); + handlePerComp = new HashMap<>(); + handles = new PrioritySet<>((a, b) -> Integer.compare(a.getPriority(), b.getPriority())); + wirePointHandles = new HashSet<>(); + handlePerWire = new HashMap<>(); + + handleAddedListeners = new ArrayList<>(); + handleRemovedListeners = new ArrayList<>(); + + LogicModelModifiable model = editor.getSubmodel(); + + model.addComponentAddedListener(c -> registerComponent(c)); + + model.addComponentRemovedListener(c -> + { + removeComponentHandle(c); + }); + + model.addWireAddedListener(w -> + { + registerWire(w); + }); + + model.addWireRemovedListener(w -> + { + removeWireHandle(w); + removeWirePointHandles(w); + }); + } + + //////////////////////////////////////// + // -- Setting up initial handles -- /// + ////////////////////////////////////// + + public void init() + { + if (initialized) + System.err.println("Warning! HandleManager was already initialized."); + else + { + LogicModelModifiable model = editor.getSubmodel(); + Map compsByName = model.getComponentsByName(); + Set comps = new HashSet<>(compsByName.values()); + ModelComponent interfaceComp = compsByName.get(SubmodelComponent.SUBMODEL_INTERFACE_NAME); + comps.remove(interfaceComp); + registerInterfaceComponent(interfaceComp); + comps.forEach(c -> registerComponent(c)); + + model.getWiresByName().values().forEach(w -> registerWire(w)); + addHandle(new CornerHandle(editor.toBeEdited)); + } + } + + private void registerInterfaceComponent(ModelComponent c) + { + c.getPins().values().forEach(p -> addInterfacePinHandle(p)); + c.addPinAddedListener(p -> addInterfacePinHandle(p)); + c.addPinRemovedListener(p -> removeInterfacePinHandle(p)); + } + + private void registerComponent(ModelComponent c) + { + addComponentHandle(c); + + c.getPins().values().forEach(p -> addPinHandle(p)); + + c.addPinAddedListener(p -> addPinHandle(p)); + c.addPinRemovedListener(p -> removePinHandle(p)); + } + + private void registerWire(ModelWire wire) + { + Point[] path = wire.getPath(); + AtomicInteger oldLength = new AtomicInteger(path == null ? 0 : path.length); + wire.addPathChangedListener(w -> + { + Point[] newPath = w.getPath(); + int newLength = newPath == null ? 0 : newPath.length; + int diff = newLength - oldLength.getAndSet(newLength); + if (diff != 0) + { + if (diff > 0) + { + for (int i = 0; i < diff; i++) + addWirePointHandle(w); + } + + List wpHandles = pointHandlesPerWire.get(w); + int size = wpHandles.size(); + for (int i = 0; i < size; i++) + { + wpHandles.get(i).setIndex(i); + } + } + pointHandlesPerWire.get(w).forEach(h -> h.updatePos()); + }); + addWireHandle(wire); + if (path == null) + return; + for (int i = 0; i < path.length; i++) + { + addWirePointHandle(wire); + } + } + + ///////////////////////////////////// + // -- Adding/Removing handles -- /// + /////////////////////////////////// + + private void addComponentHandle(ModelComponent c) + { + ComponentHandle h = new ComponentHandle(editor.getSubmodel(), c); + handlePerComp.put(c, h); + addHandle(h); + } + + private void removeComponentHandle(ModelComponent c) + { + ComponentHandle h = handlePerComp.get(c); + handlePerComp.remove(c); + removeHandle(h); + } + + private void addPinHandle(Pin owner) + { + StaticPinHandle h = new StaticPinHandle(owner); + handlePerPin.put(owner, h); + addHandle(h); + } + + private void removePinHandle(Pin owner) + { + StaticPinHandle h = handlePerPin.get(owner); + handlePerPin.remove(owner); + removeHandle(h); + } + + private void addInterfacePinHandle(Pin p) + { + // The following is not an alternative to the cast, because the new pin is not yet in the map, when the listener is called + // editor.toBeEdited.getSubmodelMovablePins().get(p.name); + MovablePin pM = (MovablePin) p; + InterfacePinHandle h = new InterfacePinHandle(pM, editor.toBeEdited); + handlePerInterfacePin.put(pM, h); + addHandle(h); + } + + private void removeInterfacePinHandle(Pin p) + { + InterfacePinHandle h = handlePerInterfacePin.get(p); + handlePerInterfacePin.remove(p); + removeHandle(h); + } + + private void addWirePointHandle(ModelWire w) + { + List wireHandles = pointHandlesPerWire.get(w); + WirePointHandle h; + if (wireHandles != null) + wireHandles.add(h = new WirePointHandle(this, w, wireHandles.size())); + else + { + wireHandles = new ArrayList<>(); + h = new WirePointHandle(this, w, 0); + wireHandles.add(h); + pointHandlesPerWire.put(h.parent, wireHandles); + } + this.wirePointHandles.add(h); + addHandle(h); + } + + void destroyWirePointHandle(ModelWire owner, WirePointHandle h) + { + if (pointHandlesPerWire.containsKey(owner)) + { + List handles = pointHandlesPerWire.get(owner); + int pointIndex = handles.indexOf(h); + handles.remove(pointIndex); + removeHandle(h); + owner.removePathPoint(pointIndex); + } + } + + private void removeWirePointHandles(ModelWire owner) + { + if (!pointHandlesPerWire.containsKey(owner)) + return; + pointHandlesPerWire.get(owner).forEach(h -> + { + wirePointHandles.remove(h); + removeHandle(h); + }); + pointHandlesPerWire.remove(owner); + } + + private void addWireHandle(ModelWire w) + { + WireHandle h = new WireHandle(editor.getSubmodel(), w); + handlePerWire.put(w, h); + addHandle(h); + } + + private void removeWireHandle(ModelWire w) + { + WireHandle h = handlePerWire.get(w); + handlePerWire.remove(w); + removeHandle(h); + } + + private void addHandle(Handle h) + { + handles.add(h); + callHandleAddedListeners(h); + } + + private void removeHandle(Handle h) + { + handles.remove(h); + callHandleRemovedListeners(h); + h.destroy(); + } + + public StaticPinHandle getHandle(Pin parent) + { + return handlePerPin.get(parent); + } + + public ComponentHandle getHandle(ModelComponent parent) + { + return handlePerComp.get(parent); + } + + public WireHandle getHandle(ModelWire parent) + { + return handlePerWire.get(parent); + } + + public Handle getInterfacePinHandle(Pin p) + { + return handlePerInterfacePin.get(p); + } + + /** + * @return A Collection of the registered {@link WirePointHandle}s of the specified wire + */ + public Collection getWirePointHandles(ModelWire parent) + { + return pointHandlesPerWire.get(parent).stream().collect(Collectors.toSet()); + } + + /** + * @return An unmodifiable view of all registered {@link Handle}s + */ + public Collection getHandles() + { + return Collections.unmodifiableCollection(handles); + } + + /** + * @return An unmodifiable view of all registered {@link StaticPinHandle}s + */ + public Collection getPinHandles() + { + return Collections.unmodifiableCollection(handlePerPin.values()); + } + + /** + * @return An unmodifiable view of all registered {@link InterfacePinHandle}s + */ + public Collection getInterfacePinHandles() + { + return Collections.unmodifiableCollection(handlePerInterfacePin.values()); + } + + /** + * @return An unmodifiable view of all registered {@link ComponentHandle}s + */ + public Collection getComponentHandles() + { + return Collections.unmodifiableCollection(handlePerComp.values()); + } + + /** + * @return An unmodifiable view of all registered {@link WireHandle}s + */ + public Collection getWireHandles() + { + return Collections.unmodifiableCollection(handlePerWire.values()); + } + + /** + * @return An unmodifiable view of all registered {@link WirePointHandle}s + */ + public Collection getWirePointHandles() + { + return Collections.unmodifiableSet(wirePointHandles); + } + + public void click(Point clicked, int stateMask) + { + EditorState entryState = editor.stateManager.getState(); + // TODO: As soon as wires connected to a component being removed also are removed, change priority) + if (!click(handles, clicked, entryState, stateMask)) + entryState.clickedEmpty(clicked, stateMask); + entryState.clicked(clicked, stateMask); + } + + private static boolean click(Collection handles, Point clicked, EditorState state, int stateMask) + { + for (Handle h : handles) + if (h.click(clicked.x, clicked.y, stateMask, state)) + return true; + return false; + } + + public void addHandleAddedListener(Consumer c) + { + handleAddedListeners.add(c); + } + + private void callHandleAddedListeners(Handle added) + { + handleAddedListeners.forEach(l -> l.accept(added)); + } + + public void removeHandleAddedListener(Consumer c) + { + handleAddedListeners.remove(c); + } + + public void addHandleRemovedListener(Consumer c) + { + handleRemovedListeners.add(c); + } + + private void callHandleRemovedListeners(Handle removed) + { + handleRemovedListeners.forEach(l -> l.accept(removed)); + } + + public void removeHandleRemovedListener(Consumer c) + { + handleRemovedListeners.remove(c); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java new file mode 100644 index 00000000..189d3d17 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/InterfacePinHandle.java @@ -0,0 +1,108 @@ +package net.mograsim.logic.model.editor.handles; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; + +public class InterfacePinHandle extends PinHandle +{ + private final static int CIRCLE_DIAM = 4, CIRCLE_RADIUS = CIRCLE_DIAM / 2, SELECTED_CIRCLE_OFFSET = 1, + SELECTED_CIRCLE_DIAM = SELECTED_CIRCLE_OFFSET * 2 + CIRCLE_DIAM; + private final MovablePin parent; + private final DeserializedSubmodelComponent owner; + private boolean selected = false; + + public InterfacePinHandle(MovablePin parent, DeserializedSubmodelComponent pinOwner) + { + super(2); + this.parent = parent; + this.owner = pinOwner; + setSize(CIRCLE_DIAM, CIRCLE_DIAM); + initPos(); + } + + private void initPos() + { + Point pos = parent.getPos(); + moveTo(pos.x, pos.y); + } + + @Override + protected void render(GeneralGC gc) + { + double x = getPosX(), y = getPosY(); + + gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE)); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); + gc.drawText(parent.name, x + CIRCLE_DIAM, y + CIRCLE_DIAM, true); + if (selected) + { + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_YELLOW)); + gc.drawOval(x - SELECTED_CIRCLE_OFFSET, y - SELECTED_CIRCLE_OFFSET, SELECTED_CIRCLE_DIAM, SELECTED_CIRCLE_DIAM); + } + gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED)); + gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); + } + + @Override + public void reqMove(double x, double y) + { + moveTo(x, y); + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + public void reqDelete() + { + owner.removeSubmodelInterface(parent.name); + } + + @Override + protected void moveTo(double x, double y) + { + super.moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS); + parent.setRelPos(getCenterX(), getCenterY()); + } + + @Override + public double getCenterX() + { + return getPosX() + CIRCLE_RADIUS; + } + + @Override + public double getCenterY() + { + return getPosY() + CIRCLE_RADIUS; + } + + @Override + public HandleType getType() + { + return HandleType.INTERFACE_PIN; + } + + @Override + public Pin getPin() + { + return parent; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java new file mode 100644 index 00000000..2e4a9dc6 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/PinHandle.java @@ -0,0 +1,17 @@ +package net.mograsim.logic.model.editor.handles; + +import net.mograsim.logic.model.model.wires.Pin; + +public abstract class PinHandle extends Handle +{ + public PinHandle(int priority) + { + super(priority); + } + + public abstract Pin getPin(); + + public abstract double getCenterX(); + + public abstract double getCenterY(); +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java new file mode 100644 index 00000000..0f4a1524 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/StaticPinHandle.java @@ -0,0 +1,61 @@ +package net.mograsim.logic.model.editor.handles; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.wires.Pin; + +public class StaticPinHandle extends PinHandle +{ + private final static int CIRCLE_DIAM = 2; + private final static int CIRCLE_RADIUS = 1; + private final Pin parent; + + public StaticPinHandle(Pin parent) + { + super(1); + this.parent = parent; + setSize(CIRCLE_DIAM, CIRCLE_DIAM); + parent.addPinMovedListener((p) -> updatePos()); + updatePos(); + } + + @Override + protected void render(GeneralGC gc) + { + gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN)); + gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); + } + + private void updatePos() + { + Point pos = parent.getPos(); + moveTo(pos.x - CIRCLE_RADIUS, pos.y - CIRCLE_RADIUS); + } + + @Override + public double getCenterX() + { + return getPosX() + CIRCLE_RADIUS; + } + + @Override + public double getCenterY() + { + return getPosY() + CIRCLE_RADIUS; + } + + @Override + public HandleType getType() + { + return HandleType.STATIC_PIN; + } + + @Override + public Pin getPin() + { + return parent; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java new file mode 100644 index 00000000..839c2b5b --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WireHandle.java @@ -0,0 +1,161 @@ +package net.mograsim.logic.model.editor.handles; + +import java.util.Optional; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.editor.states.EditorState; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.ModelWire; + +public class WireHandle extends Handle +{ + private boolean selected = false; + private final static double WIDTH = 2.0; + private final static double WIDTH_SQUARED = WIDTH * WIDTH; + private final LogicModelModifiable model; + public final ModelWire parent; + + public WireHandle(LogicModelModifiable model, ModelWire parent) + { + super(5); + this.model = model; + this.parent = parent; + parent.addPathChangedListener(c -> updateBounds()); + updateBounds(); + } + + @Override + void destroy() + { + super.destroy(); + parent.removePathChangedListener(c -> updateBounds()); + } + + public void updateBounds() + { + Rectangle r = parent.getBounds(); + moveTo(r.x, r.y); + setSize(r.width, r.height); + } + + @Override + public void render(GeneralGC gc) + { + if (selected) + { + gc.setLineWidth(WIDTH); + gc.setForeground(Display.getDefault().getSystemColor(SWT.COLOR_YELLOW)); + gc.drawPolyline(parent.getEffectivePath()); + } + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + public void reqDelete() + { + // this wire could already be removed implicitly when removing a selection containing both wires and components + if (model.getWireByName(parent.name) != null) + model.destroyWire(parent); + } + + @Override + public boolean contains(double x, double y) + { + return click(parent, x, y).isPresent(); + } + + @Override + public boolean click(double x, double y, int stateMask, EditorState state) + { + Optional op = click(parent, x, y); + if (op.isEmpty()) + return false; + WireClickData data = op.get(); + return state.clickedHandle(new WireHandleClickInfo(this, data.segment, data.pos, stateMask)); + } + + public static class WireHandleClickInfo extends HandleClickInfo + { + public final int segment; + public final Point posOnWire; + + WireHandleClickInfo(WireHandle clicked, int segment, Point posOnWire, int stateMask) + { + super(clicked, stateMask); + this.segment = segment; + this.posOnWire = posOnWire; + } + + } + + private static Optional click(ModelWire w, double x, double y) + { + Rectangle modifiedBounds = w.getBounds(); + modifiedBounds.x -= WIDTH; + modifiedBounds.y -= WIDTH; + modifiedBounds.width += WIDTH * 2; + modifiedBounds.height += WIDTH * 2; + if (modifiedBounds.contains(x, y)) + { + double[] effectivePath = w.getEffectivePath(); + for (int i = 3; i < effectivePath.length; i += 2) + { + double a1 = effectivePath[i - 3], a2 = effectivePath[i - 2], b1 = effectivePath[i - 1], b2 = effectivePath[i], r1 = b2 - a2, + r2 = a1 - b1; + + double f = ((x - a1) * r2 + (a2 - y) * r1) / (-r2 * r2 - r1 * r1); + if (f >= 0 && f <= 1) + { + double e1 = a1 + f * (b1 - a1), e2 = a2 + f * (b2 - a2); + r1 = e1 - x; + r2 = e2 - y; + if (r1 * r1 + r2 * r2 <= WIDTH_SQUARED) + return Optional.of(new WireClickData(new Point(e1, e2), (i / 2) - 1)); + } + } + } + return Optional.empty(); + } + + private final static class WireClickData + { + WireClickData(Point pos, int segment) + { + this.pos = pos; + this.segment = segment; + } + + /** + * Position on the wire that is closest to the click + */ + public final Point pos; + /** + * Segment of the wire that the {@link Point} pos is on + */ + public final int segment; + } + + @Override + public HandleType getType() + { + return HandleType.WIRE; + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java new file mode 100644 index 00000000..2947535f --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/handles/WirePointHandle.java @@ -0,0 +1,89 @@ +package net.mograsim.logic.model.editor.handles; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.model.model.wires.ModelWire; + +public class WirePointHandle extends Handle +{ + private final static int END_OFFSET = 4; + private final HandleManager manager; + private boolean selected = false; + public final ModelWire parent; + + private int pointIndex; + + public WirePointHandle(HandleManager manager, ModelWire parent, int pointIndex) + { + super(3); + this.manager = manager; + this.parent = parent; + this.pointIndex = pointIndex; + setSize(END_OFFSET, END_OFFSET); + Point pathPoint = parent.getPathPoint(pointIndex); + moveTo(pathPoint.x, pathPoint.y); + } + + void updatePos() + { + Point p = parent.getPathPoint(pointIndex); + moveTo(p.x, p.y); + callRedrawListeners(); + } + + @Override + public void render(GeneralGC gc) + { + gc.setLineWidth(1.0); + gc.setForeground(Display.getDefault().getSystemColor(selected ? SWT.COLOR_YELLOW : SWT.COLOR_BLUE)); + gc.drawLine(getPosX(), getPosY(), getPosX() + END_OFFSET, getPosY() + END_OFFSET); + } + + @Override + public void reqMove(double x, double y) + { + parent.setPathPoint(new Point(x, y), pointIndex); + } + + @Override + public void onSelect() + { + selected = true; + callRedrawListeners(); + } + + @Override + public void onDeselect() + { + selected = false; + callRedrawListeners(); + } + + @Override + public void reqDelete() + { + manager.destroyWirePointHandle(parent, this); + } + + @Override + public HandleType getType() + { + return HandleType.WIRE_POINT; + } + + /** + * Sets the index of the {@link Point} within the parent {@link CoreWire}s path that is controlled by this handle + * + * @param index Index of the Point in the Wires path. + * @throws IndexOutOfBoundsException + */ + public void setIndex(int index) + { + this.pointIndex = index; + updatePos(); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java new file mode 100644 index 00000000..ef109cdb --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/BoxSelectionState.java @@ -0,0 +1,89 @@ +package net.mograsim.logic.model.editor.states; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.Selection; +import net.mograsim.logic.model.editor.handles.Handle; + +public class BoxSelectionState extends EditorState +{ + private Point origin; + private double mX, mY; + + private final ZoomedRenderer boxRenderer = gc -> + { + if (origin != null) + { + gc.setLineWidth(0.5); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); + gc.drawRectangle(origin.x, origin.y, mX - origin.x, mY - origin.y); + } + }; + + public BoxSelectionState(Editor editor, StateManager manager) + { + super(editor, manager); + } + + @Override + public void onEntry() + { + editor.gui.logicCanvas.addZoomedRenderer(boxRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void onExit() + { + editor.gui.logicCanvas.removeZoomedRenderer(boxRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void boxSelect() + { + manager.setState(new SelectionState(editor, manager)); + } + + @Override + public void clicked(Point clicked, int stateMask) + { + if (origin == null) + { + origin = new Point(clicked.x, clicked.y); + mX = clicked.x; + mY = clicked.y; + } else + { + Selection s = editor.getSelection(); + s.clear(); + boolean leftToRight = mX > origin.x, topToBottom = mY > origin.y; + double x = leftToRight ? origin.x : mX, y = topToBottom ? origin.y : mY, width = leftToRight ? mX - origin.x : origin.x - mX, + height = topToBottom ? mY - origin.y : origin.y - mY; + + Rectangle selected = new Rectangle(x, y, width, height); + for (Handle h : editor.handleManager.getHandles()) + { + Rectangle hBounds = h.getBounds(); + if (selected.contains(hBounds.x, hBounds.y) && selected.contains(hBounds.x + hBounds.width, hBounds.y + hBounds.height)) + { + s.add(h); + } + } + manager.setState(new SelectionState(editor, manager)); + } + } + + @Override + public void mouseMoved(double x, double y) + { + mX = x; + mY = y; + editor.gui.logicCanvas.redrawThreadsafe(); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java new file mode 100644 index 00000000..1c06c52e --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/CreateWireState.java @@ -0,0 +1,85 @@ +package net.mograsim.logic.model.editor.states; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.PinHandle; +import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; + +public class CreateWireState extends EditorState +{ + private final PinHandle origin; + private double mX, mY; + private ZoomedRenderer drawLine; + + public CreateWireState(Editor session, StateManager manager, PinHandle origin) + { + super(session, manager); + this.origin = origin; + mX = origin.getCenterX(); + mY = origin.getCenterY(); + } + + @Override + public void mouseMoved(double x, double y) + { + this.mX = x; + this.mY = y; + editor.gui.logicCanvas.redraw(); + } + + @Override + public void onEntry() + { + editor.getSelection().clear(); + drawLine = gc -> + { + gc.setLineWidth(1); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GREEN)); + gc.drawLine((int) origin.getCenterX(), (int) origin.getCenterY(), (int) mX, (int) mY); + }; + editor.gui.logicCanvas.addZoomedRenderer(drawLine); + editor.gui.logicCanvas.redraw(); + } + + @Override + public void onExit() + { + editor.gui.logicCanvas.removeZoomedRenderer(drawLine); + editor.gui.logicCanvas.redraw(); + } + + @Override + public boolean clickedHandle(HandleClickInfo handleClickInfo) + { + switch (handleClickInfo.clicked.getType()) + { + case INTERFACE_PIN: + case STATIC_PIN: + try + { + editor.addWire(origin, (PinHandle) handleClickInfo.clicked); + } + catch (IllegalArgumentException e) + { + Shell tmp = new Shell(Display.getCurrent()); + editor.dialogManager.openWarningDialog("Warning!", e.getMessage()); + tmp.dispose(); + } + break; + default: + return false; + } + return true; + } + + @Override + public void clicked(Point clicked, int stateMask) + { + manager.setState(new SelectionState(editor, manager)); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java new file mode 100644 index 00000000..05e05d85 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/EditorState.java @@ -0,0 +1,36 @@ +package net.mograsim.logic.model.editor.states; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.InterfacePinHandle; +import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; + +public abstract class EditorState +{ + protected final Editor editor; + protected final StateManager manager; + + public EditorState(Editor session, StateManager manager) + { + this.editor = session; + this.manager = manager; + } + + //@formatter:off + public void add() {} + public void delete() {} + public void copy() {} + public void paste() {} + public void duplicate() {} + public void grab() {} + public void mouseMoved(double x, double y) {} + public void select(Point pos, boolean additive) {} + public void boxSelect() {} + public void onEntry() {} + public void onExit() {} + public void clicked(InterfacePinHandle interfacePinHandle, int stateMask) {} + public void clickedEmpty(Point clicked, int stateMask) {} + public void clicked(Point clicked, int stateMask) {} + public boolean clickedHandle(HandleClickInfo handleClickInfo) { return false; } + //@formatter:on +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java new file mode 100644 index 00000000..1b8447e0 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/GrabState.java @@ -0,0 +1,41 @@ +package net.mograsim.logic.model.editor.states; + +import java.util.Map; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.Handle; + +public class GrabState extends EditorState +{ + private Map offsets; + + public GrabState(Editor editor, StateManager manager) + { + super(editor, manager); + } + + @Override + public void onEntry() + { + offsets = editor.getSelection().calculateOffsets(); + } + + @Override + public void grab() + { + manager.setState(new SelectionState(editor, manager)); + } + + @Override + public void mouseMoved(double x, double y) + { + editor.moveHandles(x, y, offsets); + } + + @Override + public void clicked(Point clicked, int stateMask) + { + manager.setState(new SelectionState(editor, manager)); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java new file mode 100644 index 00000000..baa2eff9 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/SelectionState.java @@ -0,0 +1,186 @@ +package net.mograsim.logic.model.editor.states; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas.ZoomedRenderer; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.Selection; +import net.mograsim.logic.model.editor.handles.Handle; +import net.mograsim.logic.model.editor.handles.PinHandle; +import net.mograsim.logic.model.editor.handles.WireHandle; +import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; +import net.mograsim.logic.model.editor.handles.WireHandle.WireHandleClickInfo; +import net.mograsim.logic.model.editor.ui.DialogManager; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; + +public class SelectionState extends EditorState +{ + private final ZoomedRenderer outlineRenderer = gc -> + { + if (editor.getSelection().size() > 1) + { + gc.setLineWidth(1); + gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW)); + gc.drawRectangle(editor.getSelection().getBounds()); + } + }; + + public SelectionState(Editor editor, StateManager manager) + { + super(editor, manager); + } + + @Override + public void add() + { + Point curserPos = editor.userInput.getWorldMousePosition(); + editor.addComponent(curserPos.x, curserPos.y); + } + + @Override + public void delete() + { + editor.deleteSelection(); + } + + @Override + public void copy() + { + editor.copy(); + } + + @Override + public void paste() + { + Point curserPos = editor.userInput.getWorldMousePosition(); + editor.paste(curserPos.x, curserPos.y); + } + + @Override + public void duplicate() + { + editor.duplicate(); + } + + @Override + public void grab() + { + if (!editor.getSelection().isEmpty()) + manager.setState(new GrabState(editor, manager)); + } + + @Override + public void boxSelect() + { + manager.setState(new BoxSelectionState(editor, manager)); + } + + @Override + public void onEntry() + { + editor.gui.logicCanvas.addZoomedRenderer(outlineRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void onExit() + { + editor.gui.logicCanvas.removeZoomedRenderer(outlineRenderer); + editor.gui.logicCanvas.redrawThreadsafe(); + } + + @Override + public void clickedEmpty(Point clicked, int stateMask) + { + editor.getSelection().clear(); + if ((stateMask & SWT.ALT) == SWT.ALT) + { + String[] result = DialogManager.openMultiTextDialog("Add Pin...", "Add", "Cancel", "Name", "Logic Width", "Usage"); + if (result != null) + { + try + { + Pin p = editor.toBeEdited.addSubmodelInterface(new MovablePin(editor.getSubmodel(), editor.toBeEdited, result[0], + Integer.parseInt(result[1]), PinUsage.valueOf(result[2]), clicked.x, clicked.y)); + editor.handleManager.getInterfacePinHandle(p).reqMove(clicked.x, clicked.y); + } + catch (NumberFormatException e) + { + editor.dialogManager.openWarningDialog("Failed to create Pin!", "Bit width must be a number!"); + } + catch (IllegalArgumentException e) + { + editor.dialogManager.openWarningDialog("Failed to create Pin!", "Usage must be one of INPUT, OUTPUT, TRISTATE!"); + } + } + } + } + + @Override + public boolean clickedHandle(HandleClickInfo handleClickInfo) + { + switch (handleClickInfo.clicked.getType()) + { + case INTERFACE_PIN: + if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) + { + manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked)); + break; + } + case CORNER: + case COMPONENT: + case WIRE_POINT: + boolean additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT; + select(handleClickInfo.clicked, additive); + break; + case STATIC_PIN: + if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) + manager.setState(new CreateWireState(editor, manager, (PinHandle) handleClickInfo.clicked)); + else + return false; + break; + case WIRE: + if ((handleClickInfo.stateMask & SWT.CTRL) == SWT.CTRL) + { + WireHandleClickInfo info = (WireHandleClickInfo) handleClickInfo; + WireHandle clicked = (WireHandle) info.clicked; + clicked.parent.insertPathPoint(info.posOnWire, info.segment); + } else + { + additive = (handleClickInfo.stateMask & SWT.SHIFT) == SWT.SHIFT; + select(handleClickInfo.clicked, additive); + } + break; + default: + return false; + } + return true; + } + + private void select(Handle h, boolean additive) + { + Selection sel = editor.getSelection(); + if (sel.contains(h)) + if (additive) + sel.remove(h); + else + { + if (editor.getSelection().size() > 1) + { + sel.clear(); + sel.add(h); + } else + sel.clear(); + } + else + { + if (!additive) + sel.clear(); + sel.add(h); + } + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java new file mode 100644 index 00000000..d4b3fc4d --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/states/StateManager.java @@ -0,0 +1,78 @@ +package net.mograsim.logic.model.editor.states; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.Handle.HandleClickInfo; + +public class StateManager +{ + private EditorState state; + + public StateManager(Editor session) + { + state = new SelectionState(session, this); + state.onEntry(); + } + + public EditorState getState() + { + return state; + } + + public void setState(EditorState state) + { + this.state.onExit(); + this.state = state; + state.onEntry(); + } + + public void add() + { + state.add(); + } + + public void delete() + { + state.delete(); + } + + public void copy() + { + state.copy(); + } + + public void paste() + { + state.paste(); + } + + public void duplicate() + { + state.duplicate(); + } + + public void grab() + { + state.grab(); + } + + public void mouseMoved(double x, double y) + { + state.mouseMoved(x, y); + } + + public void select(Point pos, boolean additive) + { + state.select(pos, additive); + } + + public boolean clickedHandle(HandleClickInfo handleClickInfo) + { + return state.clickedHandle(handleClickInfo); + } + + public void boxSelect() + { + state.boxSelect(); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java new file mode 100644 index 00000000..df7455e6 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/DialogManager.java @@ -0,0 +1,199 @@ +package net.mograsim.logic.model.editor.ui; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Dialog; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.MessageBox; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class DialogManager +{ + private Shell parent; + + public DialogManager(Shell parent) + { + this.parent = parent; + } + + public void openWarningDialog(String title, String message) + { + MessageBox b = new MessageBox(parent, SWT.ICON_WARNING | SWT.OK); + b.setText(title); + b.setMessage(message); + b.open(); + } + + private static abstract class FlexibleInputsDialog extends Dialog + { + private final String title, acceptLabel, cancelLabel; + + protected String[] result; + + public FlexibleInputsDialog(String title, String acceptLabel, String cancelLabel, String... inputs) + { + this(false, title, acceptLabel, cancelLabel, inputs); + } + + public FlexibleInputsDialog(boolean resizable, String title, String acceptLabel, String cancelLabel, String... inputs) + { + super(new Shell(SWT.CLOSE | (resizable ? SWT.RESIZE | SWT.MAX : 0) | SWT.TITLE | SWT.MIN | SWT.ON_TOP | SWT.APPLICATION_MODAL)); + this.title = title; + this.acceptLabel = acceptLabel; + this.cancelLabel = cancelLabel; + } + + protected abstract void setupWidgets(Composite parent); + + protected abstract void buildResult(); + + /** + * @return May be null (if {@link Dialog} was cancelled) + */ + public String[] open() + { + Shell shell = getParent(); + Display display = shell.getDisplay(); + shell.setMinimumSize(500, 150); + shell.setText(title); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + shell.setLayout(layout); + + Composite inputContainer = new Composite(shell, SWT.BORDER); + GridData gd = new GridData(); + gd.horizontalSpan = 2; + gd.horizontalAlignment = SWT.FILL; + gd.grabExcessHorizontalSpace = true; + gd.verticalAlignment = SWT.FILL; + gd.grabExcessVerticalSpace = true; + inputContainer.setLayoutData(gd); + setupWidgets(inputContainer); + + Button b1 = new Button(shell, SWT.PUSH); + b1.addListener(SWT.Selection, e -> + { + buildResult(); + shell.dispose(); + }); + + b1.setText(acceptLabel); + Button b2 = new Button(shell, SWT.PUSH); + b2.addListener(SWT.Selection, e -> + { + shell.dispose(); + }); + b2.setText(cancelLabel); + + shell.pack(); + + shell.open(); + while (!shell.isDisposed()) + if (!display.readAndDispatch()) + display.sleep(); + return result; + } + } + + private static class MultiTextFieldsDialog extends FlexibleInputsDialog + { + private final String[] inputs; + private Text[] textFields; + + public MultiTextFieldsDialog(String title, String acceptLabel, String cancelLabel, String... inputs) + { + super(title, acceptLabel, cancelLabel); + this.inputs = inputs; + } + + @Override + protected void setupWidgets(Composite parent) + { + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + parent.setLayout(layout); + this.textFields = new Text[inputs.length]; + for (int i = 0; i < inputs.length; i++) + { + Label textFieldName = new Label(parent, SWT.NONE); + textFieldName.setText(inputs[i].concat(":")); + GridData g = new GridData(); + g.grabExcessHorizontalSpace = true; + g.horizontalAlignment = SWT.FILL; + Text newTextField = new Text(parent, SWT.BORDER); + newTextField.setLayoutData(g); + textFields[i] = newTextField; + } + } + + @Override + protected void buildResult() + { + result = new String[textFields.length]; + for (int i = 0; i < textFields.length; i++) + result[i] = textFields[i].getText(); + } + + } + + /** + * @return The Strings entered, in order of the input labels the dialog was opened with, if the dialog was accepted, null if the dialog + * was cancelled. + */ + public static String[] openMultiTextDialog(String title, String acceptLabel, String cancelLabel, String... inputs) + { + return new MultiTextFieldsDialog(title, acceptLabel, cancelLabel, inputs).open(); + } + + public static class MultiLineTextFieldDialog extends FlexibleInputsDialog + { + private final String input; + private Text textField; + + public MultiLineTextFieldDialog(String title, String acceptLabel, String cancelLabel, String input) + { + super(true, title, acceptLabel, cancelLabel); + this.input = input; + } + + @Override + protected void setupWidgets(Composite parent) + { + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + parent.setLayout(layout); + GridData gd = new GridData(); + Label l = new Label(parent, SWT.NONE); + l.setText(input); + gd.verticalAlignment = SWT.TOP; + l.setLayoutData(gd); + gd = new GridData(); + textField = new Text(parent, SWT.V_SCROLL); + textField.setLayoutData(gd); + gd.grabExcessHorizontalSpace = true; + gd.grabExcessVerticalSpace = true; + gd.horizontalAlignment = SWT.FILL; + gd.verticalAlignment = SWT.FILL; + } + + @Override + protected void buildResult() + { + result = new String[] { textField.getText() }; + } + } + + /** + * @return The String entered if the dialog was accepted, null if the dialog was cancelled. + */ + public static String openMultiLineTextDialog(String title, String acceptLabel, String cancelLabel, String input) + { + String[] result = new MultiLineTextFieldDialog(title, acceptLabel, cancelLabel, input).open(); + return result == null ? null : result[0]; + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java new file mode 100644 index 00000000..aedaa481 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorCanvas.java @@ -0,0 +1,51 @@ +package net.mograsim.logic.model.editor.ui; + +import java.util.Collection; + +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; + +import net.haspamelodica.swt.helper.gcs.TranslatedGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.LogicUICanvas; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.handles.Handle; +import net.mograsim.preferences.Preferences; + +//TODO: Remove Inheritance +public class EditorCanvas extends LogicUICanvas +{ + private Collection handles; + + public EditorCanvas(Composite parent, int style, Editor editor) + { + super(parent, style, editor.toBeEdited.submodel); + + handles = editor.handleManager.getHandles(); + editor.handleManager.addHandleAddedListener(h -> + { + redrawThreadsafe(); + h.addRedrawListener(this::redrawThreadsafe); + }); + // TODO: Is this even necessary? The Handle should be finalized by the gc + editor.handleManager.addHandleRemovedListener(h -> + { + redrawThreadsafe(); + h.removeRedrawListener(this::redrawThreadsafe); + }); + + addZoomedRenderer(gc -> + { + Rectangle visibleRegion = new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom); + Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background"); + if (background != null) + setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the + // canvas + + TranslatedGC tgc = new TranslatedGC(gc, 0.0d, 0.0d, 1 / editor.toBeEdited.getSubmodelScale(), false); + editor.toBeEdited.getOutlineRenderer().render(tgc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); + + handles.forEach(h -> h.render(gc, visibleRegion)); + }); + } +} diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java new file mode 100644 index 00000000..17e12ebb --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/ui/EditorGUI.java @@ -0,0 +1,232 @@ +package net.mograsim.logic.model.editor.ui; + +import java.io.IOException; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.List; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.ToolBar; +import org.eclipse.swt.widgets.ToolItem; + +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; +import net.mograsim.logic.model.editor.Editor; +import net.mograsim.logic.model.editor.SaveLoadManager; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class EditorGUI +{ + public final Display display; + public final Shell shell; + public final EditorCanvas logicCanvas; + private final List addList; + private final Editor editor; + + public EditorGUI(Editor editor) + { + this.editor = editor; + display = Display.getDefault(); + shell = new Shell(display); + + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + shell.setLayout(layout); + + setupTopToolBar(shell); + Composite innerComp = new Composite(shell, SWT.NONE); + GridData innerCompData = new GridData(); + innerCompData.grabExcessHorizontalSpace = true; + innerCompData.grabExcessVerticalSpace = true; + innerCompData.horizontalAlignment = SWT.FILL; + innerCompData.verticalAlignment = SWT.FILL; + innerComp.setLayoutData(innerCompData); + + GridLayout innerLayout = new GridLayout(); + innerComp.setLayout(innerLayout); + innerLayout.numColumns = 2; + + GridData d = new GridData(); + d.grabExcessHorizontalSpace = true; + d.horizontalAlignment = SWT.FILL; + d.grabExcessVerticalSpace = true; + d.verticalAlignment = SWT.FILL; + + logicCanvas = new EditorCanvas(innerComp, SWT.TRAIL, editor); + logicCanvas.setLayoutData(d); + + d = new GridData(); + d.grabExcessVerticalSpace = true; + d.verticalAlignment = SWT.FILL; + d.verticalSpan = 2; + addList = new List(innerComp, SWT.V_SCROLL); + addList.setLayoutData(d); + refreshAddList(); + + setupBottomToolBar(innerComp); + + ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(logicCanvas); + userInput.buttonDrag = 3; + userInput.buttonZoom = 2; + userInput.enableUserInput(); + new ZoomableCanvasOverlay(logicCanvas, null).enableScale(); + } + + private ToolBar setupTopToolBar(Composite parent) + { + GridData d = new GridData(); + d.grabExcessHorizontalSpace = true; + d.horizontalAlignment = SWT.FILL; + + ToolBar toolBar = new ToolBar(parent, SWT.BORDER); + toolBar.setLayoutData(d); + + ToolItem file = new ToolItem(toolBar, SWT.DROP_DOWN); + + // TODO + DropDownEntry newEntry = new DropDownEntry("New", e -> Editor.openNewEditor()); + DropDownEntry loadEntry = new DropDownEntry("Load", e -> + { + try + { + SaveLoadManager.openLoadDialog(); + } + catch (IOException e1) + { + editor.dialogManager.openWarningDialog("Failed to load Component!", e1.getMessage()); + } + }); + DropDownEntry saveEntry = new DropDownEntry("Save", e -> editor.save()); + DropDownEntry saveAsEntry = new DropDownEntry("Save as...", e -> editor.saveAs()); + + DropDownEntry[] entries = new DropDownEntry[] { newEntry, loadEntry, saveEntry, saveAsEntry }; + + setupDrowpDownMenu(file, entries); + + file.setText("File"); + return toolBar; + } + + private ToolBar setupBottomToolBar(Composite parent) + { + GridData d = new GridData(); + d.grabExcessHorizontalSpace = true; + d.horizontalAlignment = SWT.FILL; + + ToolBar toolBar = new ToolBar(parent, SWT.BORDER); + toolBar.setLayoutData(d); + + ToolItem snappingLabel = new ToolItem(toolBar, SWT.NONE); + snappingLabel.setText("Snapping:"); + + ToolItem snappSelect = new ToolItem(toolBar, SWT.DROP_DOWN); + DropDownEntry[] entries = new DropDownEntry[Editor.Snapping.values().length]; + int index = 0; + for (Editor.Snapping sn : Editor.Snapping.values()) + { + entries[index++] = new DropDownEntry(sn.toString(), e -> + { + editor.setSnapping(sn); + snappSelect.setText(sn.toString()); + }); + } + snappSelect.setText(editor.getSnapping().toString()); + setupDrowpDownMenu(snappSelect, entries); + + new ToolItem(toolBar, SWT.SEPARATOR); + + toolBar.pack(); + + return toolBar; + } + + private void setupDrowpDownMenu(ToolItem parent, DropDownEntry[] entries) + { + Menu menu = new Menu(shell, SWT.POP_UP); + for (DropDownEntry entry : entries) + { + MenuItem item = new MenuItem(menu, SWT.PUSH); + item.addSelectionListener(new SelectionListener() + { + @Override + public void widgetSelected(SelectionEvent e) + { + entry.listener.widgetSelected(e); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) + { + widgetSelected(e); + } + }); + item.setText(entry.title); + } + + parent.addListener(SWT.Selection, new Listener() + { + public void handleEvent(Event event) + { + if (event.detail == SWT.ARROW) + { + Rectangle rect = parent.getBounds(); + Point pt = new Point(rect.x, rect.y + rect.height); + pt = parent.getParent().toDisplay(pt); + menu.setLocation(pt.x, pt.y); + menu.setVisible(true); + } + } + }); + } + + private static class DropDownEntry + { + public final String title; + public final EntrySelectedListener listener; + + public DropDownEntry(String title, EntrySelectedListener listener) + { + super(); + this.title = title; + this.listener = listener; + } + } + + private static interface EntrySelectedListener + { + public void widgetSelected(SelectionEvent e); + } + + public void refreshAddList() + { + addList.setItems(IndirectModelComponentCreator.getStandardComponentIDs().keySet().stream().sorted().toArray(String[]::new)); + addList.select(0); + } + + public String getAddListSelected() + { + String[] selection = addList.getSelection(); + if (selection.length == 0) + throw new IllegalStateException("Selection in the Add Component List may never be empty!"); + return selection[0]; + } + + public void open() + { + shell.open(); + while (!shell.isDisposed()) + if (!display.readAndDispatch()) + display.sleep(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java new file mode 100644 index 00000000..253dfdd3 --- /dev/null +++ b/plugins/net.mograsim.logic.model.editor/src/net/mograsim/logic/model/editor/util/PrioritySet.java @@ -0,0 +1,98 @@ +package net.mograsim.logic.model.editor.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.Set; + +/** + * Similar to a SortedSet, except it is allowed for multiple elements to have the same priority (c.compare(e1, e2) == 0 is + * allowed to be true for two different elements e1 and e2). However, to elements are not allowed to be equal according to + * Object.equals(Object o). + * + * @author Fabian Stemmler + * + * @param the type of elements in this list + */ +public class PrioritySet implements Set +{ + private ArrayList list; + private Comparator c; + + public PrioritySet(Comparator c) + { + setComparator(c); + list = new ArrayList<>(); + } + + @SuppressWarnings("unchecked") + public PrioritySet() + { + this((e1, e2) -> ((Comparable) e1).compareTo(e2)); + } + + public void setComparator(Comparator c) + { + this.c = c; + } + + //@formatter:off + @Override + public int size() { return list.size(); } + @Override + public boolean isEmpty() { return list.isEmpty(); } + @Override + public boolean contains(Object o) { return list.isEmpty(); } + @Override + public Iterator iterator() { return list.iterator(); } + @Override + public Object[] toArray() { return list.toArray(); } + @Override + public E[] toArray(E[] a) { return list.toArray(a); } + @Override + public boolean remove(Object o) { return list.remove(o); } + @Override + public boolean containsAll(Collection c) { return list.containsAll(c); } + @Override + public boolean removeAll(Collection c) { return list.removeAll(c); } + @Override + public boolean retainAll(Collection c) { return list.retainAll(c); } + @Override + public void clear() { list.clear(); } + //@formatter:on + + @Override + public boolean add(T e) + { + if (isEmpty()) + { + list.add(e); + return true; + } + int index = Collections.binarySearch(list, e, c); + if (index < 0) + index = -index - 1; + if (index < size()) + { + if (list.get(index).equals(e)) + return false; + list.add(index, e); + } else + list.add(e); + return true; + } + + @Override + public boolean addAll(Collection c) + { + return c.stream().map(e -> add(e)).reduce(false, (a, b) -> a || b); + } + + @Override + public String toString() + { + return list.toString(); + } +} diff --git a/plugins/net.mograsim.logic.model/.classpath b/plugins/net.mograsim.logic.model/.classpath new file mode 100644 index 00000000..4a00becd --- /dev/null +++ b/plugins/net.mograsim.logic.model/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.logic.model/.project b/plugins/net.mograsim.logic.model/.project new file mode 100644 index 00000000..c6d10606 --- /dev/null +++ b/plugins/net.mograsim.logic.model/.project @@ -0,0 +1,30 @@ + + + net.mograsim.logic.model + + + net.mograsim.logic.core + SWTZoomableCanvas + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.logic.model/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.logic.model/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.logic.model/META-INF/MANIFEST.MF b/plugins/net.mograsim.logic.model/META-INF/MANIFEST.MF new file mode 100644 index 00000000..e6b077ab --- /dev/null +++ b/plugins/net.mograsim.logic.model/META-INF/MANIFEST.MF @@ -0,0 +1,31 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: net.mograsim.logic.model;singleton:=true +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.logic.model, + net.mograsim.logic.model.examples, + net.mograsim.logic.model.model, + net.mograsim.logic.model.model.components, + net.mograsim.logic.model.model.components.atomic, + net.mograsim.logic.model.model.components.submodels, + net.mograsim.logic.model.model.wires, + net.mograsim.logic.model.modeladapter, + net.mograsim.logic.model.modeladapter.componentadapters, + net.mograsim.logic.model.serializing, + net.mograsim.logic.model.snippets, + net.mograsim.logic.model.snippets.highlevelstatehandlers, + net.mograsim.logic.model.snippets.highlevelstatehandlers.standard, + net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic, + net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent, + net.mograsim.logic.model.snippets.outlinerenderers, + net.mograsim.logic.model.snippets.symbolrenderers, + net.mograsim.logic.model.util +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.eclipse.swt;bundle-version="3.0.0";visibility:=reexport, + SWTZoomableCanvas;bundle-version="1.0.0";visibility:=reexport, + net.mograsim.logic.core;bundle-version="0.1.0";visibility:=reexport, + com.google.gson;bundle-version="2.8.2";visibility:=reexport, + net.mograsim.preferences;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.logic.model +Bundle-Vendor: Mograsim Team diff --git a/plugins/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties b/plugins/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties new file mode 100644 index 00000000..fad36e3e --- /dev/null +++ b/plugins/net.mograsim.logic.model/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,3 @@ +#Properties file for net.mograsim.logic.model +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim logic model and user interface \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/build.properties b/plugins/net.mograsim.logic.model/build.properties new file mode 100644 index 00000000..d6642e65 --- /dev/null +++ b/plugins/net.mograsim.logic.model/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/ diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java new file mode 100644 index 00000000..a9fde7a1 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicExecuter.java @@ -0,0 +1,111 @@ +package net.mograsim.logic.model; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; + +import net.mograsim.logic.core.timeline.Timeline; + +//TODO maybe move to logic core? +public class LogicExecuter +{ + // TODO replace with CoreModel when it exists + private final Timeline timeline; + + private final AtomicBoolean shouldBeRunningLive; + private final AtomicBoolean isRunningLive; + private final AtomicLong nextExecSimulTime; + private final Thread simulationThread; + + public LogicExecuter(Timeline timeline) + { + this.timeline = timeline; + + timeline.setTimeFunction(System::currentTimeMillis); + shouldBeRunningLive = new AtomicBoolean(); + isRunningLive = new AtomicBoolean(); + nextExecSimulTime = new AtomicLong(); + simulationThread = new Thread(() -> + { + isRunningLive.set(true); + synchronized (isRunningLive) + { + isRunningLive.notify(); + } + try + { + while (shouldBeRunningLive.get()) + { + // always execute to keep timeline from "hanging behind" for too long + long current = System.currentTimeMillis(); + timeline.executeUntil(timeline.laterThan(current), current + 10); + long sleepTime; + if (timeline.hasNext()) + sleepTime = timeline.nextEventTime() - current; + else + sleepTime = 10000; + try + { + nextExecSimulTime.set(current + sleepTime); + if (sleepTime > 0) + Thread.sleep(sleepTime); + } + catch (@SuppressWarnings("unused") InterruptedException e) + {// do nothing; it is normal execution flow to be interrupted + } + } + } + finally + { + isRunningLive.set(false); + synchronized (isRunningLive) + { + isRunningLive.notify(); + } + } + }); + timeline.addEventAddedListener(event -> + { + if (isRunningLive.get()) + if (Timeline.timeCmp(event.getTiming(), nextExecSimulTime.get()) < 0) + simulationThread.interrupt(); + }); + } + + public void executeNextStep() + { + timeline.executeNext(); + } + + public synchronized void startLiveExecution() + { + if (shouldBeRunningLive.get()) + return; + shouldBeRunningLive.set(true); + simulationThread.start(); + waitForIsRunning(true); + } + + public synchronized void stopLiveExecution() + { + if (!shouldBeRunningLive.get()) + return; + shouldBeRunningLive.set(false); + simulationThread.interrupt(); + waitForIsRunning(false); + } + + private void waitForIsRunning(boolean expectedState) + { + while (isRunningLive.get() ^ expectedState) + try + { + synchronized (isRunningLive) + { + isRunningLive.wait(); + } + } + catch (@SuppressWarnings("unused") InterruptedException e) + {// no need to do anything + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java new file mode 100644 index 00000000..15346c63 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUICanvas.java @@ -0,0 +1,239 @@ +package net.mograsim.logic.model; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.haspamelodica.swt.helper.zoomablecanvas.ZoomableCanvas; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.preferences.Preferences; + +/** + * Simulation visualizer canvas. + * + * @author Daniel Kirschten + */ +public class LogicUICanvas extends ZoomableCanvas +{ + private static final boolean OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL = false; + + private final LogicModel model; + + public LogicUICanvas(Composite parent, int style, LogicModel model) + { + super(parent, style, Preferences.current().getBoolean("net.mograsim.logic.model.improvetext")); + + this.model = model; + + LogicUIRenderer renderer = new LogicUIRenderer(model); + addZoomedRenderer(gc -> + { + Color background = Preferences.current().getColor("net.mograsim.logic.model.color.background"); + if (background != null) + setBackground(background);// this.setBackground, not gc.setBackground to have the background fill the canvas + renderer.render(gc, new Rectangle(-offX / zoom, -offY / zoom, gW / zoom, gH / zoom)); + }); + model.setRedrawHandler(this::redrawThreadsafe); + + addListener(SWT.MouseDown, this::mouseDown); + + if (OPEN_DEBUG_SETHIGHLEVELSTATE_SHELL) + openDebugSetHighLevelStateShell(model); + } + + private void mouseDown(Event e) + { + if (e.button == 1) + { + Point click = canvasToWorldCoords(e.x, e.y); + for (ModelComponent component : model.getComponentsByName().values()) + if (component.getBounds().contains(click) && component.clicked(click.x, click.y)) + { + redraw(); + break; + } + } + } + + private void openDebugSetHighLevelStateShell(LogicModel model) + { + Shell debugShell = new Shell(); + debugShell.setLayout(new GridLayout(2, false)); + new Label(debugShell, SWT.NONE).setText("Target component: "); + Combo componentSelector = new Combo(debugShell, SWT.DROP_DOWN | SWT.READ_ONLY); + componentSelector.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + List componentsByItemIndex = new ArrayList<>(); + List models = new ArrayList<>(); + AtomicBoolean recalculateQueued = new AtomicBoolean(); + AtomicReference> compAdded = new AtomicReference<>(); + AtomicReference> compRemoved = new AtomicReference<>(); + compAdded.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, + recalculateQueued, true)); + compRemoved.set(c -> compsChanged(compAdded.get(), compRemoved.get(), c, models, componentsByItemIndex, componentSelector, model, + recalculateQueued, false)); + iterateModelTree(compAdded.get(), compRemoved.get(), model, models, true); + debugShell.addListener(SWT.Dispose, e -> models.forEach(m -> + { + m.removeComponentAddedListener(compAdded.get()); + m.removeComponentRemovedListener(compRemoved.get()); + })); + queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); + new Label(debugShell, SWT.NONE).setText("Target state ID: "); + Text stateIDText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); + stateIDText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + new Label(debugShell, SWT.NONE).setText("Value type: "); + Composite radioGroup = new Composite(debugShell, SWT.NONE); + radioGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + GridLayout radioGroupLayout = new GridLayout(2, false); + radioGroupLayout.marginHeight = 0; + radioGroupLayout.marginWidth = 0; + radioGroup.setLayout(radioGroupLayout); + Button radioBit = new Button(radioGroup, SWT.RADIO); + radioBit.setText("Single bit"); + Button radioBitVector = new Button(radioGroup, SWT.RADIO); + radioBitVector.setText("Bitvector"); + new Label(debugShell, SWT.NONE).setText("Value string representation: \n(Bit vectors: MSBit...LSBit)"); + Text valueText = new Text(debugShell, SWT.SINGLE | SWT.LEAD | SWT.BORDER); + valueText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + Button send = new Button(debugShell, SWT.PUSH); + send.setText("Send!"); + Button get = new Button(debugShell, SWT.PUSH); + get.setText("Get!"); + Text output = new Text(debugShell, SWT.READ_ONLY); + output.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); + Listener sendAction = e -> + { + try + { + int componentIndex = componentSelector.getSelectionIndex(); + if (componentIndex < 0 || componentIndex >= componentsByItemIndex.size()) + throw new RuntimeException("No component selected"); + ModelComponent target = componentsByItemIndex.get(componentIndex); + String valueString = valueText.getText(); + Object value; + if (radioBit.getSelection()) + value = Bit.parse(valueString); + else if (radioBitVector.getSelection()) + value = BitVector.parse(valueString); + else + throw new RuntimeException("No value type selected"); + target.setHighLevelState(stateIDText.getText(), value); + output.setText("Success!"); + } + catch (Exception x) + { + output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); + } + }; + Listener getAction = e -> + { + try + { + if (componentSelector.getSelectionIndex() >= componentsByItemIndex.size()) + throw new RuntimeException("No valid component selected"); + output.setText("Success! Value: \r\n" + + componentsByItemIndex.get(componentSelector.getSelectionIndex()).getHighLevelState(stateIDText.getText())); + } + catch (Exception x) + { + output.setText(x.getClass().getSimpleName() + (x.getMessage() == null ? "" : ": " + x.getMessage())); + } + }; + send.addListener(SWT.Selection, sendAction); + valueText.addListener(SWT.DefaultSelection, sendAction); + get.addListener(SWT.Selection, getAction); + stateIDText.addListener(SWT.DefaultSelection, getAction); + debugShell.open(); + } + + private void compsChanged(Consumer compAdded, Consumer compRemoved, ModelComponent c, + List models, List componentsByItemIndex, Combo componentSelector, LogicModel model, + AtomicBoolean recalculateQueued, boolean add) + { + iterateSubmodelTree(compAdded, compRemoved, c, models, add); + queueRecalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model); + } + + private void iterateSubmodelTree(Consumer compAdded, Consumer compRemoved, + ModelComponent c, List models, boolean add) + { + if (c instanceof SubmodelComponent) + iterateModelTree(compAdded, compRemoved, ((SubmodelComponent) c).submodel, models, add); + } + + private void iterateModelTree(Consumer compAdded, Consumer compRemoved, + LogicModel model, List models, boolean add) + { + if (add ^ models.contains(model)) + { + if (add) + { + models.add(model); + model.addComponentAddedListener(compAdded); + model.addComponentRemovedListener(compRemoved); + } else + { + models.remove(model); + model.removeComponentAddedListener(compAdded); + model.removeComponentRemovedListener(compRemoved); + } + for (ModelComponent c : model.getComponentsByName().values()) + iterateSubmodelTree(compAdded, compRemoved, c, models, add); + } + } + + private void queueRecalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, + Combo componentSelector, LogicModel model) + { + if (recalculateQueued.compareAndSet(false, true)) + getDisplay().asyncExec(() -> recalculateComponentSelector(recalculateQueued, componentsByItemIndex, componentSelector, model)); + } + + private void recalculateComponentSelector(AtomicBoolean recalculateQueued, List componentsByItemIndex, + Combo componentSelector, LogicModel model) + { + recalculateQueued.set(false); + componentsByItemIndex.clear(); + componentSelector.setItems(); + addComponentSelectorItems(componentsByItemIndex, "", componentSelector, model); + } + + private void addComponentSelectorItems(List componentsByItemIndex, String base, Combo componentSelector, + LogicModel model) + { + model.getComponentsByName().values().stream().sorted((c1, c2) -> c1.getName().compareTo(c2.getName())).forEach(c -> + { + if (!(c instanceof ModelWireCrossPoint || c instanceof SubmodelInterface)) + { + String item = base + c.getName(); + componentsByItemIndex.add(c); + componentSelector.add(item); + if (c instanceof SubmodelComponent) + addComponentSelectorItems(componentsByItemIndex, item + " -> ", componentSelector, ((SubmodelComponent) c).submodel); + } + }); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java new file mode 100644 index 00000000..1df2f7b7 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIRenderer.java @@ -0,0 +1,58 @@ +package net.mograsim.logic.model; + +import org.eclipse.swt.SWT; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.preferences.Preferences; + +public class LogicUIRenderer +{ + private static final boolean DRAW_PINS = false; + + private final LogicModel model; + + public LogicUIRenderer(LogicModel model) + { + this.model = model; + } + + public void render(GeneralGC gc, Rectangle visibleRegion) + { + gc.setAntialias(SWT.ON); + gc.setClipping(visibleRegion); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + model.getWiresByName().values().forEach(w -> + { + Rectangle bounds = w.getBounds(); + double lw = gc.getLineWidth(); + if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw)) + w.render(gc); + }); + model.getComponentsByName().values().forEach(c -> renderComponent(gc, c, visibleRegion)); + } + + private static void renderComponent(GeneralGC gc, ModelComponent component, Rectangle visibleRegion) + { + Rectangle bounds = component.getBounds(); + double lw = gc.getLineWidth(); + if (visibleRegion.intersects(bounds.x - lw, bounds.y - lw, bounds.width + lw + lw, bounds.height + lw + lw)) + { + component.render(gc, visibleRegion); + if (DRAW_PINS) + { + gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_DARK_CYAN)); + for (Pin p : component.getPins().values()) + { + Point pos = p.getPos(); + gc.fillOval(pos.x - 1, pos.y - 1, 2, 2); + } + } + } + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java new file mode 100644 index 00000000..49182d66 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/LogicUIStandaloneGUI.java @@ -0,0 +1,53 @@ +package net.mograsim.logic.model; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; + +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasOverlay; +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; +import net.mograsim.logic.model.model.LogicModel; + +/** + * Standalone simulation visualizer graphical user interface. + * + * @author Daniel Kirschten + */ +public class LogicUIStandaloneGUI implements Runnable +{ + private final Display display; + private final Shell shell; + private final LogicUICanvas ui; + + public LogicUIStandaloneGUI(LogicModel model) + { + display = new Display(); + shell = new Shell(display); + shell.setLayout(new FillLayout()); + ui = new LogicUICanvas(shell, SWT.NONE, model); + + ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui); + userInput.buttonDrag = 3; + userInput.buttonZoom = 2; + userInput.enableUserInput(); + new ZoomableCanvasOverlay(ui, null).enableScale(); + } + + public LogicUICanvas getLogicUICanvas() + { + return ui; + } + + /** + * Opens the UI shell. Returns when the shell is closed. + */ + @Override + public void run() + { + shell.open(); + while (!shell.isDisposed()) + if (!display.readAndDispatch()) + display.sleep(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java new file mode 100644 index 00000000..03d0335c --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/SimpleLogicUIStandalone.java @@ -0,0 +1,73 @@ +package net.mograsim.logic.model; + +import java.util.function.Consumer; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; + +public class SimpleLogicUIStandalone +{ + public static void executeVisualisation(Consumer setupLogicModel) + { + executeVisualisation(setupLogicModel, (Consumer) null); + } + + public static void executeVisualisation(Consumer setupLogicModel, Consumer beforeRun) + { + CoreModelParameters params = new CoreModelParameters(); + params.gateProcessTime = 50; + params.wireTravelTime = 10; + executeVisualisation(setupLogicModel, params, beforeRun); + } + + public static void executeVisualisation(Consumer setupLogicModel, CoreModelParameters params) + { + executeVisualisation(setupLogicModel, params, null); + } + + public static void executeVisualisation(Consumer setupLogicModel, CoreModelParameters params, + Consumer beforeRun) + { + // setup logic model + LogicModelModifiable logicModel = new LogicModelModifiable(); + setupLogicModel.accept(logicModel); + + // convert to core model + Timeline timeline = LogicCoreAdapter.convert(logicModel, params); + + // initialize UI and executer + LogicUIStandaloneGUI ui = new LogicUIStandaloneGUI(logicModel); + LogicExecuter exec = new LogicExecuter(timeline); + + if (beforeRun != null) + beforeRun.accept(new VisualisationObjects(logicModel, timeline, ui, exec)); + + // run it + exec.startLiveExecution(); + ui.run(); + exec.stopLiveExecution(); + } + + public static class VisualisationObjects + { + public final LogicModelModifiable model; + public final Timeline timeline; + public final LogicUIStandaloneGUI gui; + public final LogicExecuter executer; + + public VisualisationObjects(LogicModelModifiable model, Timeline timeline, LogicUIStandaloneGUI gui, LogicExecuter executer) + { + this.model = model; + this.timeline = timeline; + this.gui = gui; + this.executer = executer; + } + } + + private SimpleLogicUIStandalone() + { + throw new UnsupportedOperationException("No SimpleLogicUIStandalone instances"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java new file mode 100644 index 00000000..14073bd1 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/ClickableSubmodelComponentsTest.java @@ -0,0 +1,38 @@ +package net.mograsim.logic.model.examples; + +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.submodels.SimpleRectangularSubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; + +public class ClickableSubmodelComponentsTest +{ + public static void main(String[] args) + { + SimpleLogicUIStandalone.executeVisualisation(ClickableSubmodelComponentsTest::createExample); + } + + public static void createExample(LogicModelModifiable model) + { + @SuppressWarnings("unused") // Wire + SimpleRectangularSubmodelComponent comp = new SimpleRectangularSubmodelComponent(model, 1, "") + { + { + setSubmodelScale(.4); + setOutputPins("O0"); + + ModelManualSwitch sw = new ModelManualSwitch(submodelModifiable, 1); + ModelBitDisplay bd = new ModelBitDisplay(submodelModifiable, 1); + + sw.moveTo(10, 5); + bd.moveTo(50, 5); + + new ModelWire(submodelModifiable, sw.getOutputPin(), bd.getInputPin()); + + } + }; + comp.moveTo(10, 10); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java new file mode 100644 index 00000000..5f68c9cc --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/examples/RSLatchExample.java @@ -0,0 +1,61 @@ +package net.mograsim.logic.model.examples; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.atomic.ModelNotGate; +import net.mograsim.logic.model.model.components.atomic.ModelOrGate; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; + +public class RSLatchExample +{ + public static void main(String[] args) + { + SimpleLogicUIStandalone.executeVisualisation(RSLatchExample::createRSLatchExample); + } + + @SuppressWarnings("unused") // for Wires being created + public static void createRSLatchExample(LogicModelModifiable model) + { + ModelManualSwitch rIn = new ModelManualSwitch(model, 1); + rIn.moveTo(100, 100); + ModelManualSwitch sIn = new ModelManualSwitch(model, 1); + sIn.moveTo(100, 200); + + ModelOrGate or1 = new ModelOrGate(model, 1); + or1.moveTo(160, 102.5); + new ModelWire(model, rIn.getOutputPin(), or1.getPin("A")); + + ModelOrGate or2 = new ModelOrGate(model, 1); + or2.moveTo(160, 192.5); + new ModelWire(model, sIn.getOutputPin(), or2.getPin("B")); + + ModelNotGate not1 = new ModelNotGate(model, 1); + not1.moveTo(200, 107.5); + new ModelWire(model, or1.getPin("Y"), not1.getPin("A")); + + ModelNotGate not2 = new ModelNotGate(model, 1); + not2.moveTo(200, 197.5); + new ModelWire(model, or2.getPin("Y"), not2.getPin("A")); + + ModelWireCrossPoint p1 = new ModelWireCrossPoint(model, 1); + p1.moveCenterTo(250, 112.5); + new ModelWire(model, not1.getPin("Y"), p1); + new ModelWire(model, p1, or2.getPin("A"), new Point(250, 130), new Point(140, 185), new Point(140, 197.5)); + + ModelWireCrossPoint p2 = new ModelWireCrossPoint(model, 1); + p2.moveCenterTo(250, 202.5); + new ModelWire(model, not2.getPin("Y"), p2); + new ModelWire(model, p2, or1.getPin("B"), new Point(250, 185), new Point(140, 130), new Point(140, 117.5)); + + ModelWireCrossPoint o1 = new ModelWireCrossPoint(model, 1); + o1.moveCenterTo(270, 112.5); + new ModelWire(model, p1, o1); + + ModelWireCrossPoint o2 = new ModelWireCrossPoint(model, 1); + o2.moveCenterTo(270, 202.5); + new ModelWire(model, p2, o2); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java new file mode 100644 index 00000000..17d0a44e --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java @@ -0,0 +1,196 @@ +package net.mograsim.logic.model.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; + +public class LogicModel +{ + private final Map components; + private final Map componentDestroyFunctions; + private final Map componentsUnmodifiable; + private final Map wires; + private final Map wireDestroyFunctions; + private final Map wiresUnmodifiable; + + private final List> componentAddedListeners; + private final List> componentRemovedListeners; + private final List> wireAddedListeners; + private final List> wireRemovedListeners; + private final List> redrawHandlerChangedListeners; + + private Runnable redrawHandler; + + protected LogicModel() + { + components = new HashMap<>(); + componentDestroyFunctions = new HashMap<>(); + componentsUnmodifiable = Collections.unmodifiableMap(components); + wires = new HashMap<>(); + wireDestroyFunctions = new HashMap<>(); + wiresUnmodifiable = Collections.unmodifiableMap(wires); + + componentAddedListeners = new ArrayList<>(); + componentRemovedListeners = new ArrayList<>(); + wireAddedListeners = new ArrayList<>(); + wireRemovedListeners = new ArrayList<>(); + redrawHandlerChangedListeners = new ArrayList<>(); + } + + /** + * Adds the given component to the list of components and calls all componentAddedListeners. Don't call this method from application + * code as it is automatically called in {@link ModelComponent}'s constructor. + * + * @author Daniel Kirschten + */ + protected void componentCreated(ModelComponent component, Runnable destroyed) + { + if (components.containsKey(component.getName())) + throw new IllegalStateException("Don't add the same component twice!"); + components.put(component.getName(), component); + componentDestroyFunctions.put(component.getName(), destroyed); + callComponentAddedListeners(component); + requestRedraw(); + } + + /** + * Destroyes the given component, removes it from the list of components and calls all componentRemovedListeners. + * + * @author Daniel Kirschten + */ + protected void destroyComponent(ModelComponent component) + { + componentDestroyFunctions.get(component.getName()).run(); + if (!components.containsKey(component.getName())) + throw new IllegalStateException("Don't remove the same component twice!"); + components.remove(component.getName()); + callComponentRemovedListeners(component); + requestRedraw(); + } + + /** + * Adds the given wire to the list of wires and calls all wireAddedListeners. Don't call this method from application code as it is + * automatically called in {@link ModelWire}'s constructor. + * + * @author Daniel Kirschten + */ + protected void wireCreated(ModelWire wire, Runnable destroyed) + { + if (wires.containsKey(wire.name)) + throw new IllegalStateException("Don't add the same wire twice!"); + wires.put(wire.name, wire); + wireDestroyFunctions.put(wire.name, destroyed); + callWireAddedListeners(wire); + requestRedraw(); + } + + /** + * Destroys the given wire, removes it from the list of wires and calls all wireRemovedListeners. + * + * @author Daniel Kirschten + */ + protected void destroyWire(ModelWire wire) + { + wireDestroyFunctions.get(wire.name).run(); + if (!wires.containsKey(wire.name)) + throw new IllegalStateException("Don't remove the same wire twice!"); + wires.remove(wire.name); + callWireRemovedListeners(wire); + requestRedraw(); + } + + public Map getComponentsByName() + { + return componentsUnmodifiable; + } + + public Map getWiresByName() + { + return wiresUnmodifiable; + } + + public ModelComponent getComponentByName(String name) + { + return components.get(name); + } + + @SuppressWarnings("unchecked") + public T getComponentByName(String name, Class expectedComponentClass) + { + ModelComponent comp = components.get(name); + Objects.requireNonNull(comp, "Invaild path, component " + name + " not found"); + if (expectedComponentClass.isInstance(comp)) + return (T) comp; + throw new IllegalArgumentException("The component " + name + " is not an instance of " + expectedComponentClass); + } + + public ModelWire getWireByName(String name) + { + return wires.get(name); + } + + public T getComponentBySubmodelPath(String path, Class modelClass) + { + int firstDot = path.indexOf('.'); + if (firstDot == -1) + return getComponentByName(path, modelClass); + String first = path.substring(0, firstDot); + String rest = path.substring(firstDot + 1); + return getComponentByName(first, SubmodelComponent.class).submodel.getComponentBySubmodelPath(rest, modelClass); + } + + public ModelWire getWireBySubmodelPath(String path) + { + int firstDot = path.indexOf('.'); + if (firstDot == -1) + return getWireByName(path); + String first = path.substring(0, firstDot); + String rest = path.substring(firstDot + 1); + return getComponentByName(first, SubmodelComponent.class).submodel.getWireBySubmodelPath(rest); + } + + // @formatter:off + public void addComponentAddedListener (Consumer listener) {componentAddedListeners .add (listener);} + public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners .add (listener);} + public void addWireAddedListener (Consumer listener) {wireAddedListeners .add (listener);} + public void addWireRemovedListener (Consumer listener) {wireRemovedListeners .add (listener);} + public void addRedrawHandlerChangedListener (Consumer listener) {redrawHandlerChangedListeners.add (listener);} + + public void removeComponentAddedListener (Consumer listener) {componentAddedListeners .remove(listener);} + public void removeComponentRemovedListener (Consumer listener) {componentRemovedListeners .remove(listener);} + public void removeWireAddedListener (Consumer listener) {wireAddedListeners .remove(listener);} + public void removeWireRemovedListener (Consumer listener) {wireRemovedListeners .remove(listener);} + public void removeRedrawHandlerChangedListener(Consumer listener) {redrawHandlerChangedListeners.remove(listener);} + + private void callComponentAddedListeners (ModelComponent c) {componentAddedListeners .forEach(l -> l.accept(c));} + private void callComponentRemovedListeners (ModelComponent c) {componentRemovedListeners .forEach(l -> l.accept(c));} + private void callWireAddedListeners (ModelWire w) {wireAddedListeners .forEach(l -> l.accept(w));} + private void callWireRemovedListeners (ModelWire w) {wireRemovedListeners .forEach(l -> l.accept(w));} + private void callRedrawHandlerChangedListener(Runnable r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));} + // @formatter:on + + public void setRedrawHandler(Runnable handler) + { + this.redrawHandler = handler; + callRedrawHandlerChangedListener(handler); + } + + public Runnable getRedrawHandler() + { + return redrawHandler; + } + + public void requestRedraw() + { + if (redrawHandler != null) + redrawHandler.run(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java new file mode 100644 index 00000000..e903257f --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModelModifiable.java @@ -0,0 +1,58 @@ +package net.mograsim.logic.model.model; + +import java.util.Set; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.IdentifyParams; + +public class LogicModelModifiable extends LogicModel +{ + public String getDefaultComponentName(ModelComponent component) + { + Set componentNames = getComponentsByName().keySet(); + String componentID = component.getIDForSerializing(new IdentifyParams()); + String nameBase = componentID + '#'; + for (int i = 0;; i++) + { + String nameCandidate = nameBase + i; + if (!componentNames.contains(nameCandidate)) + return nameCandidate; + } + } + + public String getDefaultWireName() + { + Set wireNames = getWiresByName().keySet(); + for (int i = 0;; i++) + { + String nameCandidate = "unnamedWire#" + i; + if (!wireNames.contains(nameCandidate)) + return nameCandidate; + } + } + + @Override + public void componentCreated(ModelComponent component, Runnable destroyed) + { + super.componentCreated(component, destroyed); + } + + @Override + public void destroyComponent(ModelComponent component) + { + super.destroyComponent(component); + } + + @Override + public void wireCreated(ModelWire wire, Runnable destroyed) + { + super.wireCreated(wire, destroyed); + } + + @Override + public void destroyWire(ModelWire wire) + { + super.destroyWire(wire); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java new file mode 100644 index 00000000..d543c543 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/ModelComponent.java @@ -0,0 +1,362 @@ +package net.mograsim.logic.model.model.components; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.JSONSerializable; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; + +/** + * The base class for all model components.
+ * A ModelComponent has a reference to the LogicModel it belongs to.
+ * A ModelComponent has a name. This name is unique in the model the ModelComponent belongs to.
+ * A ModelComponent has a position and size. The size can only be modified by subclasses. + * + * @author Daniel Kirschten + */ +public abstract class ModelComponent implements JSONSerializable +{ + /** + * The model this component is a part of. + */ + protected final LogicModelModifiable model; + /** + * The name of this component. Is unique for all components in its model.
+ * Does never change, but can't be final since it is set in {@link #init()}. + */ + private String name; + private final Rectangle bounds; + /** + * The list of all pins of this component by name. + */ + private final Map pinsByName; + /** + * An unmodifiable view of {@link #pinsByName}. + */ + protected final Map pinsUnmodifiable; + + private final List> componentMovedListeners; + private final List> componentResizedListeners; + private final List> pinAddedListeners; + private final List> pinRemovedListeners; + + private HighLevelStateHandler highLevelStateHandler; + + // creation and destruction + + public ModelComponent(LogicModelModifiable model, String name) + { + this(model, name, true); + } + + /** + * Creates a new {@link ModelComponent} and, if callInit, initializes the component (See {@link #init()}).
+ * If callInit==false, make sure to call {@link #init()}! + * + * @author Daniel Kirschten + */ + protected ModelComponent(LogicModelModifiable model, String name, boolean callInit) + { + this.model = model; + this.name = name; + this.bounds = new Rectangle(0, 0, 0, 0); + this.pinsByName = new HashMap<>(); + this.pinsUnmodifiable = Collections.unmodifiableMap(pinsByName); + + this.componentMovedListeners = new ArrayList<>(); + this.componentResizedListeners = new ArrayList<>(); + this.pinAddedListeners = new ArrayList<>(); + this.pinRemovedListeners = new ArrayList<>(); + + if (callInit) + init(); + } + + /** + * Initializes this component. This method should be called exactly once in this component's constructor.
+ *
    + *
  • If {@link #name}==null, sets {@link #name} to {@link LogicModelModifiable#getDefaultComponentName(ModelComponent)}. + *
  • Registers this component in the model. + *
+ */ + protected void init() + { + if (name == null) + name = model.getDefaultComponentName(this); + model.componentCreated(this, this::destroyed); + } + + // basic getters + + public String getName() + { + return name; + } + + /** + * Destroys this component. This method is called from {@link LogicModelModifiable#componentDestroyed(ModelComponent) + * destroyComponent()} of the model this component is a part of.
+ * When overriding, make sure to also call the original implementation. + * + * @author Daniel Kirschten + */ + protected void destroyed() + { + pinsByName.values().forEach(this::removePinWithoutRedraw); + } + + // pins + + /** + * Adds the given pin to this component and calls pinAddedListeners and redrawListeners. + * + * @throws IllegalArgumentException if the pin doesn't belong to this component + * @throws IllegalArgumentException if there already is a pin with the given name + * + * @author Daniel Kirschten + */ + protected void addPin(Pin pin) + { + if (pin.component != this) + throw new IllegalArgumentException("Can't add a pin not belonging to this component!"); + if (pinsByName.containsKey(pin.name)) + throw new IllegalArgumentException("Duplicate pin name: " + pin.name); + pinsByName.put(pin.name, pin); + callPinAddedListeners(pin); + model.requestRedraw(); + } + + /** + * Removes the given pin from this component and calls pinAddedListeners and redrawListeners. + * + * @throws NullPointerException if there was no pin with this name + * + * @author Daniel Kirschten + */ + protected void removePin(String name) + { + removePinWithoutRedraw(pinsByName.remove(name)); + model.requestRedraw(); + } + + private void removePinWithoutRedraw(Pin pin) + { + pin.destroyed(); + callPinRemovedListeners(pin); + } + + /** + * Returns a collection of pins of this component. + * + * @author Daniel Kirschten + */ + public Map getPins() + { + return pinsUnmodifiable; + } + + /** + * Returns the pin with the given name of this component. + * + * @throws IllegalArgumentException if there is no pin with the given name + * @see #getPinOrNull(String) + * + * @author Daniel Kirschten + */ + public Pin getPin(String name) + { + Pin pin = getPinOrNull(name); + if (pin == null) + throw new IllegalArgumentException("No pin with the name " + name); + return pin; + } + + /** + * Returns the pin with the given name of this component, or null if there is no such pin. + * + * @see #getPin(String) + * + * @author Daniel Kirschten + */ + public Pin getPinOrNull(String name) + { + return pinsByName.get(name); + } + + // high-level access + + /** + * @author Daniel Kirschten + */ + protected void setHighLevelStateHandler(HighLevelStateHandler highLevelStateHandler) + { + this.highLevelStateHandler = highLevelStateHandler; + } + + public HighLevelStateHandler getHighLevelStateHandler() + { + return highLevelStateHandler; + } + + /** + * Gets the current value of the given high-level state.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @see #setHighLevelState(String, Object) + * @see HighLevelStateHandler#getHighLevelState(String) + * + * @author Daniel Kirschten + */ + public Object getHighLevelState(String stateID) + { + return highLevelStateHandler.getHighLevelState(stateID); + } + + /** + * Sets the given high-level state to the given value.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @see #getHighLevelState(String) + * @see HighLevelStateHandler#setHighLevelState(String, Object) + * + * @author Daniel Kirschten + */ + public void setHighLevelState(String stateID, Object newState) + { + highLevelStateHandler.setHighLevelState(stateID, newState); + } + + // "graphical" operations + + /** + * Sets the position of this component and calls componentMovedListeners and redrawListeners. + * + * @author Daniel Kirschten + */ + public void moveTo(double x, double y) + { + bounds.x = x; + bounds.y = y; + callComponentMovedListeners(); + model.requestRedraw(); + } + + /** + * Sets the size of this component and calls redrawListeners. + * + * @author Daniel Kirschten + */ + protected void setSize(double width, double height) + { + bounds.width = width; + bounds.height = height; + callComponentResizedListener(); + model.requestRedraw(); + } + + /** + * Returns the bounds of this component. Is a bit slower than {@link #getPosX()}, {@link #getPosY()}, {@link #getWidth}, + * {@link #getHeight}, because new objects are created. + * + * @author Daniel Kirschten + */ + public final Rectangle getBounds() + { + return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); + } + + /** + * Returns the x coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. + * + * @author Daniel Kirschten + */ + public double getPosX() + { + return bounds.x; + } + + /** + * Returns the y coordinate of the position of this component. Is a bit faster than {@link #getBounds()} because no objects are created. + * + * @author Daniel Kirschten + */ + public double getPosY() + { + return bounds.y; + } + + /** + * Returns the (graphical) width of this component. Is a bit faster than {@link #getBounds()} because no objects are created. + * + * @author Daniel Kirschten + */ + public double getWidth() + { + return bounds.width; + } + + /** + * Returns the height of this component. Is a bit faster than {@link #getBounds()} because no objects are created. + * + * @author Daniel Kirschten + */ + public double getHeight() + { + return bounds.height; + } + + /** + * Called when this component is clicked. Absolute coordinates of the click are given. Returns true if this component consumed this + * click. + * + * @author Daniel Kirschten + */ + @SuppressWarnings({ "static-method", "unused" }) // this method is inteded to be overridden + public boolean clicked(double x, double y) + { + return false; + } + + /** + * Render this component to the given gc, in absoulute coordinates. + * + * @author Daniel Kirschten + */ + public abstract void render(GeneralGC gc, Rectangle visibleRegion); + + // serializing + + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + // listeners + + // @formatter:off + public void addComponentMovedListener (Consumer listener) {componentMovedListeners .add (listener);} + public void addComponentResizedListener (Consumer listener) {componentResizedListeners.add (listener);} + public void addPinAddedListener (Consumer listener) {pinAddedListeners .add (listener);} + public void addPinRemovedListener (Consumer listener) {pinRemovedListeners .add (listener);} + + public void removeComponentMovedListener (Consumer listener) {componentMovedListeners .remove(listener);} + public void removeComponentResizedListener (Consumer listener) {componentResizedListeners.remove(listener);} + public void removePinAddedListener (Consumer listener) {pinAddedListeners .remove(listener);} + public void removePinRemovedListener (Consumer listener) {pinRemovedListeners .remove(listener);} + + private void callComponentMovedListeners ( ) {componentMovedListeners .forEach(l -> l.accept(this));} + private void callComponentResizedListener( ) {componentResizedListeners.forEach(l -> l.accept(this));} + private void callPinAddedListeners (Pin p) {pinAddedListeners .forEach(l -> l.accept(p ));} + private void callPinRemovedListeners (Pin p) {pinRemovedListeners .forEach(l -> l.accept(p ));} + // @formatter:on +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java new file mode 100644 index 00000000..9fba366f --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/Orientation.java @@ -0,0 +1,65 @@ +package net.mograsim.logic.model.model.components; + +/** + * For components that can have different orientations. The meaning is not clearly defined, however it is common that the orientation + * denotes the direction the output is facing or the general flow of signals. _ALT represents an alternative, which is normally + * a mirrored version. A component can choose to not support some variants. + *

+ * In terms of calculation, {@link #RIGHT} is considered the default. + *

+ * Note that this needs to be interpreted using the GUI coordinate system, meaning that UP and DOWN are swapped. + * + * @author Christian Femers + */ +public enum Orientation +{ + /** + * The orientation RIGHT is the default orientation, all others are defined relative to it. + */ + RIGHT(1, 0, 0, 1), LEFT(-1, 0, 0, -1), UP(0, 1, -1, 0), DOWN(0, -1, 1, 0), RIGHT_ALT(1, 0, 0, -1), LEFT_ALT(-1, 0, 0, 1), + UP_ALT(0, -1, -1, 0), DOWN_ALT(0, 1, 1, 0); + + // simple 2D transformation matrix + final double trans11; + final double trans12; + final double trans21; + final double trans22; + + private Orientation(double trans11, double trans12, double trans21, double trans22) + { + this.trans11 = trans11; + this.trans12 = trans12; + this.trans21 = trans21; + this.trans22 = trans22; + } + + /** + * Performs a simple rotation around the origin. This does not work for the display coordinate system. + * + * @return the point's new X coordinate + */ + public double getNewX(double rightX, double rightY) + { + return rightX * trans11 + rightY * trans12; + } + + /** + * Performs a simple rotation around the origin. This does not work for the display coordinate system. + * + * @return the point's new Y coordinate + */ + public double getNewY(double rightX, double rightY) + { + return rightX * trans21 + rightY * trans22; + } + + public boolean doesMirror() + { + return ordinal() > 3; + } + + public boolean swapsWidthAndHeight() + { + return trans11 == 0; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java new file mode 100644 index 00000000..06621baf --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/OrientationCalculator.java @@ -0,0 +1,76 @@ +package net.mograsim.logic.model.model.components; + +/** + * This class simplifies the calculation of coordinates, especially for model components. + *

+ * Supply it with the original width and height and an orientation, and use the methods {@link #newX(double, double)} and + * {@link #newY(double, double)} to retrieve the new coordinates, relative to the upper left corner of {@link Orientation#RIGHT}. The + * {@link #height()} and {@link #width()} methods return the width and height in the new orientation. + *

+ * This is meant to be used in the context of a a classic display coordinate system, as done in the {@link ModelComponent}s. + * + * @see Orientation + * @author Christian Femers + */ +public class OrientationCalculator +{ + final Orientation o; + final double oldWHalf; + final double oldHHalf; + final double w; + final double h; + final double wHalf; + final double hHalf; + + public OrientationCalculator(Orientation o, double width, double height) + { + this.o = o; + this.oldWHalf = width / 2; + this.oldHHalf = height / 2; + + if (o.swapsWidthAndHeight()) + { + w = height; + h = width; + wHalf = oldHHalf; + hHalf = oldWHalf; + } else + { + w = width; + h = height; + wHalf = oldWHalf; + hHalf = oldHHalf; + } + } + + /** + * Returns the new height (that equals the old width if {@link Orientation#swapsWidthAndHeight()} is true) + */ + public double height() + { + return h; + } + + /** + * Returns the new width (that equals the old height if {@link Orientation#swapsWidthAndHeight()} is true) + */ + public double width() + { + return w; + } + + public double newX(double x, double y) + { + return (x - oldWHalf) * o.trans11 + (y - oldHHalf) * o.trans12 + wHalf; + } + + public double newY(double x, double y) + { + return (x - oldWHalf) * o.trans21 + (y - oldHHalf) * o.trans22 + hHalf; + } + + public final Orientation getOrientation() + { + return o; + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java new file mode 100644 index 00000000..3e836937 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelAndGate.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.model.components.atomic; + +import net.mograsim.logic.core.components.gates.CoreAndGate; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelAndGate extends SimpleRectangularModelGate +{ + public ModelAndGate(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelAndGate(LogicModelModifiable model, int logicWidth, String name) + { + super(model, "AndGate", "&", false, logicWidth, name, false); + setInputCount(2);// TODO make variable + init(); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelAndGate.class, CoreAndGate::new)); + IndirectModelComponentCreator.setComponentSupplier(ModelAndGate.class.getCanonicalName(), + (m, p, n) -> new ModelAndGate(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java new file mode 100644 index 00000000..1a01e141 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelBitDisplay.java @@ -0,0 +1,113 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.BitDisplayAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.Preferences; + +public class ModelBitDisplay extends ModelComponent +{ + private static final double width = 20; + private static final double height = 15; + private static final double fontHeight = 5; + + public final int logicWidth; + private final Pin inputPin; + + private final LogicObserver logicObs; + private CoreBitDisplay bitDisplay; + + public ModelBitDisplay(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelBitDisplay(LogicModelModifiable model, int logicWidth, String name) + { + super(model, name, false); + this.logicWidth = logicWidth; + logicObs = (i) -> model.requestRedraw(); + + setSize(width, height); + addPin(this.inputPin = new Pin(model, this, "", logicWidth, PinUsage.INPUT, 0, height / 2)); + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = bitDisplay == null ? BitVectorFormatter.formatAsString(null) + : BitVectorFormatter.formatAsString(bitDisplay.getDisplayedValue()); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + public void setCoreModelBinding(CoreBitDisplay bitDisplay) + { + if (this.bitDisplay != null) + this.bitDisplay.deregisterObserver(logicObs); + this.bitDisplay = bitDisplay; + if (bitDisplay != null) + bitDisplay.registerObserver(logicObs); + } + + public boolean hasCoreModelBinding() + { + return bitDisplay != null; + } + + public CoreBitDisplay getBitDisplay() + { + return bitDisplay; + } + + public Pin getInputPin() + { + return inputPin; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "BitDisplay"; + } + + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new BitDisplayAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelBitDisplay.class.getCanonicalName(), + (m, p, n) -> new ModelBitDisplay(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java new file mode 100644 index 00000000..38963536 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelClock.java @@ -0,0 +1,168 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import com.google.gson.JsonSyntaxException; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.OrientationCalculator; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.ClockAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.Preferences; + +public class ModelClock extends ModelComponent +{ + private static final double width = 20; + private static final double height = 20; + private static final double fontHeight = 5; + + private final Pin outputPin; + + private final LogicObserver logicObs; + private ModelClockParams params; + private OrientationCalculator oc; + private CoreClock clock; + + public ModelClock(LogicModelModifiable model, ModelClockParams params) + { + this(model, params, null); + } + + public ModelClock(LogicModelModifiable model, ModelClockParams params, String name) + { + super(model, name, false); + this.params = params; + logicObs = (i) -> model.requestRedraw(); + + oc = new OrientationCalculator(params.orientation, width, height); + setSize(oc.width(), oc.height()); + + this.outputPin = new Pin(model, this, "", 1, PinUsage.OUTPUT, oc.newX(width, height / 2), oc.newY(width, height / 2)); + addPin(outputPin); + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = clock == null ? "null" : (clock.isOn() ? "|" : "\u2015"); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (oc.width() - textExtent.x) / 2, getPosY() + (oc.height() - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + public void setCoreModelBinding(CoreClock clock) + { + if (this.clock != null) + this.clock.deregisterObserver(logicObs); + this.clock = clock; + if (clock != null) + clock.registerObserver(logicObs); + } + + public boolean hasCoreModelBinding() + { + return clock != null; + } + + @Override + public Object getHighLevelState(String stateID) + { + switch (stateID) + { + case "out": + if (clock != null) + return clock.getOut().getInputValues(); + return null; + default: + return super.getHighLevelState(stateID); + } + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + switch (stateID) + { + case "out": + throw new UnsupportedOperationException("cannot set state of clock"); + default: + super.setHighLevelState(stateID, newState); + } + } + + public CoreClock getClock() + { + return clock; + } + + public Pin getOutputPin() + { + return outputPin; + } + + public int getDelta() + { + return params.delta; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Clock"; + } + + @Override + public ModelClockParams getParamsForSerializing(IdentifyParams idParams) + { + return params; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new ClockAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelClock.class.getName(), (m, p, n) -> + { + ModelClockParams params = JsonHandler.fromJsonTree(p, ModelClockParams.class); + if (params == null) + throw new JsonSyntaxException("Invalid!!!"); + return new ModelClock(m, params, n); + }); + } + + public static class ModelClockParams + { + int delta; + Orientation orientation; + + public ModelClockParams(int delta, Orientation orientation) + { + this.delta = delta; + this.orientation = orientation; + } + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java new file mode 100644 index 00000000..1d3bb1ee --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelFixedOutput.java @@ -0,0 +1,79 @@ +package net.mograsim.logic.model.model.components.atomic; + +import java.util.Objects; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.FixedOutputAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.Preferences; + +public class ModelFixedOutput extends ModelComponent +{ + private static final double width = 20; + private static final double height = 20; + private static final double fontHeight = 5; + + public final BitVector bits; + + public ModelFixedOutput(LogicModelModifiable model, BitVector bits, String name) + { + super(model, name, false); + this.bits = bits; + setSize(width, height); + addPin(new Pin(model, this, "out", bits.length(), PinUsage.OUTPUT, width, height / 2)); + + init(); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "FixedOutput"; + } + + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return bits; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = BitVectorFormatter.formatAsString(bits); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new FixedOutputAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelFixedOutput.class.getCanonicalName(), + (m, p, n) -> new ModelFixedOutput(m, Objects.requireNonNull(JsonHandler.fromJsonTree(p, BitVector.class)), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java new file mode 100644 index 00000000..7a995041 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelManualSwitch.java @@ -0,0 +1,185 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.ManualSwitchAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.Preferences; + +public class ModelManualSwitch extends ModelComponent +{ + private static final double width = 20; + private static final double height = 15; + private static final double fontHeight = 5; + private static final double heightMiniButtons = 4; // 0 is disabled + + public final int logicWidth; + private final Pin outputPin; + + private final LogicObserver logicObs; + private CoreManualSwitch manualSwitch; + + public ModelManualSwitch(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelManualSwitch(LogicModelModifiable model, int logicWidth, String name) + { + super(model, name, false); + this.logicWidth = logicWidth; + logicObs = (i) -> model.requestRedraw(); + + setSize(width, height); + addPin(this.outputPin = new Pin(model, this, "", logicWidth, PinUsage.OUTPUT, width, height / 2)); + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + gc.drawRectangle(getBounds()); + String label = BitVectorFormatter.formatAsString(manualSwitch == null ? null : manualSwitch.getValues()); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (width - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + + if (manualSwitch != null && logicWidth > 1 && heightMiniButtons > 0 && visibleRegion.y < getPosY() + heightMiniButtons) + { + double x = getPosX(); + double y = getPosY(); + gc.drawLine(x, y + heightMiniButtons, x + width, y + heightMiniButtons); + Color c = gc.getBackground(); + gc.setBackground(gc.getForeground()); + BitVector bv = manualSwitch.getValues(); + double part = width / bv.length(); + for (int i = 0; i < bv.length(); i++) + { + double start = x + part * i; + if (i != 0) + gc.drawLine(start, y, start, y + heightMiniButtons); + if (bv.getMSBit(i) == Bit.ONE) + { +// gc.fillRectangle(start, y, part, heightMiniButtons); // alternative, but not always visible what Bit is where + gc.drawLine(start, y, start + part, y + heightMiniButtons); + gc.drawLine(start + part, y, start, y + heightMiniButtons); + } + } + gc.setBackground(c); + } + } + + public void setCoreModelBinding(CoreManualSwitch logicSwitch) + { + if (this.manualSwitch != null) + this.manualSwitch.deregisterObserver(logicObs); + this.manualSwitch = logicSwitch; + if (logicSwitch != null) + logicSwitch.registerObserver(logicObs); + } + + public boolean hasCoreModelBinding() + { + return manualSwitch != null; + } + + @Override + public Object getHighLevelState(String stateID) + { + switch (stateID) + { + case "out": + if (manualSwitch != null) + return manualSwitch.getValues(); + return null; + default: + return super.getHighLevelState(stateID); + } + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + switch (stateID) + { + case "out": + if (manualSwitch != null) + manualSwitch.setState((BitVector) newState); + break; + default: + super.setHighLevelState(stateID, newState); + break; + } + } + + @Override + public boolean clicked(double x, double y) + { + if (manualSwitch != null) + { + if (heightMiniButtons > 0 && y - getPosY() < heightMiniButtons) + { + int part = (int) ((x - getPosX()) * logicWidth / width); + manualSwitch.setState(manualSwitch.getValues().withBitChanged(part, Bit::not)); + } else + { + manualSwitch.toggle(); + } + } + return true; + } + + public CoreManualSwitch getManualSwitch() + { + return manualSwitch; + } + + public Pin getOutputPin() + { + return outputPin; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "ManualSwitch"; + } + + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new ManualSwitchAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelManualSwitch.class.getName(), + (m, p, n) -> new ModelManualSwitch(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java new file mode 100644 index 00000000..6efc9ad3 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelMerger.java @@ -0,0 +1,126 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.SWT; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.atomic.ModelSplitter.SplitterParams; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.MergerAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +//TODO delete this legacy class +public class ModelMerger extends ModelComponent +{ + private static final double width = 10; + private static final double heightPerPin = 10; + + public final int logicWidth; + private final Pin outputPin; + + private final ReadEnd[] inputEnds; + private ReadEnd outputEnd; + + public ModelMerger(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelMerger(LogicModelModifiable model, int logicWidth, String name) + { + super(model, name, false); + this.logicWidth = logicWidth; + setSize(width, (logicWidth - 1) * heightPerPin); + double inputHeight = (logicWidth - 1) * heightPerPin; + for (int i = 0; i < logicWidth; i++, inputHeight -= 10) + addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, 0, inputHeight)); + addPin(this.outputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, width, (logicWidth - 1) * heightPerPin / 2)); + inputEnds = new ReadEnd[logicWidth]; + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + double posX = getPosX(); + double posY = getPosY(); + + ColorDefinition c = BitVectorFormatter.formatAsColor(outputEnd); + if (c != null) + gc.setForeground(ColorManager.current().toColor(c)); + gc.setLineWidth( + Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); + double outLineY = posY + (logicWidth - 1) * heightPerPin / 2; + gc.drawLine(posX + width / 2, outLineY, posX + width, outLineY); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit")); + double inputHeight = posY; + for (int i = 0; i < logicWidth; i++, inputHeight += 10) + { + c = BitVectorFormatter.formatAsColor(inputEnds[i]); + if (c != null) + gc.setForeground(ColorManager.current().toColor(c)); + gc.drawLine(posX, inputHeight, posX + width / 2, inputHeight); + } + gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground")); + int oldLineCap = gc.getLineCap(); + int lineJoin = gc.getLineJoin(); + // TODO find better "replacement" for JOIN_BEVEL + // TODO it looks weird that the vertical line is thinner than the single multibit wire. + gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE); + gc.drawLine(posX + width / 2, posY, posX + width / 2, posY + heightPerPin * (logicWidth - 1)); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + gc.setLineCap(oldLineCap); + } + + @Override + public Pin getPin(String name) + { + Pin pin = getPinOrNull(name); + return pin == null ? getPin(name.replace('O', 'i').replace('I', 'O').replace('i', 'I')) : pin; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Splitter"; + } + + @Override + public SplitterParams getParamsForSerializing(IdentifyParams idParams) + { + SplitterParams splitterParams = new SplitterParams(); + splitterParams.logicWidth = logicWidth; + splitterParams.orientation = Orientation.LEFT; + return splitterParams; + } + + public void setCoreModelBinding(ReadEnd[] inputEnds, ReadEnd outputEnd) + { + System.arraycopy(inputEnds, 0, this.inputEnds, 0, logicWidth); + this.outputEnd = outputEnd; + } + + public Pin getOutputPin() + { + return outputPin; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new MergerAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelMerger.class.getCanonicalName(), + (m, p, n) -> new ModelMerger(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java new file mode 100644 index 00000000..b4e91d87 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNandGate.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.model.components.atomic; + +import net.mograsim.logic.core.components.gates.CoreNandGate; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelNandGate extends SimpleRectangularModelGate +{ + public ModelNandGate(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelNandGate(LogicModelModifiable model, int logicWidth, String name) + { + super(model, "NandGate", "&", true, logicWidth, name, false); + setInputCount(2);// TODO make variable + init(); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNandGate.class, CoreNandGate::new)); + IndirectModelComponentCreator.setComponentSupplier(ModelNandGate.class.getCanonicalName(), + (m, p, n) -> new ModelNandGate(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java new file mode 100644 index 00000000..8f3849f9 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelNotGate.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.model.components.atomic; + +import net.mograsim.logic.core.components.gates.CoreNotGate; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelNotGate extends SimpleRectangularModelGate +{ + public ModelNotGate(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelNotGate(LogicModelModifiable model, int logicWidth, String name) + { + super(model, "NotGate", "1", true, logicWidth, name, false); + setInputCount(1); + init(); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelNotGate.class, (t, p, o, i) -> new CoreNotGate(t, p, i[0], o))); + IndirectModelComponentCreator.setComponentSupplier(ModelNotGate.class.getCanonicalName(), + (m, p, n) -> new ModelNotGate(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java new file mode 100644 index 00000000..c09569ed --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelOrGate.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.model.components.atomic; + +import net.mograsim.logic.core.components.gates.CoreOrGate; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleGateAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class ModelOrGate extends SimpleRectangularModelGate +{ + public ModelOrGate(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelOrGate(LogicModelModifiable model, int logicWidth, String name) + { + super(model, "OrGate", "\u22651", false, logicWidth, name, false);// ">=1" + setInputCount(2); + init(); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleGateAdapter<>(ModelOrGate.class, CoreOrGate::new)); + IndirectModelComponentCreator.setComponentSupplier(ModelOrGate.class.getCanonicalName(), + (m, p, n) -> new ModelOrGate(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java new file mode 100644 index 00000000..962f2acc --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelSplitter.java @@ -0,0 +1,165 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.SWT; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.OrientationCalculator; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SplitterAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +public class ModelSplitter extends ModelComponent +{ + private static final double width = 10; + private static final double heightPerPin = 10; + + private final double heightWithoutOC; + public final int logicWidth; + private final OrientationCalculator oc; + private final Pin inputPin; + + private ReadEnd inputEnd; + private final ReadEnd[] outputEnds; + + public ModelSplitter(LogicModelModifiable model, SplitterParams params) + { + this(model, params, null); + } + + public ModelSplitter(LogicModelModifiable model, SplitterParams params, String name) + { + super(model, name, false); + this.logicWidth = params.logicWidth; + this.oc = new OrientationCalculator(toggleLeftDownAlt(params.orientation), width, + this.heightWithoutOC = (logicWidth - 1) * heightPerPin); + setSize(oc.width(), oc.height()); + double inLineY = (logicWidth - 1) * heightPerPin / 2; + addPin(this.inputPin = new Pin(model, this, "I", logicWidth, PinUsage.TRISTATE, oc.newX(0, inLineY), oc.newY(0, inLineY))); + double outputHeight = (logicWidth - 1) * heightPerPin; + for (int i = 0; i < logicWidth; i++, outputHeight -= 10) + addPin(new Pin(model, this, "O" + i, 1, PinUsage.TRISTATE, oc.newX(width, outputHeight), oc.newY(width, outputHeight))); + outputEnds = new ReadEnd[logicWidth]; + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + double posX = getPosX(); + double posY = getPosY(); + + ColorDefinition c = BitVectorFormatter.formatAsColor(inputEnd); + if (c != null) + gc.setForeground(ColorManager.current().toColor(c)); + gc.setLineWidth( + Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); + double inLineY = heightWithoutOC / 2; + gc.drawLine(posX + oc.newX(0, inLineY), posY + oc.newY(0, inLineY), posX + oc.newX(width / 2, inLineY), + posY + oc.newY(width / 2, inLineY)); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire.singlebit")); + double outputHeight = 0; + for (int i = 0; i < logicWidth; i++, outputHeight += 10) + { + c = BitVectorFormatter.formatAsColor(outputEnds[i]); + if (c != null) + gc.setForeground(ColorManager.current().toColor(c)); + gc.drawLine(posX + oc.newX(width / 2, outputHeight), posY + oc.newY(width / 2, outputHeight), + posX + oc.newX(width, outputHeight), posY + oc.newY(width, outputHeight)); + } + gc.setForeground(Preferences.current().getColor("net.mograsim.logic.model.color.foreground")); + int oldLineCap = gc.getLineCap(); + int lineJoin = gc.getLineJoin(); + // TODO find better "replacement" for JOIN_BEVEL + // TODO it looks weird that the vertical line is thinner than the single multibit wire. + gc.setLineCap(lineJoin == SWT.JOIN_MITER ? SWT.CAP_SQUARE : lineJoin == SWT.JOIN_ROUND ? SWT.CAP_ROUND : SWT.CAP_SQUARE); + gc.drawLine(posX + oc.newX(width / 2, 0), posY + oc.newY(width / 2, 0), posX + oc.newX(width / 2, heightWithoutOC), + posY + oc.newY(width / 2, heightWithoutOC)); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + gc.setLineCap(oldLineCap); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "Splitter"; + } + + @Override + public SplitterParams getParamsForSerializing(IdentifyParams idParams) + { + SplitterParams splitterParams = new SplitterParams(); + splitterParams.logicWidth = logicWidth; + splitterParams.orientation = toggleLeftDownAlt(oc.getOrientation()); + return splitterParams; + } + + public void setCoreModelBinding(ReadEnd inputEnd, ReadEnd[] outputEnds) + { + this.inputEnd = inputEnd; + System.arraycopy(outputEnds, 0, this.outputEnds, 0, logicWidth); + } + + public Pin getInputPin() + { + return inputPin; + } + + /** + * Used to leave bit order intuitive (MSB left or on top) + */ + private static Orientation toggleLeftDownAlt(Orientation orientation) + { + // TODO if we upgrade to Java 12, replace with switch-expression + switch (orientation) + { + case LEFT: + return Orientation.LEFT_ALT; + case LEFT_ALT: + return Orientation.LEFT; + case DOWN: + return Orientation.DOWN_ALT; + case DOWN_ALT: + return Orientation.DOWN; + default: + return orientation; + } + } + + public static class SplitterParams + { + public int logicWidth; + public Orientation orientation; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SplitterAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelSplitter.class.getCanonicalName(), (m, p, n) -> + { + // TODO remove legacy params parsing + SplitterParams params; + if (p.isJsonPrimitive()) + { + params = new SplitterParams(); + params.logicWidth = p.getAsInt(); + params.orientation = Orientation.RIGHT; + } else + params = JsonHandler.fromJsonTree(p, SplitterParams.class); + return new ModelSplitter(m, params, n); + }); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java new file mode 100644 index 00000000..ac0f64d7 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTextComponent.java @@ -0,0 +1,74 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.NoLogicAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.Preferences; + +//TODO clean size calculation mess +public class ModelTextComponent extends ModelComponent +{ + private final String text; + private boolean calculatedSize; + + public ModelTextComponent(LogicModelModifiable model, String text) + { + this(model, text, null); + } + + public ModelTextComponent(LogicModelModifiable model, String text, String name) + { + super(model, name, false); + this.text = text; + // If size is unset, it defaults to 0, which could prohibit this component from being rendered, which would prohibit the size being + // set to a better guess + setSize(1, 1); + + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + if (!calculatedSize) + { + calculatedSize = true; + Point textExtent = gc.textExtent(text); + setSize(textExtent.x, textExtent.y); + } + + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(text, getPosX(), getPosY(), true); + } + + // serializing + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "TextComponent"; + } + + @Override + public String getParamsForSerializing(IdentifyParams idParams) + { + return text; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new NoLogicAdapter<>(ModelTextComponent.class)); + IndirectModelComponentCreator.setComponentSupplier(ModelTextComponent.class.getName(), + (m, p, n) -> new ModelTextComponent(m, p.getAsString(), n)); + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java new file mode 100644 index 00000000..93bff320 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/ModelTriStateBuffer.java @@ -0,0 +1,126 @@ +package net.mograsim.logic.model.model.components.atomic; + +import org.eclipse.swt.graphics.Color; + +import com.google.gson.JsonSyntaxException; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.OrientationCalculator; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.TriStateBufferAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.Preferences; + +public class ModelTriStateBuffer extends ModelComponent +{ + + private static final double width = 20; + private static final double height = 20; + private Pin input; + private Pin output; + private Pin enable; + private double[] path; + + private ModelTriStateBufferParams params; + private OrientationCalculator oc; + + public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params) + { + this(model, params, null); + } + + public ModelTriStateBuffer(LogicModelModifiable model, ModelTriStateBufferParams params, String name) + { + super(model, name, false); + this.params = params; + + oc = new OrientationCalculator(params.orientation, width, height); + + double wHalf = width / 2; + double hHalf = height / 2; + double hQuar = height / 4; + + this.input = new Pin(model, this, "IN", params.logicWidth, PinUsage.INPUT, oc.newX(0, hHalf), oc.newY(0, hHalf)); + this.output = new Pin(model, this, "OUT", params.logicWidth, PinUsage.OUTPUT, oc.newX(width, hHalf), oc.newY(width, hHalf)); + this.enable = new Pin(model, this, "EN", 1, PinUsage.INPUT, oc.newX(wHalf, hQuar), oc.newY(wHalf, hQuar)); + this.path = new double[] { oc.newX(0, 0), oc.newY(0, 0), oc.newX(width, hHalf), oc.newY(width, hHalf), oc.newX(0, height), + oc.newY(0, height) }; + + setSize(oc.width(), oc.height()); + addPin(input); + addPin(output); + addPin(enable); + + init(); + } + + public final Pin getInputPin() + { + return input; + } + + public final Pin getOutputPin() + { + return output; + } + + public final Pin getEnablePin() + { + return enable; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + double x = getPosX(); + double y = getPosY(); + gc.drawPolygon(new double[] { x + path[0], y + path[1], x + path[2], y + path[3], x + path[4], y + path[5] }); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "TriStateBuffer"; + } + + @Override + public ModelTriStateBufferParams getParamsForSerializing(IdentifyParams idParams) + { + return params; + } + + static + { + LogicCoreAdapter.addComponentAdapter(new TriStateBufferAdapter()); + IndirectModelComponentCreator.setComponentSupplier(ModelTriStateBuffer.class.getName(), (m, p, n) -> + { + ModelTriStateBufferParams params = JsonHandler.fromJsonTree(p, ModelTriStateBufferParams.class); + if (params == null) + throw new JsonSyntaxException("Invalid!!!"); + return new ModelTriStateBuffer(m, params, n); + }); + } + + public static class ModelTriStateBufferParams + { + int logicWidth; + Orientation orientation; + + public ModelTriStateBufferParams(int logicWidth, Orientation orientation) + { + this.logicWidth = logicWidth; + this.orientation = orientation; + } + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java new file mode 100644 index 00000000..8971285a --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedModelComponent.java @@ -0,0 +1,161 @@ +package net.mograsim.logic.model.model.components.atomic; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.modeladapter.componentadapters.SimpleRectangularHardcodedModelComponentAdapter; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public abstract class SimpleRectangularHardcodedModelComponent extends ModelComponent +{ + private static final double centerTextHeight = 5; + private static final double pinNamesHeight = 3.5; + private static final double pinNamesMargin = .5; + + private final String id; + + private final DefaultOutlineRenderer outlineRenderer; + private final CenteredTextSymbolRenderer centerTextRenderer; + private final PinNamesSymbolRenderer pinNamesRenderer; + + private AtomicReference state; + private Runnable recalculate; + + // creation and destruction + + public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText) + { + this(model, id, name, centerText, true); + } + + public SimpleRectangularHardcodedModelComponent(LogicModelModifiable model, String id, String name, String centerText, boolean callInit) + { + super(model, name, false); + this.id = id; + this.outlineRenderer = new DefaultOutlineRenderer(this); + CenteredTextParams centeredTextParams = new CenteredTextParams(); + centeredTextParams.text = centerText; + centeredTextParams.fontHeight = centerTextHeight; + this.centerTextRenderer = new CenteredTextSymbolRenderer(this, centeredTextParams); + PinNamesParams pinNamesParams = new PinNamesParams(); + pinNamesParams.pinLabelHeight = pinNamesHeight; + pinNamesParams.pinLabelMargin = pinNamesMargin; + this.pinNamesRenderer = new PinNamesSymbolRenderer(this, pinNamesParams); + addPinRemovedListener(this::pinRemoved); + setHighLevelStateHandler(new HighLevelStateHandler() + { + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return null;// we don't need to serialize this; it's implicit since we are a SimpleRectangularHardcodedModelComponent + } + + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + @Override + public Object getHighLevelState(String stateID) + { + return SimpleRectangularHardcodedModelComponent.this.getHighLevelState(state.get(), stateID); + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + state.updateAndGet(s -> SimpleRectangularHardcodedModelComponent.this.setHighLevelState(s, stateID, newState)); + recalculate.run(); + } + }); + + if (callInit) + init(); + } + + // pins + + protected void addPin(Pin pin, Position namePosition) + { + super.addPin(pin); // do this first to catch errors + pinNamesRenderer.setPinPosition(pin, namePosition); + } + + private void pinRemoved(Pin pin) + { + pinNamesRenderer.setPinPosition(pin, null); + } + + // high-level access + + @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden + protected Object getHighLevelState(Object state, String stateID) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + // logic + + public abstract Object recalculate(Object lastState, Map readEnds, Map readWriteEnds); + + // core model binding + + public void setCoreModelBindingAndResetState(AtomicReference state, Runnable recalculate) + { + this.state = state; + this.recalculate = recalculate; + } + + // "graphical" operations + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + outlineRenderer.render(gc, visibleRegion); + centerTextRenderer.render(gc, visibleRegion); + pinNamesRenderer.render(gc, visibleRegion); + } + + // serializing + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return id; + } + + // operations no longer supported + + @Override + protected void addPin(Pin pin) + { + throw new UnsupportedOperationException("Can't add pins without setting usage, call addPin(Pin [, Position]) instead"); + } + + static + { + LogicCoreAdapter.addComponentAdapter(new SimpleRectangularHardcodedModelComponentAdapter()); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java new file mode 100644 index 00000000..89366013 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularModelGate.java @@ -0,0 +1,122 @@ +package net.mograsim.logic.model.model.components.atomic; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.graphics.Color; + +import com.google.gson.JsonPrimitive; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.preferences.Preferences; + +public class SimpleRectangularModelGate extends ModelComponent +{ + private static final double width = 20; + private static final double pinDistance = 10; + private static final double fontHeight = 5; + private static final double invertedCircleDiam = 3.5; + + private final String id; + + private final String label; + private final boolean isInverted; + protected final int logicWidth; + private final double rectWidth; + + private MovablePin outputPin; + private final List inputPins; + + protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, + String name) + { + this(model, id, label, isInverted, logicWidth, name, true); + } + + protected SimpleRectangularModelGate(LogicModelModifiable model, String id, String label, boolean isInverted, int logicWidth, + String name, boolean callInit) + { + super(model, name, false); + this.id = id; + this.label = label; + this.logicWidth = logicWidth; + this.isInverted = isInverted; + this.rectWidth = width - (isInverted ? invertedCircleDiam : 0); + this.outputPin = new MovablePin(model, this, "Y", logicWidth, PinUsage.OUTPUT, width, 0); + addPin(outputPin); + this.inputPins = new ArrayList<>(); + setInputCount(1); + + if (callInit) + init(); + } + + protected void setInputCount(int inputCount) + { + int oldInputCount = inputPins.size(); + setSize(width, inputCount * pinDistance); + if (oldInputCount > inputCount) + while (inputPins.size() > inputCount) + removePin(inputPins.remove(inputCount).name); + else if (oldInputCount < inputCount) + for (int i = oldInputCount; i < inputCount; i++) + { + // TODO what for more than 24 input pins? + Pin pin = new Pin(model, this, String.valueOf((char) ('A' + i)), logicWidth, PinUsage.INPUT, 0, + pinDistance / 2 + i * pinDistance); + inputPins.add(pin); + addPin(pin); + } + outputPin.setRelPos(width, inputCount * pinDistance / 2); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Color foreground = Preferences.current().getColor("net.mograsim.logic.model.color.foreground"); + if (foreground != null) + gc.setForeground(foreground); + double height = (getPins().size() - 1) * pinDistance; + gc.drawRectangle(getPosX(), getPosY(), rectWidth, height); + if (isInverted) + gc.drawOval(getPosX() + rectWidth, getPosY() + (height - invertedCircleDiam) / 2, invertedCircleDiam, invertedCircleDiam); + Font oldFont = gc.getFont(); + Font labelFont = new Font(oldFont.getName(), fontHeight, oldFont.getStyle()); + gc.setFont(labelFont); + Point textExtent = gc.textExtent(label); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(label, getPosX() + (rectWidth - textExtent.x) / 2, getPosY() + (height - textExtent.y) / 2, true); + gc.setFont(oldFont); + } + + // serializing + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return id; + } + + /** + * {@link SimpleRectangularModelGate}s implementation returns a {@link JsonPrimitive} of type int containing the {@link #logicWidth} of + * this component. + * + * @see ModelComponent#getParamsForSerializing() + */ + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java new file mode 100644 index 00000000..ef567e92 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SimpleRectangularSubmodelComponent.java @@ -0,0 +1,134 @@ +package net.mograsim.logic.model.model.components.submodels; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; + +public class SimpleRectangularSubmodelComponent extends SubmodelComponent +{ + public static final double width = 35; + public static final double pinDistance = 10; + public static final double pinNameMargin = .5; + public static final double labelFontHeight = 5; + public static final double pinNameFontHeight = 3.5; + + public final String label; + protected final int logicWidth; + + private final List inputPinNames; + private final List inputPinNamesUnmodifiable; + private final List outputPinNames; + private final List outputPinNamesUnmodifiable; + + public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label) + { + this(model, logicWidth, label, null); + } + + public SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name) + { + this(model, logicWidth, label, name, true); + } + + protected SimpleRectangularSubmodelComponent(LogicModelModifiable model, int logicWidth, String label, String name, boolean callInit) + { + super(model, name, false); + this.label = label; + this.logicWidth = logicWidth; + this.inputPinNames = new ArrayList<>(); + this.inputPinNamesUnmodifiable = Collections.unmodifiableList(inputPinNames); + this.outputPinNames = new ArrayList<>(); + this.outputPinNamesUnmodifiable = Collections.unmodifiableList(outputPinNames); + + SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams(); + rendererParams.centerText = label; + rendererParams.centerTextHeight = labelFontHeight; + rendererParams.horizontalComponentCenter = width / 2; + rendererParams.pinLabelHeight = pinNameFontHeight; + rendererParams.pinLabelMargin = pinNameMargin; + setSymbolRenderer(new SimpleRectangularLikeSymbolRenderer(this, rendererParams)); + setOutlineRenderer(new DefaultOutlineRenderer(this)); + + if (callInit) + init(); + } + + protected void setInputPins(String... pinNames) + { + setIOPins(0, inputPinNames, outputPinNames, PinUsage.INPUT, pinNames); + } + + protected void setOutputPins(String... pinNames) + { + setIOPins(width, outputPinNames, inputPinNames, PinUsage.OUTPUT, pinNames); + } + + private void setIOPins(double relX, List pinNamesListThisSide, List pinNamesListOtherSide, PinUsage usage, + String... newPinNames) + { + int inputCount = newPinNames.length; + List newPinNamesList = Arrays.asList(newPinNames); + if (new HashSet<>(newPinNamesList).size() != inputCount) + throw new IllegalArgumentException("Pin names contain duplicates"); + for (String pinName : newPinNamesList) + if (pinNamesListOtherSide.contains(pinName)) + throw new IllegalArgumentException("Can't add pin. There is a pin on the other side with the same name: " + pinName); + super.setSize(width, Math.max(inputCount, pinNamesListOtherSide.size()) * pinDistance); + for (int i = 0; i < inputCount; i++) + { + String pinName = newPinNames[i]; + int oldPinIndex = pinNamesListThisSide.indexOf(pinName); + if (oldPinIndex == -1) + super.addSubmodelInterface( + new MovablePin(model, this, pinName, logicWidth, usage, relX, pinDistance / 2 + i * pinDistance)); + else + getSupermodelMovablePin(pinName).setRelPos(relX, pinDistance / 2 + i * pinDistance); + } + for (String pinName : pinNamesListThisSide) + if (!newPinNamesList.contains(pinName)) + super.removeSubmodelInterface(pinName); + pinNamesListThisSide.clear(); + pinNamesListThisSide.addAll(newPinNamesList); + } + + public List getInputPinNames() + { + return inputPinNamesUnmodifiable; + } + + public List getOutputPinNames() + { + return outputPinNamesUnmodifiable; + } + + @Override + protected Pin addSubmodelInterface(MovablePin supermodelPin) + { + throw new UnsupportedOperationException( + "Can't add submodel interfaces to a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); + } + + @Override + protected void removeSubmodelInterface(String name) + { + throw new UnsupportedOperationException( + "Can't remove submodel interfaces of a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); + } + + @Override + protected void setSize(double width, double height) + { + throw new UnsupportedOperationException( + "Can't set the size of a SimpleRectangularSubmodelComponent directly, call setInputPins / setOutputPins instead"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java new file mode 100644 index 00000000..9388e2fb --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelComponent.java @@ -0,0 +1,477 @@ +package net.mograsim.logic.model.model.components.submodels; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.Consumer; + +import net.haspamelodica.swt.helper.gcs.GCConfig; +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.gcs.TranslatedGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.LogicUIRenderer; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.serializing.SubmodelComponentParams; +import net.mograsim.logic.model.serializing.SubmodelComponentSerializer; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.preferences.Preferences; + +/** + * A {@link ModelComponent} consisting of another model. A SubmodelComponent can have so-called "interface pins" connecting the + * inner and outer models. + */ +public abstract class SubmodelComponent extends ModelComponent +{ + public static final String SUBMODEL_INTERFACE_NAME = "_submodelinterface"; + /** + * A modifiable view of {@link #submodel}. + */ + protected final LogicModelModifiable submodelModifiable; + /** + * The model this {@link SubmodelComponent} consists of. + */ + public final LogicModel submodel; + /** + * The list of all submodel interface pins of this {@link SubmodelComponent} on the submodel side. + */ + private final Map submodelPins; + /** + * An unmodifiable view of {@link #submodelPins}. + */ + private final Map submodelMovablePinsUnmodifiable; + /** + * An unmodifiable view of {@link #submodelPins} where pins are not movable. + */ + private final Map submodelUnmovablePinsUnmodifiable; + /** + * The list of all submodel interface pins of this {@link SubmodelComponent} on the supermodel side. + */ + private final Map supermodelPins; + /** + * An unmodifiable view of {@link #supermodelPins}. + */ + private final Map supermodelMovablePinsUnmodifiable; + /** + * An unmodifiable view of {@link #supermodelPins} where pins are not movable. + */ + private final Map supermodelUnmovablePinsUnmodifiable; + /** + * A pseudo-component containing all submodel interface pins on the submodel side. + */ + private final SubmodelInterface submodelInterface; + + /** + * The factor by which the submodel is scaled when rendering. + */ + private double submodelScale; + /** + * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel starts to + * be visible. + */ + private double maxVisibleRegionFillRatioForAlpha0; + /** + * If this {@link SubmodelComponent} fills at least this amount of the visible region vertically or horizontally, the submodel is fully + * visible. + */ + private double minVisibleRegionFillRatioForAlpha1; + /** + * The renderer used for rendering the submodel. + */ + private final LogicUIRenderer renderer; + + /** + * The {@link Renderer} used to render the symbol of this SubmodelCoponent. + */ + private Renderer symbolRenderer; + /** + * The {@link Renderer} used to render the outline of this SubmodelCoponent. + */ + private Renderer outlineRenderer; + + // creation and destruction + + public SubmodelComponent(LogicModelModifiable model, String name) + { + this(model, name, true); + } + + protected SubmodelComponent(LogicModelModifiable model, String name, boolean callInit) + { + super(model, name, false); + this.submodelModifiable = new LogicModelModifiable(); + this.submodel = submodelModifiable; + this.submodelPins = new HashMap<>(); + this.submodelMovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); + this.submodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(submodelPins); + this.supermodelPins = new HashMap<>(); + this.supermodelMovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); + this.supermodelUnmovablePinsUnmodifiable = Collections.unmodifiableMap(supermodelPins); + this.submodelInterface = new SubmodelInterface(submodelModifiable); + + this.submodelScale = 1; + this.maxVisibleRegionFillRatioForAlpha0 = 0.8; + this.minVisibleRegionFillRatioForAlpha1 = 0.9; + this.renderer = new LogicUIRenderer(submodelModifiable); + + Consumer redrawHandlerChangedListener = submodelModifiable::setRedrawHandler; + model.addRedrawHandlerChangedListener(redrawHandlerChangedListener); + model.addComponentRemovedListener(c -> + { + if (c == this) + model.removeRedrawHandlerChangedListener(redrawHandlerChangedListener); + }); + submodelModifiable.setRedrawHandler(model.getRedrawHandler()); + + if (callInit) + init(); + } + + // pins + + /** + * Adds a new submodel interface pin. + * + * @param supermodelPin the submodel interface pin on the supermodel side + * + * @return the submodel interface pin on the submodel side + * + * @author Daniel Kirschten + */ + protected Pin addSubmodelInterface(MovablePin supermodelPin) + { + super.addPin(supermodelPin);// do this first to be fail-fast if the supermodel does not belong to this component + + String name = supermodelPin.name; + // TODO if we upgrade to Java 12, replace with switch-expression + PinUsage submodelPinUsage; + switch (supermodelPin.usage) + { + case INPUT: + submodelPinUsage = PinUsage.OUTPUT; + break; + case OUTPUT: + submodelPinUsage = PinUsage.INPUT; + break; + case TRISTATE: + submodelPinUsage = PinUsage.TRISTATE; + break; + default: + throw new IllegalArgumentException("Unknown enum constant: " + supermodelPin.usage); + } + MovablePin submodelPin = new MovablePin(submodelModifiable, submodelInterface, name, supermodelPin.logicWidth, submodelPinUsage, + supermodelPin.getRelX() / submodelScale, supermodelPin.getRelY() / submodelScale); + + submodelPin.addPinMovedListener(p -> + { + double newRelX = p.getRelX() * submodelScale; + double newRelY = p.getRelY() * submodelScale; + if (supermodelPin.getRelX() != newRelX || supermodelPin.getRelY() != newRelY) + supermodelPin.setRelPos(newRelX, newRelY); + }); + supermodelPin.addPinMovedListener(p -> + { + double newRelX = p.getRelX() / submodelScale; + double newRelY = p.getRelY() / submodelScale; + if (submodelPin.getRelX() != newRelX || submodelPin.getRelY() != newRelY) + submodelPin.setRelPos(newRelX, newRelY); + }); + + submodelInterface.addPin(submodelPin); + + submodelPins.put(name, submodelPin); + supermodelPins.put(name, supermodelPin); + + // no need to call requestRedraw() because addPin() will request a redraw + return submodelPin; + } + + /** + * Removes a submodel interface pin. + * + * @author Daniel Kirschten + */ + protected void removeSubmodelInterface(String name) + { + super.removePin(name);// do this first to be fail-fast if this component doesn't have a pin with the given name + Pin submodelPin = submodelPins.remove(name); + submodelInterface.removePin(submodelPin.name); + supermodelPins.remove(name); + + // no need to call requestRedraw() because removePin() will request a redraw + } + + /** + * Returns a collection of submodel interface pins on the submodel side of this component. + * + * @author Daniel Kirschten + */ + public Map getSubmodelPins() + { + return submodelUnmovablePinsUnmodifiable; + } + + /** + * Returns the submodel interface pin with the given name on the submodel side of this component. + * + * @author Daniel Kirschten + */ + public Pin getSubmodelPin(String name) + { + return getSubmodelMovablePin(name); + } + + /** + * Returns a collection of movable submodel interface pins on the submodel side of this component. + * + * @author Daniel Kirschten + */ + protected Map getSubmodelMovablePins() + { + return submodelMovablePinsUnmodifiable; + } + + /** + * Returns the movable submodel interface pin with the given name on the submodel side of this component. + * + * @author Daniel Kirschten + */ + protected MovablePin getSubmodelMovablePin(String name) + { + return submodelPins.get(name); + } + + /** + * Returns a collection of submodel interface pins on the supermodel side of this component. + * + * @author Daniel Kirschten + */ + public Map getSupermodelPins() + { + return supermodelUnmovablePinsUnmodifiable; + } + + /** + * Returns the submodel interface pin with the given name on the supermodel side of this component. + * + * @author Daniel Kirschten + */ + public Pin getSupermodelPin(String name) + { + return getSupermodelMovablePin(name); + } + + /** + * Returns a collection of movable submodel interface pins on the supermodel side of this component. + * + * @author Daniel Kirschten + */ + protected Map getSupermodelMovablePins() + { + return supermodelMovablePinsUnmodifiable; + } + + /** + * Returns the movable submodel interface pin with the given name on the supermodel side of this component. + * + * @author Daniel Kirschten + */ + protected MovablePin getSupermodelMovablePin(String name) + { + return supermodelPins.get(name); + } + + // "graphical" operations + + /** + * Sets the factor by which the submodel is scaled when rendering and calls redrawListeners. Note that the submodel interface pins will + * stay at their position relative to the supermodel, which means they will move relative to the submodel. + * + * @author Daniel Kirschten + */ + protected void setSubmodelScale(double submodelScale) + { + this.submodelScale = submodelScale; + + for (Entry e : supermodelPins.entrySet()) + getSubmodelMovablePin(e.getKey()).setRelPos(e.getValue().getRelX() * submodelScale, e.getValue().getRelY() * submodelScale); + + model.requestRedraw();// needed if there is no submodel interface pin + } + + /** + * Returns the current factor by which the submodel is scaled when rendering. + * + * @author Daniel Kirschten + */ + public double getSubmodelScale() + { + return submodelScale; + } + + /** + * @see #renderSymbol(GeneralGC, Rectangle) + * + * @author Daniel Kirschten + */ + protected void setSymbolRenderer(Renderer symbolRenderer) + { + this.symbolRenderer = symbolRenderer; + model.requestRedraw(); + } + + /** + * @see #renderSymbol(GeneralGC, Rectangle) + * + * @author Daniel Kirschten + */ + public Renderer getSymbolRenderer() + { + return symbolRenderer; + } + + /** + * @see #renderOutline(GeneralGC, Rectangle) + * + * @author Daniel Kirschten + */ + protected void setOutlineRenderer(Renderer outlineRenderer) + { + this.outlineRenderer = outlineRenderer; + model.requestRedraw(); + } + + /** + * @see #renderOutline(GeneralGC, Rectangle) + * + * @author Daniel Kirschten + */ + public Renderer getOutlineRenderer() + { + return outlineRenderer; + } + + @Override + public boolean clicked(double x, double y) + { + double scaledX = (x - getPosX()) / submodelScale; + double scaledY = (y - getPosY()) / submodelScale; + for (ModelComponent component : submodel.getComponentsByName().values()) + if (component.getBounds().contains(scaledX, scaledY) && component.clicked(scaledX, scaledY)) + return true; + return false; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + GCConfig conf = new GCConfig(gc); + GeneralGC tgc = new TranslatedGC(gc, getPosX(), getPosY(), submodelScale, true); + conf.reset(tgc); + double visibleRegionFillRatio = Math.max(getWidth() / visibleRegion.width, getHeight() / visibleRegion.height); + double alphaFactor = map(visibleRegionFillRatio, maxVisibleRegionFillRatioForAlpha0, minVisibleRegionFillRatioForAlpha1, 0, 1); + alphaFactor = Math.max(0, Math.min(1, alphaFactor)); + // we need to take the old alpha into account to support nested submodules better. + int oldAlpha = gc.getAlpha(); + int submodelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * alphaFactor))); + int labelAlpha = Math.max(0, Math.min(255, (int) (oldAlpha * (1 - alphaFactor)))); + if (submodelAlpha != 0) + { + gc.setAlpha(submodelAlpha); + renderer.render(tgc, visibleRegion.translate(getPosX() / submodelScale, getPosY() / submodelScale, 1 / submodelScale)); + } + if (labelAlpha != 0) + { + gc.setAlpha(labelAlpha); + renderSymbol(gc, visibleRegion); + } + conf.reset(gc); + // reset line width explicitly to avoid rounding errors causing weird glitches + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + // draw the outline after all other operations to make interface pins look better + renderOutline(gc, visibleRegion); + } + + /** + * Render the symbol of this {@link SubmodelComponent}, e.g. the things that should be hidden if the submodel is drawn. + * + * @author Daniel Kirschten + */ + protected void renderSymbol(GeneralGC gc, Rectangle visibleRegion) + { + if (symbolRenderer != null) + symbolRenderer.render(gc, visibleRegion); + } + + /** + * Render the outline of this {@link SubmodelComponent}, e.g. the graphical elements that should stay visible if the submodel is drawn. + * + * @author Daniel Kirschten + */ + protected void renderOutline(GeneralGC gc, Rectangle visibleRegion) + { + if (outlineRenderer != null) + outlineRenderer.render(gc, visibleRegion); + } + + private static double map(double val, double valMin, double valMax, double mapMin, double mapMax) + { + return mapMin + (val - valMin) * (mapMax - mapMin) / (valMax - valMin); + } + + // serializing + + /** + * {@link SubmodelComponent}'s implementation of {@link ModelComponent#getIDForSerializing(IdentifyParams)} returns "submodel". It is + * recommended to override this behaviour. + * + * @see ModelComponent#getIDForSerializing(IdentifyParams) + * @see ModelComponent#getParamsForSerializing(IdentifyParams) + */ + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "submodel";// TODO what ID? + } + + /** + * {@link SubmodelComponent}'s implementation of {@link ModelComponent#getParamsForSerializing(IdentifyParams)} returns an instance of + * {@link SubmodelComponentParams}. It is recommended to override this behaviour. + * + * @see ModelComponent#getIDForSerializing(IdentifyParams) + * @see ModelComponent#getParamsForSerializing(IdentifyParams) + */ + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return SubmodelComponentSerializer.serialize(this, idParams); + } + + // operations no longer supported + + @Override + protected void addPin(Pin pin) + { + throw new UnsupportedOperationException("Can't add pins to a SubmodelComponent directly, call addSubmodelInterface instead"); + } + + @Override + protected void removePin(String name) + { + throw new UnsupportedOperationException("Can't remove pins of a SubmodelComponent directly, call removeSubmodelInterface instead"); + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(SubmodelComponent.class.getCanonicalName(), + (m, p, n) -> SubmodelComponentSerializer.deserialize(m, JsonHandler.fromJsonTree(p, SubmodelComponentParams.class), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java new file mode 100644 index 00000000..331db123 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/submodels/SubmodelInterface.java @@ -0,0 +1,57 @@ +package net.mograsim.logic.model.model.components.submodels; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.IdentifyParams; + +public class SubmodelInterface extends ModelComponent +{ + public SubmodelInterface(LogicModelModifiable model) + { + super(model, SubmodelComponent.SUBMODEL_INTERFACE_NAME, true); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + {// nothing to do here + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + throw new UnsupportedOperationException("A SubmodelInterface can't be serialized. Use SubmodelComponent.addSubmodelInterface"); + } + + /** + * {@inheritDoc}
+ * This method is only marked public in {@link SubmodelInterface} for {@link SubmodelComponent} to be able to add / remove pins to / + * from a SubmodelInterface.
+ * + * @see ModelComponent#removePin(Pin) + * + * @author Daniel Kirschten + */ + @Override + public void addPin(Pin pin) + { + super.addPin(pin); + } + + /** + * {@inheritDoc}
+ * This method is only marked public in {@link SubmodelInterface} for {@link SubmodelComponent} to be able to add / remove pins to / + * from a SubmodelInterface.
+ * + * @see ModelComponent#removePin(Pin) + * + * @author Daniel Kirschten + */ + @Override + protected void removePin(String name) + { + super.removePin(name); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java new file mode 100644 index 00000000..1f44f570 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWire.java @@ -0,0 +1,531 @@ +package net.mograsim.logic.model.model.wires; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; + +import org.eclipse.swt.SWT; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +/** + * A wire connecting exactly two {@link Pin}s. + * + * @author Daniel Kirschten + */ +public class ModelWire +{ + /** + * The model this wire is a part of. + */ + private final LogicModelModifiable model; + /** + * The name of this wire. Is unique for all wires in its model. + */ + public final String name; + /** + * The logical width of this wire. Is equal to the logical width of {@link #pin1} and {@link #pin2}. + */ + public final int logicWidth; + /** + * The {@link Pin} on one side of this wire, usually the signal source. + */ + private Pin pin1; + /** + * The {@link Pin} on one side of this wire, usually the signal target. + */ + private Pin pin2; + /** + * The user-defined path between {@link #pin1} and {@link #pin2}.
+ * Special cases: null means "choose an interpolation as fits", and an empty array means "direct connection without any + * interpolation". + */ + private Point[] path; + /** + * The bounds of this wire, excluding line width (and line joins, if the line join is {@link SWT#JOIN_MITER}) + */ + private final Rectangle bounds; + /** + * The effective path of this wire, including automatic interpolation and the position of both {@link Pin}s. Is never null. + */ + private double[] effectivePath; + + private final List> pathChangedListeners; + + /** + * A LogicObserver calling redrawListeners. Used for core model bindings. + */ + private final LogicObserver logicObs; + /** + * A ReadEnd of the core wire this model wire currently is bound to. + */ + private ReadEnd end; + + // creation and destruction + + /** + * Creates a new {@link ModelWire} with automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2) + { + this(model, null, pin1, pin2); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, Pin pin2) + { + this(model, null, pin1, pin2); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, Pin pin1, ModelWireCrossPoint pin2) + { + this(model, null, pin1, pin2); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, Pin pin1, Pin pin2) + { + this(model, null, pin1, pin2); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2, Point... path) + { + this(model, null, pin1, pin2, path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, ModelWireCrossPoint pin1, Pin pin2, Point... path) + { + this(model, null, pin1, pin2, path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, Pin pin1, ModelWireCrossPoint pin2, Point... path) + { + this(model, null, pin1, pin2, path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation and using the default name. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, Pin pin1, Pin pin2, Point... path) + { + this(model, null, pin1, pin2, path); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2) + { + this(model, name, pin1, pin2, (Point[]) null); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, Pin pin2) + { + this(model, name, pin1, pin2, (Point[]) null); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, Pin pin1, ModelWireCrossPoint pin2) + { + this(model, name, pin1, pin2, (Point[]) null); + } + + /** + * Creates a new {@link ModelWire} with automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, Pin pin1, Pin pin2) + { + this(model, name, pin1, pin2, (Point[]) null); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, ModelWireCrossPoint pin2, Point... path) + { + this(model, name, pin1.getPin(), pin2.getPin(), path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, ModelWireCrossPoint pin1, Pin pin2, Point... path) + { + this(model, name, pin1.getPin(), pin2, path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, Pin pin1, ModelWireCrossPoint pin2, Point... path) + { + this(model, name, pin1, pin2.getPin(), path); + } + + /** + * Creates a new {@link ModelWire} without automatic interpolation. + * + * @author Daniel Kirschten + */ + public ModelWire(LogicModelModifiable model, String name, Pin pin1, Pin pin2, Point... path) + { + this.model = model; + this.name = name == null ? model.getDefaultWireName() : name; + this.logicWidth = pin1.logicWidth; + if (pin2.logicWidth != pin1.logicWidth) + throw new IllegalArgumentException("Can't connect pins of different logic width"); + + this.pin1 = pin1; + this.pin2 = pin2; + + this.path = path == null ? null : Arrays.copyOf(path, path.length); + this.bounds = new Rectangle(0, 0, -1, -1); + + pathChangedListeners = new ArrayList<>(); + + logicObs = (i) -> model.requestRedraw(); + + pin1.addPinMovedListener(p -> pinMoved()); + pin2.addPinMovedListener(p -> pinMoved()); + + recalculateEffectivePath(); + + model.wireCreated(this, this::destroyed); + } + + /** + * Destroys this wire. This method is called from {@link LogicModelModifiable#wireDestroyed(ModelWire) wireDestroyed()} of the model + * this wire is a part of. + * + * @author Daniel Kirschten + */ + private void destroyed() + { + // nothing to do + } + + // pins + + /** + * Returns the {@link Pin} on one side of this wire, usually the signal source. + * + * @author Daniel Kirschten + */ + public Pin getPin1() + { + return pin1; + } + + /** + * Returns the {@link Pin} on one side of this wire, usually the signal target. + * + * @author Daniel Kirschten + */ + public Pin getPin2() + { + return pin2; + } + + /** + * Called when {@link #pin1} or {@link #pin2} were moved. + * + * @author Daniel Kirschten + */ + private void pinMoved() + { + recalculateEffectivePath(); + model.requestRedraw(); + } + + // "graphical" operations + + /** + * Recalculates {@link #effectivePath} "from scratch". Also updates {@link #bounds}. + * + * @author Daniel Kirschten + */ + private void recalculateEffectivePath() + { + Point pos1 = pin1.getPos(), pos2 = pin2.getPos(); + + double boundsX1 = Math.min(pos1.x, pos2.x); + double boundsY1 = Math.min(pos1.y, pos2.y); + double boundsX2 = Math.max(pos1.x, pos2.x); + double boundsY2 = Math.max(pos1.y, pos2.y); + + if (path == null) + effectivePath = new double[] { pos1.x, pos1.y, (pos1.x + pos2.x) / 2, pos1.y, (pos1.x + pos2.x) / 2, pos2.y, pos2.x, pos2.y }; + else + { + effectivePath = new double[path.length * 2 + 4]; + effectivePath[0] = pos1.x; + effectivePath[1] = pos1.y; + for (int srcI = 0, dstI = 2; srcI < path.length; srcI++, dstI += 2) + { + double pathX = path[srcI].x; + double pathY = path[srcI].y; + effectivePath[dstI + 0] = pathX; + effectivePath[dstI + 1] = pathY; + if (pathX < boundsX1) + boundsX1 = pathX; + if (pathX > boundsX2) + boundsX2 = pathX; + if (pathY < boundsY1) + boundsY1 = pathY; + if (pathY > boundsY2) + boundsY2 = pathY; + } + effectivePath[effectivePath.length - 2] = pos2.x; + effectivePath[effectivePath.length - 1] = pos2.y; + } + + bounds.x = boundsX1; + bounds.y = boundsY1; + bounds.width = boundsX2 - boundsX1; + bounds.height = boundsY2 - boundsY1; + } + + /** + * Returns the bounds of this wire, excluding line width (and line joins, if the line join is {@link SWT#JOIN_MITER}) + * + * @author Daniel Kirschten + */ + public Rectangle getBounds() + { + return new Rectangle(bounds.x, bounds.y, bounds.width, bounds.height); + } + + /** + * Render this wire to the given gc, in absoulute coordinates. + * + * @author Daniel Kirschten + */ + public void render(GeneralGC gc) + { + ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end); + if (wireColor != null) + gc.setForeground(ColorManager.current().toColor(wireColor)); + gc.setLineWidth( + Preferences.current().getDouble("net.mograsim.logic.model.linewidth.wire." + (logicWidth == 1 ? "singlebit" : "multibit"))); + gc.drawPolyline(effectivePath); + gc.setLineWidth(Preferences.current().getDouble("net.mograsim.logic.model.linewidth.default")); + } + + // operations concerning the path + + /** + * The user-defined path between {@link #pin1} and {@link #pin2}. Note that this is not neccessarily equal to the effective path drawn + * in {@link #render(GeneralGC)}.
+ * Special cases: null means "choose an interpolation as fits", and an empty array means "direct connection without any + * interpolation". + * + * @author Daniel Kirschten + */ + public Point[] getPath() + { + return deepPathCopy(path); + } + + public void setPath(Point... path) + { + this.path = deepPathCopy(path); + recalculateEffectivePath(); + callPathChangedListeners(); + model.requestRedraw(); + } + + public Point getPathPoint(int index) + { + return pointCopy(path[index]); + } + + public void setPathPoint(Point p, int index) + { + path[index] = pointCopy(p); + recalculateEffectivePath(); + callPathChangedListeners(); + model.requestRedraw(); + } + + public void insertPathPoint(Point p, int index) + { + if (path == null) + path = new Point[] { pointCopy(p) }; + else + { + Point[] oldPath = path; + path = new Point[oldPath.length + 1]; + System.arraycopy(oldPath, 0, path, 0, index); + if (index < oldPath.length) + System.arraycopy(oldPath, index, path, index + 1, oldPath.length - index); + path[index] = pointCopy(p); + } + recalculateEffectivePath(); + callPathChangedListeners(); + } + + public void removePathPoint(int index) + { + if (path.length == 0) + path = null; + else + { + Point[] oldPath = path; + path = new Point[oldPath.length - 1]; + System.arraycopy(oldPath, 0, path, 0, index); + if (index < oldPath.length - 1) + System.arraycopy(oldPath, index + 1, path, index, oldPath.length - index - 1); + } + recalculateEffectivePath(); + callPathChangedListeners(); + } + + public double[] getEffectivePath() + { + return Arrays.copyOf(effectivePath, effectivePath.length); + } + + private static Point[] deepPathCopy(Point[] path) + { + if (path == null) + return null; + Point[] copy = new Point[path.length]; + for (int i = 0; i < path.length; i++) + copy[i] = pointCopy(path[i]); + return copy; + } + + private static Point pointCopy(Point p) + { + return new Point(p.x, p.y); + } + + // core model binding + + /** + * Binds this {@link ModelWire} to the given {@link ReadEnd}: The color of this {@link ModelWire} will now depend on the state of the + * given {@link ReadEnd}, and further changes of the given {@link ReadEnd} will result in readrawListeners being called.
+ * The argument can be null, in which case the old binding is stopped. + * + * @author Daniel Kirschten + */ + public void setCoreModelBinding(ReadEnd end) + { + if (this.end != null) + this.end.deregisterObserver(logicObs); + this.end = end; + if (end != null) + end.registerObserver(logicObs); + } + + /** + * Returns whether this {@link ModelWire} has a core model binding or not. + * + * @author Daniel Kirschten + */ + public boolean hasCoreModelBinding() + { + return end != null; + } + + /** + * If this {@link ModelWire} has a core model binding, delegates to {@link CoreWire#forceValues(BitVector)} for the {@link CoreWire} + * corresponding to this {@link ModelWire}. + * + * @author Daniel Kirschten + */ + public void forceWireValues(BitVector values) + { + end.getWire().forceValues(values); + } + + /** + * If this {@link ModelWire} has a core model binding, delegates to {@link ReadEnd#getValues()} for the {@link ReadEnd} corresponding to + * this {@link ModelWire}. + * + * @author Daniel Kirschten + */ + public BitVector getWireValues() + { + return end.getValues(); + } + + // listeners + + // @formatter:off + public void addPathChangedListener (Consumer listener) {pathChangedListeners.add (listener);} + + public void removePathChangedListener(Consumer listener) {pathChangedListeners.remove(listener);} + + private void callPathChangedListeners() {pathChangedListeners.forEach(l -> l.accept(this));} + // @formatter:on + + @Override + public String toString() + { + return "ModelWire [" + pin1 + "---" + pin2 + ", value=" + (end == null ? "null" : end.getValues()) + "]"; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java new file mode 100644 index 00000000..b9a5ccc6 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/ModelWireCrossPoint.java @@ -0,0 +1,140 @@ +package net.mograsim.logic.model.model.wires; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.types.BitVectorFormatter; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; + +/** + * A {@link ModelComponent} with only one pin. Is used to create wires connecting more than two pins.
+ * Example: There are three pins P1, P2, P3 that need to be connected. Solution: Create a + * ModelWireCrossPoint (WCP) and create the ModelWires P1-WCP, P2-WCP, + * P3-WCP.
+ * Cross points are drawn as circles. The pin of cross points is in the center of this circle. + * + * @author Daniel Kirschten + */ +public class ModelWireCrossPoint extends ModelComponent +{ + private static final int CIRCLE_RADIUS = 1; + private static final int CIRCLE_DIAM = CIRCLE_RADIUS * 2; + + /** + * The logical width of this cross point. + */ + public final int logicWidth; + /** + * The (single) pin of this cross point. + */ + private final Pin pin; + + /** + * A {@link LogicObserver} calling {@link #requestRedraw()}. + */ + private final LogicObserver logicObs; + /** + * The {@link ReadEnd} currently bound to this cross point. + */ + private ReadEnd end; + + // creation and destruction + + public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth) + { + this(model, logicWidth, null); + } + + public ModelWireCrossPoint(LogicModelModifiable model, int logicWidth, String name) + { + super(model, name, false); + this.logicWidth = logicWidth; + logicObs = (i) -> model.requestRedraw(); + + setSize(CIRCLE_DIAM, CIRCLE_DIAM); + addPin(this.pin = new Pin(model, this, "", logicWidth, PinUsage.TRISTATE, CIRCLE_RADIUS, CIRCLE_RADIUS)); + + init(); + } + + // pins + + public Pin getPin() + { + return pin; + } + + // "graphical" operations + + /** + * Moves the center (and therefore the pin) of this {@link ModelWireCrossPoint} to the given location. + * + * @author Daniel Kirschten + */ + public void moveCenterTo(double x, double y) + { + moveTo(x - CIRCLE_RADIUS, y - CIRCLE_RADIUS); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + ColorDefinition wireColor = BitVectorFormatter.formatAsColor(end); + if (wireColor != null) + gc.setBackground(ColorManager.current().toColor(wireColor)); + gc.fillOval(getPosX(), getPosY(), CIRCLE_DIAM, CIRCLE_DIAM); + } + + // core model binding + + /** + * Binds this {@link ModelWireCrossPoint} to the given {@link ReadEnd}: The color of this {@link ModelWireCrossPoint} will now depend on + * the state of the given {@link ReadEnd}, and further changes of the given {@link ReadEnd} will result in readrawListeners being + * called.
+ * The argument can be null, in which case the old binding is stopped. + * + * @author Daniel Kirschten + */ + public void setCoreModelBinding(ReadEnd end) + { + if (this.end != null) + this.end.deregisterObserver(logicObs); + this.end = end; + if (end != null) + end.registerObserver(logicObs); + } + + /** + * Returns whether this {@link ModelWireCrossPoint} has a core model binding or not. + */ + public boolean hasCoreModelBinding() + { + return end != null; + } + + // serializing + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "WireCrossPoint"; + } + + @Override + public Integer getParamsForSerializing(IdentifyParams idParams) + { + return logicWidth; + } + + static + { + IndirectModelComponentCreator.setComponentSupplier(ModelWireCrossPoint.class.getCanonicalName(), + (m, p, n) -> new ModelWireCrossPoint(m, p.getAsInt(), n)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java new file mode 100644 index 00000000..c2291f81 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/MovablePin.java @@ -0,0 +1,24 @@ +package net.mograsim.logic.model.model.wires; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; + +/** + * Exactly like {@link Pin}, but {@link #setRelPos(double, double) setRelPos(...)} is public. + * + * @author Daniel Kirschten + */ +public class MovablePin extends Pin +{ + public MovablePin(LogicModelModifiable model, ModelComponent component, String name, int logicWidth, PinUsage usage, double relX, + double relY) + { + super(model, component, name, logicWidth, usage, relX, relY); + } + + @Override + public void setRelPos(double relX, double relY) + { + super.setRelPos(relX, relY); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java new file mode 100644 index 00000000..e9136416 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/Pin.java @@ -0,0 +1,168 @@ +package net.mograsim.logic.model.model.wires; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.Consumer; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; + +/** + * A connection interface between a ModelComponent and the rest of a LogicModel. Pins usually are created by {@link ModelComponent}s + * themselves.
+ * A pin has a name identifying it. Pin names are unique for a {@link ModelComponent}: Every pin of a {@link ModelComponent} has a different + * name, but different {@link ModelComponent}s can have pins with the same name. + * + * @author Daniel Kirschten + */ +public class Pin +{ + /** + * The {@link LogicModel} the component this pin belongs to is a part of. + */ + private final LogicModelModifiable model; + /** + * The {@link ModelComponent} this pin belongs to. + */ + public final ModelComponent component; + /** + * The name identifying this pin. Is unique for a {@link ModelComponent}. + */ + public final String name; + /** + * The logical width of this pin. Denotes how many bits this pin consists of. + */ + public final int logicWidth; + /** + * How this pin is used by the component it belongs to.
+ * Note that this is only a hint. + */ + public final PinUsage usage; + + /** + * The X position of this pin, relative to its component's location. + */ + protected double relX; + /** + * The Y position of this pin, relative to its component's location. + */ + protected double relY; + + private final List> pinMovedListeners; + private final List redrawListeners; + + // creation and destruction + + /** + * Creates a new pin. Usually it is not needed to call this constructor manually, as {@link ModelComponent}s create their pins + * themselves. + * + * @author Daniel Kirschten + */ + public Pin(LogicModelModifiable model, ModelComponent component, String name, int logicWidth, PinUsage usage, double relX, double relY) + { + this.model = model; + this.component = component; + this.name = name; + this.logicWidth = logicWidth; + this.usage = Objects.requireNonNull(usage); + this.relX = relX; + this.relY = relY; + + this.pinMovedListeners = new ArrayList<>(); + this.redrawListeners = new ArrayList<>(); + + component.addComponentMovedListener(c -> callPinMovedListeners()); + } + + /** + * Destroys this pin by removing all wires connected to it from the model the component is a part of.
+ * Don't call this method from application code as it is automatically called in {@link ModelComponent#removePin(String)}. + */ + public void destroyed() + { + Set connectedWires = new HashSet<>(); + for (ModelWire w : model.getWiresByName().values()) + if (w.getPin1() == this || w.getPin2() == this) + connectedWires.add(w); + connectedWires.forEach(model::destroyWire); + } + + // "graphical" operations + + /** + * Returns the X position of this pin relative to the position of its component. + * + * @author Daniel Kirschten + */ + public double getRelX() + { + return relX; + } + + /** + * Returns the Y position of this pin relative to the position of its component. + * + * @author Daniel Kirschten + */ + public double getRelY() + { + return relY; + } + + /** + * Returns the position of this pin relative to the position of its component. + * + * @author Daniel Kirschten + */ + public Point getRelPos() + { + return new Point(relX, relY); + } + + /** + * Returns the absolute position of this pin. + * + * @author Daniel Kirschten + */ + public Point getPos() + { + return new Point(relX + component.getPosX(), relY + component.getPosY()); + } + + /** + * Sets the position of this pin relative to the position of its component. + * + * @author Daniel Kirschten + */ + protected void setRelPos(double relX, double relY) + { + this.relX = relX; + this.relY = relY; + callPinMovedListeners(); + callRedrawListeners(); + } + + // listeners + + // @formatter:off + public void addPinMovedListener (Consumer listener){pinMovedListeners.add (listener);} + public void addRedrawListener (Runnable listener){redrawListeners .add (listener);} + + public void removePinMovedListener(Consumer listener){pinMovedListeners.remove(listener);} + public void removeRedrawListener (Runnable listener){redrawListeners .remove(listener);} + + private void callPinMovedListeners() {pinMovedListeners.forEach(l -> l.accept(this));} + private void callRedrawListeners () {redrawListeners .forEach(l -> l.run ( ));} + // @formatter:on + + @Override + public String toString() + { + return "Pin " + name + " of " + component.getName(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java new file mode 100644 index 00000000..f229d023 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/model/wires/PinUsage.java @@ -0,0 +1,18 @@ +package net.mograsim.logic.model.model.wires; + +public enum PinUsage +{ + /** + * The component never affects the value of the wire connected to the pin. + */ + INPUT, + /** + * The component is never affected by the value of the wire connected to this pin. This includes the look of the component. + */ + OUTPUT, + /** + * The component (sometimes) affects the value of the wire connected to the pin, but is also (sometimes) affected by the value of this + * wire. + */ + TRISTATE; +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java new file mode 100644 index 00000000..db3b5ac6 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/CoreModelParameters.java @@ -0,0 +1,7 @@ +package net.mograsim.logic.model.modeladapter; + +public class CoreModelParameters +{ + public int wireTravelTime; + public int gateProcessTime; +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java new file mode 100644 index 00000000..70f256ab --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/LogicCoreAdapter.java @@ -0,0 +1,165 @@ +package net.mograsim.logic.model.modeladapter; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; + +public class LogicCoreAdapter +{ + private final static Map, ComponentAdapter> componentAdapters = new HashMap<>(); + + public static void addComponentAdapter(ComponentAdapter componentAdapter) + { + componentAdapters.put(componentAdapter.getSupportedClass(), componentAdapter); + } + + public static Timeline convert(LogicModel logicModel, CoreModelParameters params) + { + // TODO replace Timeline with CoreModel as soon as it exists + Timeline timeline = new Timeline(10); + + convert(logicModel, params, timeline, Map.of()); + + return timeline; + } + + private static void convert(LogicModel logicModel, CoreModelParameters params, Timeline timeline, Map externalWires) + { + Map logicWiresPerPin = convertWires(getAllPins(logicModel), logicModel.getWiresByName().values(), externalWires, + params, timeline); + Map logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin); + + for (ModelComponent modelComp : logicModel.getComponentsByName().values()) + { + if (modelComp instanceof SubmodelComponent) + { + SubmodelComponent modelCompCasted = (SubmodelComponent) modelComp; + Map supermodelPins = modelCompCasted.getSupermodelPins(); + Map externalWiresForSubmodel = supermodelPins.entrySet().stream().collect( + Collectors.toMap(e -> modelCompCasted.getSubmodelPin(e.getKey()), e -> logicWiresPerPin.get(e.getValue()))); + convert(modelCompCasted.submodel, params, timeline, externalWiresForSubmodel); + } else if (modelComp instanceof ModelWireCrossPoint) + { + ModelWireCrossPoint modelCompCasted = (ModelWireCrossPoint) modelComp; + modelCompCasted.setCoreModelBinding(logicWiresPerPin.get(modelCompCasted.getPin()).createReadOnlyEnd()); + } else if (!(modelComp instanceof SubmodelInterface))// nothing to do for SubmodelInterfaces + createAndLinkComponent(timeline, params, modelComp, logicWiresPerPinUnmodifiable); + } + } + + private static Set getAllPins(LogicModel logicModel) + { + return logicModel.getComponentsByName().values().stream().flatMap(component -> component.getPins().values().stream()) + .collect(Collectors.toSet()); + } + + private static Map convertWires(Set allPins, Collection wires, Map externalWires, + CoreModelParameters params, Timeline timeline) + { + Map> connectedPinGroups = getConnectedPinGroups(allPins, wires); + Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups, externalWires); + setModelWiresCoreModelBinding(wires, logicWiresPerPin); + return logicWiresPerPin; + } + + private static Map createLogicWires(CoreModelParameters params, Timeline timeline, Map> connectedPinGroups, + Map externalWires) + { + Map logicWiresPerPin = new HashMap<>(); + Map, CoreWire> logicWiresPerPinGroup = new HashMap<>(); + for (Entry> e : connectedPinGroups.entrySet()) + logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(), set -> + { + CoreWire externalWire = null; + for (Pin p : set) + { + CoreWire externalWireCandidate = externalWires.get(p); + if (externalWireCandidate != null) + if (externalWire == null) + externalWire = externalWireCandidate; + else if (externalWire.width == externalWireCandidate.width) + CoreWire.fuse(externalWire, externalWireCandidate); + else + throw new IllegalArgumentException( + "Two pins to external wires with different logicWidths can't be connected directly"); + } + return externalWire == null ? new CoreWire(timeline, e.getKey().logicWidth, params.wireTravelTime) : externalWire; + })); + return logicWiresPerPin; + } + + private static void setModelWiresCoreModelBinding(Collection wires, Map logicWiresPerPin) + { + Map modelWireSharedReadEnd = logicWiresPerPin.values().stream().distinct() + .collect(Collectors.toMap(Function.identity(), CoreWire::createReadOnlyEnd)); + for (ModelWire modelWire : wires) + modelWire.setCoreModelBinding(modelWireSharedReadEnd.get(logicWiresPerPin.get(modelWire.getPin1()))); + } + + private static Map> getConnectedPinGroups(Set allPins, Collection wires) + { + Map> connectedPinsPerPin = new HashMap<>(); + + for (Pin p : allPins) + { + HashSet connectedPins = new HashSet<>(); + connectedPins.add(p); + connectedPinsPerPin.put(p, connectedPins); + } + + wires.forEach(wire -> + { + Pin pin1 = wire.getPin1(); + Pin pin2 = wire.getPin2(); + + Set pin1ConnectedPins = connectedPinsPerPin.get(pin1); + Set pin2ConnectedPins = connectedPinsPerPin.get(pin2); + + pin1ConnectedPins.addAll(pin2ConnectedPins); + pin1ConnectedPins.add(pin1); + pin1ConnectedPins.add(pin2); + + pin2ConnectedPins.forEach(pin -> connectedPinsPerPin.put(pin, pin1ConnectedPins)); + }); + return connectedPinsPerPin; + } + + @SuppressWarnings("unchecked") + private static void createAndLinkComponent(Timeline timeline, CoreModelParameters params, + ModelComponent modelComponent, Map logicWiresPerPin) + { + Class cls = modelComponent.getClass(); + ComponentAdapter adapter = null; + while (cls != ModelComponent.class && adapter == null) + { + adapter = (ComponentAdapter) componentAdapters.get(cls); + cls = cls.getSuperclass(); + } + if (adapter == null) + throw new IllegalArgumentException("Unknown component class: " + modelComponent.getClass()); + adapter.createAndLinkComponent(timeline, params, (G) modelComponent, logicWiresPerPin); + } + + private LogicCoreAdapter() + { + throw new UnsupportedOperationException("No LogicCoreAdapter instances"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java new file mode 100644 index 00000000..517e9464 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/BitDisplayAdapter.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class BitDisplayAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelBitDisplay.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelBitDisplay modelComponent, + Map logicWiresPerPin) + { + ReadEnd end = logicWiresPerPin.get(modelComponent.getInputPin()).createReadOnlyEnd(); + CoreBitDisplay bitDisplay = new CoreBitDisplay(timeline, end); + modelComponent.setCoreModelBinding(bitDisplay); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java new file mode 100644 index 00000000..adcda831 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ClockAdapter.java @@ -0,0 +1,31 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.ModelClock; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class ClockAdapter implements ComponentAdapter +{ + + @Override + public Class getSupportedClass() + { + return ModelClock.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelClock modelClock, + Map logicWiresPerPin) + { + ReadWriteEnd out = logicWiresPerPin.get(modelClock.getOutputPin()).createReadWriteEnd(); + CoreClock c = new CoreClock(timeline, out, modelClock.getDelta()); + modelClock.setCoreModelBinding(c); + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java new file mode 100644 index 00000000..d7f2d2cf --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ComponentAdapter.java @@ -0,0 +1,17 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public interface ComponentAdapter +{ + public Class getSupportedClass(); + + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, G modelComponent, + Map logicWiresPerPin); +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java new file mode 100644 index 00000000..f8236652 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/FixedOutputAdapter.java @@ -0,0 +1,25 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.model.model.components.atomic.ModelFixedOutput; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class FixedOutputAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelFixedOutput.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelFixedOutput modelComponent, + Map logicWiresPerPin) + { + logicWiresPerPin.get(modelComponent.getPin("out")).createReadWriteEnd().feedSignals(modelComponent.bits); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java new file mode 100644 index 00000000..75305f61 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/ManualSwitchAdapter.java @@ -0,0 +1,29 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class ManualSwitchAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelManualSwitch.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelManualSwitch modelComponent, + Map logicWiresPerPin) + { + ReadWriteEnd end = logicWiresPerPin.get(modelComponent.getOutputPin()).createReadWriteEnd(); + CoreManualSwitch manualSwitch = new CoreManualSwitch(timeline, end); + modelComponent.setCoreModelBinding(manualSwitch); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java new file mode 100644 index 00000000..22d61122 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/MergerAdapter.java @@ -0,0 +1,34 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.components.atomic.ModelMerger; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class MergerAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelMerger.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelMerger modelComponent, + Map logicWiresPerPin) + { + CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O")); + ReadEnd[] inputEnds = new ReadEnd[modelComponent.logicWidth]; + for (int i = 0; i < modelComponent.logicWidth; i++) + { + CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I" + (modelComponent.logicWidth - 1 - i))); + CoreWire.fuse(input, output, 0, i); + inputEnds[i] = input.createReadOnlyEnd(); + } + modelComponent.setCoreModelBinding(inputEnds, output.createReadOnlyEnd()); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java new file mode 100644 index 00000000..ea87e78e --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/NoLogicAdapter.java @@ -0,0 +1,36 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +/** + * For ModelComponents that do not have any simulation logic behaviour + * + * @author Christian Femers + */ +public class NoLogicAdapter implements ComponentAdapter +{ + private final Class modelComponentClass; + + public NoLogicAdapter(Class modelComponentClass) + { + this.modelComponentClass = modelComponentClass; + } + + @Override + public Class getSupportedClass() + { + return modelComponentClass; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, T modelComponent, Map logicWiresPerPin) + { + // do nothing + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java new file mode 100644 index 00000000..c38883e6 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleGateAdapter.java @@ -0,0 +1,50 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularModelGate; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class SimpleGateAdapter implements ComponentAdapter +{ + private final Class supportedClass; + private final ComponentConstructor constructor; + + public SimpleGateAdapter(Class supportedClass, ComponentConstructor constructor) + { + this.supportedClass = supportedClass; + this.constructor = constructor; + } + + @Override + public Class getSupportedClass() + { + return supportedClass; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, G modelComponent, Map logicWiresPerPin) + { + ReadWriteEnd out = logicWiresPerPin.get(modelComponent.getPin("Y")).createReadWriteEnd(); + + // TODO can we do this prettier? + int inputPinCount = modelComponent.getPins().size() - 1; + ReadEnd[] ins = new ReadEnd[inputPinCount]; + for (int i = 0; i < inputPinCount; i++) + ins[i] = logicWiresPerPin.get(modelComponent.getPin(String.valueOf((char) ('A' + i)))).createReadOnlyEnd(); + + constructor.newComponent(timeline, params.gateProcessTime, out, ins); + } + + public static interface ComponentConstructor + { + public CoreComponent newComponent(Timeline timeline, int processTime, ReadWriteEnd out, ReadEnd[] ins); + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java new file mode 100644 index 00000000..dbebc0ff --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedModelComponentAdapter.java @@ -0,0 +1,55 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import net.mograsim.logic.core.LogicObserver; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class SimpleRectangularHardcodedModelComponentAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return SimpleRectangularHardcodedModelComponent.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, + SimpleRectangularHardcodedModelComponent modelComponent, Map logicWiresPerPin) + { + Map readEnds = new HashMap<>(); + Map readWriteEnds = new HashMap<>(); + + AtomicReference state = new AtomicReference<>(); + + Runnable recalculate = () -> state.updateAndGet(s -> modelComponent.recalculate(s, readEnds, readWriteEnds)); + LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime); + + modelComponent.setCoreModelBindingAndResetState(state, recalculate); + + for (Pin pin : modelComponent.getPins().values()) + { + CoreWire wire = logicWiresPerPin.get(pin); + ReadEnd end; + if (pin.usage != PinUsage.INPUT) + { + ReadWriteEnd rwEnd = wire.createReadWriteEnd(); + readWriteEnds.put(pin.name, rwEnd); + end = rwEnd; + } else + end = wire.createReadOnlyEnd(); + readEnds.put(pin.name, end); + if (pin.usage != PinUsage.OUTPUT) + end.registerObserver(logicObs); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java new file mode 100644 index 00000000..3cfa5f28 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SplitterAdapter.java @@ -0,0 +1,34 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.model.model.components.atomic.ModelSplitter; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class SplitterAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelSplitter.class; + } + + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelSplitter modelComponent, + Map logicWiresPerPin) + { + CoreWire input = logicWiresPerPin.get(modelComponent.getPin("I")); + ReadEnd[] outputEnds = new ReadEnd[modelComponent.logicWidth]; + for (int i = 0; i < modelComponent.logicWidth; i++) + { + CoreWire output = logicWiresPerPin.get(modelComponent.getPin("O" + (modelComponent.logicWidth - 1 - i))); + CoreWire.fuse(input, output, i, 0); + outputEnds[i] = output.createReadOnlyEnd(); + } + modelComponent.setCoreModelBinding(input.createReadOnlyEnd(), outputEnds); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java new file mode 100644 index 00000000..56a838b7 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/TriStateBufferAdapter.java @@ -0,0 +1,32 @@ +package net.mograsim.logic.model.modeladapter.componentadapters; + +import java.util.Map; + +import net.mograsim.logic.core.components.CoreTriStateBuffer; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; + +public class TriStateBufferAdapter implements ComponentAdapter +{ + @Override + public Class getSupportedClass() + { + return ModelTriStateBuffer.class; + } + + @SuppressWarnings("unused") + @Override + public void createAndLinkComponent(Timeline timeline, CoreModelParameters params, ModelTriStateBuffer modelTsb, + Map logicWiresPerPin) + { + ReadEnd in = logicWiresPerPin.get(modelTsb.getPin("IN")).createReadOnlyEnd(); + ReadEnd enable = logicWiresPerPin.get(modelTsb.getPin("EN")).createReadOnlyEnd(); + ReadWriteEnd out = logicWiresPerPin.get(modelTsb.getPin("OUT")).createReadWriteEnd(); + new CoreTriStateBuffer(timeline, params.gateProcessTime, in, out, enable); + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java new file mode 100644 index 00000000..3a2623ed --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ClassLoaderBasedResourceLoader.java @@ -0,0 +1,33 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.io.InputStream; + +public abstract class ClassLoaderBasedResourceLoader implements ResourceLoader +{ + @Override + public InputStream loadResource(String path) throws IOException + { + return getClassLoader().getResourceAsStream(path); + } + + @Override + public Class loadClass(String name) throws ClassNotFoundException + { + return ReflectionHelper.tryInvokeStaticInitializer(name, getClassLoader()); + } + + public abstract ClassLoader getClassLoader(); + + public static ClassLoaderBasedResourceLoader create(ClassLoader loader) + { + return new ClassLoaderBasedResourceLoader() + { + @Override + public ClassLoader getClassLoader() + { + return loader; + } + }; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java new file mode 100644 index 00000000..8e4d459c --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/DeserializedSubmodelComponent.java @@ -0,0 +1,109 @@ +package net.mograsim.logic.model.serializing; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.Renderer; + +public class DeserializedSubmodelComponent extends SubmodelComponent +{ + /** + * If a DeserializedSubmodelComponent is part of another SubmodelComponent, when it it serialized, it should not return its internal + * structure, but rather the component ID used to create it. + * + * @see SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) + * SubmodelComponentSerializer.deserialize(...) + * @see SubmodelComponentSerializer#serialize(SubmodelComponent, java.util.function.Function) SubmodelComponentSerializer.serialize(...) + */ + public final String idForSerializingOverride; + /** + * See {@link #idForSerializingOverride} + */ + public final Object paramsForSerializingOverride; + + public DeserializedSubmodelComponent(LogicModelModifiable model, String name, String idForSerializingOverride, + Object paramsForSerializingOverride) + { + super(model, name, false); + this.idForSerializingOverride = idForSerializingOverride; + this.paramsForSerializingOverride = paramsForSerializingOverride; + init(); + } + + /** + * If this component has an {@link #idForSerializingOverride} set (e.g. non-null) (see + * {@link SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) + * SubmodelComponentSerializer.deserialize(...)}), this ID is returned
+ * If this case doesn't apply (this component has no {@link #idForSerializingOverride} set), + * {@link SubmodelComponent#getIDForSerializing(IdentifyParams)} is invoced. + */ + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return idForSerializingOverride == null ? super.getIDForSerializing(idParams) : idForSerializingOverride; + } + + /** + * If this component has an {@link #idForSerializingOverride} set (e.g. non-null) (see + * {@link SubmodelComponentSerializer#deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement) + * SubmodelComponentSerializer.deserialize(...)}), {@link #paramsForSerializingOverride} is returned
+ * If this case doesn't apply (this component has no {@link #idForSerializingOverride} set), + * {@link SubmodelComponent#getParamsForSerializing(IdentifyParams)} is invoced. + */ + @Override + public Object getParamsForSerializing(IdentifyParams idParams) + { + return idForSerializingOverride == null ? super.getParamsForSerializing(idParams) : paramsForSerializingOverride; + } + + @Override + public void setSymbolRenderer(Renderer symbolRenderer) + { + super.setSymbolRenderer(symbolRenderer); + } + + @Override + public void setOutlineRenderer(Renderer outlineRenderer) + { + super.setOutlineRenderer(outlineRenderer); + } + + @Override + public void setHighLevelStateHandler(HighLevelStateHandler handler) + { + super.setHighLevelStateHandler(handler); + } + + public LogicModelModifiable getSubmodelModifiable() + { + return submodelModifiable; + } + + @Override + public void setSubmodelScale(double submodelScale) + { + super.setSubmodelScale(submodelScale); + } + + @Override + public void setSize(double width, double height) + { + super.setSize(width, height); + } + + @Override + public Pin addSubmodelInterface(MovablePin supermodelPin) + { + return super.addSubmodelInterface(supermodelPin); + } + + @Override + public void removeSubmodelInterface(String name) + { + super.removeSubmodelInterface(name); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java new file mode 100644 index 00000000..bf6cf617 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IdentifyParams.java @@ -0,0 +1,6 @@ +package net.mograsim.logic.model.serializing; + +public class IdentifyParams +{ + // maybe we find something to put here... +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java new file mode 100644 index 00000000..c149848a --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/IndirectModelComponentCreator.java @@ -0,0 +1,226 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UncheckedIOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.logic.model.util.Version; + +public class IndirectModelComponentCreator +{ + public static final Version CURRENT_STD_ID_MAPPING_VERSION = Version.parseSemver("0.1.0"); + + private static final Map standardComponentIDs = new HashMap<>(); + private static final Map standardComponentIDsUnmodifiable = Collections.unmodifiableMap(standardComponentIDs); + + private static final Map componentSuppliers = new HashMap<>(); + private static final Map resourceLoaders = new HashMap<>(); + private static final Map componentCache = new HashMap<>(); + + private static final ResourceLoader defaultResourceLoader; + static + { + defaultResourceLoader = ClassLoaderBasedResourceLoader.create(IndirectModelComponentCreator.class.getClassLoader()); + loadStandardComponentIDs(IndirectModelComponentCreator.class.getResourceAsStream("standardComponentIDMapping.json")); + } + + public static void loadStandardComponentIDs(InputStream standardComponentIdMappingStream) + { + try (InputStream s = standardComponentIdMappingStream) + { + if (s == null) + throw new IOException("Resource not found"); + Map tmp = JsonHandler.readJson(s, StandardComponentIdMappingContainer.class).getMap(); + // don't use putAll to apply sanity checks + tmp.forEach((st, id) -> + { + try + { + addStandardComponentID(st, id); + } + catch (IllegalArgumentException e) + { + System.err.println("Component ID mapping contained illegal entry: " + e.getMessage()); + } + }); + } + catch (IOException e) + { + System.err.println("Failed to initialize standard snippet ID mapping: " + e.getMessage()); + } + } + + public static void addStandardComponentID(String standardComponentID, String associatedComponentID) + { + if (!checkIDIsValidResolvedID(associatedComponentID)) + throw new IllegalArgumentException("Unrecognized component ID format: " + associatedComponentID); + standardComponentIDs.put(standardComponentID, associatedComponentID); + } + + public static Map getStandardComponentIDs() + { + return standardComponentIDsUnmodifiable; + } + + public static void setComponentSupplier(String id, ComponentSupplier componentSupplier) + { + componentSuppliers.put(id, componentSupplier); + } + + public static ModelComponent createComponent(LogicModelModifiable model, String id) + { + return createComponent(model, id, (String) null); + } + + public static ModelComponent createComponent(LogicModelModifiable model, String id, String name) + { + return createComponent(model, id, JsonNull.INSTANCE, name); + } + + public static ModelComponent createComponent(LogicModelModifiable model, String id, JsonElement params) + { + return createComponent(model, id, params, null); + } + + public static ModelComponent createComponent(LogicModelModifiable model, String id, JsonElement params, String name) + { + if (id == null) + throw new NullPointerException("Component ID is null"); + if (componentCache.containsKey(id)) + return loadComponentFromJsonObject(model, id, name, componentCache.get(id)); + String resolvedID = resolveID(id); + if (resolvedID == null) + throw new IllegalArgumentException("Unknown standard ID or illegal resolved ID: " + id); + String[] parts = resolvedID.split(":"); + String firstPart = parts[0]; + if (firstPart.equals("jsonfile")) + { + JsonObject jsonContents; + try + { + // don't use parts[1], because the path could contain ':' + jsonContents = JsonHandler.readJson(resolvedID.substring("jsonfile:".length()), JsonObject.class); + } + catch (IOException e) + { + throw new UncheckedIOException("Error loading JSON file", e); + } + return loadComponentFromJsonObject(model, id, name, jsonContents); + } + ResourceLoader loader; + String resTypeID; + String resID; + if (firstPart.equals("resloader")) + { + String loaderID = parts[1]; + loader = resourceLoaders.get(loaderID); + if (loader == null) + tryLoadResourceLoader(loaderID); + loader = resourceLoaders.get(loaderID); + if (loader == null) + throw new IllegalArgumentException( + "Unknown resource loader: " + loaderID + " (but class was found. Probably the static initializer is missing)"); + resTypeID = parts[2]; + resID = parts[3]; + } else + { + loader = defaultResourceLoader; + resTypeID = parts[0]; + resID = parts[1]; + } + if (resTypeID.equals("jsonres")) + { + JsonObject jsonContents; + try + { + @SuppressWarnings("resource") // jsonStream is closed in JsonHandler + InputStream jsonStream = Objects.requireNonNull(loader.loadResource(resID), "Error loading JSON resource: Not found"); + jsonContents = JsonHandler.readJson(jsonStream, JsonObject.class); + } + catch (IOException e) + { + throw new UncheckedIOException("Error loading JSON resource", e); + } + return loadComponentFromJsonObject(model, id, name, jsonContents); + } else if (resTypeID.equals("class")) + { + ComponentSupplier componentSupplier = componentSuppliers.get(resID); + if (componentSupplier == null) + try + { + loader.loadClass(resID); + } + catch (@SuppressWarnings("unused") ClassNotFoundException e) + { + throw new IllegalArgumentException("Unknown component supplier: " + resID); + } + componentSupplier = componentSuppliers.get(resID); + if (componentSupplier == null) + throw new IllegalArgumentException( + "Unknown component supplier: " + resID + " (but class was found. Probably the static initializer is missing)"); + return componentSupplier.create(model, params, name); + } else + throw new IllegalStateException("Unknown resource type ID: " + resTypeID); + } + + public static String resolveID(String id) + { + if (checkIDIsValidResolvedID(id)) + return id; + return standardComponentIDs.get(id); + } + + private static boolean checkIDIsValidResolvedID(String id) + { + return id.matches("jsonfile:(.+)|(resloader:([^:]+):)?(jsonres|class):[^:]+"); + } + + private static SubmodelComponent loadComponentFromJsonObject(LogicModelModifiable model, String id, String name, + JsonObject jsonContents) + { + componentCache.putIfAbsent(id, jsonContents); + SerializablePojo jsonContentsAsSerializablePojo = JsonHandler.parser.fromJson(jsonContents, SerializablePojo.class); + if (jsonContentsAsSerializablePojo.version == null) + return LegacySubmodelComponentSerializer.deserialize(model, + JsonHandler.parser.fromJson(jsonContents, LegacySubmodelComponentParams.class), name, id, null); + return SubmodelComponentSerializer.deserialize(model, JsonHandler.parser.fromJson(jsonContents, SubmodelComponentParams.class), + name, id, null); + } + + public static void registerResourceLoader(ResourceLoader resourceLoader) + { + registerResourceLoader(resourceLoader, resourceLoader.getClass()); + } + + public static void registerResourceLoader(ResourceLoader resourceLoader, Class reference) + { + resourceLoaders.put(reference.getName(), Objects.requireNonNull(resourceLoader)); + } + + public static void registerResourceLoader(ResourceLoader resourceLoader, String reference) + { + resourceLoaders.put(reference, Objects.requireNonNull(resourceLoader)); + } + + private static void tryLoadResourceLoader(String loaderClassName) + { + ReflectionHelper.tryInvokeStaticInitializer(loaderClassName, "Error loading resoruce loader %s: %s\n"); + } + + public static interface ComponentSupplier + { + public ModelComponent create(LogicModelModifiable model, JsonElement params, String name); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java new file mode 100644 index 00000000..32d9f941 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/JSONSerializable.java @@ -0,0 +1,17 @@ +package net.mograsim.logic.model.serializing; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.util.JsonHandler; + +public interface JSONSerializable +{ + public String getIDForSerializing(IdentifyParams idParams); + + public Object getParamsForSerializing(IdentifyParams idParams); + + public default JsonElement getParamsForSerializingJSON(IdentifyParams idParams) + { + return JsonHandler.toJsonTree(getParamsForSerializing(idParams)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java new file mode 100644 index 00000000..c21fa866 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentParams.java @@ -0,0 +1,87 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; + +import com.google.gson.JsonElement; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.util.JsonHandler; + +/** + * This class contains all the information necessary to create a new {@link SubmodelComponent} + */ +public class LegacySubmodelComponentParams +{ + // basic stuff + public double width, height; + public LegacyInterfacePinParams[] interfacePins; + public LegacySubmodelParameters submodel; + + // functionality that needs to be expressed in Java code + public String symbolRendererSnippetID; + public JsonElement symbolRendererParams; + + public String outlineRendererSnippetID; + public JsonElement outlineRendererParams; + + public String highLevelStateHandlerSnippetID; + public JsonElement highLevelStateHandlerParams; + + public static class LegacyInterfacePinParams + { + public Point location; + public String name; + public int logicWidth; + } + + public static class LegacySubmodelParameters + { + public double innerScale; + public LegacyInnerComponentParams[] subComps; + public LegacyInnerWireParams[] innerWires; + + public static class LegacyInnerComponentParams + { + public String id; + public String name; + public Point pos; + public JsonElement params; + } + + public static class LegacyInnerWireParams + { + public LegacyInnerPinParams pin1, pin2; + public String name; + public Point[] path; + + public static class LegacyInnerPinParams + { + public String compName; + public String pinName; + } + } + } + + public static LegacySubmodelComponentParams readJson(String path) throws IOException + { + return JsonHandler.readJson(path, LegacySubmodelComponentParams.class); + } + + /** + * Writes this {@link LegacySubmodelComponentParams} object into a file in json format. The correct file extension is important! Check + * {@link LegacySubmodelComponentParams}.fileExtension + */ + public void writeJson(String path) + { + try + { + JsonHandler.writeJson(this, path); + } + catch (IOException e) + { + System.err.println("Failed to write SubComponentParams to file"); + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java new file mode 100644 index 00000000..93fc945e --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LegacySubmodelComponentSerializer.java @@ -0,0 +1,305 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import com.google.gson.JsonElement; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacyInterfacePinParams; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerComponentParams; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams; +import net.mograsim.logic.model.serializing.LegacySubmodelComponentParams.LegacySubmodelParameters.LegacyInnerWireParams.LegacyInnerPinParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.logic.model.util.JsonHandler; + +/** + * Creates {@link SubmodelComponent}s from {@link LegacySubmodelComponentParams} + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ +public final class LegacySubmodelComponentSerializer +{ + // convenience methods + + /** + * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams)}, but first reading the + * {@link LegacySubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class)); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, JsonElement)}, but first reading the + * {@link LegacySubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), idForSerializingOverride, + paramsForSerializingOverride); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String)}, but first reading the + * {@link LegacySubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)}, but first reading the + * {@link LegacySubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, LegacySubmodelComponentParams.class), name, idForSerializingOverride, + paramsForSerializingOverride); + } + + /** + * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no + * idForSerializingOverride set and using the default name. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params) + { + return deserialize(model, params, null, null, null); + } + + /** + * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} using the default name. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, + String idForSerializingOverride, JsonElement paramsForSerializingOverride) + { + return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride); + } + + /** + * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement)} with no + * idForSerializingOverride set. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name) + { + return deserialize(model, params, name, null, null); + } + + /** + * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link LegacySubmodelComponentParams} they are + * written to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(SubmodelComponent comp, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(comp), targetPath); + } + + /** + * Like {@link #serialize(SubmodelComponent, Function)}, but instead of returning the generated {@link LegacySubmodelComponentParams} + * they are written to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(comp, idParams), targetPath); + } + + /** + * {@link #serialize(SubmodelComponent, Function)} using the default {@link IdentifyParams} (see IdentifyParams's + * {@link IdentifyParams#IdentifyParams() default constructor}) + * + * @author Daniel Kirschten + */ + public static LegacySubmodelComponentParams serialize(SubmodelComponent comp) + { + return serialize(comp, new IdentifyParams()); + } + + // "core" methods + /** + * Creates a {@link SubmodelComponent} from the specified {@link LegacySubmodelComponentParams} with the given name. + *

+ * When serializing a SubmodelComponent, it is undesired for every subcomponent to be serialized with its complete inner + * structure. Instead, these sub-SubmodelComponents should be serialized with the ID and params which were used to + * determine the SubmodelComponentParams defining the sub-SubmodelComponent. Because of this, it is possible + * to override the ID and params used in {@link #serialize(SubmodelComponent, Function) serialize(...)} to describe this subcomponent. + * See there for details. + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + @SuppressWarnings("unused") // for ModelWire being created + public static SubmodelComponent deserialize(LogicModelModifiable model, LegacySubmodelComponentParams params, String name, + String idForSerializingOverride, JsonElement paramsForSerializingOverride) + { + DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, + paramsForSerializingOverride); + comp.setSubmodelScale(params.submodel.innerScale); + comp.setSize(params.width, params.height); + for (LegacyInterfacePinParams iPinParams : params.interfacePins) + // TRISTATE because we don't have a better choice + comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, PinUsage.TRISTATE, + iPinParams.location.x, iPinParams.location.y)); + LegacySubmodelParameters submodelParams = params.submodel; + LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); + Map componentsByName = submodelModifiable.getComponentsByName(); + ModelComponent[] components = new ModelComponent[submodelParams.subComps.length]; + for (int i = 0; i < components.length; i++) + { + LegacyInnerComponentParams cParams = submodelParams.subComps[i]; + components[i] = IndirectModelComponentCreator.createComponent(submodelModifiable, cParams.id, cParams.params, cParams.name); + components[i].moveTo(cParams.pos.x, cParams.pos.y); + } + + for (int i = 0; i < submodelParams.innerWires.length; i++) + { + LegacyInnerWireParams innerWire = submodelParams.innerWires[i]; + new ModelWire(submodelModifiable, innerWire.name, componentsByName.get(innerWire.pin1.compName).getPin(innerWire.pin1.pinName), + componentsByName.get(innerWire.pin2.compName).getPin(innerWire.pin2.pinName), innerWire.path); + } + comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) + .create(comp, params.symbolRendererParams)); + comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier + .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams)); + comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier + .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams)); + return comp; + } + + /** + * Returns {@link LegacySubmodelComponentParams}, which describe this {@link SubmodelComponent}.
+ * Subcomponents are serialized in the following way:
+ * If a subcomponent is a SubmodelComponent which has been deserialized, and it has an + * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set (e.g. non-null; see + * {@link #deserialize(LogicModelModifiable, LegacySubmodelComponentParams, String, String, JsonElement) deserialize(...)}), this ID and + * the component's {@link DeserializedSubmodelComponent#paramsForSerializingOverride paramsForSerializingOverride} are written.
+ * If this case doesn't apply (e.g. if the subcomponent is not a SubmodelComponent; or it is a + * SubmodelComponent, but hasn't been deserialized; or it has no + * {@link DeserializedSubmodelComponent#idForSerializingOverride idForSerializingOverride} set), the ID defined by idGetter + * and the params obtained by {@link ModelComponent#getParamsForSerializing() getParams()} are written.
+ * CodeSnippets are serialized using the ID defined by idGetter and the params obtained by the respective + * getParamsForSerializing methods ({@link Renderer#getParamsForSerializing()}). + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + public static LegacySubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams) + { + LegacySubmodelParameters submodelParams = new LegacySubmodelParameters(); + submodelParams.innerScale = comp.getSubmodelScale(); + + Map components = new HashMap<>(comp.submodel.getComponentsByName()); + components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME); + LegacyInnerComponentParams[] componentParams = new LegacyInnerComponentParams[components.size()]; + int i1 = 0; + for (ModelComponent innerComponent : components.values()) + { + LegacyInnerComponentParams innerComponentParams = new LegacyInnerComponentParams(); + componentParams[i1] = innerComponentParams; + innerComponentParams.pos = new Point(innerComponent.getPosX(), innerComponent.getPosY()); + innerComponentParams.id = innerComponent.getIDForSerializing(idParams); + innerComponentParams.params = innerComponent.getParamsForSerializingJSON(idParams); + innerComponentParams.name = innerComponent.getName(); + i1++; + } + submodelParams.subComps = componentParams; + + Collection wires = comp.submodel.getWiresByName().values(); + LegacyInnerWireParams wireParams[] = new LegacyInnerWireParams[wires.size()]; + i1 = 0; + for (ModelWire innerWire : wires) + { + LegacyInnerWireParams innerWireParams = new LegacyInnerWireParams(); + wireParams[i1] = innerWireParams; + LegacyInnerPinParams pin1Params = new LegacyInnerPinParams(), pin2Params = new LegacyInnerPinParams(); + + pin1Params.pinName = innerWire.getPin1().name; + pin1Params.compName = innerWire.getPin1().component.getName(); + pin2Params.pinName = innerWire.getPin2().name; + pin2Params.compName = innerWire.getPin2().component.getName(); + innerWireParams.name = innerWire.name; + innerWireParams.pin1 = pin1Params; + innerWireParams.pin2 = pin2Params; + innerWireParams.path = innerWire.getPath(); + i1++; + } + submodelParams.innerWires = wireParams; + + LegacySubmodelComponentParams params = new LegacySubmodelComponentParams(); + params.submodel = submodelParams; + + params.width = comp.getWidth(); + params.height = comp.getHeight(); + + LegacyInterfacePinParams[] iPins = new LegacyInterfacePinParams[comp.getPins().size()]; + int i = 0; + for (Pin p : comp.getPins().values()) + { + LegacyInterfacePinParams iPinParams = new LegacyInterfacePinParams(); + iPins[i] = iPinParams; + iPinParams.location = p.getRelPos(); + iPinParams.name = p.name; + iPinParams.logicWidth = p.logicWidth; + i++; + } + params.interfacePins = iPins; + + Renderer symbolRenderer = comp.getSymbolRenderer(); + if (symbolRenderer != null) + { + params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams); + params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams); + } + + Renderer outlineRenderer = comp.getOutlineRenderer(); + if (outlineRenderer != null) + { + params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams); + params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams); + } + + HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler(); + if (highLevelStateHandler != null) + { + params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams); + params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams); + } + + return params; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java new file mode 100644 index 00000000..187d82c5 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelParams.java @@ -0,0 +1,38 @@ +package net.mograsim.logic.model.serializing; + +import com.google.gson.JsonElement; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.util.Version; + +public class LogicModelParams extends SerializablePojo +{ + public ComponentParams[] components; + public WireParams[] wires; + + public LogicModelParams(Version version) + { + super(version); + } + + public static class ComponentParams + { + public String id; + public String name; + public Point pos; + public JsonElement params; + } + + public static class WireParams + { + public PinParams pin1, pin2; + public String name; + public Point[] path; + + public static class PinParams + { + public String compName; + public String pinName; + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java new file mode 100644 index 00000000..97b84ce3 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/LogicModelSerializer.java @@ -0,0 +1,172 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.LogicModelParams.ComponentParams; +import net.mograsim.logic.model.serializing.LogicModelParams.WireParams; +import net.mograsim.logic.model.serializing.LogicModelParams.WireParams.PinParams; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.logic.model.util.Version; + +public class LogicModelSerializer +{ + public static final Version CURRENT_JSON_VERSION = Version.parseSemver("0.1.1"); + + // convenience methods + /** + * Like {@link #deserialize(LogicModelParams)}, but first reading the {@link LogicModelParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static LogicModelModifiable deserialize(String sourcePath) throws IOException + { + return deserialize(JsonHandler.readJson(sourcePath, LogicModelParams.class)); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LogicModelParams)}, but first reading the {@link LogicModelParams} from the given file + * path. + * + * @author Daniel Kirschten + */ + public static void deserialize(LogicModelModifiable model, String sourcePath) throws IOException + { + deserialize(model, JsonHandler.readJson(sourcePath, LogicModelParams.class)); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, LogicModelParams)}, but using a newly created {@link LogicModelModifiable}. + * + * @author Daniel Kirschten + */ + public static LogicModelModifiable deserialize(LogicModelParams params) + { + LogicModelModifiable model = new LogicModelModifiable(); + deserialize(model, params); + return model; + } + + /** + * Like {@link #serialize(LogicModel)}, but instead of returning the generated {@link LogicModelParams} they are written to a file at + * the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(LogicModel model, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(model), targetPath); + } + + /** + * Like {@link #serialize(LogicModel, IdentifyParams)}, but instead of returning the generated {@link LogicModelParams} they are written + * to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(LogicModel model, IdentifyParams idParams, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(model, idParams), targetPath); + } + + /** + * {@link #serialize(LogicModel, IdentifyParams)} using the default {@link IdentifyParams} (see IdentifyParams's + * {@link IdentifyParams#IdentifyParams() default constructor}) + * + * @author Daniel Kirschten + */ + public static LogicModelParams serialize(LogicModel model) + { + return serialize(model, new IdentifyParams()); + } + + // "core" methods + /** + * Deserializes components and wires from the specified {@link LogicModelParams} and adds them to the given + * {@link LogicModelModifiable}. + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + @SuppressWarnings("unused") // for ModelWire being created + public static void deserialize(LogicModelModifiable model, LogicModelParams params) + { + Map componentsByName = model.getComponentsByName(); + ModelComponent[] components = new ModelComponent[params.components.length]; + for (int i = 0; i < components.length; i++) + { + ComponentParams compParams = params.components[i]; + components[i] = IndirectModelComponentCreator.createComponent(model, compParams.id, compParams.params, compParams.name); + components[i].moveTo(compParams.pos.x, compParams.pos.y); + } + + for (int i = 0; i < params.wires.length; i++) + { + WireParams wire = params.wires[i]; + new ModelWire(model, wire.name, componentsByName.get(wire.pin1.compName).getPin(wire.pin1.pinName), + componentsByName.get(wire.pin2.compName).getPin(wire.pin2.pinName), wire.path); + } + } + + /** + * Returns {@link LogicModelModifiable}, which describe the components and wires in the given {@link LogicModel}.
+ * Components are serialized using {@link ModelComponent#getIDForSerializing(IdentifyParams)} and + * {@link ModelComponent#getParamsForSerializingJSON(IdentifyParams)}
+ * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + public static LogicModelParams serialize(LogicModel model, IdentifyParams idParams) + { + LogicModelParams modelParams = new LogicModelParams(CURRENT_JSON_VERSION); + + Map components = new HashMap<>(model.getComponentsByName()); + components.remove(SubmodelComponent.SUBMODEL_INTERFACE_NAME); + Set componentsParams = new HashSet<>(); + for (ModelComponent component : components.values()) + { + ComponentParams compParams = new ComponentParams(); + componentsParams.add(compParams); + compParams.pos = new Point(component.getPosX(), component.getPosY()); + compParams.id = component.getIDForSerializing(idParams); + compParams.params = component.getParamsForSerializingJSON(idParams); + compParams.name = component.getName(); + } + modelParams.components = componentsParams.toArray(ComponentParams[]::new); + Arrays.sort(modelParams.components, Comparator.comparing(c -> c.name)); + + Collection wires = model.getWiresByName().values(); + Set wiresParams = new HashSet<>(); + for (ModelWire innerWire : wires) + { + WireParams innerWireParams = new WireParams(); + wiresParams.add(innerWireParams); + PinParams pin1Params = new PinParams(), pin2Params = new PinParams(); + + pin1Params.pinName = innerWire.getPin1().name; + pin1Params.compName = innerWire.getPin1().component.getName(); + pin2Params.pinName = innerWire.getPin2().name; + pin2Params.compName = innerWire.getPin2().component.getName(); + innerWireParams.name = innerWire.name; + innerWireParams.pin1 = pin1Params; + innerWireParams.pin2 = pin2Params; + innerWireParams.path = innerWire.getPath(); + } + modelParams.wires = wiresParams.toArray(WireParams[]::new); + Arrays.sort(modelParams.wires, Comparator.comparing(c -> c.name)); + + return modelParams; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java new file mode 100644 index 00000000..1a6a66a4 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ReflectionHelper.java @@ -0,0 +1,36 @@ +package net.mograsim.logic.model.serializing; + +public class ReflectionHelper +{ + private ReflectionHelper() + { + } + + public static Class tryInvokeStaticInitializer(String className, String errorMessageFormat) + { + return tryInvokeStaticInitializer(className, errorMessageFormat, ReflectionHelper.class.getClassLoader()); + } + + public static Class tryInvokeStaticInitializer(String className, String errorMessageFormat, ClassLoader classLoader) + { + try + { + return tryInvokeStaticInitializer(className, classLoader); + } + catch (ClassNotFoundException e) + { + System.err.printf(errorMessageFormat, className, "ClassNotFoundException thrown: " + e.getMessage()); + return null; + } + } + + public static Class tryInvokeStaticInitializer(String className) throws ClassNotFoundException + { + return tryInvokeStaticInitializer(className, ReflectionHelper.class.getClassLoader()); + } + + public static Class tryInvokeStaticInitializer(String className, ClassLoader classLoader) throws ClassNotFoundException + { + return Class.forName(className, true, classLoader); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java new file mode 100644 index 00000000..f15b475e --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/ResourceLoader.java @@ -0,0 +1,16 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.io.InputStream; + +import net.mograsim.logic.model.model.components.ModelComponent; + +/** + * For loading JSON {@link ModelComponent}s from other OSGI-Modules or jar-Files. + */ +public interface ResourceLoader +{ + InputStream loadResource(String path) throws IOException; + + Class loadClass(String name) throws ClassNotFoundException; +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java new file mode 100644 index 00000000..4cc94d76 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SerializablePojo.java @@ -0,0 +1,19 @@ +package net.mograsim.logic.model.serializing; + +import net.mograsim.logic.model.util.Version; + +/** + * This class is the superclass of all POJOs that can be serialized to JSON. + * + * @author Daniel Kirschten + * + */ +public class SerializablePojo +{ + public Version version; + + public SerializablePojo(Version version) + { + this.version = version; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java new file mode 100644 index 00000000..9467200f --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/StandardComponentIdMappingContainer.java @@ -0,0 +1,20 @@ +package net.mograsim.logic.model.serializing; + +import java.util.Map; + +import net.mograsim.logic.model.util.Version; + +public class StandardComponentIdMappingContainer extends SerializablePojo +{ + public Map map; + + public StandardComponentIdMappingContainer(Version version) + { + super(version); + } + + public Map getMap() + { + return map; + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java new file mode 100644 index 00000000..97b3c7c1 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentParams.java @@ -0,0 +1,43 @@ +package net.mograsim.logic.model.serializing; + +import com.google.gson.JsonElement; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.util.Version; + +/** + * This class contains all the information necessary to create a new {@link SubmodelComponent} + */ +public class SubmodelComponentParams extends SerializablePojo +{ + // basic stuff + public double width, height; + public InterfacePinParams[] interfacePins; + public double innerScale; + public LogicModelParams submodel; + + // functionality that needs to be expressed in Java code + public String symbolRendererSnippetID; + public JsonElement symbolRendererParams; + + public String outlineRendererSnippetID; + public JsonElement outlineRendererParams; + + public String highLevelStateHandlerSnippetID; + public JsonElement highLevelStateHandlerParams; + + public SubmodelComponentParams(Version version) + { + super(version); + } + + public static class InterfacePinParams + { + public Point location; + public String name; + public int logicWidth; + public PinUsage usage; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java new file mode 100644 index 00000000..cf139885 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/SubmodelComponentSerializer.java @@ -0,0 +1,245 @@ +package net.mograsim.logic.model.serializing; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Comparator; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.MovablePin; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.serializing.SubmodelComponentParams.InterfacePinParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.logic.model.util.JsonHandler; +import net.mograsim.logic.model.util.Version; + +/** + * Creates {@link SubmodelComponent}s from {@link SubmodelComponentParams} + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ +public final class SubmodelComponentSerializer +{ + public static final Version JSON_VERSION_CURRENT_SERIALIZING = Version.parseSemver("0.1.5"); + public static final Version JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING = Version.parseSemver("0.1.5"); + public static final Version JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED = Version.parseSemver("0.1.5"); + // convenience methods + + /** + * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams)}, but first reading the {@link SubmodelComponentParams} from + * the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class)); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, JsonElement)}, but first reading the + * {@link SubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), idForSerializingOverride, + paramsForSerializingOverride); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String)}, but first reading the + * {@link SubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), name); + } + + /** + * Like {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)}, but first reading the + * {@link SubmodelComponentParams} from the given file path. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, String sourcePath, String name, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) throws IOException + { + return deserialize(model, JsonHandler.readJson(sourcePath, SubmodelComponentParams.class), name, idForSerializingOverride, + paramsForSerializingOverride); + } + + /** + * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} with no + * idForSerializingOverride set and using the default name. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params) + { + return deserialize(model, params, null, null, null); + } + + /** + * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} using the default name. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String idForSerializingOverride, + JsonElement paramsForSerializingOverride) + { + return deserialize(model, params, null, idForSerializingOverride, paramsForSerializingOverride); + } + + /** + * {@link #deserialize(LogicModelModifiable, SubmodelComponentParams, String, String, JsonElement)} with no + * idForSerializingOverride set. + * + * @author Daniel Kirschten + */ + public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String name) + { + return deserialize(model, params, name, null, null); + } + + /** + * Like {@link #serialize(SubmodelComponent)}, but instead of returning the generated {@link SubmodelComponentParams} they are written + * to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(SubmodelComponent comp, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(comp), targetPath); + } + + /** + * Like {@link #serialize(SubmodelComponent, IdentifyParams)}, but instead of returning the generated {@link SubmodelComponentParams} + * they are written to a file at the given path. + * + * @author Daniel Kirschten + */ + public static void serialize(SubmodelComponent comp, IdentifyParams idParams, String targetPath) throws IOException + { + JsonHandler.writeJson(serialize(comp, idParams), targetPath); + } + + /** + * {@link #serialize(SubmodelComponent, IdentifyParams)} using the default {@link IdentifyParams} (see IdentifyParams's + * {@link IdentifyParams#IdentifyParams() default constructor}) + * + * @author Daniel Kirschten + */ + public static SubmodelComponentParams serialize(SubmodelComponent comp) + { + return serialize(comp, new IdentifyParams()); + } + + // "core" methods + /** + * Creates a {@link SubmodelComponent} from the specified {@link SubmodelComponentParams} with the given name. + *

+ * When serializing a SubmodelComponent, it is undesired for every subcomponent to be serialized with its complete inner + * structure. Instead, these sub-SubmodelComponents should be serialized with the ID and params which were used to + * determine the SubmodelComponentParams defining the sub-SubmodelComponent. Because of this, it is possible + * to override the ID and params used in {@link #serialize(SubmodelComponent, IdentifyParams) serialize(...)} to describe this + * subcomponent. See there for details. + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + @SuppressWarnings("unused") // for ModelWire being created + public static SubmodelComponent deserialize(LogicModelModifiable model, SubmodelComponentParams params, String name, + String idForSerializingOverride, JsonElement paramsForSerializingOverride) + { + Version version = params.version; + if (version.compareTo(JSON_VERSION_LATEST_SUPPORTED_DESERIALIZING) > 0) + throw new IllegalArgumentException("JSON version " + version + " not supported yet"); + boolean hasUsageSerialized = version.compareTo(JSON_VERSION_EARLIEST_WITH_USAGE_SERIALIZED) >= 0; + DeserializedSubmodelComponent comp = new DeserializedSubmodelComponent(model, name, idForSerializingOverride, + paramsForSerializingOverride); + comp.setSubmodelScale(params.innerScale); + comp.setSize(params.width, params.height); + for (InterfacePinParams iPinParams : params.interfacePins) + // TRISTATE because we don't have a better choice + comp.addSubmodelInterface(new MovablePin(model, comp, iPinParams.name, iPinParams.logicWidth, + hasUsageSerialized ? iPinParams.usage : PinUsage.TRISTATE, iPinParams.location.x, iPinParams.location.y)); + LogicModelModifiable submodelModifiable = comp.getSubmodelModifiable(); + LogicModelSerializer.deserialize(comp.getSubmodelModifiable(), params.submodel); + comp.setSymbolRenderer(SubmodelComponentSnippetSuppliers.symbolRendererSupplier.getSnippetSupplier(params.symbolRendererSnippetID) + .create(comp, params.symbolRendererParams)); + comp.setOutlineRenderer(SubmodelComponentSnippetSuppliers.outlineRendererSupplier + .getSnippetSupplier(params.outlineRendererSnippetID).create(comp, params.outlineRendererParams)); + comp.setHighLevelStateHandler(SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier + .getSnippetSupplier(params.highLevelStateHandlerSnippetID).create(comp, params.highLevelStateHandlerParams)); + return comp; + } + + /** + * Returns {@link SubmodelComponentParams}, which describe this {@link SubmodelComponent}.
+ * See {@link LogicModelSerializer#serialize(net.mograsim.logic.model.model.LogicModel, IdentifierGetter) + * LogicModelSerializer.serialize(...)} for how subcomponents are serialized.
+ * CodeSnippets are serialized using the ID defined by idGetter and the params obtained by the respective + * getParamsForSerializing methods ({@link Renderer#getParamsForSerializing()}). + * + * @author Fabian Stemmler + * @author Daniel Kirschten + */ + public static SubmodelComponentParams serialize(SubmodelComponent comp, IdentifyParams idParams) + { + SubmodelComponentParams params = new SubmodelComponentParams(JSON_VERSION_CURRENT_SERIALIZING); + params.innerScale = comp.getSubmodelScale(); + params.submodel = LogicModelSerializer.serialize(comp.submodel, idParams); + + params.width = comp.getWidth(); + params.height = comp.getHeight(); + + InterfacePinParams[] iPins = new InterfacePinParams[comp.getPins().size()]; + int i = 0; + for (Pin p : comp.getPins().values()) + { + InterfacePinParams iPinParams = new InterfacePinParams(); + iPins[i] = iPinParams; + iPinParams.location = p.getRelPos(); + iPinParams.name = p.name; + iPinParams.logicWidth = p.logicWidth; + iPinParams.usage = p.usage; + i++; + } + params.interfacePins = iPins; + Arrays.sort(params.interfacePins, Comparator.comparing(p -> p.name)); + + Renderer symbolRenderer = comp.getSymbolRenderer(); + if (symbolRenderer != null) + { + params.symbolRendererSnippetID = symbolRenderer.getIDForSerializing(idParams); + params.symbolRendererParams = symbolRenderer.getParamsForSerializingJSON(idParams); + } + + Renderer outlineRenderer = comp.getOutlineRenderer(); + if (outlineRenderer != null) + { + params.outlineRendererSnippetID = outlineRenderer.getIDForSerializing(idParams); + params.outlineRendererParams = outlineRenderer.getParamsForSerializingJSON(idParams); + } + + HighLevelStateHandler highLevelStateHandler = comp.getHighLevelStateHandler(); + if (highLevelStateHandler != null) + { + params.highLevelStateHandlerSnippetID = highLevelStateHandler.getIDForSerializing(idParams); + params.highLevelStateHandlerParams = highLevelStateHandler.getParamsForSerializingJSON(idParams); + } + + return params; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json new file mode 100644 index 00000000..b0b8bedd --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/serializing/standardComponentIDMapping.json @@ -0,0 +1,17 @@ +{ + "version": "0.1.0", + "map": { + "AndGate": "class:net.mograsim.logic.model.model.components.atomic.ModelAndGate", + "BitDisplay": "class:net.mograsim.logic.model.model.components.atomic.ModelBitDisplay", + "Clock": "class:net.mograsim.logic.model.model.components.atomic.ModelClock", + "FixedOutput": "class:net.mograsim.logic.model.model.components.atomic.ModelFixedOutput", + "ManualSwitch": "class:net.mograsim.logic.model.model.components.atomic.ModelManualSwitch", + "Merger": "class:net.mograsim.logic.model.model.components.atomic.ModelMerger", + "NandGate": "class:net.mograsim.logic.model.model.components.atomic.ModelNandGate", + "OrGate": "class:net.mograsim.logic.model.model.components.atomic.ModelOrGate", + "Splitter": "class:net.mograsim.logic.model.model.components.atomic.ModelSplitter", + "TriStateBuffer": "class:net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer", + "TextComponent": "class:net.mograsim.logic.model.model.components.atomic.ModelTextComponent", + "WireCrossPoint": "class:net.mograsim.logic.model.model.wires.ModelWireCrossPoint" + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java new file mode 100644 index 00000000..22ebc090 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/CodeSnippetSupplier.java @@ -0,0 +1,72 @@ +package net.mograsim.logic.model.snippets; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import net.mograsim.logic.model.serializing.ReflectionHelper; + +public class CodeSnippetSupplier +{ + private final Map standardSnippetIDClassNames = new HashMap<>(); + private final Map standardSnippetIDClassNamesUnmodifiable = Collections.unmodifiableMap(standardSnippetIDClassNames); + private final Map> snippetSuppliersForClassNames = new HashMap<>(); + private final SnippetDefinintion defaultSnippetSupplier; + + public CodeSnippetSupplier(SnippetDefinintion defaultSnippetSupplier) + { + this.defaultSnippetSupplier = defaultSnippetSupplier; + } + + public void addStandardSnippetID(String standardSnippetID, String associatedSnippetID) + { + if (!associatedSnippetID.startsWith("class:")) + throw new IllegalArgumentException("Unrecognized snippet ID format: " + associatedSnippetID); + standardSnippetIDClassNames.put(standardSnippetID, associatedSnippetID); + } + + public Map getStandardSnippetIDs() + { + return standardSnippetIDClassNamesUnmodifiable; + } + + public void setSnippetSupplier(String id, SnippetDefinintion snippetSupplier) + { + snippetSuppliersForClassNames.put(id, snippetSupplier); + } + + // TODO report errors + public SnippetDefinintion getSnippetSupplier(String id) + { + if (id != null) + { + String resolvedID = resolveID(id); + if (resolvedID != null) + { + String snippetClassName = resolvedID.substring(6); + tryLoadSnippetClass(snippetClassName); + SnippetDefinintion snippetSupplier = snippetSuppliersForClassNames.get(snippetClassName); + if (snippetSupplier != null) + return snippetSupplier; + } + System.err.println("Couldn't load snippet " + id + "; using default"); + } + if (defaultSnippetSupplier == null) + throw new IllegalArgumentException("No default snippet set"); + return defaultSnippetSupplier; + } + + public String resolveID(String id) + { + if (id.startsWith("class:")) + return id; + return standardSnippetIDClassNames.get(id); + } + + // static helpers + + private static void tryLoadSnippetClass(String snippetClassName) + { + ReflectionHelper.tryInvokeStaticInitializer(snippetClassName, "Error getting snippet class: %s: %s\n"); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java new file mode 100644 index 00000000..622df00b --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/HighLevelStateHandler.java @@ -0,0 +1,41 @@ +package net.mograsim.logic.model.snippets; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.JSONSerializable; + +/** + * A high level state ID consists of parts separated by dots ('.').
+ * The last part (the part after the last dot) is called "atomic high level state ID". The parts before that part are called "subcomponent + * ID"s.
+ * If there is no dot in a high level state ID, the whole high level state ID is called atomic.
+ * Note that subcomponent IDs don't have to correspond to actual subcomponents. For example, a RAM component may supply subcomponent IDs + * "c0000", "c0001" ... "cFFFF" without actually having a subcomponent for each cell. It also is allowed to delegate an atomic high level + * state ID to a subcomponent. + * + * @author Daniel Kirschten + */ +public interface HighLevelStateHandler extends JSONSerializable +{ + /** + * Gets the current value of the given high-level state.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @see #setHighLevelState(String, Object) + * @see ModelComponent#getHighLevelState(String) + * + * @author Daniel Kirschten + */ + public Object getHighLevelState(String stateID); + + /** + * Sets the given high-level state to the given value.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @see #getHighLevelState(String) + * @see ModelComponent#setHighLevelState(String, Object) + * + * @author Daniel Kirschten + */ + public void setHighLevelState(String stateID, Object newState); + +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java new file mode 100644 index 00000000..5ed33bdc --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/Renderer.java @@ -0,0 +1,10 @@ +package net.mograsim.logic.model.snippets; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.serializing.JSONSerializable; + +public interface Renderer extends JSONSerializable +{ + public void render(GeneralGC gc, Rectangle visibleRegion); +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java new file mode 100644 index 00000000..c5fecf25 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SnippetDefinintion.java @@ -0,0 +1,43 @@ +package net.mograsim.logic.model.snippets; + +import java.util.function.BiFunction; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; + +public interface SnippetDefinintion +{ + public Class

getParamClass(); + + public S create(C context, P params); + + public default S create(C context, JsonElement params) + { + Class

paramClass = getParamClass(); + if (paramClass.equals(Void.class)) + { + if (params != null) + throw new IllegalArgumentException("Params given where none were expected"); + return create(context, (P) null); + } + return create(context, new Gson().fromJson(params, getParamClass())); + } + + public static SnippetDefinintion create(Class

paramClass, BiFunction supplier) + { + return new SnippetDefinintion<>() + { + @Override + public Class

getParamClass() + { + return paramClass; + } + + @Override + public S create(C context, P params) + { + return supplier.apply(context, params); + } + }; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java new file mode 100644 index 00000000..860557fd --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/SubmodelComponentSnippetSuppliers.java @@ -0,0 +1,56 @@ +package net.mograsim.logic.model.snippets; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer; +import net.mograsim.logic.model.util.JsonHandler; + +public class SubmodelComponentSnippetSuppliers +{ + public static final CodeSnippetSupplier symbolRendererSupplier; + public static final CodeSnippetSupplier outlineRendererSupplier; + public static final CodeSnippetSupplier highLevelStateHandlerSupplier; + + static + { + symbolRendererSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultSymbolRenderer::new)); + outlineRendererSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultOutlineRenderer::new)); + highLevelStateHandlerSupplier = new CodeSnippetSupplier<>(SnippetDefinintion.create(Void.class, DefaultHighLevelStateHandler::new)); + } + + static + { + try (InputStream s = SubmodelComponentSnippetSuppliers.class.getResourceAsStream("standardSnippetIDMapping.json")) + { + if (s == null) + throw new IOException("Resource not found"); + SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class); + tmp.standardSymbolRendererSuppliers.forEach(symbolRendererSupplier::addStandardSnippetID); + tmp.standardOutlineRendererSuppliers.forEach(outlineRendererSupplier::addStandardSnippetID); + tmp.standardHighLevelStateHandlerSuppliers.forEach(highLevelStateHandlerSupplier::addStandardSnippetID); + } + catch (Exception e) + { + System.err.println("Failed to initialize standard snippet ID mapping:"); + e.printStackTrace(); + } + } + + private static class SnippetIDClassNames + { + public Map standardSymbolRendererSuppliers; + public Map standardOutlineRendererSuppliers; + public Map standardHighLevelStateHandlerSuppliers; + } + + private SubmodelComponentSnippetSuppliers() + { + throw new UnsupportedOperationException(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java new file mode 100644 index 00000000..7fd1fc96 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/DefaultHighLevelStateHandler.java @@ -0,0 +1,57 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers; + +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; + +public class DefaultHighLevelStateHandler implements HighLevelStateHandler +{ + public DefaultHighLevelStateHandler() + { + this(null); + } + + public DefaultHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + @SuppressWarnings("unused") // we don't need the component; and params are always null + public DefaultHighLevelStateHandler(SubmodelComponent component, Void params) + { + // nothing to do here + } + + @Override + public Object getHighLevelState(String stateID) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "default"; + } + + @Override + public Void getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + static + { + SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier( + DefaultHighLevelStateHandler.class.getCanonicalName(), + SnippetDefinintion.create(Void.class, DefaultHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java new file mode 100644 index 00000000..58e8e64c --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandler.java @@ -0,0 +1,215 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; +import java.util.function.BiFunction; +import java.util.function.Function; + +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler.AtomicHighLevelStateHandlerParams; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler.SubcomponentHighLevelStateHandlerParams; + +public class StandardHighLevelStateHandler implements HighLevelStateHandler +{ + private final SubmodelComponent component; + private final Map subcomponentHighLevelStateHandlers; + private final Map subcomponentHighLevelStateHandlersUnmodifiable; + private final Map atomicHighLevelStateHandlers; + private final Map atomicHighLevelStateHandlersUnmodifiable; + + public StandardHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public StandardHighLevelStateHandler(SubmodelComponent component, StandardHighLevelStateHandlerParams params) + { + this.component = component; + this.subcomponentHighLevelStateHandlers = new HashMap<>(); + this.subcomponentHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(subcomponentHighLevelStateHandlers); + this.atomicHighLevelStateHandlers = new HashMap<>(); + this.atomicHighLevelStateHandlersUnmodifiable = Collections.unmodifiableMap(atomicHighLevelStateHandlers); + if (params != null) + { + params.subcomponentHighLevelStates.forEach(this::addSubcomponentHighLevelState); + params.atomicHighLevelStates.forEach(this::addAtomicHighLevelState); + } + } + + public SubcomponentHighLevelStateHandler addSubcomponentHighLevelState(String subcomponentStateID, + SubcomponentHighLevelStateHandlerParams handlerParams) + { + return addSubcomponentHighLevelState(subcomponentStateID, + StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier.getSnippetSupplier(handlerParams.id)::create, + handlerParams.params); + } + + public H addSubcomponentHighLevelState(String subcomponentStateID, + BiFunction handlerConstructor, P handlerParams) + { + return addSubcomponentHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams)); + } + + public H addSubcomponentHighLevelState(String subcomponentStateID, + Function handlerConstructor) + { + H handler = handlerConstructor.apply(component); + addSubcomponentHighLevelState(subcomponentStateID, handler); + return handler; + } + + public void addSubcomponentHighLevelState(String subcomponentStateID, SubcomponentHighLevelStateHandler handler) + { + checkHighLevelStateIDPart(subcomponentStateID); + subcomponentHighLevelStateHandlers.put(subcomponentStateID, handler); + } + + public void removeSubcomponentHighLevelState(String subcomponentStateID) + { + checkHighLevelStateIDPart(subcomponentStateID); + subcomponentHighLevelStateHandlers.remove(subcomponentStateID); + } + + public Map getSubcomponentHighLevelStates() + { + return subcomponentHighLevelStateHandlersUnmodifiable; + } + + public AtomicHighLevelStateHandler addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandlerParams handlerParams) + { + return addAtomicHighLevelState(atomicStateID, + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.getSnippetSupplier(handlerParams.id)::create, + handlerParams.params); + } + + public H addAtomicHighLevelState(String subcomponentStateID, + BiFunction handlerConstructor, P handlerParams) + { + return addAtomicHighLevelState(subcomponentStateID, c -> handlerConstructor.apply(c, handlerParams)); + } + + public H addAtomicHighLevelState(String subcomponentStateID, + Function handlerConstructor) + { + H handler = handlerConstructor.apply(component); + addAtomicHighLevelState(subcomponentStateID, handler); + return handler; + } + + public void addAtomicHighLevelState(String atomicStateID, AtomicHighLevelStateHandler handler) + { + checkHighLevelStateIDPart(atomicStateID); + atomicHighLevelStateHandlers.put(atomicStateID, handler); + } + + public void removeAtomicHighLevelState(String atomicStateID) + { + checkHighLevelStateIDPart(atomicStateID); + atomicHighLevelStateHandlers.remove(atomicStateID); + } + + public Map getAtomicHighLevelStates() + { + return atomicHighLevelStateHandlersUnmodifiable; + } + + private static void checkHighLevelStateIDPart(String stateIDPart) + { + if (stateIDPart.indexOf('.') != -1) + throw new IllegalArgumentException("Illegal high level state ID part (contains dot): " + stateIDPart); + } + + @Override + public Object getHighLevelState(String stateID) + { + int indexOfDot = stateID.indexOf('.'); + if (indexOfDot == -1) + { + AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID); + if (handler != null) + return handler.getHighLevelState(); + } else + { + SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot)); + if (handler != null) + return handler.getHighLevelState(stateID.substring(indexOfDot + 1)); + } + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + int indexOfDot = stateID.indexOf('.'); + if (indexOfDot == -1) + { + AtomicHighLevelStateHandler handler = atomicHighLevelStateHandlers.get(stateID); + if (handler != null) + handler.setHighLevelState(newState); + else + throw new IllegalArgumentException("No high level state with ID " + stateID); + } else + { + SubcomponentHighLevelStateHandler handler = subcomponentHighLevelStateHandlers.get(stateID.substring(0, indexOfDot)); + if (handler != null) + handler.setHighLevelState(stateID.substring(indexOfDot + 1), newState); + else + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "standard"; + } + + @Override + public StandardHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + StandardHighLevelStateHandlerParams params = new StandardHighLevelStateHandlerParams(); + params.subcomponentHighLevelStates = new TreeMap<>(); + params.atomicHighLevelStates = new TreeMap<>(); + for (Entry e : subcomponentHighLevelStateHandlers.entrySet()) + { + String stateID = e.getKey(); + SubcomponentHighLevelStateHandler handler = e.getValue(); + SubcomponentHighLevelStateHandlerParams handlerParams = new SubcomponentHighLevelStateHandlerParams(); + handlerParams.id = handler.getIDForSerializing(idParams); + handlerParams.params = handler.getParamsForSerializingJSON(idParams); + params.subcomponentHighLevelStates.put(stateID, handlerParams); + } + for (Entry e : atomicHighLevelStateHandlers.entrySet()) + { + String stateID = e.getKey(); + AtomicHighLevelStateHandler handler = e.getValue(); + AtomicHighLevelStateHandlerParams handlerParams = new AtomicHighLevelStateHandlerParams(); + handlerParams.id = handler.getIDForSerializing(idParams); + handlerParams.params = handler.getParamsForSerializingJSON(idParams); + params.atomicHighLevelStates.put(stateID, handlerParams); + } + return params; + } + + public static class StandardHighLevelStateHandlerParams + { + public Map subcomponentHighLevelStates; + public Map atomicHighLevelStates; + } + + static + { + SubmodelComponentSnippetSuppliers.highLevelStateHandlerSupplier.setSnippetSupplier( + StandardHighLevelStateHandler.class.getCanonicalName(), + SnippetDefinintion.create(StandardHighLevelStateHandlerParams.class, StandardHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java new file mode 100644 index 00000000..158adda2 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/StandardHighLevelStateHandlerSnippetSuppliers.java @@ -0,0 +1,51 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.snippets.CodeSnippetSupplier; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.AtomicHighLevelStateHandler; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.SubcomponentHighLevelStateHandler; +import net.mograsim.logic.model.util.JsonHandler; + +public class StandardHighLevelStateHandlerSnippetSuppliers +{ + public static final CodeSnippetSupplier atomicHandlerSupplier; + public static final CodeSnippetSupplier subcomponentHandlerSupplier; + + static + { + atomicHandlerSupplier = new CodeSnippetSupplier<>(null); + subcomponentHandlerSupplier = new CodeSnippetSupplier<>(null); + } + + static + { + try (InputStream s = StandardHighLevelStateHandlerSnippetSuppliers.class.getResourceAsStream("standardSnippetIDMapping.json")) + { + if (s == null) + throw new IOException("Resource not found"); + SnippetIDClassNames tmp = JsonHandler.readJson(s, SnippetIDClassNames.class); + tmp.standardSubcomponentHandlerSuppliers.forEach(subcomponentHandlerSupplier::addStandardSnippetID); + tmp.standardAtomicHandlerSuppliers.forEach(atomicHandlerSupplier::addStandardSnippetID); + } + catch (Exception e) + { + System.err.println("Failed to initialize standard snippet ID mapping: "); + e.printStackTrace(); + } + } + + private static class SnippetIDClassNames + { + public Map standardSubcomponentHandlerSuppliers; + public Map standardAtomicHandlerSuppliers; + } + + private StandardHighLevelStateHandlerSnippetSuppliers() + { + throw new UnsupportedOperationException(); + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java new file mode 100644 index 00000000..97ace092 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/AtomicHighLevelStateHandler.java @@ -0,0 +1,31 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.serializing.JSONSerializable; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; + +public interface AtomicHighLevelStateHandler extends JSONSerializable +{ + /** + * Gets the current value of the atomic high level state represented by this AtomicHighLevelStateHandler.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @author Daniel Kirschten + */ + public Object getHighLevelState(); + + /** + * Sets the atomic high level state represented by this AtomicHighLevelStateHandler to the given value.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @author Daniel Kirschten + */ + public void setHighLevelState(Object newState); + + public static class AtomicHighLevelStateHandlerParams + { + public String id; + public JsonElement params; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java new file mode 100644 index 00000000..7ae29128 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/BitVectorSplittingAtomicHighLevelStateHandler.java @@ -0,0 +1,141 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; + +public class BitVectorSplittingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler +{ + private final SubmodelComponent component; + private final List vectorPartTargets; + private final List vectorPartTargetsUnmodifiable; + private final List vectorPartLengthes; + private final List vectorPartLengthesUnmodifiable; + private int length; + + public BitVectorSplittingAtomicHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public BitVectorSplittingAtomicHighLevelStateHandler(SubmodelComponent component, + BitVectorSplittingAtomicHighLevelStateHandlerParams params) + { + this.component = component; + this.vectorPartTargets = new ArrayList<>(); + this.vectorPartTargetsUnmodifiable = Collections.unmodifiableList(vectorPartTargets); + this.vectorPartLengthes = new ArrayList<>(); + this.vectorPartLengthesUnmodifiable = Collections.unmodifiableList(vectorPartLengthes); + if (params != null) + setVectorParts(params.vectorPartTargets, params.vectorPartLengthes); + } + + public void set(List targets, List lengthes) + { + setVectorParts(targets, lengthes); + } + + public void addVectorPart(String target, int length) + { + vectorPartTargets.add(target); + vectorPartLengthes.add(length); + this.length += length; + } + + public void clearVectorParts() + { + vectorPartTargets.clear(); + vectorPartLengthes.clear(); + length = 0; + } + + private void setVectorParts(List targets, List lengthes) + { + clearVectorParts(); + if (targets.size() != lengthes.size()) + throw new IllegalArgumentException("Targets list and lengthes list have different sizes"); + vectorPartTargets.addAll(targets); + vectorPartLengthes.addAll(lengthes); + length += lengthes.stream().mapToInt(Integer::intValue).sum(); + } + + public List getVectorPartTargets() + { + return vectorPartTargetsUnmodifiable; + } + + public List getVectorPartLenghtes() + { + return vectorPartLengthesUnmodifiable; + } + + @Override + public Object getHighLevelState() + { + BitVector result = BitVector.of(); + for (int partIndex = 0; partIndex < vectorPartTargets.size(); partIndex++) + { + Object subStateUncasted = component.getHighLevelState(vectorPartTargets.get(partIndex)); + BitVector vectorPart; + if (subStateUncasted instanceof Bit) + vectorPart = BitVector.of((Bit) subStateUncasted); + else + vectorPart = (BitVector) subStateUncasted; + if (vectorPart.length() != vectorPartLengthes.get(partIndex)) + throw new IllegalArgumentException( + "Incorrect vector part length: " + vectorPart.length() + "; expected " + vectorPartLengthes.get(partIndex)); + result = result.concat(vectorPart); + } + return result; + } + + @Override + public void setHighLevelState(Object newState) + { + BitVector newStateCasted = (BitVector) newState; + if (newStateCasted.length() != length) + throw new IllegalArgumentException("Incorrect vector length: " + newStateCasted.length() + "; expected " + length); + for (int partIndex = 0, bitIndex = 0; partIndex < vectorPartTargets.size(); partIndex++) + { + int vectorPartLength = vectorPartLengthes.get(partIndex); + BitVector vectorPart = newStateCasted.subVector(bitIndex, bitIndex + vectorPartLength); + component.setHighLevelState(vectorPartTargets.get(partIndex), vectorPart); + bitIndex += vectorPartLength; + } + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "bitVectorSplitting"; + } + + @Override + public BitVectorSplittingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + BitVectorSplittingAtomicHighLevelStateHandlerParams params = new BitVectorSplittingAtomicHighLevelStateHandlerParams(); + params.vectorPartTargets = new ArrayList<>(vectorPartTargets); + params.vectorPartLengthes = new ArrayList<>(vectorPartLengthes); + return params; + } + + public static class BitVectorSplittingAtomicHighLevelStateHandlerParams + { + public List vectorPartTargets; + public List vectorPartLengthes; + } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier + .setSnippetSupplier(BitVectorSplittingAtomicHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion.create( + BitVectorSplittingAtomicHighLevelStateHandlerParams.class, BitVectorSplittingAtomicHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java new file mode 100644 index 00000000..9d2645d7 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/DelegatingAtomicHighLevelStateHandler.java @@ -0,0 +1,120 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; + +public class DelegatingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler +{ + private final SubmodelComponent parentComponent; + private ModelComponent delegateTarget; + private String subStateID; + + public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public DelegatingAtomicHighLevelStateHandler(SubmodelComponent component, DelegatingAtomicHighLevelStateHandlerParams params) + { + this.parentComponent = component; + if (params != null) + { + // TODO document this + if (params.delegateTarget == null) + setDelegateTarget(parentComponent); + else + { + ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget); + if (delegateTarget == null) + throw new NullPointerException("No subcomponent with name " + params.delegateTarget); + setDelegateTarget(delegateTarget); + } + setSubStateID(params.subStateID); + } + parentComponent.submodel.addComponentRemovedListener(c -> + { + if (delegateTarget == c) + delegateTarget = null; + }); + } + + public void set(ModelComponent delegateTarget, String subStateID) + { + setDelegateTarget(delegateTarget); + setSubStateID(subStateID); + } + + public void setDelegateTarget(ModelComponent delegateTarget) + { + if (delegateTarget == null) + this.delegateTarget = parentComponent; + else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget) + throw new IllegalArgumentException( + "Can only set components belonging to the submodel of the parent component of this handler as the delegate target"); + this.delegateTarget = delegateTarget; + } + + public ModelComponent getDelegateTarget() + { + return delegateTarget; + } + + public void setSubStateID(String subStateID) + { + this.subStateID = subStateID; + } + + public String getSubStateID() + { + return subStateID; + } + + @Override + public Object getHighLevelState() + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + return delegateTarget.getHighLevelState(subStateID); + } + + @Override + public void setHighLevelState(Object newState) + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + delegateTarget.setHighLevelState(subStateID, newState); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "delegating"; + } + + @Override + public DelegatingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + DelegatingAtomicHighLevelStateHandlerParams params = new DelegatingAtomicHighLevelStateHandlerParams(); + params.delegateTarget = delegateTarget.getName(); + params.subStateID = subStateID; + return params; + } + + public static class DelegatingAtomicHighLevelStateHandlerParams + { + public String delegateTarget; + public String subStateID; + } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier( + DelegatingAtomicHighLevelStateHandler.class.getCanonicalName(), + SnippetDefinintion.create(DelegatingAtomicHighLevelStateHandlerParams.class, DelegatingAtomicHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java new file mode 100644 index 00000000..276f5415 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java @@ -0,0 +1,157 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; + +public class WireForcingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler +{ + private final SubmodelComponent component; + private int logicWidth; + private final List wiresToForce; + private final List wiresToForceUnmodifiable; + private final List wiresToForceInverted; + private final List wiresToForceInvertedUnmodifiable; + + public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component, WireForcingAtomicHighLevelStateHandlerParams params) + { + this.component = component; + this.wiresToForce = new ArrayList<>(); + this.wiresToForceUnmodifiable = Collections.unmodifiableList(wiresToForce); + this.wiresToForceInverted = new ArrayList<>(); + this.wiresToForceInvertedUnmodifiable = Collections.unmodifiableList(wiresToForceInverted); + if (params != null) + { + Map wiresByName = component.submodel.getWiresByName(); + setWiresToForce(params.wiresToForce.stream().map((Function) wiresByName::get).collect(Collectors.toList()), + params.wiresToForceInverted.stream().map((Function) wiresByName::get).collect(Collectors.toList())); + } + component.submodel.addWireRemovedListener(w -> + { + wiresToForce.removeIf(w::equals); + wiresToForceInverted.removeIf(w::equals); + }); + } + + public void set(List wiresToForce, List wiresToForceInverted) + { + setWiresToForce(wiresToForce, wiresToForceInverted); + } + + public void setWiresToForce(List wiresToForce, List wiresToForceInverted) + { + clearWiresToForce(); + for (ModelWire wire : wiresToForce) + addWireToForce(wire, false); + for (ModelWire wire : wiresToForceInverted) + addWireToForce(wire, true); + } + + public void addWireToForce(ModelWire wire, boolean inverted) + { + if (component.submodel.getWiresByName().get(wire.name) != wire) + throw new IllegalArgumentException("Can only force wires belonging to the parent component of this handler"); + if (logicWidth < 1) + logicWidth = wire.logicWidth; + else if (wire.logicWidth != logicWidth) + throw new IllegalArgumentException("Can only force wires of the same logic width"); + // this can add the same wire multiple times, but maybe there is a weird configuration where it is neccessary, due to race + // conditions, to force the same wire twice. + if (inverted) + wiresToForceInverted.add(wire); + else + wiresToForce.add(wire); + } + + public void clearWiresToForce() + { + wiresToForce.clear(); + wiresToForceInverted.clear(); + logicWidth = 0; + } + + public List getWiresToForce() + { + return wiresToForceUnmodifiable; + } + + public List getWiresToForceInverted() + { + return wiresToForceInvertedUnmodifiable; + } + + @Override + public Object getHighLevelState() + { + BitVector result = BitVector.of(Bit.ZERO, logicWidth); + for (ModelWire wire : wiresToForceInverted) + if (wire.hasCoreModelBinding()) + result = result.or(wire.getWireValues()); + result = result.not(); + for (ModelWire wire : wiresToForce) + if (wire.hasCoreModelBinding()) + result = result.and(wire.getWireValues()); + return result; + } + + @Override + public void setHighLevelState(Object newState) + { + BitVector vector; + if (newState instanceof Bit) + vector = BitVector.of((Bit) newState); + else + vector = (BitVector) newState; + for (ModelWire wire : wiresToForce) + if (wire.hasCoreModelBinding()) + wire.forceWireValues(vector); + vector = vector.not(); + for (ModelWire wire : wiresToForceInverted) + if (wire.hasCoreModelBinding()) + wire.forceWireValues(vector); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "wireForcing"; + } + + @Override + public WireForcingAtomicHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + WireForcingAtomicHighLevelStateHandlerParams params = new WireForcingAtomicHighLevelStateHandlerParams(); + params.wiresToForce = wiresToForce.stream().map(w -> w.name).collect(Collectors.toList()); + params.wiresToForceInverted = wiresToForceInverted.stream().map(w -> w.name).collect(Collectors.toList()); + return params; + } + + public static class WireForcingAtomicHighLevelStateHandlerParams + { + public List wiresToForce; + public List wiresToForceInverted; + } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.atomicHandlerSupplier.setSnippetSupplier( + WireForcingAtomicHighLevelStateHandler.class.getCanonicalName(), + SnippetDefinintion.create(WireForcingAtomicHighLevelStateHandlerParams.class, WireForcingAtomicHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json new file mode 100644 index 00000000..ef9d686f --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/standardSnippetIDMapping.json @@ -0,0 +1,11 @@ +mograsim version: 0.1.3 +{ + "standardSubcomponentHandlerSuppliers": { + "delegating": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent.DelegatingSubcomponentHighLevelStateHandler" + }, + "standardAtomicHandlerSuppliers": { + "delegating": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.DelegatingAtomicHighLevelStateHandler", + "wireForcing": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.WireForcingAtomicHighLevelStateHandler", + "bitVectorSplitting": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic.BitVectorSplittingAtomicHighLevelStateHandler" + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java new file mode 100644 index 00000000..12a98887 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/DelegatingSubcomponentHighLevelStateHandler.java @@ -0,0 +1,124 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent; + +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; + +public class DelegatingSubcomponentHighLevelStateHandler implements SubcomponentHighLevelStateHandler +{ + private final SubmodelComponent parentComponent; + private ModelComponent delegateTarget; + private String prefix; + + public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component) + { + this(component, null); + } + + public DelegatingSubcomponentHighLevelStateHandler(SubmodelComponent component, + DelegatingSubcomponentHighLevelStateHandlerParams params) + { + this.parentComponent = component; + if (params != null) + { + // TODO document this + if (params.delegateTarget == null) + setDelegateTarget(parentComponent); + else + { + ModelComponent delegateTarget = parentComponent.submodel.getComponentsByName().get(params.delegateTarget); + if (delegateTarget == null) + throw new NullPointerException("No subcomponent with name " + params.delegateTarget); + setDelegateTarget(delegateTarget); + } + setPrefix(params.prefix); + } + parentComponent.submodel.addComponentRemovedListener(c -> + { + if (delegateTarget == c) + delegateTarget = null; + }); + } + + public void set(ModelComponent delegateTarget, String prefix) + { + setDelegateTarget(delegateTarget); + setPrefix(prefix); + } + + public void setDelegateTarget(ModelComponent delegateTarget) + { + if (delegateTarget == null) + this.delegateTarget = parentComponent; + else if (parentComponent.submodel.getComponentsByName().get(delegateTarget.getName()) != delegateTarget) + throw new IllegalArgumentException( + "Can only set components belonging to the submodel of the parent component of this handler as the delegate target"); + this.delegateTarget = delegateTarget; + } + + public ModelComponent getDelegateTarget() + { + return delegateTarget; + } + + public void setPrefix(String prefix) + { + this.prefix = prefix; + } + + public String getPrefix() + { + return prefix; + } + + @Override + public Object getHighLevelState(String subStateID) + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + return delegateTarget.getHighLevelState(getDelegateTargetHighLevelStateID(subStateID)); + } + + @Override + public void setHighLevelState(String subStateID, Object newState) + { + if (delegateTarget == null) + throw new IllegalStateException("Delegating to a component that was destroyed"); + delegateTarget.setHighLevelState(getDelegateTargetHighLevelStateID(subStateID), newState); + } + + private String getDelegateTargetHighLevelStateID(String subStateID) + { + return prefix == null ? subStateID : prefix + '.' + subStateID; + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "delegating"; + } + + @Override + public DelegatingSubcomponentHighLevelStateHandlerParams getParamsForSerializing(IdentifyParams idParams) + { + DelegatingSubcomponentHighLevelStateHandlerParams params = new DelegatingSubcomponentHighLevelStateHandlerParams(); + params.delegateTarget = delegateTarget.getName(); + params.prefix = prefix; + return params; + } + + public static class DelegatingSubcomponentHighLevelStateHandlerParams + { + public String delegateTarget; + public String prefix; + } + + static + { + StandardHighLevelStateHandlerSnippetSuppliers.subcomponentHandlerSupplier + .setSnippetSupplier(DelegatingSubcomponentHighLevelStateHandler.class.getCanonicalName(), SnippetDefinintion + .create(DelegatingSubcomponentHighLevelStateHandlerParams.class, DelegatingSubcomponentHighLevelStateHandler::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java new file mode 100644 index 00000000..4c82bdcf --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/subcomponent/SubcomponentHighLevelStateHandler.java @@ -0,0 +1,31 @@ +package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.subcomponent; + +import com.google.gson.JsonElement; + +import net.mograsim.logic.model.serializing.JSONSerializable; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; + +public interface SubcomponentHighLevelStateHandler extends JSONSerializable +{ + /** + * Gets the current value of the given high level state of the subcomponent represented by this SubcomponentHighLevelStateHandler.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @author Daniel Kirschten + */ + public Object getHighLevelState(String subStateID); + + /** + * Sets the given high level state of the subcomponent represented by this SubcomponentHighLevelStateHandler to the given value.
+ * See {@link HighLevelStateHandler} for an explanation of high-level state IDs. + * + * @author Daniel Kirschten + */ + public void setHighLevelState(String subStateID, Object newState); + + public static class SubcomponentHighLevelStateHandlerParams + { + public String id; + public JsonElement params; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java new file mode 100644 index 00000000..90f25a41 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/outlinerenderers/DefaultOutlineRenderer.java @@ -0,0 +1,54 @@ +package net.mograsim.logic.model.snippets.outlinerenderers; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +public class DefaultOutlineRenderer implements Renderer +{ + private final ModelComponent component; + + public DefaultOutlineRenderer(ModelComponent component) + { + this(component, null); + } + + public DefaultOutlineRenderer(ModelComponent component, @SuppressWarnings("unused") Void params) + { + this.component = component; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.foreground"); + if (fg != null) + gc.setForeground(ColorManager.current().toColor(fg)); + gc.drawRectangle(component.getBounds()); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "default"; + } + + @Override + public Void getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + static + { + SubmodelComponentSnippetSuppliers.outlineRendererSupplier.setSnippetSupplier(DefaultOutlineRenderer.class.getCanonicalName(), + SnippetDefinintion.create(Void.class, DefaultOutlineRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json new file mode 100644 index 00000000..05007698 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/standardSnippetIDMapping.json @@ -0,0 +1,16 @@ +mograsim version: 0.1.3 +{ + "standardOutlineRendererSuppliers": { + "default": "class:net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer" + }, + "standardSymbolRendererSuppliers": { + "default": "class:net.mograsim.logic.model.snippets.symbolrenderers.DefaultSymbolRenderer", + "centeredText": "class:net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer", + "simpleRectangularLike": "class:net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer", + "pinNames": "class:net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer" + }, + "standardHighLevelStateHandlerSuppliers": { + "default": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.DefaultHighLevelStateHandler", + "standard": "class:net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandler" + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java new file mode 100644 index 00000000..9a6599a6 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/CenteredTextSymbolRenderer.java @@ -0,0 +1,75 @@ +package net.mograsim.logic.model.snippets.symbolrenderers; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +/** + * Renders a text ("text") with a given font height ("height") in the center of the component. + * + * @author Daniel Kirschten + */ +public class CenteredTextSymbolRenderer implements Renderer +{ + private final ModelComponent component; + private final String text; + private final double fontHeight; + + public CenteredTextSymbolRenderer(ModelComponent component, CenteredTextParams params) + { + this.component = component; + this.text = params.text; + this.fontHeight = params.fontHeight; + + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Font oldFont = gc.getFont(); + gc.setFont(new Font(oldFont.getName(), fontHeight, oldFont.getStyle())); + ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text"); + if (fg != null) + gc.setForeground(ColorManager.current().toColor(fg)); + Point idSize = gc.textExtent(text); + Rectangle bounds = component.getBounds(); + gc.drawText(text, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true); + gc.setFont(oldFont); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "centeredText"; + } + + @Override + public CenteredTextParams getParamsForSerializing(IdentifyParams idParams) + { + CenteredTextParams params = new CenteredTextParams(); + params.text = text; + params.fontHeight = fontHeight; + return params; + } + + public static class CenteredTextParams + { + public String text; + public double fontHeight; + } + + static + { + SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(CenteredTextSymbolRenderer.class.getCanonicalName(), + SnippetDefinintion.create(CenteredTextParams.class, CenteredTextSymbolRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java new file mode 100644 index 00000000..28ad8a86 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/DefaultSymbolRenderer.java @@ -0,0 +1,59 @@ +package net.mograsim.logic.model.snippets.symbolrenderers; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.ColorManager; +import net.mograsim.preferences.Preferences; + +public class DefaultSymbolRenderer implements Renderer +{ + private static final String id = ""; + + private final ModelComponent component; + + public DefaultSymbolRenderer(ModelComponent component) + { + this(component, null); + } + + public DefaultSymbolRenderer(ModelComponent component, @SuppressWarnings("unused") Void params) + { + this.component = component; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + ColorDefinition fg = Preferences.current().getColorDefinition("net.mograsim.logic.model.color.text"); + if (fg != null) + gc.setForeground(ColorManager.current().toColor(fg)); + Point idSize = gc.textExtent(id); + Rectangle bounds = component.getBounds(); + gc.drawText(id, bounds.x + (bounds.width - idSize.x) / 2, bounds.y + (bounds.height - idSize.y) / 2, true); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "default"; + } + + @Override + public Void getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + static + { + SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(DefaultSymbolRenderer.class.getCanonicalName(), + SnippetDefinintion.create(Void.class, DefaultSymbolRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java new file mode 100644 index 00000000..ede87105 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/PinNamesSymbolRenderer.java @@ -0,0 +1,116 @@ +package net.mograsim.logic.model.snippets.symbolrenderers; + +import java.util.HashMap; +import java.util.Map; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class PinNamesSymbolRenderer implements Renderer +{ + private final ModelComponent component; + private final Map pinPositions; + private final double pinLabelHeight; + private final double pinLabelMargin; + + public PinNamesSymbolRenderer(ModelComponent component, PinNamesParams params) + { + this.component = component; + this.pinPositions = new HashMap<>(); + this.pinLabelHeight = params.pinLabelHeight; + this.pinLabelMargin = params.pinLabelMargin; + if (params.pinNamePositions != null) + params.pinNamePositions.forEach(this::setPinPosition); + component.addPinRemovedListener(p -> setPinPosition(p, null)); + } + + public void setPinPosition(String pinName, Position position) + { + setPinPosition(component.getPin(pinName), position); + } + + public void setPinPosition(Pin pin, Position position) + { + if (position == null) + pinPositions.remove(pin); + else + pinPositions.put(pin, position); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + Font oldFont = gc.getFont(); + gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle())); + for (Pin pin : component.getPins().values()) + { + Position pos = pinPositions.get(pin); + if (pos == null) + pos = Position.RIGHT; + + Point topleft = pin.getPos(); + Point textExtent = gc.textExtent(pin.name); + + double x2 = topleft.x - textExtent.x - pinLabelMargin; + double y2 = topleft.y - textExtent.y - pinLabelMargin; + double x1 = topleft.x + pinLabelMargin; + double y1 = topleft.y + pinLabelMargin; + + double x = pos.posX * x1 + (1 - pos.posX) * x2; + double y = pos.posY * y1 + (1 - pos.posY) * y2; + + gc.drawText(pin.name, x, y, true); + } + gc.setFont(oldFont); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "pinNames"; + } + + @Override + public PinNamesParams getParamsForSerializing(IdentifyParams idParams) + { + PinNamesParams params = new PinNamesParams(); + params.pinNamePositions = new HashMap<>(); + pinPositions.forEach((pin, pos) -> params.pinNamePositions.put(pin.name, pos)); + return params; + } + + public static class PinNamesParams + { + public Map pinNamePositions; + public double pinLabelHeight; + public double pinLabelMargin; + + public static enum Position + { + TOP(.5, 0), TOP_LEFT(0, 0), LEFT(0, .5), BOTTOM_LEFT(0, 1), BOTTOM(.5, 1), BOTTOM_RIGHT(1, 1), RIGHT(1, .5), TOP_RIGHT(1, 0); + + private final double posX, posY; + + private Position(double posX, double posY) + { + this.posX = posX; + this.posY = posY; + } + } + } + + static + { + SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier(PinNamesSymbolRenderer.class.getCanonicalName(), + SnippetDefinintion.create(PinNamesParams.class, PinNamesSymbolRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java new file mode 100644 index 00000000..d57203ab --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/symbolrenderers/SimpleRectangularLikeSymbolRenderer.java @@ -0,0 +1,108 @@ +package net.mograsim.logic.model.snippets.symbolrenderers; + +import java.util.Map.Entry; + +import org.eclipse.swt.graphics.Color; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Font; +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.SnippetDefinintion; +import net.mograsim.logic.model.snippets.SubmodelComponentSnippetSuppliers; +import net.mograsim.preferences.Preferences; + +/** + * Renders a text ("centerText") with a given font height ("centerTextHeight") in the center of the component and + * draws a label for each pin with a given font height ("pinLabelHeight"). The labels of pins to the left of a given x + * coordinate ("horizontalComponentCenter") are drawn to the right of the respective pin; labels of pins to the right are drawn + * left. A margin ("pinLabelMargin") is applied for pin label drawing. + * + * @author Daniel Kirschten + */ +public class SimpleRectangularLikeSymbolRenderer implements Renderer +{ + private final ModelComponent component; + private final String centerText; + private final double centerTextHeight; + private final double horizontalComponentCenter; + private final double pinLabelHeight; + private final double pinLabelMargin; + + public SimpleRectangularLikeSymbolRenderer(ModelComponent component, SimpleRectangularLikeParams params) + { + this.component = component; + this.centerText = params.centerText; + this.centerTextHeight = params.centerTextHeight; + this.horizontalComponentCenter = params.horizontalComponentCenter; + this.pinLabelHeight = params.pinLabelHeight; + this.pinLabelMargin = params.pinLabelMargin; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + double posX = component.getPosX(); + double posY = component.getPosY(); + double width = component.getWidth(); + double height = component.getHeight(); + + Font oldFont = gc.getFont(); + gc.setFont(new Font(oldFont.getName(), centerTextHeight, oldFont.getStyle())); + Point textExtent = gc.textExtent(centerText); + Color textColor = Preferences.current().getColor("net.mograsim.logic.model.color.text"); + if (textColor != null) + gc.setForeground(textColor); + gc.drawText(centerText, posX + (width - textExtent.x) / 2, posY + (height - textExtent.y) / 2, true); + gc.setFont(new Font(oldFont.getName(), pinLabelHeight, oldFont.getStyle())); + for (Entry pinEntry : component.getPins().entrySet()) + { + String pinName = pinEntry.getKey(); + Pin pin = pinEntry.getValue(); + double pinX = pin.getRelX(); + double pinY = posY + pin.getRelY(); + textExtent = gc.textExtent(pinName); + gc.drawText(pinName, posX + pinX + (pinX > horizontalComponentCenter ? -textExtent.x - pinLabelMargin : pinLabelMargin), + pinY - textExtent.y / 2, true); + } + gc.setFont(oldFont); + } + + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return "simpleRectangularLike"; + } + + @Override + public SimpleRectangularLikeParams getParamsForSerializing(IdentifyParams idParams) + { + SimpleRectangularLikeParams params = new SimpleRectangularLikeParams(); + params.centerText = centerText; + params.centerTextHeight = centerTextHeight; + params.horizontalComponentCenter = horizontalComponentCenter; + params.pinLabelHeight = pinLabelHeight; + params.pinLabelMargin = pinLabelMargin; + return params; + } + + public static class SimpleRectangularLikeParams + { + public String centerText; + public double centerTextHeight; + public double horizontalComponentCenter; + public double pinLabelHeight; + public double pinLabelMargin; + } + + static + { + SubmodelComponentSnippetSuppliers.symbolRendererSupplier.setSnippetSupplier( + SimpleRectangularLikeSymbolRenderer.class.getCanonicalName(), + SnippetDefinintion.create(SimpleRectangularLikeParams.class, SimpleRectangularLikeSymbolRenderer::new)); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java new file mode 100644 index 00000000..20491ce5 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/JsonHandler.java @@ -0,0 +1,69 @@ +package net.mograsim.logic.model.util; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.stream.Collectors; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; + +public class JsonHandler +{ + public final static Gson parser = new GsonBuilder().setPrettyPrinting().create(); + + public static T readJson(String path, Class type) throws IOException + { + try (FileInputStream jsonStream = new FileInputStream(path)) + { + return readJson(jsonStream, type); + } + } + + /** + * @param input The Stream is closed after being read + */ + public static T readJson(InputStream input, Class type) throws IOException + { + try (InputStreamReader reader = new InputStreamReader(input, StandardCharsets.UTF_8); + BufferedReader bf = new BufferedReader(reader)) + { + return fromJson(bf.lines().collect(Collectors.joining("\n")), type); + } + } + + public static T fromJson(String src, Class type) + { + // throw away legacy version line + String rawJson = src.lines().dropWhile(s -> s.length() == 0 || s.charAt(0) != '{').collect(Collectors.joining()); + return parser.fromJson(rawJson, type); + } + + public static T fromJsonTree(JsonElement src, Class type) + { + return parser.fromJson(src, type); + } + + public static void writeJson(Object o, String path) throws IOException + { + try (FileWriter writer = new FileWriter(path)) + { + writer.write(toJson(o)); + } + } + + public static String toJson(Object o) + { + return parser.toJson(o); + } + + public static JsonElement toJsonTree(Object o) + { + return parser.toJsonTree(o); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java new file mode 100644 index 00000000..58a86ea0 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/ModellingTool.java @@ -0,0 +1,112 @@ +package net.mograsim.logic.model.util; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; + +public class ModellingTool +{ + private LogicModelModifiable model; + + ModellingTool(LogicModelModifiable model) + { + this.model = model; + } + + public ModelWire connect(ModelComponent a, ModelComponent b, String pinA, String pinB) + { + return connect(null, a, b, pinA, pinB); + } + + public ModelWire connect(ModelWireCrossPoint a, ModelComponent b, String pinB) + { + return connect(null, a, b, pinB); + } + + public ModelWire connect(Pin a, ModelComponent b, String pinB) + { + return connect(null, a, b, pinB); + } + + public ModelWire connect(ModelComponent a, ModelWireCrossPoint b, String pinA) + { + return connect(null, a, b, pinA); + } + + public ModelWire connect(ModelWireCrossPoint a, ModelWireCrossPoint b) + { + return connect(null, a, b); + } + + public ModelWire connect(Pin a, ModelWireCrossPoint b) + { + return connect(null, a, b); + } + + public ModelWire connect(ModelComponent a, Pin b, String pinA) + { + return connect(null, a, b, pinA); + } + + public ModelWire connect(ModelWireCrossPoint a, Pin b) + { + return connect(null, a, b); + } + + public ModelWire connect(Pin a, Pin b) + { + return connect(null, a, b); + } + + public ModelWire connect(String name, ModelComponent a, ModelComponent b, String pinA, String pinB) + { + return connect(name, a.getPin(pinA), b.getPin(pinB)); + } + + public ModelWire connect(String name, ModelWireCrossPoint a, ModelComponent b, String pinB) + { + return connect(name, a.getPin(), b.getPin(pinB)); + } + + public ModelWire connect(String name, Pin a, ModelComponent b, String pinB) + { + return connect(name, a, b.getPin(pinB)); + } + + public ModelWire connect(String name, ModelComponent a, ModelWireCrossPoint b, String pinA) + { + return connect(name, a.getPin(pinA), b.getPin()); + } + + public ModelWire connect(String name, ModelWireCrossPoint a, ModelWireCrossPoint b) + { + return connect(name, a.getPin(), b.getPin()); + } + + public ModelWire connect(String name, Pin a, ModelWireCrossPoint b) + { + return connect(name, a, b.getPin()); + } + + public ModelWire connect(String name, ModelComponent a, Pin b, String pinA) + { + return connect(name, a.getPin(pinA), b); + } + + public ModelWire connect(String name, ModelWireCrossPoint a, Pin b) + { + return connect(name, a.getPin(), b); + } + + public ModelWire connect(String name, Pin a, Pin b) + { + return new ModelWire(model, name, a, b); + } + + public static ModellingTool createFor(LogicModelModifiable model) + { + return new ModellingTool(model); + } +} diff --git a/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java new file mode 100644 index 00000000..00aeed89 --- /dev/null +++ b/plugins/net.mograsim.logic.model/src/net/mograsim/logic/model/util/Version.java @@ -0,0 +1,139 @@ +package net.mograsim.logic.model.util; + +import java.io.IOException; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +import net.mograsim.logic.model.util.Version.VersionJSONAdapter; + +@JsonAdapter(VersionJSONAdapter.class) +public final class Version implements Comparable +{ + public final int major, minor, patch; + + public Version(int major, int minor, int patch) + { + super(); + this.major = major; + this.minor = minor; + this.patch = patch; + } + + public int[] getVersionNumbers() + { + return new int[] { major, minor, patch }; + } + + @Override + public String toString() + { + return toSemverString(); + } + + public String toSemverString() + { + return major + "." + minor + "." + patch; + } + + public static Version parseSemver(String semver) + { + String[] semverParts = semver.split("\\."); + return new Version(Integer.parseInt(semverParts[0]), semverParts.length > 1 ? Integer.parseInt(semverParts[1]) : 0, + semverParts.length > 2 ? Integer.parseInt(semverParts[2]) : 0); + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + major; + result = prime * result + minor; + result = prime * result + patch; + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof Version)) + return false; + Version other = (Version) obj; + if (major != other.major) + return false; + if (minor != other.minor) + return false; + if (patch != other.patch) + return false; + return true; + } + + public boolean is(int major) + { + return major == this.major; + } + + public boolean is(int major, int minor) + { + return is(major) && this.minor == minor; + } + + public boolean is(int major, int minor, int patch) + { + return is(major, minor) && this.patch == patch; + } + + /** + * Compares this {@link Version} with the specified version.
+ * As required by {@link Comparable#compareTo(Object)}, returns a negative integer, zero, or a positive integer as this version is less + * (earlier) than, equal to, or greater (later) than the specified version. + *

+ * If the versions are equal ({@link #major}, {@link #minor}, {@link #patch} are the same), returns 0.
+ * If they differ in {@link #patch}, but neither {@link #major} or {@link #minor} , returns +-1.
+ * If they differ in {@link #minor}, but not {@link #major}, returns +-2.
+ * If they differ in {@link #major}, returns +-3. + */ + @Override + public int compareTo(Version o) + { + if (major != o.major) + { + if (major > o.major) + return 3; + return -3; + } + if (minor != o.minor) + { + if (minor > o.minor) + return 2; + return -2; + } + if (patch != o.patch) + { + if (patch > o.patch) + return 1; + return -1; + } + return 0; + } + + static class VersionJSONAdapter extends TypeAdapter + { + @Override + public void write(JsonWriter out, Version value) throws IOException + { + out.value(value.toSemverString()); + } + + @Override + public Version read(JsonReader in) throws IOException + { + return parseSemver(in.nextString()); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.machine/.classpath b/plugins/net.mograsim.machine/.classpath new file mode 100644 index 00000000..f0d0c735 --- /dev/null +++ b/plugins/net.mograsim.machine/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.machine/.project b/plugins/net.mograsim.machine/.project new file mode 100644 index 00000000..d179b4ce --- /dev/null +++ b/plugins/net.mograsim.machine/.project @@ -0,0 +1,28 @@ + + + net.mograsim.machine + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.machine/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.machine/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.machine/META-INF/MANIFEST.MF b/plugins/net.mograsim.machine/META-INF/MANIFEST.MF new file mode 100644 index 00000000..afbfc4c4 --- /dev/null +++ b/plugins/net.mograsim.machine/META-INF/MANIFEST.MF @@ -0,0 +1,22 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Mograsim Machine Definition +Bundle-SymbolicName: net.mograsim.machine;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Automatic-Module-Name: net.mograsim.machine +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: net.mograsim.logic.core;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.logic.model;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.preferences;visibility:=reexport, + org.eclipse.e4.core.di.annotations, + org.eclipse.core.runtime +Export-Package: net.mograsim.machine, + net.mograsim.machine.isa, + net.mograsim.machine.isa.types, + net.mograsim.machine.mi, + net.mograsim.machine.mi.components, + net.mograsim.machine.mi.parameters, + net.mograsim.machine.standard.memory +Bundle-Activator: net.mograsim.machine.MachineLoader +Bundle-ActivationPolicy: lazy diff --git a/plugins/net.mograsim.machine/build.properties b/plugins/net.mograsim.machine/build.properties new file mode 100644 index 00000000..3090e4c0 --- /dev/null +++ b/plugins/net.mograsim.machine/build.properties @@ -0,0 +1,5 @@ +source.. = src/ +bin.includes = META-INF/,\ + .,\ + plugin.xml,\ + schema/ diff --git a/plugins/net.mograsim.machine/plugin.xml b/plugins/net.mograsim.machine/plugin.xml new file mode 100644 index 00000000..8c71c6db --- /dev/null +++ b/plugins/net.mograsim.machine/plugin.xml @@ -0,0 +1,5 @@ + + + + > + diff --git a/plugins/net.mograsim.machine/schema/machine_definition.exsd b/plugins/net.mograsim.machine/schema/machine_definition.exsd new file mode 100644 index 00000000..e5e147bf --- /dev/null +++ b/plugins/net.mograsim.machine/schema/machine_definition.exsd @@ -0,0 +1,109 @@ + + + + + + + + + Mograsim extension for defining a machine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The machines id, this should be unique, but still readable + + + + + + + A Class that implements the Mograsim Machine Definition + + + + + + + + + + + + + + + 0.1.0 + + + + + + + + + [Enter extension point usage example here.] + + + + + + + + + [Enter API information here.] + + + + + + + + + [Enter information about supplied implementation of this extension point.] + + + + + diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java new file mode 100644 index 00000000..eab88b97 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/AddressingScema.java @@ -0,0 +1,6 @@ +package net.mograsim.machine; + +public interface AddressingScema +{ + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java new file mode 100644 index 00000000..80520140 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/GenericMemory.java @@ -0,0 +1,119 @@ +package net.mograsim.machine; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +public abstract class GenericMemory implements Memory +{ + private final long minimalAddress, maximalAddress; + private final MemoryDefinition definition; + private final int pageSize = 64; + private Set observers = new HashSet<>(); + + private HashMap pages; + + public GenericMemory(MemoryDefinition definition) + { + super(); + this.definition = definition; + this.minimalAddress = definition.getMinimalAddress(); + this.maximalAddress = definition.getMaximalAddress(); + this.pages = new HashMap<>(); + } + + private void inBoundsCheck(long address) + { + if (address < minimalAddress || address > maximalAddress) + throw new IndexOutOfBoundsException(String.format("Memory address out of bounds! Minimum: %d Maximum: %d Actual: %d", + minimalAddress, maximalAddress, address)); + } + + private long page(long address) + { + return address / pageSize; + } + + private int offset(long address) + { + return (int) (address % pageSize); + } + + @Override + public void setCell(long address, T data) + { + inBoundsCheck(address); + long page = page(address); + int offset = offset(address); + Page p = pages.get(Long.valueOf(page)); + if (p == null) + pages.put(page, p = new Page()); + p.setCell(offset, data); + notifyObservers(address); + } + + @Override + public T getCell(long address) + { + inBoundsCheck(address); + long page = page(address); + int offset = offset(address); + Page p = pages.get(Long.valueOf(page)); + if (p == null) + return null; + return p.getCell(offset); + } + + private class Page + { + private Object[] memory; + + public Page() + { + memory = new Object[pageSize]; + } + + public T getCell(int index) + { + @SuppressWarnings("unchecked") + T data = (T) memory[index]; + return data; + } + + public void setCell(int index, T data) + { + memory[index] = data; + } + + @Override + public String toString() + { + return Arrays.deepToString(memory); + } + } + + @Override + public void registerObserver(MemoryObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(MemoryObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers(long address) + { + observers.forEach(ob -> ob.update(address)); + } + + @Override + public MemoryDefinition getDefinition() + { + return definition; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/ISA.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/ISA.java new file mode 100644 index 00000000..eaec0d94 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/ISA.java @@ -0,0 +1,5 @@ +package net.mograsim.machine; + +public interface ISA +{ +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java new file mode 100644 index 00000000..72e66855 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/ISASchema.java @@ -0,0 +1,12 @@ +package net.mograsim.machine; + +import java.util.Set; + +import net.mograsim.machine.isa.AsmOperand; + +public interface ISASchema +{ + Set getSupportedOperands(); + + AddressingScema getAddressingSchema(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/Machine.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/Machine.java new file mode 100644 index 00000000..6ff074d0 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/Machine.java @@ -0,0 +1,29 @@ +package net.mograsim.machine; + +import net.mograsim.logic.core.components.CoreClock; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.MicroInstructionMemory; +import net.mograsim.logic.model.model.LogicModel; + +public interface Machine +{ + MachineDefinition getDefinition(); + + void reset(); + + LogicModel getModel(); + + CoreClock getClock(); + + BitVector getRegister(Register r); + + void setRegister(Register r, BitVector value); + + Timeline getTimeline(); + + MainMemory getMainMemory(); + + MicroInstructionMemory getMicroInstructionMemory(); + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java new file mode 100644 index 00000000..02cf3757 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java @@ -0,0 +1,59 @@ +package net.mograsim.machine; + +import java.util.Set; + +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public interface MachineDefinition +{ + + /** + * Creates a new instance of the machine + * + * @return a new object of an {@link Machine} implementation. + * @author Christian Femers + */ + Machine createNew(); + + /** + * Returns the schema that all possible ISAs (Instruction Set Architecture) must be based on. + * + * @return an {@link ISASchema} implementation fitting the machine + * @author Christian Femers + */ + ISASchema getISASchema(); + + /** + * Returns a set of all {@link Register}s present in the machine. + * + * @return all registers present in the machine. + * @author Christian Femers + */ + Set getRegisters(); + + /** + * The number of bits used by the machine to address main memory. Note that this should be the number of bits used in the CPU, not a + * possibly different one used by the bus system. + * + * @return the number of bits used by the CPU + * @see MainMemoryDefinition#getMemoryAddressBits() + * @author Christian Femers + */ + int getAddressBits(); + + /** + * Returns the definition of the machines main memory. + * + * @return the {@link MainMemoryDefinition} that defines the main memory. + * @author Christian Femers + */ + MainMemoryDefinition getMainMemoryDefinition(); + + /** + * Returns the definition of the machines instruction memory. + * + * @return the {@link InstructionMemoryDefinition} that defines the instruction memory. + */ + MicroInstructionMemoryDefinition getMicroInstructionMemoryDefinition(); + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineException.java new file mode 100644 index 00000000..ee9026a7 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineException.java @@ -0,0 +1,25 @@ +package net.mograsim.machine; + +public class MachineException extends RuntimeException +{ + + /** + * + */ + private static final long serialVersionUID = 6224307211078376836L; + + public MachineException() + { + super(); + } + + public MachineException(String message) + { + super(message); + } + + public MachineException(Throwable cause) + { + super(cause); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java new file mode 100644 index 00000000..9a88575b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineLoader.java @@ -0,0 +1,36 @@ +package net.mograsim.machine; + +import java.util.concurrent.atomic.AtomicBoolean; + +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; + +import net.mograsim.logic.model.serializing.ClassLoaderBasedResourceLoader; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class MachineLoader implements BundleActivator +{ + private static AtomicBoolean activated = new AtomicBoolean(false); + + @Override + public void start(BundleContext context) throws Exception + { + setup(); + } + + @Override + public void stop(BundleContext context) throws Exception + { + // nothing + } + + public static void setup() + { + if (activated.getAndSet(true)) + return; + ClassLoaderBasedResourceLoader resourceLoader = ClassLoaderBasedResourceLoader.create(MachineLoader.class.getClassLoader()); + IndirectModelComponentCreator.registerResourceLoader(resourceLoader, "MachineLoader"); + IndirectModelComponentCreator.loadStandardComponentIDs(MachineLoader.class.getResourceAsStream("standardComponentIDMapping.json")); +// System.out.println("SETUP DONE"); // TODO: Debug + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java new file mode 100644 index 00000000..a2706462 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineRegistry.java @@ -0,0 +1,52 @@ +package net.mograsim.machine; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.Platform; + +public class MachineRegistry +{ + private static final String MACHINE_EXT_ID = "net.mograsim.machine.machine_definition"; + + private static Map installedMachines = new HashMap<>(); + + public static void reload() + { + IExtensionRegistry registry = Platform.getExtensionRegistry(); + System.out.println(Arrays.toString(registry.getExtensionPoints("net.mograsim.machine"))); + IConfigurationElement[] config = registry.getConfigurationElementsFor(MACHINE_EXT_ID); + try + { + for (IConfigurationElement e : config) + { + System.out.println(e.getNamespaceIdentifier()); + System.out.println(Arrays.toString(e.getAttributeNames())); + final Object o = e.createExecutableExtension("class"); + final String id = e.getAttribute("unique_id"); + if (o instanceof MachineDefinition) + { + System.out.println("Found " + id); + installedMachines.put(id, (MachineDefinition) o); + } else + { + System.err.println("Invalid machine definition: " + o + "(id=" + id + ""); + } + } + } + catch (CoreException ex) + { + System.out.println(ex.getMessage()); + } + } + + public static Map getinstalledMachines() + { + return Collections.unmodifiableMap(installedMachines); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java new file mode 100644 index 00000000..94140b73 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemory.java @@ -0,0 +1,14 @@ +package net.mograsim.machine; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.BitVector; + +public interface MainMemory extends Memory +{ + public BigInteger getCellAsBigInteger(long address); + + public void setCellAsBigInteger(long address, BigInteger word); + + public MainMemoryDefinition getDefinition(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java new file mode 100644 index 00000000..72153d6d --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MainMemoryDefinition.java @@ -0,0 +1,24 @@ +package net.mograsim.machine; + +/** + * This interface provides a means to get information about the machines memory architecture. It is not bound to any actual memory. + * + * @author Christian Femers + * + */ +public interface MainMemoryDefinition extends MemoryDefinition +{ + /** + * The width in bits of an addressable memory cell/unit. This is often 8 (= one byte). The actual cells/lines of the memory may be a lot + * larger. + * + * @return the addressable unit width in bits + * @author Christian Femers + */ + int getCellWidth(); + + public static MainMemoryDefinition create(int memoryAddressBits, int cellWidth, long minimalAddress, long maximalAddress) + { + return new StandardMainMemoryDefinition(memoryAddressBits, cellWidth, minimalAddress, maximalAddress); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/Memory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/Memory.java new file mode 100644 index 00000000..0ff9bb41 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/Memory.java @@ -0,0 +1,36 @@ +package net.mograsim.machine; + +public interface Memory +{ + /** + * @param address The address of the desired data. Must be non-negative + * @return The data at the requested address + * + * @throws IndexOutOfBoundsException + */ + public T getCell(long address); + + /** + * Sets the data at the supplied address + * + * @throws IndexOutOfBoundsException + */ + public void setCell(long address, T data); + + public default long size() + { + MemoryDefinition def = getDefinition(); + return Long.max(0, def.getMaximalAddress() - def.getMinimalAddress() + 1); + } + + /** + * Registers an observer to be notified when a memory cell is modified + */ + public void registerObserver(MemoryObserver ob); + + public void deregisterObserver(MemoryObserver ob); + + public void notifyObservers(long address); + + public MemoryDefinition getDefinition(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java new file mode 100644 index 00000000..39d12c44 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryDefinition.java @@ -0,0 +1,45 @@ +package net.mograsim.machine; + +public interface MemoryDefinition +{ + + /** + * The number of bits that the main memory uses to address cells. Note that this does not need to equal + * {@link MachineDefinition#getAddressBits()}. + * + * @return the number of bits used to address a memory cell + * @author Christian Femers + */ + int getMemoryAddressBits(); + + /** + * The minimal address possible to address/use. This is usually 0. + * + * @return the minimal possible address. + * @author Christian Femers + */ + long getMinimalAddress(); + + /** + * The maximal address possible to address/use. + * + * @return the maximal possible address as unsigned long + * @author Christian Femers + */ + long getMaximalAddress(); + + /** + * The size of the MainMemory as the amount of addressable memory cells. + * + * @return the amount of addressable memory cells + */ + default long size() + { + return getMaximalAddress() - getMinimalAddress() + 1; + } + + public static MemoryDefinition create(int memoryAddressBits, long minimalAddress, long maximalAddress) + { + return new StandardMemoryDefinition(memoryAddressBits, minimalAddress, maximalAddress); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java new file mode 100644 index 00000000..1d7fc4dd --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MemoryObserver.java @@ -0,0 +1,6 @@ +package net.mograsim.machine; + +public interface MemoryObserver +{ + public void update(long address); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java new file mode 100644 index 00000000..d0459dc1 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/ModelMemory.java @@ -0,0 +1,53 @@ +package net.mograsim.machine; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.snippets.Renderer; +import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer; +import net.mograsim.logic.model.snippets.symbolrenderers.SimpleRectangularLikeSymbolRenderer.SimpleRectangularLikeParams; + +public abstract class ModelMemory extends ModelComponent +{ + private Renderer symbolRenderer; + private Renderer outlineRenderer; + private M machine; + + protected ModelMemory(LogicModelModifiable model, int width, int height, String name, String centerText, boolean callInit) + { + super(model, name, false); + + SimpleRectangularLikeParams rendererParams = new SimpleRectangularLikeParams(); + rendererParams.centerText = centerText; + rendererParams.centerTextHeight = 5; + rendererParams.horizontalComponentCenter = width / 2; + rendererParams.pinLabelHeight = 2.5; + rendererParams.pinLabelMargin = 0.5; + this.symbolRenderer = new SimpleRectangularLikeSymbolRenderer(this, rendererParams); + this.outlineRenderer = new DefaultOutlineRenderer(this); + + setSize(width, height); + + if (callInit) + init(); + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + symbolRenderer.render(gc, visibleRegion); + outlineRenderer.render(gc, visibleRegion); + } + + public void setMachine(M machine) + { + this.machine = machine; + } + + public M getMachine() + { + return machine; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java new file mode 100644 index 00000000..4bcb7f25 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java @@ -0,0 +1,53 @@ +package net.mograsim.machine; + +import java.util.Set; + +/** + * A register in a machine is defined by this interface. A hardware register may have {@link Register#names() named sub-registers}. + * + * + * @author Christian Femers + * + */ +public interface Register +{ + /** + * The unique identifier of the register. This does not have to be the display name or name in the assembly language. + * + * @return the registers id as case sensitive String + * @author Christian Femers + */ + String id(); + + /** + * The name(s) of this register. This is the displayed name and the name used in the assembly language. All names of all registers must + * be case-insensitive unique. A register can have multiple names if these names address different regions (but still have a common + * hardware structure), e.g. EAX, AX, AL, AH. + * + * @return all the names of regions addressing this register, must be case-insensitive. + * @author Christian Femers + */ + Set names(); + + /** + * Returns the complete width in bits of the underlying hardware structure the register and possible sub-registers are part of. + * + * @param name the name of the register + * @return the width of the (sub-)register in bits. + * + * @see #names() + * @author Christian Femers + */ + int getWidth(); + + /** + * Returns the width in bits of the register or a named part of it. + * + * @param name the name of the register + * @return the width of the (sub-)register in bits. + * + * @see #names() + * @author Christian Femers + */ + int getWidth(String name); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java new file mode 100644 index 00000000..22be93ee --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMainMemoryDefinition.java @@ -0,0 +1,18 @@ +package net.mograsim.machine; + +class StandardMainMemoryDefinition extends StandardMemoryDefinition implements MainMemoryDefinition +{ + private final int cellWidth; + + StandardMainMemoryDefinition(int memoryAddressBits, int cellWidth, long minimalAddress, long maximalAddress) + { + super(memoryAddressBits, minimalAddress, maximalAddress); + this.cellWidth = cellWidth; + } + + @Override + public int getCellWidth() + { + return cellWidth; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java new file mode 100644 index 00000000..f0d755f5 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/StandardMemoryDefinition.java @@ -0,0 +1,43 @@ +package net.mograsim.machine; + +class StandardMemoryDefinition implements MemoryDefinition +{ + private final int memoryAddressBits; + private final long minimalAddress, maximalAddress; + + StandardMemoryDefinition(int memoryAddressBits, long minimalAddress, long maximalAddress) + { + super(); + this.memoryAddressBits = memoryAddressBits; + this.minimalAddress = minimalAddress; + this.maximalAddress = maximalAddress; + } + + public StandardMemoryDefinition(MainMemoryDefinition definition) + { + this(definition.getMemoryAddressBits(), definition.getMinimalAddress(), definition.getMaximalAddress()); + } + + @Override + public int getMemoryAddressBits() + { + return memoryAddressBits; + } + + @Override + public long getMinimalAddress() + { + return minimalAddress; + } + + @Override + public long getMaximalAddress() + { + return maximalAddress; + } + + public static MemoryDefinition create(int memoryAddressBits, long minimalAddress, long maximalAddress) + { + return new StandardMemoryDefinition(memoryAddressBits, minimalAddress, maximalAddress); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java new file mode 100644 index 00000000..07b56c29 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmElement.java @@ -0,0 +1,6 @@ +package net.mograsim.machine.isa; + +public interface AsmElement +{ + // only marker at the moment +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java new file mode 100644 index 00000000..7a1a6ebf --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmFloatOperand.java @@ -0,0 +1,98 @@ +package net.mograsim.machine.isa; + +import java.math.BigDecimal; +import java.math.BigInteger; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.machine.isa.types.AsmNumberFormatException; + +public class AsmFloatOperand implements AsmOperand +{ + private final int size; + private final int mantissa; + private final int exponent; + + public AsmFloatOperand(int size) + { + this.size = size; + switch (size) + { + case 8: + exponent = 4; + mantissa = 3; + break; + case 16: + exponent = 5; + mantissa = 10; + break; + case 32: + exponent = 8; + mantissa = 23; + break; + case 64: + exponent = 11; + mantissa = 52; + break; + case 128: + exponent = 15; + mantissa = 112; + break; + default: + if (size > 128 && size % 32 == 0) + { + exponent = (int) Math.round(Math.log(size) / Math.log(2)) - 13; + mantissa = size - exponent - 1; + } else + { + throw new IllegalArgumentException("Illegal floating point size: " + size); + } + } + } + + public AsmFloatOperand(int exponent, int mantissa) + { + if (exponent < 1 || mantissa < 1) + throw new IllegalArgumentException("illegal floating point specification: e=" + exponent + ", m=" + mantissa); + this.exponent = exponent; + this.mantissa = mantissa; + this.size = exponent + mantissa + 1; + } + + @Override + public int getSize() + { + return size; + } + + @Override + public BitVector parse(String s) throws AsmNumberFormatException + { + String cleaned = s.replace("_", "").toLowerCase(); + int len = cleaned.length(); + BigInteger res; + try + { + return bigDecToBitVector(new BigDecimal(cleaned)); + } + catch (NumberFormatException e) + { + throw new AsmNumberFormatException(e, "Error parsing %s: no valid float format", s); + } + } + + BitVector bigDecToBitVector(BigDecimal bi) throws AsmNumberFormatException + { + BigInteger raw = bi.unscaledValue(); + int mantLen = raw.bitLength(); +// bi. + int bitLength = raw.bitLength() - (bi.signum() - 1) / 2; + if (bitLength > size) + throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size); + BitVectorMutator bvm = BitVectorMutator.ofLength(size); + for (int i = 0; i < size; i++) + bvm.setLSBit(i, Bit.of(raw.testBit(i))); + return bvm.toBitVector(); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java new file mode 100644 index 00000000..29bbf73b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmInstruction.java @@ -0,0 +1,39 @@ +package net.mograsim.machine.isa; + +import java.util.Objects; + +public final class AsmInstruction implements AsmElement +{ + private final AsmOperation operation; + private final AsmOperands operands; + + public AsmInstruction(AsmOperation operation, AsmOperands operands) + { + this.operation = Objects.requireNonNull(operation); + this.operands = Objects.requireNonNull(operands); + } + + @Override + public int hashCode() + { + return Objects.hash(operands, operation); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof AsmInstruction)) + return false; + AsmInstruction other = (AsmInstruction) obj; + return Objects.equals(operands, other.operands) && Objects.equals(operation, other.operation); + } + + @Override + public String toString() + { + return String.format("%s %s", operation, operands).trim(); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java new file mode 100644 index 00000000..d3ac80f9 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmIntegerOperand.java @@ -0,0 +1,95 @@ +package net.mograsim.machine.isa; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; +import net.mograsim.machine.isa.types.AsmNumberFormatException; + +public class AsmIntegerOperand implements AsmOperand +{ + private final int size; + + public AsmIntegerOperand(int size) + { + this.size = size; + } + + @Override + public int getSize() + { + return size; + } + + @Override + public BitVector parse(String s) throws AsmNumberFormatException + { + String cleaned = s.replace("_", "").toLowerCase(); + int len = cleaned.length(); + BigInteger res; + try + { + if (cleaned.startsWith("0x")) + res = new BigInteger(cleaned.substring(2), 16); + else if (cleaned.endsWith("h")) + res = new BigInteger(cleaned.substring(0, len - 1), 16); + else if (cleaned.startsWith("0b")) + res = new BigInteger(cleaned.substring(2), 2); + else if (cleaned.endsWith("b")) + res = new BigInteger(cleaned.substring(2), 2); + else if (cleaned.endsWith("q")) + res = new BigInteger(cleaned.substring(0, len - 1), 8); + else + res = new BigInteger(cleaned); + } + catch (NumberFormatException e) + { + throw new AsmNumberFormatException(e, "Error parsing %s: no valid integer format", s); + } + return bigIntToBitVector(res); + } + + BitVector bigIntToBitVector(BigInteger bi) throws AsmNumberFormatException + { + int bitLength = bi.bitLength() - (bi.signum() - 1) / 2; + if (bitLength > size) + throw new AsmNumberFormatException("Error parsing %s: bit count %d exceeds size %d", bi, bitLength, size); + BitVectorMutator bvm = BitVectorMutator.ofLength(size); + for (int i = 0; i < size; i++) + bvm.setLSBit(i, Bit.of(bi.testBit(i))); + return bvm.toBitVector(); + } + + public static void main(String[] args) throws AsmNumberFormatException + { + AsmIntegerOperand aio = new AsmIntegerOperand(4); + System.out.println(aio.parse("0")); + System.out.println(aio.parse("1")); + System.out.println(aio.parse("2")); + System.out.println(aio.parse("3")); + System.out.println(aio.parse("4")); + System.out.println(aio.parse("5")); + System.out.println(aio.parse("6")); + System.out.println(aio.parse("7")); + System.out.println(aio.parse("8")); + System.out.println(aio.parse("9")); + System.out.println(aio.parse("10")); + System.out.println(aio.parse("11")); + System.out.println(aio.parse("12")); + System.out.println(aio.parse("13")); + System.out.println(aio.parse("14")); + System.out.println(aio.parse("15")); +// System.out.println(aio.parse("16")); + System.out.println(aio.parse("-0")); + System.out.println(aio.parse("-1")); + System.out.println(aio.parse("-2")); + System.out.println(aio.parse("-3")); + System.out.println(aio.parse("-4")); + System.out.println(aio.parse("-5")); + System.out.println(aio.parse("-6")); + System.out.println(aio.parse("-7")); + System.out.println(aio.parse("-8")); +// System.out.println(aio.parse("-9")); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java new file mode 100644 index 00000000..ddb56582 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmLabel.java @@ -0,0 +1,49 @@ +package net.mograsim.machine.isa; + +import java.util.Objects; + +public final class AsmLabel implements AsmElement +{ + private final String name; + private AsmInstruction inst; + + public AsmLabel(String name) + { + this.name = Objects.requireNonNull(name); + } + + public String getName() + { + return name; + } + + public void setInst(AsmInstruction inst) + { + if (inst != null) + throw new IllegalStateException("Instrution already set for " + name); + this.inst = inst; + } + + @Override + public String toString() + { + return name + ":"; + } + + @Override + public int hashCode() + { + return Objects.hash(inst, name); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof AsmLabel)) + return false; + AsmLabel other = (AsmLabel) obj; + return Objects.equals(inst, other.inst) && Objects.equals(name, other.name); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java new file mode 100644 index 00000000..ad641d6b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperand.java @@ -0,0 +1,11 @@ +package net.mograsim.machine.isa; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.isa.types.AsmException; + +public interface AsmOperand +{ + int getSize(); + + BitVector parse(String s) throws AsmException; +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java new file mode 100644 index 00000000..f286c315 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperands.java @@ -0,0 +1,43 @@ +package net.mograsim.machine.isa; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public final class AsmOperands +{ + private final List operands; + + public AsmOperands(List operands) + { + this.operands = List.copyOf(Objects.requireNonNull(operands)); + } + + public List getOperands() + { + return operands; + } + + @Override + public int hashCode() + { + return operands.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof AsmOperands)) + return false; + AsmOperands other = (AsmOperands) obj; + return operands.equals(other.operands); + } + + @Override + public String toString() + { + return operands.stream().map(AsmOperand::toString).collect(Collectors.joining(", ")); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java new file mode 100644 index 00000000..abafc45f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/AsmOperation.java @@ -0,0 +1,41 @@ +package net.mograsim.machine.isa; + +import java.util.Objects; + +public final class AsmOperation +{ + private final String mnemonic; + + public AsmOperation(String mnemonic) + { + this.mnemonic = Objects.requireNonNull(mnemonic.toLowerCase()); + } + + public String getMnemonic() + { + return mnemonic; + } + + @Override + public String toString() + { + return getMnemonic(); + } + + @Override + public int hashCode() + { + return mnemonic.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (!(obj instanceof AsmOperation)) + return false; + AsmOperation other = (AsmOperation) obj; + return mnemonic.equals(other.mnemonic); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java new file mode 100644 index 00000000..8de66267 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/NumericOperand.java @@ -0,0 +1,6 @@ +package net.mograsim.machine.isa; + +public class NumericOperand +{ + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java new file mode 100644 index 00000000..8a9d2d02 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmException.java @@ -0,0 +1,32 @@ +package net.mograsim.machine.isa.types; + +public class AsmException extends Exception +{ + private static final long serialVersionUID = 1L; + + public AsmException() + { + super(); + } + + public AsmException(Throwable cause, String message, boolean enableSuppression, boolean writableStackTrace) + { + super(message, cause, enableSuppression, writableStackTrace); + } + + public AsmException(Throwable cause, String formatString, Object... formatArgs) + { + super(String.format(formatString, formatArgs), cause); + } + + public AsmException(String formatString, Object... formatArgs) + { + super(String.format(formatString, formatArgs)); + } + + public AsmException(Throwable cause) + { + super(cause); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java new file mode 100644 index 00000000..4fb4af6d --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/isa/types/AsmNumberFormatException.java @@ -0,0 +1,16 @@ +package net.mograsim.machine.isa.types; + +public class AsmNumberFormatException extends AsmException +{ + private static final long serialVersionUID = 1L; + + public AsmNumberFormatException(Exception cause, String message, Object... formatArgs) + { + super(cause, message, formatArgs); + } + + public AsmNumberFormatException(String message, Object... formatArgs) + { + super(message, formatArgs); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java new file mode 100644 index 00000000..d45c2772 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstruction.java @@ -0,0 +1,32 @@ +package net.mograsim.machine.mi; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; +import net.mograsim.machine.mi.parameters.Mnemonic; + +public interface MicroInstruction +{ + + public MicroInstructionParameter getParameter(int index); + + public void setParameter(int index, MicroInstructionParameter param); + + /** + * @return The amount of {@link Mnemonic}s, the instruction is composed of + */ + public int getSize(); + + public static MicroInstruction create(Runnable updateCallback, MicroInstructionParameter... parameters) + { + return new StandardMicroInstruction(updateCallback, parameters); + } + + default BitVector toBitVector() + { + BitVector vector = BitVector.of(); + int size = getSize(); + for (int i = 0; i < size; i++) + vector = vector.concat(getParameter(i).getValue()); + return vector; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java new file mode 100644 index 00000000..6625fa66 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionDefinition.java @@ -0,0 +1,52 @@ +package net.mograsim.machine.mi; + +import java.util.Arrays; +import java.util.Optional; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; +import net.mograsim.machine.mi.parameters.ParameterClassification; + +public interface MicroInstructionDefinition +{ + /** + * @return The {@link ParameterClassification}s of which a MicroInstruction is composed. + */ + public ParameterClassification[] getParameterClassifications(); + + /** + * @throws IndexOutOfBoundsException + */ + public ParameterClassification getParameterClassification(int index); + + /** + * @return The amount of {@link MicroInstructionParameter}s in a {@link MicroInstruction} that follows this definition. + */ + public default int size() + { + return getParameterClassifications().length; + } + + /** + * @return The amount of {@link Bit}s in a {@link MicroInstruction} that follows this definition. + */ + public default int sizeInBits() + { + return Arrays.stream(getParameterClassifications()).mapToInt(e -> e.getExpectedBits()).reduce(0, (a, b) -> a + b); + } + + public default MicroInstruction createDefaultInstruction(Runnable updateCallback) + { + int size = size(); + MicroInstructionParameter[] params = new MicroInstructionParameter[size]; + ParameterClassification[] classes = getParameterClassifications(); + for (int i = 0; i < size; i++) + { + ParameterClassification classification = classes[i]; + params[i] = classification.getDefault(); + } + return new StandardMicroInstruction(updateCallback, params); + } + + public Optional getParameterDescription(int index); +} \ No newline at end of file diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java new file mode 100644 index 00000000..5d4fac6b --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemory.java @@ -0,0 +1,8 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.Memory; + +public interface MicroInstructionMemory extends Memory +{ + public MicroInstructionMemoryDefinition getDefinition(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java new file mode 100644 index 00000000..409d2816 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryDefinition.java @@ -0,0 +1,8 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.MemoryDefinition; + +public interface MicroInstructionMemoryDefinition extends MemoryDefinition +{ + MicroInstructionDefinition getMicroInstructionDefinition(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java new file mode 100644 index 00000000..66aa229c --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParseException.java @@ -0,0 +1,28 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.MachineException; + +public class MicroInstructionMemoryParseException extends MachineException +{ + + /** + * + */ + private static final long serialVersionUID = 6820101808901789906L; + + public MicroInstructionMemoryParseException() + { + super(); + } + + public MicroInstructionMemoryParseException(String message) + { + super(message); + } + + public MicroInstructionMemoryParseException(Throwable cause) + { + super(cause); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java new file mode 100644 index 00000000..d049e377 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/MicroInstructionMemoryParser.java @@ -0,0 +1,106 @@ +package net.mograsim.machine.mi; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + +import net.mograsim.machine.MemoryDefinition; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; +import net.mograsim.machine.mi.parameters.ParameterClassification; + +public class MicroInstructionMemoryParser +{ + public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException + { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath)))) + { + parseMemory(memory, reader); + } + } + + public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input) + { + MicroInstructionMemoryDefinition def = memory.getDefinition(); + MicroInstructionDefinition miDef = def.getMicroInstructionDefinition(); + + long minAddr = def.getMinimalAddress(); + long maxAddr = def.getMaximalAddress(); + + String line; + long i = minAddr; + try + { + for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++) + { + long iFinal = i; + memory.setCell(i, parse(() -> memory.notifyObservers(iFinal), miDef, line)); + } + } + catch (IOException e) + { + e.printStackTrace(); + } + + for (; i <= maxAddr; i++) + { + long iFinal = i; + memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal))); + } + } + + public static MicroInstruction parse(Runnable updateCallback, MicroInstructionDefinition definition, String toParse) + { + int size = definition.size(); + String[] strings = toParse.split(","); + if (size != strings.length) + throw new MicroInstructionMemoryParseException("String does not match definition! The number of parameters does not match."); + MicroInstructionParameter[] params = new MicroInstructionParameter[size]; + ParameterClassification[] classes = definition.getParameterClassifications(); + try + { + for (int i = 0; i < size; i++) + { + params[i] = classes[i].parse(strings[i]); + } + return new StandardMicroInstruction(updateCallback, params); + } + catch (Exception e) + { + throw new MicroInstructionMemoryParseException(e.getCause()); + } + } + + public static void write(MicroInstructionMemory memory, String outputPath) throws IOException + { + try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath))) + { + write(memory, writer); + } + } + + public static void write(MicroInstructionMemory memory, OutputStreamWriter output) throws IOException + { + MemoryDefinition def = memory.getDefinition(); + long min = def.getMinimalAddress(), max = def.getMaximalAddress() + 1; + for (long i = min; i < max; i++) + { + output.write(toCSV(memory.getCell(i)) + "\n"); + } + } + + private static String toCSV(MicroInstruction inst) + { + int max = inst.getSize() - 1; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < max; i++) + { + sb.append(inst.getParameter(i).toString()); + sb.append(","); + } + sb.append(inst.getParameter(max).toString()); + return sb.toString(); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java new file mode 100644 index 00000000..c565432f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstruction.java @@ -0,0 +1,41 @@ +package net.mograsim.machine.mi; + +import net.mograsim.machine.mi.parameters.MicroInstructionParameter; + +class StandardMicroInstruction implements MicroInstruction +{ + private final Runnable updateCallback; + private MicroInstructionParameter[] parameters; + + StandardMicroInstruction(Runnable updateCallback, MicroInstructionParameter... parameters) + { + this.updateCallback = updateCallback; + this.parameters = parameters; + } + + /** + * @throws IndexOutOfBoundsException + */ + @Override + public MicroInstructionParameter getParameter(int index) + { + return parameters[index]; + } + + @Override + public int getSize() + { + return parameters.length; + } + + /** + * @throws IndexOutOfBoundsException + */ + @Override + public void setParameter(int index, MicroInstructionParameter param) + { + parameters[index] = param; + updateCallback.run(); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java new file mode 100644 index 00000000..519c9b3a --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/StandardMicroInstructionMemory.java @@ -0,0 +1,69 @@ +package net.mograsim.machine.mi; + +import java.util.HashSet; + +import net.mograsim.machine.MemoryObserver; +import net.mograsim.machine.standard.memory.MemoryException; + +public class StandardMicroInstructionMemory implements MicroInstructionMemory +{ + private MicroInstruction[] data; + private MicroInstructionMemoryDefinition definition; + private HashSet observers = new HashSet<>(); + + public StandardMicroInstructionMemory(MicroInstructionMemoryDefinition definition) + { + if (definition.size() > Integer.MAX_VALUE) + throw new MemoryException("Size of MicroInstructionMemory must be an int, not a long"); + this.definition = definition; + data = new MicroInstruction[(int) definition.size()]; + } + + private int translate(long address) + { + return (int) (address - definition.getMinimalAddress()); + } + + @Override + public MicroInstruction getCell(long address) + { + int translatedAddress = translate(address); + MicroInstruction actual = data[translatedAddress]; + if (actual == null) + actual = data[translatedAddress] = definition.getMicroInstructionDefinition() + .createDefaultInstruction(() -> notifyObservers(address)); + return actual; + } + + @Override + public void setCell(long address, MicroInstruction data) + { + this.data[translate(address)] = data; + notifyObservers(address); + } + + @Override + public void registerObserver(MemoryObserver ob) + { + observers.add(ob); + } + + @Override + public void deregisterObserver(MemoryObserver ob) + { + observers.remove(ob); + } + + @Override + public void notifyObservers(long address) + { + observers.forEach(ob -> ob.update(address)); + } + + @Override + public MicroInstructionMemoryDefinition getDefinition() + { + return definition; + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java new file mode 100644 index 00000000..73940280 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/CoreMicroInstructionMemory.java @@ -0,0 +1,58 @@ +package net.mograsim.machine.mi.components; + +import java.util.List; + +import net.mograsim.logic.core.components.BasicCoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.machine.mi.MicroInstructionMemory; + +public class CoreMicroInstructionMemory extends BasicCoreComponent +{ + private final ReadWriteEnd data; + private final ReadEnd address; + private final MicroInstructionMemory memory; + + public CoreMicroInstructionMemory(Timeline timeline, int processTime, MicroInstructionMemory memory, ReadWriteEnd data, ReadEnd address) + { + super(timeline, processTime); + this.memory = memory; + this.data = data; + this.address = address; + memory.registerObserver(a -> update()); + address.registerObserver(this); + } + + public MicroInstructionMemory getMemory() + { + return memory; + } + + @Override + public List getAllInputs() + { + return List.of(address); + } + + @Override + public List getAllOutputs() + { + return List.of(data); + } + + @Override + protected TimelineEventHandler compute() + { + if (!address.getValues().isBinary()) + { + return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. + } + long addressed = address.getValues().getUnsignedValueLong(); + BitVector storedData = memory.getCell(addressed).toBitVector(); + return e -> data.feedSignals(storedData); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java new file mode 100644 index 00000000..b3c41749 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/components/ModelMicroInstructionMemory.java @@ -0,0 +1,51 @@ +package net.mograsim.machine.mi.components; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.machine.Machine; +import net.mograsim.machine.ModelMemory; +import net.mograsim.machine.mi.MicroInstructionMemoryDefinition; + +public abstract class ModelMicroInstructionMemory extends ModelMemory +{ + private final Pin addrPin, dataPin; + private CoreMicroInstructionMemory memory; + private final MicroInstructionMemoryDefinition definition; + + public ModelMicroInstructionMemory(LogicModelModifiable model, MicroInstructionMemoryDefinition definition, String name) + { + super(model, 120, 150, name, "MPM", false); + this.definition = definition; + addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); + addPin(dataPin = new Pin(model, this, "D", definition.getMicroInstructionDefinition().sizeInBits(), PinUsage.OUTPUT, getWidth(), + 50)); + + init(); + } + + public MicroInstructionMemoryDefinition getDefinition() + { + return definition; + } + + public Pin getAddressPin() + { + return addrPin; + } + + public Pin getDataPin() + { + return dataPin; + } + + public CoreMicroInstructionMemory getCoreMemory() + { + return memory; + } + + public void setCoreModelBinding(CoreMicroInstructionMemory memory) + { + this.memory = memory; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java new file mode 100644 index 00000000..73acc661 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/BooleanClassification.java @@ -0,0 +1,34 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public class BooleanClassification extends MnemonicFamily +{ + String trueName, falseName; + + public BooleanClassification(boolean defaultValue, String trueName, String falseName) + { + super(defaultValue ? trueName : falseName, new MnemonicPair(trueName, BitVector.SINGLE_1), + new MnemonicPair(falseName, BitVector.SINGLE_0)); + this.trueName = trueName; + this.falseName = falseName; + } + + public Mnemonic get(boolean value) + { + return get(value ? trueName : falseName); + } + + @Override + public ParameterType getExpectedType() + { + return ParameterType.BOOLEAN_IMMEDIATE; + } + + @Override + public int getExpectedBits() + { + return 1; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java new file mode 100644 index 00000000..c24cabeb --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerClassification.java @@ -0,0 +1,42 @@ +package net.mograsim.machine.mi.parameters; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public class IntegerClassification implements ParameterClassification +{ + private final int bits; + private final IntegerImmediate defaultValue; + + public IntegerClassification(int defaultValue, int bits) + { + this.bits = bits; + this.defaultValue = new IntegerImmediate(BitVector.from(defaultValue, bits)); + } + + @Override + public ParameterType getExpectedType() + { + return ParameterType.INTEGER_IMMEDIATE; + } + + @Override + public int getExpectedBits() + { + return bits; + } + + @Override + public IntegerImmediate parse(String toParse) + { + return new IntegerImmediate(new BigInteger(toParse), bits); + } + + @Override + public MicroInstructionParameter getDefault() + { + return defaultValue; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java new file mode 100644 index 00000000..419602c6 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/IntegerImmediate.java @@ -0,0 +1,74 @@ +package net.mograsim.machine.mi.parameters; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.BitVector; + +public final class IntegerImmediate implements MicroInstructionParameter +{ + private BitVector value; + + public IntegerImmediate(BigInteger value, int bits) + { + this.value = BitVector.from(value, bits); + } + + public IntegerImmediate(BitVector value) + { + this.value = value; + } + + @Override + public BitVector getValue() + { + return value; + } + + @Override + public ParameterType getType() + { + return ParameterType.INTEGER_IMMEDIATE; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (!(obj instanceof IntegerImmediate)) + return false; + IntegerImmediate other = (IntegerImmediate) obj; + if (value == null) + { + if (other.value != null) + return false; + } else if (!value.equals(other.value)) + return false; + return true; + } + + /** + * @return The value of this IntegerImmediate as an unsigned BigInteger + */ + public BigInteger getValueAsBigInteger() + { + return value.getUnsignedValue(); + } + + @Override + public String toString() + { + return getValueAsBigInteger().toString(); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java new file mode 100644 index 00000000..2f135d29 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MicroInstructionParameter.java @@ -0,0 +1,15 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.logic.core.types.BitVector; + +public interface MicroInstructionParameter +{ + public BitVector getValue(); + + public ParameterType getType(); + + public static enum ParameterType + { + INTEGER_IMMEDIATE, BOOLEAN_IMMEDIATE, MNEMONIC + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java new file mode 100644 index 00000000..5ea2be05 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/Mnemonic.java @@ -0,0 +1,64 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.logic.core.types.BitVector; + +public final class Mnemonic implements MicroInstructionParameter +{ + private final String text; + private final BitVector vector; + final MnemonicFamily owner; + private final int ordinal; + + Mnemonic(String text, BitVector vector, MnemonicFamily owner, int ordinal) + { + super(); + this.text = text; + this.vector = vector; + this.owner = owner; + this.ordinal = ordinal; + } + + public String getText() + { + return text; + } + + @Override + public BitVector getValue() + { + return vector; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((text == null) ? 0 : text.hashCode()); + result = prime * result + ((vector == null) ? 0 : vector.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + return this == obj; + } + + @Override + public ParameterType getType() + { + return owner.getExpectedType(); + } + + public int ordinal() + { + return ordinal; + } + + @Override + public String toString() + { + return text; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java new file mode 100644 index 00000000..d6906fb3 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/MnemonicFamily.java @@ -0,0 +1,262 @@ +package net.mograsim.machine.mi.parameters; + +import java.util.Arrays; +import java.util.Map; +import java.util.stream.Collectors; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public class MnemonicFamily implements ParameterClassification +{ + private final Mnemonic[] values; + private final Mnemonic defaultValue; + private final String[] stringValues; + private Map byText; + private int vectorLength; + + public MnemonicFamily(String defaultValueName, String... names) + { + this(false, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); + } + + public MnemonicFamily(boolean reverse, String defaultValueName, String... names) + { + this(reverse, defaultValueName, (int) Math.round(Math.ceil(Math.log(names.length) / Math.log(2))), names); + } + + public MnemonicFamily(String defaultValueName, int bits, String... names) + { + this(false, defaultValueName, bits, names); + } + + public MnemonicFamily(boolean reverse, String defaultValueName, int bits, String... names) + { + this.values = new Mnemonic[names.length]; + this.stringValues = new String[names.length]; + BitVector[] values = new BitVector[names.length]; + for (int i = 0; i < names.length; i++) + { + values[i] = BitVector.from(i, bits); + } + + setup(names, values, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; + } + + public MnemonicFamily(String defaultValueName, String[] names, long[] values, int bits) + { + this(false, defaultValueName, names, values, bits); + } + + public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, long[] values, int bits) + { + if (names.length != values.length) + throw new IllegalArgumentException(); + this.values = new Mnemonic[values.length]; + this.stringValues = new String[values.length]; + BitVector[] vectors = new BitVector[values.length]; + + for (int i = 0; i < vectors.length; i++) + { + vectors[i] = BitVector.from(values[i], bits); + } + + setup(names, vectors, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; + } + + public MnemonicFamily(String defaultValueName, String[] names, BitVector[] values) + { + this(false, defaultValueName, names, values); + } + + public MnemonicFamily(boolean reverse, String defaultValueName, String[] names, BitVector[] values) + { + if (names.length != values.length) + throw new IllegalArgumentException(); + this.values = new Mnemonic[values.length]; + this.stringValues = new String[values.length]; + + setup(names, values, reverse); + + int defaultValueIndex = -1; + for (int i = 0; i < names.length; i++) + if (names[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; + } + + public MnemonicFamily(String defaultValueName, MnemonicPair... values) + { + this.values = new Mnemonic[values.length]; + this.stringValues = new String[values.length]; + + setup(values); + + int defaultValueIndex = -1; + for (int i = 0; i < values.length; i++) + if (stringValues[i].equals(defaultValueName)) + { + defaultValueIndex = i; + break; + } + this.defaultValue = this.values[defaultValueIndex]; + } + + private void setup(String[] names, BitVector[] values, boolean reverse) + { + MnemonicPair[] mnemonics = new MnemonicPair[values.length]; + for (int i = 0; i < values.length; i++) + mnemonics[i] = new MnemonicPair(names[i], reverse ? values[i].reverse() : values[i]); + setup(mnemonics); + } + + private void setup(MnemonicPair[] values) + { + for (int i = 0; i < values.length; i++) + { + this.values[i] = createMnemonic(values[i], i); + this.stringValues[i] = values[i].name; + } + if (values.length == 0) + vectorLength = 0; + else + { + vectorLength = values[0].value.length(); + for (int i = 1; i < values.length; i++) + if (values[i].value.length() != vectorLength) + throw new IllegalArgumentException("MnemonicFamily is not of uniform vector length!"); + } + byText = Arrays.stream(this.values).collect(Collectors.toMap(m -> m.getText(), m -> m)); + if (values.length != byText.keySet().size()) + throw new IllegalArgumentException("MnemonicFamily contains multiple Mnemonics with the same name!"); + } + + private Mnemonic createMnemonic(MnemonicPair mnemonicPair, int ordinal) + { + return new Mnemonic(mnemonicPair.name, mnemonicPair.value, this, ordinal); + } + + public Mnemonic[] values() + { + return values.clone(); + } + + public Mnemonic get(int ordinal) + { + return values[ordinal]; + } + + public Mnemonic get(String text) + { + return byText.get(text); + } + + @Override + public MicroInstructionParameter getDefault() + { + return defaultValue; + } + + public boolean contains(Mnemonic m) + { + if (m != null) + return m.owner == this; + else + return false; + } + + public boolean contains(String value) + { + return byText.keySet().contains(value); + } + + public int size() + { + return values.length; + } + + public int getVectorLength() + { + return vectorLength; + } + + @Override + public boolean conforms(MicroInstructionParameter param) + { + return ParameterClassification.super.conforms(param) && (param instanceof Mnemonic ? contains((Mnemonic) param) : false); + } + + @Override + public ParameterType getExpectedType() + { + return ParameterType.MNEMONIC; + } + + @Override + public int getExpectedBits() + { + return vectorLength; + } + + public String[] getStringValues() + { + return stringValues.clone(); + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + Arrays.hashCode(values); + return result; + } + + @Override + public boolean equals(Object obj) + { + return this == obj; + } + + @Override + public Mnemonic parse(String toParse) + { + Mnemonic parsed = get(toParse); + if (parsed == null) + throw new UnknownMnemonicException(toParse); + return parsed; + } + + public static class MnemonicPair + { + public final String name; + public final BitVector value; + + public MnemonicPair(String name, BitVector value) + { + this.name = name; + this.value = value; + } + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java new file mode 100644 index 00000000..c81f6e55 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/ParameterClassification.java @@ -0,0 +1,30 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.machine.mi.parameters.MicroInstructionParameter.ParameterType; + +public interface ParameterClassification +{ + /** + * Determines whether a {@link MicroInstructionParameter} is part of this class of parameters. + * + * @return true if the classification contains the Parameter, false otherwise + */ + public default boolean conforms(MicroInstructionParameter param) + { + return param.getType().equals(getExpectedType()) && param.getValue().length() == getExpectedBits(); + } + + /** + * @return The type of the parameters in this classification. + */ + public ParameterType getExpectedType(); + + /** + * @return The number of bits of the parameters in this classification. + */ + public int getExpectedBits(); + + public MicroInstructionParameter parse(String toParse); + + public MicroInstructionParameter getDefault(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java new file mode 100644 index 00000000..3af062e3 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/mi/parameters/UnknownMnemonicException.java @@ -0,0 +1,26 @@ +package net.mograsim.machine.mi.parameters; + +import net.mograsim.machine.MachineException; + +public class UnknownMnemonicException extends MachineException +{ + /** + * + */ + private static final long serialVersionUID = 701558899889830975L; + + public UnknownMnemonicException() + { + super(); + } + + public UnknownMnemonicException(String message) + { + super(message); + } + + public UnknownMnemonicException(Throwable cause) + { + super(cause); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java new file mode 100644 index 00000000..40abba9f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/CoreWordAddressableMemory.java @@ -0,0 +1,94 @@ +package net.mograsim.machine.standard.memory; + +import java.util.List; + +import net.mograsim.logic.core.components.BasicCoreComponent; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MainMemoryDefinition; + +/** + * A memory component that only allows access to words of a specific width + */ +public class CoreWordAddressableMemory extends BasicCoreComponent +{ + private final MainMemory memory; + private final static Bit read = Bit.ONE; + + private ReadWriteEnd data; + private ReadEnd rWBit, address; + + /** + * @param data The bits of this ReadEnd are the value that is written to/read from memory; The bit width of this wire is the width of + * a memory word + * @param rWBit The value of the 0th bit dictates the mode: 0: Write, 1: Read + * @param address The bits of this ReadEnd address the memory cell to read/write + */ + public CoreWordAddressableMemory(Timeline timeline, int processTime, MainMemory memory, ReadWriteEnd data, ReadEnd rWBit, + ReadEnd address) + { + super(timeline, processTime); + MainMemoryDefinition definition = memory.getDefinition(); + if (data.width() != definition.getCellWidth()) + throw new IllegalArgumentException( + String.format("Bit width of data wire does not match main memory definition. Expected: %d Actual: %d", + definition.getCellWidth(), data.width())); + if (rWBit.width() != 1) + throw new IllegalArgumentException( + String.format("Bit width of read/write mode select wire is unexpected. Expected: 1 Actual: %d", rWBit.width())); + if (address.width() != definition.getMemoryAddressBits()) + throw new IllegalArgumentException( + String.format("Bit width of address wire does not match main memory definition. Expected: %d Actual: %d", + definition.getMemoryAddressBits(), address.width())); + this.memory = memory; + this.data = data; + this.rWBit = rWBit; + this.address = address; + memory.registerObserver(a -> update()); + data.registerObserver(this); + rWBit.registerObserver(this); + address.registerObserver(this); + } + + @Override + protected TimelineEventHandler compute() + { + if (!address.getValues().isBinary()) + { + if (read.equals(rWBit.getValue())) + return e -> data.feedSignals(Bit.U.toVector(data.width()));// TODO don't always feed U, but decide to feed X or U. + return e -> data.clearSignals(); + } + long addressed = address.getValues().getUnsignedValueLong(); + if (read.equals(rWBit.getValue())) + { + BitVector storedData = memory.getCell(addressed); + return e -> data.feedSignals(storedData); + } + BitVector transData = data.getValues(); + boolean isNewData = !transData.equals(memory.getCell(addressed)); + return e -> + { + data.clearSignals(); + if (isNewData) + memory.setCell(addressed, transData); + }; + } + + @Override + public List getAllInputs() + { + return List.of(data, rWBit, address); + } + + @Override + public List getAllOutputs() + { + return List.of(data); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java new file mode 100644 index 00000000..5183e323 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/MemoryException.java @@ -0,0 +1,27 @@ +package net.mograsim.machine.standard.memory; + +import net.mograsim.machine.MachineException; + +public class MemoryException extends MachineException +{ + + /** + * + */ + private static final long serialVersionUID = 6416796315595721079L; + + public MemoryException() + { + super(); + } + + public MemoryException(String message) + { + super(message); + } + + public MemoryException(Throwable cause) + { + super(cause); + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java new file mode 100644 index 00000000..986dbe50 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/ModelWordAddressableMemory.java @@ -0,0 +1,57 @@ +package net.mograsim.machine.standard.memory; + +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MainMemoryDefinition; +import net.mograsim.machine.ModelMemory; + +public abstract class ModelWordAddressableMemory extends ModelMemory +{ + private final Pin addrPin, dataPin, rWPin; + private CoreWordAddressableMemory memory; + private MainMemoryDefinition definition; + + public ModelWordAddressableMemory(LogicModelModifiable model, MainMemoryDefinition definition, String name) + { + super(model, 120, 150, name, "RAM", false); + this.definition = definition; + + addPin(addrPin = new Pin(model, this, "A", definition.getMemoryAddressBits(), PinUsage.INPUT, getWidth(), 30)); + addPin(dataPin = new Pin(model, this, "D", definition.getCellWidth(), PinUsage.TRISTATE, getWidth(), 50)); + addPin(rWPin = new Pin(model, this, "RW", 1, PinUsage.INPUT, getWidth(), 70)); + + init(); + } + + public MainMemoryDefinition getDefinition() + { + return definition; + } + + public Pin getAddressPin() + { + return addrPin; + } + + public Pin getDataPin() + { + return dataPin; + } + + public Pin getReadWritePin() + { + return rWPin; + } + + public void setCoreModelBinding(CoreWordAddressableMemory memory) + { + this.memory = memory; + } + + public CoreWordAddressableMemory getCoreMemory() + { + return memory; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java new file mode 100644 index 00000000..4a54ad9f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standard/memory/WordAddressableMemory.java @@ -0,0 +1,48 @@ +package net.mograsim.machine.standard.memory; + +import java.math.BigInteger; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.machine.GenericMemory; +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MainMemoryDefinition; + +public class WordAddressableMemory extends GenericMemory implements MainMemory +{ + private final int cellWidth; + private final MainMemoryDefinition definition; + + public WordAddressableMemory(MainMemoryDefinition definition) + { + super(definition); + this.cellWidth = definition.getCellWidth(); + this.definition = definition; + } + + @Override + public BitVector getCell(long address) + { + BitVector data = super.getCell(address); + return data == null ? BitVector.of(Bit.ZERO, cellWidth) : data; + } + + @Override + public BigInteger getCellAsBigInteger(long address) + { + BitVector data = getCell(address); + return data == null ? BigInteger.valueOf(0) : data.getUnsignedValue(); + } + + @Override + public void setCellAsBigInteger(long address, BigInteger data) + { + setCell(address, BitVector.from(data, cellWidth)); + } + + @Override + public MainMemoryDefinition getDefinition() + { + return definition; + } +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json b/plugins/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json new file mode 100644 index 00000000..8202b0c4 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/standardComponentIDMapping.json @@ -0,0 +1,5 @@ +{ + "version": "0.1.0", + "map": { + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.branding/.classpath b/plugins/net.mograsim.plugin.branding/.classpath new file mode 100644 index 00000000..bc3587db --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/.project b/plugins/net.mograsim.plugin.branding/.project new file mode 100644 index 00000000..b0c2a7a1 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/.project @@ -0,0 +1,28 @@ + + + net.mograsim.plugin.branding + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..5db31272 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/plugins/net.mograsim.plugin.branding/META-INF/MANIFEST.MF b/plugins/net.mograsim.plugin.branding/META-INF/MANIFEST.MF new file mode 100644 index 00000000..a85a3578 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Mograsim branding +Bundle-SymbolicName: net.mograsim.plugin.branding;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Automatic-Module-Name: net.mograsim.plugin.branding +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.eclipse.ui.intro;bundle-version="3.5.500", + org.eclipse.ui.intro.universal;bundle-version="3.3.400" diff --git a/plugins/net.mograsim.plugin.branding/about.ini b/plugins/net.mograsim.plugin.branding/about.ini new file mode 100644 index 00000000..4f49cd29 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/about.ini @@ -0,0 +1,2 @@ +aboutText=Mograsim - Modular Graphical Simulator by Christian Femers, Daniel Kirschten and Fabian Stemmler +featureImage=icon_blue-orange_32.png \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.branding/build.properties b/plugins/net.mograsim.plugin.branding/build.properties new file mode 100644 index 00000000..37fc21c9 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/build.properties @@ -0,0 +1,6 @@ +bin.includes = META-INF/,\ + .,\ + eclipse_with_icon_32.png,\ + about.ini,\ + icons/,\ + icon_blue-orange_32.png diff --git a/plugins/net.mograsim.plugin.branding/eclipse_with_icon_32.png b/plugins/net.mograsim.plugin.branding/eclipse_with_icon_32.png new file mode 100644 index 00000000..c180b842 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/eclipse_with_icon_32.png differ diff --git a/plugins/net.mograsim.plugin.branding/icon_blue-orange_32.png b/plugins/net.mograsim.plugin.branding/icon_blue-orange_32.png new file mode 100644 index 00000000..a0dc941a Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/icon_blue-orange_32.png differ diff --git a/plugins/net.mograsim.plugin.branding/icons/.gitkeep b/plugins/net.mograsim.plugin.branding/icons/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai b/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai new file mode 100644 index 00000000..d082a8e1 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon.ai @@ -0,0 +1,760 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 25 0 R 44 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + uuid:fa56d82b-e056-4a05-9c36-ef2b93c3828f + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + proof:pdf + + + + + saved + xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T03:03:20+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + + EmbedByReference + + K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai + + + + + + + application/pdf + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T03:03:20+02:00 + 2019-06-22T03:20:05+02:00 + 2019-06-22T03:20:05+02:00 + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqp3FzbW0RluJUhiHV5GCj7zkMmSMBciAPNlCEpGoiyxzUfzC0G1JWAveSD/fYolf9ZqfgDmm1 HtBp4bRuZ8uXzLtMPY2afOojzY7efmXq0hItbeK3U9C1ZGH0/Cv/AAuafN7SZpfRER+38fJ2eLsP GPqJP2LLWf8AMDWqNDLOkLdJRSBKexAWv0VyGKfaGp3BlXf9I/R9jLJHRYOYF931FOLXyBfS0fVd VlkPVo4mY/8ADvX/AIjmyxdg5Jb5ckj7v1n9Tg5O14DbHAD3/qH60fJ5d8kaLCJ7/wBCFO899KAp p/xkIT8M2WHsTTR5Q4j57/scLJ2pnn/FXu2Sa6/OP8ntFqg12yUDalkjTjb/AJhkkGbTFouH6YiP wpwp5JS+ok+9JLr/AJye/KyH+7mvLnp/dWzD/k4Y8yBpZsEHJ/zlZ+WyuqraarID1dYIKD58p1P3 DD+Un5Krxf8AOUn5YO3FhqEQp9p7dSP+FkY4Pys1Tmw/5yD/ACkvCFGuC3c/s3EFxH/wxj4f8NkT p5jorLtI83+VNZIXSdZsr9z+xb3EUj/SqsWGVGBHMKm+RV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KobUNSsdPgM95MsMfYsdyfBR1J+WUZ9Tjwx4pmg24cE8hqIssH1n8yZ3LRaVF6S9P rEoBf5qn2R9Nc5fWe0cjthFeZ5/L+13+m7EA3yG/IfrYfeX97ey+rdzvPJ4uSafLw+jOdzZ55Tcy ZHzd3iwwxiogAJxofkrV9U4ysv1W0O/rSDcj/ITqf1ZsdD2Nmz7n0w7z+gOFq+1MWLb6pdwZedI8 l+U7I6hqtxDCkf2ry+dVFadEDUWvgAK51ui7Fw4uQ4pd53ed1PaebLtfCO4PNvN3/OVflewL2/lq xl1eYbC6mrb2/wAwCDK/yKr8830NITz2de8f8y/85BfmhrjOo1T9F2zdINOX0KfKWrTf8PmTHTwH RLz68vr29na4vbiS5uG+1NM7SOfmzEnLwKVQxV2KuxV2KuxVsEg1HXFWWeXvzX/MTy+UGma7dJCn S3mf6xDTwEc3NR9AyuWGMuYV6z5T/wCcs72MpD5q0hZ4+jXmnnhIB4mGQlWPydflmNPR9xV7d5P/ ADL8k+bowdD1OKa4pyayc+lcrTrWJ6MQPFaj3zFnilHmEMnytXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYqxHzJ5+tbIva6bxubobNL1jQ/R9o/hnPdo9uwxXHF6p9/Qfrd1ouyJZPVk9MftP6nnl9qF7 f3BuLyZppW/aY9B4AdAPYZx+fUTyy4pmy9Liwwxx4Yigu07TL3UblbaziMsp3NOgHix6AYdPpp5p cMBZRmzwxR4pGg9C0jyhouhWrajq8sTvApklnmIWCELuT8VBt/M34Z2nZ3YePFRn65/YPc8vrO1p 5do+mP2l5Z+Yv/OUdjaGXT/JUK3k4qratcKRAp6VhjNGenZmoPZhnUY9Le8nUvnjzD5o8w+Y783+ uX81/dGtHmaoUHfiiCiovsoAzNjARFBKV5JXYq7FXYq7FXYq7FXYq7FXYq7FVSCeaCZJoJGimjIa OVCVZWG4KsNwRir2T8v/APnJrzVojRWfmVTrmmCi+uSFvYx4iQ0Evyfc/wAwzFyaUHlsr6X8o+d/ LPm7Tvr+g3qXUQoJovsyxMf2ZYz8Sn8D2zBnjMTRQnmQV2KuxV2KuxV2KuxV2KuxV2KrJpooYmlm cRxIOTuxoAB3JORnMRBJNAMoxMjQ3LzbzV54n1AvZ6eWhstw8nR5R/Bfbv38M4rtTtuWW4Y9od/U /sep7P7KGP1T3n937WJZz7uU48u+Wr3WrjjF+7tkP764IqF9h4t7Zsez+zZ6mVDaI5n8dXB1uuhg jvvLoGW+Z/Nnkv8ALPy/696/Bnr9XtUo11dSAdht07saKv3DPQND2fDFHgxj3n9byOo1M80uKRfK P5k/m95q89XbC8lNppCNW20mFj6S06NIdjK/+U30AZvMWEQ97QwbLVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVTLy/wCY9c8u6nHqei3kljexfZliPUVqVdTVXU03VgQcjKIkKKvq38o/z+0fzf6O ka0E03zGQFRa0t7o/wDFJJ+F/wDis/QT21+bTmO45IeuZjK7FXYq7FXYq7FXYq7FVk00UETzTOEi jBZ3bYADck5GcxEGRNAMoxMjQ5l5b5t82zaxMbe3Jj06M/CvQyEftN/AZwnavap1B4Y7Yx9vmXru zuzhhHFLeZ+xjeaV2id+WPLNxrd0RUx2cRHrzf8AGq/5R/DNp2Z2bLUz7oDmf0DzcDX66OCPfI8g n35lfmV5d/LTy7HFFGkupyoV0zTFO7Hp6stNxGD1PVjsPb0TR6OMYiEBUQ8dkySySMpGyXx15o80 655n1ibV9aumuryY9TsqIPsxxr0VF7AfrzcQgIigwSnJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq2rMrBlJDA1BGxBGKvpf8j/+cgTevb+V/OE/+ltSPT9YkNPVPRYpz/P2V/2uh33ODn09 bxQ+g8wldirsVdirsVdirsVeZ+d/NR1Cc6fZv/oMLfvHH+7XH/Go7ff4ZxHbXanjS8OB9A+0/qer 7K7P8MccvrP2ftYlnPu5THQtFudY1BLSH4V+1NKeiIOp/pmZodHLUZBCPxPcHF1eqjhhxH4ebL/P /nnQPyz8oibgslywMWmWFaPPN1LMevFa8nb6OpAz0nRaOMIiEBUQ8VmzSySMpcy+MPMXmLWPMesX GsaxcNc31y3KSRugHZVHRVUbADpm7jERFBrSzJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FX1D/zj3+dTarHD5P8AMc9dTiXhpV7Id50Uf3MjE7yqPsn9of5XXA1GCvUEPesw1dir sVdirsVYh5+8yGytv0bbNS6uVrM46pGdqfNv1Zz3b3aPhx8KP1S5+Q/a7rsjRccvEl9MeXmf2PNc 4l6pdFHJLIsUal5HIVFG5JJoAMlGJkQBzLGUgBZ5PULVNI8keVbrU9UlWKK2jNxqFx1JI6IvjueK juT756L2V2cMGMRH1y5/juDxWv1hz5L/AIRyfGf5i+fdV87+ZrjWb4lIj+7sbStVggBPBB4nux7n 7s6fHjEBThsXyxXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVSCea3mjngka KaJg8UqEqyspqrKRuCDir7Q/JH80ovPPlvheMq+YNNCx6jGKD1ARRLhQOz0+KnRvamavPi4D5Iej 5QrsVdiqF1TUINOsJr2f+7hXlTuT0VR8ztlGp1EcOMzlyDdgwnLMQHMvGL++uL68mu7g8pZmLN4D wA9gNhnmufPLLMzlzL3OHFHHERjyCHyltZv+XOgiWV9XnWqREpag93/af/YjYf2Z1Hs9oeInNLkN o+/vdB21q6HhDrzeN/8AOTn5lHVNYXydp0v+4/S3D6kynaS7ptGfFYgf+CJ/lGd/pcVDiLzbwrMt XYq7FXYq9A/I7yjofmvz5FpGtwtPYtbTStGrtGeSAFTyQg5TnmYxsK+jP+hbfyk/6tc3/SVcf815 hfmZ96Hf9C2/lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm/wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/p KuP+a8fzM+9Xf9C2/lJ/1a5v+kq4/wCa8fzM+9Xf9C2/lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm /wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/pKuP+a8fzM+9Xf9C2/lJ/1a5v+kq4/wCa8fzM+9Xf9C2/ lJ/1a5v+kq4/5rx/Mz71d/0Lb+Un/Vrm/wCkq4/5rx/Mz71d/wBC2/lJ/wBWub/pKuP+a8fzM+9X f9C2/lJ/1a5v+kq4/wCa8fzM+9XnP58fk/5D8o+SI9V0Kykt71r2KAyPPLIODpISOLsw6qMu0+aU pUUvnnM1XYq7FXYqyT8vfO2oeTPNVnrlmSyRNwvLcGgmt2I9SM9txuvgwByGSAkKV926Tqljq2mW up2Eomsr2JJ7eUd0cch8j4jNQRRooRWBXYq89/MnWS88WlRN8EVJbindyPgX6F3+nOQ9o9ZchhHT c+/o9L2JpqByHrsGEZy7v1exs5r28htIRWWZwi/Sev0ZbgwnJMQjzkWvLkEImR5Bn35h+abX8vvy 8ur+34+vbxrbabG37dzJshI703kYdwDnqOi0sYiOOP0h4PNlOSZkeZfDk88080k8zmSaVi8sjGrM zGrMSepJzeMFPFXYq7FXYq9Z/wCcYv8AyakH/MHc/wDERmPqvoV9hZrEIO61nR7SX0bq+t7eUAEx yyojUPQ0Yg4REqpf4l8uf9XWz/6SIv8AmrDwnuV3+JfLn/V1s/8ApIi/5qx4T3K7/Evlz/q62f8A 0kRf81Y8J7ld/iXy5/1dbP8A6SIv+aseE9yu/wAS+XP+rrZ/9JEX/NWPCe5Xf4l8uf8AV1s/+kiL /mrHhPcrv8S+XP8Aq62f/SRF/wA1Y8J7ld/iXy5/1dbP/pIi/wCaseE9yu/xL5c/6utn/wBJEX/N WPCe5Xf4l8uf9XWz/wCkiL/mrHhPcqYgggEGoO4IyKvHv+cp/wDyWcX/AG0rf/k3LmTpPr+CvkXN kl2KuxV2KuxV9L/84q+fTPaXfky9lrJbcrvSuR6xMf30Q/1WIcD3bwzB1eP+JD6EzCVSurmK1tpb mU0jhRpHPsoqcry5BCJkeQFs8cDOQiOZeJX15LeXk13MayTuXb2qen0Z5jnzHJMzPORt73FjEIiI 5BQypsZp+WulCW8n1KRarbj04Sf53HxEfJf1503s5peKZyn+HYe8/s+90PbmoqIxjrufd+PueM/8 5T+cjqPmu18tW71tdGjElyAdjc3Cht/9SPjT5nPQdJChfe808PzLV2KuxV2KuxV6z/zjF/5NSD/m Duf+IjMfVfQr7CzWIfHv/OTv/k1J/wDmDtv+InNnpfoS8mzIV2KuxV2KuxV2KuxV2KuxV2Kv0T03 /jnWv/GGP/iIzSnmh5N/zlP/AOSzi/7aVv8A8m5cyNJ9fwV8i5skuxV2KuxV2Kp15M8zXXlfzTpm vWtTJYTrI6DbnEfhlj/2cbMv05GceIEK++7K8tr2zgvbVxLbXUaTQSDoySKGVh8wc05FIY7+YmoG 20L6upo944T34L8TfqA+nND7QajgwcI5zNfDm7fsbDxZuL+aHl2cK9a7FXrvla0GmeWICY2ZzGbm REFXYuOVAO7caDPReyNP4WniOp3PxeJ7SzeJnkeg2+T5F1/8r/ze1vXL/WLvy3eG41C4kuZdloDI xag+LoK0GdPHLACrcJAf8qW/NT/qWrz/AIFf+asPjw71d/ypb81P+pavP+BX/mrHx4d6u/5Ut+an /UtXn/Ar/wA1Y+PDvV3/ACpb81P+pavP+BX/AJqx8eHerv8AlS35qf8AUtXn/Ar/AM1Y+PDvV6P+ QH5b+etA/MSHUdZ0a4sbJbWdDPKAFDMo4jYnrlGoyxMaBV9PZgIfHv8Azk7/AOTUn/5g7b/iJzZ6 X6EoP/nH7yzo/mbzlfaNrEAnsrrS7gMOjKwki4ujfssp3Bw6iRjGx3qx38yPy81jyL5ik0q+Bltn rJp96BRJ4a0DAVNGHRl7H2ocniyCYtWKZYrsVdirsVdiqrbW1xc3EdtbRtNcTMI4YYwWd3Y0VVUb kk4kq9s82/k9beSfyWn1HUkWXzPfXNr9Yk2YW8ZYn0Iz4/zsOp26DMSGbjyUOSvDsy1fonpv/HOt f+MMf/ERmlPNDzj/AJyI8t675h8gx2Gi2Ul9eC+hlMEQBbgqSAtuR05DL9NIRlZV80/8qW/NT/qW rz/gV/5qzO8eHel3/KlvzU/6lq8/4Ff+asfHh3q7/lS35qf9S1ef8Cv/ADVj48O9Xf8AKlvzU/6l q8/4Ff8AmrHx4d6u/wCVLfmp/wBS1ef8Cv8AzVj48O9Xf8qW/NT/AKlq8/4Ff+asfHh3q+pfyOXz Ha+QbPSPMdpLZalpbNbrFNs7W9eUL7E7AEoP9XNfnrisIQv5l3nq6vBag1W3iqR4NIan/hQucJ7S ZuLMIfzY/f8AgPU9h4qxGX84/cxDOdd2idNtDeahbWo/3fKkZ9gzAE/dl+mxeJkjD+cQGrPk4IGX cHtUyikMQU8C4FV24hAXH0VWmeoAU8ASrYq7FXYq7FXYq7FXYq7FXx7/AM5O/wDk1J/+YO2/4ic2 el+hKJ/5xY/8mZL/ANs24/5ORYNX9HxV9KfmF5C0bzv5dm0fUl4P/eWV2BV4JgCFkXcVG9GXuMwc eQwNhD4h82+VNZ8q69c6Jq8PpXdsdmG6SId0kjb9pWHT7juDm1hMSFhKT5JXYq7FWwCTQdcVfVH/ ADj7+S36Ct4vNfmG3prU61060kG9rGw+26kbTMP+BHuTTX6jPfpHJCdf85O/+Srn/wCYy2/4kchp frV8eZs0v0T03/jnWv8Axhj/AOIjNKeaERgV2KuxV2KuxV2KuxVQkPC8haoCyhoiKbswHNN/BVV/ vwq8k823P1jzJfvWvGUx/wDIsBP+Nc847VycepmfOvls9v2dDhwQHlfz3SjNc5rIfIVsJvM1uSKr CryEfJSB+LDNx2Fj4tVHys/Y6ztefDpz50Ff85vzfk/L290f0NPXUZb6O55xvKYgio0XE7K9amue j4MPHbxzzr/ob3Uf+pZh/wCktv8Aqll35Md6Xf8AQ3uo/wDUsw/9Jbf9UsfyY71d/wBDe6j/ANSz D/0lt/1Sx/JjvV3/AEN7qP8A1LMP/SW3/VLH8mO9Xf8AQ3mpf9SzD/0lt/1Sw/kx3q7/AKG81L/q WYf+ktv+qWP5Md6u/wChvNS/6lmH/pLb/qlj+THerv8AobzUv+pZh/6S2/6pY/kx3q8k/Mrz1N54 8zvr0tmti7wxw/V1cyAemKV5FV6/LMjFj4BSs4/5xY/8mZL/ANs24/5ORZVq/o+KvrnNahgX5vfl Xp/n3QDEOMGuWas2mXp6BjuYpKf7rem/8p3HgbsOUwPkr4t1XSdR0nUrnTNRga2vrRzFcQOKMrL+ sdwRsRm0BBFhKEphV1MVep/kF5XhufzQ0uLW7HlF9VfUbSGdfhai1hl4nqP2lr7HMfUS9BpX2Pms Q8n/AOcnf/JVz/8AMZbf8SOZOl+tXx7TNkl9AW3/ADltqMNvFCPLULCJFTl9aYV4ilf7rMM6Md6q n/Q3mpf9SzD/ANJbf9UsfyY71d/0N5qX/Usw/wDSW3/VLH8mO9Xf9Deal/1LMP8A0lt/1Sx/JjvV 3/Q3mo/9SzD/ANJbf9UsfyY71d/0N7qP/Usw/wDSW3/VLB+THerv+hvdR/6lmH/pLb/qlj+THerv +hvdR/6lmH/pLb/qlj+THeqa+U/+cnbnzD5p0jRrjQorNL+7itxcrcGQo0rcBRTGoNeXHr3yM9Lw gm0I+/lMt9cSnrJK7H6WJzyLPLiySPeS+gYY1ADuAUMpbGY/llEDq11L/JBxH+ydT/xrnSezUf30 j3R/SHR9uy/dxH9L9Dxn/nLG99Xz7ptoDVbfTEYjfZ5J5a/8Kq56JpB6T73mHiWZSuxV2Kt4quph V1MVdTFXUxV1MVew/wDOLI/5CZL/ANs24/5ORZjav6Pir63zWIdiryf89Pyci85aadY0iNU8zWSf CBQC6iXf0mP84/YP0HbcZOnz8Jo8lfIU0EsMrwzI0c0bFJI3BVlZTQqwO4IObNL138h/yZfzZfLr 2txFfLVm/wC7ibb65Kp+wP8AitSPjPf7I70xtRn4dhzV6ckaR/8AOUSpGoRE0YKiKKAAR0AAGY/+ R+KHtWYivKP+cm//ACVk/wDzGW3/ABI5k6T61fH1M2aXUxV1MVdTFXUxVphiVW4FdirsVTLy1eNZ eY9KvFrytry3mFOtY5Vbbp4YJCwVfSGeHPobsVZz+VwPr6ie3GLf6WzqfZj6p/D9Lz/b3KHx/Qnm o+R/KGvaldXmtaPaajdRssKTXEKSOsYjRggJFacmJ+nOyGSQGxebQ/8Ayqb8s/8AqWNN/wCkaP8A pj40+8q7/lU35Z/9Sxpv/SNH/THxp95V3/Kpvyz/AOpY03/pGj/pj40+8q7/AJVN+Wf/AFLGm/8A SNH/AEx8afeVb/5VP+Wn/Usad/0jx/0w+NPvKu/5VP8Alp/1LGnf9I8f9MfGn3lXf8qn/LT/AKlj Tv8ApHj/AKY+NPvKu/5VP+Wn/Usad/0jx/0x8afeVfL3/OQWh6Pov5izWOk2cVjZi1gcW8CBEDMp qeI8c2OmkTCylN/+cWx/yEuX/tnT/wDJyLI6z6Pir61zVoecWf5tWtv+bOseRdXKwrztzot10DNL awyNbv8A5TO7MhPX7PhmQcHoEgr0fMdXzv8A85N/lppcNp/jaw42908qQanABRZi9QswoNn2o3j1 69c/SZT9JV7n5Ttre28raRBbxrDDHZwBI0AVQPTXoBmFM+oq8s/9ek/7dH/MvMn/ACPxV7RmIryn /nJr/wAlbP8A8xlt/wASOZOk+tXyBTNql9x2H5Vfls9jbO/lrTmZokLMbeOpJUVPTNMc075lCv8A 8qn/AC0/6ljTv+keP+mPjT7yrv8AlU/5af8AUsad/wBI8f8ATHxp95V3/Kp/y0/6ljTv+keP+mPj T7yrv+VT/lmf+mY03/pHj/pg8afeVa/5VN+Wf/Usab/0jR/0x8afeVd/yqb8s/8AqWNN/wCkaP8A pj40+8q7/lU35Z/9Sxpv/SNH/THxp95Vw/Kb8swajyxptf8AmHj/AKY+NPvKvMs8lfQ3YEs5/K4/ v9QFeqxGnyLZ1PsyfVP3D9Lz/b3KHx/QmOufmX5G8r6tcafr2qx2N5KUuI4XSViYmjVA1URh9pGG dnHFKQsB5tAf8r4/KT/qYof+RVx/1Tw/l59yu/5Xx+Un/UxQ/wDIq4/6p4/l59yu/wCV8flJ/wBT FD/yKuP+qeP5efcrY/Pj8pSaf4ih/wCRVx/1Tx/Lz7lXf8r0/Kf/AKmGH/kVP/1Tw/lsncrv+V6f lP8A9TDD/wAip/8Aqnj+Wydyu/5Xp+U//Uww/wDIqf8A6p4/lsncrv8Alen5T/8AUww/8ip/+qeP 5bJ3K+a/z38yaJ5j8/zalot0t5YtbQRrOoZRyQEMKOFO3yzY6aBjCilO/wDnF0f8hKl/7Z0//JyL K9Z9HxV9aZq0PjL/AJyCLL+cOvMpowNmQRsQRZQZt9L/AHY/HVL2v8hvzjXzPZp5d1yYf4itU/cT vt9bhTv/AMZUH2h3HxeNMPU6fh3HJCN/5yY/8ldP/wAxdt/xI4NH9avRPLf/ACjul/8AMJB/yaXM efMq8p/9ei/7dH/MvMr/ACHxV7PmGryr/nJj/wAldP8A8xdt/wASOZWj+tXyFTNql9oWP54/lVHZ W8b+YIQ6RorD0p9iFAP+681B02S+SFf/AJXp+U//AFMMP/Iqf/qng/LZO5Xf8r0/Kf8A6mGH/kVP /wBU8fy2TuV3/K9Pyn/6mGH/AJFT/wDVPH8tk7lWn89vymHXzFCP+eVx/wBU8H5efcrX/K+Pyk/6 mKH/AJFXH/VPH8vPuV3/ACvj8pP+pih/5FXH/VPH8vPuV3/K+Pyk/wCpih/5FXH/AFTx/Lz7lbH5 8flKTQeYoa/8Yrj/AKp4/l59ysL1CIw39zEescrof9ixGeUaiPDkkO4l7/DLigD3gIfKW1mP5ZSg avdRfzwch/sXUf8AG2dH7NTrNId8f0h0fbsf3UT/AEv0PGv+csrL0/PmmXYFFuNNRCfFop5a/wDC uuei6Q+k+95h4jmUrsVdirYNCDhVF0yxXUxV1MVdTFXUxV67/wA4vD/kJMv/AGzp/wDk5FmJrfo+ KvrLNUh8af8AOQY/5C9r/wD0af8AUFBm40v92Px1SwGxvLuwvIL2zlaC7tnWWCZDRkdDVWB8QcyC LFFXuHnT817Tzz+S08N0Vh8w2Vzai/thsJF5ECeIfyt+0P2Tt0Irg48Bhk8lfRHlz/lHtL/5hIP+ TS5r58yh5X/69D/26P8AmXmV/kPir2XMNXlX/OS//kr5/wDmLtv+JHMrR/Wr5Fpm2S6mKupirqYq 6mKqE/2gPbISVSyKuxV2Kpn5Zs2vvMmk2Sglrq8t4QB1rJKq+/jkZGgVfU/m62+r+ZL9Kfak9Qf8 9AH/AONs8g7Wx8GpmPO/nu9r2dPiwRPlXy2SfNc5zIPIlz6Hma2BNFmDxt9Kkj/hgM2/YeTh1UfO x9jre1ocWnl5UUd+cH5PR/mJdaSRqZ0uTT0uOUvofWBIshiotPVh48eJz0fDm4L2eNee/wDQn/8A 39v/AHL/APs6y/8AOeSu/wChP/8Av7f+5f8A9nWP5zyV3/Qn/wD39v8A3L/+zrH855K7/oT/AP7+ 3/uX/wDZ1j+c8lVh/wA4j0AH+K/+5f8A9nOS/P8A9H7U23/0KR/39f8A3L/+znD+f/o/b+xbd/0K R/39f/cv/wCznH8//R+39i27/oUj/v6/+5f/ANnOP5/+j9v7Ft5F+ZXkX/BPmh9C+u/pDhDHN9Y9 L0a+oK04c5On+tmXhyccbpWZ/wDOMA/5CTL/ANs6f/k5FlOt+j4q+sM1KHxt/wA5Aj/kLuvf9Gn/ AFBQ5udJ/dj8dUvPKZkq6mKvvzy5/wAo9pf/ADCQf8mlzn58yh5X/wCvP/8Abp/5l5l/5D4q9kzC V5X/AM5K/wDkr5/+Yu3/AOJHMvR/3ivkembdL6Btv+cTfWt4pv8AFXH1EV+P1CtOQrT/AHpzXHX/ ANH7VVf+hSP+/r/7l/8A2c4/n/6P2/sW3f8AQpH/AH9f/cv/AOznH8//AEft/Ytu/wChSP8Av6/+ 5f8A9nOP5/8Ao/b+xbUn/wCcQeTFv8W0r/2r/wDs5yB1t9PtVb/0J/8A9/b/ANy//s6x/OeSHf8A Qn//AH9v/cv/AOzrH855K7/oT/8A7+3/ALl//Z1j+c8lTbyn/wA4uJ5f8zaXrb+YhfDTbmK5FqbL 0uZiYMvx+vJxoRX7JyM9VYIpWX/mZZmPVbe7A+G4i4k/5UZ3/Bhnn/tJhrLGf84fc9R2HlvGY9x+ 9h2c47xEafdG0v7e6HWCRJP+BYHLtPl8PJGf80gtWbHxwMe8PbWdWWORWPCoI478gw4j6PirnqAI IsPAkUqYUOxV2KuxV2KuxV2KuxV8k/8AOSY/5CfP/wAwlv8A8RObjRf3aUR/zjEP+QkS/wDbOn/5 ORYNd9HxUvq7NQh8cf8AOQA/5C5r3/Rp/wBQUObrSf3Y/HVLzymZKupir768u/8AKP6Z/wAwkH/J tc56f1FDyz/153/t0/8AMvMv/IfFXseYSvLP+ck//JYT/wDMXb/8SOZei/vFfJFM3CX6Bad/xz7X /jFH/wARGc6eaERgV2KuxV2KuxV2KuxVawrIlRULVg3gaU/UTirG/wAwtP8ArWgmdRWS0cSbdeJ+ Fv11+jNH2/p+PT8Q5wN/oLtux83BmrpLZ5ZnCPXOxV615TuxqnleKNndXVGtZXRirqVHEFWG4biQ a56J2NqPE08T1jt8v2U8V2nh8PPLuO/zfG/mLzf+Z+h69qGjXXmnWPrGn3ElvIfr91QmNivIfvOj UqM6mMIEXQcFL/8AlZX5i/8AU1ax/wBJ91/1UyXhR7grv+VlfmL/ANTVrH/Sfdf9VMfCj3BXf8rK /MX/AKmrWP8ApPuv+qmPhR7grafmX+YisCfNOrkDqDf3P/VTCMcO4KmA/MX8wCAR5n1ah6f6dc/8 15f4MO4fJXpH/OP/AJu82ap+YkNpqet399am1nY29zdTTRllUUPB2ZajMXWYoiFgBX09mpQ+Sv8A nJIf8hOn/wCYS3/4ic3Oi/u0sK8necdb8o6sdV0Zo0u2iaAmVBIvByCdj/qjL8mITFFWbf8AQyP5 nf7/ALT/AKR1/rlH5HGtMB80eY9T8za7c63qhRr674es0a8F/dxrEtFHT4UGZOPGIigqVUySupir 060/5yI/Mm1tYbWKa1EUCLFGDbqTxQBRU18BmKdFjJVJf+Vtecf8Y/4u9SD9M+h9W5+kPT9OlPsV 65P8tHh4eip//wBDI/md/v8AtP8ApHX+uV/kca0kvm785PO3mvR20jV5Ld7N3SUiKEI3JDVfiByz HpYQNhWDUy9X3/p3/HPtf+MSf8RGc5Lmh5x/zkRq+raV5BjutLvbiwuTfQoZ7WV4ZOJSQleUZU0N OmZWiiJToi9lfNH/ACsT8wf+pn1b/pOuf+a82vgQ/mj5JQl1+ZX5hB+CeaNXFOpF/c9f+RmVTxw7 h8lUf+VlfmL/ANTVrH/Sfdf9VMh4Ue4K7/lZX5i/9TVrH/Sfdf8AVTHwo9wV3/KyvzF/6mrWP+k+ 6/6qY+FHuCu/5WV+Yv8A1NWsf9J91/1Ux8KPcFfWf5C22vr+XVlqGvX91qGoaq73gkvJpJ5Egaiw orSFjxKLzA/ys12oI4qHRD0C4giuLeSCUcopVZHHirChzFyQE4mJ5EUyhMxkCOYeJ6jYy2N9PZy/ 3kDlCfGnQ/SN88x1GE4shgecS97hyjJASHVDZS2sy/LbVRDqE2nufgul5xf8ZEG4+lf1Z0ns5quH IcZ/i5e8fs+50fben4oCY/h+4vHv+cqfJrWHme080W6f6Lq8YhumHa6gUKCf9eILT/VOeh6Sdiu5 5h4ZmWrsVdirsVRdnN/upj/q/wBMtxy6K9d/5xvH/ITYP+YS4/4iMp1392pfWeaVDB/Nv5OeSvNe sNq+rxTteMiRExTFF4oKDYDMjHqZwFBUm/6Fu/LL/fF3/wBJDf0yz89kW3f9C3fll/vi7/6SG/pj +eyLbv8AoW78sv8AfF3/ANJDf0x/PZFt3/Qt35Zf74u/+khv6Y/nsi27/oW78sv98Xf/AEkN/TH8 9kW3f9C3fll/vi7/AOkhv6Y/nsi27/oW78sv98Xf/SQ39Mfz2Rbd/wBC3fll/vi7/wCkhv6Y/nsi 27/oW78sv98Xf/SQ39Mfz2Rbd/0Ld+WX++Lv/pIb+mP57ItvT4o1iiSJPsooVa+AFBmGryj/AJya /wDJcxf9tCD/AIhLmboP7z4KHyfcSiJK/tHZRm2kaCUuJJNT1OY6tYq7FXYqnvkjyvc+afNmmaDb 1DX06pK4FSkQ+KWT/YRqzZHJPhiSr75s7S3s7SC0tkEVtbxrFDGuwVEAVVHyAzTk2hVwKwD8ytGK yw6tEvwvSK5p/MPsMfmNvuzkvaPR0RmHXY/o/U9H2JqdjjPvH6WC5yr0KtaXU1pdRXMJpLC4dD7q a5ZiynHMSjzBtryYxOJieRegee/LNp+Yf5eXNhEVWa6iE9hIx2juot0BPhyqjexOeoaHVicY5I8i 8JnwnHMxPR8OXNtPa3MttcRmK4gdo5omFGV0PFlI8QRm+Ba1LFXYq7FWwSDUdcVeu/8AON+p2kX5 jQyXc0cCra3ALyMEU1UU3YgZDVHix11V9W/4h0D/AKudp/yPj/5qzU8Eu5Dv8Q6B/wBXO0/5Hx/8 1Y8Eu5Xf4h0D/q52n/I+P/mrHgl3K7/EOgf9XO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P8A5qx4Jdyu /wAQ6B/1c7T/AJHx/wDNWPBLuV3+IdA/6udp/wAj4/8AmrHgl3K7/EOgf9XO0/5Hx/8ANWPBLuV3 +IdA/wCrnaf8j4/+aseCXcrv8Q6B/wBXO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P/mrHgl3K7/EOgf9 XO0/5Hx/81Y8Eu5Xf4h0D/q52n/I+P8A5qx4JdyvKv8AnJPWtIn/AC7RLe9gnkF/A3pxSI7UCSdl JOZmiBjOz3K+TZpWlcs30DwGZ8pWlTyKuxV2KuxV9N/84reQWtdPu/Od7HSW9DWmmBhuIUb97KP9 d14j/VPjmBq8m/Ch9AZhq7FUPqFjBf2U1nOKxTKVbxHgR7g75TqMEcsDCXKTbhynHMSHMPGNT0+4 06+ms5xSSFqE9iOoYexG+ea6nTyw5DCXMPc4M0csBKPIoXKG5mn5da8ILltKnakVweVuT0ElN1/2 Q/H5503s9ruCXgy5S5e/9v45ui7a0nFHxBzHP3fseR/85O/lo2n6ovnPTYf9B1BhHqqoNo7nospp 2lGxP83u2eg6XLY4S8y8FzLV2KuxV2KtqzKQymhHQ4QVTK1vEkoj7SfgcyIZLVFUyxLqYq6mKupi rqYq6mKupirqYq6mKupirqYqpzTRwrVzv2Hc5GUgEJXPO8zVbYDovhmNKVqpZFXYq7FXYqyj8uPI 1/51812miWtUhc+pfXIFfRtkI9R9++9F8WIyvLkERavurTNNstM06206xiEFnZxJDbxL0VIwFUfc M1JNm0InArsVdirFfPfls6jZ/XrZK3lsvxKOrx9SPmvUZoe3OzvGh4kR64/aP2O47J1vhS4JfTL7 C8wzhnrFyO6OroSrqQVYbEEbgjCCQbCCARRen6bcaX5z8r3Ol6rEsyzRG31CA7VDDZ18K9QR0Ye2 eidkdo+PjB/jjz/X8Xi+0NGcGTb6Ty/U+N/zL/L7U/I3mefSLuslq1ZNOvKUWaAn4W/1h0cdj7Uz qcWQTFuCxTLFdirsVdirsVRlvqDpRZPjXx7jLY5a5qmEU0UoqjA+I7/dmRGQPJV9MKXUxV1MVdTF XUxV1MVdTFXMVUVY0A6k4lUFPqKD4YRyP8x6ZTLL3IS93d2LOase5ygm1W4FdirsVdiqra21xdXM VrbRtNcTuscMSAszuxoqqB1JJxJV9qfkr+WEPkXywEuVVte1ALLqcwoeJH2IFP8ALHX6WqfDNVny 8Z8kPQspV2KuxV2KuxV5v568qG0lfVLJP9EkNbiMf7rcn7Q/yWP3HOM7c7L8MnLAeg8/I/qL1HZP aHGPDn9Q5ef7WHZzbvEdo2r3Wk38d5bnddpEPR0PVTmXo9XPT5BOP9ocfU6aOaBjJmfnbyd5e/M7 yf8AV3YRzislheUBktrim4YeB6OvcfQc9I0GujkiMkOR/FPE6jBLFMxlzfGPmfyxrPljW7nRtYgM F7bGjDqrqfsujftKw3BzewkJCw1JVkldirsVdirsVbBKmoNCOhGFUVFqVwmzUce/X78sGUhUSmqw n7alT7bjLBmCqy39o3+7KfMEZMZIqvF1bH/dq/fh4496VpvbQdZB9FT+rB4ke9Cm+p2y/Zq3yFP1 5E5oqhpNVkO0aBfc7nIHMeioSSaWQ1di3zykyJ5qswK7FXYq7FXYq2ASaDrir6m/5x9/JU6HFF5t 8xQU1iZK6bZSChtY2BBkcH/drqdh+yPc7a/UZ79I5Ie6ZiK7FXYq7FXYq7FWpI0kRo5FDo4KsrCo IOxBBwSiCKPJIJBsPL/N/lCbS5Wu7RS+nOa7bmIk/Zb/ACfA/wCZ4btbsg4Dxw3xn/Y/set7O7SG UcMvr+9i+aJ2yb+XPMd3ot36kfx270E8BOzDxHgw7HNj2f2hPTTsbxPMfjq4Wt0Uc8aP1dCyL8wP y68r/md5ejmDiHUYkb9H6ko+OJuvpSr+0leq9uoz0XRa6M4icDcT+Pm8bmwyxSMZDd8e+bPKOv8A lTWJdI1u2NtdR7qesciHpJE/RlPj9B3zdQmJCw1pNkldirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVXIjyOscal3chURRUknYAAYq+nfyO/ID9FPb+Z/NsIbUhSTT9KcVFueqyzDvJ3Vf2ep+L7 OBn1F7RQ98zDV2KuxV2KuxV2KuxV2KtSRpIjRyKHRwVZWFQQdiCDglEEUeSQSDYedeavIktqXvdL UyW27SWw3dP9X+ZfxGcd2p2GYXPELj3dR7vJ6bs/tYTqGTaXf3sMzmneppoPmG+0a69W3PKFqetb sfhcfwPgcz9D2hk007jy6jvcPV6OGeNS59CzLXvL3kv8zPL5tNQiDsm8ci0W6tZGH2kbfrT/AFW7 53/Z/aUM0eLGfeHkNVpJ4ZVL5975V/Mz8mvNPkW4aadDfaI7Ug1WFTw3OyzLuYn+ex7E5vsWYT97 jsBy5XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FU28teVtf8zarHpeiWb3l5JvxQUVF7vI5oqKP FjkZTERZV9YflJ+Q2i+S1j1TUympeZSKielYbavUQKw+12Mh38OO9ddm1BlsOSHquY6uxV2KuxV2 KuxV2KuxV2KuxV2KsX8x+RrLUi9zZ0tb01JNP3bn/KA6H3GaPtHsSGa5Q9M/sPv/AFu20Xas8Xpl 6ofaHnOpaTqGmzmC9haJ/wBkndWHirDY5xmp0uTDLhmKL0+DUQyi4G1OyvruxuFubSVoZk6Ov6iO hHscjhzzxS4oGpM8uKOSPDIWHoGi+d9L1W3bT9ajjjaZTHIJAGt5VbYhg1QK9w22dj2f2/DJUcno n39D+p5nWdkTh6sfqj9v7XnH5i/84v6RqXq6l5NmTTbt6u2mykm0cnf9045NF8t18OIzq8WrPXd0 z528z+TvM3le++pa9p01jMa8DIKxyAdTHItUce6k5nRmJclSbJK7FXYq7FXYq7FXYq7FXYq7FXYq q21rc3VxHb2sLz3Ep4xQxKXdmPZVWpJxJV7V+Xv/ADjF5j1cx33mqQ6Np5oRZrRryQe43WKv+VVv 8nMXJqgOW6vpTyt5Q8ueVdMXTdCso7O2G7ld3kb+aRzVnb5nMCczI2UJxkVdirsVdirsVdirsVdi rsVdirsVdirsVUbuytLyAwXUSzRN1RxUfMeByrLhhkjwzAIbMeWUDcTRYVrP5aqeUukzce/1aY7f JX/r9+c1rPZzrhPwP6/1/N3um7b6ZB8R+phuoaRqWnScL23eE9AzD4T8mHwn6DnN6jSZcJqcSPx3 u8w6jHlFwIKP0Tzdq+klUjk9a1HW3k3Wn+Seq/RmVou1s2n2BuPcfxs4+q7OxZtyKl3hmMfmXyj5 ks20/WLeIxy7PaXqLJEx6bMw49+9DnWaPt3Dk5ngl5/r/sed1PZOXHuPUPL9TAPNv/OLXk3VOdz5 du5dGuH+JYf96LU132ViJFr7PT2zoserPXd1rx/zJ/zjp+Z+il3hsU1e2U7S2DiRqdv3T8Ja/JTm VHUwPkrzrUdK1PTZzb6jZz2VwOsNxG8T/wDAuFOXAg8lQuFXYq7FXYq7FVyI8jqiKXdjRVUVJJ7A DFWZeXvyc/MrX+DWOg3KQPuLi6Ato6fzBpinIf6tcqlmgOqvWvKn/OJdGSbzVrAIFC1lpw69955R 94Ef05jz1ncEPbPKf5f+TvKcPp6DpcNo5HGS5pzncf5cz8nI9q0zEnklLmVZDkFdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVWyRxyoUkQOjfaVgCD8wcjKIkKIsJjIg2Eg1DyH5eu6skLWsh/ agPEf8Car9wzU6jsLTZOQ4T5fq5Oyw9rZ4czxDzY7efljeLU2d5HIOyyqUP3rzzT5vZqY+iYPv2/ W7LF27E/XEj3b/qQ1tovn3Rj/oYk9MfsxukiH/nmSf1ZTj0faGn+i68iCPl+xtnqtHn+qr8wQfmn Fr5y8x24C6noszAdZY0dNh3oQwP35sMXbGphtlxS94BDhZOzcEv7vIPiQmJ80eWtRh+r6hAyo/WC 8tyyntvs6/fmxxds4Tz4oHzB/Q4U+zMseVS9xSq5/Kz8o9b5N+gdOkJ3Y2qiBt+59AxnNrh1vH9E r+LhzxTh9QISa5/5xr/KaY1j06e2Fa0iupz9H7xpMyBqptaBf/nFr8sWcsH1FAeircJQffGTh/Nz VEQf84yflVGV5213NxFCHuXFdup4cPwwfmpqnWn/AJEflNYkGLy9DIw73Ek09Tt2ld17eGROomeq ss0ry55e0gU0rTLTTxSn+iwRw7f7BVysyJ5lUxyKuxV2KuxV2KuxV2KuxV2KuxV2Kv8A/9k= + + + + + + 1 + False + False + + 119.000000 + 118.999512 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Standard-Farbfeldgruppe + 0 + + + + + + Document + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/Shading<>>>/Thumb 50 0 R/TrimBox[0.0 0.0 119.0 119.0]/Type/Page>> endobj 46 0 obj <>stream +H‰tVËn1 Ýç+òãÚygۂX!„XÀþ +èâ‚Tø‰c'™;s[ZuÆ'3±íL>=ù‡Oìß=y÷â؋tûÛôòç»ûê;&©ÑãõqýóÓ=|øÂþç_÷âÅ3~Û ³øÜ)ùåt]¯[¨Äqêœý–u·P¼¸­fê©íÏ{¥–ãmûĬ¯NÛ¿vžï~g܁ymbóôÃ}ÆB©)ùÜA{âÄpÕ}*T²ˆÂ͗ EÒBwÆW×"•^¤åh¢æâÎøºp­Ô»ŸŽz_Ya'ÚÃN|uƒã„“þðsÎíbU}ÙK¸1±þ€]©(aÈ2ÌÃs Z–2³ EKýøÍ?|yfÿ÷Ù¿ÿ懢ÿë¦^:\æ¦-%í?Í)EJ9[ Q[ˆ^:Ŏ‚V +(z¢ŠÏBœñ²KÉ슈«(F)Õغ8ôk +y᭑öS£°F3k³õìmKò›íIËã‚­ãíy‚rÁ ×nDÇCÎU Œ,6KCûq³ôò¡3EµP‰nҠ̝Ñ"%Pˆ-ÞÔÙ"T-êçjv  ¹ÁWQjý†5%½ãHÊ]QY¹i””1OëꞍލüf¦VúaòÇ»FǬ­S±Í„côåë{zäÒîI‰…ŠWãÀbX¨Zf“ё›ŽB¦ªw„ov,ocáà^²5ãNõM\€ùl/G!’9ac0nGcÅ(eY)˜ª+›{YW±f¥Åƒ¶΁T‰¦¹ „I ¥ ¯Òy‹–_½â¢SÙ(b`€tV¶B¹íáYŠ¯ ó0…Ëќݠi#À= +%ï +žÑî]'«H>.t(™;…YÿÉ]qSñfr¦Þžè½|úMbnííaIµíâ¶QS7¨FØ; Œi€Õç” sÐ6[ãeºóç}6$æêcBU˺̓qõקaU±»'UðåÚ³(TÓ(Í°pÐg‰¬9¼¡‰Î„~Э—㸢I±Ž[­ÖùDoy´ûnß{ÍðÛk†PÑ´ë´Œ¡ÊŠò¢œ¥–úñµŠb‘sYoôßÄ?(ŸÝ?uô­· +endstream endobj 50 0 obj <>stream +8;UT3d0Te-#Xc.2r%d*YWt%"+'N:(9\^ +endstream endobj 51 0 obj [/Indexed/DeviceRGB 255 52 0 R] endobj 52 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 49 0 obj <> endobj 53 0 obj <> endobj 54 0 obj <> endobj 55 0 obj <> endobj 44 0 obj <> endobj 56 0 obj [/View/Design] endobj 57 0 obj <>>> endobj 48 0 obj <> endobj 47 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (Eclipse_with_icon.ai) +%%CreationDate: 6/22/2019 3:20 AM +%%Canvassize: 16383 +%%BoundingBox: 404 366 514 469 +%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentFiles:K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 399.6704 358.1719 518.6704 477.1714 +%AI3_TemplateBox: 639.5 400.5 639.5 400.5 +%AI3_TileBox: 43.1904 129.791 843.8301 705.7915 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: 251.75 551.25 4 1528 954 26 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 60 0 obj <>stream +%%BoundingBox: 404 366 514 469 +%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 +%AI7_Thumbnail: 128 120 8 +%%BeginData: 22957 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FD31FFCFCFC9C9C2FD04C1C8C8CFCAFD6EFFCACFC8C89FC1BAC098 +%C1C1C9C9FD70FFCAC9C2C1C0C1C0C0BAC1C2C9CAFD0BFFA8A87EA87D7E7D +%A87DA8A8A9A8FD58FFCAC9C1C198C09EC198C0C1C9CAFD07FFA8A8535328 +%2821280028002100220021002821282853537E7EFD51FFCFC2C1C0C1C0C1 +%C0C1C0C8CAFD07FF7D772828212800282828212828282128282821282828 +%21282128002828537DA9FD4BFFC9C2BAC098C1C0C198C1C2CFFD05FFA977 +%4C0028002800282128002821280028212800282128002821280028212800 +%280021002853A8A9FD45FFC9C1C0C0C1C1C1C0C1C0C8CAFD05FF7D532128 +%212821282828212828282128282821282828212828282128282821282828 +%212828280028214C53FD42FFC9C198C19EC198C198C09FCFFD04FFA87721 +%220028002821280028212800282128002821280028212800282128002821 +%2800282128002821280028002100537EFD3EFFC2C1C0C1C1C1C0C1C0C1C9 +%FD05FF532800282828272828282728282827282828272828282728282827 +%28282827282828272828282728282827282828272821284CA8FD3AFFC998 +%C0C0C19EC1C0C098C8CFFFFFFFA853002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%2821280028212200537EFD36FFCAC8C0C1C0C1C1C1C0C1C1CFFD04FF7728 +%002821282828212828282128282821282828212828282128282821282828 +%212828282128282821282828212828282128282821282828002853FD34FF +%C9C098C19EC198C198C09FFD04FFA8282100282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%280028212800282128002821280022217DFD31FFC2C1C0C1C1C1C0C1C0C1 +%C9FD04FF7D21282728282827282828272828282728282827282828272828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828280053A8FD2DFFCF9FC0C0C19EC1C0C198C1C9FFFFFFA828 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%0028212800287DFD2BFFCFC1C1C0C1C1C1C0C1C0C1CAFFFFFF7D28212821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%282828002853FD29FFC998C19EC198C19EC198C1CAFFFFFF522100282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%00282128002128A9FD26FFC9C0C1C1C1C0C1C1C1C0C8FD04FF4C28212828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827FD0428A9FD24FFC9BAC19EC1C0C19EC1BAC2FFFFFFA92828 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800A8FD22FFC9C0C1C1C1C0C1C1C1BAC8 +%FD04FF282821282828212828282128282821282828212828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%28212828282128282821282828212828282128282800A2FD20FFC998C198 +%C19EC198C198C1CAFFFFA921282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%28007EFD1EFFCFC0C1C0C1C1C1C0C1C0C1CFFFFFFFFD0428272828282728 +%282827282828272828282728282827282828272828282728282827282828 +%272828282728282827282828272828282728282827282828272828282728 +%28282728282827FD052800A8FD1CFFCF9EC1C0C19EC1C0C198C1CAFFFFFF +%282100282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%21280028212800282128002821280028212800282128002800A8FD1BFFC1 +%C1C0C1C1C1C0C1C0C1C9FFFFFFFD04282128282821282828212828282128 +%282821282828212828282128282821282828212828282128282821282828 +%212828282128282821282828212828282128282821282828212828282128 +%282821282828212828A9FD19FF9FC09EC198C19EC198C0C8FFFFFF520000 +%282128002821280028212800282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%2821280028212800282128002821280028212800282128002827FD18FFC9 +%C1C1C1C0C1C1C1C0C1C2FFFFFF7D28212828282728282827282828272828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%28272828282728282827FD0428FD16FFCAC198C1C0C19EC1C0C09EFFFFFF +%7E2821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212153FD15FFC8C0C1C0C1C1C1C0C1C0CFFFFFA928002828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%28282821282828212828282128282821282828212828287EFD13FFC998C1 +%9EC198C19EC198C8FFFFFF53002800282128002821280028212800282128 +%002800280028002800280028002800280028002800280028002800280028 +%002800280028002800280028002800280028002800280028002800282128 +%00282128002821280028212800280028A8FD11FFCFC0C1C1C1C0C1C1C1C0 +%C1CFFFFFA800282728282827282828272828282728282827FD3B28272828 +%282728282827282828272828280077FD11FFC1C09EC1C0C19EC1C0C0C9FF +%FFFF212821280028212800282128002821280028212828FFA8A9A8FFA8A9 +%A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FF +%A8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8FF772821280028212800282128 +%002821280028212800A8FD0FFFC9C1C0C1C0C1C1C1C0C1C1FFFFFF532821 +%28282821282828212828282128282821282153FD37FFA800282828212828 +%28212828282128282821FD0428FD0FFFC198C19EC198C19EC198CAFFFF7E +%2800280028212800282128002821280028212800284CFD37FF7D21002821 +%280028212800282128002821280028210053FD0DFFC9C0C1C1C1C0C1C1C1 +%C0C8FFFFFF5321282728282827282828272828282728282827282153FD37 +%FFA800282828272828282728282827282828272828282128A8FD0CFFC1C0 +%9EC1C0C19EC1C0C0C9FFFFA8002821280028212800282128002821280028 +%2128002852FD37FF7D220028212800282128002821280028212800282128 +%007DFD0BFFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828212828282128282821 +%28282821282828212828280053FD37FFA821282128282821282828212828 +%28212828282128282821FD0BFFC198C19EC198C19EC198CAFFFF7D280028 +%00282128002821280028212800282128002821214CFD06FFA87EA87EA87E +%A87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87E +%A87EA87EA87EA8A8FD05FF7D280028002821280028212800282128002821 +%280028212152FD09FFCFC0C1C1C1C0C1C1C1C0C8FFFFFF53212827282828 +%272828282728282827282828272828280053FD06FF522828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%28212828FD06FFA821282728282827282828272828282728282827282828 +%2128A9FD08FFC1C09EC1C0C19EC1C0C0C9FFFFA800282128002821280028 +%21280028212800282128002821224CFD06FF530028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%28A8FD05FF7D282128002821280028212800282128002821280028212800 +%7DFD07FFCAC1C0C1C0C1C1C1C0C1C1FFFFFF532821282828212828282128 +%2828212828282128282821282153FD06FF53282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%FD06FFA8002828282128282821282828212828282128282821FD0428FD07 +%FFC998C19EC198C19EC198C8FFFFA8280028002821280028212800282128 +%002821280028212800284CFD06FF53002800280028002821280028212800 +%282128002821280028212800282128002821280028002800280028A8FD05 +%FF7D210028212800282128002821280028212800282128002800217DFD06 +%FFFD04C1C0C1C1C1C0C1CAFFFFA800282728282827282828272828282728 +%28282728282827282153FD06FF532827282153FD04282728282827282828 +%2728282827282828272828282728282827282853FD0528FD06FFA8002828 +%2827282828272828282728282827282828272828280077FD05FFCAC198C1 +%C0C19EC1C0C19FFFFFFF4C28212800282128002821280028212800282128 +%00282128002852FD06FF530028002877FF21282128002821280028212800 +%282128002821280028212800282128007EA82800282128A8FD05FF7D2100 +%282128002821280028212800282128002821280028212821FD05FFC9C0C1 +%C0C1C1C1C0C1C0C8FFFFA828002821282128212821282128212821282128 +%2128212821280053FD06FF52282828007DFFA80028282821282828212828 +%2821282828212828282128282821280077FFA92128212828FD06FFA80028 +%2128212821282128212821282128212821282128212821227DFD04FF9FC0 +%9EC198C19EC198C0C9FFFFFF7EA87EA87EA87EA87EA87EA87EA87EA87EA8 +%7EA87EA87EA87EA8A8FD06FF530028212152FFFF7E002821280028212800 +%2821280028212800282128002821280053FFFF7E2800280028A8FD05FFA8 +%A87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA8FFFFFF +%CFC1C0C1C0C1C1C1C0C1C1FD25FF52282828007DFFFFFF7E002827282828 +%272828282728282827282828272828280053FFFFFFA92828272828FD25FF +%CA98C1C0C19EC1C0C198C8FD25FF530028212153FD04FF7D002800282128 +%00282128002821280028212800280028A8FFFFFF7E2821280028A8FD21FF +%A8FFFFC8C0C0C1C1C1C0C1C1C0C8FD25FF53282128007DFD05FF53002821 +%2828282128282821282828212828280028A8FD04FFA82128282821FD25FF +%C898C198C19EC198C198C9FFFFA8FD22FF530028002253FD05FFA8520028 +%002821280028212800282128002800227DFD05FF7E2800280028A8FD21FF +%A8FFFFC1C1C0C1C1C1C0C1C0C1CAFD25FF53282728007DFD07FF4C002828 +%282728282827282828272828287DFD06FFA821FD0428FD24FFCAC1C0C19E +%C1C0C19EC1C1FFFFFFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8 +%A9A8FFA8A9A8FFA8A9A8FFA8A9A8530028002853FD07FFA8280028212800 +%2821280028212800284CFD07FFA828002821287EFFA8A9A8FFA8A9A8FFA8 +%A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8FFCFC0C1C1C1 +%C0C1C1C1C0C8FFFFFF4C2828212828282128282821282828212828282128 +%282821282828212828282128282821282828007DFD08FFA8280028282821 +%282828212828280053FD07FFA82128212828282128282821282828212828 +%2821282828212828282128282821282828212828282128A8C8C098C19EC1 +%98C19EC0A0FFFFA800280028002800280028002800280028002800280028 +%00280028002800280028002800280028212153FD09FF7D21002821280028 +%212800284C4C28FD07FF7E28002800280028002800280028002800280028 +%0028002800280028002800280028002800280028007EC9C0C1C1C1C0C1C1 +%C1C0C9FFFFA228282827282828272828282728282827FD1728007DFD0AFF +%7DFD0A28FF5253FD07FFA9FD1A28272828282728282827282828272853C1 +%C09EC1C0C19EC1C0C0C9FFFF7E0028212800282128002821280028212800 +%282128212821282128212821282128212821282128212253FD0BFF522821 +%282128212821FFFF5228FD07FF7E28212821282128212821282128212821 +%28212821282128002821280028212800282128002821280053C8C0C1C0C1 +%C1C1C0C1C0CFFFFF7D222128282821282828212828282128282821282828 +%222828282228282822282828222828282228007DFD0CFF4C282828222828 +%A8FFFF5253FD07FFA8212828282228282822282828222828282228282821 +%28282821282828212828282128282821FD04289FC19EC198C19EC198C1C9 +%FFFF53002100220021002200210022002100220021002800220028002200 +%2800220028002200282128002853FD0DFF2828212800A8FFFFFF5328FD07 +%FFA228002821280022002200280022002800220028002200220021002200 +%21002200210022002100220028C1C1C1C0C1C1C1C0C1C1FFFFFF7E7D537D +%537D537D537D537D537D537D537D537E537D537D537D537D537D537D537D +%537EFD0428217DFD0EFF2828217EFD04FF5253FD07FFA822FD04287D777D +%537D537D537D537D537D537D537D537D537D537D537D537D537D537D537D +%537D539EC1C0C19EC1C0C198C1CAFFA8FD24FF530028212853FD05FFA87E +%FD07FFA92228A8FD04FF534CFD07FFA82800282128A8FD23FFC1C0C1C1C1 +%C0C1C1C1C0FFFFFFA8FD23FF52282828007DFD06FF22A8FD07FFA822A8FD +%04FF4C53FD07FFA9FD0528FD24FF9EC198C19EC198C19EC1CAFFA9FD24FF +%530028212253FD05FFA82800A8FD06FF7E287EFD04FF5328FD07FF7E2821 +%280028A8FD23FFC1C0C1C1C1C0FD04C1FFFFFFA8FD23FF53282828007EFD +%06FF282828FD06FFA928A8FD04FF4C53FD07FFA9FD0528FD24FFC0C19EC1 +%C0C19EC1C0C1CAFD26FF530028222253FD06FF28002828FD05FF7E28A2FD +%04FF5328FD07FF7E2822282128A8FD23FFC1C1C1C0C1C1C1C0C1C1FFFFFF +%A9FD23FF53282828227DFD06FFFD04284CFD04FFA822A9FD04FF5253FD07 +%FFA822FD0428FD24FF98C19EC198C19EC198C1CAFFFF7D284C2852284C28 +%52284C2852284C2852284C2853284C2853284C2853284C28532852282822 +%28212853FD05FFA8282128212852FFFFFF7E287EFD04FF5328FD07FFA228 +%002822282853284C2853284C2853284C2853284C2853284C2852284C2852 +%284C2852284C2852284CC8C0C1C0C1C1C1C0C1C0CFFFFF53222128212821 +%28212821282128212821282128282822282828222828282228282822FD05 +%28227DFD06FFFD062853FFFFA822A9FD04FF5353FD07FFA9FD0828222828 +%282228282822282828222828282128212821282128212821282128212828 +%9FC1C0C19EC1C0C198C1C9FFFF7E00280028212800282128002821280028 +%21282228282822282828222828282228282822282828222853FD05FFA828 +%2228222822287DFFA8287EFD04FF534CFD07FFA828222828282228282822 +%282828222828282228282822282128002821280028212800282128002800 +%52C8C0C1C1C1C0C1C1C1BAC9FFFF7D282828212828282128282821282828 +%21FD1728007EFD06FFFD0828A8FF28A8FD04FF4C53FD07FFA9FD1A282128 +%28282128282821282828212853C2C098C19EC198C19EC0A0FFFFA8002821 +%280028212800282128002821280028222822282228222822282228222822 +%2822282228222853FD05FFA828002822282228222853287EFD04FF5328FD +%07FF7E282228222822282228222822282228222822282228222800282128 +%002821280028212800282128007DC9C0C1C1C1C0C1C1C1C0C9FFFFA82821 +%2821282828212828282128282821FD14284D2828227EFD06FFFD05284DFD +%0528A9FD04FF5353FD07FFA92828284DFD12282128282821282828212828 +%282128282821287DC9C098C1C0C19EC1C0C09FFFFFFFFD04282728282827 +%2828282728282827FD13282228282853FD06FF2822282828222828282228 +%A8FD04FF5328FD07FFA228222822FD132821282828272828282728282827 +%28282821A8FFC1C1C0C1C1C1C0C1C0C1CFFD25FF53282828227DFD06FFFD +%0B28A9FD04FF5353FD07FFA8FD0528FD24FFCAC198C198C19EC198C19ECF +%FFFFCBFD22FF530128222853FD05FFA828222822282228222822287EFD04 +%FF534CFD07FFA22822282228A8FD24FFC2C1C0C1C1C1C0C1C1C1C9FD25FF +%5328284D227EFD06FF2828284D2828284D282828A9FD04FF5353FD07FFA9 +%2829282828FD25FFC9BAC19EC1C0C19EC1BAC8FFFFA8FD22FF5322282228 +%53FD05FFA84D22282228282822282828A2FD04FF534CFD07FFA828222828 +%28A8FD24FFC9C1C0C1C0C1C1C1C0C1C1FD25FF53282828227EFD06FFFD05 +%284D2828282928A8FD04FF4D53FD07FFA92828282928FD26FF9EC19EC198 +%C19EC198C1CAFFA8FD22FF530128282853FD05FFA9282228282822282828 +%2228A8FD04FF5328FD07FF7E2822282228A8FD21FFA8FFFFFFC8C0C1C0C1 +%C1C1C0C1C0C9FFFFA87E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7E7E +%7DA27E7E7DA8FD06FF53282829227EFD06FF28292829284D2829284D28A9 +%FD04FF5353FD07FFA92829284D28FD07FF7D7E7DA27E7E7D7E7D7E7D7E7D +%7E7D7E7D7E7D7E7D7E7D7E7D7EA2FD04FFC9C0C0C19EC1C0C19EC0C2FFFF +%FF00000022002100220021002200210022002100282228012801224CFD06 +%FF5322FD042877FD05532822FD072822284DFD04532828FD07534C282828 +%2228A8FD05FF7D2201280128012800220021002200210022002100220021 +%0022007EFD05FFC0C1C1C1C0C1C1C1C0C1CFFFFF53002821282828212828 +%282128282821282828224D2829284D2877FD06FF5328284D282822282828 +%22282829284D2829284D282928292828222828282228282822FD04284D28 +%2828FD06FFA8224D2829284D282821282828212828282128282821282828 +%2128FD06FFC298C19EC198C19EC198C9FFFF7D2200280028212800282128 +%002821280028212822282828222853FD06FF532228222828282228282822 +%282828222828282228282822282828222828282228282822282828222822 +%28A8FD05FF7E282228282822282128002821280028212800282128002821 +%2152FD06FFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828272828282728282827 +%282828272828282128284D284D2877FD06FF5328284D2829284D2829284D +%2829284D2829284D2829284D2829284D2829284D2829284D2829284D2829 +%28FD06FFA8284D284DFD04282728282827282828272828282728282800A8 +%FD07FF9EC1C0C19EC1C0C198C1CAFFFF7D00280028212800282128002821 +%280028212800FD052853FD06FFA9A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8 +%A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2A8A8A8A2FD04A8FD05FF7E +%28282928280028212800282128002821280028212800280028FD08FFC8BA +%C1C1C1C0C1C1C1BAC9FFFFA8282828212828282128282821282828212828 +%28212828292277FD37FFA82829284D282821282828212828282128282821 +%28282821287DFD08FFCAC098C19EC198C19EC09FFFFFFF4C222128002821 +%280028212800282128002821280028282853FD37FF7D2828280028212800 +%28212800282128002821280028212821FD0AFFFD04C1C0C1C1C1C0C1C9FF +%FFA82128272828282728282827282828272828282728284D287EFD37FFA8 +%284DFD042827282828272828282728282827282828007EFD0AFFCA98C1C0 +%C19EC1C0C198C2FFFFFF5300280028212800282128002821280028212800 +%28282853FD37FF7E29282800282128002821280028212800282128002800 +%28A8FD0BFFC2C0C1C1C1C0C1C1C1BACFFFFFA22828282128282821282828 +%212828282128282821282277FD37FFA82228282821282828212828282128 +%282821282828212877FD0CFFC9C098C19EC198C19EC09FFFFFFF28222128 +%00282128002821280028212800282128002828A8A2A8A8A87EA8A8A87EA8 +%A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A87EA8A8A8 +%7EA8A8A87EA8A8A87EA8A8A87EA953280028212800282128002821280028 +%21280028212821FD0EFFFD04C1C0C1C1C1C0C1C9FFFFFF28282728282827 +%282828272828282728282827FD04284D284D284D284D284D284D284D284D +%284D284D284D284D284D284D284D284D284D284D284D284D284D284D284D +%284D284D284D284D28282128282827282828272828282728282827282828 +%007EFD0EFFCF98C1C0C19EC1C0C198C1CFFFFF7D00280028212800282128 +%002821280028212800282128222928292829282928292829282928292829 +%282928292829282928292829282928292829282928292829282928292829 +%28292829222821280028212800282128002821280028212800280028FD10 +%FFC8BAC1C1C1C0C1C1C1BAC9FFFFFF4C2128212828282128282821282828 +%2128282821FD04284D284D284D284D284D284D284D284D284D284D284D28 +%4D284D284D284D284D284D284D284D284D284D284D284D284D284D282821 +%282828212828282128282821282828212828282128A8FD10FFCAC198C19E +%C198C19EC198CFFFFF7D2800280028212800282128002821280028212800 +%282128002828292829282928292829282928292829282928292829282928 +%292829282928292829282928292829282928292829212800280028212800 +%28212800282128002821280028212152FD12FFC9C1C1C1C0C1C1C1C0C1C1 +%FFFFFF53FD05282728282827282828272828282728282827FD04284D284D +%284D284D284D284D284D284D284D284D284D284D284D284D284D284D284D +%284D284D284D284D294DFD04282728282827282828272828282728282827 +%FD0428FD14FF9FC0C0C19EC1C0C19EC0C9FFFFFF28220028212800282128 +%00282128002821280028212800282128284D2829284D2829284D2829284D +%2829284D2829284D2829284D2829284D2829284D2829284D282928282128 +%0028212800282128002821280028212800282128002800A8FD15FFC0C1C1 +%C1C0C1C1C1C0C1CAFFFFA921282128282821282828212828282128282821 +%28282821FD04284D294D284D284D284D284D284D284D284D284D284D284D +%284D284D284D284D284D284D284D28282128282821282828212828282128 +%28282128282821282828007EFD16FFC998C19EC198C19EC198C1FFFFFF7E +%002800282128002821280028212800282128002821280028212800282829 +%28292829282928292829282928292829282928292829282928292829284D +%282800280028002821280028212800282128002821280028212800280053 +%FD18FFC9C0C1C0C1C1C1C0C1C0C8FFFFFF7D002828282728282827282828 +%27282828272828282728282827FD04284D294D2953294D2853294D285329 +%4D2853294D2853294D2853294D284D282821282828272828282728282827 +%282828272828282728282827282152FD1AFFC8BAC19EC1C0C19EC1BAC9FF +%FFFF53002821280028212800282128002821280028212800282128002821 +%2800FD04284D2829284D2829284D2829284D2829284D2829282928280028 +%21280028212800282128002821280028212800282128002821280028A8FD +%1AFFCFC1C0C1C0C1C1C1C0C1C0CFFFFFFF52002828282128282821282828 +%2128282821282828212828282128282821FD042829284D284D294D284D29 +%4D284D294D284D2828212828282128282821282828212828282128282821 +%2828282128282821282128A8FD1CFFCAC198C198C19EC198C19ECFFFFFA8 +%280028212800282128002821280028212800282128002821280028212800 +%280028002821280028222822282228002821280028002800282128002821 +%28002821280028212800282128002821280028212800287EFD1EFFCAC1C0 +%C1C1C1C0FD04C1FFFFFFA84C002827282828272828282728282827282828 +%272828282728282827282828272828282128282821282828212828282728 +%282827282828272828282728282827282828272828282728282827282828 +%2128A2FD20FFC9C098C1C0C19EC1C0C09EFFFFFFA8520028002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002800287DFD22FFC9C1C0C1C1C1C0FD04C1FFFFFFA95300 +%282128282821282828212828282128282821282828212828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828280028A8FD24FFC9C198C19EC198C19EC09E +%FFFFFFA85300280028212800282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%28212800282128002821280028212800280028A8FD26FFCAC1C0C1C0C1C1 +%C1C0C1C1CFFFFFFF7D002828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827282828272828282728282827280053FD29FFCAC1BAC19EC1 +%C0C19EC1C0CAFFFFFF7E2128212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128007DFD2CFFC8C0C1C0C1C1C1 +%C0C1C0C9FD04FF2828212821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%2828282128282821282828212828A8FD2EFFC998C098C19EC198C198C8CA +%FFFFFF532800280028212800282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%2821280028002128FD31FFCFFD04C1C0C1C1C1C0C8CFFFFFFFA853002828 +%282728282827282828272828282728282827282828272828282728282827 +%2828282728282827282828272828282728282827282828272800287EFD34 +%FFA0C0C0C19EC1C0C198C1C9FD04FF7E2722002800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282121007DA8FD36FFC9C1C0C1C0C1C1C1C0C1C1CF +%FD04FF532800282128282821282828212828282128282821282828212828 +%28212828282128282821282828212828282128282821282828002853A9FD +%39FFCAC99EC098C19EC198C098C9CAFFFFFFA87D21210028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002100537EFD3EFFC2C1C0C1C0C1C1C1C0C7C9FD05FF7D53 +%002821282828272828282728282827282828272828282728282827282828 +%272828282728282827282828002853A9FD41FFC9C8C0C098C1C0C198C0C1 +%CAFD04FFA8A8522800280028002821280028212800282128002821280028 +%21280028212800282128002821280028287EA8FD45FFCFC8C1BAC1C0C1C0 +%C1C0C8C9FD05FFA87E522821280028282821282828212828282128282821 +%28282821282828212821280028287EA8FD4AFFCAC99FC198C098C198C09F +%C9CAFD05FFA8A8534C002800210028002800280028002800280028002800 +%220022004C527EA8FD50FFCAC9C1C1C0C1C0C1C0C1C2CFFD08FFA87E5353 +%FD06280028212821FD042853537E7EFD58FFC9C9C1C198C0BAC098C1C2CA +%CAFD09FFA8A9A8A87E7E7DA27EA8A2CBA8FD60FFCFCFC8C8C1C1C0C0BAC1 +%C1C9CAFD78FFCACAA7C9C2C29FC1C1C8A0CACFFD40FFFF +%%EndData + +endstream endobj 61 0 obj <>stream +%AI12_CompressedDataxœì½×vúȳ0z®g-¿8ƒDNÆD 6Ø`œˆ`‚°$&]|Osžá»:wûÅNw+ %Âoïùï5ãõó`Ԫꮮ®ÔUÝÎv'XÑ* aŽ“ß..Ê Er4“q ¯׋ņåø•çÁëÀ! ¶*^§úBËÅ°3z•AÏBQø”€ï{ÊSfÆr3rå ¨%häux¼ðiwÆ-(ð¼:\ÌÖ,ÕÿcÆMû³!½ +‘3¯Ô²Br ]"‰„#žvD3ÌQ¼EMÈÕï$ËÎþ¦ Þh +¡-ћÕh¶š”è?3ŽsD G9b‰4|^Ÿ=P¬¶Q(žÄ¢°e(žHÅ@óh(™Äâàø‹Á+ôp³¤V\›¡‡˖éÍ°Gù/0¶[ržŽj± ÿp”äp®|‡ WhKl¸ C–ºÁ:Eþþ—²ÁE¨‘e3b¶ ØL#ó.í‰fæìšRï+Š -é C²³eh½ØLf«Ð€!Ñ(ßòþ¾ú)Üÿc:ã(@g¹xïC `²–$çÀ#hf‹×x¤_ÚÌ£»Ír@yL¤qô}´ÆýȂƒ±ÃÏèûdÿz ¾êP‚1 y¨•”ÔߢÏ[L02sjõá!3ô~ގ¦Ó¡DN^<“`ÚãxŠÿ&–LÂobÂK]j¹^A3™ˆ¦C`Ò0 üV|›‚qò ái +¤CÉ4îH/RQ w€)‡_ˆ/È3Ný>£þÈ8îè%­Èpžñbÿ[xô°YPÌãj§2¾KóT»¥GÔ¼!ƒ $"úÁåßB‹.ÉL(ð+½Øphy¥$,`fšä_dA\@ÒZS«.ÝC]ÄñP2ÿEx<’r¤ã1G$ÐÄ&H‡_F3Š#fa$<€ðŒ…‡†¡VÿÀ‰ð€¡Áʐ`qã‰TXlÒ뿘ÌhL-g«Ù +¼žŒ„ýgCr±¢¹ðô¯õ”Z…0,5 +/É!ì +˜¤0N,xsƹ?hvˆ6£™07e(Jú‹n8*¼Ü8ðT4Œ¾ Áü#hCj4[,H ,Gé С%É7 Ô£T +>üِ x~œ’‹1Cø’uàéH¸ˆø€*ò‹ŠÙ,òô-J£/„‹ÕpYèB¸Š^WÑËJUñzUzïšouÍ£¸V´¹–ÚT¹iø!`Zü -þ…–â…ߧ–ôÞr³àfëÅ_Ề<ñ(è‘ùQñò£ôÖ ÿ°;¥À-P¯«±a’GLŠã!o“4ÕՐ† +6ãè«uö– + kZ„5/ð‚¸ûz‚ ™&Âvt™ Õýk-*„¸zÒäçЊº[£g©~éýCoÖ׫1}ò›‡·ßzÔØh@]­Á7øXawäp:¡þ¦fÃ)°(ÖQ¤ßKm°öZœ¡üSð.úü ÿoçý +5†‡ €ÿ¶þMƀ¼[_,åþ^Ò£Í<­®~§ôšrnu<‘ÌÚŠö‚\‘Œ=1(á:®¡X!çÜìwǒHA£æ èˆ6 èk &k@5ôj£ÆfÖ@ñÈ*’›ë¨V‚^„ª Ìâf5Ù¢ßÞøÎ_˽˜±K ¸òé³Íž²®Z+¾Ë̆:º4½ ßn rXÏV,µÐôFü{ÿ(DRc=$pñüG (“À”bq= õ°4„ç㥋Ìà}[Ü5DS¥‡µ³¦þž‘ ]ŒÛ¯ý㐠<è*ÈN!`Ú¦óÉ §Žæ øľ²X­p²Ç³Õt´³¾œ„ÊŠ¥¸¿9  x…b¼@(^ÁÇ¡®Qª“`Ø|ŽÒJ©nj Ôú+ø돫¹zd"| H÷k Ï"ŽÒ⹓ߪÑj üÄÁO¢š¬¦À¿4ø?Åj ý+UË观~àÁÂŽþáDü—ˆ‚ÿGù¿ä'¿å>Ô:‚ZD‰úIq" ~D +üNƒßiéwQø”BŸŠèw üÿŸEx"¶Þñái¼„—ñ*è‰Db‘D$IGŠ‘r¤ +:G#ÑX4…qŠt´-E+€ x,‹Åâ±D,KÅÒ±ø©€ŸjxWq,ܶx4‹Çã‰x2žŠ§ãEÃ@,~’X +KcEðSÂÊX Ã#xã è<ãEЯ +^`‘h$Žú%÷* +zûàFË GêQô¦+óýàñ&ÀèL þ^-#`x ƒ$Ž‚ cª(e0ºcŒ4~’à'~ÀPàk'èÀºÅ¢œ$Лj¤~Ê"¾­·à{èMð£|S~¼ ~Jৈ~Òà'~’ðçä70ò?ü]‡€À"¾T*•L%RñT t9’ÂS`•j²’,'KÉb2L%“ÉD2žŒŽE’xK‰J¢œ(%Š‰t"•H&‰8 Q ÁpþÀì•x9^ŠÁÌ¥À &âq„/æ¸è—´4€;K&ãQèƒÉ$øG"ô”á@“ÀM+ƒßàˆ +ðÿ!üìtçQ³Ömÿˆ K,ì!¤M:ÁÅà”‚X:Çá7žHFbàC$™ŠEqøj€q 8LÑÁcA„ý+UdQ&Š*sk9j_ÀéI·EÛ¿¢í_Ñöß'ÚRÉPäè =¦x‹BGq0Çè<|€ÁÿG>5vd€,RiG xc´™qöh +Ž}'Š›Ó‚;e$HêõòÈRÕß©Uk42¦—ùˆÑžæ‡Œàí1fÅXe¦ƒ‚Y"RC”ÏÅ?D ôe½ê$\)ñ;³åz!K|ÌÑâ /¦qáŽg~³Ã¬áü¬¡ýn{=Šü«ƒ~Âÿ‡uP(`ýÿBEÔNW3ŽC{”ŽÌÞùWý«ŽþUG–ê(òOQGÑ_.üÿÇV1ö¿Š­—ö·ôŽ(ªþÇWñ?ƨŒý»Šÿ“Wñžýß´Šÿ§uñXH«Ɍ>öq áԆ’q,cœ‰d:‘Š¢X$‚"£žˆ‰†¿¸¿Ö”ðØãZ±ýßI†Í*<[eÛßÉÅFj ° á.§ÐNè «þó?žTÀ¡ìPiAç0ÈbƒLbÓÀ?b€ƒ*ÁÅí ðL‡âîÐhl TÙü˜Lq8Qps¢Ø#ŌúÙÖÊ°3Óÿ㌰»PÈün_,À¶ÿ †‡ã¢Xã?@üýRÍ°$4¸ ëÐ>§þw¬СZþw-evüÇ?€¿ÿ$9»˜ ÿ÷ˆqK‡"w% ‡ýÇlÄMmÍ»Ðò!½q,†—À-‡7¥à)¶Æ'6ýG P:âÅj€ÙÛ_ÿaIGØX ëO{¢è2,i£Òp<š–F“sü±$¶†·ýÒ?ƨ@Ò²Co˜!…Î(úgX@Ùý#ú±¤8rÌ­#t&}pgÎFBÌÄÏ)Zó¯c! ýç?(Àtzµ><{§Dÿùü"¼ ¥§1ôºÈP$³×³ ´Ë4™ŽãüÙI)…R‘”°Á6þÑh=èÌ"Õjñ [ò·$3»~=DYˆ«ÙŒSì´Â•ôG»ø |%ß$è$wáZté;ߝ6ÍÎàÐãˆ(»ÅC¡Ä# ìƒÀåAñåš-2܀&™Q…“›…ڍ'Mlƒ¨+’ZKÞ¨”.±&G#-¢%ÉÎeªðß±kšÓ¶#3QÖ$E©8ZÏB¢€¾Ò Ffªâµ£¸áhÇ 8˜ýMi¡¯qÜ!ržc¾¢‡szÃ9&|Õ¹YÛKÃcµº“1T­ÓŽ5¹¦;[nè¨6Í:‡MH‚Ž!<K#õaŽ!Wìšäš0³‘ƒ•ÇS§S†Ðлí¶†’V¿ecFŠ %âñhܸ)®ìƒe[e,Ë}@‡ÛIMÅX-ü]G&®šÊ6C±ó;åèRrèØr0[Ì8‘‘=o·3Ž˞L4^ü×ÿe7«ÉÇöºFÀ¤ø0:[Ë!ÜfaáÊÅ—Yá°n)v*1(b‡| ™¸²1Õ+­ ·\jñ&d»Mr5ِÊÑ¦× +NÆED +ѧ8‚ždÖ¢„„ šfzäjÆNÐ  ˜Š;RQHªB¾º [kr(«€XÜ´1A)tº”es8µ[­S†]¶- &0-9ÅüìƖpYˆæ Ú£© ©e[;$E Õ$ÀìʾE$Ác&ë_É!ñT:…›´UŒHiÈ%ìM®¸™˜—¤ÄÔÉtú±TJãs@ßøueÄƓk<‚9¢ßúI¿‚ –7$Vbžžªà}ؙ&äé«fÉbFÇc–’„“!ÓC­SN:'͕ùÚSi¨¨a[Vaԙ@…ãRÓ Ïô£Wª©ÅSI#FD„ÐÈ*]é ü tä&‹2X›­9`“Š FCÀ0‹Äb@±%„ú¼&yÒ,ò¸M2Àú„Gz¶+Ì:‚AeéŠ\¦j[](xp,<¹Aýe +eàñ©[>ŽªÙÓt6œnƒ”[UëÎf¸ ùüE™üF¶—34>çV†’<@@©J·¢‘DàKñ,I3 ž ¼¥lR¼ ÄÛà"ÏÊՕ2=À#8¢&=Tz„"Ô&€&úÔ×b?5~È{4‘=… qg×ÌíP‹?èC¹W„rO¹Ò@ËP÷—Ýÿ Òý[m[ïv 9]Õ¬+³xRöóø6xWˆ¨ñ"ºÍ™QXïð‚ð§¶åhç)Íü-.ƒfka{Ĕ1âIȜ…FbšÂÜÕ6c¡ç'A³lø»ÅHÙáz1üËDŒñ†«­h¶¼å‡Á(Á”-ȵ r Í°ž,ç!js£LÅ5lÆJ•–¼ŒÚóò]±Xì¼Vk ÅÎ(ªŽ·Ú‰5 Òï< õ‡ ½¶jíª°¬Úñ÷N0Vk…Ç ·Z$ÚM©< #•JÉFkN9.«ÆJ¥¤¯`stEŽ¦'6ZË=±ÑXÙ½•5^q¡ÑÂB"òÖ̘^™ŠC؎ΰћ- ÷wÊÌXM3h=šM:ZQR±snÐj¸åñ6ziemQXBŠýè3b§ä^?aèiQ‘ÎPl¸kZjš%õ´ÁŸë:NÅôð‚f £ÝƒC{}zM'[M  +*Sқ[¹!f²hº˜™IÐÆDIµŸkВ^Í$jÁšM?j1Úèû®æ ðÌXÊ5oVC3®á a‰s,4z‰\­¤¼}÷5³ô>†K¥­å)ÓÀW9ˆVí¡M;Þ=ם–$bÉ`$Á°Ø»×Â\«Pi;ꙣ tèT›RzÄ=©áò/3\ђ榖9o®ê­+¡rLlHvU{]1ª¿a© +=,Á?õù¢ø¦Ò•W†wâòÞ|{ö'µhS̘rJ"îüóñ.ñ5tË Ÿ=`š/À¿Õ„Á£"ÿ…2¶ÞRãâƒD;#ã_³môh[&+Һ͔þ£>m…ö:½::FBÐ]_úñZ>Íéäù€p|ü#Ú@„¾áèÅhG-ÀUD–•Ÿ·cʓ±.vþ‚?ÛQ"Åe•ÁcGŒÀdÆÚ¢/® “e 6…çÖ¬­Zâ°%º#°$£@m¥à¦¶¨§€cÍä•Ø– Yî‰À Z)Ø1£XP”#X)‘¢@R²H or ¨ÙÞ«2Ná'à!Å(o Â[<á.$ëX‚zŽ–CÈÑ£˜?¨Õ€èàK9ªJÐx.=uðpØõý¿°”{¶R"qÐ#þ;ˆ~ Ù_ô†’˥ãðöß!G)ä¸^UP„ôšd@ρ¢s,ÿëÿ§ð‚ÿ^Mþëÿ[p³ %ötˆýûj8G ø®lVj4̘ãBæl&²@?dfk+A¯š¿ ‹\f"Þp-2fN¯ØúšÀÄNS÷GՍ’R}X7ubSx«äµ¹g'6í2³¥²Ç¤@dYÕvo›²C¥k)ï–kbØ/>½ <æ/“ g’µéÅL +gèÛàbooé=œ2ô(ç?V|Ú¶º3£¸`›(VL[&×|šàŒ²Cc¡ÿ׫!„Ò1ƒ0xÑz÷X׎‘D +T`ô€Çÿ ™yÉʤßÊþ/ÅVîý†Tl8eöóõ}!•pßs¶ô¦»1“òÖÌæ¡åO€ÛšžÝ¨¬X1ӑÂÞÊýD×´äp+¬0-í¤Šîã@Iʍg;˜}†6CÊ>a5u +¾Q’Þ”ßvŸr»©iöt Ï»ð¬î½ª–›g’G²Ø×Bj’©—Z$b ]u¨¶Å?1[ Å`ºlˆÄ␡$Ç_{¼‘d¥g>PHØéN3¼¥NÄ.Ä-YދÝQؕڊ¨^ÐNi“hsr¬ä´¾¤3ՊrB ʧ±EˆÊÞø­Y +¹½]͆±=ÍÓ¬«¨r°CHe`^v§›å`Eά 1¥Ñn +²tÐ4IÐÔ^ã÷¾¡¦pðl²ëžÿëÎöιÂl +iÏMÓ¾¡Ò|ûÉN‹­‰úDí",uù= ý +Á+«²ä£Šžpi&zÁÅNùú:¯PpDèiìªåzóçž.ÝYò9puµ‚¥S[N3“•ó†p<îòŒ ±ç‰Çz5q–)<Öò·±«LóÝ}[`6Ã$QÜ¦.ðXì ÃØÊweÀÎ Ùϐ¯ ¬Ùۈ„šB¶édÄV7\iR¿or1ªSž]懕PÈ=ÙÂÕ½„É +q‘I¾Ö¸Ê÷G)ö —t“-^w¸©?Ÿ8Û•ØùSé{á~h*cìf  í<™'{÷oïÅn9Ô3ƪl—ù(äæÄG!ƖþJàbCxj£1@ƒèE|y¯Œ?ž’¥Eañœ—¦\yš|ÅUùrU†x󧐻r?ñ€@§Ùòçä“Ÿ\?•ëѵ³L}Ÿ;Á³߉gr´hÒßÿ°:Œß{ÊÓX?›+^D]þÒ]àË_(»‰2µñå{7gÓìpHÎ᧙¿:nNyÔ8&“Ììü+3û¼•Wî ãß›×€·½™FšD¶÷Q(®†î¥ÿò6N.ß/gÉd˜G‹Ìð÷Ï3¸rX¹a{€rI7•|Šb£Ì¬&Á$㷗ž`€*-’í%?†—æE¡|;{ªÒqxˆWåú-q–O–éO®7zËDgn~u†”OøÎà´¼%ž÷+Hª|iîM퍚þqv[ “9áô¿2M>øDPP€œ^ÇÐþ<‘>垪 ¾}9Pýâ¡E^"׀ƒŸ1>_ D*W“KÐÓe.;ú¾ûD³)õÀk•â"Ъt#uáCîî¹|€­¨ú.î,UúˆÜ@Æ\ů‰ïa±[ùöWÆáÆO•$Ýç¥Äàñ>ݾx~,¶Ê¥veܙý~>2€¦{éöy‚¾&F¯Õ>îï•bÏÅQù~ê—g߉pv¼¼˜å±4Ì%“#ZF˜êü,ÅVÓ× *ÞQƒ§ŽHk~ @àÖ¡{ÿUüᇔO¤ÈB¶Ë»7Üf{pâ*(!NÆ3ãAuÀ +j•a’wõut1‰|å®*ñ^ˆ">È}åˆ +à_À_¢ÓŸÚùRW9¹âdðìs5e7ˆNp4JRÝ4kÅþ Žø&ç_g¿ϸ*b¹îkÄ{þ™ã{¢¦Hb󐦏kí-Oóª¿"d~ëà…F¦SAF-€ÕµtÁy˓i•Mf‡ÅäkäI;íú¢§~Z«ƒ´Þ´¤çT£ л·#?6ùt¥Ô|™ëõ5U´«½$Ç`ñÀ«uj±Ûmöáڄ·½È•økğ¯}Á#ß䡁q ÇDµO–ÁVɞ^ïÖJøkí+}s£ei±êÑÅîôùÀhø%ëj€¾‹®`ò­ø0žºÁk®RÂߜ +¢Ó[»ë Ð_zʋÄjï¹.Jt€¡ñэ…Éå3”÷_•AlúT|¼²êv®âC÷m‘ú^sHºÉz¢‘Ð7X®4÷¬gD®†{¢þõÁG*Ét‹BtãØ`Sõ\þ<ɚGó2´‡KN@©ÎVƒÔ—?{͎üžÅKøfñVì|ݔ…§éâW!W/‡@“¯MW Ýô‹M7&?E¡Lß, Ì0ãâ§L¹P­ÜU«¼J&äv3¼Âž5~JX±›—Ë4ÿ‰à½zŸHñü@4è%ôõ ÷ áÃóœW¼Äÿ‰“ñOˆF†‹Ðð¯ÁÞt[ø…—QÍwEl^úñv¥‚–»Wõä-¯|êù„ø—Uq˜°; +P£F®ØŠ9U¶ú&÷œ&üÓ[ê゙ߊžJDC¸ìˆ^®Hý®•ãß¼™¿•€po¢%ŒZ& Âó꾃h@dI9f|]U¶—gD"O>‰#Ôs®à‘hž ;Íê֔¾:›"ã©»(°€Ý¾ ÝQÒ|‹à|ïƒ4ßÆm¹ šiÎåÑÄúS¤µ)íòàé ±ö"x' ‰8k"Ôԉ7q¥yÑ­T‘å¾!n‘  ”VS3’n!GݺTý‰ˆ;ËSX$+BÝ5*KõºUp‰ôìbsÄtäuË£Ñkª$­Š®zßit¶IU¾Ä)(¤€Äž¶—‘†µM 5ÑhÀâ•Z¯—VÌ+£‘‰ä,vEQ @ƒ(-r+˜Ðwµ­é+v{QpS]à_Œ#J½”.®€Vž4‰¯Û— áô…¦5ȤD³"xÐ;©2/<=NʳÏ~¡:œÿ¸x©°]â\Û؍RÚ8þ'7ÊW™½W¼­Ù¾ö¾ËÊTåçag…žÛ“.O7¯•F㧤R©OV•V¡óÉ €3¶Ä·Ðø‘Ë’¹Ãý\ð‹ åüÓð©÷ 8À½uuè†K‰@$¨pYñÒ`R¡|պ”ëÞlÒ2aÁê{OµÃUZ,À/†ŽuzAÐc=Às ¼¤Ã·ïEر p⯲G=‚¢Ý="d@íêíìA«ŽwØUž÷ç\öŒR‹Sæáñb.˜cÏ7%d9«I%€R{3¼9x|‡FãÍ Nû râE7®þF)ἃÒ}áÍWº¿øà ŽÝÔ𤩔.âþ|¢ª\'I åúWuÈнE³[l=6ۃeªíŒ‘/Ó4ŸHø¤uP+-“7Ï!·Š®R­Jm~AuvŸƒa•!øàjëÓA:íÏÆîÔp›¾Q΍°;‹‚¼;ùhðáÃU+Rxt¦7¹ë£½æ1‹ Cäu~Vž¾;3 Óý¾È!0àP£4¿õï§=Ž‰£Í@ä³4\:ågÛc™ÑrÁ©ºQy艑«¾‡¤å–$>?|gDuµùŠ\¤—)ž¹çá7€&•6oJ÷íB;â}YÞ ]ݼ\ïï:=èê‹ž¾£GÐ.,9ß ÚXsZÔØŘ£hô°ŽZdK¢À0ÓG„ÌÜ>]! Yì*ûË26N—¯À[ëR½۔0<ðÈ:UóðöYLgAéA7öšÁÓj ÀœÞÔ Ÿ7h€èzŽU`´êê ú^ç7ZÈ >W…§{¿+3õwf@!¦¿»+dõV¥¬Ü0¾/ ÓRtÚYÍóM¥•¬‚V·³Œ#‰¢KP‰ªe •ôöJŽÊñOy%ë-cEOà2^(=.ÏØY¢2¾[¬úSFðT!UQÜ{'Pæâ2Žâµrcšdð”óŽð¾´¹bãIú²q7ªŒ–é€È…žÓÊØ}…UÊõ3ž¤Aڙñ^g=]Æ3ԗ‹HUo‡K‹ÐàvV²-’¹{L}TûŸo|0eâ,ü”>=’ +›JÜdpâü#} uФ:¿ÎԖ ’ßo(t ¨ðæpÕíº#+s€FnšÌE«Tõ³5è‹% eÏØ[ú±÷b̓¾Òð)ÅÛþèY!wõèª\/go¥xï9T¼÷µ'Ň®Ÿ¨]Ô>’¥9>bõ—'oÀð +æ2\¹~kú ò€ZYëèu?Õuwˆþ™ë¥2$+-RçÊÇë‘MÁ¶˜\Ìẙ±éÓìø¼3UšMÖP«lÕïKŒ•úÎ׺_ú,ôÎ9NBÝÓ½Á©ÚÅýÙúí]n"*iU«ž/y7̶4€²Ô§wŽây™»IvV Я8“q¼Ø‰µ%çsÃvß¼°Q3orœ±@·ÜNy›ä*ñ\+ߕ{W’Á'ð¿§Â8߀Iýófºð£0¶ÀB€ÂOk´)£1n…y…ÚH$.‰Ÿz®²hÆeY˜ËÏ3geÜù¢Ë³Óó8àïX«¸Ê_Ó:Sæ¯E×éÛq‡ë¦•©6 +ÙÒZi– }Ëy +L0½ºPL~Œî*ãôW¸úJq. IÓߌ» lÏ—"=mù4üm1,Œ¾y—»ºuu­`£üe"ªÇ%éy±Ú-&ÓȞìWÆ÷lƒBgëH­•‹¢\˜<ÔÏ/ñëb:4e€—ÚSÍp ÇÊÛrO ”\mq»ô瓵záç5û"M’Уe•…[÷€G¾]…Þ¸»QÏ'n6•ÐÃ(XÈÜ}Ï–;øÕMœ«²°%$­ÛŸb¤YZe¨ÚXè܋ð”úüÉ-ôEê­M¥þɲ•À€¨æ¼ç€#_~JËV>¾Í4÷§@£Í_Kó,î/v ¸né›.üAl¼T,Åköã«vA8æ쓫Œi&¤Ã·i G'^¸éôL”ÇWÑíeô‘„1ሚ^Äùó÷ ‹ÄçÓJ-A»#à#ÂÃÞ++ÁÍžëÑt@ß¡´x®P¹OèHlüZõy¼©8“}–Rí­¼ÞøÕ¼Ë¯Ï”‹R´ŽÀ§QXc¯‰üc¬ZŒ÷PdàZ4¨ êç'éBNÓSR§DsUÆWu0äÕ¡—»˜ìÜ`^ÚEº8Þÿ }#…@؆áF6ÉÜú£oÅn×å´µd͸ Q-i?ãÀrX䊸¬õ…U‡/L¼R¨¯ÄÆÚz ž¡j/…ÚÖD&‡ÿòæUöêÞЦW“ø(-’…säi­ ¸ã‘ôm èxÈÇ9F«2Vq[÷b¥Åbý¥õóÕzí{.gƒê˹•F¶2Á?(.H +ÁM$¬ø@7¹J õ3 ¨ùF깬oWuxšø€œÖY8¢šz¨kLò§þÐDîtv¼t¹€ƒÿP›H«àÈïjHiÿF24²OUËí4ü êé±]þ¬ÇÆ9@M„LQ?r ÂË3´d k¡uL XË?å»jú‹W0yö5-ËJ4¤KϽ÷º/0ªžer‚¹+¶"ú‹pÌÄ¢|žT‹©ËÁ ú á¹ öÊøã’ÍR׌úÁ«DÿY +æåՐڝ›bj°ž(”¿¯÷d4–o(F+ˆi_%¬xCŠÔ ÎIüàé°Ä;Q˜ˆ6ݑ5'sŒˆ½„[ÀFO`¤än‹@ÌÍÄ·Ò0hu¸9íSÁÐ)dh`*&4Lôӊ*Åæ£Q¢÷øÑK%¯Êõòômt +½°ÓBî>úYi4r§Ò~¶öµ,Aºª…ìÇ#0G“÷~h D?C ô_ç@ ×ŇEüI%’Éçë}>­4n¢ÅÎYi­']Åä‚ök²Û߬@»òeeOœæ›÷”ù_¸I¾"G ¦”d•$¦D %È4Vð9Ú.ÿe!yZAI 'ådgDçjëóÏ ì‚4™ÑhØÍDH_»´âÝÚóëó +Ì W’ã|“»ÏÁ†øúØLafˆ9OÁU ۚsŒ#ь>ø¦þÑY`5˜°’¨SüŒ,‘VT䃨àö€]û¹4|¹"î~£~úTì>&»ˆ| ÓóÂw ~ù¤ +sBJ=µÆØ"–»[+©ˆ^%w®[ñÍÂÃ\à¥Q*¦×pF\3M¨45Ô'H0ýªÀÆ* ‹­FîçN^ 1"ª>ݟ]A½eÉ'ú»®~Ó,MϪŸÏ(üÄOðE§ýWâ±õö-›&ñnœðrYº:Lxã¥[¯w–\]ßû51lÞ#¸¶À-á\}þZ ¾¤&¥ØS4¨`Ùg`RìVX_â§A^]Ú¼¯®F(Añ]f™ùeåcör†ØMð=€ûtÐÒFô¾<-Œ‚•ëEùIc`‘û÷3ÂÓ(¥Ší×-_c (ÅÄ º©ñê [ËbR…úÚõŠt‹Á”×4 +¿ œ"Yö‹ñ´*ùõ(®®œmâËó‹â½rãcŠ +ÀûŸÙëVý!‘y~€ÑP„`;†äÆ 6ÆŸ`xçƒüRöC"söa+*žîû«·þ4X€þXK]¶:Ì×´G×ú<ýX};OOžб: è‡>‹Ý鐃]ü?ù©227r´Py «„H±¦$“qÖ4S䟊wÝWˆ`f&䀂g3Ð|Cí¡hJúG{uÈß©Û͂›­TqëL¦í:Å]š[a¾"} ¬ÂëcÁåWú)‰þ|ü+é¿ê ÂXØô_M¹(ü‰åî3QéÁ½ô =ÈF¯º\ ˜.µyýìᒄÎG^zñ_>$¦NO8ƒÅè@㠆Ý7NÏùëÀyAáE§ºt;WãP´™vúó5§+ÆFÏïþØUë+Õ¿n®`ïR¼]J1¥MÕÛ|ª4®ñie +³ñzú«[ƒ¢²úT¢ +av’Ë|´oӕ×ÊÕ4{…§B%ïÒÕ)\/*Õ·/?‰Ófw–½÷Ö‡‚'p|îu÷ǘ~×áh.œþè͈8ðüóEÜåúb÷Áñs#Œ/»™ôb•3*p]eޙT±ž ;`\½Tål´©V®|xöµq»È]„Ê`pZ1¸rÐ÷c#̈́Þl€°4e°¿çÛ­š,ÃdÙ.óþ¸Æ±ŽG9>UfS׋|Òs6rሮ-(ó±9€Om„™Ž°·âàRµXê'û þ¬-Àë/5Öwæãöý^k-ùÏ\†d¬ªÑ0ŸçwMC¬‰Y£v¡5çô0,~Áècmãp[(vÉøô†Ëº·A¬ñ©‡t¿Tõ±Æ^ž1óÝÊXùŒañ)1Jœñ~§‡#ºO¬‰³‹v§X4 +—'V;{}Ôîi-Xp_BϺSûþM&¬m·[Cáh–[ŒVÀ‘h—©§ö…ùˆÜÜA¬Þí© ½Å.oË~€5Fo1ÔgŽ0Ä +ÐÄ­SNF¬ÆJ2Ÿ®‹žVb˜X¹Q]¬lñ#*c…s£B\Ño/´>ÖÜ©‡u']ŒVfó…_x=WozX‘]–®æ †›8;ïô˜¬>ÖØËF|ÔtÇzJ°Ù‹y¸×AX!Ñ4 U lî ±º©I¡e0Vg˜a×ísˆÕ§Á +а©{Âw•,8oâäZ‹µ™,½X_‚ ÖD§9ïñX«ïsB5Ö×Ö|«ÆVÄišáÖØäüì>¡‹õÖÇÌ ±æýrQ+@¿y±N†bõ†Ëž6‚ïàt±vúWYC¬wïõ› +·S·†ûVÆzîç”>ÖæÙ¦3ŒRºX{MœÖà +%4DüX ×D~k`½u´`€õÊÛû|ú*êb}ºøV¤Ö¶‡Ûï¹'¬ï1ì£Õõêc½kM¾Ÿ+9Ÿ«¨¤±.toHäeÛïz6ÂJ`ýûŸœ>ÖVÁ˼YÈкí~XSuçÓÖ䱒§\M½x®˜ÍÓ[ bõËX!^BµÎ²ÞÏͲ°^2Z¬_¾‡së<íÓhv{GX#®ÆbØÉ ÊˆƒÛ²¢r¾Ÿ%€µÀnÉÅw:Íc½òT +;‹DËÍcýà27+BÃÙûèÏÖ/o Öð¶\|ăɦë`%6Z¬ÌìÊ+`Í܇Ôc­?–.\9ހª-¢WÍ¦j¸gol|ðֆX±-p—v>s÷×kdKV3ÅÁêÑÍÉOUJšaJ)÷ËcóýF÷õ éÌa×ï~Îà©;“lûLï)§p^”Î+°Á6SÖ«D’8ÇáSÿöÓéZÔmzOWL²õQó ­×€ãRxþ5©ÿôÚå,´žª÷O¹lãú挕Ÿj,›öÑôûãý׉þ]!¿q•¡axh#WZûµÖ óm@øu…] sã‘$Ô}Œ”˹í²ÒýV:A>”Pð)¿öŒºZð—ÂSªr! *oMÀ .JУ· +î+}°U”‡!‡¦òùê…â“eÉ×õîa?aVªØJ³Üiì&~q~AŽPù!BÇZÒ*þü ZWÐPAúÚc™ê_.h¯o|ÖÝbÍû·LèOR)NªqqyÂ77քG¿”®»Î¯ðFSô=õ)Œý"Ÿ+²¤7‡Ñ«^÷Ö|‘„Ü +|ûLšx)?¬ï9”¢ƒü4Ö:«Ýèe̵ž‚ç%mÁö†ôÂÆîŸgCþ’™KÁÐÆüEãä¹»nµ‚ÌHZ ~øX+¨6`5¤W΍%½4Rè%°ÒJ¡ê{y­Ä ŽmÇù¬âÕ¶&ÁˆêÓ°Öp ƚþò¬¾·8½IÝA¢>½)Cµ[ä«B?»¡^žJ9®»<½†ƒ‹žgMóÁ¡å©ßöàÞÏL‡híâגQO §QdÿÑ@?ÉãòºÐ¸ôyþ%°Vk íN~ӝ²í!UB*v—Ö£ŠÝ1ªr© ù–’ÓªÍûÏÁ´ÁÆÏ«a -t÷½Ä<‰¡ý&ÐÊ¡7#3@”FIkà Bk yÚ´1jíêâÐêþ’„ÔʀGÕÿK˜/\ooï*îSԄ·¡ÍfþD"Š~ë0yz‹2HxJû/yµ¦é[æÇ o‘ŸHé5}£?Ì@É£±Îä–‰¦™–yj­™ðú#cªôŒ¥z´¯AÚšj˚Ü2%3<ªÉ"VRûNò<µ±aT ùhZ»J3É û§9½àÆ}’v`xŸvK6óìõizf¢= òúµV&5ÙÖÓ·6ú·¹G šF+[ÏÞ¢u3O1’ö:jä&«PòÜì +ÍÊ-Qâ…4•yq(Ѭ ¾†©»‡M-Ýv'š Ø-Rz~ ª½Û:\2U–³l6Ë¢SÓ_.o!D¶®þb˜Ôå™0”i²õ½m@CR;ì‡,ÏI=ò±)5vp§c´!§qWöÝi£î˜K ÙN3'P­½´o0MžÕ“;N•Ê ÔôêëОXɳžVg}Ëêܕ,¨'z@&šžÿ8ˆzuuVé¹ÛÍy„[£J«s­ÊžÊ  ÷e®’§Âí†A +lY6×Юí Iô +tÔJ_Ìè²Û­­>ٍ¥Áõ}}°(·"¨Ý^5рæêB Û\7ÖQZ ;‚„.ª6†ñÑÌ)u `ÙìHílšA1ÞaG€öYŠÛPÞ$Ëæ0@VŠPð¤­u!‚¦ÞhÜA­"a£ ¨×:+­% +¿;d{B#l ´ã¨ÔYi×ÈþN¡!5»6¨©Œr¸œÏ¼–w£ö(çS'@W"­µ»¾s¬4øŒëÀ +æ¹mg‚-`£[ŒU®øåÀch¹+ÒÞ*Vù3vRm—6õtÿ1 UÛvþºùNaÛmœ¿nƒT2N¶Ë|¶SÙ|6ëý†}2Ü)4Ø}„º+ÖE|öG²\7v ¯­!ÒéӉíBL‹°™IŸ€ØQÛлÔïí$vÐh^Ì¡ ªy~‰°e3Å䳺çŸìIËí_‚§‡NmצóX–Ýí”_bØ=Ò¬?_bXËʍ²,»³—_ÂÇ:Mhc²E¼ƒ—"0ôÚf¡˜>4u‚plk~µYAðYª¦Af›ò‹<}6Nš}O›Î1!×½ÚÜÊöKh’0¬¨Ü9ÐF çÑ$@\°hSÇýÛ•Q U(¨SFö/î1>x@Ug¯í3·1vª)4;]a9;ªÉkΰþp°ã2®‘ËsW7}RšÙv2ïA·Œ3ï¥é3Cyÿfž>·RöçPõÔ«È·»PkÖ59 +Pb¸Û šÅA v:&lEÔÌ«tvæV&ÿAD³¨ØّhÆ;)ûmëÀ†] ©ãÅIF“Du"”`ÿ˜Ô ˧ä|iÙ°*¢4Àï­Mê–þ`çYÈjîJw‘ëäÜZûƒ[aÐè$‹HéåÔµŒíNôC–.®<Ýd±.Ù۞%mñ¤®ÝX1vԌËþlHkŠïT’Cî6+ØÓÓwFöL]³ÜOtϳ9³kaF>ØAHma^ëUê*‚):¦qmÖj—}é¨c‹Z=kd\–µ•œ´·údQe«ŠrX‘ŠóØ]·Ú'5§n¹C*M É4óHÉþ5zrŸ„¹1+¬Û)zcÐ'TJÂN£G"•QôæD*ö³O*‹ò<½>œ2r…ß°šèMô<½6ϕ7ŽÞh8 oà¸Ñ‹Þl ›^Åòf§è L1*Âîã7Æ)#öëálDoN¬Î‚õp¶ó‘ ‡t¢S$»Gô–™EoN¤“ú,ic•àoV¤²l $ª¨ éÂF6¤O”•^Vi:v éuã(’W¸y +‚®ç ŸÑÕØ3¤78”¥kžAlgp—^\*ºŒuÝ8üØ38ëpCÒôä3›%~yY’ÉaUâwXÂ<¯Ö`‰ŸqœÎ²˜UM ½°©CÛK¨Ïܚ YðG7ßK™ ioÇt¯Ê¼mo ç»2Ï:íú(•y¶8íðÊïØô87^¦™´áýšüÎÒÌV¹ÝJw»êð"Ù÷ŸcÉhG,’}ÿ9N‘,~?4ڄªÄ(F —–€v¢úQÈ⸛ÝÁŽR$k}еdC[‘ƒŠÉQ°–ùK‚©®ZO`k=f<“a;µW¨Ë3X‡åm©5;¹BêaÚ)Ê;±uÚõÁEyšå™ñØYž»åæ{Ú.Ê}O!v¬¢BÙbgâdëøõ„†meðš$CÀŠÃ>¦¦˜¨ [º–ø±¯ol¦» +á¢{þ*=]®V](Ÿ¿“•W¢×h +a®Ô¬2Ÿ—ýËneŽ—KᛧÊuÓ©\ù;ÝKú˟ŸjmÐÎ]&žß‰Qĝ?­ðÊ E‰qèÞvZêîJ:£K茺ìî¬÷ÒVF»T¥hùLùíŨìîÙ¬ØÞXˆbE—‘`MœÁ›È?Œ®Ð³*ö[G±Â›È ±Â›È'rE؉öžB¯IÙ];Q`Uס¡Û¹%¬Ú+ôxƒè ÎkRìwJ!C¬ÑÈÉóºUì—8»ˆÝU¾ŒÊîúfewç C¬PtÖîÏ^ †›ª_´f·¤Ö +ß5z2֓­b?¬Z}$ÔS{Ψ ~Š7¾Ë°­vÑ2¦)%1hŠ}ù2Eíüš«ÊÊŒú%&…í¶±['*S6Kõ·ÊïÝ6niã^õ.SÅêžK.*iüÒÆYÔöî@Û>1Ý<£Ë¸¸¨l‘¹ªÙ?3Œî½ÞvŸšM‚ÿ1®×ӛ¾Âv[§¶íPœ© ·]4fq^º:wÐän7e¶¶~îà¾7ëŽPar˜Ý…guъÕ…à}ÅF®¶ÍòSÚÎ+v o•£mÝÐV×è%@Üʧr +SاWÕ·OÌÆ¢°OÏK0Ûí]اWÕgfCïYاç´ðâ£ödB»°O}N§ó©°Ï<Ü}´Â>½ª>„>FaŸžï¿Ÿ’6-ìÓÛçáÍÁ£ömÏ+‰n•?raŸÉ.î1 û,*VŽUØ·Ã]‡ö© ÉWõo¯î]ا§œÄ8ô ûôú¤Í³9BaŸ^UŸ¸<÷´\õ +ûôæð„?Ì䘅}z ”›ÅG*ìÓ«ê3¨X9¤°ï ¢Ù/ì³C´#öéUõíC4‹Â>½ª¾m;íàÂ>=›ôD¯êû°Â>½ª>’>FaŸÞf‹ä{¯°o ÀË©ËÊÅÝ£°Oo®Í7Vö*ìÓ«ê³Ò7{ö™øžÇ,ìӐÃNAÙ>…}zC:ќœdd¯Ânà#J2íÊSa´—° »Ã°PM¤óTZ7jïê+s¹±mr|‹Ÿ“ã·øI¤rÙ09ì‘Êò`Nâò4!•¥µaƒ„öT8Ë;{mNŸP0Nð7¹r϶6’ú¤Ÿ2rmÃ*°Û'ä…î"lLHEY,c¥°y0r™tN—]Þ¨5„Nb“²‹|øÁêþ¿ý‹ç„ËÿÌòlìÚë6.ÿ;Ù¾cÅ` +ºüOŠr˜Þÿg¿Ó çb·|è½/ÿÓìßÜÿ·[©”Îåû!÷¸üÏ8©¼ÿoz)u  ±qÿߞ$Ñ«GÿÙágt­Ç«ñ¸ÊÜÛ*È5-n÷ÖÀø2ž«nÖ ÃüuÂ¥eMŸqŸýìîÆÁ×}ۙÆz 0–õŽ& C¶Ëã m)ÈUW< +ƵC$©iKšÚË풦öRÖ|ÂÜX(?#ÍëæBvfÓ*%¾sÔT«ÎñR­:vS­,2©ÛK[YV6 +1½ï¤ (²)kÈ6Ùԁf..h票åDQì·G¥½šá!‰Ñi³ÚWçøeðÝ¥±â>ÙíxC­l^;£k÷$‘h[Ùè +efHÍo +–+˜œ:©ëlš•P+ΫMÙßù-÷=í a –™]o»0¦GÛ5/ŒÒy4Ўu¹c–K(‘ìÜÖuK6 +1³¾C½%`É6Yì6ŸØ*.—O`Þ³;‚ƒ©‹:v¼ŒH³P4%nC›Ì·UBáþ±.Œ±¹w»÷Ï03E¼úï%M¨ +ïhëÑäÞ¿LõCîý;Ñbn]ý·Ç2ÒIÚØÇÅÝãÞ?µ&_ýw踶j£v»¬o·{ÿDac³vc¯{ÿlßs_¢¡$ÓvÎ14~¨¾¶>÷D{Š¢ýj_òtpf×Q5¦š¡Ú÷ý•úªw£ödü²‘ÑPí+Ë4èðj_Åôl»ÝªïŸÌ«ïõ +©`€Øl=uÖãóîa0ƒ<8zã“pv-¤ê3h4;ÔRYUËx÷'Šsm¦îh;{÷&ËóÙV|ÛN!"ÚNµT¦%™!C?_Ï÷4ª¥r_öŒÅ´¹Å¨~€Ý²Éö,Ær(ˆ´§Æh,‡,¯J·e1¾È£drRw[zžêÈ" …3ïM*Ó,ü&ý¹)‡l²Û8U €JØ«ú¶Sw«=êÙp7ÊÖ‚û]†©É¹Ewë2ÌMr։i9¶™í&/c,LôƒzÅr7 +Î Ã\á|Á`÷*ùRy%^º•×*S(Öݛr)4,—KáÌí¬EEt±P÷NˆE©Ë·Î׋7U »ºFî͸2/uŸi+JU™çÏ[ºõ€ 5ÝEÎI•j U5r£°!VŒè–îÕþ¦FNY­¦Åúevù_0­À*•ªA¢ñWÓeü¬4\m\ìyÚÌ\Mwê1¬‘c6_xHÌOÓ+Îóç²KãkøL®Œ½¼éa=A§Z!"/Ë1‚îv ±ºšÔtd„•BX•;ê’Àûgc¬Õ»·š!…U÷: +XÑòßoM-X£~ôI`÷ŒÍvY¹ l šÆޛ¶@Ƽm¾ 8› ý”q›…V™šÅ— zêO/;SvØ¿üۇäµ]ô.R¦×ºY¥Øhƒ)ÆeQ?†}RzÒvºµ[Š´Wv¢½˜¦rH▦OrÐINƒÛ3îÔv;mLŸrcŘTv· ·Oäò¸·LÊãô2AO~Û>²ÕWÑ;候d Uìæ†ÚèӖ·v@å¥I˜l§Ù¬K4>¢g×uc’V໳í©ð­‘['ÂEhÇð4>«†Û ;Dn9ùn‹hÕ£m‚V±M÷~„xÚgõ‡ÞYGËXiªï7$[iˆÆª$ñàÓu?ѵn6ëÖ,½XÝhf7ž¦IEDhíäiÓxÔ; ›Ads4OZ/Œ¼_ ™Å©~:ÏnuÁCԌêBÁ>xoæSG`øó+T 5ë“!ÜBݝ:;uië$ EûyŠ;ÎQ zç§ReeÔñ1\¹þƸ[”áQ 6LuÍ}kñ¿K]¢fÕ»’úç Ø®K´,¦PÍ!¿G`H¯^ð8Á3tϲðÈ6õt÷éżΝ¡Yޔ¼Ñ,/9ډh–µIö‡©{ÍÑÞD‹vl«ŠY³Y¼GI¢]³Q[³cIâöòÔ¯GÔ.ÏK·;¡_(ïF)hc¿$Ñn=¢RìQ’h·Ñ`oÍnI¢ÝzDC‡Ý^I¢ Uc’ý`»$Ñn=¢ ޝ";]4¸µ½º[I¢ÝzÄ­tµÅÂ÷hk\£Êú²Â“C.©³Yá‰éÕaG»¬p+çö×\V(eÛٕû]V¨#Ó~Åe…Šê¯¼¬P97¿ð²BQIÿâË +5™÷¿ê²BãðìV3öndW?Ú9ÕJºíP•wȅ‡JVݾípŸl;Ý ÍCÕÆDÛñÂC‘…7ÜGHí½9Ê©V6/<´<Õê8éT+« m×{vá¡jYlÝvhÀл_x(ׁéÑ_ãxìááeû\x¨ÃŠÛu`ö¹ðÐ|p'–÷{Ú¼ðмðä—Ÿ @ÓÛåàýÚJ†=üÂüém‡r¶Ýš/c•uȅ‡æšOÏ÷ÜëÂíÒÕm‡êœÛò…‡Ö{6R³¬/<´—v}ð…‡yÓÛOv¿§pŸª`m0eï Ío;ÜÊèÚ÷ÂCótµ‹ûl_xh¾#ç@x᡹/Ç+‚#\x(wÌî…N{]xh¾Ï#Jƒ/<4Oñæ÷¤pá¡ùm‡'¿Ǽ(›ßv¨´:ºðpG)°ï…‡*vÛºíðä·½ï)Ü弑Ó{ +,¹ðK·^J"\xhä +ß+7<üÂCóZh‡_xh~òˆÚñ8àÂCUá×VÎlj¶hiß mÊ´C/<4Ձ=äßãÂCsƒÿd‡{ +÷;ÿG›D~؅‡J(Û·®ZÛõÂCÓ+ +‘Õo,lv¼ðÐ<Íe¦ãÂC#&ão;<\¦ š?R’…Uu°Õ…‡æƏ&ûaÿ Õ׉ìÔ½ðЊþnÔA±{«¼Í ËèÒ¹ðpŸR})u腇[…WªÛe4^x(­GÝÛ2í° ͓¨ä<›/<4÷î•D;èÂCuÇl.ÏÝ/<<Ì÷´}á¡ùm‡hÝ«ðÊø¶Ã£õ÷ºðP¬ïÒ·OÕ«]xh^¤k¬¤w¼ðмŒ -ÏcœÂ•7½íP„ÜÿÂÃ}-›/<4¿Y—G¸ðÐv^çašë +)¤ªUÍXhËvkÆL:Í« ƒcY•–;zžž‡5aÓ½P‹|ù;$ӈ¾6¦y¹TÀ³T¦,#1-݅‚êÄ:¬”:Ð¥qXaešÓóæÝ8ƒa÷m(ÚLŸ‹Mš,ÃDØ¢Ó7aîÃÁ‹Œ+út/Æ~vz¦7¤»N¥Ò¾«·ó×Sç5çu‰‡ðéËg"Мwztñb¾ê4ÝÔtLtš?ýä|Ԝæ_wÓÕI§ïÞë?½¾nŒ;ÓûÙâ±¾Ýôú5¯§ß/û½ß/ñïÖ²íώ×þ×Ç\tžÿ0…UâÎùt×ð£áêŽuó:÷¹.žÛç©ì¢tÑîÔnÜ_ëËXÚu›ðKW:‚©z¯“M×÷ *óñì)qt2³0¬(}ª¦Å¨°²r}],”ì†l !J[’§º~WIŒ«¤;ã¢#±êSé§Ws¾J±ž¶üéø>U«…ñ#VBµÀÅáýWSlWj¢±FJ/þ*¿¾Ñ¹tùړnÏ üJàbCxê××xõ3“+ÏÈ0'hUÎÒXøyŒôë£&‚PïŸÃ$‹ |¨ÐKz½z< ¡ÍQΟ¹‘«„…ã1/ú“'Zßdüè°°~ÀŸ… ÿçKЧèy.÷Eô½o lüY˜²M'zÞð(úÀV_ÒŸüE ÊéY@ùÒ#>’„”&—cé¦x<¿žŠî¼h¬x­yJ4Ò×~EûÚgh(=*¬3ü.,hˆø‹¦–x=ÑLÀý€†Î n|Å%Ýd‹§§¾˜Ñ¾&m|€†T M#º)$œã&­0 +æçüùˆ£7€t]ràÏ·hø¶3‚w»~þ,wŸÝZ"ÑùÒ Jˆ¿D4_)>ñ¬„Éœ+3Y¹‰\5ö-‹sÁ€ª=ß+¼¨åÅ¥ÝLƒ.®Ê¼Gp,â’Að¼7©ûtªFÜŒªW®G—N$]À¸žq¢¹MÁGä‰xý3¿_Ș4t áÒ´o]“€—aä‚OÏðQ|мö‚?ÞpÞT>#ùôuÌ׀ŒŠŸF1C˜ßùDjüùޝ¿aâ§O\ê΀Ïèjæ…ÍGQùYäÓí£…ùºý¹F3_&Üˆ–RÑT–úôŽËÓÑ*-Rg)…Ö’ª‡Å“úø¡¡_¼ó"OÀ=‡$¬CÄ2à»O ¯áøDââ§QDn'¬oî;&w zçz„Ï›Ï&{ÁÓ[âëö"aÔÕg“ØMÍóõ‘ðW{Ïõbã;Sè}µÑ¨Ù.Kš:£ÉLÑÑÔ¾bã L¿ŸÞgÕ¸}®;ƒ©@ßé^wið)Øp‹QÊé_ĚP£÷œÀPn:}?g …I|@ðË3ìBrT\Ø·+a[”—•îˎ±¢9p¡b‚è|ª’¼°£È>ôHê$ çOõªógt¦è®H%øæRó2 ru=ˆ¬#ð]9½ªg>*~‰§µÆ‰°¾¿Æĕæu©r °p>æ’äX‚OFà¾| ÄÔÄè u4ýð¬£FŽ@’†+79 ™i> Ý·(-NW° +O+Vá,¡Ù‡²5$Œ°VðC¾¹E÷o ª£Faº-&°V­ÆâƒÆ• N!~ Nyȼ°¹ã' +|^m†<Ïçãï¬lܪ¡J«7êòáþMx'*Ø ËÅÀ=d –I`Ôü:ƒ“º:ü­,ü‹^lØJÔõõ•¯'*È[ºœ¹ZxÖ&0>¡×&ŽíÒ4ö³<ЬF¼W…$ÖȐ—‘¯»¯Žÿ*âÅpÿ¼P½sG5 PZÂK2-~u› © ,Åx¦ùʎr5(¤ðz!݄Qlì!.#Þ·`m $ ‹‚&:¯A™¶ß›Òk1Ð1~‚²§YŒT +ΈL"Éñ€æ›lîÃۙ;ÂòPÇPóg÷0„"Þ:}ºÌ#®Ö$ZÆ05-?Euü›|¼Ï°Œp=|¹Â"À&{¹+ÖX˜hwDåÊ¿)肝èl·¯»Ò×íS9]M Uæ3ó™}m®òµEï^^¬Çß°B˜]OýðŒ• ÖL󡐩R³ÒÜ㹯ÖÛ3P?Åp±r½œ±De—o)V™•ùÀA¿é:§þüÆåÜ5Ô7óÊ{¥V»œ»•èÞ˜  A†å’lÈ£hˆxjIø)éËv n•arÆVý³×i±Û{bvFF;~­ Bnc7@ý©„B¹'¢Ï}à…ìÍüÞÕžðWÙ¼kï9ߛÓ|vk󩿑+âæςÎ}¹]A=ä…8æ=Oa[Y•ZíÂQ‰Ç¿ŠÝì·™ƒo‰€ÝsZÈ]!iQþ ‰Ž–gþ±ï«Ún=‚#)°/Í9w(V/.œëÄ̇ŽÐì0ú]†®`7E¹Â¯d7PŒþ=­2óz?òÖ÷®2õ«lÈé’©P،»ël•ù´â‹Áç9xÖn w^úº‹tˆôYÔàe˜€3àürÃ`BOဢT/ª}é‡^Ê¿ö«ïďtÈ«µ +åáb +=÷3Üô*Ðuæ…èêgÅÖ$×´‰WÆ÷ì +³ÎwE˜‡Ë×3d3D‹Œ³¢µj!?Ç^%¿ªóÂê'üºððb×ÆO/è€9VäIëù¾2v­Ï €üÃþXWŒÚ¬PäCïoRÚ@ ÷=ðvu@cfR–Ü;Í´!Á¡Z;Àšü¥ÔîjUâ´#YQ…(l~¥! P4»ËÛ#:ìÎ¥tÞP”tžçݨݨ¯ÅocÔÒfñZÆéû\¬¥åæÙ¢z,ð€Ð?a­O§ÜæNïÝk*“üU‚ZãŽÿÓç>ËA‚âÐM¨SðAªŸü“pzswp³Ʋ±_¡o¢:ìûˆ_+ŸV#{¥öį ÔBÌÆTò÷¨B¯qy –b×YýJ´¦¶Uíÿ€¾ÑÓv»¢¶0 ¦HcFY¿$pc¥o€”ïW¶£';]Íi‘aßWȾOû•ÐÃS_®DZ¬ø½µUî“sû+xNL»>d‰Ûà9È»¬³=Œ ¨=ËAœ¶‹`Ùi‘Ù‘i¶gÚx‘Ài»,2€Æb¡xMƒIÑÕ$™ùhߦ‹õD•Ÿ+•¾îÎîПéjjÓGkñ Þ©>•:ÍB˜»jëñÇPå•èuÀŸ‘qѕLål”À ï5„#¦]1¢ñ«ölX[¦{û¹³{Òû[ØbT}[s'GÈî>fÐVÿá‘[[Œ¯OÓ1·tr §ÙÛ«9µO;ª§ñK#·fþ&ž6OûöŠ§¹gð&ý,¤â£I#ƒü›#ø2E¢?_øˆâ‚üÖ[éhÇCµØÑ'”ëÉl¾šI!Jtèvew·§ÁŠ¯wPûÙ]qW¾÷b÷ñûÓÖJCŸˆ¾|ʼ¾çЮ pxüqgÛäø%³o¹MtœÙ×±:Å싩½¿xö¥xÚ¯}4á(©ï—Î>šz€æϾ” ùkgߦ¾9töÑԟˆl†ÿêìH…âk>möCìG®5AS°Uà)f$@š{•-HéW?ã’Ѭ¾¨ÉòÙlP¡^]ÃTCÑUô“󰌶 ¯†<3ÑK¢}Ê¡‹W‡å‚·²ùñ¤_¢2 ЕM΋ҹäi ] S ++àÄs —«ä$òËâ›ð,ÿ« ÚtxÈä3ˆßõ~Äï^˜ð¬µòËùþÑ«Þ]Cµ´3xßåÊÈiðÆ+‘=¼ðš°ô™Pu²x¼SÎ4Jqæk<.#~©”ÃWxò‘âÒÆC¨Ÿ|Q‰çêm¡r£øYEóM¶æÂEM‘ ./OtËL÷=…ÝyQßô䕉öì¤ÃUþN/¦ôò&*i„Ø38xÇÉÓXM¾ïK¤¾–è𩨰ÉE&÷^•DÐ\º6O­E™€¢ +:\äœ_"ba™°;sÅ·¥ç— ®2óbž¾ 5‚¬ÂÝfhZx9cJ„KN\§à{òtpÆØ7—f¸Ê´9¿KކD„úGèôûQ$B(( ‘ù—wÙw‹„Ìà ¥„±à›òhˆ,`;÷îÞ u’yû^+C€ÎwØî@c{ |Yú^Ԕ¢ðNÑŠ :q"TzY ä1މµ4àºþÿí=i[9ÒßyþC'Ãach·Ô­>HHÀ6ׄ„c8Ç`‡Îؙù²¿ý­R©[êÃÆ6Ìî>ïîd7±Ë-©T*Õ¥Rõ¢óœ>Øìô÷RÿMŽŠ ï>Ç[Uåç +6=̺ñzæI.é7¯Õ½RÅ഑h³úÅ.æ’4«¦8-Ë­«çÞܳöíêݼpڈY›X¬ºçL“ÃœÈÚÜÊóК¿ÁzqÚ {íý6‰î»*K:ÀsOïÁÞ{kôqúeòiÖê‡Äéy¥’AB­79$îØ ¬•A"¥¤ÙÙD0÷,þ>›[°‹¨ à ,ÄÎüúH(Î~L^#›K_ß^ ç^y÷•æAã±µºQÿükô‹r±Åb|¯ý¥/û™ÉÂÒ*J•Oò`%}º aüg%qJqï#қxùnRy·ò0u¡´äbaL)ºXhúcèº\¢üûÏt˜ ÂKçÛ3NõpË6<㽅ùúÒÞԛ›Å7Îï´ovî$•ÄÕi{J¾è¹y•./Ž"6u?qš!ÞkBß7¾ögþ¥ë1¼»L]§Üߗ– VuÊ\hÒu9â«pkӆsŒ«O× üá‚+™u„¬µzºóí£÷‡êþ^ë羟ZŸ~ƒvɜœ¼g—º£f\P‹×FŒg ЖXår½îN-oF ØîVyyÛÝ ¨ÁôÂÁ}vhþõv•îÂ&%w@Ál/òews«òüTwjóZªÄ×HÍUۃË9É1½d|¨ÁñíiP'_0ÐÅm7à^Õ®UÑu^'™‚E›`„à-›ýîFo¹(á­ä÷ìÌv‚x å}jYÑ¥;íN¶§å_g"Ì0±\ý4Åk÷«ª\Jf†k8t‡P¦®ÕèƒËÝäŒãc©%ݞ{+•tL›êoßxùzs š/ÙÕï·AÝ­MM‡zJx–p êcSU©“{,UdÞn|õ~«zqØ^æå«/oÎå +žI»KG[ø€­O,òfÛߔk.à +i60*¬H³íà=Dz‹÷žµ.Û^"üPýþÍ[à_»;«È ¹ñ¾9Q—/ʚŒ°nÁŒÓ9õ‡ã_+²PI1+•Ëü£ì™˜é2<ô»ʽ—ܧýb”hM\ŸÐ%ðé…CAWŽkMY/`N‰ !~MªÀ®N +žË Ç)Ç·øÚLrÛXÞ?žU_붼l'}T5Y€Âwµø’°WÒ÷~åíaF_ Ö¿™Å&Þ-ÎêÌ ï©[Ä°ƒ¾,Æ?l8Æõb_³:/‹N”ͻ˫‹M>sèÕ]øà Ðp¯K7‹é÷ê–Cå&æ'ñNú¦,7_*nÅ·˜?UhSÀÅÝýi.‘š œJk£°0jTtT?9•÷¥F—­mɯê¦òÙÑ1KnäWW*IÕZ^öç“"»¶¹G¯v&—g£ò©GR‚ÔÏv‘^ Ø­>»#ìÅ1÷~õ—û·•½7]ÿݞ‡ùKÁçv‰ÂØ壝Wqí…c]2૎òòcû2žæ¾QÄdÔòá>U፣uF<ß8ÛãTƒ¾\íqõéñø Iþår«©>ñs\Ë}A}4±Ë#[¾·”7¯6jÛ|ÜV-$7֏$ hŒ¾¾iÿH~ó’MqjÌæëþ«zr±]»²Ïg–>ž}Ûh|Xµ£*͂5‘d¥U5›)£¢r¢wA®wâQ?W©–Àßóè²òԛc¡>5ZÉs®zî÷ë% CmÕw?¯4®^Ÿ-mïžL/ŸÎ-î£z}‹— ãýðpçk ãn"uѧB²6Ï­‡Ð¿‚d藨‡Ð¿‚Üž/Q¡1i ¼D=„Ja1„¥¾ „àV("nU·¯:Ý­îÅùō5;>öf|¬º´ÎØÞMûv¥Ûéìvþ|hܞ=^wn¬y«º´S__E£svÛîX³*?0¢¾Ä%ÊHq{ВkoÑêåÚ/Û ­Æ7çð]6`ún÷'&>¯Éë5gö$¦Sª@ií~¿R`Xò¹«£Òښù¥ÑéÖ—+¿mìg¶ ´»£¯»«X¥`y¿ÖÙ^¬ÞŸ¿•)d£Æûïo޳Ю•¯§vêŸ×¯ËÇ_+-i åëonD½=†¤‰Ln(¨F2³»äãäê¯fˋ œÜã¹¹%w çj”Vëo+`¢ãsͅl…X9>Ç\ÀV@uò\sa[‡Ù\(MÀ×=.‹0™E…À5’uš”ýq}NŸ7bQCÚ27lªæDþÊÇmw:ƒ¿Úøõ€ú…}scÓ–'첪Nt¸.W†©³7jTð9Óégʕ4ÕU·«EýIu2j—{Ngüµþ=øp·´»t³O¥ŸjÇ3_¡ÉR8;HÜ®›0ÙWs‘O7f +OTÀètÛ¦âNË'2}j½þ +>i…¸vä®É'`¨·ëò“ªªuz.¨š™F—{6ô±Ê`åBùò›9è|©DŸZõ…¸ŠS‹UœjG{ïµízyîÅÊìHÆÄû½•µÊå³%«¸ñ¤N&¨u“)Ž«²œºe3ôiùä× +}208w%,.'g¢ã]¯]5¾MÞc ®Å·ï¼8„óY YRÉÅä”4þž®•w—x•aâänêˆË¸q©{ +oÂxI½¦jˆ­WpîUeõçÕp²_ïïщl6 íå…C˜Nhgbq¶s§žjýD}ØÖö°V Å^ó!1H¦ñM£?ñäCBke2f¾Mÿ¬(ÿþð֎Óhøôâ«Ïªò]ݞ•ïk—…5D5¤¼pÉó¢GàN-¼aI3 ²°³ÜÖ§@Eio?PaÊ«¨ïžz©¼ +±öËOÿñ·8¯âëd¶ƒÇӏ?uþÚSGü×\ +ÈÂáu’²—O94oL‰Û•lîú±î`'I¦Kh´ÜÄ+Íi^¾®h´—Øê—s£==͞Ãó¦:(iöìCŒ>{¤¤yÓYkìœÆÞäˆVÖ\è¬ìÖ|?g’â´Ô¼rœV@öϬìÃiƒrkYsÚPû6E´Aaω˜œ–¢f†ÓúMDsÚðHqZ¹§ LÍÁ”ô«éÆÉ'Õ¿ÿ’îc&#‡Fb&¥¤{£?HA©¤ûáa²ç(l1“RÒ£ ±™g(i钃×Z¥3ÀÔ ¾ã}­#¬zt„~öÚ«Ù­ò,¥€ßÚ6„=¢µáéV›Ñ©•f3á|¼½Ð;6{~þN–«ÈÖåk;.Æzýà8%»*¿Ê´õéGgFk–U$R»Úòë|i®BU“å× OõñmoþAJ‰u#Xh†IR~³< ÖsÿÙ𩍘ɻúœ“4ýçõªy"ðæ|)þaKWÇ@— +/­.ÌG˜ÆÐàI?C£O ›aDÌI…¼ëÏ÷?á‡m&oªèªófHµù÷U§Ù¨Âó_ÕyʤR…ç_¦Ë¢ªó0Œ.<ÿ÷U«³cáù¿¯ê¼É§_Õù$#$¢zéªóEáΣ{œ>üžVÂKExËãÉKãAt)Z\V⃕/÷$µ.^œJ¤Ö},glrÔvYEúElmâÇ»ä`%9?F¿;tº‚¯ÈÁÒÔ¶ŒôbZÛ¶¼pôñ²ñ6OJZyx'oXeÞ­A‘ÀúäBúÝ¢ +%EibI0õN»ºŸ|šâLµ«‹ÃR¦Å“ܬ˜‡Ÿ*?oŽ²$VïæQmêHdG…€$ӝkq¿æôO8ñ=7xŽÙ\¾i›g˜žÐNçáñN>"šµÎùÅÍFë¯Nw|ŒYôǁ?øwYŒ‡¾„nœŽ•äÓ+[x¦Y]ê>4.Î.noZÝ¿¬y ;ømco½aÍ[ôtž~c•'§ ÃOey|ÚDL›ãcŽµ„ü1>öÿYKw܂¿ìÈ áZð!~ÀWpîDø¹,ðá ¸ðÂ\ü¢-ì‡æƒü…ß~…O?ö‡Åë7ëø³cµÇáÇíñ1Á\;ay,°}—…Öµt#ÇöYÄ,/bvè‹ÀrýÐ8 ,Ï÷ìÐsC 9óÜÀ97€v½êž ›Å0ϳ}Ïõ­¤Ï÷m?ëᶋ±J€z:qWù BÃo½ÖÒ±ªë7´xÖÙíõÝíãMÛºÿÞºëX×·íNv%‘Î\ÑY£(˜ÍB—!)½Ðµ]\ÄèE¡í†ø˜ëÛÌç&„Ptin +èF‘ÍD‰»rCÏvB‡kC°¡çÛ.w\ã1lJÇ Œ®bHjĘ w¥‘ÏÍÖN‘K{77­ëNÛ:ï¶Ú˜DÀEY±!’iŽ©D` îyC~°9ã°ó¬Úùø؜c;øŸkùàɅ0šAòƒÇ#5•xr×qCöC…¾Í#·WK[sïp¶v¦åð„ÍÏdÐÚPƒ"I9PRxBù 9§VëŃ%f‹À "¿lUwº7çV©V[:±¶}ûÐÂgÇ­,9${)r˜Õx‘ãqa»²ÎÔñ}Éü̇M³N€t¹‡ôö€Ã=d{à7Ç÷Âmø$!ŽãÃOܱ=`«ŽCø¶ç¸®nÓú,ä) p|;ŒPŽ˜@¾—ú¾Çôоw5zaÜՓ\Vz-^ –dç÷Õæ.Äî_w‘–KӀyvä‚^R%R1nG1©\îD¶‹BÄvòD%ñ8ì~lb‘x<ˆÒO Dæy«G&j9¢9pO2‡ íöz ‘ÜZA¿íñ1ß*•­ƒ}µG¤*†]ma"& +,yØæú÷Š&øƒâ†NtÒV“nÀ"ZÌè¹8Jj®>€œŠ`–¦ó¤F%îC 5D ìIOÀÖ¤V@ÂÕÂíiJxŽ¢WxÆcŽ‡ÂÖЃç#É41$ÆÆ@èQ­9WRÜEÕë‡Æˆ JÄ`')Ù.!êxœ¢ëÄg‚6{L 79FH9E-µ¾'Ù,KÔ~ªý?†»rrx+Ç- û™H$#K" +€ùp_¢¨r9L ¾yRT‘dó)ø1)i—Ç@µõI¨aSϕ&A6—êÞ%#Á­ŒäHµž@ٚ‹PƒÍåXL:ÑÎV6ghŽ€¾Œààx93 q",l1ÐGi½*Qs}n̸i€u¼ c Æ{6 ÀpEh£E1€»°Ç>ƒ†H3Øðµ!år x(ø vÀ ª’dÑLU"—WZä +¨ÔiJm"œy$’GI„RÞs=+¯5êĝÌC¦4õ 2¨p<£mÂÄIÿ9Üê},J`)èd, –òrKxK‰4KA°È'éÕÔG–òA>â´úðTñ¨’§Â4O 2*S<åý«y +=Ð'£˜#Ë O!}N€ ,A+€˜ $š3°4LJ-Ç•à ’Q஡8Ša’#`æMÁéð{t÷9,úø#.px-‚ùq–…ápÌÃsTp0ÂôZà–ô‰w´W‹d!¡WC¬y0K'畠‹„}ÆDÎAs¶6ܘš„`¿DÿZ¾y¾iö¨”g#ѝ±“‰¤3~«˜á>\Çöt¦ÝŒ<Ifظü€±ˆÍh `ê;X<~d,"ek‡q3WBÀ bŽ +tDò'~ª›˜ÅÀ"t7^,Dá…!˜F(‚Q.cˆD%8X¶¸a1JàFjƨUs‚14ëXoX¬¤wâÄÆ HÒÞ%BÔ À¹ÄµrÀ­’šˆP¤¯”)=€š£º‘ ^(æôäz…*‚́c$ÚÒ@n»>s5æ PLǓ#_Š%¨çV)3¤^£—bŠdݐ¦ˆ&‰¤íÈô#_¸9 fÇA¡ûQ$'Î"´\ÇBbùÚÿha°´©iÇÀÔÄSx  ¨B ‡JRp½üÈ(½€>Ï0J1ÐD ˜/¾È¥ÆÆéáGHe¬fLp“r©íoP.¿/·ÒÒ#"ž–„rQY:f¢†9(›GO‰+éԻ҆S¢ŽÜ|Cj€–™&åªÑ‹’¼y\ë/FÐ:Q¬B2ŸŸÐFý·™ÇÞJ(àà߆$xD>˜‡¡@ÿÌñÑÉ¢õgx("á`7p:èw+èj_ٙôÎÎÈã‘@™ÈÕ}4‡@Öx“ÎœÏl‡…~8£èA(¤«¯Ïv.I7×Gg¬Nè†+”BRz`}ùh?Ƽp)iɅ 0*@`»¡(½ºh’iÇqâȎx,å}šˆlã ãÊ'2Q˜ü% +Cø'b"¡ :`l  äe©°éûÝÇ +OÅ1t}%¾  #ÙT ’aj°¹@¡;– 0Îq,÷ˆe¹Œ + +¸à¸Q Á7€E'”\å +E­cYžPn@XÀŠEŒP͵ðˆ4ò"þÙ¢éNèÀ_°òn:¬€åŒ•>̟œ,Ÿ]]ÜÝwöo»—÷w0ÖÉÉMçÁ¾¾=ï¶î/®í»«GÀÂ>í¶nÚ0»““nëæ7Àåþääâìö¦ùÇ÷‹‡ŽÝº(㛆&×oήÛDvzÏuÞ·oÝuªçñ±*Š,ß´=ž¶(K*ãíÜtš¼ÉœfÿԖ^6öP£©$oÀÁbx–ªAÿlÉž¬=Ù,L1ÀæÈÀ–$ GL“–£&ÊL6{:`jÚæÙ V”àQ3aýsa é¨Ù0¸N#æÃL61\ùüœ˜ÉæÈY1qÓÑòbôÀCgÆ 3p67F1ÜËäÇTͦVuóöa»svÛm¨Èu¿¨nwZW¿µ`„?ña«T_Z_Uë¸ûí¶{M¿ÅBÉ"5Ü\ZP\í<üuÕijÒ²‹v +å˜YøÌ¢3„5b*ù¦$Ä°þD‘)‰ø¢iŒƒÚ×éÈ,…ˆ Ná0ÄN®6g0 æ0_`+»˜C»™1:HÄaл‡.xE‚aîl.‹´h 󢶈]ã9p'Y$ŠC•/”ôñ¨ÎM rðuðAhz膠ÌĜÜ7O:g&?°,¾ÂhhƁÞ-ÈT_$s—¡â’–N(²”ːmR£¯xîwb“0á#± +±La +®oAGJだ+¹HÞæR¹HÉ\JgÓ¹CO3¦¸Ðâ04ŒÅfòIV¡PA,3¨¢¨vÌ)Ia.-55m’ú&O½˜j/ ¤bùDÂê)y¸ ÒðLð‰xHãÑRñÈ#&ãAÓQÓñßòHòŒ”’÷\xa±‘Rz± Éú0Ex1ϔÛFGÉÃ+Bq£¯ë1b6žé€ ™—ø#e䥐árò†8“•7€ҏkŸò9z’ûßîn<Å Ox…I†±U—I3$ðH‰†´ s©†)Ù°¯»>bÂaÏ]ótÊ¡fޑ’{n›§Ó‡9“xø_»mžæ‘§6NQ&%Z}#æRÆ®¢›s Ģì·AFÌ©ÌîÁ³*upi”¼ÊÌî"³r¨qÓ¹•ÿ½[ã)îxbg¼á÷˜þ+sHKÜ¡ q.4öñ3¤*,?|iÏ!‹ÔÄÐHÌ*B\û_…™ –Ïå‚`3ñÓ ØÈþDh>'4 Õê;ŸJÀ‘2CSÃèìLl&‚¦¦Û,pAŽhŠÂ搅y¢%S4·Ž¹¡ÍUü–^#ÛÓ\x#íÐ)Š„m.ç“ÀÃf}šØù”)p£‚ÜOl$zÆ œÉÿ̀ãdO“Kz€ÓåxØLÐÔ^5)Z˜ ªV²0›3^2– œftªN²9*ž:|Vgˆ6¯SÍHJø(#ñ³ßŸÐ½$~Ÿs÷3Âç:/Ô´ Òà”`ɉ¡œ•Wy™–]“§ïÌó:à:Ñ*)¡µT^µäÕO_=¥ÕYFáe5c–ÅSŒY¬¼žž±>æOk}Ýa¼‹3 ȑ®^”ÝÜ=ÀQí»?²ƒŸN,¤Ò“iì3*©‡ë¡k‹ôò‹âÞ˪è¡!{èÓ6Ho¥öâè§9'§YDëÆbpšsr}ÿM蛪ñ:­ìÒ³‡jì¡H‹ÕnoôcÏêé'Cx›Ú<}ÉZ“%­2µ%cªå¼ñ‘˜,†Rd¿¤‡Z§qÎiÿD/d̈́Œ‘¶425m€ä†¾ çœF¿NCMş³ ÒFD½ÉÑÃ@ÉYKÄ° ²&FÎ`…4 -Ÿµ±ÉXâyc=kÕ×Ó¼˜62C?Wáåܕþ*£Øiëáâ»B/ºïŸ6ë˜UZºÁ†é³ùÆ"¬ò•$Ð⫋ðFÉ]ԕnëš%ÐÎÃm÷/„#S ôˆÊ€™Íy($EYÒ:l#Ã<Ó#QÍ{€d1±ƒŠœ²U­ßÞ|»¸Â}l=|'¹UÅi.Ý<\´®.Z÷HÕ4 ‡·Šs5А®f4&˟˜µeEÐ`e(F:*ƒ¦òEû§oJéoR?¦É§73IǓ͗I;†ù½xâqóïJ=žlþ3¡ŽN?Ìiú÷¥ Eê +«ÒIvØîÉÂû‡ÙËOå§:þ þdÁ¾Bñk<Àÿ§­©²,æ܍×Ô5€^ ܨ™’pnn|Ì|–Ó³òÉìs““ˆæn·ÔÕy~ßúGÇjÝÜà;wð“uÞí܃¡Ñ±î¿ßþl”4˜œ\ÞZû?›ÖZò +endstream endobj 5 0 obj <> endobj 25 0 obj <> endobj 37 0 obj [/View/Design] endobj 38 0 obj <>>> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 45 0 obj [44 0 R] endobj 62 0 obj <> endobj xref +0 63 +0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000026899 00000 n +0000000006 00000 f +0000086484 00000 n +0000000008 00000 f +0000026950 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000020 00000 f +0000086741 00000 n +0000086772 00000 n +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000000 00000 f +0000086554 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000086625 00000 n +0000086656 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000029537 00000 n +0000086857 00000 n +0000027307 00000 n +0000029837 00000 n +0000029724 00000 n +0000029037 00000 n +0000028218 00000 n +0000028475 00000 n +0000028523 00000 n +0000029183 00000 n +0000029297 00000 n +0000029417 00000 n +0000029608 00000 n +0000029639 00000 n +0000029911 00000 n +0000030085 00000 n +0000031263 00000 n +0000054430 00000 n +0000086882 00000 n +trailer +<<91CEEB81984C404395810B8A574978A5>]>> +startxref +87017 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai b/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai new file mode 100644 index 00000000..c7480ad5 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/Eclipse_with_icon_2.ai @@ -0,0 +1,716 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + xmp.did:AD1F418A7C94E91197BDD9C8DFBF9319 + uuid:bddc7d4e-65c4-4f22-90c9-2f47cc2b6270 + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + proof:pdf + + xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + xmp.did:A81F418A7C94E91197BDD9C8DFBF9319 + proof:pdf + + + + + saved + xmp.iid:A81F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T03:03:20+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:AD1F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T04:28:29+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + + EmbedByReference + + K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai + + + + + + + application/pdf + + + Eclipse_with_icon_3 + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T04:28:31+02:00 + 2019-06-22T04:28:31+02:00 + 2019-06-22T04:28:31+02:00 + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqp3FzbW0RluJUhiHV5GCj7zkMmSMBciAPNlCEpGoiyxzUfzC0G1JWAveSD/fYolf9ZqfgDmm1 HtBp4bRuZ8uXzLtMPY2afOojzY7efmXq0hItbeK3U9C1ZGH0/Cv/AAuafN7SZpfRER+38fJ2eLsP GPqJP2LLWf8AMDWqNDLOkLdJRSBKexAWv0VyGKfaGp3BlXf9I/R9jLJHRYOYF931FOLXyBfS0fVd VlkPVo4mY/8ADvX/AIjmyxdg5Jb5ckj7v1n9Tg5O14DbHAD3/qH60fJ5d8kaLCJ7/wBCFO899KAp p/xkIT8M2WHsTTR5Q4j57/scLJ2pnn/FXu2Sa6/OP8ntFqg12yUDalkjTjb/AJhkkGbTFouH6YiP wpwp5JS+ok+9JLr/AJye/KyH+7mvLnp/dWzD/k4Y8yBpZsEHJ/zlZ+WyuqraarID1dYIKD58p1P3 DD+Un5Krxf8AOUn5YO3FhqEQp9p7dSP+FkY4Pys1Tmw/5yD/ACkvCFGuC3c/s3EFxH/wxj4f8NkT p5jorLtI83+VNZIXSdZsr9z+xb3EUj/SqsWGVGBHMKm+RV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KobUNSsdPgM95MsMfYsdyfBR1J+WUZ9Tjwx4pmg24cE8hqIssH1n8yZ3LRaVF6S9P rEoBf5qn2R9Nc5fWe0cjthFeZ5/L+13+m7EA3yG/IfrYfeX97ey+rdzvPJ4uSafLw+jOdzZ55Tcy ZHzd3iwwxiogAJxofkrV9U4ysv1W0O/rSDcj/ITqf1ZsdD2Nmz7n0w7z+gOFq+1MWLb6pdwZedI8 l+U7I6hqtxDCkf2ry+dVFadEDUWvgAK51ui7Fw4uQ4pd53ed1PaebLtfCO4PNvN3/OVflewL2/lq xl1eYbC6mrb2/wAwCDK/yKr8830NITz2de8f8y/85BfmhrjOo1T9F2zdINOX0KfKWrTf8PmTHTwH RLz68vr29na4vbiS5uG+1NM7SOfmzEnLwKVQxV2KuxV2KuxVsEg1HXFWWeXvzX/MTy+UGma7dJCn S3mf6xDTwEc3NR9AyuWGMuYV6z5T/wCcs72MpD5q0hZ4+jXmnnhIB4mGQlWPydflmNPR9xV7d5P/ ADL8k+bowdD1OKa4pyayc+lcrTrWJ6MQPFaj3zFnilHmEMnytXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYqxHzJ5+tbIva6bxubobNL1jQ/R9o/hnPdo9uwxXHF6p9/Qfrd1ouyJZPVk9MftP6nnl9qF7 f3BuLyZppW/aY9B4AdAPYZx+fUTyy4pmy9Liwwxx4Yigu07TL3UblbaziMsp3NOgHix6AYdPpp5p cMBZRmzwxR4pGg9C0jyhouhWrajq8sTvApklnmIWCELuT8VBt/M34Z2nZ3YePFRn65/YPc8vrO1p 5do+mP2l5Z+Yv/OUdjaGXT/JUK3k4qratcKRAp6VhjNGenZmoPZhnUY9Le8nUvnjzD5o8w+Y783+ uX81/dGtHmaoUHfiiCiovsoAzNjARFBKV5JXYq7FXYq7FXYq7FXYq7FXYq7FVSCeaCZJoJGimjIa OVCVZWG4KsNwRir2T8v/APnJrzVojRWfmVTrmmCi+uSFvYx4iQ0Evyfc/wAwzFyaUHlsr6X8o+d/ LPm7Tvr+g3qXUQoJovsyxMf2ZYz8Sn8D2zBnjMTRQnmQV2KuxV2KuxV2KuxV2KuxV2KrJpooYmlm cRxIOTuxoAB3JORnMRBJNAMoxMjQ3LzbzV54n1AvZ6eWhstw8nR5R/Bfbv38M4rtTtuWW4Y9od/U /sep7P7KGP1T3n937WJZz7uU48u+Wr3WrjjF+7tkP764IqF9h4t7Zsez+zZ6mVDaI5n8dXB1uuhg jvvLoGW+Z/Nnkv8ALPy/696/Bnr9XtUo11dSAdht07saKv3DPQND2fDFHgxj3n9byOo1M80uKRfK P5k/m95q89XbC8lNppCNW20mFj6S06NIdjK/+U30AZvMWEQ97QwbLVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVTLy/wCY9c8u6nHqei3kljexfZliPUVqVdTVXU03VgQcjKIkKKvq38o/z+0fzf6O ka0E03zGQFRa0t7o/wDFJJ+F/wDis/QT21+bTmO45IeuZjK7FXYq7FXYq7FXYq7FVk00UETzTOEi jBZ3bYADck5GcxEGRNAMoxMjQ5l5b5t82zaxMbe3Jj06M/CvQyEftN/AZwnavap1B4Y7Yx9vmXru zuzhhHFLeZ+xjeaV2id+WPLNxrd0RUx2cRHrzf8AGq/5R/DNp2Z2bLUz7oDmf0DzcDX66OCPfI8g n35lfmV5d/LTy7HFFGkupyoV0zTFO7Hp6stNxGD1PVjsPb0TR6OMYiEBUQ8dkySySMpGyXx15o80 655n1ibV9aumuryY9TsqIPsxxr0VF7AfrzcQgIigwSnJK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq2rMrBlJDA1BGxBGKvpf8j/+cgTevb+V/OE/+ltSPT9YkNPVPRYpz/P2V/2uh33ODn09 bxQ+g8wldirsVdirsVdirsVeZ+d/NR1Cc6fZv/oMLfvHH+7XH/Go7ff4ZxHbXanjS8OB9A+0/qer 7K7P8MccvrP2ftYlnPu5THQtFudY1BLSH4V+1NKeiIOp/pmZodHLUZBCPxPcHF1eqjhhxH4ebL/P /nnQPyz8oibgslywMWmWFaPPN1LMevFa8nb6OpAz0nRaOMIiEBUQ8VmzSySMpcy+MPMXmLWPMesX GsaxcNc31y3KSRugHZVHRVUbADpm7jERFBrSzJK9R07/AJxx/MzUNPtb+2gtDb3kMc8Ja4UHhKod aim2xzHOpgDSoj/oWL81P98Wf/SSv9MfzUFd/wBCxfmp/viz/wCklf6Y/moK7/oWL81P98Wf/SSv 9MfzUFd/0LF+an++LP8A6SV/pj+agrv+hYvzU/3xZ/8ASSv9MfzUFd/0LF+an++LP/pJX+mP5qCu /wChYvzU/wB8Wf8A0kr/AEx/NQV3/QsX5qf74s/+klf6Y/moK7/oWL81P98Wf/SSv9MfzUFd/wBC xfmp/viz/wCklf6Y/moK7/oWL81P98Wf/SSv9MfzUFd/0LF+an++LP8A6SV/pj+agrv+hYvzU/3x Z/8ASSv9MfzUFd/0LF+an++LP/pJX+mP5qCu/wChYvzU/wB8Wf8A0kr/AEx/NQV3/QsX5qf74s/+ klf6Y/moK8981+WNV8r6/daFqqot/Z+n6yxtzX97Gsq0YdfhcZdCYkLCpRklfUP/ADj3+dTarHD5 P8xz11OJeGlXsh3nRR/cyMTvKo+yf2h/ldcDUYK9QQ96zDV2KuxV2KuxViHn7zIbK2/Rts1Lq5Ws zjqkZ2p82/VnPdvdo+HHwo/VLn5D9ruuyNFxy8SX0x5eZ/Y81ziXql0UcksixRqXkchUUbkkmgAy UYmRAHMsZSAFnk9QtU0jyR5VutT1SVYoraM3GoXHUkjoi+O54qO5PvnovZXZwwYxEfXLn+O4PFa/ WHPkv+Ecnxn+Yvn3VfO/ma41m+JSI/u7G0rVYIATwQeJ7se5+7Onx4xAU4bF8sV2Kv0B8kf8oXoH /bNtP+TCZp8n1H3oTrIK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXxX/wA5Ef8Ak4vMH/Rn /wBQMGbTTfQEvOMvVUgnmt5o54JGimiYPFKhKsrKaqykbgg4q+0PyR/NKLzz5b4XjKvmDTQseoxi g9QEUS4UDs9Pip0b2pmrz4uA+SHo+UK7FXYqhdU1CDTrCa9n/u4V5U7k9FUfM7ZRqdRHDjM5cg3Y MJyzEBzLxi/vri+vJru4PKWZizeA8APYDYZ5rnzyyzM5cy9zhxRxxEY8gh8pbWb/AJc6CJZX1eda pESlqD3f9p/9iNh/ZnUez2h4ic0uQ2j7+90HbWroeEOvN43/AM5OfmUdU1hfJ2nS/wC4/S3D6kyn aS7ptGfFYgf+CJ/lGd/pcVDiLzbwrMtXYq7FX6A+SP8AlC9A/wC2baf8mEzT5PqPvQkf5y+bNX8q eQb7W9IZFvoJIFjaVA60klVGqp9jksMBKVFXzn/0M7+an+/7P/pGX+uZ35WCXf8AQzv5qf7/ALP/ AKRl/rj+Vgrv+hnfzU/3/Z/9Iy/1x/KwV3/Qzv5qf7/s/wDpGX+uP5WCu/6Gd/NT/f8AZ/8ASMv9 cfysFd/0M7+an+/7P/pGX+uP5WCu/wChnfzU/wB/2f8A0jL/AFx/KwV3/Qzv5qf7/s/+kZf64/lY K7/oZ381P9/2f/SMv9cfysFd/wBDO/mp/v8As/8ApGX+uP5WCu/6Gd/NT/f9n/0jL/XH8rBXf9DO /mp/v+z/AOkZf64/lYK7/oZ381P9/wBn/wBIy/1x/KwV6T+Qv5xedPOvnC80vXJYHtIdPkukEMIj b1EnhjG4PTjIco1GGMY2EPecw1fFf/ORH/k4vMH/AEZ/9QMGbTTfQEvOMvV2Ksk/L3ztqHkzzVZ6 5ZkskTcLy3BoJrdiPUjPbcbr4MAchkgJClfduk6pY6tplrqdhKJrK9iSe3lHdHHIfI+IzUEUaKEV gV2KvPfzJ1kvPFpUTfBFSW4p3cj4F+hd/pzkPaPWXIYR03Pv6PS9iaagch67BhGcu79XsbOa9vIb SEVlmcIv0nr9GW4MJyTEI85Fry5BCJkeQZ9+Yfmm1/L78vLq/t+Pr28a22mxt+3cybISO9N5GHcA 56jotLGIjjj9IeDzZTkmZHmXw5PPNPNJPM5kmlYvLIxqzMxqzEnqSc3jBTxV2KuxV+gPkj/lC9A/ 7Ztp/wAmEzT5PqPvQwr/AJyS/wDJSap/xmtf+ohMt031hXxnmzSioNL1C4sbq/gt3ls7Ixi7mUVW L1iRGXp0DFSK9K/MYLHJULhV2KuxV2KuxV2KuxV2KuxVGadpOpakbkWNu0/1SCS7uitKRwQiryMT QAD8TsN8BICoPCr2v/nE3/yYuo/9seb/AKirbMXV/T8VfWGa5D4r/wCciP8AycXmD/oz/wCoGDNp pvoCXnGXq7FXYq+l/wDnFXz6Z7S78mXstZLbld6VyPWJj++iH+qxDge7eGYOrx/xIfQmYSqV1cxW ttLcymkcKNI59lFTleXIIRMjyAtnjgZyERzLxK+vJby8mu5jWSdy7e1T0+jPMc+Y5JmZ5yNve4sY hERHIKGVNjNPy10oS3k+pSLVbcenCT/O4+Ij5L+vOm9nNLxTOU/w7D3n9n3uh7c1FRGMddz7vx9z xn/nKfzkdR812vlq3etro0YkuQDsbm4UNv8A6kfGnzOeg6SFC+95p4fmWrsVdirsVfoD5I/5QvQP +2baf8mEzT5PqPvQwr/nJL/yUmqf8ZrX/qITLdN9YV8Z5s0vff8AnFLT7LUZPNtjfQJc2dzbW0c8 EgDI6M0oIIOYerNUrB/zl/KW98h616luHn8u3rE6fdncodz6Epp9tR0/mG/iBdhzcY81edZcrsVd irsVdirsVdiqP0PRNU1zVrbSdLga5v7xxHBCvcnuSdgANyT0GCUgBZV9VyfllpfkL8kvMtnDxn1S 502d9TvqbySCM0Va9I0rRR9PU5rvFM8g96HyLmyS9r/5xN/8mLqP/bHm/wCoq2zF1f0/FX1hmuQ+ K/8AnIj/AMnF5g/6M/8AqBgzaab6Al5xl6uxV2Kp15M8zXXlfzTpmvWtTJYTrI6DbnEfhlj/ANnG zL9ORnHiBCvvuyvLa9s4L21cS211Gk0Eg6MkihlYfMHNORSGO/mJqBttC+rqaPeOE9+C/E36gPpz Q+0Go4MHCOczXw5u37Gw8Wbi/mh5dnCvWuxV675WtBpnliAmNmcxm5kRBV2LjlQDu3Ggz0XsjT+F p4jqdz8Xie0s3iZ5HoNvk+Rdf/K/83tb1y/1i78t3huNQuJLmXZaAyMWoPi6CtBnTxywAq3CQH/K lvzU/wCpavP+BX/mrD48O9Xf8qW/NT/qWrz/AIFf+asfHh3q7/lS35qf9S1ef8Cv/NWPjw71d/yp b81P+pavP+BX/mrHx4d6vtDyla3Fp5V0a1uUMVxb2NtFNG3VXSFVZT8iM1czZKGC/wDOSX/kpNU/ 4zWv/UQmXab6wr4zzZpfQv8AziF/x0fM3/GG0/4lLmFrOQV9B+ZfLekeZNEutG1eAT2V0vF1/aU/ suh34up3U5hxkYmwh8SfmV+XWseRPMUml3wMtpJWTTr4CiTxeI8HWtHXsfYgna4sgmLSxLLFdirs VdirsVVba2uLq4itraNprid1jhhQFmd2NFVQNyScSVfY35Ifk/b+R9J+v6iiyeZr5B9akHxCCM0I t0IJHUVdh1PsBmsz5uM0OSGSfmz/AOSz8z/9s25/5NnK8P1j3q+EM26Xtf8Azib/AOTF1H/tjzf9 RVtmLq/p+KvrDNch8p/nd+WHn/W/zQ1rU9K0O5vLC4+rejcRhSrcLSFGpUjoykZscGWIgASlg3/K lvzU/wCpavP+BX/mrLfHh3q7/lS35qf9S1ef8Cv/ADVj48O9Xf8AKlvzU/6lq8/4Ff8AmrHx4d6u /wCVLfmp/wBS1ef8Cv8AzVj48O9X1L+Ry+Y7XyDZ6R5jtJbLUtLZrdYptna3ryhfYnYAlB/q5r89 cVhCF/Mu89XV4LUGq28VSPBpDU/8KFzhPaTNxZhD+bH7/wAB6nsPFWIy/nH7mIZzru0TptobzULa 1H+75UjPsGYAn7sv02LxMkYfziA1Z8nBAy7g9qmUUhiCngXAqu3EIC4+iq0z1ACngCVbFXYq7FXY q7FXYq8w/wCckv8AyUmqf8ZrX/qITMjTfWFfGebNL6F/5xC/46Pmb/jDaf8AEpcwtZyCvpbMFDGv zB8h6N528uzaPqS8WNXs7sCrwTAUWRelfBl7jbLMeQwNhXxH5v8AKWs+U9fudE1eL07q3PwuN0lj P2JYz3Vh0+475tYTEhYSkuSV2KuxV2Kvp3/nGX8sNMh0iDz3fcbi/uzKmlx02t445Ggkff8A3Y5R h7L8zmBqspvhQ9+zDVif5s/+Sz8z/wDbNuf+TZyzD9Y96vhDNul7X/zib/5MXUf+2PN/1FW2Yur+ n4q+sM1yHYq7FXYq7FXYqoSHheQtUBZQ0RFN2YDmm/gqq/34VeSebbn6x5kv3rXjKY/+RYCf8a55 x2rk49TM+dfLZ7fs6HDggPK/nulGa5zWQ+QrYTeZrckVWFXkI+SkD8WGbjsLHxaqPlZ+x1na8+HT nzoK/wCc35vyfl7e6P6GnrqMt9Hc843lMQRUaLidletTXPR8GHjt4551/wBDe6j/ANSzD/0lt/1S y78mO9Lv+hvdR/6lmH/pLb/qlj+THerv+hvdR/6lmH/pLb/qlj+THerv+hvdR/6lmH/pLb/qlj+T Herv+hvNS/6lmH/pLb/qlh/JjvV3/Q3mpf8AUsw/9Jbf9UsfyY71Y1+Yv/OQ97508qXPl+XQ47JL l4nNwtw0hHpSB6cTGvXjTrk8em4Tdq8gpmSr6E/5xD/46Pmb/jDaf8SlzD1nIK+lswEOxVgn5ufl Zp3n3QDD8MGtWYZ9MvSOjHcxPTrG9N/Dr7G7DlMD5K+K9X0jUdI1O50zUoGtr60cxXED9VZflsR4 EbHNoCCLCUJTCrqYq9N0f8n7pfys1rz1rSvAqQRnRLU1Vn5zIhuJB/Jxb4B+116UrRLN6xEK+h/+ cd//ACTvl/8A6PP+o6fMLU/WUPRsoVif5s/+Sz8z/wDbNuf+TZyzD9Y96vhGmbdLMvys/MafyB5h uNZhsV1Bri0ezMLyGIAPJHJy5BX/AN9UpTvleXFxilepf9Deal/1LMP/AElt/wBUsx/yY71d/wBD eal/1LMP/SW3/VLH8mO9Xf8AQ3mo/wDUsw/9Jbf9UsfyY71d/wBDe6j/ANSzD/0lt/1Swfkx3q7/ AKG91H/qWYf+ktv+qWP5Md6u/wChvdR/6lmH/pLb/qlj+THeqa+U/wDnJ258w+adI0a40KKzS/u4 rcXK3BkKNK3AUUxqDXlx698jPS8IJtCPv5TLfXEp6ySux+lic8izy4skj3kvoGGNQA7gFDKWxmP5 ZRA6tdS/yQcR/snU/wDGudJ7NR/fSPdH9IdH27L93Ef0v0PGf+csb31fPum2gNVt9MRiN9nknlr/ AMKq56JpB6T73mHiWZSuxV2Kt4quphV1MVdTFXUxV9Cf84iD/cj5m/4w2n/EpcwtbyCvpTMBDsVd iryn88/yci86ab+ltJjVPM1klIuii6iXf0XJoAw/Yb6DtuMnT5+E0eSvkCaCWGV4ZkaOaNikkbgq yspoVYHcEHNml6/+Q35Mt5rvk8wa3CR5ctH/AHUTCn1yVD9gVG8SkfGe/wBnxpi6jPw7Dmr3f89I 0j/KLzBHGoREghVEUUAAnjAAAzD0/wBYQof848f+Se8v/wDR3/1Gz4dT/eFXo2UKxT82P/JZ+Z/+ 2bcf8mzlmH6x71fCVM3CXUxV1MVdTFWmGJVbgV2KuxVMvLV41l5j0q8WvK2vLeYU61jlVtunhgkL BV9IZ4c+huxVnP5XA+vqJ7cYt/pbOp9mPqn8P0vP9vcofH9Ceaj5H8oa9qV1ea1o9pqN1GywpNcQ pI6xiNGCAkVpyYn6c7IZJAbF5tD/APKpvyz/AOpY03/pGj/pj40+8q7/AJVN+Wf/AFLGm/8ASNH/ AEx8afeVd/yqb8s/+pY03/pGj/pj40+8q7/lU35Z/wDUsab/ANI0f9MfGn3lW/8AlU/5af8AUsad /wBI8f8ATD40+8q7/lU/5af9Sxp3/SPH/THxp95V57+fPkDyTo/5aahf6VodlZXsctuEuIIURwGm VWAYCu4NMv02SRmASr5XpmyS+gv+cRh/uR8y/wDGG0/4lLmDreQV9J5r0PKPzx/MLV/I2oeVtUsf 3ts8t1Hf2RNEnh4xfCTvRl6q3Y+1QcnT4hMEFXonlrzJpHmXRbbWdImE9ldLyRujKw2ZHX9llOxG UTgYmiqZ5FXzx/zk5+WulRWQ87WFLa8aWODUoAKLMXqFmFOjilG/mG/Ub52kym+Eq9T/ACYAH5W+ W6f8si/8SbMfP9ZVD/nt/wCSm8xf8YYv+oiPHT/WFQ3/ADj1/wCSf0D/AKO/+o2fDqv7wq9FyhWK fmv/AOS08zf9s64/5NnLcP1j3q+FaZuUvWP+cbPLuh6755vrTWbGDULWPTJZUhuEEiCQXEChgG70 Yj6cxdXIxjt3q+kv+VT/AJaf9Sxp3/SPH/TMDxp95Q7/AJVP+Wn/AFLGnf8ASPH/AEx8afeVd/yq f8sz/wBMxpv/AEjx/wBMHjT7yrX/ACqb8s/+pY03/pGj/pj40+8q7/lU35Z/9Sxpv/SNH/THxp95 V3/Kpvyz/wCpY03/AKRo/wCmPjT7yrh+U35Zg1HljTa/8w8f9MfGn3lXmWeSvobsCWc/lcf3+oCv VYjT5Fs6n2ZPqn7h+l5/t7lD4/oTHXPzL8jeV9WuNP17VY7G8lKXEcLpKxMTRqgaqIw+0jDOzjil IWA82gP+V8flJ/1MUP8AyKuP+qeH8vPuV3/K+Pyk/wCpih/5FXH/AFTx/Lz7ld/yvj8pP+pih/5F XH/VPH8vPuVsfnx+UpNP8RQ/8irj/qnj+Xn3Ku/5Xp+U/wD1MMP/ACKn/wCqeH8tk7ld/wAr0/Kf /qYYf+RU/wD1Tx/LZO5WBfnf+afkDzB+XV/pej6xHd38slu0cCpKpISZWbd0UbAeOX6fBOM7IV8y 0zYpfQP/ADiQP9yPmX/jDa/8SlzB13IK+kc1yHz/AP8AOW4/3HeWv+M11/xGLM/Q8yry/wDJ381r 7yJrXCctP5fvWA1C0G5Q7ATxD+dR1H7Q28CMnPgEx5pfZOn39lqNlBfWMyXFncoJIJ4zyV0YVBBz UEEGih5j/wA5Mf8Akrp/+Yu2/wCJHMnR/WrIvyZ/8ld5b/5hF/4k2V6j6yqG/PX/AMlP5h/4wxf9 REeHTf3gVD/849/+Sg0D/o7/AOo2fDqv7w/jor0TMdWK/mt/5LXzN/2zrj/k2ctwfWPer4Xpm6S9 Q/5x481+XvLHnW9v9dvFsbSXTZYI5XV2BkaeBwtEDH7KMcxtVjMo0O9X0P8A8r0/Kf8A6mGH/kVP /wBU8wPy2TuQ7/len5T/APUww/8AIqf/AKp4/lsncq0/nt+Uw6+YoR/zyuP+qeD8vPuVr/lfH5Sf 9TFD/wAirj/qnj+Xn3K7/lfH5Sf9TFD/AMirj/qnj+Xn3K7/AJXx+Un/AFMUP/Iq4/6p4/l59ytj 8+PylJoPMUNf+MVx/wBU8fy8+5WF6hEYb+5iPWOV0P8AsWIzyjUR4ckh3Evf4ZcUAe8BD5S2sx/L KUDV7qL+eDkP9i6j/jbOj9mp1mkO+P6Q6Pt2P7qJ/pfoeNf85ZWXp+fNMuwKLcaaiE+LRTy1/wCF dc9F0h9J97zDxHMpXYq7FWwaEHCqLpliupirqYq6mKvf/wDnEof7kPMv/GG1/wCJS5ga7kFL6QzX IeAf85aj/cd5a/4zXX/EYsz9DzKQ+b6ZsVevfkT+cL+Vb1NA1qYny5dv+6lY1+qSuftip2iYn4x2 +141xNTp+IWOavW/+ck3ST8rJXRg6PdWzKymoILEggjMTR/3iGR/k1/5K/y5/wAwi/8AEjleo+sq h/zz/wDJUeYf+MMX/J+PDpv7wKhv+cfP/JQ6B/0d/wDUbPh1X94fx0V6JmOrFfzV/wDJbeZv+2dc f8mzluD6x71fDVM3aXUxV1MVdTFVCf7QHtkJKpZFXYq7FUz8s2bX3mTSbJQS11eW8IA61klVffxy MjQKvqfzdbfV/Ml+lPtSeoP+egD/APG2eQdrY+DUzHnfz3e17OnxYInyr5bJPmuc5kHkS59DzNbA mizB42+lSR/wwGbfsPJw6qPnY+x1va0OLTy8qKO/OD8no/zEutJI1M6XJp6XHKX0PrAkWQxUWnqw 8ePE56PhzcF7PGvPf+hP/wDv7f8AuX/9nWX/AJzyV3/Qn/8A39v/AHL/APs6x/OeSu/6E/8A+/t/ 7l//AGdY/nPJXf8AQn//AH9v/cv/AOzrH855KrD/AJxHoAP8V/8Acv8A+znJfn/6P2ptv/oUj/v6 /wDuX/8AZzh/P/0ft/YtsZ/MX/nHv/BvlS51/wDT/wBf+rvEn1b6p6PL1ZAlefryUpyr9nLMOr45 VSvH6Zmq9+/5xMH+5DzJ/wAYbX/iUua/X8gpfR2a1DwH/nLMf7j/AC3/AMZrr/iMWbDQcykPnGmb JXUxVm7fmbqV3+Ws3krU+VwkM0Mul3RNWjjjYloXJO6gH4PDp0pSjwAJ8QV9R/k5/wCSw8uf8wi/ 8SOarUf3hQh/zy/8lT5h/wCMMX/J+PDpf7wKhv8AnH7/AMlFoP8A0d/9Rs2HV/3h/HRXoeY6sV/N X/yW3mX/ALZ1x/ybOW4PrHvV8O0zepZl+Vf5c/498w3Gj/pD9G+haPd+v6Pr14Sxx8OPOKlfVrWv bKM+XwxdWr1T/oUj/v6/+5f/ANnOYv5/+j9v7Ft3/QpH/f1/9y//ALOcfz/9H7f2Lak//OIPJi3+ LaV/7V//AGc5A62+n2qt/wChP/8Av7f+5f8A9nWP5zyQ7/oT/wD7+3/uX/8AZ1j+c8ld/wBCf/8A f2/9y/8A7OsfznkqbeU/+cXE8v8AmbS9bfzEL4abcxXItTZelzMTBl+P15ONCK/ZORnqrBFKy/8A MyzMeq292B8NxFxJ/wAqM7/gwzz/ANpMNZYz/nD7nqOw8t4zHuP3sOznHeIjT7o2l/b3Q6wSJJ/w LA5dp8vh5Iz/AJpBas2PjgY94e2s6ssciseFQRx35BhxH0fFXPUAQRYeBIpUwodirsVdirsVdirz X/nIn/yVWp/8ZbX/AJPpmVo/7wK+P6ZuUvff+cThTUPMn/GK1/4lLmv7Q5BS+jc1iHgf/OWIrp/l v/jNdf8AEYs2Gg5lIfONM2aupirqYq+2fyd/8lh5c/5hF/4kc0ep/vChDfnj/wCSq8wf8YYv+T8e HS/3gVD/APOP/wD5KPQf+jv/AKjZsOr/ALw/jor0LMZWLfmp/wCS38y/9s64/wCTZy3B9Y96vh6m b5L2T/nFgf8AIQdQ/wC2TN/1E2+YWv8AoHvUvqbNSh2KuxV2KuxV2KrWFZEqKhasG8DSn6icVY3+ YWn/AFrQTOorJaOJNuvE/C366/Rmj7f0/Hp+Ic4G/wBBdt2Pm4M1dJbPLM4R652KvWvKd2NU8rxR s7q6o1rK6MVdSo4gqw3DcSDXPROxtR4mniesdvl+yniu08Ph55dx3+b438xeb/zP0PXtQ0a6806x 9Y0+4kt5D9fuqExsV5D950alRnUxhAi6Dgpf/wArK/MX/qatY/6T7r/qpkvCj3BXf8rK/MX/AKmr WP8ApPuv+qmPhR7grv8AlZX5i/8AU1ax/wBJ91/1Ux8KPcFbT8y/zEVgT5p1cgdQb+5/6qYRjh3B X3B5RnluPKmizzSNLNNYW0kkrkszM0KkszHckncnNTk+o+9DC/8AnIj/AMlVqX/GW1/5Ppl+i/vA r5Cpm6S98/5xQH+5DzH/AMYrX/iUua7tDkFL6LzWIeCf85Xj/cf5c/4y3X/EYs2PZ/MpD5zpmzV1 MVdTFX2t+T3/AJLHy7/zCL/xI5otT/eFCH/PD/yVfmD/AIxRf8n48Ol/vAqH/IH/AMlJoP8A0d/9 Rs2HWf3p/HRXoOYysW/NP/yXHmT/ALZ1x/ybOXaf+8HvV8Q0zfJex/8AOLQ/5CBqH/bJm/6ibfML X/QPf+tS+pM1CHyR+fPnnzlpv5p6zYaZr2o2NnD9V9O2trueKNedpCx4ojqoqWJPvmzwQiYDYJef /wDKyvzF/wCpq1j/AKT7r/qplvhR7grv+VlfmL/1NWsf9J91/wBVMfCj3BXf8rK/MX/qatY/6T7r /qpj4Ue4K7/lZX5i/wDU1ax/0n3X/VTHwo9wV9Z/kLba+v5dWWoa9f3WoahqrveCS8mknkSBqLCi tIWPEovMD/KzXagjiodEPQLiCK4t5IJRyilVkceKsKHMXJATiYnkRTKEzGQI5h4nqNjLY309nL/e QOUJ8adD9I3zzHUYTiyGB5xL3uHKMkBIdUNlLazL8ttVEOoTae5+C6XnF/xkQbj6V/VnSezmq4ch xn+Ll7x+z7nR9t6figJj+H7i8e/5yp8mtYeZ7TzRbp/ourxiG6YdrqBQoJ/14gtP9U56HpJ2K7nm HhmZauxV2KuxV+gPkj/lC9A/7Ztp/wAmEzT5PqPvQxD/AJyH/wDJV6l/xltv+T6ZkaL+8CvkSmbt L1D8jfzH8veSLrV5dZW4Zb6OBYfq6K5rGXLcuTJT7QzD1eCWQClet/8AQzP5c/761D/kQn/VXML8 hk8kU8v/ADy/NHy153tNIi0ZblWsZJmm+sRqgpIEC8eLPX7JzM0mnljJtLySmZqupirqYq+i/IH5 +eRtA8maTo99Hem7soBFMY4UZOQJPwkyDx8M1ebRzlMkUql+ZP58eSPMfkjVdF0+O9F5eRosJliR UqsqOakSN2XwxwaOcZgmlUfyt/PPyV5X8iaZoWpJeNe2fr+qYYkZP3txJKtCXU/ZcdsOo0k5zJFK yv8A6GZ/Ln/fWof8iE/6q5T+QyeSKSTzt/zkD5E1ryjrGk2cd8Lq+tJYITJCipzdSByIkNB9GWYt FOMgTWyXzfTNqr2L/nFwf8hA1D/tkzf9RNvmB2h9A9/61L6izUIfFf8AzkR/5OLzB/0Z/wDUDBm0 030BLzjL1dirsVT3yR5XufNPmzTNBt6hr6dUlcCpSIfFLJ/sI1ZsjknwxJV982dpb2dpBaWyCK2t 41ihjXYKiAKqj5AZpybQq4FYB+ZWjFZYdWiX4XpFc0/mH2GPzG33ZyXtHo6IzDrsf0fqej7E1Oxx n3j9LBc5V6FWtLqa0uormE0lhcOh91NcsxZTjmJR5g215MYnExPIvQPPflm0/MP8vLmwiKrNdRCe wkY7R3UW6Anw5VRvYnPUNDqxOMckeReEz4TjmYno+HLm2ntbmW2uIzFcQO0c0TCjK6HiykeIIzfA talirsVdir9AfJH/AChegf8AbNtP+TCZp8n1H3oYx+fNje335aahbWVvLdXDS25WGFGkcgTKTRVB Owy/RkDILV8r/wCDPN//AFY9Q/6RZ/8AmjNz4sO8Jd/gzzf/ANWPUP8ApFn/AOaMfFh3hXf4M83/ APVj1D/pFn/5ox8WHeFd/gzzf/1Y9Q/6RZ/+aMfFh3hXf4M83/8AVj1D/pFn/wCaMfFh3hXf4M83 /wDVj1D/AKRZ/wDmjHxYd4V3+DPN/wD1Y9Q/6RZ/+aMfFh3hXf4M83/9WPUP+kWf/mjHxYd4V3+D PN//AFY9Q/6RZ/8AmjHxYd4V3+DPN/8A1Y9Q/wCkWf8A5ox8WHeFd/gzzf8A9WPUP+kWf/mjHxYd 4V3+DPN//Vj1D/pFn/5ox8WHeFd/gzzf/wBWPUP+kWf/AJox8WHeFer/APONnl/XtO8830+oabdW cLaZKiy3EMkSljcQEKGdQK0B2zC184mAo9VL6SzUofFf/ORH/k4vMH/Rn/1AwZtNN9AS84y9XYq7 FX03/wA4reQWtdPu/Od7HSW9DWmmBhuIUb97KP8AXdeI/wBU+OYGryb8KH0BmGrsVQ+oWMF/ZTWc 4rFMpVvEeBHuDvlOowRywMJcpNuHKccxIcw8Y1PT7jTr6aznFJIWoT2I6hh7Eb55rqdPLDkMJcw9 zgzRywEo8ihcobmafl1rwguW0qdqRXB5W5PQSU3X/ZD8fnnTez2u4JeDLlLl7/2/jm6LtrScUfEH Mc/d+x5H/wA5O/lo2n6ovnPTYf8AQdQYR6qqDaO56LKadpRsT/N7tnoOly2OEvMvBcy1dirsVfoD 5I/5QvQP+2baf8mEzT5PqPvQnWQV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kviv/nIj/wAn F5g/6M/+oGDNppvoCXnGXq7FWUflx5Gv/Ovmu00S1qkLn1L65Ar6NshHqPv33ovixGV5cgiLV91a ZptlpmnW2nWMQgs7OJIbeJeipGAqj7hmpJs2hE4FdirsVYr578tnUbP69bJW8tl+JR1ePqR816jN D252d40PEiPXH7R+x3HZOt8KXBL6ZfYXmGcM9YuR3R1dCVdSCrDYgjcEYQSDYQQCKL0/TbjS/Ofl e50vVYlmWaI2+oQHaoYbOvhXqCOjD2z0TsjtHx8YP8cef6/i8X2hozgybfSeX6nxv+Zf5fan5G8z z6Rd1ktWrJp15SizQE/C3+sOjjsfamdTiyCYtwWKZYrsVfSOgf8AOVHl/TNC03TZNDu5HsbWG2eR ZYwGMUaoSK+PHMGWkJN2hH/9Dc+XP+rBef8AI2LB+TPerv8Aobny5/1YLz/kbFj+TPerh/zlz5br voF5T/jLFj+TPeqKi/5yr8tyiqaLdHxHqx1+7LY9nk8pBNL/APoaTQP+rHdf8jY8P8my7wtO/wCh pNA/6sd1/wAjY8f5Nl3had/0NJoH/Vjuv+RseP8AJsu8LTv+hpNA/wCrHdf8jY8f5Nl3had/0NJo H/Vjuv8AkbHj/Jsu8LTv+hpNA/6sd1/yNjx/k2XeFp3/AENJoH/Vjuv+RseP8my7wtOb/nKby+oq 2iXQA6kyx4ns2XeFpCSf85b+WlNF0K8f3EkYGVHRnvQt/wChufLn/VgvP+RsWD8me9Xf9Dc+XP8A qwXn/I2LH8me9Xf9Dc+XP+rBef8AI2LH8me9Xg/5m+brbzf531LzFbW72sN96HCCQhmX0beOE1K7 bmOuZeKHDEBLF8sVVtba4urmK1to2muJ3WOGJAWZ3Y0VVA6kk4kq+1PyV/LCHyL5YCXKq2vagFl1 OYUPEj7ECn+WOv0tU+GarPl4z5IehZSrsVdirsVdirzfz15UNpK+qWSf6JIa3EY/3W5P2h/ksfuO cZ252X4ZOWA9B5+R/UXqOye0OMeHP6hy8/2sOzm3eI7RtXutJv47y3O67SIejoeqnMvR6uenyCcf 7Q4+p00c0DGTM/O3k7y9+Z3k/wCruwjnFZLC8oDJbXFNww8D0de4+g56RoNdHJEZIcj+KeJ1GCWK ZjLm+MfM/ljWfLGt3OjaxAYL22NGHVXU/ZdG/aVhuDm9hISFhqSrJK7FXYq7FXYq2CVNQaEdCMKo qLUrhNmo49+v35YMpColNVhP21Kn23GWDMFVlv7Rv92U+YIyYyRVeLq2P+7V+/Dxx70rTe2g6yD6 Kn9WDxI96FN9Ttl+zVvkKfryJzRVDSarIdo0C+53OQOY9FQkk0shq7FvnlJkTzVZgV2KuxV2KuxV sAk0HXFX1N/zj7+Sp0OKLzb5igprEyV02ykFDaxsCDI4P+7XU7D9ke521+oz36RyQ90zEV2KuxV2 KuxV2KtSRpIjRyKHRwVZWFQQdiCDglEEUeSQSDYeX+b/AChNpcrXdopfTnNdtzESfst/k+B/zPDd rdkHAeOG+M/7H9j1vZ3aQyjhl9f3sXzRO2Tfy55ju9Fu/Uj+O3egngJ2YeI8GHY5sez+0J6adjeJ 5j8dXC1uijnjR+roWRfmB+XXlf8AM7y9HMHEOoxI36P1JR8cTdfSlX9pK9V7dRnoui10ZxE4G4n8 fN43NhlikYyG74982eUdf8qaxLpGt2xtrqPdT1jkQ9JIn6Mp8foO+bqExIWGtJskrsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdiq5EeR1jjUu7kKiKKkk7AADFX07+R35Afop7fzP5thDakKSaf pTiotz1WWYd5O6r+z1PxfZwM+ovaKHvmYauxV2KuxV2KuxV2KuxVqSNJEaORQ6OCrKwqCDsQQcEo gijySCQbDzrzV5EltS97pamS23aS2G7p/q/zL+Izju1OwzC54hce7qPd5PTdn9rCdQybS7+9hmc0 71NNB8w32jXXq255QtT1rdj8Lj+B8Dmfoe0MmmnceXUd7h6vRwzxqXPoWZa95e8l/mZ5fNpqEQdk 3jkWi3VrIw+0jb9af6rd87/s/tKGaPFjPvDyGq0k8Mql8+98q/mZ+TXmnyLcNNOhvtEdqQarCp4b nZZl3MT/AD2PYnN9izCfvcdgOXK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqm3lrytr/mbVY9L 0Sze8vJN+KCiovd5HNFRR4scjKYiLKvrD8pPyG0XyWseqamU1LzKRUT0rDbV6iBWH2uxkO/hx3rr s2oMthyQ9VzHV2KuxV2KuxV2KuxV2KuxV2KuxVi/mPyNZakXubOlrempJp+7c/5QHQ+4zR9o9iQz XKHpn9h9/wCt22i7Vni9MvVD7Q851LSdQ02cwXsLRP8Ask7qw8VYbHOM1OlyYZcMxRenwaiGUXA2 p2V9d2NwtzaStDMnR1/UR0I9jkcOeeKXFA1JnlxRyR4ZCw9A0Xzvpeq27afrUccbTKY5BIA1vKrb EMGqBXuG2zsez+34ZKjk9E+/of1PM6zsicPVj9Uft/a84/MX/nF/SNS9XUvJsyabdvV202Uk2jk7 /unHJovluvhxGdXi1Z67umfO3mfyd5m8r331LXtOmsZjXgZBWOQDqY5Fqjj3UnM6MxLkqTZJXYq7 FXYq7FXYq7FXYq7FXYq7FVW2tbm6uI7e1hee4lPGKGJS7sx7Kq1JOJKvavy9/wCcYvMermO+81SH RtPNCLNaNeSD3G6xV/yqt/k5i5NUBy3V9KeVvKHlzyrpi6boVlHZ2w3cru8jfzSOas7fM5gTmZGy hOMirsVdirsVdirsVdirsVdirsVdirsVdiqjd2VpeQGC6iWaJuqOKj5jwOVZcMMkeGYBDZjyygbi aLCtZ/LVTyl0mbj3+rTHb5K/9fvzmtZ7OdcJ+B/X+v5u903bfTIPiP1MN1DSNS06The27wnoGYfC fkw+E/Qc5vUaTLhNTiR+O93mHUY8ouBBR+iebtX0kqkcnrWo628m60/yT1X6MytF2tm0+wNx7j+N nH1XZ2LNuRUu8Mxj8y+UfMlm2n6xbxGOXZ7S9RZImPTZmHHv3oc6zR9u4cnM8EvP9f8AY87qeycu PceoeX6mAebf+cWvJuqc7ny7dy6NcP8AEsP+9Fqa77KxEi19np7Z0WPVnru614/5k/5x0/M/RS7w 2KavbKdpbBxI1O37p+EtfkpzKjqYHyV51qOlanps5t9Rs57K4HWG4jeJ/wDgXCnLgQeSoXCrsVdi rsVdiq5EeR1RFLuxoqqKkk9gBirMvL35OfmVr/BrHQblIH3FxdAW0dP5g0xTkP8AVrlUs0B1V615 U/5xLoyTeatYBAoWstOHXvvPKPvAj+nMees7gh7Z5T/L/wAneU4fT0HS4bRyOMlzTnO4/wAuZ+Tk e1aZiTySlzKshyCuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KrZI45UKSIHRvtKwBB+YOR lESFEWExkQbCQah5D8vXdWSFrWQ/tQHiP+BNV+4ZqdR2FpsnIcJ8v1cnZYe1s8OZ4h5sdvPyxvFq bO8jkHZZVKH7155p83s1MfRMH37frdli7difriR7t/1Ia20Xz7ox/wBDEnpj9mN0kQ/88yT+rKce j7Q0/wBF15EEfL9jbPVaPP8AVV+YIPzTi185eY7cBdT0WZgOssaOmw70IYH782GLtjUw2y4pe8Ah wsnZuCX93kHxITE+aPLWow/V9QgZUfrBeW5ZT232dfvzY4u2cJ58UD5g/ocKfZmWPKpe4pVc/lZ+ Uet8m/QOnSE7sbVRA2/c+gYzm1w63j+iV/Fw54pw+oEJNc/841/lNMax6dPbCtaRXU5+j940mZA1 U2tAv/zi1+WLOWD6igPRVuEoPvjJw/m5qiIP+cZPyqjK87a7m4ihD3Liu3U8OH4YPzU1TrT/AMiP ymsSDF5ehkYd7iSaep27Su69vDInUTPVWWaV5c8vaQKaVplpp4pT/RYI4dv9gq5WZE8yqY5FXYq7 FXYq7FXYq7FXYq7FXYq7FX//2Q== + + + + + + 1 + False + False + + 119.000000 + 118.999512 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Standard-Farbfeldgruppe + 0 + + + + + + Document + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/Shading<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 119.0 119.0]/Type/Page>> endobj 8 0 obj <>stream +H‰tVÉn9 ¼ë+ôM“¢Ökœ`NÁ ÈarHâÃK'ÿLQK/^l¸›¥nq)Õ~ø÷Ñ?|~dÿáã£wώ½Hë›]þ|wÿùߎIŠz\Õ®ŠëŸŸî៯ìþuÏ^<ãW°-’0‹Obö·_ÎÖíº…B,Š»Pãä·X©É¸…²àÍm%Q‹uÞ +Õ¤Çö‰Ù^vüÚyu¼ûq浉»§î ~Ÿ +e”fɧ†´'Ž WÍÇL9ù€(\}N`$.tsW|wU)·²p«T$.GÍ07wÅ÷…K¡ÖütÔùÊ +;Ñvâ»9N8Ó~®µÝzWŸ÷nLl?È.´0$M'óôÜB†š$Ïê«X«?|ó_ŸØÿ}òŸ¾ùÁè{jj¹Áeª&)©ïˆI)*K9¥„¨5¨—FÚÐÐBM”CöIˆ^v1v»@JZĐ0Z¨h]èæ ×ÒÂ[%ÓS¥èBëÖÖדï[¢ßúž¸<.ˆÐPç̅¹´žèxÈ©X£Š­—azÜzyé¤L1.Œ¢ƒš(  ȁ‚V=رÝÜÌϽےtÇîWaªí@jìã1±’ån(!Ùl¾E˘§uwO=½#«fL«‰©ævÿ±¡çÔ­MÌeîR5ú^¯Œ×A=¿Q,@Ùi@™PJ/0ã(™ªÕ“ې‡E¯ý4X®ÆÂÉw0Uæ#Ó7q櫽Iwl¢‘•PN²RjxiЙ]µ¼¤v5¼&8ÐSᛔkçvšRH’°P,Œ^’†NvƘ²iƒfŠ+(‡ö&8Úí½ ÷µÀÓÄË'sŠÂ*‡t^¢ÓNâî· $§ ÆJ6ñη€iŠºW`XÂYbçp/÷%‰öub®õ±áº Omsƒž„]óy̬6çe˜s”èS6^îãwýÐØ¡Q“× +×bgB-uÝæ¹Oý냱Äq²1 rTq•QððB➴W˜úÖ̖@§:¾9šâefÕº“ÑÍê§` +:`Ù/½&œ1¼‘"ܕØÏÃìIÚSœˆÇPiÉÆMÚ("Jí÷é3þaùâþ`I§°™ +endstream endobj 12 0 obj <>stream +8;UT3d1$(!#XdW+I*n)TEYph=lWDIX;+X<'.?nF.`PGr7D'0;'C-cJa))@!lGl10> +SVI*;>8s'Sl1D@Ghoas$iEm@/.&inSS-&a*08^n~> +endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 11 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 5 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 10 0 obj <> endobj 9 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (Eclipse_with_icon_3.ai) +%%CreationDate: 6/22/2019 4:28 AM +%%Canvassize: 16383 +%%BoundingBox: 404 366 514 469 +%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%%DocumentFiles:K:\EclipseWorkspace\net.mograsim.plugin.branding\raw_files\icon_white.ai +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 399.6704 358.1719 518.6704 477.1714 +%AI3_TemplateBox: 639.5 400.5 639.5 400.5 +%AI3_TileBox: 43.1904 129.791 843.8301 705.7915 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: 60.5 670.5 2 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 22 0 obj <>stream +%%BoundingBox: 404 366 514 469 +%%HiResBoundingBox: 404.5703 366.5684 513.7705 468.7744 +%AI7_Thumbnail: 128 120 8 +%%BeginData: 22177 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FD31FFCFCFC9C9C2FD04C1C8C8CFCAFD6EFFCACFC8C89FC1BAC098 +%C1C1C9C9FD70FFCAC9C2C1C0C1C0C0BAC1C2C9CAFD0BFFA8A87EA87D7E7D +%A87DA8A8A9A8FD58FFCAC9C1C198C09EC198C0C1C9CAFD07FFA8A8535328 +%2821280028002100220021002821282853537E7EFD51FFCFC2C1C0C1C0C1 +%C0C1C0C8CAFD07FF7D772828212800282828212828282128282821282828 +%21282128002828537DA9FD4BFFC9C2BAC098C1C0C198C1C2CFFD05FFA977 +%4C0028002800282128002821280028212800282128002821280028212800 +%280021002853A8A9FD45FFC9C1C0C0C1C1C1C0C1C0C8CAFD05FF7D532128 +%212821282828212828282128282821282828212828282128282821282828 +%212828280028214C53FD42FFC9C198C19EC198C198C09FCFFD04FFA87721 +%220028002821280028212800282128002821280028212800282128002821 +%2800282128002821280028002100537EFD3EFFC2C1C0C1C1C1C0C1C0C1C9 +%FD05FF532800282828272828282728282827282828272828282728282827 +%28282827282828272828282728282827282828272821284CA8FD3AFFC998 +%C0C0C19EC1C0C098C8CFFFFFFFA853002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%2821280028212200537EFD36FFCAC8C0C1C0C1C1C1C0C1C1CFFD04FF7728 +%002821282828212828282128282821282828212828282128282821282828 +%212828282128282821282828212828282128282821282828002853FD34FF +%C9C098C19EC198C198C09FFD04FFA8282100282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%280028212800282128002821280022217DFD31FFC2C1C0C1C1C1C0C1C0C1 +%C9FD04FF7D21282728282827282828272828282728282827282828272828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828280053A8FD2DFFCF9FC0C0C19EC1C0C198C1C9FFFFFFA828 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%0028212800287DFD2BFFCFC1C1C0C1C1C1C0C1C0C1CAFFFFFF7D28212821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%282828002853FD29FFC998C19EC198C19EC198C1CAFFFFFF522100282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%00282128002128A9FD26FFC9C0C1C1C1C0C1C1C1C0C8FD04FF4C28212828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827FD0428A9FD24FFC9BAC19EC1C0C19EC1BAC2FFFFFFA92828 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128002821280028212800A8FD22FFC9C0C1C1C1C0C1C1C1BAC8 +%FD04FF282821282828212828282128282821282828212828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%28212828282128282821282828212828282128282800A2FD20FFC998C198 +%C19EC198C198C1CAFFFFA921282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%28007EFD1EFFCFC0C1C0C1C1C1C0C1C0C1CFFFFFFFFD0428272828282728 +%282827282828272828282728282827282828272828282728282827282828 +%272828282728282827282828272828282728282827282828272828282728 +%28282728282827FD052800A8FD1CFFCF9EC1C0C19EC1C0C198C1CAFFFFFF +%282100282128002800210028002200280022002800220028002200280022 +%002800220028002200280022002800220028002200280022002800220028 +%00220028002200280022002800220028002800282128002800A8FD1BFFC1 +%C1C0C1C1C1C0C1C0C1C9FFFFFFFD04282128282821535353525353535253 +%535352535353525353535253535352535353525353535253535352535353 +%525353535253535352535353525353535253535352535353525353535253 +%282821282828212828A9FD19FF9FC09EC198C19EC198C0C8FFFFFF520000 +%282128002800217DFD43FFA828002800282128002827FD18FFC9C1C1C1C0 +%C1C1C1C0C1C2FFFFFF7D28212828282728282800A8FD44FF282827282828 +%27FD0428FD16FFCAC198C1C0C19EC1C0C09EFFFFFF7E2821280028212800 +%2821227DFD43FFA8280028002821280028212153FD15FFC8C0C1C0C1C1C1 +%C0C1C0CFFFFFA9280028282821282828212821A8FD44FFFD042821282828 +%212828287EFD13FFC998C19EC198C19EC198C8FFFFFF5300280028212800 +%28212800287DFD43FFA828002821280028212800280028A8FD11FFCFC0C1 +%C1C1C0C1C1C1C0C1CFFFFFA800282728282827282828272821A8FD44FFFD +%042827282828272828280077FD11FFC1C09EC1C0C19EC1C0C0C9FFFFFF21 +%282128002821280028212800287DFD05FFA85352534C5352534C5352534C +%5352534C5352534C5352534C5352534C5352534C5352534C5352534C5352 +%534C5352534C5352534C5352527DFD05FFCB280028212800282128002821 +%2800A8FD0FFFC9C1C0C1C0C1C1C1C0C1C1FFFFFF53282128282821282828 +%2128282800A8FD06FF002821280028212800282128002821280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%280028007DFD06FF2828212828282128282821FD0428FD0FFFC198C19EC1 +%98C19EC198CAFFFF7E2800280028212800282128002800217DFD05FFA828 +%002821280028212800282128002821280028212800282128002821280028 +%21280028212800282128002821280028212800282128002177FD05FFA828 +%002800282128002821280028210053FD0DFFC9C0C1C1C1C0C1C1C1C0C8FF +%FFFF53212827282828272828282728282800A8FD06FFFD04282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827282828272828282728007EFD06FF28282728282827282828 +%272828282128A8FD0CFFC1C09EC1C0C19EC1C0C0C9FFFFA8002821280028 +%212800282128002821227DFD05FFA8280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800227DFD05FFA8280028002821280028212800282128 +%007DFD0BFFC9C1C1C1C0C1C1C1C0C1C2FFFFFF2828212828282128282821 +%282828212821A8FD06FF2828212828282128212821282828212828282128 +%282821282828212828282128282821282828212828282128282821282828 +%21282828007EFD06FFFD042821282828212828282128282821FD0BFFC198 +%C19EC198C19EC198CAFFFF7D28002800282128002821280028212800287D +%FD05FFA82800280028002853280028002821280028212800282128002821 +%280028212800282128002821280028212800282121527D00280028210053 +%FD05FFA8280028212800282128002821280028212152FD09FFCFC0C1C1C1 +%C0C1C1C1C0C8FFFFFF532128272828282728282827282828272821A8FD06 +%FF282827FD0428FF7E282128282827282828272828282728282827282828 +%27282828272828282728282827FD0428FF7D2827282828007EFD06FFFD04 +%282728282827282828272828282128A9FD08FFC1C09EC1C0C19EC1C0C0C9 +%FFFFA80028212800282128002821280028212800287DFD05FFA828212800 +%282128A8FF53210028212800282128002821280028212800282128002821 +%280028212800282128002828FFFF7D00280028212177FD05FFCB28002821 +%28002821280028212800282128007DFD07FFCAC1C0C1C0C1C1C1C0C1C1FF +%FFFF53282128282821282828212828282128282800A8FD06FF2128282821 +%2828FFFFFF53282128282821282828212828282128282821282828212828 +%28212828282128282827FFFFFF532828282128007EFD06FF282821282828 +%212828282128282821FD0428FD07FFC998C19EC198C19EC198C8FFFFA828 +%0028002821280028212800282128002800217DFD05FFA828002821280028 +%A8FFFFFF2821002821280028212800282128002821280028212800282128 +%00282128002800A8FFFFFF7700282128002177FD05FFA828002800282128 +%0028212800282128002800217DFD06FFFD04C1C0C1C1C1C0C1CAFFFFA800 +%282728282827282828272828282728282800A8FD06FFFD0428272828FD05 +%FFFD04282728282827282828272828282728282827282828272828282728 +%21A8FD04FF532828282728007EFD06FF2828272828282728282827282828 +%272828280077FD05FFCAC198C1C0C19EC1C0C19FFFFFFF4C282128002821 +%280028212800282128002821217DFD05FFA828002821280028A8FD04FFA9 +%21282128002821280028212800282128002821280028212800282128007E +%FD05FF770028212800227DFD05FFA8280028002821280028212800282128 +%0028212821FD05FFC9C0C1C0C1C1C1C0C1C0C8FFFFA82800282128212821 +%282128212821282128212800A8FD06FF28282128282821FD06FFA8212828 +%2821282828212828282128282821282828212828282128007DFD06FF5328 +%21282828007EFD06FF28282128212821282128212821282128212821227D +%FD04FF9FC09EC198C19EC198C0C9FFFFFF7EA87EA87EA87EA87EA87EA87E +%A87EA87EA87EA8A8FD05FFA828002800280028A8FD06FFA2002821280028 +%2128002821280028212800282128002821280053FD07FF7D002800282100 +%53FD06FFA87EA87EA87EA87EA87EA87EA87EA87EA87EA87EA8FFFFFFCFC1 +%C0C1C0C1C1C1C0C1C1FD1FFF282827FD0428FD08FF7E0028272828282728 +%28282728282827282828272828280053FD08FF532827282828007EFD1EFF +%CA98C1C0C19EC1C0C198C8FD1EFFA828212800282128A8FD08FF7D002800 +%28212800282128002821280028212800280028A8FD08FF7D002800282121 +%77FD1BFFA8FFFFC8C0C0C1C1C1C0C1C1C0C8FD1FFF21282828212828FD0A +%FF530028212828282128282821282828212828282128A8FD09FF53282828 +%2128007EFD1EFFC898C198C19EC198C198C9FFFFA8FD1BFFA82800282128 +%0028A8FD09FFA85200280028212800282128002821280028002821FD0AFF +%7700282128002177FD1BFFA8FFFFC1C1C0C1C1C1C0C1C0C1CAFD1FFFFD04 +%28272828FD0CFF4C00282828272828282728282827282828214CFD0AFF53 +%2828282728007EFD1DFFCAC1C0C19EC1C0C19EC1C1FFFFFFA8A9A8FFA8A9 +%A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FF7E28002821280028 +%A8FD0BFFA8280028212800282128002821280028534C21FD0AFF77002821 +%28002853FFA8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8FFA8A9A8 +%FFA8FFCFC0C1C1C1C0C1C1C1C0C8FFFFFF4C282821282828212828282128 +%2828212828282128282821282828212828282128282821FD0DFFA8280028 +%2828212828282128282853FF2828FD0AFF53282128282821282828212828 +%2821282828212828282128282821282828212828282128A8C8C098C19EC1 +%98C19EC0A0FFFFA800280028002800280028002800280028002800280028 +%0028002800280028212800280028A8FD0DFF7D2100282128002821280022 +%28FFFF4C21FD0AFF7D002800282128002800280028002800280028002800 +%28002800280028002800280028007EC9C0C1C1C1C0C1C1C1C0C9FFFFA228 +%282827282828272828282728282827FD1428FD0FFF7DFD0A28FFFFFF2828 +%FD0AFF53FD1528272828282728282827282828272853C1C09EC1C0C19EC1 +%C0C0C9FFFF7E002821280028212800282128002821280028212821282128 +%212821282128212821282128A8FD0FFF532821282128212827FD04FF5221 +%FD0AFF7D0028212821282128212821282128212821280028212800282128 +%00282128002821280053C8C0C1C0C1C1C1C0C1C0CFFFFF7D222128282821 +%282828212828282128282821282828222828282228282822282828222828 +%FD11FF52282828222828A9FD04FF2828FD0AFF5328282822282828222828 +%28222828282128282821282828212828282128282821FD04289FC19EC198 +%C19EC198C1C9FFFF53002100220021002200210022002100220021002800 +%220028002200220028002821280028A8FD11FF2828212800A8FD05FF4C00 +%FD0AFF770028212800280021002800220028002200220021002200210022 +%00210022002100220028C1C1C1C0C1C1C1C0C1C1FFFFFF7E7D537D537D53 +%7D537D537D537D537D537D537E537D537D537D537D7777FD0728FD08FFA9 +%FD0AFF28282153FD06FF2828FD0AFF53FD062853777D537D537D537D537D +%537D537D537D537D537D537D537D537D537D539EC1C0C19EC1C0C198C1CA +%FFA8FD1DFFA828002822280028A8FD07FF28A8FD09FFA9282252FD06FF4C +%21FD0AFF770028222821227DFD1DFFC1C0C1C1C1C0C1C1C1C0FFFFFFA8FD +%1DFFFD0728FD08FF5328FD0AFFA80053FD06FF2828FD0AFF53FD0528007E +%FD1DFF9EC198C19EC198C19EC1CAFFA9FD1DFFA828212800282128A8FD07 +%FF282228FD09FFA2284CFD05FFA84C22FD0AFF7D00280028212277FD1DFF +%C1C0C1C1C1C0FD04C1FFFFFFA8FD1DFFFD0728FD08FF5328284CFD08FFA9 +%2253FD06FF2828FD0AFF77FD0528007EFD1DFFC0C19EC1C0C19EC1C0C1CA +%FD1FFFA828222821282228A8FD07FF2828222252FD07FF7E2852FD06FF53 +%28FD0AFF7D0028212822227DFD1DFFC1C1C1C0C1C1C1C0C1C1FFFFFFA9FD +%1DFFFD0728FD08FF532228282853FD06FFA80053FD06FF2828FD0AFF53FD +%0528227EFD1DFF98C19EC198C19EC198C1CAFFFF7D284C2852284C285228 +%4C2852284C2852284C2853284C2853284C28532828212822280028A8FD07 +%FF2828212822227DFD05FFA2224CFD06FF4C21FD0AFF7700282228212828 +%532853284C2853284C2853284C2852284C2852284C2852284C2852284CC8 +%C0C1C0C1C1C1C0C1C0CFFFFF532221282128212821282128212821282128 +%212828282228282822FD0A28FD08FF5322FD0528A8FD04FFA92277FD06FF +%2828FD0AFF53FD0728222828282228282822282828212821282128212821 +%28212821282128289FC1C0C19EC1C0C198C1C9FFFF7E0028002821280028 +%21280028212800282128222828282228282822282828222828282228A8FD +%07FF2828222828280028A8FFFFFFA8224CFD06FF4C22FD0AFF7D00282828 +%222828282228282822282828222821280028212800282128002821280028 +%0052C8C0C1C1C1C0C1C1C1BAC9FFFF7D2828282128282821282828212828 +%2821FD1428FD08FF53FD0628224DA9FFFFA92253FD06FF2828FD0AFF77FD +%1528212828282128282821282828212853C2C098C19EC198C19EC0A0FFFF +%A80028212800282128002821280028212800282228222822282228222822 +%28222822282228A8FD07FF28282228222822280053A8FF7E2852FD05FFA8 +%5322FD0AFF7D002822282228222822282228222822282228002821280028 +%21280028212800282128007DC9C0C1C1C1C0C1C1C1C0C9FFFFA828212821 +%282828212828282128282821FD10284D282828FD08FF532828284D282828 +%4D2253FFCB2253FD06FF4C28FD0AFF7728284DFD0E282128282821282828 +%212828282128282821287DC9C098C1C0C19EC1C0C09FFFFFFFFD04282728 +%2828272828282728282827FD0F2822282228A8FD07FFFD04282228282822 +%28007DA82853FD06FF5328FD0AFF7D012822FD04284CFD0A282128282827 +%282828272828282728282821A8FFC1C1C0C1C1C1C0C1C0C1CFFD1EFFA9FD +%0728FD08FF5322FD0A28532277FD06FF2828FD0AFF53FD0528227EFD1DFF +%CAC198C198C19EC198C19ECFFFFFCBFD1BFFA828222822282228A8FD07FF +%282822282228222822282228222852FD06FF4D22FD0AFF7D002822282228 +%7DFD1EFFC2C1C0C1C1C1C0C1C1C1C9FD1FFF28292828282928FD08FF5328 +%4D2828284D2828284D28282277FD06FF284DFD0AFF53FD04284D227EFD1E +%FFC9BAC19EC1C0C19EC1BAC8FFFFA8FD1BFFA828222828282228A8FD07FF +%282822282828222828282228282853FD06FF4D22FD0AFF7D002828282228 +%7DFD1EFFC9C1C0C1C0C1C1C1C0C1C1FD1FFF2828284D282828FD08FF5328 +%28284D2828284D2828284D2853FD06FF4C28FD0AFF7728284D2828017EFD +%1FFF9EC19EC198C19EC198C1CAFFA8FD1BFFA828222822282228A8FD07FF +%FD04282228282822282828222853FD05FFA85328FD0AFF7D012822282822 +%77FD1BFFA8FFFFFFC8C0C1C0C1C1C1C0C1C0C9FFFFA87E7D7E7D7E7D7E7D +%7E7D7E7D7E7D7E7D7E7D7E7DFD07FF2829284D282928FD08FF532829284D +%2829284D2829284D2877FD06FF4D4DFD0AFF7728284D282922A2FD06FF7E +%7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7E7D7EA2FD04FFC9C0C0C19EC1C0 +%C19EC0C2FFFFFF00000022002100220021002200210022002100227EFD05 +%FFA8FD0728A8FD07FFFD0E2853FD06FF5328FD0AFF7E22FD05287DFD06FF +%28002200210022002100220021002200210022007EFD05FFC0C1C1C1C0C1 +%C1C1C0C1CFFFFF5300282128282821282828212828282128282800A8FD06 +%FF28292829282928FD08FF53224D2829284D2829284D28292277FD06FF28 +%4DFD0AFF53282829284D227EFD06FF282821282828212828282128282821 +%2828282128FD06FFC298C19EC198C19EC198C9FFFF7D2200280028212800 +%28212800282128002800217DFD05FFA828222828282228A8FD07FF282822 +%282828222828282228282853FD06FF4D22FD0AFF7D0128282822287DFD05 +%FFA82800280028212800282128002821280028212152FD06FFC9C1C1C1C0 +%C1C1C1C0C1C2FFFFFF28282728282827282828272828282728282800A8FD +%06FF284D284D284D28FD08FF53284D284D284D284D284D284D287DFD06FF +%4D4DFD0AFF7729284D284D227EFD06FF2828272828282728282827282828 +%2728282800A8FD07FF9EC1C0C19EC1C0C198C1CAFFFF7D00280028212800 +%28212800282128002821227DFD05FFA828222928282229A8FD07FF4D2828 +%292828282928282829282853FD06FF5328FD0AFF7D0129FD04287DFD05FF +%A828002800282128002821280028212800280028FD08FFC8BAC1C1C1C0C1 +%C1C1BAC9FFFFA8282828212828282128282821282828212821A8FD06FF28 +%29284D282928A2A2A87EA87EA87E532829284D2829284D2829284D28537E +%A87EA87EA828297EA87EA87EA87EA87EA85328284D2829227EFD06FFFD04 +%2821282828212828282128282821287DFD08FFCAC098C19EC198C19EC09F +%FFFFFF4C22212800282128002821280028212800287DFD05FFA829282822 +%292828222822282228222822292828222928282229282822292828012822 +%2822282828012822282228222801282828222928287DFD05FFA828002821 +%2800282128002821280028212821FD0AFFFD04C1C0C1C1C1C0C1C9FFFFA8 +%2128272828282728282827282828272821A8FD06FF2829284D284D284D28 +%4D284D284D284D284D284D284D284D284D284D284D284D284D284D284D28 +%4D284D284D284D284D284D284D284D22A2FD06FFFD042827282828272828 +%2827282828007EFD0AFFCA98C1C0C19EC1C0C198C2FFFFFF530028002821 +%28002821280028212800287DFD05FFA84D28282829282828292828282928 +%282829282828292828282928282829282828292828282928282829282828 +%29282828292828282928287DFD05FFCB2800282128002821280028212800 +%280028A8FD0BFFC2C0C1C1C1C0C1C1C1BACFFFFFA2282828212828282128 +%28282128282800A8FD06FF22292828222928282229282822292828222928 +%282229282822292828222928282229282822292828222928282229282822 +%2928282229017EFD06FF2828212828282128282821282828212877FD0CFF +%C9C098C19EC198C19EC09FFFFFFF28222128002821280028212800280021 +%7DFD05FFA87D537E537D537E537D537E537D537E537D537E537D537E537D +%537E537D537E537D537E537D537E537D537E537D537E537D537E537D5377 +%7EFD05FFA828002800282128002821280028212821FD0EFFFD04C1C0C1C1 +%C1C0C1C9FFFFFF282827282828272828282728282800A8FD44FF28282728 +%28282728282827282828007EFD0EFFCF98C1C0C19EC1C0C198C1CFFFFF7D +%00280028212800282128002821227DFD43FFA82800280028212800282128 +%00280028FD10FFC8BAC1C1C1C0C1C1C1BAC9FFFFFF4C2128212828282128 +%2828212821A8FD44FFFD042821282828212828282128A8FD10FFCAC198C1 +%9EC198C19EC198CFFFFF7D280028002821280028212800287DFD43FFA828 +%00282128002821280028212152FD12FFC9C1C1C1C0C1C1C1C0C1C1FFFFFF +%53FD052827282828272821A8FD44FFFD04282728282827FD0428FD14FF9F +%C0C0C19EC1C0C19EC0C9FFFFFF2822002821280028212800287DFD44FF28 +%0028212800282128002800A8FD15FFC0C1C1C1C0C1C1C1C0C1CAFFFFA921 +%28212828282128282821535353525353535253535352FD0453785378537E +%5377537E5377537E5377537E5377537E5377537E5377537E5377537E5378 +%537E5353525353535253535352535353525328282128282821282828007E +%FD16FFC998C19EC198C19EC198C1FFFFFF7E002800282128002821280028 +%002100280021002800210028002100282229222922282229222822292228 +%222922282229222822292228222922282229222800280021002800210028 +%002100280021002821280028212800280053FD18FFC9C0C1C0C1C1C1C0C1 +%C0C8FFFFFF7D002828282728282827282828272828282728282827282828 +%27FD04284D294D2953294D2853294D2853294D2853294D2853294D285329 +%4D284D282821282828272828282728282827282828272828282728282827 +%282152FD1AFFC8BAC19EC1C0C19EC1BAC9FFFFFF53002821280028212800 +%2821280028212800282128002821280028212800FD04284D2829284D2829 +%284D2829284D2829284D2829282928280028212800282128002821280028 +%21280028212800282128002821280028A8FD1AFFCFC1C0C1C0C1C1C1C0C1 +%C0CFFFFFFF52002828282128282821282828212828282128282821282828 +%2128282821FD042829284D284D294D284D294D284D294D284D2828212828 +%2821282828212828282128282821282828212828282128282821282128A8 +%FD1CFFCAC198C198C19EC198C19ECFFFFFA8280028212800282128002821 +%280028212800282128002821280028212800280028002821280028222822 +%282228002821280028002800282128002821280028212800282128002821 +%28002821280028212800287EFD1EFFCAC1C0C1C1C1C0FD04C1FFFFFFA84C +%002827282828272828282728282827282828272828282728282827282828 +%272828282128282821282828212828282728282827282828272828282728 +%2828272828282728282827282828272828282128A2FD20FFC9C098C1C0C1 +%9EC1C0C09EFFFFFFA8520028002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002800287DFD +%22FFC9C1C0C1C1C1C0FD04C1FFFFFFA95300282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%280028A8FD24FFC9C198C19EC198C19EC09EFFFFFFA85300280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%280028212800282128002821280028212800282128002821280028212800 +%28212800280028A8FD26FFCAC1C0C1C0C1C1C1C0C1C1CFFFFFFF7D002828 +%282728282827282828272828282728282827282828272828282728282827 +%282828272828282728282827282828272828282728282827282828272828 +%282728282827280053FD29FFCAC1BAC19EC1C0C19EC1C0CAFFFFFF7E2128 +%212800282128002821280028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002821280028 +%212800282128007DFD2CFFC8C0C1C0C1C1C1C0C1C0C9FD04FF2828212821 +%282828212828282128282821282828212828282128282821282828212828 +%282128282821282828212828282128282821282828212828282128282821 +%2828A8FD2EFFC998C098C19EC198C198C8CAFFFFFF532800280028212800 +%282128002821280028212800282128002821280028212800282128002821 +%2800282128002821280028212800282128002821280028002128FD31FFCF +%FD04C1C0C1C1C1C0C8CFFFFFFFA853002828282728282827282828272828 +%282728282827282828272828282728282827282828272828282728282827 +%2828282728282827282828272800287EFD34FFA0C0C0C19EC1C0C198C1C9 +%FD04FF7E2722002800282128002821280028212800282128002821280028 +%212800282128002821280028212800282128002821280028212800282121 +%007DA8FD36FFC9C1C0C1C0C1C1C1C0C1C1CFFD04FF532800282128282821 +%282828212828282128282821282828212828282128282821282828212828 +%28212828282128282821282828002853A9FD39FFCAC99EC098C19EC198C0 +%98C9CAFFFFFFA87D21210028212800282128002821280028212800282128 +%002821280028212800282128002821280028212800282128002100537EFD +%3EFFC2C1C0C1C0C1C1C1C0C7C9FD05FF7D53002821282828272828282728 +%282827282828272828282728282827282828272828282728282827282828 +%002853A9FD41FFC9C8C0C098C1C0C198C0C1CAFD04FFA8A8522800280028 +%002821280028212800282128002821280028212800282128002821280028 +%21280028287EA8FD45FFCFC8C1BAC1C0C1C0C1C0C8C9FD05FFA87E522821 +%280028282821282828212828282128282821282828212828282128212800 +%28287EA8FD4AFFCAC99FC198C098C198C09FC9CAFD05FFA8A8534C002800 +%210028002800280028002800280028002800220022004C527EA8FD50FFCA +%C9C1C1C0C1C0C1C0C1C2CFFD08FFA87E5353FD06280028212821FD042853 +%537E7EFD58FFC9C9C1C198C0BAC098C1C2CACAFD09FFA8A9A8A87E7E7DA2 +%7EA8A2CBA8FD60FFCFCFC8C8C1C1C0C0BAC1C1C9CAFD78FFCACAA7C9C2C2 +%9FC1C1C8A0CACFFD40FFFF +%%EndData + +endstream endobj 23 0 obj <>stream +%AI12_CompressedDataxœì½×vúȳ0z®g-¿8ƒDNÆD 6Ø`œˆ`‚°$&]|Osžá»:wûÅNw+ %Âoïùï5ãõó`Ԫꮮ®ÔUÝÎv'XÑ* aŽ“ß..Ê Er4“q ¯׋ņåø•çÁëÀ! ¶*^§úBËÅ°3z•AÏBQø”€ï{ÊSfÆr3rå ¨%häux¼ðiwÆ-(ð¼:\ÌÖ,ÕÿcÆMû³!½êGCäÌ+u­h™G"ᆧ±L$å(Þ¢&äêw’egSs4…—èÍj4[MJôŸG ‹9¢‰„#ŽÇ±D>¯Ï(VÛ(ObQØ2O¤b y4”LbqðN +|ˆÅà‹z¸YR+®ÍÐCŠeËô‚f،£üÝ-9OHÇ µXÐ8J r8W¾CÐ+´%6܆!KÝ`"ÿKÙàŽ¢FÔȲ1[Pl¦‘y÷D3svM©÷Ņ–ô„!ÙÙ2´^l&³UhÀh”ï ùG _}G4þc:ã(@g¹xïC `º–$çÀ#hn‹×x¤_ÚÌ£»Ír@™L¤qô}´ÆýȂƒ±ÃÏèûdÿz ¾êP‚1 y¨•”ÔߢÏ[L02sjõá!3ô~ގ¦Ó¡DN^<“`ÚãxŠÿ&–LÂobÂK]j¹^A3™ˆ¦C`Ò0 üV|›‚qò ái +¤CÉ4îH/RQ w€)‡_ˆ/È3Ný>£þÈ8îè%­Èpžñbÿ[xô°YPÌãj§2¾KóT»¥GÔ¼!ƒ $"úÁåßB‹.ÉL(ð+½Øph¥$,`fšä_dA\@ÒZS«.ÝC]M $áƒ5“Žƒ§Ž8@ƒ'$´¸ü[!A8"†$œÍ6˜à3œ•»˜ìטÙHžõdđâ¡a„RŠiñŸÐ[0vŽ£Vb÷Ǖoüƒ…n[ku5*ÓK8 ,ZÞÀ˜jAO„§òè±YŸüövò[4þÙÐň ʑN„ÁòøӞ +W7 íÀ£˜¢Å€d©ðLÓlÅ;ð߁5 ÖÚ  ÈɄb„ÿçááŒ<2^P†×ÃMé Ö\¸3$zž€%„`/¨1nU›ÄyØð }$rJÔTüƒ4؀o¹0µ‘ì4L-Ñÿ8°:©0Ë# +.ŒÕ å_¦©ðˆÒÈIÀéðËhF1`Ĭ#Œ$œ±ðpÃ0Ôjøø#04X–¬l<‘ +‹íÃCzý—“©ål5[×“‘0 ÿlH.V4žþµžR«0¦‚C£Fá%9„Ýd“¢‰onØ0÷ÍnÑf4æ¦ EI‘à G…—À®Ñ0ún4ó  ©Ñl± $°¥7@‡–$;Ü,PR)øðgC2àøqJ.Æ<áKց§#á"âªÈc,*f³ÈÓ·(¾.VÃe¡ á*z=\E/(UÅëUé½k¾Õ5âZÑæZjSå¦á;„€iñ/´øZŠZ|ŸZÒ{Ë͂›­…[ìòÄ£8 GþåGÅˏÒ[/üÃî”f·@1¼¬Æ†I1)Ž‡T¼Mò¨I ‰ÈARá¡HŠâ¡SòË%½7ã[ÍøV3Š™Ô†äXñi¾9-ö‰V¼@ M¤÷F³ßgð žþÕ i£êÏFzç/þ1‡ˆñ—øõÉoÝ*/ +ã7ý. ´€BøGûHÐTWCj׌£¯VØ[úû-¬iÖ¼À âîë ‚dšÛÑe6T÷¯µ¨uâ>èIŸC+ênž¥úm¤ôk ½Y_¯ÆôÉoÞ|ëQC`¢]5r´ßà`„Ý‘Ãé„ú›š §Àp XG |/µÖÁÚkp†rðOÁ»èOðÿ1ü¿÷+ÔX2þÛú{4òn|²”û{I6 ð´ºúZÐkʸÕñD2k;(Ú rE2ô@Ä „븆b…œs³ßK š3 #Ú$ ¯- @˜¬ÕÐK¨›YÅ#[¨Hn +LK X zª60‹›Õd‹bh |{;à;-ôbÆ.%àÊo¤Ï6{ +Ⱥj­ø.3vêèÒôB‚|»Êa=[±ÔBÓk`ñïý£IõÀÅó¢LSˆÅõt6ÔÃÒžg”.2ƒ÷mq×M•ÖΚú{F.t1n¿öC&ð ¨| ; „€i›Î$7œ:š3à°13ÊbµÂÉÏV#ÐÑÎ8r8h(O(–âþ怀âŠð¡xA‡ºF©N‚A`ó9J+¥º©1Pë¯8à®?®Vä葉ð•#€t¿ú,â(!ž;ù­­ÆÀOü$ªÉj +üKƒßiðS¬–пRµŒ~*èþGü'üàèNDÀpˆ(ø”ÿKþwò[áC­#¨E”ˆ¡Ÿ'’à'A¤Àï4ø–~…O)ô©ˆ~—ÀoñðY„'b;á-žÆKx¯‚.à‘H$IDR‘t¤)Gª x4EãQ¤HG‹ÑR´‚Ç"±X,KĒ±T,+Ÿ +ø©ÆwÇâÀm‹Gã±x<žˆ'ã©x:^ña1 4Àà'‰¥°4V?%¬ŒU‘0<‚Gñ8ž€ž3^ýªàÕ‰Fâ¨_r¯¢ W°On´ z„¡%@oŠ±2ßèaü€ÎÄàà5Ð2F€Ç0Hâ(˜`0¦ +€R£+1ÁHSà' ~à ¾p‚Ž| ‹Q,ŠÁI½©F*à§,âÛz ¾‡Þ?Ê7åwÁÛà§~Šè' ~Rà' N~#O€ñÃØuü'âK¥RÉT"OÅ@—#)<…V©&+Ér²”,&ÓÉT2™L$ãÉèX$‰'±‘¨$ʉR¢˜H'R‰d"‘ˆE<çÌ^‰—ã¥xÌ\ +Ì`"GøbŽ‹~‰AK¸Ã±d2…~1hL‚Ñx$‚AO4 Üôð±â1ø Ž¨ñ€kïH@w>…0;`Ýö²ÄÂBÚ¤#\ N)ø€¥Sq~ƒá‰d$>D’©X‡ð8 ø׀Ã<DØ¿REe¢¨2·–£öœžtûW´ý+Úþmÿ}¢-• EŽ.ÜÐcŠ·(ÄqtÇCµ#æL­4}#í_Aö¯ ûWý+ÈþsYTWEÿdÿ +²Ù£ K€ÖǗdêÿQ¦W³ØÀIóÏ`^÷ׂ‚»ÍýÇ +ýåÈÀpãŠ^yá; ý¸k‰v¤çá2½\üb¶€QLøJyJÎV¾ ÿµm5……6î ÷fìl°à–Hv6T@·ø˜£í쾯ˆN¢0£#Ì0aŽ‰ØqZ¥!ԕÙ&9Ì_Ž &Í=PCšQÏ£)ÑôÂá©þÉ1ä{\­á 5ò§˜ø´Ëë2½úb¸ò†åè%ÿ8„ÅáŠZtÁ›]zA1äjH‰®*ñÀTr% EÔoMgÃùŠbÙm”ÀÈò ¤žn÷Czô@-éß©6 úÁCÃ1S›¡†3˜M%ôAêÂíìO᫘v,"pùÛ[òO遧>[ý½Ã}µ Üá +w8¸yëðTfìzAþÅÿ¹ £ˆ6§Ð÷YšGöä70£$á Óa¸Gç1è =§vA-FxՒ—Â|CaåH™7˜ãù/8¯7àÓ7ø[ÇÛ杀‡ð!øÿ§Ǝ¬Pã€eB*í(oŒ63ÎÞÍAÁ±ïDqsÚ@pÇ¡ŒI½^Yªú;µjFÆô21ÚÓ<␼=Ƭ« ÂtP0KäOjˆ’¹ø‡„¾¬wàÉT*­”øÙr½%>æhñ„Ó¸pÇ3 ¿ÙaÖp~ÖÐ~·­¥±uЯÑAøÿ°‚É‚Àúÿ…Š¨3œ®f‡ö(˜½ó¯:úWý«Ž,ÕQ䢎Òø/þÿc«û_ÅÖKû[zGUÿã«øŸbT¦#ÿ®âÿäUüŸ§@ÿ7­âÿi]üÒjD2£}\C8µ¡d‹Àg"™N¤¢è‰ È(†'b"wò%qc_…7««‘"¸i%m“ ŠƒIÿ{{`¿ßÚò2Dç¿!é´ugí!øW’{#áÜ-Xۜ±œzf¶ÇÌ·Ù38ŒcüC> ‚úÄï0í·F„^‹em’#a`<,~þ©Xè‹çÛæ=¢ gž?—‹h$9à» 6Å;” q‘aÈÿV0G¢h7œG•¡VB«ˆà¥‹á/î¯5%<ö¸Vlÿw’a³ +ÏVÙöwr±‘ìAC¸Ë)´zêÿü'0G(;TZÐÃ9 ²Ø “Ø4ðà`†êoq;ƒ<Ó¡¸;4U6?&SNܜ(öH1#~¶µ2ìÌôÿ8#ì.2¿Û °í?ƒáá8‡(Öø¿”E3, .¨CÁ:´Ï©ÿëtèŸÖŸÿ]K™ÿñàïÿIÎ.fÃÿ=bÇÒ¡†EÄ] Ãaÿ1qS[ó.´üGHo‹€á%pËáM)x +€­ñ‰Mÿ”Îw±à_¶Æö×?dXÒù5VÃúӞ(ú‡ KÚ¨4π急ѤÆ,‰­ám¿ô1*´ìÐfH¡ŠþVPvÿˆ~,)ŽsëIܙ³‘3±ÅsŠÖüëXCÿ9Ä +0^­ÏÞ)Ñ>¿/Héi ½.2ÉÇìõlí2M¦ã8pR +Çc¡T$%lð£4Z:°HµD|–ü-ÉÌÅ®_Qâãj6ã;­pD%ýÑ.>_I‡7IÇ9É]x ]úÇÎw§M³38ô8"ÊnñD(ñü'û pyP¼@¹f‹ 7 IfT¡Æäf¡v£ÅIÛ êŠ¤Ö’7*¥K¬ÉÑH‹hI²s™*üwìšæ´íÈÅL”5IQ*ŽÖ³(à…¯†ô‚‘™ªxí(n8Úñ@Â#fSZ¨Åkwˆœç˜¯èáœÞpŽ _unÖvÆÒðL-dž®Åd Uë´cM®)ÆÁΖ›:§M³ÎaR  cO¿ÒH}؀cÈ»&ù£‡&Ìlä`åqÀÔé”!4Gônc»í„¡¤Õo٘‘"H‰x<7nŠ+û`ÙVÙËÆrÐÉvRS1V˟}בɅ«¦²ÍP,ÅüN9ºÔŸ:v€Ì3NddÏÛíŒãÀ²§ÿõÙÍjò±½®0)>ŒÎÖrwÙGX8‡rñÇ¥DV8¬[ŠJ ŠØÄ!Ÿf&®lLõJkí—Z¼„IÙî_“\M6ä„r´éµ‚Óƒq‘Bô)Ž`'™õ(!á晹š±S@ô‚¦‡‡âŽTOˆ)Qfð ù O¡¡ÊÔbQý““•€8ãWÐ6šµGr"‰Sxv ™Žá;u K¯UãàÁ¤b;‚)!ûI)‘Dx€¶ éR©*۔…܎„•ÕÜõjDýÙ¡€*íø1cX+DˆyLfÐè=iHǘx ØAó.AٞödßaÚ! ÝYWÊ-Ì1–dËZ”`ôï³f¤,Eè§*V¿òɌàïè+ǀ\H©•Æhà9š@èÂXޟxj-Åa<üi¦ +Ól^¼&6‹…(o„cOÁSQ”E’‰¤Ù²®)T€éú/éëݶ’ª…¯nÃ֚Ê* 7mLC +.eÙNíVë”aW m ¨ LKN1?»±%\¢ygƒöhA*HjÙÖIQC5I#0»²oIDð˜ÉúWrH<•Ná&m#Rr {“+nææ%)1u2>G,•Òøз>G]±ñ$ÀO§`Žè·~Rį`€åÄ É…•„G§*x߄v¦ yúªY²˜Ññ˜¥$ádÈôP딁“ÎIse¾öT*jØ‚Uu&Pá¸T@#Æ4¨Ã3ýè•jjcñT҈!4²JWz¹É¢L'Öfkؤ"ƒE£Ñ0Ì"±Pl á£>¯IÞ°$ˁᑞí +³Î€`PYº"—©ÚV— + EnP™Â…@x|ꖏ£jö4 §Û eãVÕº³.Cç=?@Q&¿‘…íå $Ï¹•¡$PªÒ­h$øRõµØOòM$DODá‚DÀÙ5s;ÔâzÆPî¡Ü“G®4Ä2ÔýeA÷?¨tÿVۖÀ»CNW5ëÊ,ž”ý<¾ OÖ0Ö¦£¤5STm[ZãÇÁpGµÝفb°µÉx˜6iÆ7¶&šºÕøF6É&@Ü2•±‹-[•ŽÙ +Ù0b$EÔ,–œLë°,ӃÐø ð?µÛjQ“‹…E3v>[À@ça¦mÇðµ?°‹ŒEÓ!½XÈ>…gÛå×¾ †&v–øŽbKSK@ŠßÐx–¡RÙ&ÅÕY&=†Ã£(uHr«»,·øðêµD8 ’À÷„A^;/­GKðx±²ß¯õÈ>x>íB~Eoþ×kFhgÒØHè€h…¤ã!iÓSÛT¹ƒ™Æ{ʨ¡j+0JBœÁ›BðtQe…ҍ9ZŒóÄSqKЌ¢#),’kÞôÛó[FâTT6Ìpêè2Ôl$+ Ôl5£Î|† °•Jún#jÉiÜJEK`´Ò˜5§m·Å¨ +×Zˆ—ÅÎ&+=ý¯++Â>—)LÔVv’ì`Æ-ɵ} §ž˜í±/˜\¹M†|©%Œï› 6•”Ï^"j¼ˆnsfÖ;¼]D'ü©m9ÚyJ3‹‹Á ÙZØ1e „x2gF¡‘˜€¦0wµÍXèùIÐ,þn1Rv¸^ ÿ2c|£áj+Z§mÄoA¹Åa0J0e rmƒBC³¬'ËyˆZÁÜ(Sq ›±Rå€%/£ö¼|W,;/UÀÁh±3Šªã­¶@âAcM#¨ô;h=Â!C¯­Ú@»jl«vü½ŒÕZáñ­–É°fS*ÈH¥R²ÑšSŽËª±R)éë#Øݏ£é‰ÖrOl4VöDoeW\h´°ˆ|£53¦W¦â¶c3,…Fôf‹Ãý23–A“Á Zf“ΆVԄT윴nyü† ^ZY@[àC–b?úÌÀ†Ø)9‚×O˜ƒzFT¤3šfI=mðç:¤Ž“G1=¼ Ãh÷àÐ^Ÿ^ÓÉVSƒ†‚ÊTăôæVnȇ™,š.ffÒ´€1QRíç´¤×C3‰ƒZ°fӏZŒ6ú¾»á¦«‚…y<3ֆ2AÍƛÕЌkøFBØ@â ‚^"W+)¯Aß=FÍ,½áRikyÊ4ðUG¢U{(FӎwÏu§åÀ#‰X2ÉD0,öîµð—À*Tڎzæ(h:Õ¦”^#qOj¸üËÌ#W´¤¹©¥GΛ«zkÆJg¨’]Õ^WŒªÀoXªBKðO}G¾(¾©tå•á¸¼7ߞýI-Ú3¦†œR€ˆ;ÿ|¼K Áˆ6¡o8ºA1ÚQ p‘e%ÄçíÁ˜òd¬‹¿ÝÏv”HqWeðØ#0™±v…è‹kÂdYCƄMá¹5k«–8l‰.,ÉƨAP[)¸i£-ê)àX3y%¶%H–{¢pƒV +vÌ(ÖåÈVŠC¤(”,GRÃ[‡j¶„÷ªÌ†SxÇ xH1ÊKCƒð +O¸ É:–`…ž£årô(æj5 :8@ÀRŽªtÀžKO<vý_ÿ/,垭”Hôˆÿ¢_‚Eö½á€äŸ0äréø¼ýwÈQ +9®W¡½&Ðs èËÿú¿Ã)ü€`À W“ÿúÿÜlB‰½bÿþƒÎQ¾+›Õ€šÍ3渐9›‰,ЙÙÚJЫæïÁÂ"—™ˆ7\‹Œ™Ó+¶~ &0±ÓÔýQu£¤TÖÍ»¦nØÞ*ymîىM»Ìl©ì±)™EVµÝÛ¦ìPéZÊ»åšö‹Ooù›dÇ™dmz1“Âú6¸ØÛ[zE§ ½Êù_†¶­îÌ(.Ø&ŠÕǖÉ5Ÿ&8£ìÐXèÿõj¡t Å ^´Þ=Öµc$ч•=àñ?hf^²2iÄ7²ÿK±•{¿!›ÄN™ý|D}_H%Ü÷œ-½én̤¼5³ùAhùඦg7*+GÌt¤°·r?ѝÀÅ-9Ü ++LKg;©¢û8P’rãÙfŸ¡ÍP…²OXM‚o”¤7¥ä·Ý§Ünjš=]Ãó.Q»K]~ÏG¿Bðʪ,ù¨¢'\š‰^p±S¾¾NÅ+z»j¹Þü¹§Kw–|ÜD]­`©ÀԖÓÌdå¼!œ»<#Cìyâ±^Mœe +µümì*Ó|wߘÍ0IT#·© <;Ã0¶ò]™°óBö3ä+äk¶À6"a€¦m:±Õ WšÔ\Œê”g—ùa%rO¶p5G/a²B\d’¯5®òýQŠ½Å%Ýd‹×nêÏ'Î6D%vþTú^¸ŸšÊ»èB;O¦ÇÉÞýÛ{±[õŒ±*Ûe> +¹9ñQÈ°¡¥¿¸ØžÚh Ð z_`Þ+㏧diQXoF¥Åŕ;Èøß7ÅfÇõà-do¦Q€&‘í}Š«¡{鿼͆“Ë÷ËY2fÇÑ"3¼Æýó .VnØ \ÒM%Ÿ¢Ø(3+‡I0Éøí¥' J‹d{ɏá¥yQ(_çΞªtâU¹~Kœå“eúӟëÞ2‘ÁÙ‚›_]€!å¾38-o‰§Äý +’*_š{AA{£&†œÝVÂdÎE8ý¯ D“€>Ô Á§×1ô‡?Oä„O¹§jƒo_T¿xh‘—È5ààg̟ÏW‘ÊÕäRôt™ËŽ¾ï>ÑlJ=ðZ¥¸ˆ´*ÝH]ø»€{.`+*†¾‹;K•>"71W±Äkâ{XìV¾ý•q¸ñS%I÷y)1x¼O·/ž‹­r©]wf?…ŸÌ )Å^º}ž ¯‰Ñkµû{¥Øs±ET¾ŸúåÙw"œ//&Dyìà ó_ÉäȖ¦:?ËF±Õô5ˆŠwÔà©#Қ_¸uèÞÕ#ø!å)²ír§Åî ·Ùœ†¸ +Jˆ“ñÌ8EP°‚Ze˜ä]}]L"_¹« +F¼¢ˆr_9¢xÄð—èô§v¾ÔÄUN®8<û\MÙ ¢’T7ÍZ±ƒ#¾Éù×Ù/Â3n„ŠX®ûñžæøž¨)’Ø<¤)ÂãZ{ËÓÄüêo†™_Á:x¡‘°éTGQ `u-]`pgÞòdZe“ÙáãC1ùyÒÎC»¾è©€ŸÖªÁÀ ­7-é9Õ(4ÅîíÈ„M>])5_æzýEMíj/É1X<ðjZìv›}¸6ám/²D%þñçk_ðÈ7yh`\Ã1Q­Ä“¥D°ÕC²'„×{„µþZûJßÜhYZ¬zt±;}>0~ Àº ï"„+˜|+>Œ§nðڇ«”ð7§‚èôVÆîzô—žò"±Ú{®‹`h|t£Darù åýWe›>/†¬º«øÐ}[¤¾Á’n²^€häô –+Í=ë‘«á…¨}ð‘J²Ý¢Ý86ØT=—?O²æÑ<… íá’ÐAª³Õ õåÏ^³c ¿‡gñ¾Y¼;_7eáiºøUÈÕË!Ðä«äAÓUÂ_7ýbgӍÉOQc(ÓÀ7Ë3̸ø)S.Ô@+wÕ*¯’Éy†Ý̯°†gM€_£ÖÀGEìæå2Íâx¯À'R|?Á z }}Ã=@øÀð<ç/ñâdAü¢‘á"4ükð7Ý~áßeԄGó]€—„~¼]© åîU=yË+Ÿz>!þeU&ìŽԨģ‘‡+¶âAÎG•­¾É=燆 ÿô–:»¯ç·"……§Ñ.;¢‚+Rÿ†kåø7oæoE% ܛh‰£– ƒðß¼ºï YRŽ_W•í呈Á“Oâõœ+¸D$š@ çÂN³º5¥¯Î¦Èxê. +,`·oBw”4ß"8ß;À Í·q[n‚æFšsy4±…þimŠF»8d‚c75<©C*¥ „¸?Ÿh„*×ßIRC9þÅU2toÑì[ Àö`™j;cäËð$Í'>iÔJ‹ÄäMãsÈÆ­¢«T«R›_P`Ýç`Xe>¸ÚútNû³±;5ܦo”s#¬Å΢àïN~|øpՊiÁMîú(@¯yÌ"èyŸ•§ïÎ èt¿/²ÀG 8Ô(ÍoýÀûicâh A3Ðù,Í#—Nù™ÄöXf´\`pªnTz¢Däªï!i¹%‰ÏßQ]m¾"éeŠg®Àyø  I%‡Í›Ò}»ÐŽx_–wBW7/Åû»Nºú⃧ï¨À´ KÎ7ƒ6Ö\‡5¶E1æ¨=쇣ْ(0Ìô!3·OWC»Ê~ADzŒÓåkðÖºT/Å6% <²NÕ<¼}ÓÙFPzЍý„fEð´(0§7uÂç Ä ºž€c­€ºz ˆ¾×9…ÍrƒÏUáéÞïÊLýPˆéoÄî +Y½B©+7ŒïKÃ4‚vVó|Si%« Õßí,ãH¢èT¢jC%½½’£rüS^ÉzËXѸŒJË3v–¨ŒƒoÀ«þ”h< V@Vç:zÝOu]ç¢æz©ŒÉJ‹Ôy rãñzd“G°-&s¸nflú4;>ïL•f“€5Ôê[õûc¥¾ƒóµî—> ½sŽ“P7Á4Oœ ®I<”âÝPP~À³€Û‰]¿Õr Iå¢xñí÷xœ™¹ïo­(•—ºOopªvqöƒ~{—›ˆJZÕªçKÞ ³-  ,õ靣x^æn’Uô+Äd/vâÄGmÉùÜ°Ý7/lԌěg,Ð-·SÞ&¹J<×Êwåޕdð ¼Äï©0Î7`Rÿ<€™.ü(ÌF-° ðÓmÊhŒ[aB`¡6‰K⧞«,šqÙ@æòóÌYw¾èòìô<ø;Ö*®ò״Δ†yÆkÑÃuúvÆáºieªB¶´VšåBßržLo „.“£»Ê8ý®¾RœKCÒô7ãî[àó¥HO[> ¿@[@ £oÞåîƒn]]+Ø(™ˆêqIz^¬v‹Éô²'û•ñ=ÛàE†ÐÙ:RkåâDŽ(&õóKüº˜ϋšVB“¢ï»Ðë^“D®Â)ºäòÙi!óDM +©5ÓW„HUhª¯Mà¥öT3\ñòöŸÜ%W[Ü.ýùd­^øy;HS…$ôhYeáÖÁ=à‘oW¡7înÀó‰›M%ô0 +2wßs…å~u§Äª,l Iëö§i––@ª6V:÷"<¥>¿Dr ½@‘zkS©²l%0 ª9ïùÅ#àȗŸÒ²•o3Íý)Ðhó×Ò<‹{€Ä‹]®Fú¦Ë/Kñšýøª]ÎF9ûä*cš éðmèщn:=åñUt{}$aLø¢¦qþü=Ã"ñù´RË_PÀîH'øˆð°÷ÊJp³„çzôÐw(-ž+Tî:¿V`F}o*ÎdŸ€¥TûFë/E7~5/äòë3墭#ðiVÀÀØÀk"ÿ«ãÁÆ=¸ j‚úùIDºÓô”Ô)Ñ\U‡ñ@ yuèå.&;·˜‡—v‘.Ž·Ä?DHßH!¶ax€Q…M2·þè[±Ûu9m-Y3îhT @ÚÀ8°œ»«"¹"îk}aÕá ¯êë±q€†¶^‚g¨ÚKa¶5‘Éῼy•½º7´éÕ$>J‹dáyÂFkîx$}(:2ÁqŽ‘ƪŒUÜÖ½Xi±Xiý|µGûžËÙ :Àrn¥‘-€LðŠ ’‚{%gp +>ÐM®hýŒDj¾‘z.ë„ÆUž&> §uN†¨¦ê“ü©?4‘;/].àà'Ô&’Æ*¸ò»ÒcÁ¿‘ ìSÕßrû ?ƒzzDl—¿ë±qP!SÔO…Ü‚ðò -èZh“ÖòOù®šþâLž}M˲ éÒsï}î Œª‡gg™œ`ˆþ"œ3±($Ÿ'ÕbªÆrpƒ>Hxn‚½2þ¸d³TƵ£~ð*Qç–‚yy5¤¶D禘¬' +%Äïë=YF eÇŠÑ +bÚW +ސ"5ˆs?xº,ñA&…bMwdÍÆ ä#b@/á°ÑS)¹Ûb'Ps3ñ­4 ZnNûÅT0t +˜Š “ý´¢J±ùh”è=~ôRÉ«r½<}B/촐»~VÜ©´Ÿ­}-K®j!ûñÌÑä½Ú‘ÀÏý×9PÃãuñaR‰dò¹ÀzŸO+›èG±sVZëIW1¹ ýšìö7+Ю|Y™Ä§¹Àæ}¥@þÇWn’ï‡ÈC)%Y%‰)QB 2|Ž¶ËYHžVP’èÉG9ÙѹÚúü3(» Mf4v3Ò×.-‚x·öüú¼sÕäøßäîs°!¾>6S˜âFÎSpèƶæãH4#À†>©ô@X &¬$êT ?#K¤ù *¸=`×~n _.€ˆ»ß¨Ÿ>»É."dHÁô¼ð݃_>©ÂœÒ_O@g­1¶ˆåî֊@*¢WɝëV|³ð0xi”Š©À5œ×Lc*ÍA õÅ L¿*°±JÃb«Q‡û¹“HŒˆªO÷§@WPoYò‰þ®„«ßÀ4KÓ³êç3 +?ñ|Ñiÿ•xl½} ¦I¼'¼\–®ÞxéÖë%W×÷~M ›÷î-pK¸WŸ¿Vƒ/©I)ö *X`ö˜»֗øiW—Àƒöï+‡«JP|—ÙAf~Yù˜½œ!v|O äþ´4‚½/O £`åzQ~ҘXäþýŒð4J©bû5@Ëã×ØJ11ƒnj¼:èV㲘T¡~…öD}„"Ýb0å5Â/(§H–ýb<­J~}Š«+g›øò|Dà¢x¯Ü8ǘ¢ƒðþgöºUHdž`4!؎€á¹qƒM ñçÞù ¿”ýÈœ}ØʆŠ§ûþê­?  ?ÖR—­óuíѵ>O?VßÎӓ't¬ú¡Ïbw:ä`ÿOþDªŒŒÀÍ-TÞÃÂ*!R¬)IÅäCœ5Íù§â]÷"Ø£™ 9 àÙ 4ßP{(š†þÑ^òwêv³àfëUÜ:“i»€NqW£æ–@˜¯È_+ŇðúXð@ù•~J¢?ÿJú¯zƒ0ößýWS. +?Eb¹ûLTzp/}B²Ñ«.W¦Km^?{¸$¡ó‘—žFü—‰©ÓSg#Î`1úÐ8ƒa÷Ósþ:p^PxÑé†.ÁÎÕ8m¦þ|Í銱Ñó{„?vÕúÊcõ¯›+Ø»o—RLiSõß6Ÿ*kgG|Z™‡Âl¼žþêÖ ¨¬>•¨‡B˜ä2íÛtåµr5Í^á©PÉ»tuÊ׋JõíËOâÀ´Yŝe`u‡Á¡à Ÿ{Ýýq¦ßu8š g ?zs"D<ÿ|w¹¾Ø}püÜãËn&½XåŒ +\W™w&U¬'èW/U9mª•+_#ž}mÜ.ráŸ2\†V ®ô=ÄØH3¡7›0 ,Mìïùv«&Ë0Y¶Ë¼¿®±p¬ãQ¤O•ÙÁõ"Ÿô܅\8¢kKÊ|`l ÀSa¦#ì­8¸T-–úÉ~ƒ?k ðúKEõù¸}¿×ÇZK~Æ3ן!«j4Ìçù]ÓkbÖ¨]ècÍ9= ‹_0úXÛ8ÜŠF2>½á²îÀmÐk|ê!Ý/U}¬±—gŒÀ|·2V>cXD|JŒç@¼ßéaňîSÅkâì¢Ý)°Âå‰ÕÎ^u‡{Z Ü׃гîÔ¾“ kÛíÖP8šå#„päÚeê©}a>"7w«w{jCo±ËÛ²`Ñ[ õ™# ±4ñE딓«±’̧ë¢g€•&VîDT+[üˆÊXáܨ×côÛ ­5wêaÝI£‡•Ù|á^ÏÕۇVd—¥«yƒá&ÎÎ;=&«5öòõݱžlöbîuVH4 CÕ›;C¬njRhŒÕfØuûbõi°4lêžð]% Î[€8¹Öbm&K/֗ Gƒ5ÑiÎ{<ÖêûœPõµ€5ߪq„qšf¸õ69?»Oèb½õ13C¬…y¿\Ôà +ÐÄo^¬“¡X½á²§à{cD8]¬þUÖëÝ{ý¦„°Âíԭᾕ±žû9¥µy¶éL£”.Ö^§õ°B ?Öµ…‘ßXo-`½òö>Ÿ¾ŠºXŸ®>„©µíáöûEîÉë{ ûhu½úXïZ“ïçJΧÁ**iìƒ ÝyÙö»ž°Xÿþ'§µUð2oE2´îp«ßÁ„ÖTÝùt‡5y¬ä)WS/ž+fóôƒXý2Vˆ†—P­³¬÷s³ì¬—Œë—ïá\À:Oû4šÇ…ÝÞÅֈ;ï©«±†vrƒòâඬh†œïg `-°[rñNóX¯<Հ†ÂÎ"ÑróX?¸Ì ŠÐðDö>ú³õˈ5¼-ñ`²éúX‰+3»ò +X3÷!õX돥 WŽ7 j‹èÕc³©îÙ¼µ!VlKÜ¥]§ÏÜý5ÀْÕLq°zô_DsòS•’f˜RÊýòØ|¿Ñ}}C:sØõ»Ÿ3xêÎã$Û>Ó{ +Eç)Aœ¥ó +l°Í”õÁ*‘$ÎqøÔ¿ýtºu›ÞÓ“l}ÔãAé¶FÒ*Ÿ®Ÿ#I¼ÀvYrޒ +Ñ©õÆÛ×ÈâÎ@åáÉè}v ÚuzÞ¼ø© ÜÐyÙlô‰ô “q·¶ƒ¦º¢i댲ò´ué´ÑŽÙôç¢LãE¸*ž¤\Äàõ€Ç_¢Ù;~íOeh^#ڈĕÖ~­õÈ|~]a×ÂÜx$ uccårn»€¬t¿•…N%|ʯ=£®VFü¥ð”ª\À_gƒÊ[0ˆ‹ô譂ûJßlåaÈ¡©|¾z¡øÄdY²Ä5A½{ØO˜•*¶Æ,w»‰_\ _#T~ˆÐ±–4†Š??ˆÖ4T¾öØF¦ú— ÚëŸu·Xó>Á-ÓúœTŠ“j\\žð͍5áѯ¥ë®3Â+¼Ñ}O½A +#D¿ÈçŠì#éÍaôª×½5ŸC$¡·ßð.“&^ʏ0ë;d¥è ?µÎj7zsD­§àyAI[°½!½°±ûçِ¿dæR0´1Ñ8yî®[­ 3Ò#†¨>Ö +ª X é•scI/z ¬´R¨ú^^+1ˆã‡DÛqF>«xõƒ­I0¢ú4¬5\‚±¦¿<«ï-N¯GRw¨À_oÊPíùªÐÏn¨—§RŽë.O¯áà¢çÙFÓ|phyªÆ·=¸÷3ÓÁ!Z»øµdÔÈiÙ4ÐOò¸¼.4.}ž ¬ÕZC;¤“ßt§l{H•ŠÝ¥õ¨bwŒj‡\jC¾¥ä´*@óþs0m°qÆóªGh Ý}/1O@bh¿ ´rèÍÈ Ð¥QҚ8ˆÐÚHž6mŒZ»ú„8´º¿$!µ2àÑ@5Àÿæ ×ÛÛ»‡Šû5ámh³Y…¿‘ˆ¢ß: BžÞ↠žÒþK^­iú–ù1è[ä'RzMßè3Pòh¬3y†e¢i¦ežZk¦¼þȘ*=c)¤Þ#ík6„¦Ú²&·LIÅ j²ˆ•Á¾“šÖ®ÒL2èþÀiN/8°aŸ$‡Þ§†Ý’Í<{}šž™hς¼~­•IM¶õô­þÆmÑÊÖ³7‡hÝÌSŒ¤½‚ƃ¹Éª”<7»B³rKT xacMe^J4+ƒo‡aªÅî¡DSK·Ý‰&DÂv‹”ž_‚jﶗLՆå,›Í²èÔô—Ë[…­«¿&uy& ešl}oÔû!ËsR|lJÜémÈiܕ}wÚ¨;æÒB¶ÓÌ Tk/íÆŒG“gõ$ĎS¥ò5=úƺ3¨'VòÀ¬'‚ÕYß²:w% ꉞ‰¦ç?¢^]UzîÇvsáÖ¨Òê\«²§2hÃýA™«ä©p»aÂ[–Í5t„k;Hý…5…Ò3ºìvk«OöD@cip}_, +ä­OÕµ'áµ#¼ÊÜßjF(mWÂW8+ëAŹ¥ù`§øqFÈ{Ò/ë]¤F®û÷56ÆO_ô8‚w +w¤—áb×_éb”>½âÐK½Ò/9A­©;~³±áœ[Ç¢nä•nL1 :úܼ;²q‚÷fö}ô<# +V®³E WP7Zû~¯Áy çÆ:"PZ£©w„(¤Àò£ØùӁCºÙèõ4Æ­e(zžþ‰ÙàC a¶ô ¤MŸÙ%\bÛԑb;æ ­ +ª„Ú̆©Ð˜ÚÌnhÌlE0ÅÄÒ֟‡Ìý™]òI›^Û¬Õ0ÛÖÚ²’Íô⺵§J5„{-­d8¸c¬›†V+îÂÎÜ;Õ +ÑN[ËîWQ½!‰{¶‡¤ÕöD*ç͖Vî! +a4áEE¢²‘ò30s!’võ’˜Ÿ&$ê*?¯Ç¯N +ãzîhý\ÓÕ§LQÜ6òHÞ}wC3j´j·WM4 ¹úƒÐÂ6׍u”BÎ ¡Ë€ª…́a|4sJ(X6ûR;›fPŒwØ }–â6”÷ɲ9 •"Ú:¿¬‘C¤›¤Ö€Ái,’v”nì\»k$'Y캡EŽ`@Á’±Î顋÷I·#HGÒMà4k@‡I7ޓF€ÞÅEPúºÛo‚·VÀ(î1,ð’*f0iYÌÐÏF;¢ìQF9T¶‹ÀBgÜÀMÎû49c†¹{dt=÷´‘µ=vøÁ”*ÃÝî Ch¦Wë´º/k zG-Æî}K-ƒTß+~›ÂÆPp§î(Y@è ¬ + JØæF¾% ã$CA›ÅÖë@Û1N¨VŽš¬¡/o@G?>ídýë)G9ÊdÚáÖ?pÁtó TN¡mý éº˜†ÊÑ,r ¡a‘§ÔùÔړ˜-µö´“õo¢ÖžŽbý?*Ç­l;k@úúÑ\9 òô6²“~4WŽhcå²ÐèÇ­œ{©N:ãFÊQŒ ˜§fÉ©†òtìÓÐeEEK +‚Ê+Ó ¶} [So‘ì@h¶V¦ #€Š[†L%¯šh+㕾½‹kê2=یyk·aµNaŸ1‹yï”ü‡ú$¬VŠ3¬PÒQS/²š²‡6t㬉šSãø幕§C‚m +ÿ.‹l;4)=Ï͝'»©½ÔϹÉÜì”Ç¡qZË~0åÅVÚ`WAËÐÖV¦¯ÍÀî(‡ÂšL_ eÒdX¯[Ú>™D“•l¡ÜaWÑKÉVŸˆ®ƒPuNÎÃyž#Ӂ5zMg0ì£Z>€æ8å|æµ|‚q{x9Ÿy-ß :æå|æµ|'êÒÅýËùÌkùšã”ó™×òhJ÷.ç3¯åƒ¶ÀQÊùÌkùN¶J÷,ç3¯å;A¥‹G(ç3¯å;Šý.ç3¯å·¾.ç3¯åãݨ=ÊùÔ ÐƕHk­Ã®ï+ >ã:°‚ynۙ` Øèc•+~9ðZ„·ŠUþŒÝ€TÛ¥M=Ý?@ HÕ¶¿n¾SØvç¯Û •L§“í2ŸíT6ŸÍz@¿aŸ w +M v¡nŊuŸý†,׍]Âkkˆtútb»Ó"lfÒ' vÔ6ô.õ{;‰4š—sh¨jž_"ìFÙL1ù¬î¹Á'{Òrû—àéáƒSÛõ†é<–ew;å—Äv4ëϗÖ²r£,Ëîìå—ð±Nژlïॠ½¶Y(¦Màۚ_mV|–ªiÙ¦ü"OŸ“&DßÓ¦sLÈu¯6·²½Æš$ +*w´Èy4 lÚÔ±FÿvDeTC +ꔑý‹{ŒP•ÇÙ«G{ãÌmŒj +ÍNWØAΎjòš3¬¿,ǸŒkäòÜՍAŸ”f¶Ì{Ð-ãÌ{iúLçPÞ¿™§Ï­Ô°í9TG=õ*òí.ԚuMŽ”î6ƒfqPƒŽ [5ó*]‡¹•ÉÑ,*vv$šñNÊ>DÛ:°ahêxq’Ñ$Q%XÇð/&uÃò)y#_Zö†0¬Š(Mð{k“º¥?ØÅù_²š»Ò]ä:9·ÖþàVDØÄ4:É"Rz9uíc»ý¥‹+O·Y¬Kö¶gI›A<©k7VŒ5ã²?RÀš"Æ;•†äЄ»Í +öôô‘=S×,÷ÝólÎìZ˜‘vR[˜×z•ºŠ`ŠŽ…i\›µÚ¥@_:êØ¢VÏZ—em%'ím§>YTÙª¢V¤âKÚX%ø›U©,H Ä‰*jCº°‘ ée¥—UšŽCzÝ8J…äÕ#nž‚ ë9ègt5öŒé eéšgÛÜ¥×— +.#F]7?ö Î:ܐ4=ùÌf‰ŸE^–drX•ø–0Ï«5Xâg§³,fUH/lªÇÐöÒê3·fC|çÑÍ÷RfBÚÛ1Ý«2oÛ[CÅyǮ̳N»>Jež-N;¼2OH†Õç»2oÇdØ}+ó´.®PœwìÊ<µ³c•ºýÊ<«T«#Uæ)ÒG ëDŽP™§È¼WçÙTf¶+óLæ昕yz;…öö…`ÐÅö.߉yÝaÎF¶S/‘öÔ¡¼êåVâŞRàqÏêmÂe>ÂѪŠ*\¶çf1¤q±M¡Ålx@‡ÀC‹QíF©vyvJ±~4—k3ïm¥XëlÂZ:³MÚ±HÖÆz“±oY–2ÖY>Þ)ÇTϹ³L3\Õ÷;®¦: ù§qÈ5‚:9Pû2? Ǧ‹‹í²Õtøz„P¶•£&fcÓðç¡©Ï;6=΍—i&m8B¿&俳4³Un·ÒÅÝ®ƒ:¼Höýç˜E²Ú‹dߎS$‹ŸÆ6¡*±€ŠQÂ¥% Ý„¨~”²8nÀfw°£ÉZt-ÙÐÖG䠅br¬eþ’`ª«ÖcÆØZÅdØNíêò ÖãaEy[jÍN®z˜vŠòNlv}pQžfyfý–ø©r.,N¿XÀ¬ÄïGÂID;Và‚Ú>q_ËfÀªP¶Ø™8Ù:þC=¡a[¼&ɰⰏ)‚)&ê–®€%~FlÁë›é®B¸èž¿JO—«UÊ'Çoãdå•èušB˜+5«Ìçeÿ²[™ãåRøæ©rFÝt*WþN÷’þò'À§Z´s—‰çwbqçO+¼rBQbEº·]‡–º»’Îè:£.»;ë½´•Ñ.U)Z>S~{1*»{6+öƒ7â†XÑeäXgð&ò£+ô¬ŠýÖQc¬ð&rC¬ð&ò‰\v¢½§ÐkRv׎GXÕuhèvn «ö +=€Þ º0(€óšûdÈ+F4rò¼nû%Î.bw•/£²»¾YÙÝyÂ+µû³Wƒá¦ê­Ù-i„õÁ„ÂwžŒõd«Ø«V õԞó*ˆŸ„¢Àï2l«]´ŒiJI šb_¾LÑF;†æª²2£~‰Ia»íEì։ʔÍRý­ò{·[@Ú¸W½ËT±ºçÀR…‹J¿´qµ½;жOL7Ïè2..*[d®jöÏ £ƒû_¯·Ý§æF“àŒëõô¦o‡°ÝÖ©m;gjÄmYœ—®Î4¹ÛM™­­Ÿ;¸ïÍz†#T˜fwáY]´b5B!x_±‘«m³ü”¶sNJ]Â[åhÛ_7´Õõz зò©œÂãöéUõí³±(ìÓóŒÃv{öéUõ™ÙÐ{öé9-|€ø¨…}™Ç.ìÓcŸÅ鋊•cöípF×!…}jBòU}ÆÛ«{öé)'1}ÄÂ>½>iólŽPاWÕ'.Ï=-W½Â>½9<á39faŸ(åfñ‘ +ûôªú *V)ì;ˆhö ûìí…}zU}ûÍ¢°O¯ªoÛN;¸°OÏ&=Ñ«ú>¬°O¯ªO£¤Qا·Ù"ùžÇ+ìÛðrê²rq÷(ìӛk󍕽 +ûôªú¬ôÍ…}&¾ç1 û4ä°SP¶OaŸÞN4''Ù«°[øˆ’L»òTí%ÅìÄÂî0,TSé駌\Û° +ìö y¡»RQËX)lŒ\&Óe—7j ¡“ؤì"~°ºÿoÿâ9áò?³<»öºËÿN¶ïX1˜‚ƒ.ÿ“¢¦÷ÿÙ¯Á4ȹØ-zïËÿ4û7÷ÿíV*¥sùß>AÈ=.ÿ3B*ïÿÛ£^JBhlÜÿ·gIôêÑvø]ëÆñj<®2÷¶ +rM‹›Ä½50¾ŒçÀª›uÃ0¿CpiYÓgœÀg?»»qðµBAßv¦±^Œe½£Iíò8H›C +rՏ‚qmÅÐIjڒ¦ör»¤©½”5Ÿ07ÊÏHóÁº¹Ù´J‰ï5Õªs¼T«ŽÝT+‹LêöÒV–•BLïÁ;)Šlʲ€M@6u ™‹ËÚy)êA9QûíQi¯fxH¢FtÚ¬öÕ9~|wi¬¸Ov;ÞB+›×ÎèÚ}IäZÄV6ºB™Ró›‚å +&§Nê:›f%ÀŠójS¶Áw~Ë}O{ÁBX‚ef×Û.ŒéÑvÍ £t ´c]îØ£åŠC¤;·uݒB̬ïP/A X²€M@»Í'¶ŠËå˜÷ìŽàß @ꢎ/#Ò,M Ł›ÅÐ&óm•P¸¬ cl®ÇÝîý3ÌL¯þ;FIªÂ;Úz4¹÷oSý{ÿN4…˜[Wÿí±Œt’6öqq÷¸÷Ï@­ÉWÿ:®­Ú¨Ý.ëÛíÞ?QØجÝØëÞ?ÛÇ·Ãܗƒh(É´³@ ª¯­Ï=ў¢h¿Ú—<œÙuTƒ)€æG¨ö}ÿA¥¾êݨ}Y¿ldtA@TûÊ2 :¼ÚB1=Ûn·êû'óê{½B* 6[Aõø¼{Ì ÏŽÞø$œ] ©ú ͵TVÕrÞý‰âÜA›©;ÚÎÞ½Éò|¶߶SH…ˆ¶S-•iIfÈÐÏ×ó=j©Ü—=c1mn1ê„`·l²…=‹± +"í©1Ë!Ë«ÒmYŒ/²Å(™‡Ôݖž§º²ÈBáDçÌ{“Ê4 ¿ÉpÇGonÊ![…ì6NÕ öª¾íÔÝjz6܍²uà~—ajrnÑ݁Ǻ óE“œubZŽmf»ÉË ý B±Ü‚sÃ0Wø_0ؽJ¾T^‰—nåµÊŠõD÷¦\ + ËåR¸óE;kQ],Ô½bQêò­³ÇõâMU{3®ÌKÝgÚJ†RUæù³Ã–n= @Ã_Mw‘sÒF%ÚBDUÜ(lˆ#º¥{µ£©‘SV«i±~™]þL+°J¥jhüÕt?+ W[#{ž6³Wӝz kä˜ÍóÓôŠóü¹ìÒø>“+c/ozXOЩVˆÈKãòGŒ »]C¬®&5a¥V厇º$ðþÙkõî­fHaÕ½ŽV´<Ä÷[S Ö¨€}Ø=c³]Vn'ƒ¦±÷¦-1o›o'(ÎfB?eD\ÄÄf¡U¦fñ傞úÓËΔö/ÿö!ym½K†”éµnV)6Ú`ŠqYԏaŸ”ž´ní–b#핝h/¦©’¸¥é“t’ÓàöŒ;µÝNÓ§ÜX1&•ÝÄ-ÃmŹ갅â¶Cݘ}.<4܉åýž6/<4/<9Æå'¨Ðô¶C9xà…‡¶’a¿ð0ozÛ¡œmwà…‡æËXåFr᡹æÓó=÷ºðp«4BuÛ¡:çvç@„|á¡õÔ,ë í¥]|áaÞô¶Ã“Ýï)ܧ*XLÙûÂCóÛ·2ºö½ðÐ<]íÄâ>ÛšïÇÈ9P^xhîËñŠàʳ{¡Ó^šïóˆRàà ÍS¼ù=é#\xh~ÛáÉoÇ1/Êæ·*­Îƒ.<ÜQ +ì{ᡊݶn;<ùmï{ +w9oäÄôžÂK.üÒm‡‡—’¹Â÷Êã ¿ðÐ<‡V Ú᚟<¢v<¸ðPUøµ•óq¢-ZÚ÷ÂC›2íÐ Mu`ù7ǸðÐÜà?ÙážÂýÎÿÑ&‘vá¡ʶǭ«Öv½ðÐôŠBdõ ›/<4O3@™)ǸðЈÉøÛ—i…‡æƏ”daUlu᡹ñ£É~ØÿÂC5ÁµE"ûDu/<4‡¢¿µÇ…‡FPìÞ*oóÂÃÃ2ºt.<ܧT_Š@zááVá•ê¶ĆJëQ÷¶C…L;ìÂCó$*9ÏæÀ ͽ{%ѺðPÝ1›Ës÷ ó=m_xh~Û!Z7Ç*¼2¾íðDçhý½.<ë»ô-ÆEõêAšé+é/<4/cCËó§påMo;Ô!÷¿ðp_ËfÇ Íoä¥À.<´×y؅‡æºB +©jÕE3ڲݚ1“NójÂàXV¥e㎞§çaMDØt/Ô"ß_þÉ4¢¯ ‚©C^.•ð,•)ËHLKw¡ ú±+¥tiVX™æô¼y7Î`Ø}Š6Óçb“&Ë0¶èôM˜ûpð"ãŠ>ÝƋñ„Ÿ^‡é é®S©´ïêíüõÔyÍyEâ!|úò™È4ç]¼˜¯:M75]æO?95'…ù×Ý´AuÒé»÷úO¯ƒ¯ãÎô~¶x¬…o7½~Íëé÷Ë~ï÷Kü»µlû³ãµÿµÀ1›a¢çÎSš¢ÃØù4 Ðx_›Ãž?í¿õäΗMlt±ª0ÌU¦íô}Ôn‘RkáÏcŒÀ®òÑ}"°Ú}‡ÕZwS†™]™Í4ïf݁»ºS¨üÌÿTý—©»78'ðPmT€‡U{É>ÃNnΰp‹ÒNÂÜô©2ÃäY®òJ›Äeñr(_‰JG½îÒσL/D,€F ×u¦ç?La•¸s>Ý5üh¸ºcÝ|…Î}®‹çöy*»(]´;µ÷Wçú2–vÝ&üҕŽ`ªÞ«ÁdÓõ}‚Ê|ü{J\Ìì# +J€ªi1j#¬¬\F_ %»!CˆÒ–äÁ©®ßUã*éθèH¬úTú霯R¬'†-:þ@€OÕjaüˆ•P-pqxÿÕەšh¬‘Ò‹¿Ê¯ot.]¾öäÛ3h#¿¸Øžúõ5^ýÌäÊ32ŒÃ ZU‡óŸ4~ž#ýú(€…ÉŸ Ôûç0É"_*ô’žG¯OCh³G”ógnä*aáx̋þä‰V Á7?ú,ì‡ðg!ÈÿùÁRô)zžË}}ï[&…lÓɀž7<Š~°Õ—ôÀ'?@¨òÅ@zP¾ôˆ¤!åƒÉåXz€)ϯ§âƒ;/+^kž’ôµ_ѾöJ‚Êë ¿ "~‡Á¢©%^O4ðÆF? ¡sƒ…Û_qI7Ùbãé©/ft¯ D !UBÓ…n + 'Äx I+ €‚ù9>âè ]—øó-¾íÌ£àݮߟ?˝Á§ÀGw…–Ht¾4ƒâ/ÍWʟO¼+a2çÊLVîG"W}Ëâ\0 jÏ÷J/jyqi7Ó ‹«2ï ¤¸d<ïMê>ª7£ê•ëÑ¥I0®gœ¨FnSpàyF"ÞEÿLàï2& h¸´°-ě@×$àåÁcùàÓ3¼F4¯½à7œ7ÕÃÏH>}ó5 £â§Q Áæwþ€@‘>‡…wço˜øé—º3à3ºšy¡GóQT~ùtFûh¡D¾n.„Ñ̗ $7¢¥T4•¥>½ãò4A´J‹ÔYJ¡µ¤êañ¤>~hèï¼ÈÇpÏ! ë± øîÃkxÁ>‘¸øi‘Û ë›ûŽÉÝh„Źáóæ³É^ðô–øº½H#AuõÙ$vSóÇÁ|}$üÕÞs½ØxÆÎz_m´j¶Ë’¦Îh2St4µïƒØ8Óïgg ÷YunŸëÎ`*Ðwº×]| +6œÁb”rú±&Ôè='0”›NßÏEaR üò »öíJ˜Æåãe¥û²ãC,€hŽD'\¨˜ :Ÿª$/ì(²=’ºIè9ÁS½êü] ):…+R ¾ùÔ¼ ˆ\]"ë|WA¯ê™ +_âi­q"¬o„ǯ1q¥y]ª(,œy€$y– Ç“¸/ŸAñ51zCÆM?<ë¨ä…#¤áÊMŽÆ@cBfšh÷-J‹Ó¬ÂӊU8Khö¡l #¬üonÑýۂê¨A˜n‹ ¬Uk†±ø q%ˆSˆˆS2/lîø‰ÂŸA†!Ïóùø;+·ªp¨Òꍺ|A¸žÅ‰ +vÃr10A¨e5¿ÎàÃ$F€®Îã+ ?Å¢¶u}}åÀë‰ +òV£.g®žµÉ́Oè5†‰c»´}À,4«ïU!‰52äeäëî«ã¿Šx1Ü?/”AïÜQ (”–ð’ÌD‹_Ý&hêK1ž©D¾²£F +)¼^H7áFA{ˆËˆ÷-XÛ È¢ ‰ÎkP¦í÷¦ôZ t̟ƒŸ ìi#•‚3"“Hr< ù&›ûðv掰<Ô1ÔüÙ=Œá…ˆ·NÄAŸ.óȀƒ«5‰–1LMKÁOQÿ&ïs,#\_.…°°É^5V&ÚQ¹òÇoŠºàE'ºÛíë®ôuûTNWSÃ@•ùÌ|f_›«|mÑ{†¤ëñ7¬f×S?<ãE%ÏÜp ~4`á¼ è IgÁ ñ›8[—Ë¥¹{õ^ %Ýl–J3óbgãœ&êÍ*IºCMõut:E²ô© /5/菲ÆT·5Ó|(dªÔ¬4÷xî«õö ‡ÔO1\¬\/g,QYà%Á[ŠUf`e>pÐoºƒÅ©?¿q9÷D õMã¼ò^©Õ.çÅn%ú£7fÃCa9„$ò("žZ>GJú²B‚[e˜œ±UÿìuZìöž˜QG€ÑŽ_k‚ÛØ P?E*¡Pî‰èsx!{3@„·Au€†'üU6ïÚ{Î÷æ4߄ÝÚ<@êo䊸ù³`„s_nWPy!ŽyÏSÆVV¥V»ðATâñ¯b7ûíAæà[â`÷œrWDHZ”?H¢£å™ìûªv§[àH +ìKsΊՋK ç:1ó¡#4;Œ~—¡+ØMQ®ð+٠ţO«Ì¼Þ¼õ½«L}Ä*rú„d*6ãî:[e>­øbðyžµ[…0ݗ¾î""}Ïéó‡Qùã欞ÝLòR(Æô€éí«Ù¥„¿9hÙ[°à : ÉpÎρ¨ýyÏD˕~±[þ|·»ì…#Šö6{XÛiEݨm ˜÷P8ŽsWÁÔB +tÝk~Ȩ¡’68lësóe·§í-åmˆxрÚI³ï®ÖU]GT0ž;Ži;¶)cÈi»’{§#OÚlÌzì¶;jèxì6Óºëë`N;Ԋ㙘–7^”³:a‚@å!Ýÿ;§ÿÕS€ÑÂènàŸn?øpú‡!ðôþ4 £-§{ýxî ü¬aÎ-Œ€?"Dòð׈5x&à 8¿Ü0˜ÐS8 (Ջj_ú¡—rÁ¯ýê;ñ#²ðj­ByF¸˜BÏý 7½ +ty!úúY±5É5mbç•ñ=û€‚ƬóÃ]æáòõ Ù Ñ"㬨GmZÈOã±Wɯ꼰ú .<¼Øµ1ÂÓ :`ŽyÒúc¾¯Œ]ë3(àÿ°¿Ö£6+ùÐû›”6PÃ}ϼ]ÝИ™”%÷N3mHp¨Ö°&©µ»Z•8íHV”E! +›_iHÔÍîòöˆ{„s)7%ݟçy7j7êkñÛµ´Y|€–qú>ki¹y¶¨ < 4äOXëÓ)w‡¹„Ó{÷š†Ê¤• Ö¸ãÿô¹ÏrP£ 8tê”|‚ê§ÿ$œÞÜÜ,†±lìWè…(€û>â×ʧÕÈ^i‡ýñkµ³1•ü=ªÐk\^ƒ¥ØuV¿­©mUû? oô´Ý®¨­ ƒ)ҘQ–À/ ÜXé å{ç•íèɎCWsZdØ÷²ïÓ~%ôðŔǗ«Áq,+~omG•»;§ëäÜþ +žÓ®Yâ6x²À.ëlÏ#jÁr§í"XvZdvdší™6^dpÚ.‹  ±Xgh‡^Ó`’Dt5If>Ú·éb=‘€GåçJ¥¯»³;ôgºšÚÀôÑZ|ƒwªO¥N³æ®Åzü1Ty%zð'Fd\t%S9%°C‚…Æ{G áˆi×GŒhüª=֖éÁ~îìÁžôþ¶UßÇÖÜÁɲ»´ÕÃxäÖãëÆÓtÌíÈiööjB-ÆӎêiüÒÈ­™§‰§ÍÓ¾½âinƼI? ©8ÅhRãÈ ÿæ¾L‘èÏ>¢¸ ¿õV:ÚñP-vô åz2›¯fRȆº]ÙÝí)Ϝo^ËÈ­Ln~¦á§ —)gøTÑÒóhcCóòÛD*勻)®¼b¾ÞÇw¯?k¥–4”<ÎËϑ8lî®fŔí´‘ö^×`d¿^mTÃÜßf{ö/í¹Õê¯bH´û×+?Yü蔳^?Öm¾ž}’KÍku§PÒ8m,Ú¬~7ó¹$ɪ NKsëê¹3ÿ¬}»z·`Fœ6æDo–ÊÃî9ÝäÐ'Ҙ_yžj¸M֏ӆÝû›ü $zïË,êÏ=sçÖÇÉ÷©§Yk'ç¥R + E´þxd¸cðV +‰„’f§o¼ùgñ÷éü¢™GMfh!vêÖÆ@aöƒ`òÙ|òúvßuêÔ?”Z{õÇöj³öícð›r±ÅRx¯ý%/ûéÉbe¥ÊWy°’½>“0þ«9¥¸÷éu¼À|7¥¼[ù ˜q¡´èbaLÉ»X¨ûcèºî]¢üû¯d˜ Ä 盳VyÃÔ<ãÅ…ZegúíÍÒ[ë÷7´o¶î$•ÄÕIgZ¾è¹8¥?ørö–?^öÎ3Ä{Mèû†×þô¿âz ïÅ6S×)ww¥eƒURšâºáU¸ÆŒæãêÓµÃ8çJfM!«z<݅ÎÁ‡}u¯ýkWO­Í¼E » ONÞ³KÜQÓ.¨…k#&Óh ¬t¹V³§—×lw«¼¸i7)j0³¸wŸšß®Ò]بä(˜Í%¾l¯o”ÞƒŸjO¯E«S•ø«¹j»w9/y#¤—ŒÕ90¾9êä;ºx½ãâlàUíj]ç5’)X´ FðÞ±¹vó–‹ÞJþÀNMË ×PÞ§–]z3öTgæ#?ž 0_@Çrõë4¯7îWU¹”Ô /8t†P¦¯Õè½Ë6Ýä ãc‰%ݜ'•tH›òç³¥E^¼^߀æ³üãÖ«ÙÕé?žž%ì©úØTUêèKÕè·_}Ø(_ìw–yñêû;«{¹‚gÒvåâ`_â±Óµ7K¼Õq×åšË°B’Œ ++ÒêXxϱhã½g`­ËŽƒ—?•œ9‹üøóÝiI^È ÷͑º|QŒÉëæÍZÝðx8üX’… +H’¨øˆ^©„X6ç‡ðeG¿ÀL—á¡ß%_î½è>íw­´@ûÍõ]ŸYÜt帺גõæ•(âרúìê¨à¹¼pŒ‘p,q‹7f£ÛÆòþñœúZ3åíd3꣓(|W / ;…øÞ¯¼= ÃĈãßôbï—æâô ï‰[Ä°ƒ¾/…?4-íz1Ž³º ‹Nõ»Ë«K¥˜|úЫ+qáƒï@ÝÝ,¦[Ü«•gx³0…wÒ×e¹©ðRq;¼ÅüµD›ö(îî¯ó‘Ô|Ê©Ð@……Q£¢£úÕ*}(Ô{ì´±!¿ª›Ê§‡,º‘_Þ_)EUhxÑ]ˆŠXl›ú½ÚšZž Šß¥IhR?›yzX`»ü쎰KßûåßîߕvÞöÜ÷;æ T¼o…±‹[¯ÂÚ ‡qɀã8ȋËpš»ZQ‹È‡»Ty„×Öñ|ýtCLR børµÃÕ§ÇÃï$ù—‹í–úÄÏq-wõÑ:XÂ.LùÞRÞºjZÔ¶õ¸©:?.îE7Ö$ Ä¿íüŒ~s¢Mq¢Íæx÷U-:ŠØ¬^™ç³•/§gÍú§µW[±‘B¥Y°&’¬´ªf3­UTŽô.Hõn8ê·2Õ˜æ;]Vž~{(Ô§zû"zÎVÏý~]‰Ña£Úö·•úÕëÓÊæöÑÌòÉüÒ.ª×wx :Üwnl`ÜM$Ž"CˆÖæ¹õC ýõCÛó%ê! .† m—¨‡PÊ-†PùçûÉ Onø"àFyóñªÛÛè]œ_Üs“o''ʕ5Ævn:·+½nw»û÷‡úíéãu÷æÁX0ʕ­Úښ/êÝÓÛNטSùûžõ%.QFŠÝπ–|X­Ÿ«—ß6Ûõ3kÿ}:`ænû&>7äõšSs +Ó)U Ð¸ŸÃ¯ûŽ ùÌÕQimÍþVïöªË¥ÏÍÝÔ”vwp¼½ŠU +–w«ÝÍ¥òýù;™BV?¨øñöóÍjñzz«ömíª¾|x\jK[([³ô÷¢R$2¹!§ÉìvÅÅÉÕ^Í—ê8¹OÚsó»sÕJ« ¶0Ññ¹æ¶B¨Ÿc. a+ :y®¹0„­€ÃŒm.ÞÀ×.‹0éE…À5’uš”ýem>>oÄ¢†´e¾4MªæDþʗM w:ƒ¿:øuú…}scÒߘEUhM®& ScoÕ¨às&Óφ, ”)iWÚß,çõ'Õɸ]îX9žñqí‡÷鮲]¹Ù¥ÒOÕÃÙïÈÐd)œîE +nێ˜ìX_ä“æœVበ+lšTÜiù¨^¤Oí׿SÁ§XG¡®Ø ™â õnM~RUµNÎUs"ÓèrDŽ>V¬œ/_~3W +ô©ý¦¶Vqjs­ŠSõ`çCl»^ž;¡2;š1ñag¥Q±|V¤ÄB7Õɵ®3åÃaY–sC·l–>-},Ñ' ó‡s[ÂÂrr::îÁuãª~6u%¸–Þ}ØsÂÎ7þeA$SÓÒø{ºVÞ]äUú‘“»G\&µKÝÓxƉê5ÕQCl¼zS÷ç_•V5©†“ùzw7Gˆ¾Ig“Ð^^Ü'Œéˆ–q6g[wê©ö/Ô÷û=`mK`Pìµ"ƒdß4ú Oþ0$Ô(’1s6ó«¤üûý[3L£á3K¯¾©Êw5sN¾¯]ò\ùbïÁ$[ðbn¡$‹eÚoÞ.Ì«8,Ý]­š•®×Ò·“áâ5ÙJ‚èýb)DúӜ²^vä±À'PÞïÚñe¥#¹5–©¡½ñ‰éÅ\º÷r¾vÇl4Ȋ9ª¨U]­Í¬ýºõ¾®Ñ#hhý$Ó¨1¿‚!Çu½óƇMt‡¾ÎÊDŽÉäÛ§°†hÌ# /\ò¼è¸S ‡°¤PZÜZîħ@yiï>QaÊ«¨mŸ8‰¼ +Ñøí—ûø9Ì«8žJwðxòåWœÿ¶Àôÿ˜IYÜ¿ŽR@v²) ûú iq»’îÀ^;Œ;؊’é¢-7ñÁJk†¯«í¶úýÜÂ(OQÁÚ¿fìòu UR,£: Ò«òhÏ8,—Îå:Ȅ™uà¿é©W;ëZÖA:û¢P˜}ñdցyûܬt(G:€aÒÙ(ê÷[Žt:<nDDØKa.t¬©ÓÁ^úZ((:´?l$è°pŸ—Š3DÎdôòkùÔñO—ÐA°ú¦ LªÒSqÔÛè´ä™<†ԁdè˜)Çê#N(êÛÎfpËGïg‡Øý;#¥m¼‰èl9¨ƒÛs&N,s"ôòí(/l¬‰PIê!S¼ä¾Ééc {>DAçͺ”Ð#ïó‚Λà ŠHD}èì9Ž°)è¼v ˆ6ìŠ${æ ñ­ûñ…û°˜=ç¬õKX+輙à«ÉðêÓÓ‰ÙstÞTG…˜=cÀ)ļi5ê['aû7¢c.´V¶«¾ûßRICqZb^N+!gVà´a¹µsÚHû6A´aa߉蜖 fŠÓM$æ´Ñâ´b?NššÃ)éW3õ£¯ª~ÿ=ÙÇlJŽŒÄlBI÷%Æ`$†‚RIÂCgÏqØb6¡¤Çb³ÏPÒÒ%¯µLg€‰üÀûZXõèýìÆ«¹â¥€ßÚÑ„÷8DkÃKÒ­Ö£S+­VÂùrz¡[wlîüü½<,W‘­Ë×fXŒõúÁ² +fY~•iêÓÏî¬:Ö,ªHdìj˯ …ùUM–_›ŽêãlgáAJ‰5-X¨‡I~³< Žçþ³æSk1“÷µy-&©ûÏkeýDàíy%üa#®Ž.^Z]œÕŽ0µ¡Á“Ö~ІFŸ6Ã,ˆ˜£y×ßî>›LÞT‰«Îë!ÕÖ_Wužf£ +ÏÿuUç)“Jž™.óªÎÃ0qáù¿®êüdX ÏÿuUçu8ùëªÎG!ÉÕKWÏ w\uÝãäá÷Œ^*Â[œŒ^¢KÑrﲬ|¿'©uñúËt$µîC9c’ ¤¶›pÈ*Š_”Áo~¾V¢óhô»E§+øŠ,MmÊH/¦µÐaKÎ+@ñ+>^ÖÞæII+ïå «Ô»5(X›ºSH¿_’B¡ ( B, +&Þ©qW³Â“O]œÉ£¶IuqXÊ´p’ë%ýðSåçÍS–ÄêÝ*¢õ8ÙUG! ÉâÎcq¾æôO8ñ=7xŽÙZ¾éèg˜žÐV÷áñN>"ZÕîùÅM³ýg·79Á úcÁüÛ Æ}ƒ _B›'“ù´ÁŠFoÀ´Ê•ÞCýâôáâö¦ÝûÓX°½Ï͝µº±`ÐÓ-xú­Qœ¬<?åñi 1mMNXFÿÚûcrâ1ü3*w܀¿ÌÀñ§ŸûÃ`–ñÙ8üfIøqsrB0ÛôØK(—C`Sځ Ö»ð¨åUsÚ¬ÀL6·ûÃB ½“¡HÚ[ Dˆš8—¸V¸•BRÓŠô•Â"¥ €ú¨6LŒR–œ\ G*KÑ+¦##Á–rÓv™ã…t85ò¤X4ÿZfRCÆ+ôR,-ŸƒºEð$K„@@ÒrdñWØ ‹FÃA»A 'δlË@b¹Zÿh_x°°‰i‡ÀÄÄu<$$U``‚T¢Å§æ}€–¯Šx'¨£¬Wd€R_ãôð‹%¤*V³G–ö¸åÅDJl~rÙÕx¹•–þ¸ð¤¤E ’r0jÆ lÙ ¸œ{±¹Ê*¤*d _ < ƒN¸pm’8–"?Šb±r&"-T4 s è›cD@؃\î®ÀBþ*8®HÈl2^]ᆃ¥¦ýíûŒø]²Art€µwÜ°ðÈÁ¡8§åá:€Áږ àé+#5P'…€¦/PéƒÐáÜCi(S,,/ÁMtò¤u« ’#ø.žÄď }Œ™BWàҙ$&• ÜrŒ{$æTDeÁxSǏ ړG…ƒZHuÜ>³Éø†qY M%p܇Âq0´Å‘©`_aÌY"ã +‡  Öò0^Šþ> ¼;ðˆÉÎðJ Ô( e„V¸\‡€(e^4-Cɑ“@‘‚f@àŸœkäW͛Pëø>E™m…ë‘m'÷ÌÚõ}d3жkkYJi`?‡u1ÐËÔpŽBV—V ‘rÑ<8lá’ccˆ%j¨€ ï´Íâ»qpݱo!Ⱥ l‚êu`AT||Д7»í«Ïmáïø°Q¨UÖVÕ:nŸÝö®é·b,®PÝ·*k +Å­‡?¯º­¤ì¢]ƒ¢?dþ³ÄùVÄ!•\]bø"‰È”D| QHGAÚñíëdü—Nˆ Σà 0O.=g0 f*0_`“Û˜©»™1:®Äa0Š-lð¾à Ø\6:0IÑêgE+láÛÚs඲@Gû*+<5éq⁠ ® ÔçàSáƒÐÂwÐÝA™‰™56¸‰ŽtL±`i|…%Р '¼h©®ˆæ.CÒ E--_¤)—9†kæR¿9P<:Š˜ð‘X…X&7Q ×7'UŒÀc%‹á@9éb$o3 cH¤œ”1¥€ÓIc'mlª5VòSDÉܜ0•FË‘É C*åd†•2¹aDŽtvAÇÉ{.‘žŠê†¶„Ù¡ÜGƽœ™—6b䎕1“0û†Ì>ÜÙ2‚BJž2ÐîGùÆò]‰ >Å0T-²Álr“[Ú0@k¡Œ'ÀÀ +È&ŸÉPp4U-=Œ]p •Ás.C󲸈Åa iŠÍè1’¬2C!‰P§PEQméS’Â\ZjjÚ$õ½˜<µ|ª½€ +å «g$þávÌIöÓÁ#¦û!ÇKøC"™òMÇMúC|ÇLû#É3Vâßsà…ÅFBé…2$íÃäåù!xÌL?]nk¹~'Û/Åæ@×c̜?Ý1ë/òÆÊûK8 £eþ6p*÷od×>åsô%÷¿ÝÝxŠAžðmaG<’²Ã³¦zÚ¦¯%y1i¤†~®ºË¸*F‡­{—ï½è¾Ú¨cF¡rƒ “ç6òHXG,JÒŗ#áK’¢Û®+½ö5¥bF ­‡ÛޟG¦öé•ýà3“s_È´°P9>­#Áš &ß—Gl®š÷k=Ère{%9e£\»½9»¸Â}i?ü ¹QÆiVn.ÚWí{¤j’†£Ûę*kHW½Î“Ö<ÌØ2´2k°Æ2Ç£œCZS©ƒ³Q¥ôשŸ +ÑdӚ[©Äæ©ÖK¥6à _<¹¹õW¥7OµþÑ'NqÎiú÷¥9çÅér+ßI†ØìËÄCû‡9Ò}s–#ƒ”ù?&üDŽãÿVy¨UþO[Ue-Ì󮪭ylVõ I=8??9¡?kѳòÉôsSSˆæv¯ Ôz~ßþ[×hßÜà»wð“qÞëރ¹Ñ5îÜþl5˜šZÞX™œø?ž‹uÓ +endstream endobj 6 0 obj [5 0 R] endobj 24 0 obj <> endobj xref +0 25 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000029195 00000 n +0000000000 00000 f +0000031822 00000 n +0000088050 00000 n +0000029246 00000 n +0000029600 00000 n +0000032121 00000 n +0000032008 00000 n +0000031322 00000 n +0000030511 00000 n +0000030760 00000 n +0000030808 00000 n +0000031468 00000 n +0000031582 00000 n +0000031702 00000 n +0000031892 00000 n +0000031923 00000 n +0000032194 00000 n +0000032368 00000 n +0000033545 00000 n +0000055932 00000 n +0000088073 00000 n +trailer +<<5C6B5E0266BBED4D88B3C749965F7285>]>> +startxref +88269 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png b/plugins/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png new file mode 100644 index 00000000..0bdea555 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/eclipse_with_icon_128.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_black.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_black.ai new file mode 100644 index 00000000..be5ef960 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_black.ai @@ -0,0 +1,1414 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 22 0 R 40 0 R 39 0 R 67 0 R 66 0 R 94 0 R 93 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + Web + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T01:30:22+02:00 + 2019-06-22T02:45:18+02:00 + 2019-06-22T02:45:18+02:00 + + + + 224 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AF/8AOLv5/m+S28g+armt 6gEeg6jK396o2W1kYn7Y/wB1n9ofD1pyVfT2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KofUNQstOsLi/v50trK0jaa5uJDxRI0HJmY+AAxV81eTfzuvfzH/AOcj NHtrJng8q6dHfDTbY1Bmb6tIpuZRQHkw+yp+yPctVV8lRySRSLJGxSRCGR1JDBgaggjoRir7e/5x s/PpPO+nL5a8wTBfNlhH+7mbb69Ag/vB/wAWoP7wd/tD9riq90xV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKsx2AA7nFXxR/wA5L/n4fOF8/lTy3P8A86vZ Sf6Vcodr6dDsa/75jYfB/Mfi/loqkf8Azif/AOTt0f8A4wXn/UNJirx/FUXpWqajpOpW2p6bcPa3 9nIs1tcRmjJIhqrDFX3z+Q/51af+ZPl3jPwt/M2nIq6rZDYP2FxEP99ue37J2PYlV6hirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVfKf/OUf5/8AM3XkDyrc/BvF5h1GI/a7 NZxsO3aUj/U/mxV8r4q9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVTnyh5t1zyj5hs9f0S4NvqFm3JG 6q6nZ43X9pHXYjFX6EflR+aGh/mL5Wi1nTiIbqOkWp6eW5PbT0qVOw5I3VGpuPcEBVmeKuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV8/f85M/n6PKlnJ5R8s3A/xLdpS+vIm3sYXH QEH4Z3H2f5V+LqVxV8WkkkkmpO5J61xVrFXsH/OJ/wD5O3R/+MF5/wBQ0mKvH8VdirsVZd+V/wCZ evfl55ph1zSm9SPaO/sWNI7mAmrRtsaHurU+E/SCq/QryV5z0Hzl5btPMGhz+tZXS7qaCSKQfbil X9l0PUfSNiDiqeYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkn/OQP542f5daF9S0 50n82aih+oW5owgjJ4m5lWvQbhB+03sDir4Nvr68v7ye+vp3uby5dpbi4lYu7u5qzMx3JJxVQxV2 KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXpX5HfnNqn5a+ZBK3O58u3zKmr6eD+zWgniB29W MdP5h8J7EKvv7RtZ0vWtKtdW0q5S7069jEttcRmqsjfqI6EHcHY4qjMVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirA/zh/NrRfy28rvqV3xuNUueUekabWjTzACpNNxHHyBdvo6kYq/PvzN5l1r zNrt5rmtXLXWo30hknlbpv0VR+yijZVGwG2KpXirsVdir2D/AJxP/wDJ26P/AMYLz/qGkxV4/irs VdirsVdir23/AJxx/PibyJqo0HXJmk8pahIKk1Y2UzGnrJv/AHbf7sX/AGQ3qGVfckE8FxBHPBIs sEqh4pUIZHRhVWVhsQRuCMVX4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWOfmB590DyL5YuvMGt S8LeAcYIF/vJ5yCUhiHdmp8gKk7A4q/PX8xfzB17z75oudf1mT95KeFraqSY7eAE8IYx4L3Pc1J3 OKsYxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FX0t/zi/wDn/wDoma38i+ar n/cXMwTRNRmba2c9LeRmO0TH7B/ZO32T8Kr6+xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVAa9rml6 Do15rOqzC306wiae6mILcUQVNAoJJ8AMVfn3+c/5vax+ZPmdr6flbaNaFo9I04kERRmlXenWSSlW P0DYYq8+xV2KuxV2KuxV7B/zif8A+Tt0f/jBef8AUNJirx/FXYq7FXYq7FXYq7FX2F/zi/8An9+m YIPI3mm5rrEC8NG1CVt7mNRtBIx6zIPsn9obfaHxKvpLFXYq7FXYq7FXYq7FXYq7FXYq7FXYqwD8 /v8AyTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdirsV diqpBPNbzRzwSNFPEweKVCVdXU1VlYbgg7gjFX3N/wA45/nvB590kaHrcqx+btPjrKTRReQrt66A UHMf7sUf6w2NFVe1Yq7FXYq7FXYq7FXYq7FXYq4kAVOwHU4qw7yP+Z2h+dNd8xWGiET2Pl+SC3bU FYFJ5pRIZPSp1RPTADftb02oSqgfz+/8k15s/wCYFv8AiS4q/OrFXYq7FXYq7FXYq9g/5xP/APJ2 6P8A8YLz/qGkxV4/irsVdirsVdirsVdirsVR2ia1qmh6taavpVy9pqNjIs1rcR/aV1PvsQehB2I2 O2Kvv78kPzk0v8yvLYn+G28wWKqmr6eD9ljss0desclKj+U7HxKr0jFXYq7FXYq7FXYq7FXYq+X/ APnKL8//AKqlz5C8q3P+lODFr+owt/dqdmtY3U/bPSU9h8PWtFW/+cHP+OV5u/4z2X/EJsVewfn9 /wCSa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/OJ//k7dH/4wXn/UNJirx/FXYq7FXYq7FXYq7FXY q7FU+8j+ddd8l+ZbTzDok3pXlq3xId45Yj9uKRe6ONj94oQDir9Cfyx/MnQfzC8rQa7pLcH2jv7J jWS2uAAXjbpUb1VqfEN/bFWW4q7FXYq7FXYq7FXhP/OSf59x+S9Ok8seXpw3my+jpNMhr9RhcfbN DtM4P7sdvtH9mqr4jkkklkaSRi8jks7sSWLE1JJPUnFX1n/zg5/xyvN3/Gey/wCITYq9g/P7/wAk 15s/5gW/4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FXYq7FX Yq7FWa/lN+aeu/lz5pj1jTyZrKWkeqacWpHcwV6HwdK1Rux9iQVX6D+UvNmhebPL9pr2h3AudPvE 5I3RkYbNHIu/F0OzDFU4xV2KuxV2KvLvz5/OvT/y28vcLYpceaNQRhpdkdwg3BuZh/vtD0H7TbDb kQq+BtU1TUNV1G51LUrh7q/vJGmubiU8nd3NSxOKoXFX1r/zg5/xyvN3/Gey/wCITYq9g/P7/wAk 15s/5gW/4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq7FXYq7FX Yq7FXYq9T/Ib87NQ/LfzB6dyXuPK2oOBqlku5RtgLmFa09RQNx+0u38pCr740zU9P1XTrfUtOuEu 7C7jWa2uYjyR0YVDAjFUTirsVYX+bH5o6H+XPlaXWdR/fXclYtM09TR7ieleINDxRert2HuQCq/P jzd5t13zb5gu9f1y4NxqF43J26KqjZY41/ZRBsoxVJsVdir61/5wc/45Xm7/AIz2X/EJsVewfn9/ 5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ//AJO3R/8AjBef9Q0mKvH8VdirsVdirsVeveWf yOuvN35Ky+cNAR5tf0u+uY7qxWrG5tY443/dL/v2PkxCj7Y260qq8iIINDsRirWKuxV2KuxV2Kvd /wDnGz8/JPJeox+WPMU5bypfSUhnck/UZnP2xU7QsT+8Hb7Q71VfbiOkiLJGwdHAZHU1BB3BBGKt 4q+A/wDnKHW9U1H85dbtry4aa30ww21hCfsxRGFJCqgeLuxJ64q8nxV2KuxV9a/84Of8crzd/wAZ 7L/iE2KvYPz+/wDJNebP+YFv+JLir86sVdirsVdirsVdir2D/nE//wAnbo//ABgvP+oaTFXj+Kux V2KuxV2Kvt//AJw2/wDJRzf9tW5/5NQ4qwL/AJyj/IH6s9z5+8q23+jOTL5g0+If3bE1N3GoH2T1 lHb7XTlRV8u4q7FXYq7FXYq7FX1H/wA4s/n48E1p+X3mecvDKyweXb+Q1KOxotpIxP2WNBF4H4en Gir6xxV+e3/OSP8A5O3zT/xnh/6hosVeaYq7FXYq+tf+cHP+OV5u/wCM9l/xCbFXsH5/f+Sa82f8 wLf8SXFX51Yq7FXYq7FXYq7FXsH/ADif/wCTt0f/AIwXn/UNJirx/FXYq7FXYq7FX2//AM4bf+Sj m/7atz/yahxV7o6JIjRyKHRwVdGFQQdiCDir4j/5yU/IR/Jeov5n8vQFvKl9J++hQV+ozyH7BoKC FiaRnsfh/lqq8IxV2KuxV2KuxVlf5T/+TT8m/wDbc03/AKjI8VfpTir89v8AnJH/AMnb5p/4zw/9 Q0WKvNMVdirsVfWv/ODn/HK83f8AGey/4hNir2D8/v8AyTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9 g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdir7f/wCcNv8AyUc3/bVuf+TUOKvdcVQ2p6Zp+q6d cabqNul3YXcbQ3NtKOSOjChUg4q+Bvz5/JTUPy38w87YPceV9QYnS71tyh3Jtpj/AL8QdD+0u435 AKvLcVdirsVdirK/yn/8mn5N/wC25pv/AFGR4q/SnFX57f8AOSP/AJO3zT/xnh/6hosVeaYq7FXY q+tf+cHP+OV5u/4z2X/EJsVewfn9/wCSa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/OJ//k7dH/4w Xn/UNJirx/FXYq7FXYq7FX2//wA4bf8Ako5v+2rc/wDJqHFXuuKuxVJ/NvlPQvNnl+70HXLcXOn3 icXXoyMN1kjbfi6HdTir8+PzY/K3XPy580y6PqIM1nLWTS9QAolxBX7Q60dejr2PsQSqwrFXYq7F WV/lP/5NPyb/ANtzTf8AqMjxV+lOKvz2/wCckf8Aydvmn/jPD/1DRYq80xV2KuxV9a/84Of8crzd /wAZ7L/iE2KvYPz+/wDJNebP+YFv+JLir86sVdirsVdirsVdir2D/nE//wAnbo//ABgvP+oaTFXj +KuxV2KuxV2Kvt//AJw2/wDJRzf9tW5/5NQ4q91xV2KuxViX5n/ltoX5heVp9C1VeD7yWF8orJbX ABCyLuKjsy1+Iffir89vO/kvXvJnmS78v63D6N7atsw3SWNvsSxt3RxuPuO4IxVIcVdirK/yn/8A Jp+Tf+25pv8A1GR4q/SnFX57f85I/wDk7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/AIz2X/EJ sVewfn9/5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ//AJO3R/8AjBef9Q0mKvH8VdirsVdi rsVfb/8Azht/5KOb/tq3P/JqHFXuuKuxV2KuxV5t+eH5NaX+ZXlswjhbeYbFWfSNQI6MdzDLTrHJ Tf8AlO47gqvgHWtG1TRNWutJ1W2e01GykaG5t5BRldf1g9QRsRuMVQWKsr/Kf/yafk3/ALbmm/8A UZHir9KcVfnt/wA5I/8Ak7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/jPZf8QmxV7B+f3/AJJr zZ/zAt/xJcVfnVirsVdirsVdirsVewf84n/+Tt0f/jBef9Q0mKvH8VdirsVdirsVfb//ADht/wCS jm/7atz/AMmocVe64q7FXYq7FXYq8U/5yN/IiHz5pJ13Q4lj83afH8AFFF7Cu/ouf9+L/utv9idt 1VfDU8E1vNJBPG0U8TFJYnBV1dTRlZTuCDsQcVZP+U//AJNPyb/23NN/6jI8VfpTir89v+ckf/J2 +af+M8P/AFDRYq80xV2KuxV9a/8AODn/AByvN3/Gey/4hNir2D8/v/JNebP+YFv+JLir86sVdirs VdirsVdir2D/AJxP/wDJ26P/AMYLz/qGkxV4/irsVdirsVdir7f/AOcNv/JRzf8AbVuf+TUOKvdc VdirsVdirsVdir5q/wCcoPyB/S8Nx568rW3+5WFeetafEu9xGo3uI1UbyqPtj9ob/aHxKvmv8p// ACafk3/tuab/ANRkeKv0pxV+e3/OSP8A5O3zT/xnh/6hosVeaYq7FXYq+tf+cHP+OV5u/wCM9l/x CbFXsH5/f+Sa82f8wLf8SXFX51Yq7FXYq7FXYq7FXsH/ADif/wCTt0f/AIwXn/UNJirx/FXYq7FX Yq7FX2//AM4bf+Sjm/7atz/yahxV7rirsVdirsVdirsVdir5p/Mf8gP0N+bXlTzz5Vtf9xE2vaa+ tafEu1tI15HWeNQNoWP2h+yd/sn4VX0tir89v+ckf/J2+af+M8P/AFDRYq80xV2KuxV9a/8AODn/ AByvN3/Gey/4hNir2D8/v/JNebP+YFv+JLir86sVdirsVdirsVdir2D/AJxP/wDJ26P/AMYLz/qG kxV4/irsVdirsVdir7f/AOcNv/JRzf8AbVuf+TUOKvdcVdirsVdirsVdirsVdirsVfnt/wA5I/8A k7fNP/GeH/qGixV5pirsVdir61/5wc/45Xm7/jPZf8QmxV7B+f3/AJJrzZ/zAt/xJcVfnVirsVdi rsVdirsVewf84n/+Tt0f/jBef9Q0mKvH8VdirsVdirsVfb//ADht/wCSjm/7atz/AMmocVe64q7F XYq7FXYq7FXYq7FXYq/Pb/nJH/ydvmn/AIzw/wDUNFirzTFXYq7FX1r/AM4Of8crzd/xnsv+ITYq 9g/P7/yTXmz/AJgW/wCJLir86sVdirsVdirsVdir2D/nE/8A8nbo/wDxgvP+oaTFXj+KuxV2KuxV 2Kvt/wD5w2/8lHN/21bn/k1Dir3XFXYq7FXYq7FXYq7FXYq7FX57f85I/wDk7fNP/GeH/qGixV5p irsVdir61/5wc/45Xm7/AIz2X/EJsVewfn9/5JrzZ/zAt/xJcVfnVirsVdirsVdirsVewf8AOJ// AJO3R/8AjBef9Q0mKvH8VdirsVdirsVfb/8Azht/5KOb/tq3P/JqHFXuuKuxV2KuxV2KuxV2KuxV 2Kvz2/5yR/8AJ2+af+M8P/UNFirzTFXYq7FX1r/zg5/xyvN3/Gey/wCITYq9g/P7/wAk15s/5gW/ 4kuKvzqxV2KuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVeP4q7FXYq7FXYq+3/+cNv/ACUc3/bV uf8Ak1Dir3XFXYq7FXYq7FXYq7FXYq7FX57f85I/+Tt80/8AGeH/AKhosVeaYq7FXYq+tf8AnBz/ AI5Xm7/jPZf8QmxV7B+f3/kmvNn/ADAt/wASXFX51Yq7FXYq7FXYq7FXsH/OJ/8A5O3R/wDjBef9 Q0mKvH8VdirsVdirsVfb/wDzht/5KOb/ALatz/yahxV7rirsVdirsVdirsVdirsVdir89v8AnJH/ AMnb5p/4zw/9Q0WKvNMVdirsVfWv/ODn/HK83f8AGey/4hNir2D8/v8AyTXmz/mBb/iS4q/OrFXY q7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV4/irsVdirsVdir7f/wCcNv8AyUc3/bVuf+TUOKvd cVdirsVdirsVdirsVdirsVfnt/zkj/5O3zT/AMZ4f+oaLFXmmKuxV2KvrX/nBz/jlebv+M9l/wAQ mxV7B+f3/kmvNn/MC3/ElxV+dWKuxV2KuxV2KuxV7B/zif8A+Tt0f/jBef8AUNJirx/FXYq7FXYq 7FX2/wD84bf+Sjm/7atz/wAmocVe64q7FXYq7FXYq7FXYq7FXYq/Pb/nJH/ydvmn/jPD/wBQ0WKv NMVdirsVfWv/ADg5/wAcrzd/xnsv+ITYq9g/P7/yTXmz/mBb/iS4q/OrFXYq7FXYq7FXYq9g/wCc T/8Ayduj/wDGC8/6hpMVf//Z + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e + + uuid:29dab8d7-5b1c-014c-8e3b-a6adb016ac80 + xmp.did:66A6819719206811822A897E387FE54C + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 99 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 96 0 obj <>stream +H‰|SÛj1}×WèVž‹®` ö6.B)Ý·úВ”?´ýèh$e×nŒÐŒ4šsÙñîãlw÷3ØÓ»Ù°õ÷ëÉìÞûôÛü´¨Gh9$KÁ~»hÑŔ"ÛKÝ|$‡T$Ë>;Î5þaͧí{NÒœGŒk—)¢8È,o4c +RDÚn“ÜöCæ+>SJJ¨îÊÈ£dHRÅä|ô=xÇ´=…äRxm~w/ìš!Ø 9-¦ÁUOfúZÃåÑ%QlD—…z—Q–‹ÙÀ ü,+I,ËË’¬ ÷³Æ"à ‡åÙW‚¢K9‘í[?E” ‰Ïìˆ u˜ÚÚgYÇ©1¶¶d¯hZmͱÈâûÒîBèyèy§«ï£Äç~Î #ÄJy8@!ÞÈGߥæÞãVè95GûË[Žr’wW~ŠŸzÏÜóq_㲞)ïyco·uº¶—²wX¼Ã"sØd ªƒJð±Ý©éZªÒ7’Îý<ý-iH©VhÞûý´\?i•Q힪ï>9Ì,¾Ëøùp0þÏÌ zwlù`S‡yRKY ›ä‹ïíDbIvùn¾ì¯'Dµ {•ÒeÔ/8&Keäuʶ À›é:^×½ÕcÅ:LìÒ~Æßz}xX>˜»¥ýÏÿ0J‚ý +endstream endobj 99 0 obj <>stream +8;Z]_5n8N$$q/KmrsR+pb-FV*b(FC? +endstream endobj 100 0 obj [/Indexed/DeviceRGB 255 101 0 R] endobj 101 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 94 0 obj <> endobj 93 0 obj <> endobj 104 0 obj [/View/Design] endobj 105 0 obj <>>> endobj 102 0 obj [/View/Design] endobj 103 0 obj <>>> endobj 92 0 obj <> endobj 106 0 obj [108 0 R] endobj 107 0 obj <>stream +H‰\“Ûjƒ@†ï}Š½l.‚§=$ Bb*xÑMûÆS¡®²š ß¾ëþ!….(|̎ÿÇ0†EuªL7³ðÝ͙fÖvF[š†›mˆ]èڙ N˜îšùNþÝôõ„®ù¼L3õ•i‡ ËXøáŠÓlötÐÅ6Aøf5ÙÎ\ÙÓWqÞ°ð|ÇêÉÌ,byÎ4µîC/õøZ÷ÄB߶­´«wó²u=7>—‘Xâ9†L3hšÆº![›+YäNβҝ< £ÿÕS‰¶KÛ|×Ö_OÝõ(J¢ÜÓ´ ½§8• ô¥è‹9( PR ځh’ž’tZ)N}BZ Æc_Ï äIäqäIäq JAH—HçH—HçH—÷„H0 ‰IpLBb¼ž¬å O O™IÌL`f +3°V°°V°°V°°V°°V°°V°ðTÞ3Ù˜ òJx¿÷ XWÄm2{ì_s³Ö­ž_w¿së¶u†Ä8ŒÌu­Oð+ÀøJÏ +endstream endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <>stream +H‰š a{ Áÿç÷  J `Já«Øå +endstream endobj 112 0 obj <>stream +H‰\U P•×þι÷"ˆâ‚ˆŠ>|ˆ ƒJ 0X%bjô‚hAÁ…ºcM£I´Ö­Æhš8­ˆËCͤ©N"“ŕb\f´©©UF¤1¼ÿö€N›ôÝùßîùÏv¿³\€¬†BÌÄÉÏ é³G8§äñÌ,[ä<Ø>¿ @=6 +JfOۓÛð;8¾œ]´´àü£E‡€ €áͅù¹³î. < +¼4Oô‡ +ÃÿÕÈþÙG/ZriÛGËdÿVT4f®ê“9ȏF^*Î]RÒ9§í{Àn-òÎy¹Åùۚ“ïË>Bü7•,È/9z:dp 7àJ×Ñ&Xð³vZC%Ê°§o•‹îdYÜFµe¶Xë;dNcI’Xm+2ҒœH„Ó4ë{ö*9KÏNcD;OoiñŽ`}º‡¼{©<ôÌígÏ×-Z-ßmŸ1|­Åä³çé/CÖïZÿ3(íé³PblÆÛÂJP!t~=²­ø%þ‚Ló­pñáÆQ›Vb/1X´âpùØÄñ*J7‚0bT%­A´XÉÀv„à¢XhüeœÃ8^´2pNÍðs›óÖµ&{(žôœÇCê£a¿f֛]æ]´Ç÷*ÌwÆ 6Å¢• c…D°²y4jޔ˜²$†r|„s¥¡=è„WDú×؁ñ .â+|CD¨?­¦«ToÁWcטq&ÏÌG +^F:VË×0êKc8Gå¨ÃêšïoöÓKlg  K°¿Å&Tâ®ã&)öç ÎT‡Ñ£‘ƒE .á²ØüV0UJQ”IÓh%½Nií£Ct„¥p¾RJýJ¦íãovš +ñÛ=¥6Hfâ0AòY‡r¾ä¦è +G±[‘nç³í¡æ%SnΚkp¡ŸÈŽF²œ9 S%ê¥x 'ñ™èÖáþŽ JŠü©“`á$½B“i±Dq˜“»Jþ⸈q½ŠRuzª>â;aÛÇìǶ1•ÆkΘó­ù&~’$¯¢ [3ö¡ø9‹»¸'âÃA½%ÖT/çÝ!öoS³”“¯âClÔhµIÕêP½Ã~Ù.¶wØÇM¬I“ÚRÒa¡ˆ•5Rª)Ùb{ ¹%3Ç¥zðˆºQ/Š¡q4…²ÈC…4ŸJ¨”–Ó +Aµ‚NÐIj ›ôˆ5;8XpŠâ™¼†·ò ®á¾« &«,Uª–«­ê„º¤þ¡ƒ´[Çè4íÑKõ2 –rtõ;ßÒ\ìËóíô±ÙÉö/ìõvµÝ`m̧æ8#1fc¶Ä¸Rοñ¾ÔÇA‰ñ¯¸‡FÉùw‚…¢¶Ô]"îݚ·$‰;M"ŸJÙT «æ +þ«©’ŽÑ):MÕTKçè +Ý¢ÇLý Y£¤ 2¹@ΰ“+ÙË×e=á«HåVCÔP• ÁôÆ` %HT2­Žê --?Õls Y§ïY¬®ÈM¬¾¤zHéÜUÐÅá’}=”÷8éÀëRùÓTÄé;jÿŒo +¯[©ZÎxE|’öH^â¤P:½«c• +#0—·¡—p©çLü“ÖP°tn“ä&‚  U ÏD=gKÖ/Q'D«¤N‹±žÞ‚›|tçy3†Q¾ú¤9Ôן©ù!U©TTQ“®Õµ¬ÅRµ #Ó#Q*d¯ÌˆLéÌp)U‹ÝRÿ¯Êœ€Žü„VpæÐuŸöñLD¾ZÈci»ýDQC±?É4IrŒðƒo…éXÝr‡$H5Ζ;¦P߶ִÐêªúÞd›p{†ÕÞ¾…e‚NªL·õÒK©¸A]i:M҆Çkc¦ ’ê[&„ÚQ8.é0ûCŠ§ã¤R@“¤Â§;*|ïèõúu½X¯»©I¦æZlÁNüYn“äÞê'8N4§Éì™#wD †ày9]^”©4N¾¥cŠÌSLÉÌC©LÞßãªä†/xL½ÌþB¹¡–c•ôÿ:l°ûq™òû*œßà³\Æsp7Ôç*‘¦ ^¿©Ë1˜DÅópÉRoÑÛ`®Š·è!Ó?VºTêÞ4šsÀwQìí—Ø·8^D£# ý1‘~ÐÝÉJLÊÊÌH|!atü¨‘#â†?;tÈà˜çE»£èß/²o„«O¸³w¯°ž=º‡v éÜ¥s§ŽAÚ¶ ðoë×ÆaiÅwŠk¬Çéôxu¤+55ºeïÊFSXc*ãuzZŜ?•Lɂÿ“L|*™ø_I +rÆ#>ÚíLq9½uÉ.ç)gR–пIve;½[é´VzS+(tx¸(8Sº&;½äq¦xǖ¾•âIsUþI®¤|ÿh7ªü„ Êâ*©¢j%8$edÃ/P‚òvw%§xC]É-xUߔÜYÞôIY)É=Âó£Ý^JšéÊóÂõÆ«>¶©ëŠß{ígûÙ/ö{/þz~Žóž_b'qB$ä£ ~MHF¥ã#e6!•C@@7:R[ÚI„MPú`ÒÖ?¦}HÕ j7UzNYê„QåI¨Cýkü±ibSÖ±ªžV(+8Þ¹ÏNJ¤iÚÍËÉù¸¿{ι'÷š¾”Õ Y˘Ž!Ói-£¡»Aç•|ë¢q¡À£ý¹w@;0µ/cÚ¦²t !ën3C¯,…¿arq(óÚãVÙf ‡(T4Œ×óâÎÌãV•Òl怱¤q$gŒÀÒÀ‰£»XœÉfL|–TèNè®*û;¨ SMîyÅdµAí°ñ|B1L´ë¤:‰èóåÛ(2¬ãM5Ó²–ÚÍû‘±ëä{’®Hë-m­y^¨86ïõU®æqæàšÍâ¬î”ݵæYLiOAB˜Ê´H2쩇’ƒ=ȘînвF™ "GLv(gð}TOǛL#¯)Æ= ?]¯™ªjü=DYš'k©öUÞL¥Ì–š"Î!ˆ)`ÜjÉ]m­/Èí¯ÀpÚ¾ÊöµƒûU•ø|AGûA0gvf*²‚ö˳HoOeM’£–ÅUKàYj™Yµ¬ ÏiÉW}fLWbíóñÁÚáÃ}&þóÁŠ}t·6ºsoF6rUߎŽ¯“*öž5[•3k‡26™T9"Û,+$å¾µÎTÈp¦½>‡•Ô +Nd¥¥ÁʈÉç¶WhÖ­ªÿç Bù_t”õçËaU˜f_j½üÄ:y<ΰ`{‚ŒŽï5 ÷:ÛT Ãє#gLÊ3û5…׌y¸‚$ŒcùՈÊ çesäB6q÷A¶4˜×ð¹yŸÛ½73ÏÃsçÜxf.7C¹Ál¾l™y!ÝÒª¥J*(T@£}®Ž´¿<¯#4cYí–Â’§ Y:ת£é©èøÊB k!.¯Ó{Å¢¯ö¶ƒÎUÑÍTz7U{»ÀÂSËÜ{àJC•F«ÆÐxæñ|°™U0ÀbbÍ|U{YÍà ó[ÚI‹1Lj ô2§£YÃPàGƒù§÷d*Üoâ J­Ïš0¿iQ˜;K‹¼9³&0ö{5jHÌRQ©TôF³Ö ‡Eá0Àfá6`?ÄÀ9ÑHÞá,`î +성SƆܘ9›DX'ÕÍa$¹¾új8õ ¿Ü?Vꆿß?ƗúQº¿ÔO7vlT¡QÔCvôH±->Òô)öE„ÉäÊ#¸»ý^.;ôd3×Â&ä­u‹A‡ƒáCÁÚÀÖZfŒek/zâž½±€ÆÒºâäXi¹Ÿ/òK°\º_{{1%;ð$îÅî-›7Áÿ['\ëý"ýÏëÐâÉIÉþ_$9¯(9_x’èåßÖñݘà]š',¸¹+…K—W +×9· yâøé„qÛÊ#rªŠ¶™%lD"RÄN³¢#ä u»4àõÁu‚ HÝ¥<¶Š÷>Å»€-¸ëÐú qºDWg÷±«“$ô¡ $§þ+ÚÏN¬”Wލs ½Ž·_ºŒ·ß´aO|eТË_³}·ÕûX6ˆ%ÖփzÙü;Á~}¿Ì¾îzý!þ1{¿ÃΡ9ü[|ýþÿƒ½°!‹=ü»_Ù<[Ñ[À³ºO¸®µÛ°í–PÀWó¿§ ¥ârq µa#Ç''á-WÙÞRq¿íviŸ ’›üÜã÷ +ÓðE¦QòqæíWòyÀM+ÿÕv‡¡o¹vüî{"qk å»ÈV^žms5?ÉßT^FÉòç(¿òçsQ/ëuyÉBùâËwgë¼mtDKù®®53Qo½7.uÅ¢"ڀ“LM\óªbë#2LMdȇs¼RǛ ØáiµÒi¬È߇ؤ!£ŠŽÐ[‰ÐÐI}/ÙÀ'ÂRH +JÉ/1Ž¨\'ÇäzÙîH&š͉–„ÝááÜ˹8'Ç8l‰¸Ð #¥6¢ã”£QGmövk>UDz$Áµêh’‚†)Iµ@KF=Ն{oPÙõ€«•Òþ˜J ”c11/”ê:0IT"ó@$7­Q’ôk€bóC?[Lô¤ÛÜ@‚”«óK*äS=ŒÏª§£êÓÄÍ [C”TЭovx+o“ øººxëȅ‚ð9;A“LhqøA7o»lwNüÉÓßÝP7ì 7ú ±m|p|¨EjêýÊ÷.¥ÂM½Û/\$üh峟}û‰.õ='>Â<åãoôï9õÒï4I[¹½8ÿÒ́¸Ô€ÕEÙ¾%ëŽýœÍü¬è’ åºOp +ëòq‡lg} äÄáŸê,Ïq>þÖE¨†ˆ†à\Õë¹S”ý 伪½ÖÅIÄ•œF +‘›º|ñ˜¿FŽ¡(z߬dœïb?_*òËÖ/áx‡z_{ÛØ¿·ü›uÂÆ4iEYP7YÅI[§^˜ÕRÐM¾•X$+}ƒR¬¬üÓÏú$·K²?x¸/T+†ÃbmÈÞ±Ç! ¾ žø%x✥îΓL*£óÍ5B£=î–eÿ@œñ0ðڝ@nÔ^úpsº¸¹bìØ(ÏÃÑú³Þ*7tn÷½â=›<Ût¶ù­¦·š¯rWZØÑìâzZìÍZK,åOƚ4Îï¡ #}"ƒ_ˆ¥ ½ÉÕÔ"†ŸMYtÕ¹z¿ê[æ^B,òਤWXÖÍE +øßW(&tA½ë/Â@ã“5ä›ð 6ý=ä(jÅ?X=¨üýezN€›‹Å4¸|‰/âªgõ,¤+8m´¾A •D@ ë¨Vtª÷ëXlR=t§OW ÇÇSÙnÕª½Á@@íjèÞJº:!‹NGµ@W˚ã?|Wkp×¾ww%­´’vµ»zìZ¯•%Y’eËÆØ ‚DE8!úÙWÏ0HYüwÝì®·¨õ‚ ›¨N§–÷Á›‹#á,>ß/(eÆbû×îøFΚ®ƒýFFÓ#ˆ ”Ø“Ô°Ãá'òRÇk0{  3\ŠŒ>+¬¬j¢Ð©°¥3Ø1=âcn[„ªI5ˆŽás‚Lð3÷wÕo=síýÕ+fêQà^ÛûÒÑë×m`*î'˜d6åځ }'¾®ŽLÑ\¢"þò£·_xïÁã¢Ê°¡'EÈ® +|RŒ*p¯n-ÉáÉ!©_óGò7Ê_ÒíÕL-;ƒidg3-¬1 Þù Žï¡Â^<9œÍŸÖ-p‡o‡Y[¾ù Ã0¬ÌÈl”‰² iºÔ(µJˤ5R—Ô”úÂg¹³âU›Äak +£ +F´¶àBm¶&¶*µ²b_h0ñ™õ’å²UlaA\‡”ä€Óïò¹Ác ¡°Íá¢\‘¢Ê“@SqSiÂà6ÚmáJ葞¾²zš6eñݨ— %õf›çoÆz”ÁDE‚I¢þ„&¡0#+µ£?T_aÇv¥rOÅën[‡t!¤Ñô(XÑ`%RëaReB¯d +í$ƒ# ¼ƒyÚhµq6ʘd:J¡,~Ww¢¨4ø¬ o`–ÒVdMž²×ÆYêk½Èæ9Eõ1Í"†/¦Ä‘ïø‘’ ¥€oˆŸœPÄÂ/¡¿qÇTÞ*h"ý2¹ÞSý¹dåN¹%ÉMqÔEúŸLT|½^µ„ýÛÅÒfÎlâZ$ 2›Ìœ©•BÀ¨à™!¦Œ4/ÀÆXÍ¿Cºq€¦Á>(º3ˆvÓ¸n§_¤iZ•à×xüóÃÂåt))µiÔ3¬B›»§ ÀsöòRxvO! >ãñRܶËÔ"œ”]¹“¹“0¯("“ÏUºí¢GŹŽ"ðýn˜(ÑÆü3‡î@1TƒÕì5mô–ÓQS$P˾qÞPFè̺֧Y8¾Á™Íßԓ|è<ùKÉÅÀEíjäJ‰)ì,q};Øi*™LGZJ–ñ˔¥‘ç+x“¯ôU’iˆ àDm‡-n´ôá)NŽ{eÙçՂ¬GËgZYdƒîüÚodU Až%Pê$½ +£¶àBYØ_ µ£6¯ìï.ˆµ››Ä}¹%³?i|±PüFȽìƒÇ˜ »àéӞŒ º4OcÄLùâ<Ð¥ +y«rÇ?éÓ³¤IFÉìlð(ӆx'¤œ=MÊVh"æû¿øáΝn½sÔouõý„<sR™e薲=ü©çþÏV}Аíä|\⋽ƒcCÀÕ÷`—I·::núÁë'Þ«Kº$·›+]ä+o#rücï«¿8y)ˆø=AXW e–ýzD·/²µÛ^¶ï-é´wÙϼSp³€õÒ.ÆÞÇqSVL”€’h=GZ1¤m=@×ý)wV¾FDZ£¡‚àU©¸ÈG24‹Bâ~­ +ê0¤yDwÄE]Ü,^­¢T¾ýAðú4w4nžÂ–Daa<¡E9Öä½8Z‡ƒe4Î̯Y‘–L~­*Åãpy¼¤¼¼´D«j4²FóóÑqWVŠciF•†|ՉzV5RKz ˜èížÝüÜõ±—8ÃQäãïa÷c?“þOøÕ/IظñŒÿ¦[žU†²ÌÝ.·¿ uyφäü²"#²MR€Ÿ +˜–DžDJá'‹9>rVµ+‚™~ž­Xn£ œÊ¨“Ö5s,õ_óÉhñ¢Ž•m¯´¬R$Iû.«^ÞÞÒß°‹b̐ÆjÃÙ(.knúÞÂô?'ýkY¹«Hݑ~01aF%äÞ_!5xln‚ì=¦I¥’.-–ÖHÛ¤ïHT¶ƒ[. Kڙå6›f÷¤#"ʱ–wa8|.@:ì,.‚Õèï!jCœV«M +@ržÙcB§T.mœRmý—Ï€n:ç=Äpyö ¦…&6|i˜‡?wڇ?%˜÷EPö+6÷G=óðói¤BY3ÿ"údÒ¹hÕËÚÄ­âË"‚…}9f<¢úrLtÞ'q»5@NÕÍq ¹^ÎÂIÒôÕã…?aՏ]ñ¡G×û9^ïD©Ÿvh­"Zk/bh +ÆôZW¥«Ê9ÛUíªuÍqé®FWÃçÚ+ìgä®Bk¨pi j l£¶lTi ‰j +,¥l ºrŽá¾¡jPª«®žS§UŠ.<Ty°ˆ¿Îßå?ã­Ïñ:oáSNžw951¢Æ&4NƒZ*¨iJP‹T$ÌÉ$—„ÉT<™LĵŠ”Ž'× 5‚ÆT}c£^¯ÅÉ`nqQ~N€T¬R¯!Rd,dñ‡ÆBUVTD""ëpª^®”'<íèy˜›Tórñ8·=æ>¬#âj}n<‰ºÞº:KÔ;å›Ö㠇‚ÚÉ: ìt“ÖõµÃîLÇÉÏ&ãî'ŽZ·<Îü$2¿Ç0ÿLd( æG}k·Ú²"Qkžl¤Äzo‹)Àg÷c* ,pµ˜ ˆ ­­r ,ÁŽJXы¿þ×m›µlilA+ ð +üudyÇ+éBwc 5[Ä(ñ©s +(aƒ$S Ï$Ë̞ëÏë74´…ª¶V¯¬hnÆJ}í«Éâ¯5¤ŒÇ…%E…sé?à‹ùKÛÒ­M©TSÍüé³XÍ𘾤i]ú†ñ|¨qYNt­9˜ +HåÊ—!•W}zå-ò /‘—hx‚î"»h˪‚k¨µôZÙòšü ¿¥tƒ3ÐP^P ¬‘_Í$*"S’(ú$ŸYƒÜYf rgŠu:³XÍmÖ Žˆp8£9ÊSf!*­©"Áp—PQ’²R¨&ñ¼›eXÕ?$ —#Î(G¨I¸M!.S‰Lq¦GP¢ø_*ÏÿW‡9`£)š¤!°!ÁÉtŽY‹bF-š[ׯúØ&Î;|ïs¶ïlŸïîõù3¾;;‰“æà $Äé™ø)kÕ]VRHéPéšÐ* ƒM6ÖIãcPV í†(S骕ŒP jÆ`0Æøк…­‰U…‚(C*YaŠ¶J«íýÞ³C-ӒÜÏ÷Þ½Îïóüžçù©¾zñ­0.ЫŒ®nPÜiÅ ø9vÜÉ¢ÏÙÑcó7w=9'µÀâÃe"s³~ðÜ£+û'»Q‘+kºÚ«¢Ê~2áF]«fþ0{ë.‚€m)' á)?zÐLIŠMÁ~…9ƒÎðïÑï—|`g—Ú{Dz ½ÄÖãèázÝϊKä§ýŸÎº“áv—N‘~‚ëÓã·>M·¯i…¼T=õ$˜Õ0½Î H:kÂ6ք=}ìQv„ý½É–°ÃèʁHÐxÎkÍv÷‹…¨AtÇ +…üíP¨@(Äù±ƒ^ìÁþCù+”œ¿rÀ£ùN´µÉ+ØÎ`RÄáü¿LYˆfx ÅÁA±“Ïo˜¥Ÿ±c^‚—P,ú[1)20Ùq”à†ã\^ø&šÔ4ª&ê0ù§ ajbžš<•¦s£ÇOäþ¤ǑÜyy×®ËäBƒÇr7‘xôs7÷³‹—v¾úá%À¦r>éÞrjÍL'´$àjª‹:én÷S0a—º—£U÷-«ãÏã.Ø/8ÿ–¸Ðpýˆs™f•}³`X%bµl0Y FJcJÁ¥xéô–4#–,ºrW%Ã1€©ž¤ÎsU:Úf³SªQÎVè‚9BSk(Jç”.*í+µ•§<±y"ô“M“Ø?M[ÿ‹òþ½»ñ®A`¥«þ ^ ¨W»Ü"¨7ä?x+¿¹…8¦Ðed ÷l©IРûX±ú¯ßÌe\ÞôŽÕRÖ¸Öo\ô‘ü%&ÝԎn™ëq&2ƒ–¡º¨žöm ùç©wä3måóÊùÖ÷Û>–¯6^oûLkü´MâeV)iu¶©²Oñµ†Û6Æ^nüÀ?&?žêIõ+Sß36¤6¯ãý˜Ûl ©ô\GuU¼¢Áœžn Ýçj¡§ÔÇmuӏ‹á(F Ó§ë¢>“FM­Õ £WÌHÅ4]§ {g‹>'º(Úe¢¡Y _‰U>Ý$Šª€vš]}U¨*øÀL;ÃVp:ÿÄ÷ =G&² "ðÎCÕ£ÞìU«ù²ÙQŠ`Ü %+¶$I÷À·#œßÂ\j±Ì-ÕÜ&i‘r¹ÜßêS)#Ü¢¢f ŠÔK%P) uúý¥i𽐑N©ÓT +Ï­ØEL¸PPA-?Gÿ ¹Èáüß)þ՞¿±¿7ƒäˆ)éHj¢»ûad³’X +ôØ ÕÀPRD^¬ ´9nÇ Àí˜2òàdȦ·‰ aR&É18A£E¶q¶%¬|æ£#¿&0K^65¶Â;" M‰Š² +‹…S˜ÕdÐ ÈÀ)65oÝ Ƭúµƒí_[ôçS§Ö8|n"RÐßÞ·{×Üy¹Së9·m/S] +L}1R‚éDª¥º)]ä@|õƒKßXÞPôW@__ZŸYÙޑLjÏ¤Ÿ]C&”­à̆m+UC1ËþFîp(Lï憸ãÜ»ÜU®ä[žµž—=¿ðœäÏó¬ßìDAlh™ésØlvG y±Ó' +^QÂ%AWÕ0zÍ£FY™Ý@ˆb]zÇëmÃè—&®©q8µ +ý$ñF´È7"G#%à¨%Cè*ˆ¤­«TAÁa¶´FÉbÐ]‚ ,ò„Âχœ*Ņ]*EÂp n4Þá¢%ºÍ…£¶N~¼Ý§!€hxÚâԊþΓÍØí ¸µ÷oۻà +Ê f1iîì_Zò(j€týË"&‰&§(MÆX–±,!Š#^ –öcpN6nàaÔkò2m$Ō8(2â!ÔKÉÈiºM ÕK}Ò.é¬d“Ž A`T9ÒÁëŸVŒu÷_ëõŽ)Ò£¤·È_&L®+©«^÷Ýëêä#@9n³àVwH1i}×òî×dMt°¡žÄ£n=ŽŠÐ›1Ž¦Þý„Þ·9÷ÆW ²È u#j,Gu›¬i5T;7AØüK…i"PÄ:•ÏÛ^¬+™s_¥’ð¯eÞT^÷Ó¿Vúí¥×(?V•ß*—”œâØEïû/ãUÅq…ßìÏííýíÞþÜîžíóÞÞÚ·¾ßù8 [v𶍥U Ń¹(?NH„µªÕ4ÅRA•Rhƒ+¨”–¶4IEՒ@Š\‰ÔRhPKAj*ᤆ¤ +V‘J¢4ôLß®€¤BÝÑΛy;3»Úyï›ï£Þ¤è TuFWª‰qÔ¬ÖÆ´©+™•ê:fÒ«ö½Îv²“éWwh;ŒÎS̐z(ñCíêó’zD{•:͌ªÇµ×Œ×œs‰?ho%.jÿHLiùp¢&‘§ò‰¼¶ÇØãü*q:1ÁN(K¼GÞÓ>¢n%>ÒâŽÎÇýøšõã Œ_؈Ê~¼ˆbAEY±¢ŠšÎz®E6Û´]›¾áµŽØlzÀ¶)Ñ^eS¶}رí¬c¥ˆ¼ Mð»ùý<-ðõ|7Oÿ“'¿áÇù+žƒðüa–ç¬a3éÇm]]Á¨«K–iè#TB3Go?ä–T†6–aLUQð8s0,u#Ö ES×°j"´©&pD‚'“(í¾Šñ6‰›£’I7Ã@!tÊv¤“¦Ü tDÒ¦F»t¢Ÿ5È(ù®ÛÏn±Õp|Ùp²XÕ¥°2’X ñ²Ñánrˆsš¼ˆZE#ϺZb-嶴—)o卣\1^¦Fɋn”57©D=«0Ï)ø›÷J±Õ3'ÚÚË~7?ÛÅ×øWð-Î÷-.æYWJheÖU[w³ûY +Øn–bϐw é®œú°RY8û§§ qª’«^§ª_3Äj%©OÏ>¼yÍ{z—ÅKòÙðÍNqÊkT§½ >-¾ŽV¿ÓðìlVæóú}ò°P©T?íû´s!?ï(ÜW dÄ;¤ˆ<™æh:KÏÃò\¦ÊòYþ„ÞÛ?6Úÿë&/]ßõª#'¶Žî,U“¬¿æg‡PµÕ)rWo§”êuêGwçñªÏC˜Ç% ™Ïè Kº•¦µVÒÚ-ùßV˜—?/?dõ“þø»6ã×à'Vl¸]Áw‘JR¼$ÏBx*-,`w•N‘Ôa+…r´ÆÊä[pÈÉæ¢O”57\jnn)Yù’ÌS~z²ìa²±xIÅÏ­¨­ kš"[I¹”³=ïÙl!“ÍÚ+—±äRÉÌXJ&cÅ%É¢€$)á)N ˜b%ÞCúš¥#™D¤§<¤·;r-ù|.©U)j 5™ºáÑôò*–+²&;ÀN²7Øk,ɝòCÿ/b˜ ¢à\P\wa½O£´ö=Áæ<;ZhîXÿ/þÏwÅOŽæ‚bg°“, +é9ü¿B„ÜS<#îÑfiêñ™o©dTM\ó"l¬#_ò©ÁÕú¤¨4W¯Û§nµþ‘Áa¤IQ•÷C­›zy6Ì¢ îÖï}™&ËFYKõÓ_`Yh‚scà`Ò#ów0^NDߺ‹ÃRïζÌLýÇ&Šj 9jÓêìÎØÎF.fêõ‹êÿ{£ñìUàØQªú +!‘QšsyX‚°¦Â£”ìZéÙ£þeyiHχûbËÄE.r=[Շ(Ôe?sÅ|¢/µ, }‘HØÈ}0„Dn«·—7ý=¼9íQ:±RņÏéªS—ÎêU„ï¯>Yñ4I—=–«¡øH·ÂR¾ÔÅ⓮ò<æä(y˜ ËR„›áÉæbmeÅ$&‰ÅÃÁ=mß+Õ=ó ê§5H˜‹n%Q—ÙéҚΖ(Ãñ\¨ùkC6¦ŠÏbñS˜¹½¨t-ÔŽx{Òt»üe²FØJ¶›EŸ0ʎ™°ËìH¤Ê‚°ûd½‚X¶Ýˆ]ÞÜzTÒ’ös”N’“™.ò.&ÿd_¦l¹‡ï oå·F˜L]JKl‚L]¸§)­ª—IׅMç­XcºP7õ¢¾Jߤèô#ú}Réz*–¦éE)3. p±Xãm=ü==_¨ "A^‚ºu 6§©r¡Ë×!Õ)lÇÛ阈œº³ù<îC%Ï6R~<—|u¡ŠlÜïIªøߑÏY­rin3TŠ»°þc·®ÙLZs«G.ÎL)f.×s᭗íYžD;1tfx±V›ýú̹2þü¾3ÿ:uy¦Jf¦–/'»®¼ðü¥á㈚ýÈt·!j6>we7×Íw‡ºÃŒ+ºqWr¦‹ëâ»B]a¦(ãE©¨0®ÀB…0#p‹áz®ž¯›¢7%S A4V“nð1És¦™LXéÀ,ì¡Üc +„aø\Øs‰EÞå)~c„çË3k}Q“*Ô¤Rµ5–©øP+vIÝ%m$I,E5}~}¨ÜÚð­#0MF¨NrÇıìÆõ½7­Á•î”c8o¶œš+Þjó¥o®ü‡¬Æ¯ø&ì'»ü¯ö 9Mºð=~ë¸Ò8ˆ÷8ÿe½Üƒ«ª®0¾Ö¹ i ¤!DÒ  $\Áˆ”Jkr­`‹TD åph-A‰dìXƒ01 +-CIÐ OK•«Ž¼ ´„‰ Òœ–Øê` /iUŠ·¿µï=—K þèùf}û±öÚk}{í2D~+iPóäfó”œÖ2ÏŲ]Æ2³ +ڙN%Hº,œgþ'õ²æÒÏKh^Œå;I©7NRåër Ké+9˜a½(JÆ:ìÒc†´Àݬ»´Pc½ Œ¹Ë4ÉY/¹,ÏÓû Œ—Ïê¥ê3:^‹c+nëRNŸV»‚yš<iñ³ÚÉjÞ/3z¥“JzöåìfR‚ÕŠhgbý,cELÆbE´pRÁ 'c¯íš-µòžÌ‹´h:Ï©âi¹/v—W±Õ*©örÌA½/ÇîQñ/-ç¯ÕvW[Ïm_ÞtÿtÉ¬wž€§Ãä-fé1¿5Ú½¿Æªð™õÚÍ?OŸÐ'ä |Ãlä[ηRÔRåq)ÅwKå»Øyw‚ì¡Å6Ã"ÿ–þ‘ãò©‹ÔDZÉEé$¬a1úkô˜†ß4 C1#äHˆ¿Å2•U[¢»e¢vûu‚,‘­^W$÷Koð ½o”ùÒWÐj)­OöÀÛdpä+6‡¥Œ\K„’¯èd:ÉÇ«{¡À|Ù¤‡ñíÕÚ]6ÈZ-ÓXݝÉZm“}°ÆBâïòCž?•/å/²^ÈkrXÖ²Ê ù»Wþ#hõ_ˆœœ¥Þaìeòžƒßót-Hèw¡ëÓzŒ÷G«ù÷¥¼æ}O«ôQí«õ \ò*mÖ¤Y7 zRÿ¤Ó`¶ÏØ?Çé·5I;i?Y©çå´7RéMÑ~šÆÊ^‰¿F/à©Ðõ$„a}RÄ·:ªâ{¹®Jg¹ÉÕì†vUcy‹-»’]›`ÊO¤ù„Z«‰€&ÆÓÑï5º@›Ðüm¤~ë0 ^úÏÿ‡ Ýë4YM« ¢­×ϝžŽ,xŽÍOé/âsõ¿ÅæzM¹Zǘ8˜ÜµM¼l}u‰Ù'VjOÖ7¡ôm‹÷žpå6âÝþ'ÉÏ]¹E·¸ï_áÕö~]íb>n.›ä÷>/ë¤&A¼›YmüB~*£°ÇI|#؀%¦È­Ò‘uhM¬ÆþÚ(uR§ÿЋz‘ø.Õíú™žÒ<¯«½IÜ “<ý/§ôœþŽb…ÕŒõ>yûrDgè,4<"õè—ãiro¯åEøc‘Noƒz}QÿzÅÚq+˜§˜sœ?ˆŽErAþ¬Ÿ³^ïòÉøÞD‡UZ« úŽîƒà¹;u‘‘¥?ÖïÊåk¿F÷èot¿î‚‘8°@âûÜGm$¾Þ¨$îדXÉö w¸Qi½s$J±Ë;¢b:Øm´Ñš!¸~΀Gç8)Sio2Ͼ nµýî>t¦/ü¡Jѐ—ïån(sQdžè{c«(ºÑ²Íhk' +¯+5ÈK ږ´ŽÜv"øšˆm¯´ˆö¥#°ËgÍX”_SúlÚNg‡6JŸ-Ú+ãö„UÈ:/¸gJäP|]ے®DiŒMcëe"+'Ga;§‰"v•}º–ž‰¿%ë9/¦Ù§3õ°Î¯Ë Ç +çt_ëUð­“oqÖ °Ó×ÉŸç…þË-ôÒ½ltX*_hŠËEj\®Ò<(Cöѱ,:“¿ùN¬F˜üؾTÊv"õi†­ä<ҝh:岻ݰ`w¾Zf"º2i·Õev äN+`V˗CDÙ=Ô²LyÃI²‘|n…äs¦9#q¢HÉè“D¼vɌEäêÀxèçœ6²Ïë¤ +_‰¶µÉh`Ùfkî‰rÌ®«2PŸüì> ¢9í"9ã4ö{±ˆ^Å?Æ-%œáú» lOvž{Øíð%òKPÂò2udzM—=䒖!ïæT™†åºÇ¬W@‡Ùe–ËL‡0jæ¾åœe8†vv|‹õ°3á0ÞÎr2«’×ñ°mH˜Qç1ªÍ`§üŒÌ®ÒýIŽajüéUN“éàIÍ×þ _þÆn¨äFœÚô²—ê¥rÞêNse®7„¥ž{ˆ}ªÞöW£Ö!„§ê`}H'é]:”÷§?ììv/±S¨!Z7Q#7p³ë+ÚÙ+½Ù\­ ùü.=îÆìm½¹–œm7–Ìý4íBºI{é~O¯=ƒôždíðª&zŒîo3tG,€úñv§ŽÖ<í¡wk€•8† +ÙîŠÎA6+Èrù&{µ­uë° åDPÅ®l+õ•ÙØz''‘ýX;LÆ~†•îüSÂý |'È{q¾’¼ünǟivâ‚oc_±òY"2‡…Ô“Õ5éE~?T~B» fj­+èsVy)^Š(ÒïDyÜEn®|‹­v;Wòþ4LM$¾í· ÞílëW™´Ä÷»>œ'Jc°Yr Y¸E}ì|®…³;Øø&~DՐãó:<Î/½„tIüA¼Œ[ÿ7 Ç"D—odÛmÆV`7™²b€•®g^\Ù<ý*«†m·ô•æé—æZœèºCxi#b—%t?VáQqCüHÜȼä²ÏÀmÆOÂúºqÞǨ>£K¨hïy +à,åÃs‚b'¾Œ½ÍC$4%ý¼;¿F:N+x•¯ ö́™ ?R„7ÁAx°ô:⁋©cƒhuLüü ±ñ’ŠŸ^þ!rÚ/þ(þ†5Š(}ƒÞDêš”Ð]7á ø1²i–áÈqÖoðuúÕÔS9ýSß¼êûFÂ.àäIØÚEñSqHœß4Ja'GR¾× üLŒŠWÄ+†H%ñ"ÝŠ¯ñ;ö¬8K·|ÐNÇ¿ÿ^sÂZ!|çgޝ%¸‘ŽTNÍxï|6ۊóôÄx%ˆ–æ`?î@ߛ0ÓÙx¡ÕC*n'}Ž®ÁbòaåO‰Óèÿ+¢A|6¼~ýóԄwU;Ÿ×ˆÎ»($æOþ'ìãؽß!"þ"Úޘ|•Þ@Éìàk¸õ?†ÓV õ0Nx1­Ä øiÌþ<Þ êÝZ¢Ò\`œïŽúÉsO>Îþ:ý¥}nÔXÂgáE:<919Ée‹07ÅÚɁYáÏÏd<ºm鰒­·½9”gNï]Ö^gú\3Ӗ-É­´eƒ +s7Ù²„ÞgË9÷Ùr.ä㶌ùä^¦gȤZª¡T©“úÈßH + ¤(kš‹AVÔ}k,G‰‡BH&u@·íçœn¡ö.Ð×,@jA®Z‹vCÓν‡1nzœ è}} ýFÐgüý£(‹eÆ13³¯¡:H‹3¹zªâ9øÐCuMŒëÃ8ª?õÛu×!×­*Àã™RëäÿÝv>½¼&­A¾%Jë㕸ùSýDì?5y””úùU®}ïFÛkP+À+gBŸÞVÌI­NÛ…ymWs{‹kX´cª•05í¥ëš¬C£Ö/šÙÁ·þC•'0‹ ZƱ +Mö<ƒö\ÚnúÏNÙB€ÇV³ïçÿì}'vôŒY[³¢Þìì³Ì‘p$1µÌ¦H,‰ùÁHx¹é …ÌŽàö¾DÜì°âVl—Xn´X=1k·ÙµÂªÍß`d a†"ۃ~Ó‰ÆTSu_Sg.V¬¾Êìð…¢}f‹/ìøû¡]é ›-¸©³/7CSûéÄÌ5ÁžPÐï ™öˆ¨Á f<2ó[`½‰Ý¾˜e„VÌL¨ÿhí47ýV8n­6ã–eZ;z¬@À +˜¡”Ö Xq,U?Èc¬„/Š/oòn^ßä]ڄ®ƒV¬ÍÚíÝ´±ó¿P¦rf[jš>3ó¬¾X¿é½ý¿Ï®`C»ƒÿwà¥Í´žùÒ,çr ^ڄ™uò~oGiˆÿáí·{oj¾Nl‚:'OÉSÉÍu'Àîe6^XV»Wñ™̓ùunOµ—,sbècã%eµ×=óä8M†<(÷ÑBôýÍ»m> ¾üq›û’«O>ò‚®ƒNþm4¹¶½ö»,Ô»XIkFÆ¡qzJä(f5ŠYbV£˜ÕuP^G ~ú֏à®VÚ]ÙÂhÒ1×Ö@ð̐]r N²S>hó­rK²ÖyÒ³MnF×G™ŽÉNÐa¦ÝLۙqéË–#,»YvÛ²¢ÕS¨“©CQÙ!7Q%4‘ë˜{åý´¼yÅÛd+ór-ó Ðß ¾õŠÀ×É8ߊ|3x òŠ¯•$›5ž(òÝ(30žÒ7c͘S3Ii†1à2kºA‡€ €äšB6#5!y¤-ÑG#JIÊF$7Rƒl@É}¨{h£tñ?ºP˅‘\X+zva{\ØåI¨)WR ÐxmÀ4ôS…vU˜WF¨’˨ }-4öS1¸is§±€/0ö%8=ùÆ1òۀ(°×8–œVä𣞪[ ´ÝÀð4p˜NîTIãLÃm¸e»Ñ.s`ݕã.W-óºU)þ¡ù)>k^­Ã“•X¦JzZªøØZ ¸39'`ÀtÊé$p¸ ¨/Çb”c1Êñƒåh_εr¹Þu`0¢rôsiÜÚ TOéEi+ ©@®m*P·ÚË ‚[¨r/0 œ´ËJ٘KÙ8KÑW)f[ êfÉꔥI#ßqë+îuxÜX÷v…Ƭæ¬ÛåJ uˆL«my?¤ý”n1 ýãÕóÛF…gÖ&»u3Å1QjՊ½Û¥M›I¹I¥]¯×µä•4î’Uk§²RN ÖîÁ‡@•@%m/ qâZ!¬Î¦­Ër„ .9À¿ÀKxoÖ%I¡Î·óÞÌ{Ÿß[ï¼í@I §S€S€ã `ESEXÍ{€»€;€ À€Û°:ãøc®\-¿_þ¨|·üMùAùqYýQišJÓʐ‰ 8ÈäÆ´c•¬’&aô)ûR~(¥%åQëXÀþ Øoû:`_Ì Ø»°WÓUë(gpv³w8;ËY™³×9;ÍYeŒúô2|Xü"¥-å)K9I/o2rè'ºB Þ:õ½ñqé/#NÓÍÒ§F¬ú$™­$j?”^3ÖJ3‰åd¢^6~NCò6ýŽ¨”[3êïêUÕRÏ©¯¨³ê)uJ5Ւ:®å´¬vDÕ2š¦hiMш6ïl[Nd|$‹j$2-ÇY%ž#áì§PMñRÊUÜ%›ºâ×kÄ]ÕÅßKfL3o½+^0m*r.q—í¼˜ãn¬î\ó܇Þ\ñ"Jïø0Êg1%Ë^LwÐt« rUo@(¹µQjßÇßxQšnlødâƅü…Üù±sDs(ùnË󽸓Iñ•»ä‰o'}q;“¾ OnI¼2¯œ­9e•ï 2ëÊ|íÚ3뎿Ë#:؝1PIёGô§xEey'P%¼¢ä÷ñ¢E£æD†ñ„³(9‹û9kû9k’³6䤎±‡£nCr uûNñ98'äìyšm›ÿO£Ò [QµWk›µ¦YkCoŠÛ7®çÅúª®H•n¡K©“ÍÕk×Q·Ú1Ý2ێ¨šŽ5zÏúEÝ Ó‰H¯¶ìE=«íl6¬FÍl9þÃzkº¿/ÝçOÒEÓ­‚µ0Ø4æª÷p÷Ñ]Ç\}ÌÕÇ\u«.sɪ‡²ÔˆíWƒD?Tg €›÷'²œ—Õ¼`äo¥ ½Os_Œš¶`ÐÑ5[™­  Þ2tó‹CWþæ‚QxDï]Y0™6É×Þsà +Ãáà9¯[çJxEjy….t\(øä ;þCeTîÊ%؟¹3㎌»v* ý‘«v Æë Ø ÿߨ ‘i¸· HøtÃÚà$é.ìR`!±;,œ‚¼ÉÄö¯³v7 +endstream endobj 98 0 obj <> endobj 97 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon.ai) +%%CreationDate: 6/22/2019 2:45 AM +%%Canvassize: 16383 +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 2 +%AI9_OpenToView: -497 224 1 1518 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 67 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 115 0 obj <>stream +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 7069 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C457DFD6DFF52A8F87DFD6BFF52F8FFF8F8A8FD69FF7DF827FFF8F8F8 +%A8FD67FF7DF8F8F8FFFD04F8FD66FFA8F8F8F827FFFD05F8FD64FFA8FD05 +%F8FFFD05F827FD63FFFD05F827FFFD06F827FD61FFFD07F8FFFD07F852FD +%5FFF27FD06F827FFFD08F87DFD5DFF52FD07F827FFFD09F87DFD5BFF52FD +%08F827FFFD0AF8A8FD59FF7DFD0AF8FFFD0AF827FD58FFA8FD0AF827FFFD +%0BF827FD56FFA8FD0CF8FFFD0CF852FD55FF27FD0BF827FFFD0DF852FD53 +%FF27FD0DF8FFFD0EF87DFD51FF52FD0DF827FFFD0FF87DFD4FFF52FD0EF8 +%27FFFD10F8A8FD4DFF7DFD0FF827FFFD11F8A8FD4BFF7DFD11F8FFFD12F8 +%FD4AFFA8FD11F827FFFD12F827FD49FFFD13F8FFFD13F827FD47FF27FD12 +%F827FFFD14F852FD45FF27FD14F8FFFD15F87DFD43FF52FD14F827FFFD16 +%F87DFD41FF52FD15F827FFFD17F8A8FD3FFF7DFD16F827FFFD18F8A8FD3D +%FF7DFD18F8FFFD18F827FD3CFFA827FD17F827FFFD19F827FD3AFFA827FD +%19F8FFFD1AF852FD39FF27FD19F827FFFD1BF852FD37FF52FD1BF8FFFD1C +%F87DFD36FF27FD1AF827FFFD1DF8A8FD35FF27FD1AF827FFFD1EF8A8FD34 +%FF27FD1AF827FFFD1FF8FD34FF52FD1BF8FFFD1FF827FD33FF27FD1AF827 +%FFFD20F827FD2DFFA8FD04FF52FD1BF8FFFD21F852FD2BFF52FD05FF27FD +%1AF827FFFD22F852FD29FF27F8FD05FF27FD1BF8FFFD23F87DFD27FF52F8 +%27FD05FF27FD1AF827FFFD24F87DFD25FF52F8F827FD05FF27FD1AF827FF +%FD25F8A8FD23FF7DF8F8F827FD05FF27FD1AF827FFFD26F8A8FD21FF7DFD +%04F827A8FD04FF52FD1BF8FFFD26F827FD20FFA827FD04F827FD05FF27FD +%1AF827FFFD27F852FD1EFFA827FD05F827FD05FF52FD1BF8FFFD28F852FD +%1DFF27FD06F827FD05FF27FD1AF827FFFD29F87DFD1BFF52FD07F827FD05 +%FF27FD1BF8FFFD2AF8A8FD19FF7DFD08F827FD05FF27FD1AF827FFFD2BF8 +%A8FD17FF7DFD09F827FD05FF27FD1AF827FFFD2CF8FD16FFA8FD0AF827FD +%05FF27FD1AF827FFFD2DF8FD14FFA8FD0BF827A8FD04FF52FD1BF8FFFD2D +%F827FD13FFFD0CF827FD05FF27FD1AF827FFFD2EF827FD11FF27FD0CF827 +%FD05FF52FD1BF8FFFD2FF852FD0FFF27FD0DF827FD05FF27FD1AF827FFFD +%30F852FD0DFF52FD0EF827FD05FF27FD1BF8FFFD14F827FD1CF87DFD0BFF +%52FD0FF827FD05FF27FD1AF827FFFD15F87D27FD1BF8A8FD09FFA8FD10F8 +%27FD05FF27FD1AF827FFFD15F87DFFFD1BF827A8FD08FFA8FD10F827FD05 +%FF27FD1AF827FFFD15F87DFFA8FD1BF827A8FD07FFA8FD10F827A8FD04FF +%52FD1BF8FFFD15F87DFFFF7DFD1BF852FD08FFFD10F827FD05FF27FD1AF8 +%27FFFD15F87DFFFFFF52FD1BF852FD06FFA8FD10F827FD05FF52FD1BF8FF +%FD15F87DFD04FF52FD1BF87DFD06FFFD10F827FD05FF27FD1AF827FFFD15 +%F87DFD05FF27FD1BF87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87D +%FD06FF27FD1AF852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD06 +%FFA827FD19F87DFD04FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD07 +%FFA8FD19F852FD04FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD08FF +%7DFD18F87DFD04FFA8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD09FF7D +%FD17F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD0AFF52FD16 +%F87DFD04FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD0BFF27FD15F852 +%FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD0CFF27FD14F87DFD04 +%FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD0DFFFD14F852FD05FFFD10 +%F827FD05FF27FD1AF827FFFD15F87DFD0DFFA8FD13F87DFD04FFA8FD10F8 +%27FD05FF27FD1AF827FFFD15F87DFD0EFFA8FD12F852FD04FFA8FD10F827 +%FD05FF27FD1AF827FFFD15F87DFD0FFF7DFD11F87DFD04FFA8FD10F827A8 +%FD04FF52FD1BF8FFFD15F87DFD10FF7DFD10F852FD05FFFD10F827FD05FF +%27FD1AF827FFFD15F87DFD11FF52FD0FF87DFD04FFA8FD10F827FD05FF52 +%FD1BF8FFFD15F87DFD12FF52FD0EF852FD05FFFD10F827FD05FF27FD1AF8 +%27FFFD15F87DFD12FFA827FD0DF87DFD04FFA8FD10F827FD05FF27FD1BF8 +%FFFD15F87DFD13FFA827FD0CF852FD05FFFD10F827FD05FF27FD1AF827FF +%FD15F87DFD14FFA8FD0CF87DFD04FFA8FD10F827FD05FF27FD1AF827FFFD +%15F87DFD15FF7DFD0BF852FD04FFA8FD10F827FD05FF27FD1AF827FFFD15 +%F87DFD16FF7DFD0AF87DFD04FFA8FD10F827A8FD04FF52FD1BF8FFFD15F8 +%7DFD17FF52FD09F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD +%18FF27FD08F87DFD04FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD19FF +%27FD07F852FD05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD1AFFFD07 +%F87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD1BFFFD06F852FD +%05FFFD10F827FD05FF27FD1AF827FFFD15F87DFD1BFFA8FD05F87DFD04FF +%A8FD10F827FD05FF27FD1AF827FFFD15F87DFD1CFFA8FD04F852FD04FFA8 +%FD10F827FD05FF27FD1AF827FFFD15F87DFD1DFF7DF8F8F87DFD04FFA8FD +%10F827A8FD04FF52FD1BF8FFFD15F87DFD1EFF52F8F852FD05FFFD10F827 +%FD05FF27FD1AF827FFFD15F87DFD1FFF52F87DFD04FFA8FD10F827FD05FF +%52FD1BF8FFFD15F87DFD20FF2752FD05FFFD10F827FD05FF27FD1AF827FF +%FD15F87DFD20FFA87DFD04FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD +%27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF +%27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F8 +%7DFD26FFA8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD27FFFD10F827FD +%05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF52FD1BF8FFFD15 +%F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827 +%FD05FF27FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15 +%F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F8 +%27FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827A8FD04FF52FD1BF8 +%FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD +%10F827FD05FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827 +%FFFD15F87DFD26FFA8FD10F827FD05FF27FD1BF8FFFD15F87DFD27FFFD10 +%F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF8 +%27FFFD15F87DFD26FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FF +%A8FD10F827A8FD04FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD +%1AF827FFFD15F87DFD26FFA8FD10F827FD05FF52FD1BF8FFFD15F87DFD27 +%FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF27 +%FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26 +%FFA8FD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD05FF +%27FD1AF827FFFD15F87DFD26FFA8FD10F827A8FD04FF52FD1BF8FFFD15F8 +%7DFD27FFFD10F827FD05FF27FD1AF827FFFD15F87DFD26FFA8FD10F827FD +%05FF52FD1BF8FFFD15F87DFD27FFFD10F827FD05FF27FD1AF827FFFD15F8 +%7DFD26FFA8FD10F827FD05FF27FD1BF8FF +%%EndData + +endstream endobj 116 0 obj <>stream +%AI12_CompressedDataxœì½ër$Ǒ&úŸfýµ?ÆLZ[¢33"2#u֎Y.ÎJ"M¤ffwÎ Bƒ$vº^4ZZêeÎÜ;þ}îá™U…F_¨ÑîA6P^™™qñðËç÷¾úúó틻?^NºÍ³ÏþîïNï¯/îîµ!yóÅ˗oß<܃ô‹ßÿrӏ'®Ú~‘¿µ+ÿñúþÍÍÝí¯øÝIÀ·¸ÿ§?Üß¼y¸¹¼Ý\\¿’‹~¹ùÅ/ñí77/¯åû›«»Û“Ë›_z«RËÙåƒ|5>†çC×ϛáW1m¶¿å%—·º|óææ/×h*d¶´»{{ûâæöûÝÝÿúÕ&›Ïcž6 ßÿýÍï¯ßÆîd;©4Ɠ^FxÓ§ùdÎvGƒë?Ý\ÿùW›ßÝÝ^[mï¾Ö±±ëô_ûê÷o_^ßÿáö;’6kýöîÅõK¹£Vqñò’ÃÒ×íŠo.ï¿¿~)s÷òí'uöVd~sùã5&Å`|ùúúö›»ä£~çi3 qƒwêófNògf IéGo´¯ÿZÕ¨µ”úÇ ÷•Œå—÷7ßßÜþª<áôí¯ïo^Ôž†MÖø'¹ù.ÿÛÃÊ«?<\ߖîÉuúÛfªt'¿ý­žß¾8½{…QxÃv-íËüyy÷½}[?ð;©âíëgŸý˳ÏÂüü¾½{¸~#5¾¼ÞÌãóïï/ÿt-ó9??{·éC×\ñÇË7×Ï¿“Qº¹Uê‹?*MÙÍë77Òüó—ß}o¿äûçW7÷2E¾{yý¿ž¿¾¾øáîí›ËÛÏ¿¾º¼¿»}þ½¬Öýòú»‡ç_žË,IZ7Rÿ–.ýáÁ›ä¥åƒ~õÇ·B}x~}ûâòÍϯ_ñ׃,Äëç _\c}HeoVêÍw×Ï_Ü ƒN…Éýü¿¾µ.oüfóüÍëË+éŽ1>¿z{}{õ£|ŸÿñþNVà/e÷c~^®~u÷úG«óþÅwׯnnonåöix.ýsuùòöîáù?¾þáúöù½ ÅyµëÏ_]^ᱤ[ež¿ö-w¾}óüáÏwoÞJ§ÝÜÝ?øáþúÚ?]^½}¸~þê­Ì×ðœ´W2þ¬íêúÅÍ˗—R“,E¿CèÕ囫·/ùD9ãËÿùöò^îÁŸ?\¾üNÛ0â›M?Ï·œRÕV[Ü6£¹ÕþÝúÛoñÏ·çÏO힟óöçç¼Yj9on?÷û¾Ð«¾Ð&¾h®ù¯9øáùïØ Tó¥Þð¥Þðes×úL_ú}¯Þ¾|¸yýòÇç_¾y‰9ñ‡òBЛÿÐÜü¿ë¿ê—ßüpw/³÷V¦Ú›ç—ÚðeyŸËæîKmúÒ+¹dw\^?¿*Ýq­·_kí×õf©êÚï»Ñ«nôª›¦‰¿æZºãV¼ÓËïÊ3Ý57ÜÙ%~ߋ›?݀ ñVo}«-½]<Ï[¿çGýúñc!?ûì›så…é¾ýæl ïߒќß^ÝaÿÕæÛ康¡þËóÕÏW7('þæ¿=cíÂÓJݛoîß^óãë²é°áoåI¾’îàŠúÝk~—¿ýêå[ùò×÷wo_qûÝݳÏ~¡Ó?^_‰T$[Ջ͗üòAäžß]^ýðýõ_®o®~¸½þ·ÙIW +ݯ9èõ/ßQ±0ðûë~+÷ò£üþ¿ŸrÿÙõw"`Ô +”ú÷ÿO˜¢ð»ÛÏÿ›ð҇¿¼º{ñö¥|{~û§ë—w¯¯72[7ÿtyÿú)M|õòòöò~Ã/J m½›/ÀV.ÿõáæO›W—Ò¨\ô›Ù#¾º”þ}R ÂL^K¯ñ&^³lí± š¯žÔÔåÃ"ëÉ6ðÆkßbk“Q|{ûý^ñEôú§Tÿõ¯þx÷òæÍ+¯¼¥øßO|RéÖÛ/oõ‘ïß¾ùaóÍÝÝK¯ù·o±9¼¾¹}sýrõÔ"é}S ùŇÁâùߢ‰ÓKe„-¾þáæêP+ÿžÿîæú`cGîÒìºâPjõë××¹¹|y°ÅýÛþæ³9¸‘-_xç&ðè5_ÿùòáê‡Íonþx/Ûêõ;V+û»›Ûò _¿½y¸öFð2”¿¿~sýð—aÐÂ^Áf䆋æ†Z}Â^Ón'ŸþøF#ZÃä×÷ nD}þõÝË +¤êú·èÓf÷‚òx×üחÿâæï¾Ý‰¤ùŸ…¼þéWehJ°­$þ_ʈÿ¥ÆqQ&/¹›e۔”S+gM9ï.¤Æ‹RÖþ M M‰‹’´Hà÷ԏR&þÎM™eÛ<zÙõgRʧ3©ñ¬?'í¬¿hKÛ}|¼òš›’†åÙgú{˜š’‡YŠþ»mÊN˳ÏþïÃczlTÃb\c3ºuŒ¥Heœc3Ú:ºí(g)øÑ͋qž›‘–¥Fó2ê;oýÑ>oG]þ՟îà˜‹2¾ñ ã‹ßaŒõȒ9ÚÓj¤·V–cŒ1Åïs–³Õh–fDzŽŠŽU¹ÙÆLÆIÆTÇ +cvjåŒåÜÊJYfxÕ˜ö­hýŸÙ¯;®™ öÐÀùŽ3ßçŒOÝÛSŽœ=[̶¶†B c˜BsØI9 2ì} 1Ƨ˜ã·qÏây¼îRH1iJsÚ¦]:MçIÖ©ËçùB&ŽŒéæ8KEsžçy7ŸÎçó…LŸ~¶q›¶ã6oçív»“rº=۞sJ ò +q—vÓ.ïfùj·;ݝï.dšIo²ÓÃižOçù|>—ÆÎOÏe–œŸŸ_`j\H§]¤ yÙ yü‹­iôBn½XýpL;«ÓΛr֔Ӧìe۔¹©q–æk™š2.JjJlJhŠÌF©qðÒr¶Ê•»öáÏ۟³E9Õ"]†ß»¦l›2/JnÊԔ±)ÂÐϓ—¸(¡)CSú¦tmÑnö™ @ûíÏiSvZÊR]Œçr—cWFm9RËё‘c;"ÍH,ûÙëÖÛ«f¯JÍ«>µž\ôá²ßV½µìé¯e¿hŸl­Ì,ÙÊdedIV"K°"óŽ‹ÑöTÝ|)”—ÓÆÊώekefÉVd±ËâŸNG+ÉJd V”'—=@øj3¦çÇÇ-sœÇcѱ÷ÏØÛ[öíÄތ콞½uÎÞÙ±7²¼ÝÄwÇã-;¾ÕßbËçžø”‘O%Ï"Óæ\ºôTØÙVØZö6 +“‹Âìáóò¤2¥Î¥³O…n…-æí$ 2 £ ²ßô²_ÈПI§ìæ­°Ó©À¨"” +†§ïÏ¥‘ÞDw}Í"ŠWћ* k+u՚X;Jï?ØIþüí`ê@. +AfÈ$3eÇ9³4ÚîI¶…fÕ²«:­*Ëj™ٖ÷þf¶deïbd>«¥üIòÎåëRªÆ”ºÔdú•–´ÐÁL/“ƒ1ýQ™¡/µ½²[¹.èÚ‹ôâB‹<¥„^4üžW%¯JÕXõ¯ÑtٶĽöÊp ØÔØþ쩎X­ìç¿Ïa-2 O½ì¼l”ùhÉEÔ§UŸXªöšÚ"5.>»…£þ½_‘©!5O,‡:ù@‘Ÿvå“Ú +>êçÓÕØl¯½w¬J¿EŠ?³¢r[±…ÛH6Ý»ØNlÝ˪V=½¬öb©Ka½¶‹ì[Ör»zw¶ª‹aíNnu­$·IT»ThW«[3Y§ò—ÛBªmlµ6Ëê<ãÖTl,­mwpmî–¹ýÕYl8ë՚V¾j*–¡CëÕ?/l‡i¯Ä…µñøª\Z®Ö6ËCëö±Õ¼Z«\ÕG¾{ÿýèªþXƒŸ¾Æ#Bo«^í+X*µì+XEV騰ŸS"™MÁM&\½ºh¤’i!• Šu*JU¬gŸ‰’5K•,¨YU,U²NiuRE+»¢Lтªu*j֎ŠV¦ Kf#•­ž å‚ú÷š +²¨ZªlAÝTÝ¢Âuf +׎ +W¦Â• ¬L掩]Ô¥¡x©êå+Sù‚ú©~õ\VTÁN©‚A ƒ6I³¸T4-QÑ•1QÇh:§Bv& +T2(ePË ˜M1Q5ƒrȺ:*h¦Ãï´DùÞD)oÄ ?=¬ÊÙ!ë€T9Ne·Lõ %’ƒ·¼»áڍVì¹ú»åÉ­ EyIømܓœ³.xéB²Yp͏”ÓÊ,(+nwÏ="_'žÆ5Žr“O¼ª]ÕÒZÈڟ¥Q°1u.ípeÏ¥ÊћJ[KX”¥Í/­Ê¸(",,‰ÓÂƘ©c-ËvUvëbͶœí•ýŸ‹ýRf›0Èv'ï”á` K±"î—t¤ŒG‹Û“¥ÆiUò£e~G‘baÕ>\vO,äøRãéËÙӊԸO=4”O.Rã±ï>ðçÀöúÁ5¹¨s­u0'Š–hEí©Å¾:Y)ö×يYg¥FµÖ–ŸÂ*ê*ÃRømÑ­‹Ô_,Åj7–ùMó”–ÑK±5g/³•­—ÝžuóÒÇ:Ä«ªá0wjøÒÂO±àIG¸Ñ1.ÔržíAÇyÏ#xdU?^þŠ«ú½Ì¶ ív§jK¥£²Xˆ²E ‡ñNƒ:;sÃqœè:Î"x÷ñȲé¨9Pd…Yö +²Å• gò9ÝÉêPBéTÆË[ŠÊp.c1©ƒ.fȟt3?ûŒ®æ ©œî杰§3w:w"%Bâ„ã9ÊB–ž(ÂÏ"Îoé„>öqn®èn++F„þÂ?œÒpKÛ‰jÁܸ§é –‚‰ y±§­2ÐY w5d÷‰Në,ªÇL×µ:¯Oɜ°Ð/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“Ž^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïäOÝý?|Us8 _M°I¿ä¯q“»“(kg3ã ¸øëgŸýÝ·O¹v÷æ@'I®LÝ&÷'¢?ŽÇ+\_ÈÚNúqšc/ßöPŒ‡Á’r¢ü1¥Á¾ú4Î\ µ '¡K±6÷Ñ5éót¢Ô¦Q.ëdُ¸Q4sQÝYÙS73²F8eLòǀß}SY8é„Ó4õ‰*´§;᳨,õ]šxcþ¬•‰n™µAø,*“áKó¢²ÔusûtŸ¦ÂËa:É!̨*§iþØ]WwhÎÚÃÏó‰ðù£vyêٝUüf`eþýÍ«W×/Ê´¿¤âX ™ÿÙYç…1ÌÁXe27ßdŒqk¬ð¬õÙ›‹†6¡ˆév.|¬7ún=—ü™ä3ƒñA*ËÂGYL|™òä.H]Iz’Ö©ÌÁŽÒU2°ÞÙäÞdíeC5T\ÃaƳÎ݂§4©9l2³W4z_ÂOƦ< —âžôj Võ x"Ý9vhkˆ¡bN† RDPÇíþ|ÏéÜ7º©–Dõ—ž%è‘RôDI:Ó4º¥<½£:-£GÁ邒u•­Š‰qTùZ%ì*cSÊ6p¦Â3!gCÒ‰—Òv¦´]äí³…Ì½’ºMæÆ\(NÊÝEò–U¶”½1KfƒužRt Ö;»Þ‡s7å݀îj6±ˆ[7¯A̓›š—@æÊl¥2Kk0óÙÌ||~f3¬ËY*3»™[sçsöÂl+úrÚÀÎg¯Îߙ[!g±ÌlÉ#·Ê:ŸƒÁì”Ë«ë³Ìísë²ÓÆC®ó\ŠÌlí“Íø‘ZååÉäíº‡¨#UWÀ9Wׁã9³Öá ërØe6왽÷:,A÷{A2÷BV üÃûA֗…BL+ç¸rˆDÓŠèYEÇÖÐÁWÒ®q·ÔµÔ®§fUí²NfJì#ã¹Z¿p õ¿ë……%ÚB.;Eš‡>M %^®n¬]ŸªB5|äqœ{Üg³ä£Û*ÔÎSí&ã‰HZ¹yž®BŸ`ŠAX",4a’]ÁnîûI”¼$þÂÛæ(¼´y4Ê­}cµûèšÌ”»ؙ)̙æ/يs¨ùi&T#“v±Õ3Ÿ¤Ô!INcúتÞÓtóåýÕ7/®¯a¼ñ¿¥š¡¨=E2Fô›¢—´(û?yUæE„Íi»WN”³GŠ;·`>âlïÞ»pB‹B1|Šr0¸¹†7O༫k¶_ÆÖd®Ð] Õƺ”¨ö„EŒ×ÜEc¨þìÙbƒÎ«[,k¶6Y/º>NéÌì< :Y t¦-uk3ûœv5Ìå@ër²Y +«ÚŽsòŒs±ø²ΨêÇÞҏmãH(hO.ÐêYìh™æ}ØÑ ª ­3Z¢MýÖ³{­ÏÌà–8PÜ®4æ³ÛÐ详 í1ŸuõZύýì”×°iŸFÒýÕ¢¦,=Ö#U™Š*žkÕO*"¨"*ˆFÜO\à~ZÄϼ‡÷Yx±|#{L\byŠø¼Fìì#uöQ‚§ >ð.gÈ9ŠÎY('‹¨ìãØ¿cJÒ¡àa-ÅÖÒ/c¡Kt‰~.qÏ5æ¹Ú³…éuaxUo­ûk‹Çvëã<Ù8i¿«@ŽS÷NΫpŽP¯f~=Ÿd.’ì¸fóZNc‹[M±Õ‡½ôb×0‰R°Ì öPoö°ø8'[†}̔Z&7Ù&“å=Ddúž†ø¢¡ §fÌ]„hHˆJL%0DCCT ¡³Iä¨$raúŠ2Te{;€·f.a#màÈhŠ‡)5Af%µ¥³Û<0XÂL–!Ã"ë™Æ67¢ê±°áZâ¡b$Þÿُì;Kvüì檜HyfŒ˜š¼´¾ ØR—E+$|H¤ßÙÌ ö£¾Z’Ün´6p|ÀíïicøÃííå«ë›ï´éao8@m>‡20%WQš,LýñÐM"pQÐLÈín»Ì‘°Ú* @!Û¼v€ÑÉÁµóž[³K➂Už¾$/¨ï°~‹³b¹ù㩁Ëüó·z¯§ÞÙSׄ m¿/zÞ\Ïf®ÙKßðH–ŠÃpgéë:Ë|N?Mž˜O”%f+œ£f‰ùɳÛüüÔ˧^85BœR‡äìä^è÷Mî'j×:ðÇaÆù êÕ¤ô$ÕÊďæµ]w˜Û +Iò×üv0¤!Öû)!0ð”™ë\(,2Ó¬z.ëWÍ:™+VáošÃNÀáoùäD³äY“µ®ÀßJAÍY7Yh +°éÙgmZš Ô´&Hf’Y´†™ó&œbžQÓ`ÊO4CM /M…*JUÕSʏ)cTˊ’V”¶¥³±ÆË,Ô´—Ë"`Ø+á`‰GJZSFkŸT¦ã…¾ëÃ%X±hð§•Úä~± OX~®ñ؍TQä·Ñ¹ŠJm%‡i‘5s m¢Œ Æã*ed¯Ò„R.™AhódˆGƒ^Z “.+ØÒÛD…+@ËÞ´ nr€å^x“‚,G7 ?µk‚œŒ3Y¨SGTø°xJôTJ1kèÔh¬¦to5¢ÓJ5»Ô(šj¦éׅˆ§Z”´WÈ¥Æñh9à_9RªÑ*vå}ʞiY¤Æw\ñ¾åÉ5>ùGjüÄ?ÿgÔøGNrn±‰ZÈVSžøm4£dß?1]O8Ê)µ u@iî]hyÚO‹¼»êj*ðíÖÍt˜£žR`ÛB&r•ÂW&¦…Tî²]pµÁ¯yKå/ƒYt*—Ifú”ݺá4å§N×%ŸY€‡Ö0©ÂqTŽZpcÜg8RVheŒ>ΑÞş¼H|ûåq®÷AåçÿZ5¾g\ԓ­q B{v–ia2Ësr“–šÄ–m”­AjW)rSq¸fÕ"\E%'†—¥-mZ.?E§[çúå§`K™9¦ñì3ºÓ„ÖS»úkbt¤'Ãa€í¨O~\å]ÁèIy“pý9µ¸9xz;s¤k)k¾Œia`Å-VÔ¶˜°÷¢Ñ¬ZͩՆ–úËZºm~ ‹~v ìç¬QÏt÷h,_úÓJ|J1œò»ËøÔ"5>ùÚO56f²³½tÂ;™¾Óy’%ˆ\ºg–7md¾´Ž™Òv4y4wõ–m'óMk0rÁÄóÜip¥©MãΘýL£RÉzFW™§—ÎS ቢÄ%<%µô:¹´§—®ÑÏ>37Wqq÷V°¨„ޝZgMl¶ÉmVÝXta 9Ζ®«â¸ªN«ê²jV¡:«,³e ³åÚMµvRqO=ûlå :æžZ8§sLIGS‡œROpCiØSËéSŠÓñîrÌ µW˜Ïó“–ÿ3jü™£üÌQ~æ(?s”OWãÏågŽò3Gù™£|ºnöG?üð/齟†˜û™Îô8OŒ€J2 A™¦¤Îø¾Cøށ?øçxȑÿI«->}„ƒõa“ú“N¸Ý³¿úÊïf囱?A¢‰Mˆ'cߤÛzä’U “Tœ†q3t'a˜§C5¬/©5LÓ!0BKÿx<Âp0<‚g|;_°ÏV@죥ìvÛ³½rú~ÅkZ®ñó˜çgÏKå1óÓ@þ́ñûGxåýx£Æ‚ÙžR85¹öœÏöŒÏUù›­©MÙtꉫ}ÍfˆÎrÔ#î×Ânl vÃù‰Kv¨‘ŸîÔ¤¨©i–r“`©I¯ôI®Y2Á0feRSH}&Ûê"óÝåØæ¶ëRœ»áÀG LŸ®N‹NÝг:È´^xö1íú1žÕ¬ApΨ y «ÀZÿ$oóéûçãYçaÆ9|löܜÎËrȬÁ6y0.Á¦O‹N{`ÑC0×Xׄ ûh ‡ßæ0„vñ^v ԙá¯?:úN0#øq ¨ø 7؊´`aïhá=@™Ë6jhÈ>ïÉ 0qÉAÖßüu áàzëõ`Àºa•÷·Í@¦˹çú­™~Ss<ŸfÜ1¥‘eömâ#k>ßÑóøn-îÑç5lÓ=PñLTB'ƒ,Ít¹í,^ûÜ ¾šHl¸áD˜5ÞþDUŸ[u0 e¢;®omó +ê:ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£!8~²J ÀÉ%çBŒ¬É§CŒÌü÷M²Zr»îfrc×!ýGèûÀz«ð·1mÞÔ¶Á÷¹ë£Wa>¼ ó:«g,ùیÝ>kb[™{ ¤·BWÖë÷œ;¸k1õîr¿ü”{ù9OÍå¸Ævæ䶖¼#g¨I¶õW¼§šÑ5mDê:½Ô¡SýS–\Š +PUyJt)ƳĒúæ·¸ê=’PYéق-m1Vv´S‰í,‘C ô¶k;é`kÃ#)¯¼ÅÊ +¥íe$â`3«s–èãEóè ¬äœ[Í<Ð*ìzéÏ3æ«åIiVÍ4…©FP?ƒ°K˜q½&²Æn`‚²4ö=üI/JSÔ²p”Àpà¯sNfQçÛgý¤õš±èãŒÿ¥ÎþÛõ§s*¬êµ~íû¯-̆ï–ú.Ì¢nÌúþdßsþí鏪ñ°b¨"¦¨Ð~½,{JÎ*×v‹”«j“«RÂÏKŽð²³iŽqÝyT,ÒÔç0ßQ›,ûc¤L8P âBÔ0ʇ§–éq2p9ó:Z6GØLË!ì†㧢rª¤¨ÖB•w̋¨"eC“! Bþƒ¼)oKòšûÞþí%¤÷5.U; û6`d=“,8¾©ý·*‘ûüŒ®¥š:S-Šj^)ªÓBŵҨ8Ù?{?¥W(Ž_j…Úúþ±oëcÛZ5ÈÕ£½Î¤:%5Φ`íVØV?„°9Fph põè‹ìç·î,{bqg¶ÍÇ\šû9,kK=~bvwÕ2#Û)s$ ´Tá GêgÜþ› ÒUã•ãH1E…Ù –e_ÉY*A‚tè +©Ñœ°²³,0õX‰ó&Lç9aË +s̍Û:qÇÅÁž§Í¡žŸi«‡yn-s]±–f+Ït<žÒBÞÓõ˜ä‘aw(Ì¿½ ý“Ôø¨J—Çûd~hñê‹Óì]•*IçW +W«ŠU­dm¨jÜhþŠ©î 5Î~ÀC9âátáÃXz1Ê!Ê8šÏ¼"Z¤qï<í¨øøÅYÚ§çgÐt“0*Àބ›á#‡Ãÿ",)™‡iÊ'8ñh3œ>M­CðãêQ§Zꆙó®Fž³%Ì´OšÇ3†yè óô¼u$öa§aØÍã|tUv¶Ù{½Už6C<™–OòÁU|¬#/tä¥5"÷ Fg½¥=91pŒ{h5^§oNhF2¯eÚãrjl9áªü[O:]ž[e²°þܜïº>åu-N@BélyÊw­¾?hÕôÎUV\Îåié5 ÿQ ¤qÛ³@.šc÷Ï™›—§D? Džäè‰ U£ß6¶/•S×A€¢3ñðÀnÈÓTË;Y]Ã1Dš[|ë:iïûßmçëÉz¡?\fI&»5—`Y¼Gà¸póG¯ÄÃàøô3:BáÏèøŸÑñtü8\‡B>µÕ?!jëøq¦0~zÐrzâ$|BøfZ×3«Îì”ærnU=¹*ûÉUcsŽV=h˜§tØ3ޛý.ççÝn‡sìÜ±œŠÇ.øØY7Ħ=IÌ *Ãâ<ϽøºGŽÙX ¯ÆïUyh<4¯›Šy$-#‰ ¬uæULàúˆŠ½g> x|b篋éý(Ï~*×~|ÑògÏüûÁ‡þ0QÑñ9S¿&;YUgMMw]dìšò²õÌ ‰"]ŸÛI¾OH£¿JwmFÍG šO‹K9p¸Ç‡F¦,C4‡{¬SƒœN3ñ¤9ñ!*uŸêH¥ö(Ÿ‹'z0Ûўµ[æC“ýÑ9ñ®DèË4èfî¦'ùc¢Ö³ã¬‰[zïx f®43Æ*8œì‘VäÓIäE.ÿ+ÖxÈ©vè$øiÉñ¤Æ}Žw@s9˜Êz™ÈÚ"°ž}ö‘1X“FaÕ,™e…e®Z=hïg²«ËBY&‘9?œFæ';SëC¬‡OÕbÚì'Û¿XЋ%ÅßYMò'ý­Æ&úó4gOJô·Lóg±["ó|Tô–FOj—Ñ[2Ë>8~‹ˆ] 4FC꣋µu±Jö3N ôóœøyNü<'~žÎ‰eZ°÷ȘµŸÿëýoþIÍ[Bùöww·_ÝßÜ>ÜÜ~ÿùç­êÞ~óì³ß½æwA¿ûêòááúþV´úíËß¼¹„6omæùd‡nà8Ža3ÄxÒÉèl†~<‘É5êoõ×?ÿ¿ßê‡â@ýçõó?ÈßÿC¨–®Øüvó/ÿ½Û¼xÆ»~ JK¥âÍ+P÷ÚÛüfA.Ïõ›¶ŠƒÄe·øçùöþáìæêáæîöòþÇͯÔ(ò|ww÷Rúâ ë—oÏ_Ü<ÜÝ»»¼úWé½o¿¹yyýíﯯ~¹ùO¸ãÿÂ?þÞÿñ­Ör¦/ý¥Î•Ç^ª1´gM”Ù’-K¤œË¹—qÎ]˜7ÿ|©u-{2ôýIÆ~“òI%Á:JÞsŠ6i>E&Ûk8AmiÂÅq3d¹\˜Á&¥“^Và抷åt"‹†Y‘C¹o>é¦0l‚|;±ú‰Í ù$ p;äî$͸: 0ëmS<}f3Œ}–ÖFiE„ÒMô¡@¹6A^C$d»M¨½h8öÜË,§Y{@f„àŠN%ƒ›†ËˍÔ:ÄMOpDÕfÎég™±?‘WÂsØ!D¿«?i·÷'Æt"|2iÒ<$§ǓØçyÓ'Ùq,÷'³p£ ÚÀ·x¨8Íi#õåˆÓ S±`4°0$¿O^ +=÷y"ü =òI'úÞ&JW +³‚<É8 ++ ×IvŸtýˆé'{™(¬gƃËÈÇÄÏqÂscäç2r /Ü óÝ ÑEóFE!ê¸Åt"l­Œ[èOäƒÌ¹Qú·—w“ûE]7c”LòÐq‘çÍ(aˆõ>™}ý0n¦ñ™])ÜzÆm²‡ AÖj h#7 O¯³kÀšÊ[½ ¼Ò, Gðyƒ5ÀÉ,“Sö9y°“±“ž¹¯˜Ì*4'Íd¹=IW™xœÝÓ Pb”û4b6ÊõyLX<]Â,_¯9Þ÷®ñ3ý|’c—q ×Í«Uæ²TrêÌY֋L2¼ÈÀŽèü³Í$yºYÎ/’µ›:ø±4äS4™ÆóˆK¬™q¢µB¨SOS/+oá­^«¾xèó‰péË ,@¦×«%5ê 2=e Ȧ< AVã(Óºlìd¾‰rÚ\µåZQ!X{v_¡'¢ËØyEýI”Yдg»¯<–_VÜ+Z½_}õÿøüû‡÷ØC¾xóío/e>½{ýã·wßqOùõýÝÛ׶‰¾å÷ׯ¯/®_|+¬w›yó‹_nþùŸŽl<2SÒØV%ÒÉL·m'L-pÇ65 ©Ýq&=¯Þvœ˜O„oIß`E›Ë•Šôðøʬ 9„ð¹1 î…ûò +äZ¹Q{¬†3Ì:aõ>Y¦ZQÒê0Ûz_¡öÝl7Ø؃PúÑ(Âeso(zk[\(Z/ì²>›Sæ¬rÞY¨Â¸ü­3øá¼Ùë›=N sOºe^5Hÿ +Óyµ¤Šä–Ö Ì"F–ÖcO’ñ±öȓ=ÖkЕAؗWâk«ö8©½ lF[¥žNW±7Ö5«º>‘_UžÙëY½ÚzI¬&aßëd+¡÷Jöµ~´”ÚSÀf…Ès”=Þ¦à {­t¯0Ür2vŠµ=0 ¸l®Â®ºˆ„±Â¸1Å°Áw²-ÉV„'îúÂN;áâع«€©õÂçEùÙÌQ6â,¤,õYԈÍ,û…ˆv6‹ ý1 ‘=bÃ]°—‡™EXÝEÂ+dzbÙç¡ì^BíJw,ï0@(’Ý +‚ r}–Ö҅Xîj¤uÙ$a€e{¢]LØusœqߪWö·!,šNš¶S'-¼ZRñâؾå…SädÃ4„âÈòòùÊ;[4Åz‘HÂ&šJ +ÁÚ²Û +UF[ºaãõLèä8ÖÖ +ÁîÓGªW•gözV¯¶ž|ýfûú0¿¨ë#ëÁJM2b2Ò2UOúÌÍ!cJƒÓˆNœ`<,©|R/“Î!y=…`ÍÙ}…:@ßßԊDîN2j{F°ûì©üªòØ^ÏêíšN4½M;ñ¬á^&Nšr+ÈÃڑP80ö£Œ’ˆj½ð|نù„ý4` šd•Êšž±XlvȤ›!€%|™ù"@Ÿ Xd²$ÆNKŸáþ!¹´C 9tc½J–ù{ec0‚(@í6`TFŒCù”l?Ú}"På ۇ°fßzè!S‘ŸŒˆõS.Ž:‚Œ+e ýV'‹h ó w¨c¶ _ÍÕÏ"œVŠÞ*;²ˆì¹¹PsJ1rƒ¤BÔPDû˜ûTn-d²– _ 9ÉPÉê¯Ðc¬ÊË: œÓ²¥ŽdOBĶ$“³“íDF Ûf?5Ý4t2V/45OØ°Ü1¼pÂb—™7áÆnnöYNƒ¾ƒ&à0Ø4Œ Ã0EèZ²O²ÔÀ£sחõ$Ÿâ((JqÍBUzRxêfîô֓u[‡.ÂÛ£©©HE• 1S^iw›”C¹÷Âϑ*§R|®ÄŒ¡©Ò cßÔåkÓît²tG%­©KÄÙQ–QÓ¨QìV:¿Ð_À+[¿iíŒ~f7Nð. &õcœsÂä.dQ³EŽGÇv2æ´ ˆ˜—'c­å´i*“Òã«ÚªQìÖp2«o/” h³¦2§,[u²?žW毰~צdÝ°DMYZ~µ¤"4!aÕíîˆÇQ¢u#`Z‚s)d ª—YGØ+r‚µwU&ŸRƒÌ€°½¢ÁÞÊÛ3‚­úòX~YyðRÑúýÞ!é}” ZhSUkÐ÷…ÂíYP.p§Å ÕG‘ÞD…[´ ي6»AKÕ™MÅ 1Wæ[\´PÛa"0ƒx)Û+­ž–á! ‹Ù)xb1iÉëŸÀ´î&-y …E«"$À\,Z`¿a>(-rFŒü¢EÆ +û•´°©tã8»A«\ÐسÀQcÄNiÏ-‚.L<½Û³úACžÇ¥= Ô)ˎPìY.;{–@K{X3;Î Z²²`Ðw{Vԓ…9Kd¨k–°…†ˆgnmY`¡«Æ,©# „ÇlYÂÛ9` S–ˆê“ì4nɂ™4K'C–ìjaÇêUü¨†,ôa—EŒ,†,iÿ~Š¥!«—¦¹ÐŠ!«—Ù›×.ðcNâ…!«‡f<ÍnÇÂVÛey±bÇêEç¤^ر°©Q2.v,iY¶pYQŎµ·Ôö·95õqiÇrj±AardL&3QõL.ÌXØ׆1×kz˜Maë+•¸T©fƒòzŠ•ª4¶°eùիʛ”zÖ¯¶dç"EÅ¥-«R;æä6*X¢6/MY่¨j.ë´áZO!´¦¥J5 T­ÈlTµ½Ö”åOåW•ÇözVo÷¿•%ë#Œ† 1´‹óRnMqh܁ðÀEéh÷öXJ'™?ª;”÷Br•}kh‚ÝRĆê”-Oß«¸{ì¹2hÕ)H‹FêݙH¯ ^_ý>Å-å0݋cÝØEgŠÅ3HmiÆ{× (øÂDŒqß ðV‘–ʾUœƒ]8¹¯ÞAޙ@)îAvë4*îAԗ'©Âýƒ°Rßq¡ì€"à;’»‡J¦<“û°ËžÞ?sÂÁiºôÂôDÕ݄ÐX£túf™wâ.³W+r–m€…✃µ„ïäN<§,݅ͅô6UÙgk±u‚-ˆD;WŸ!tcZ—½=§,½†Í…þð^Ùú-8e¬å ú´òÂÈÃIè>º¡—}xê«+¯–®Ãz™ù›šœbM.‡é»Öݦš&°ôÖËüὦõ[þ;‘º„é™ß.ÀY&8öM*‹ø^´Nl¹ùä ÎBE¦Ù›ጤ¸«5Žˆu¡nϏ0ïQó€4¦•Š)`AõBø©€Û$ìßÉZŸÀ˜ý֔˭²k±U¹µ 0ÁD ¡aïU÷õ© –¹Ô5wCîuSB]0ŒÃ<÷X†Ž,¡B1='«Ò[/Ɣ¡;Öº*¥kØP%ˋP˜«•EaC›V åª *Ÿ®^W^ÀëÚ{ÓwÈCŸÄE ï§ÄÒG {²wqRïÐEص‹—ºá ‰•›š6kÞZÐà+:íœR;ɜË$+žê!Å2?ÍS픥§º^X<ÐWEh)ajfY%cXSë›Æž×%®e7wW¥q0Ä«›÷0V‡µï±Å‹ì„¥Óº^Wüѵ®J±F—ŽkîÅ4xe²iÏ+ÂÒwÝ\ç/àu­ßô's_ƒ£ ÛÈ+ÍÓÉEót[dÑ<1MhÂYhž`/¢3 ®yB?™svͶ ݪ§‹êé¶À¢SÂ*>ÁºP=¡Ov‚ +ÛdQ<Ëç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgSÄÓù…Þ}EëÜïЖ«Q#K­³’‹ªH;íE™Ätè/µNڙ ßÔ ûÂ/½2§,´À†lêb­¬¨”µÕ…îY¯^èo敭ßõ¸3ü£Ló1âVpø«_­ÈàHô<ÆâÔU#Ájë ö8Åíó´³6B €±VækÕ‹‘g˜)Æ¢•É®%lnlZ-·î›sÕ/ôWðÊÖïúúÆ,àqPõ°Ã +V-@”‘yê”1PæëÝy±Àî§ r á(³£Ud¶Ðk;ÿÐ+oqe`W窼°üÃÒ4:£‡¥ÇÊ<‡!  ‘zøré”ˤÀÑýH¿=ÜìŽýPö’‰Þû€ ¡ ¦¡W§¹’Eöù”Œ#‚*Êd챂Dµçk`—Ê걸²B`G?£ÄàÞƶų̈Ð(yðiœÕ]G»<,yà ž'ªS®]÷c¡ðtY‡&Ù^_ŒnÉý±¯:°)ÀZ"7Å)èw%+¦Qk‰ôτ jÁãX 6g‚"ŽšëX3Úª +Áš´ 5¸Ö4èÞZ[šÍ¶y2¿ÎŸÞëZ¿æO(H à ¦Ft2ð„ÓÇ^‘ ¹,LŒ 養 ó+0öÂxCÕÖ)ø»r#”Ò‘òe߈sXiµ…0 §;&¹b' ÚP4Äú(êF#CÂ;„‰[/œæ”œµ ÎPÅpÌ rZ‘Á)U“ªB¯Sd!U²’§PäTóóIE'ôaÊ"Pf^Hړk`hÔçËóÊÚhîìU ÅyÆ´ «±ÛŒ•ò>lL+›[¥ |‰Ï E@_u¶¡†D‡¦ƒo¹SCUðV9Û;à΃i‹ š¨C¢ <6¨}’æT¿S™Ëԟм٠ŽíS'–Ô©UɊ¨:/Me‘ÛR4k? +¸¬3¶7¥„ÅãFAR=¥Ð'ù`“uÚïsLOàöðJ´Ú½Z‘eûÉ4»ˆ¡Ùß(ÏÂí#ò- ŇtøÆZ/”½,µUÙçÐÚ 1áĵ~ÓTCLwµ=£Øþ`~¡?¼W¶~ËÆ+(ó—þ7Ì|ne¯VäYM¨€ßÐsE0-ÇAáyN1ÀF¯¨¤æBY¼CZTækÕo5ò¤p­ î]Zk«…b·–Ç«ú+xeëwmúA†gNؗE$óՒŒ vR®Z5Ë`@a9œ2QNpпP¯‹H3šºœRµ[ Q‰®ƒR!bJ›öÙ8Gy´rU}©RÑÞkÖ.€ÍWD¼Ì¡Cñ7äÉYq‰"¼©y‰’9¬²YC¡?‚ÝÆúB&tmÇZYC±VíV'ó¦© n‰ÚVrUØÏ/ôW°Êöߵ釗ô h-ÑŠkÏÉ°éA†‡ìÆ!VFé(h‘þÆJ¹*ÒKJãØ^H8Gn*sJiՅ #›a¤V&\•1\Þ¨ÌiQ®\V_«Ô´÷¢?™±ÀQÝØL‚lùK°;ö³‘yg ÚÛԘàÈ*pwX=Bv‡@¼CU KÊïÀ¦§‰oƒ¼"4 ä£AÌ;TÈRŽyGŸ©çµ€ÞqmHî@2Ð;Í-qŒõN™ˆQö¦æ5ìïG@–ãÞaŠÀ¸ö»èÀveðpüA…n }‡6T R 9wuÀkî”+ïì ͅmoê*”Ò¨+TFÎ'•Õº¤­a¢X-—S íuþZ¥ªõ{Wý? žî¹Áñ®•¬¨“9Ç“¹4WdºSÌ"böæB¹×ªœ`MڝN–즩k2stmtjÍÖþp~?¾×µ~φÛÁx!È\5·Hœ,r—ÜŠPK@”ð +°1öæóìpà«Sl™Écß\`-ÏM]…PÚt–E*Lz³Õš0·âÜ6Y(&–gó ýù½²½ý mµÆÂ"Â|@aŽÆÊ€Õ“ŸÅ@Yj¢LKpݏàiž†¡†8ÅD#¨×ä?$v3ÈÊÜ/T'#“ÛB¦öʝª×X˜lÐ=J®~UE +øA)´RF˜/üV'‹Ô 9×(€–4ð(§˜ädQõÂþ&LTJ±h¸Ðeäþ„é$0Ð Æ$°ÑXŸ· À5¢†¹$G˜Ì{NEJI£Æ” àˆñ j/F“&€ê«ãa€NФcQ‡¾ïs À^ƒ|GE²²8h÷cnâ°›ñ!ögï¾%ºè1š=ÂN^­È¢ÒáPnGãóÍç&T |¾Ý_/³€¦&§X“v§“û¢O—º +Úð§Ø­åÙê…þü^ÙúE¥¡ çc‹½G‘p¿“=«>œ†’Ú™J†…Œà¯ ;¬µU£Ø­îo.´€¦2§,[u²?žW毰~צ +’SiŠnB¯danÀº8(_dà“ŽˆóÞwŠó,‚üë…% VV)ÖêU™‚FîÍVS+ëìõj«F1àçú+”ÊöÞõBó' XBâJ܀#âà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q~ÉçD &pD\NÐ"â<žÀq5   â<¢`ˆóˆ‡Ä•ˆGÄyHÁç1W‚ +W +–h¸Wàp¸Xàh¸Z°ÕØÇ•à‡Â•è‚%Îà  +çñ…óƒÎ  +çÕý^b –P¸dàH82p$œ‡,‘pgàH84p$Üþê<à°5<þ א ¾æÐ~¸•€%Îêu%– ÖU)-0­!‚Í+s”[it‰†ó‡k®ó(uí½ér 8‰†kȆa+0ÿ‚ró`€ÎcêeUÐT䔙֐ ÂVë2”[m²ÃùƒùUþè^Ñúé¬ÕÝ ;Ÿ0b_r2¬“ +h)ë#ÍÅғ{6f³.`¦öBaa!Œm]N±F«aBɲÈÚS¼2šV[¡¡>]¹®¾@©kïM›òQšû:õ5ÅuL`¯Vä^ƒ“`óÙ(éÀuAõ‘B¥¸±Ç43¿{çÚʜb­^K¡‘ƒF7•%È©mÕ(v«?ž_è¯à•­ßµíՏÐYá®ì&U_Ò4i¶’aNcZàﱝwO"u8,ÓäJ¿Šil*«k՘~!Ï¡ÆM­L(ÓL¯wiµP¬ÕòxõÂò +µ²õ»6Ü*f“M°Aañ¼Z‘ш²›S²ä.=„-=¯k®{@|òÐ^HyßVækÕ7?'瑠ÅRlv¹iS?ÛmåÑÊEÍ;Y5ë·üTksÌ +i4pQS¯Vd ¾h¦À¬&b^4H€Ô=7”ºÀÆ~qa‡8Ï©­Ì)֪ۘœL·ÖÓìܶ©gölå²æ­´¢õk¶ú1ZÀšÙ©JH…¾Z‘¬ Sè%•1žÛ×#…øB1ж}¿.°×U)Ö¨{«<ÁpÑoj]0ó©mÓ(WEy¶‡ó ý¼®õ›þd“–Q‡D…@^Îâú2bÔý .(ÑsÆ ”‘¬ú9±}¶÷9qyÝ/BÄJžšZ +ÁÚrÍ_©²¼#]÷¥žIÃÓkkSïÏdTh«gýf­ïwPÝzF»<*]֍ꬥÆ5cöõS;.c»³*Æ~°Y ­È ֞ÝW¨˜&àU^„voÏî,ÖÇòËʃ—ŠÖï÷S-Hîȝé-#Ž’|µ"C6-Àh€ +*O7¨ôÑe˜æ Å9Ühåõ Ñ s[W!X›Îߔ:)ƽ©)[m27¹Nšgó ýù½²õ‹~"ÑcÝ¡CR#8vXe_-É°èÀ u/ö³‚( 4á N0Y¾˜šË:uå55JiÒîtòÀ×ÙÔºh- +¹i³PìÖòlõB-¯lý¢?•„ ž:ZRŸÞ‘.•:2ÞeÀ°{ TÖK#I!˜Jp*ÚÔ^‡e×Ïm]N±6]›42œ5€jÔʐÀ¶ÏM£F°;ýáüºòü^Õê5š JCOG½Ić);ÛÉ0k%ÒÔ¤ˆ\OH¢Œ=6ÌÌAc{7fWŽí…›jeN±VýV#Ê,jeBí<6­Š…>^½Ð_Á+[¿ë'ۄY +êð øþՒšKjˆÑŒ– ’ŠjPƱ•bÂH,ÙýBΐ ª©Ì)Ö¨Û{”,]Çüxµ²¡Ó©Új¡\•çÕÇ«ÚÔºV/Z{ðSFȽ#ðíú7sIí¶€vâF UAvËkwSŸ+°4îÕ \wF¬J®¨nX ;f 1P÷„Á¡ÙµÅt˲¦1UH7²vgìˆîi1ñn݉é²cÅsÃXK§rsÃ;BôÝÍ xWð[í"q™¡b¹ùT8[(·´§ É=šŽâ@î¸ØIZ÷´Z˜+Œ{šeQ‡PQܔ´Áô n˜’ 5f î^–}q‹åÄ ÐÐY^6ú!ÌQ6/߳yfØÀ‰‡kܕjFu$ܜrƒËF<}ØÃoOpOÀøT¨“xøæ_@*+¹À èÛS.+HIÙÇó”ã +Q {?N•š‘­›¹á­&',°N-H¯¨À$½½œ²>W!×g/Uí¿äO£Ó|T֏£7Ï¿¸}8p~]þñåµ>Ïoý/×?Z ©Û<ÿýõ塃sÎn^}ûÕõýÕõíCsƒÅGoã9;ÿtóâá‡ÒıçúêþúO7×–ÇzùæxÏ4O#Ïsý¦}˜£—ÿæú»‡oe.îïnÞyõ7w¯÷.pï‰Fõè{þýõÍ÷?<<õE÷ç7GGöü™žít~ûÂnv𰧸ùÓ5ŽzâoªyŒ–Eœo˜U…È32«‡ÜӒõ×â¤'ƒ›¿ï‰O¥ÉÒ@Åo-ÚÕ›œìø›¶ŽÃÔeÕ3Ÿh —ý¤cvԈƒÔ åä~èôðî¡Þ—És’Æl#wdôìó "¬YãØ‚È78}¾) ŽÖ‚ò‘§ªx÷Äês1 ÏÀ‘kBÅ:UI¨×ðjÙ*¤c5AO€î=!¹L²½‹jFgÈt~îÄS%½;ÝlÇs0GSÀé +Á6Þ֑TrÔÞc#†N 9L³ÂPßNO + €ÈE[3x»î¿”Aàó}YßMvõ9洘Ù³"%óìý<2ô€H³òn-9Ž½Þ⬔ÄQIÈ©M †Í­ 5 •Ý=¼.YxܤÊfŒc=¤¤Ÿúž‡°% vÇ{ y•/ŠáøVºØ…XDž0¯5²{ša—õ]&’ÂÔ5KœhZSðP‰q´øs"ÃII3ñ¤’‰ÆYÀ³õšº‰©}ÝÛ¤¯Ñw6`coY„!˜¤XP\HõÖHM¸Ç¹yÑLé#sCP™­Õ™B Ýyk ªj7@X½ièä6ôŽÑó8:á‰A.Òh5!{ìÝhqt0³ñ:ÚíÊìês +:Â!g $Í£ÓÁ¬  ÜÀè9¤ ê=å6]Â6 ° %éG.Íl‹‡”јÂÐم‰—å>«P'Š¨‚ƒqÌ#))øQæ*¸BiaDìWàÜ%u ¾çDbò°vžúÙfx>¦ö ˆb†;52³Œ|˜{Ȉ:zla§«|† Ž˜ÄNuÜ΃º_ÌAÅaÍ}a`Êç) Z;¼rDj¥Èq£~Žî–‡×{$¦3NèOx2gyº9ZŠ¼GNDa¦¹ !3E —ÐXƒ¹ô43݊…Œm’ÚžIÆ)S_À2qn[oÉ;@û&ŒŒꤘ¦Iªe=ÄiöI»™`zOçÁh¤‘œ:tÁ‚"¥s†Á.;Õ°{¹ ±>P±;šW²^ƒH6^d¶`trq‘ŠøÀ©Ó5BÀÁÂ3gMt6‰Ï£÷Ig9@ v›(ss[Ö¦÷Š¯ÊpAÐFCÍÊÃíõzmošt†Ò,4÷<Åkr…Ö#ä_@˜CçyEò-æñ”¤3ôjŠ½rÃÂD®ÒM³&æ‚žh)‚f•î¹©vªòømD8a{J°â“^Lüÿ¬÷aǙ:}=cs½.nj¦ 1ÀÚtl£›°"çàl1sÔ=t ×j²§ÌLÌWWžFÐÖd}sôËDˆØÆȖrIÓZY’ÇEÉ$Ái/\1àØùæþX€!#Ü؞›6  +£ 5ó÷q¥!HµWóy# +Bžß7caÅrTÈDÃÞé5çaFîk²Giô&§¥NF\»zÄãäý"¨²ÉÞ¡¾eýŒºä•…˜ÔìU,sCŸK2Š•àÝ8À‘¢ !vÎ;;t‰Q‹Ì%Ÿxb­"ö!EnB§ßÄýUõddCàIË¡þ#™´æìG´'EÓd'o ¹±‚<¦^“ Žè/PRèԗ5ÔJäÑ t~Dg„5ÍË[y´‚¶‘£QfÍ3}™°9–„$vpEšétËV{šÌÔÏÝA_5d•ì±ÓS_‰ô~j04-gH›»Yƒ)X—6 +Ã# +ø ‹ÃúSìõ ¾tç£ ÒnÅpôVcâXb¶ÓDMJ̃mšcÓèÐk_r}\G3³>/â/é’âR)¯Ú­ÀôÏ&›LšÝ)d˜Á£Sæ7ØÑ?Cª©aƒ-(Ff'M:ð$ÒG#÷n hxnl¬oÔsQ°DF›Ê +¥a êSffØ^5D{\ŒCÔ4µä¨ /"€o’fÅíë¬G¶­ijpúœi s°²0é­Âÿ4|’hRf?ўêA”ƒ:6˜/)š„-CP×EV3ÁˆÜËúÞ÷4CÎþÙc¾[7…³~T¯ËU±¹)›ì*‚:¥h!ÄÑÅ ô–‚‡–P¿3æNÉ´ªñÂ!©ÏyR WÉ +ws.\t ¡K‹‘ …ž‰Ãy£†ÿr?º`fA›,·-ÌdŽ-˜þ躇,Ȉmœ2g§mÆÎ0£F£ öf,‡±{5ŽW¥6Ý1qB“zÓdöÙb^g“µ¸ÝOÉ(lrýì[Ü2%}ªe ã:O4}'b·gKf>BTÐWE€uA- PnƒÅÀ SmºÒ4­U^à`æN«#˜ïÌ|Åö9Gž?ûÂî˜@hq"«F-´3çrh pT™·uöÀ{ìœ,…H¯y`gc8XÓiÔ]ÃÔ²úvHÞ¦Õujv¼¦Ò<óÈΙÁ¹4 *çlþXÃ@í{ ö±Ï¦·‘«,Ò'L%}©0uÀ›m’ÙI»aŒ#LÃ; }³®¦ÆäΝ¾ gËlNA†ˆL²Tg`LŠÉë‰ÿ•:hÿ’F>~Qø3WŸ-ß2ږx'ý ß“àìJÆ~û‘iÈJ É •¡+ÚN­jpšEM’0ρW4öw&"m K€3z£)€FØ?h*½Óñ3쌺áPø¬¨!ٖ…sþBë'ŒŒ£h@íxH„í<+œù°ø~Í]9ÚäH©Í7S¨A²bF)ߒa;‚ @c5æ!Ä+v43èJD‘|RN÷¤h¬·Á$ƒR{&ˆ²­);`;UO.肧Q$žƒ['ëá2ˆ*̱9X5Š/ÊîÃ×çü01üT ˜spâÛô“²ö23—TCŽS6y‰ê‰‹>¹ÉT@¾@LðÉ ÷V7ÑSFOA +xûY­êõ. 3ü¸ÜGR1~vnE ŒiÖs­9ñìNˆØ=tŠ÷™‚½ «?3é›psƒÀAYŸn@HÍLˆ)´à‰kV}ŽÖ5mq4<|£Â43/LiVŸ/mœJ êî¢O´‘@¨[•¶`V¦V˜N•2¶Ê¬ ÔVaáãQ­ÃjE¨ ЬìÂÉ>iµ4ñ/éœÇ«RéÑÎúÉålé¢hƒcýÎó®ú éT1ÇæŽY£zõ̶ ÉIǹl… 'ÚÜ@&£¡éR'/4ŠÁ™”Éç1 ½^GÇ)<œ’?|gûº@£'€§Ç¢/—d!L/‰-`Kk€À´§ÉÄ;œö={5nÖX3➄ÝÁ¤§œ¿×UÂSí>îY „1Ôû:H) ö¶ÓÌØÄP½ª©yÊÆFÓan¨°ú¤ ÞIN)œ‚ÌToðÂ÷x|w‘YÌÌK»(}˜´«+rS ‚Š H\c.\½ I6Ð!cGÅÞ6šÿÂ¿sÛ(¨ØRçÉE¢Ìšéx*ö V +|.óDnÈÁ@Sá4¨Qή¢gÙÿQk…/ çžìŸÄjæðN½[Iíº@`£³&aÊ5ÌTDÓñ̐@û ­Ðû¢ÐzÅ!€Û´(”g  AÇ>[Õ=êUŠä-BVï–pÆ`škÇ+1ÚȜ™pQÀ'ÏeçêgÝ Z2Çý/ wšè;k㬩®½ raêì*òjìT'#³Æ¬·5†ìŒÓ.`á™u®15$thQ ñ™²**Ñ#jIf +"@,Öð˜PŒ³'±³Í3ùá= à{ F6é4²z²÷aªùgõÿæƜfuìq¯êõ1™­·u>ð'v‘Þ =é‚g(§©7Ûb…€…µ}Z¦cĬ@¸©6שí) Š,'zÅQ$ö$ғÏÛà»b*ˆI£=iannã¶óº¦ÏéÀÔlúÆ!TÛ8 Gˆ3¬pj¨‚‹<ól*õ7±k9âÐsÝûxö2z¥hi25 <ž6ŠŸS“1“Æt¸XèÞnŠH8×@QM³:œ0Ûëô£môȚIµ¨’‘3¶%ª–Öžy{®¡Èס£©snÐŒN§òk:ѕ¨°¼ÑpXy.¨+%#ˆ–&µ\†È((pHJ–²&¿¢JÈÀbe:´cÕ/øY6äÎÃRçgx¸»[| RƒgàU´•!E퐉±j Îá`Íæ‹u|'՝{CO3µàڙša”8°‘úEpàÕu£ÐÍÊX¨í-º·‡¤#%qBʓ¡ CË™ŽåI ˆ®ÕÐ ¦V7|$¸‚6L8zû95žSM\4k]júèœt göÀü›·š")ÛÒ¨ðR˼BŒ“tҙøão—'ºaÕ·Íôrz‡ŽGAˆG/Í~ˆ ³Þ0¥nŽ<0 Òð`Ê1SØGqÅàâ*욡›´Ï!O€Ñ»²ò­¢ý:©ÿ¼ Þâÿ¤×`塄Yü\"ÝqŠì‰=§.NÆ.#ŒeƒÂs— ̈…ë +s,œ5—EÉ + ûõ*w,׉b½¯œ +ˆ Àš#ƒÜñ2µ@Ãö‡£~ ÁµEž› ' VžI—Šæ³˜é¬ä&zêÒVPQeŒÌBfÚ*B×(Ýž×s#ªöXcŦ‘9ÅázÅsG7QFµÆ……2ªi£a´aí10’‘l`†!!7FÆ Êj'„¬gžÂ´¡Í’9ü[ØxU3Õ×3QrElJœ´ÜH0;ˆ€Öì¼²¥b[ágˆj<o²,3ø…«ä·QêÌâÕ`#¡ïxgWŐӒ'~Òè”}ʄ!PzK$K²wììmÎ6= Q\„Lø4yêãÖê +ÜÅè`â<´6&ôïˁ€ª°›Á5-2”ÚêgÑÒ9Sà´v궮·gèNÆ%&ÏòÆeØ©Eݞr&=ÊW€¾•yTÎ+`d'Ô­ iJœ¢}B†™“*;%2Ö+>ó¬~ÝîÍÍ^žÕ,+¦ì0*˜’‰LáBcÉüýH À“4œçG'aŽ*‚ÛT ‰–>5u0ÛAd–;¶’ÀÝ"hOûmt`ap u4Û}è `ƒ£‰€‚ÿmtÑ ÷AL@¨¾î%jâe4™åK³K `Ðê¹ùOf–Ä2çŽ7™\öŸ]ˆší àÄ:ÕqèGÆt@ ½ž÷ˆM¥H8iϝ¢Ò„Õ)þ™²‰¼èt½é»ñ¼t¬æ¤üqÜ +àv-ðŸ~t ìz?òTˆ$€Úї·ËvF½ @âóÛP5[òv¦/ƒ9å@€ÐM䧋±iRV + +n#Ú BӖscŽ˜àz·×ˊ—€zC]¢@‘í€X,€Äˆ½Á• š'gì b ¬EåŒAARc¯²®ÝÔrtõ<"ØÄ4/î#ÛbÍ·9*e“ëHµ I L“šh’±±Ó¢L°½TÎ'µtŽî!`*ç€7'׉Aˆ„¦úÏ„óãLa +¢<ëɭߏ Þ9ªúÏTð ¤È쮞'֙²ßÙé†SV¡ŽF¼N £}!Íjè0QÓ£Y0õ0ÃÀÄX^Œ¼Q&ÆÒ²0zðp‚ÚÂäpÜÆÜŠÜQB Pg@=¹ódUlm¬G"]¾Øè(~˜¯ŠJM¼ýx}ã˜#%Sä:$Z½øO =ÂÆM,͍»¢NŸbeg*à±Bž‘î8 †{'muŽ†4Ðaws‘±Þtd"} rƒ‚Z%1qpÞ Œ¹Z4¼®QCrô|6X›xø­úüh–· pÉÌîÀõOœ'*EÓ¥œ9-ôD›€ÙÝ:TYÅ;h™ ²z€ò;™!`OL¬öºCáf¿øã^Æþ—›ç_?ÜßÜ~¿ùÅn·½ºzûê÷w—¸xgV¹8Í¢J“Á«BVœBßYk² ½´)Cè9K]/¢ .Úiì´J2ZDҒÒYØlÕ©‡>1ë}_ÏÏcšpÊ90 Rý+9FÅÃÔë`¢,‹ê]æ5ôë´Ü§:'"§ÀH¨yõå`à™§ÄôŠ¤;0 ®±õ„Bv*°)˜£›Š³7€øêÎN7V ö!…1?S‰é5Dr,×÷4‚++‡ÀóSªG”0 û Ô<8Œ‹Ä܅ò¬p¸2‰öG.Ù`ÒNÀםõÐó™TËDg¶rzup_Œ©ÞG<³*F½èj€±$aâgîÆövA$ä¤ö/¦œ†e*¶m0/ð]lfcÒYT&`¼Œ€éLÔÆ&Èã@@ñrs N<<¨:É-z¸^Êîúapï}Tz±ê“áÙ'õ2Ž–ƒÅÎ2¥ÛŒ{Ý©ëÀ#¢Ç;“‡Añk?™c¶c.È7«ß7ÊθaÖ ÌcêE3-á*2e:cךÔiÒŽÙ¿„ˆˆ4\Ʊ¤ÿCy…z×ÖY½gc”)!@×c=@÷Ž¶“Ûmà‰cÕ^ˆcÂ0#¸‚ÉJ*†Õ‚˜½]VD7èYY!#ç€V7!¦š4O óX/Ž /HêK†ÔÒõigàð#ûÑ@M5î™lßÅñQ6†Öù«ÿe8—µ ™š¡&-Çefê¡iHaD!¬áÜ A†§lÊû²ðd8Go/+‰ºhô`š‘Lø´‚ø®!W Oôø +…´M•‰y +m ÓyŽ:aµ¹¬¹¨ðg2Ÿ**¯!N È*FK¼ ½PR[¢f– ÜŒ>*€µgÆVô:pwê†WŸ‘}ù‘r½ÝeD³â]h2ÁÙ"z^Oo÷¾ ¥˜+ )£—…¤à‰ÉÁ•0+ÆÆî3jNê蓐ê‰À2Ði ×Çì‡׏<^½ŐK~ˆ‹ gƒ²¡=ä°Gúþ€‡s®¿±gdMvôßM*éÕHÎù¬xÍ,:%‡cЁ {³Ê¹°Ôa:‡o·,®¾‡‡¤+†H,X3íæ§e¨5„¿cT1Þ³ ƒÞ¥+‡ rVo»w¸oÈê™çk a~`<¥J̟’õ‚Û<Æ| "5ñèDÅg8@á¨'3g<•Öë²A_Ãь˜RÌ>ø‰+@1jÀԇ¬)Gªj±V$cö1Ž2*󀟍Ç;â˜Á!Kïê‚À]ßÀœ©Oa:èސÉÍcHªˆËÔHÄѬ`cR00ô’÷´#^ Sy«Æ±Æ<ª¿{P0bÖÙB +ß3dµ¯‘Ò€ýÔ{Œ¬s³“M¤=ål7z&bêu·wh‰á't„†{ãY9Žè¯¡Óóö*@'aqrõê©!!Nz²RÜI,R›@|’9R°ŠCºça‘½Þ©¦$@úÀIiÌq“:\{ʳ&­u¸÷ª8 a¡¾Ï’‰óT=frTÈo…F—°u#TãšÂûí2É̜æÀ’É8zĜ›ÀN#º‹)Ø«‹_§âž|þéUÆ 0|ʼ¤žõŽ [Èà óïËY&”ñ¸ ý¢Šmª'–4‚6˜Kß,<mÕ;SU7?ö¦íÞL*´’‹³”q¦ ¦ˆõ>Çê}¦U•ê•@?Q•Ù£T &ê“þÆYMcŒžœ)o©IN߸yžO£þ{ø=`GÍ°¶2]›Ó‚9—´1†Îx¤Îs_Ò +¸Ú5Ȓ®ê@ÊCJRq„õª XZ?Ý&MÛhEÃ酹mvñÄýC“y@·©O™oÑÛ±µzö¸Àüï´µ ¯Xð b{g‚"Aí®¬&àÙÂ$ÁJN 4@{à@›‡ßfKd®H Ó×AŠF³Ñmeމ¼ óÐUÝïgúÔ0{'4}Â5ÈL謅É"GE¬F³q!7k¬q0ÆÁ¦ôywb þÀ¢Ë|B%ÛU=À3´—å‚xÒq2Ãc5-,¯ìlã(r=Œ­XÖ¥HŒkRh ‘GKª]ÖïÓùŸª/›ú@_øMc`¶£ÎùjYã¨N%Ç æ¢Þ‚µ˜gŽç}ªÅÖ •Qgþ0èp”‚·„Q-ê.èah yhQjIæ¨X"PcP‘pj‹XPiå4†ŠŠúƒž„ËŠè§Q“¼™ò¢ŠÖ°ókç±s¶XÌd±*Æ«OËà©}Ðk„(0/ÁŒ®ô·C‹ C£/Ó¿=Tb¬ ôáL£bl< úÖÕàx_ô< +>«ïd 2pîE3Wzµ#{£ç=V9èãi„(Ý£´ØëÛEcBIAk,ôô ÖP&QÇi—]פVaׇš?šÐL¥ãðgë9ÕÓ&{ÝPÃlÙ£…«€@”™alÁe~ÚСñìӃ¾E`þFFÊc 1Ì6xæÆ$è5W^²°`1“E®Ú*〴À4ãÄQ+)+¨›‡ÁÈDNë·yª†ÌݐÔ#ǏØ.“¥×°»& WI‚f4%ƒO´ Á’§ØÐ p5ê†WaÛ¢ñ–çܙ±7M­™>8ŽðPätÁ@ 0´ øv@p³¨Q¯Ò¸è`2xšjsdfÈQ8ŒI4Ô>–ÃÒC~C|o胲°`¹)ô6Èl™§€¢Þ‚›# •Ìþä÷q³-„$Z6•hØ@>7ÍÙéᡘiöEDáhVG ¶9Ÿ³‚KM jæ˜!,uó%¶wddNn‘¡ƒ9ü¹ ¢ÇFÀYo78¿{iü>š™-,„O‘>êg‚‚Åš€Óë|„V¢Òh2ŒÒ`é˜ /+8ߘs†HYã5ɾM ßÛžßn?€¹(àÄP ÐÎdGb(aÒÃ6ÌS ‰­1Ûñð½eë ê4˜9ÄßNϪ™õqûrÄûPÐ5 VÊ11õM~uš#€™iJÐi™Ê‰‰­Wé_?ýØÛ¤,¹R‡âÂÍTßki¼_“RVèøXôO€Á«t AsôÔ{ à)\Áä!’QÎÆ}YTŒ66!­øñ¬8Z -íš_,üÍ"»̯u¸LV+-yø›pÈá +8gaªì° ÉÄÖl€¹qåƒxçÅáϗÁ˜©*ě)­ò‚.c/2ç „'äéάù“F¿îyŸû‡êqY0Ðcì.)ŸûñVʏ™•t8ˆu™Yõ˜Ð›ÖÀ”¦âÊ"ÿ30©¼¿ +zXýà 4¢ f-ŽF,Î`pCE¬Ÿ®›Ø[§ÆV1ÕI1Ôòáe£¶hŒ•„óûÊ>õøƒëÖåF©¢Ӕ¬ö³ô-´“Uo–°Œ æ5L„Á—˜OQ¡;¿ÇëQ)ªÜ´Ê°x h^„Ì ‘³¹Ý©¨P¾Ô­®‚ª/ÀÙP ‡T®Ä[L«,3Ƅ٬§!±d©Å»÷ÀHçÝUǪ^ºKÍõ’Üf ‚P䖪W×Â(f—•Çßi¯˜[VƒfN’»¼ª¯,`¢´ä¥–¡N_8 ™ôA6UÐ1?m}Sq¤àèrÞ´Ì¢”.¡DcÇŸ¦ç7UÊ žÚiP 7ámdz£—«.P©ó) î•³u÷;u]G¥@’PÃVZøi3¶Š Q•ù†¶ô/Ä#‰ ÒUJ ½„Ëë:²n“P¨Qóž9\i»ÿ¨Ú¡Ä ©È<»0™?}qv™P"Dƒüã Ì°ÐèÝmúüͳÿóg9ÛŸ£ýoCÿ>þ{?ô ¬*¤;Èøz¡?þq®ª¢ ü1‚Ê$*îôã{(Áðc´¾å‘Í>†O Õʎ>ƺ¼ß}’±´E1a€±úçàC‚L䡱ÇøgÔcüÂ®ƒz̝ä0l†#·@7©ÇñÒJˆ—xŒX.¤â?˜áóÝpÇÐ~§rOÚ1ªE/)D(H)Öm°ãÝJŒ/º¶B=QÇå6b÷ —1éL~º$:.Îş¤cfúœe KAœ¤@ǏgÚt 9¨°Bæ3 _Òâ# ¤aÇ#‚ÊßI9f3§^ä˜ê€ÜßÇeˆãG Ð 8æßõ oLã‹nŒÃäþ,¸ñcÁÛÉ6F÷$r<Œ6†lófÑhc,ìĜØÉÆ¡i`ãjþ÷äW•ÌTc¬îg1ܪÚ'ÒÓô•Þ€ÆœÍŸ±xÆ,WKi­­›?‹h܂"ž1ŠãÚxΔŒœ4cxÄJÁfŒÆ@w*‹e܊bOÊîõ%F¶œýçå™Üc‚Œ‘ùG¦þ࣢´©ÿ£I¯¿ê÷‚bŒ¿S;Æ؇…ßB㸨=0ÁÎê,€q¯Êˆ¿5jn_ŒsÇrЋ!$ÃÕ¼˜%Âøt^Ìœü^¬yR­ƒŒì@ú  /–äÍ4ã o â-iÜÔg²‹ù7•—ý€UIY‚]ŒÛÀN°‹Ñ~ +ï]ŒË¾…ˆ¥Tök£ sG•ÍA.–µ— †á‚†¤N`Ù¥1ï@ó½Yàbº8™n;ÕTóÉ-ÆJ¥Ú-肪%KhQ”­Ì-(ÿžÄb®^¾d‹G·ÌkçÈo+pÅóPЊq8È+† +`³Šñ\:.“âöQ»‘ŠÇ­O%@Å|‡ð%‹SŒÉ.ò)%k± ?CDß ?ƟâÇjŀî€F1ØÐÚˆâÇQµ £ä¿„bü}‰&º…ÈŒ|bªçï>ñÄð*àçïtbbºRŸpâªüd ‰aGZã@³Ä¸æ C:…úëЩ|\bäk!.1rMµ +Ôe3XûI%F ˆpÌ +\„ªÇÌ$&þnâ]¯hN ƒHÌÌ +ô•—"ñÁ#¾=nŽao¨vL#†Çõàã;ä˜Y¥ÚcdOJ"~wåVÔÓrfLâ=×DŒÊȏ„!aãa ҔôKÖ²SˆÉÓ`}£òL +`Çۏ²þ}U?Ö¶¿Dâ¿ÉÂO6olç³d,J1‹š f}És,?vø0Šñï6&{Uíº[,ÊTºçƒ¡Š÷˜á‡]ƒ·¿(ð; Ã€Lc– +æ0þv¥%# ø›¥ª;qɐ18̯U/ Î?wÜ0Š1_møµò"õ+`ÃèÛy«èt±†‘s‡“¨a€Œ«;™Ý>ˆ8@Ãðzàlgc 'Æ ãßñ0Êð#ÀC0†‘°ƒãˆá§Ès†aäGæq +#±|aŒ*å„ ÃC#ŸÕlah ñ}Z`pI²0òŸ„†´RÎà +÷¥8°ÂÔY\eR…¡y0F”ÃÓ;”éd +b ![ …¹pÀٚ( (?î( ÕÜ]ò +“øù<“'Œ¿9Ûí8á<„÷ špVˆ1XÂØç~N’0z^âÝ6HIl¸vÁ¾-p=0ÂÈÝe±ÙùW1&¸¾¼sô1ÝÂÕ((Û.ê¹á› |ñM¸ÇAøõö6"€pÕL<ñÁДòF¾Äá›ð`WNvð¥lê‰6Ñn’ƒq‹Êâ_þj0=¤Z'4êÍ[½,U“W¸X8ÁÿbޘÄ`$DJ]Àà!NÓÉ ¶ö;pÁ(*“œ­#<&^äTñP̍î¼HÁtëw7PpÓ59ÁUɉ Ž¿Jp<0þüUúJ"8Û±‰M¼v@ðü{ç‡1ðÀ¨pÂq'دÜÌc—ÉjM /.§õõ.ååTBøâJ ä‰¾(r»û‰Æ÷*–µÙÀßágE¯5øbqºO80Êa)s 60ü°»M40ÓÏs’”„ß`à×{ñqr¹¿ß°Àh‘x¥I¾¨0/yR1j0°rPqKé¸ø"[Š;.>Þ À"•¥Å¾ ì $0‚7w?‰ÀˆQ#f@`hz°¢1£_–‘A……RQ„0Ô}Ÿ,àì^F³â›h©ð7<׌ÝO›`$»Åe²õQÐh§Ãqñ,(À¸ÕÒs+ˆ¡$‚;8Œ¾Ù!:M0ï +Á%›¢(¼6†Rƒcðñï–îüßÛ¶ÀÿÞ®qú/òÿTPmxDu#bö/$Íý ¤0ý½ü ÿ#P€1⡾#˜¾" ØyÿÒÙ¿—‘yï üàßi4ø÷ÁÔQÆäþ¾»¹ËF<Úà³û«F'-Mîo¢~È\z®¿ —͙‹ þMÐ^Qhà_lG _€ÑKóí þ¥9™ñ.!1ÊÉ~ ðobyä“ßÀ¿i S~½'–hm,î/-=õ7î/˜Â{Íý¶ÕÔ4%h¨ôÈõûKüÝÇäþbϛ¼àþeÛÒýÆý¥™í¿‚û‹ÿè­.ì/ÿ£–ú†ýí÷¾ö—ØûXØ_þSò?-FXFî]ö—I0¾$ýå"îÀþ"S%Ö°±¿¸Wû1öW¯Ôö—º\õ—˜Y@,‚úËöƒ‰Îú‹_èÛ šú‹Sºˆü ê/ +ÜÇIýM9°‚Aý¥J+»5¶2XÔmüFýå®,ª&ƒ¯PaI=ôC“úKZ.hè/¢Š3õ—ñÅú¼A™¨Óweê/ÃGBQ›ú;^ÿφ8õ˜Šû™Ì_ð'sj ù‹îd<уø +SeüåfõY¼_èö;Ü c²~ôR‰q¿¸N9'îw AûIÅ ûENBe%;ë±È˪0¦Ü;u7‹ô‹¿s~Þ@¿kÎEùív™&ä—Y“6Þ¿¨_jZˆ_ÆænÌÃGJ å7Ä/¯:_i1~ùøøAÎ&r·"Ÿâw¨&Ӏ_ÄÁ˜o0àœ³ó}aCMà}qºA¦û’‚Šˆò÷MT\uÂ}˜wjC- ›Ö‰'ݗƒZuG5•" ×I÷åÝ€~Ð}ÃGP)è¾40ëå X!t_åJ›t_%hæ[œÂ}ö ûâ´Ù "辬2B!iÐ}q)]:¢÷ewŠ¬‚<¥ŠQ؁ÏÎt_Þ îx_Záaïˬ=‚݁÷…©‹ï kP«jݛ貁÷¥Ù‡ïKåf{êÄû²» Ƃàûb4ÁúêäûJË ’ƒÁ¯ÜŒ%¡æû¦ìdÉø…•kŽüJò©ÍšFi4i9ø¾0ÒÛ¾/ ߗ,èÀ/Fr±‹ øU} †AÛxŒAàVVà7‘ÝzßðKÆރð+k“ð˱ú҄_Hß?¿ìak~U‚šv~Ù6K¸¿j¦ö”IøE"NéAøMddŠÊ»¿z–&â7C—øåß|¿wÄ/­%O¯ôâYyÁæK€ÿ¯âIé*IØÖi¨0’„_i¿¯~~éÿ=YCŸÄªh¢@w'¿¨ Ýídüœn}Éø…Åӗ¿´D¾s1~Óì?aÄ/yP-²€fï@üâBåŒ◓5=ˆ@üÂbýåø¥6‹³H´5Á +G lMøÅÍhlÜp~!Ò7ºØ„_¼cO½ŸEøM—X'á—EBtƒðËÞkJ›ðKç]-6ÂoŠ4ü$üÒÒ¬'é£Û¿- 0Îâ{>¿âJ¤g~1ð¾&þ„_½½ž„_ZñáG·¿$üÂÀ‰ë ü2ß…XAç2n>¿2Ôr~ñ{äíá—_ÉuOÀ/&«ÕƒïËLßÓêäû2MšÒ„÷b„ê +À.Ä/†;ç9ia÷ÀߊÁçºO¾/Œ—A¼]Û0Ã#º/DÇp2w¸/»*ŒÌPÒ_¼ þÄhq}k› 2›á¼fö¢³03חÜ>¡#ûâyÏø{ÇúN›±¾ÝÓsðzÁ°Åòö ú¶GQ깑IÓÁô¿w¤ï´™èû:ÿ5‹‰¾ýRÿэçÛ=dÏ·_ú狿qSš/vâòÜ4ßn­KÀ|û¥7ù`ù678 +”o³8H¾@0 3p€|Iu-÷äøòoÁB¼i‡ƒâ #Þû€øâo¼4ÁðEPœßáÛ.'GðmnM_†Ås:¾Èìá܃ߋO%äÁïmÑøaÇ÷ËUÚTHë¤R'¼·f ãwv/m¢3›}Hƒ4¹4¥G½í¦ܱ»>“Û‹ü*2âÂö‚9ìÒAí¥æõ¼†ö"c¬6‡bö6/-d/{ß²WÄÞêuR{q Þ¼^ž ˜fÆõV¯ƒÖKDP;¬—Õnx9ÍêeM”JFõ®ƒl¤ÞÙ½Ô Þè(~ͯۜ^Ð=ষèÝø](ì1ò^ˆÑ¸Ð‰^Aè%Q ɶÐ+Êá>/þ¬¬MŸ·[Yqàya¢ñÏ u?â÷AçnÃêçEÝÄÅ«›«W6îpõtü½“y§Í`^Ðr*A5SÏˁåfí•Ë:5§µ‚”®ôw*/¬j/ ˜…(OŸT^®V8ýïT^"§Ø¨7ü+Ô5¦òr Òýw*/&;†ŠƒÊ 4‹ãȲJ¬¢ñð&/–]ðŠƒÉËsº´•ê£á_tStWÁ|ŒGw€Ý 5 )ŠÚ}2yåaä>™¼0p¸ &/ lv°3yé¦ñäÍä%ˆt0y?8*Ÿ§óÇdò2X‡¢ˆƒÉK+³ˆfò*„—ÛDð20ÇrНÉ˸ d3Áä%7ƒ‡“w½’—ÎÕ yç +3jYa#å@òª1¦<"yiÀi—>¬ +k–#zhöG y¿ð7«ígå0qyÁÂûD^Æ°v "/ƒ$˜K"ït-Mäå iQƒÈô‰‘8ۉ¼»5»7ðAä%%ƒ×Aä¥Ê¾ø*|©È©M"¯P yœD^*©]HKùÍ@cyñ(¹p:ˆ¼¨QÁê4¼(³"ëZõ¿ì7uâx¡¬ªúézçÅè0^F©ŠJ'Œ—•Úó¤ñN1mÐxi`G«½ˆF²ô$QäqÃwC\Ë¡ù ñ2$ø>éú)¬3l3Ž—Á¬”N/¢=¬ž4Žˆ¬AdD#¬QÁxQBUŠ·!)ÓÒDñ¶ßïÄ ÛMôŒtý¬6+}rx›¿‹à •ò¦ðâOô5/Tj˜¨os۞@ð6$Pó3 ¼ˆä 6rx›ƒ­Áß­p1¯4ù»Õ±½¿ È1%ÆïV ƒ¾K*T;Ù»lՋл•QàîVgìn5?(Š~Ñ ¡Ÿ îâÔo5_Ð]ö¯FÒÎÌ]Ö¨§>‘»ÅR¯ƒ¸KAÀh¸‹’=o Ñ'¿ñv±Å'¸]¬ А*h»øNüۅ +áý`íB…ÜP v†-'g¢ˆnf÷A}édìB‹ƒ÷Ø…±» ìBøM€r¡ñ1'oÞ?EùÀë>ê9ºíó:ñ~²uQJO™º Õ!Á 뢪†’í¬ h~(¸º›VAXT]ñU÷ñ¤P]œÉm8ßL!CðŽ¨ž‘ºHp6v᳀©p«}Îààz¹¶6P+$¼·ÁÓEU-\Nw$ .îÌ0]H–É×Ûaº0bØ –.kŠF™(]h°ìÛIºk?Ïé‡Ðƒ£‹¿ã‡&G—‰Ë‚­¦ ¿¦pctQëØÕAÑEýb¹Ew¦Ýá8òÁÐEVB¯IIJ“˜ó¡Å=+瓡KkW{AKˆ6Mc2tJ‡{{@tÙ*±Æ€èbÞgØ/ º4 ηCt×ÁjôaL|9ÅAÑeÑ‚E®N¼ʘÁs‡‚"(º3_|Pt顱·R[e€œ‘£ûÁ³[A±oŒÑÎu]„|/ƒÙ0,"âÅ\ +N‚.j .wCS]܈_æçb?&s|.+7oùߤçŽ@à—±9ÆØx®*#JÞ6Dß.¼ò“ž»M;>—>—y@ƜG€~†Â!@D3fÒçfp60/@y¾,@ÖBÊ(ºà/с‚.RF A]à°v ‚. tó‚ K®A—L¤¢p5gGA’&?—{±ìgçç¦Ç¾]ðsQÌEIðsÕþ ç2›–äSÉÈs.rÔ? !!ß?è¹°êÇLÏM„ÝcÒsi@8æ çÂZðÀƒžËÍxLÏ呓ðЋž‹ä$Ǻ çâùRXøÜi8ø¹Ëj€.ÏøFqUÔù>ºHêÒS››e/€ » ;@wZ ›Jƒ›d€î|1„.³³ctYpn-°ÛÇ̃u #bº¯ÞZnñKÉäÛ霗ç>üšÀÜ¢"¬¼An©€¶ÂŒ[pPðq‹»€÷ë ÜÂÈ®)܂‰°}ðmo'^¾mko‹¿2Þ"ÈpÐmqKà¬Üö®ÖIÚrsp mQÅz8••ÜVØ5Vø®-‹°oÑF!€ Ú"iZÛÉ´Ív‚i‹¿Ü ¤-þFú Úæ¢ÅßÚ¿@âÙ>€Þp¶È°¸¤Ì4öDnÀl©cèÏɲ}Јì*³ê s'¼È Ù"ò„èÃA²,»O d[r›Û¦Þ'ÆöQx}Rl“çTCl»ôÒÃVui"l;ßæE°í$e¼lÁž üÞüÚ®’Ók»4CoìZÉ~&º¶Y¬crmv}ÔI®­âLp­e±“[Kó;¶–ጲ¨µšY&³×Tߘµˆy Y‹÷–í!L¬¥Þç~ÖÞòr‚W›={®–µÐO9iµÐÔ6YµX{O¨ÚªZ“7Tíë”2Iµc‰)@µZ÷”|‚j%¦ÀzÏ Z*ÝÁ[J—‹¥Ár@©–ÙþGVÃûÓ%ê¿iH\ãoï}cLm^êNR-„ x…TܪàÔ"™F 莩ÅÊ.VPjQ1w6 µëF-¨!½¨Y + Ö¡7ýóZ}ù. I§Â‚Ëö¤;8‘±­˜ w eÁW!u0¬HùŒÅ•¥Zº7¬,H# ûU–è—#çЮUµ;…ÌíZ…»‚Þ]ŠðO¢ìË JÖ([cž@ÙzE¥© –§aGÊ.£˜²Õ<œ‰4Ų“ íƒ(K± 7óbå6Ù£#R\!ve¡´W]µ²”ç;nˆ[‹5L´[©L¤™Òíƒñè=àˆF—§èO–ìcÃDÉ"džâ ÉR¶Ä¼óN’Eb«ŸÉraå­PTKX¥sÌSý‚©Ûw€µÉ%Kˆ51²X¶(&·Sd –ì)¯;ƒêÊ͐-–'YtIԙ;™§ Ⱦ»3Ÿ¿¹ÃôÙ¿A–ݺ˜Ĩ /æÇi¦ª\ŸÔä° % ³¢«‚9ËÍî=áÉú‰n¹D¤#r͌o5¶ €íö¨) áUiN|XPfCá)ÜR‡ Öf÷”»CA1̄¢¥› å涧¹ïŠNߓösKÇªI5p|q^)‹!ù`¥€ä$¾ðHø@à•Ý‰œÉ'¯OÝZ"_Ž†‰ÝÙi\e°ã9h—¼tž›9+r”È­²(©ƒ@ ;#Ár§mWŠM“ë,`p¬y!ÙÔ1ð>›2`Àf©”3`EøP‡dJQñˆ¡Ï`·â)[‰«Tä§H$`µ—z;`YU)Ž~„³À‹í‘°A[ë›#h5¨ ­¯IŒe&._Sš‹/õq‚Ð5»$ŠÐjÊrÁ{þ›rZÙ®ý‰Á‚“¨V +/X¸RâO²?#,5êäÔSìÖO²ŠÝº.7ã¢*7ï93uQ ÃÆñìj í¯@7UÚ[X¤*FĽâ 'ÔúŠÎt +…ø›âŽ¦Ýµu¸|àÎs4÷.ÇÝU7³†.«ó{ o–4ÏÞ"»rF +…•ð$+À’»ž\šL|¾\¨ãÁû7PyyÝ|7n¶…ìYÓ'ÚBn—î8šÚ\ã#‹’g¶¸ìÜíbøxXǧ¸$IDJ_F/ÒҚ6d¼Ã3 KVóÊKóÌô)rhA 1³4"-³|%<þÃ,É™´Ü£¸ð×Än¦!+RD„ê!ö§9t ƒÄð ]Åf,¥jVKLE= øà!X€…}$ðˆ ÐB^À¼. -|””ŠE{ÙÃa]QW+–éx ")±Ks®¿52ž0SŒR‡…h n( òv!Ðß=¡s`&Vʁ B úÇ·x{±kT¿r!žÔ¯Kø×R€uöS[ìw=nà27DÐV2 £fSLáÚô/‹„Q–v¹Õ‰š˜±K\v73UÞ·$×>áË/êmâ5NÒôÒ8p×9͓­ÙtDÙ ¢&XX&Çm¨ªFUQkS VdG³Š‰põ|óW7KµoúÒ,JàÅÙ´KªæK4Ga^lҧܭF³t§`UGìì{²Æ ÜÁ"ÒÜSËm¬yÓО\Á"Ø›Øw=NʾÔnYû«P Ú¥æ`\ \ْËæ”ï¸ô=w%·iá:¼u7€‡´YÍÌ W›»ê2ˆˆ¿ôªþd7 ®F°êË³Ö - ÕºÞÚ¢÷ºqÕI¯Ï±äû‡/[QïáÐi‡ã%Û¸zÅÚ +ï +ä,+À!í~4R©çis¨41é—5_‘JåaÄ~ôã%ïÉXæɖ’Ôy`v'KvÝuº#ñ²p|¿Äá®T‰!†¾¾›’Â{p}^*&ø'ÖÈaýX²ï[ÍÒ=`Þî`Ö¬×ç]4„2-¥˜[Ûâ„XQRvmˆvŠœ,[¼×li»û¸SږžµÅ>•£8Q!4Îüʑþʯ!² 2}˜4M äÍܕAtsnaùÔ£¯”:‰ôX­¼kxŒTÑ\.™Åƒ&AÙ"å~,s7œD·—Z´[QöBàH=݃Ø%0¥/±F`Aù£0?¦J+ ƒP7¢ Û»‹‘gƒi@´]–…ÈKT(«»¼kõ˜Ií‚T‚’#SžÏ³˜–[eåÞsš]JÈ8/£ hÍÀ”´ r#mñ‹~ÞÚÐ+4úY¤L.‹1Þ3¬ Ýdò'ðõså<ß^ aàuø™6)iÔ´Y^È4’ùVX’¼kÏ¢ ¸·®:ÂkGoPå„ï€*_XÊbõ¨ª‹‡^ÝxPLÀµ žèAa££Nå~W‘„ÛÉ ³\ãw[\v÷9^©A§O­»µÍÍ¥ Eøá€N¼"6øFs2Kä«áD<-ޕ*vîZf`,n8–—¦2SZÈs@í(5}ؕá*Ò]Ö§–T|(zßÝëPøm”jçæ¦ß ãÌe ԍÕp/“5ñ(h ~¼õâ0q³J!1zb¸T#¸*î8„zìxGþÃòß S/¯›ò]$K»F«?fÏ箪›€ È.зß$úŽŒގ‚§çñ^Øõƒ.½SÁ/¢1Þ¢31¤i& ‚*YJÙüå!jᏲÃÉýh²À†t>t¾økàpɌFyOWýáѳILF-¢’ør…2Jî„k€kWÆy]ɧ™‹Ñ?¢ê<3½œt+ÀÌ÷Ll‡¡œŸ™(r^ê%Q9,½„äf®khF$µ{AÛ¬`à[Ï¡d¤µ'W˜03âÈcA^ ½Xþ(䅲„†,³9 ¿%)¡Î¨}~åˆ`oÂçà†3:?ŠŒu¡(Å%žA¯›$KZ8ü0*Ž‚D²1€3©T&?ÂãÒf,5—µ'%\°2XÈí2?æÇüËòZf߇|¹ç}&G¬) ýðsQs™äيOº…6ñí¹ ÂaÙӚáS€¬Xõƒ&hOÖ6×8¶œÔ^Fց ¿rf`xJ‡€©²{O—2sîɺ’LWñX;i°8ÝeÍ,uõ #ä™&DH(F¿dÀΛõ(9h])nÀ£=Y†ËǙ}§è1±Sïu+þË8É +DòE¹ W a¥œ*ù6—Ób°<ëㆹ1;ÐUQÌc)¬Þ9=0WºöÌób³¼×ãˆ:?g¹0îð!*C¥Ë̆Ì1ÏÅ‚Df€®GHü“Ú<Y3æø‡ˆ‰Ñ]£„3[$‚i‰HC-‚ÞEs¿µÐ.8VoڐqíÌFŠ=ے·¯Œð8Þ«œ†3:EÍ¢™,Å;-ŒÐõ¨lÜOԎ:Jèøm ‰Fa@ûY\œAå¤è1áQ‰$«Ù_´¸ÕݲP~¼€p›Õ\3zZÝu™²æ¬ Ù†Û°«Z€®˜?„ò\ah±ÁÎPê®‰'©Ç¾rBÁýL‡×Ó QÃaÈ´Î.îÍs`á 7wUƒÑ¢Nä¶ ¾¹·“k;×½àÙ©ppZšŸø…e.ž—óö…SÙ§o‰jåZ³¬Ãºyð'ΘÝwÿ{˜©»33B×ÕÛIŠ®QÝÝBTYf”¾ƒœËà“¡ÌÄ3æ‚ɋ2Ó0àæêIá ä\Ô¹(â;´ø|Y’Fm'lè‰&N ֛ú§dR¨ µCS„i#5óžK'¤•¢µr¿`¤0ýI®Ú­ÓU%ŽU&² +½I—BZŒÎ3¹Bv ]÷øÖI¡ŒË„ÔÞÁ¶¬Ÿ¼ÔP‹)&P›_Þ¡žç·r9 ¢ùÅtôe +fL^°(V˽ïêÆ·ú#4MI´ÖI!lVéÁ²'X«;•ÛÑ46òf”,„ä죝…ââۗê„ÌÞЋ?Z¨ÝƉ±¢½b&ˆ§çP–’xœsü€…µïu,êÏ3÷¬ÑöéZ°ÜNÀèåݏ•¶ûë¦ì›ž›Þ¥Ý臤m@ ƒ®”Y®GvÔT©xÞ_ÂW)o1#{Z<¤÷љŽ@ݐnÖ¬â¡þ…x®gbâ±@î§Ñèv+¥ÛœY˜ù瞷ñ»b5 ;§äö2F‰rN?ÜfŽcèXQžæçÒìŦý›vCvLJ °yX¥Ê¾3Ãagf³€n¡ð‚e¼Q‡iàQƒa®okR‹.‰uB%θlj›„ŠCdDa`[ç aÄÌ`›²É¶ÔÂ;‡s ê +fP(…T"#;æ€Ô´å¿“ïÉÈ<©d”¬±M†ƒCó:©Æ„Ö€ºE¬$y·^¦#–ÜE÷ìŽ.ñ43çÍÊ~†“<ZJ×qÕ1_§’Î\´Ð‰„ÊFqáË=⨻¹ÛÚUž`à”(3f·•Û5t´$‹µþ>".7ÛÐ!;£`Û#½1>WR4‡c-1®S-‚@#aL—Wʄæ éٕɸóñ0VÀ +BåÀ²—"X[sl!eàR´é¡R‚¨x¨˜˜.U@u­L K3̌M8À–޷𛇗E½p!I!vü$‡|XÚ\xR¬_Œñ:/ÂÑw"›ƒ´…—˜e°*v„B4¶DCrŠ•(ZåٻÑfSTZ’dwK¨WÈáZÉ»añCRÿ×Lê> KÁ¹«·-ôšY;ÈLd&Äfî(4àíxq…R–`IN@&gqmŠ5lnZ­å¤p´8=@Ý*e9…° +;²5RIþT¡%~”;”H¾9”Š‡²®¹hÒъÞÁe°M¥ÍAJN&yzs0s*-Å׉Ÿà;ZJ8=‘@†eå)›À%ÌWR±[”j-*A©y).ÕӅB£—=(R‡õåh‰ ü:ÁXì=ÓS™Eâ-ú÷!ÇI9SsÅ,êìz m9÷”¤E{@¬+ÔÝ5;I!k¬0—Æ+ÉߞV¡[¤gE¤?®°•ª˜µãKí*÷æâŒëŸêZcÖ1hòɪYÁSۖN0£Îf)ña¶H-…¢¥ y¾‚Õ¸KšŸGª: +ï]Õ_™‡_ZÝj<«‡~Ìzžl%PshŠþ$Ÿc¤_…4“EÐS«ÒT»¯Ð +C”ÉOºÌ­Y…;:&QhEü-5•ÕwAAu©•{êXR­0™:ߪb}º+\i(¾}· éStàQt«Z–6*Õ=Ýåa!‡v1ÔKýb*³½ìþxK™?½O©'îÍÄäO"àc°8KUTý3weY0Ì\g2SÀßĆLzpzў\ÏñZ͍Èf†&Uóü)¬gç^HÑêTÊ€Öõò²k_ž]0!IR\¸ú ¬}I਺y÷LS\Š›,M<Ðs¹4÷Ïü>²;ú[ÆÉø°‡,v]o‰G°ÉT—Â*ýs3I˜aÊǯ‚zU“•Q]”1ã8뀢fØGߤû@Åqy^‡fN\Tyl4Ó½gÖ¾+ÆD=Mfkâdi×*瀯)YtõoÀ-’´?ê˜ôî·®¸æ7ÆNÓ{a¯o`E ú1Ì]EM#<½¦e6-µ¸ +EÝÃǦýb|²ØoS;qXj·°P×Íj±g™>ÃgϜõRF‰7“!VælÃbǦª…ùÚÎÁzÖ¼im‰ÆªÞwŸcGRÎTÅGKM‡‹IÌ$ _¬Ðq³Ï¾xš¤ú<¹–†-YN#µöï»^N«&‹®hyŠwiQråSR/ë¹ u•`s¶ÿŒŽëF¦UŠÉPúbOqU”ãª'YrÅTíð#m*™2À~>R.ÑY4FÇåvˆ´<~Èp×^Óڕ<2š)a59krÀb׏ޮãÜî ½Å4¤w¨ êaŒÆ8ŽÓ]¦¬‡â½$+¥ÙÊVeýPv‚õ8ÝÂøSêš:ɀ7$oÀ™†Ïñ(HÂìj’îÓE¸ÉŸéÿà +ˆyƒ°,҈|»“8‹,äŽWƒ ­gëJIE#I¹ëi†‚bh”HÒkø½Ÿªœ?•ä¸!‘7aÝoö—¢ÆRˆ(ϵU|hH6Pǽ*Ս(åQï¨ +C>‹G¿á¦\ÍcÂÃ%:ð%AÄ«vùbeùb·[ÐÁüèÅí~TT-ܒºJ£“ÆV Æ#2J OâÒnAü½€2”Èmf_zºÂÌès¤+ènq¸xÖR¨©tvÓ@ø9”4Ýßé¡Þñ¢]à,VȔãf§¼h¡N »2Œ»RZ–ˆ˜ ™ BŒùxCs|…¬ +O÷RJ +Sh7× ÿ^³ž]«–lÉ +ä¼XHÏɛ׍#K)ürÛ¸LDì™tn*ÝnKliYÃklfªw2ïÍ-pò ¥M™1Ýe®.:‡(I}¡×òÊàÛ/>XHÂå#Šsð¢«t”]‰Õâˆ\!û£`}ÈÌ&TçÔI`›4׬¹8XÃ'éáF;"ç¢jXIòÄ¡u=ÎCt/ÕùR™ÏŠŒì‘éŸBÈÐDAˆ-×®ÑJ(~CçÔfÀ™?ʌT2Í +¹ZTÁÔT–¡¬7 —ð°uÈƸ2D æjô{DpqU +Õ|VëWcó +²ÊhØÜL]o%ÖT®ýĽëéÃìŒ:D?ñêÞ7¸Ê6±øQ¦»£a3fçÖ¹v+cðu_«‡Ãeïâ&ºÐ꙲(\-ÕjÐÿWEª>÷N&ÈÂr©¬Á {٘ƒ±N¯ÚV€¡ü\Š’ ÔÊT'‚E¯AˆV0{³V¼kˆt`¦Cˆ4bÉ}v¸ ßx(ÔÒVÍ(5Ìž~!ÛÀéâÆnL5¯|1ø?÷¥z#¥šQÌ¥ ¬_46Œšn÷òٔ ò7•²Èâ‰à›Q(út1©èõï#®©|Ž0!ºF/*¼há g×NÌ]E‰Çb&Jä'Ð/ÝÐT¨VÓÔ¡Ô'u  Mvâ•w”‹Ró2̛×å@lñׁϫ™ôÐ'DLY…Ëß?jVpe­©« ‰Z HXÈ'bSFiZDL¸ú˜©Ã!ãÖu³ä¥ÀóXMÙœ›,êBÃä”긷&-. +~¢¬ÉCýçx¨ªëÂ%0D–H©8¼L¹ƒè%o‹{i™œ5f\b §¾˜"–n„Í<²b'+–Úٟ «¬e&­™CËö&%G¿kÎ֛¸Æ>zNƒ&nç.t¥Å½?8HPI„þ&Dq€‰\9¯ÙÅÌå ±ëñ5º­¯6¹É`ò½ë´Öž-ÀÄràÔ h˜ „"|V.Ó²z½4wï.KmR)ÎÝr~VÅhO?ÓèÜË +Ï[à(}¨5ðйò-­(\KµÊµYÔf—jy«µ˜¯w6­º»ÆÜSe¥0«„­ +ôRÏ¤Aí'š1Þ³U`ŽNŽ"O¯J0]Pµ…„Ÿ)>JÖ²ºb‹V§IŠkµùÅ׶§<QeŽ fÆîP€àt©Ìâ‡NÝ`SÞbîZ¼JúïèkƒVúIK‘§U×lx#AÖȕÝ¥èJk„ÈÇÀbL‹vELK• Íº§ärޗáèÜ°¸h2±Ø†ý°ë–æÍlnºª.!,EҊx²#¤™g¦xìaEsóêmxÉ:Á‡­=’ÚA"<6«tvHD²cϐ‚nwó42UÝ9ÚqÍ=é +ÀL±7-äo¢éÖ,°cõy{ӈ\x¹L+Y€ sÓWŒ!eZ|¥‰"–­s;|µ¸½,·¤O…­Ãâ!¥™];7Ä샕+ƒÄ㪚¡ªöqÕ´±ì¡ÝÞÆ=ݼƒE“ËPÙÄÉ­° «a6kÏo«1Ø«†:c`=··™«2”|w™¡d\‘꼪xš’…[ N“{'63ÆX¶Ç–Õã?9ŠÛž¾äJDð0N¼ªñW½]êCPƒÁilj0.Æ&$+;!n‹ð +áËeˁ“ÁåÇ4BœÝln7É$ܒ¿Î)›sß݊$䙪çl߅ÁG°xU—$Ãg ;µM¯îPé¾HÈYuŽKpÄ¥fâjúü{7kpɔÞa~|«Û59z\i{ϥі?!yŸû\P1Ç>.} š÷ecý)U}o.ØçoîäýÒüï†4Â‰“hŽèë hŽÀyžørö]TåÀ™ßùߠ™߯£f™ü̃eŽÊÔ~ˑÊ-äñþÄ*ÄàqT/s9pÇÁtæb/°ãÏ¿ÌØñY]~PÇëIM¹„?ÐqKԗcgŽ?ö äøc<ïDŽÃ¼Ê…EHÕÄŽG;ØàSI½ÞŽgB$¹üÚêäm°Æèg +ç`#Å×'P㐫]õ^C?f,Ð8ÒV¬ô ÐxqjrÆQúXcº0ãȈ”Rú×(ðGõKÀñ†ûbâÑXïbÄ8SÑUŸeË,b dŒca¨WÅ|qd3Ue¼8\;ʺx®«NJ S<ÕM¶øÏqEl­J‡g@‰üAGPWš–ÿ +° Ë‚+G€Cè'D&)HNØ +3¨Ùåslq)ȃ)Ž¾ÇïqÁ p6s¼ž7 8²/|}ÂÊò¬¡<&aoÑpø¤‰#ߣô²aâE¾ÒD‰#HËA¬œ¯a`ÃqV;X>r1|QÄãÓ&D†¨îeî +v„8ԏ9Ýbàr9•@|v~x‚N|øñΠ‡?H'<ü‰®dÁž¼NÂ6|çj2Á,ÜfA q¡‡cE©”‘¹á¤/=„… ÇY=yAÃÁà`ý~0ßâœÙ ‡Uߦ‰á0$S.bÅؤ|Ñ pÉfˆóRŠ‘ÿÁ +ÂIP‰Žt±Æv“ÂK0^RÐçwNx µN`‘‹»]̑ø€„C@^p0‹¥ê~<þ „ß!~ B8ZÔªnӀpö¬µbñÁóp«ÂÀƒg5kœppìvë0«rﻦs“ÁPª¬*3ü±òÎL Gó²fqiÀ¾«ÚxŸPð¤5/®S³è^]ãMq¯Š ÎÞ³ˆà5 +Å¿œ5œÎ9à!úþ7—? þ?©¾8fûlUûds3“c”`@3Q»ùÛáÀ þ®ª©_Üïi8°ßÓÔïáPG°¼‹LmtšáaÍÍìOOâ÷2lÀïi Þwž•¯ûŽ×ò }Šʧ€}c­E=\°¾/F= õ^òYCb1±¾År(y±¾/Ö ßýõ}‰IqŠaßß!ëgö´iß 9h>hßpSªÛjH²V£·g+ ~ ¾±bgŠ$H߃>®dRø†X¸?½q¾QntÔ; áNցF=½x-æ”Rˆù¾ç±ÅÍ6ÕMB€ƒò}9*Ÿ†ܯd­¥ +*¤¤?ßÙ´†Iø¾³J3&àƒ™ÔO;ߢ‚[ï}g§Çƒî œºÄž;Ü;G#Â`{g·Šžho¢ÍêJâh¨Y°7Ä5´Ô?ŽXoø’ÒHâù®ëe $‘»µ:¡ÞÓå?Ðk°¾:˜Þ¼OöÚVQù0w[DïÛ5Xè-¸Ä8€ÞwÄƒç •‹Çç °„fÕxÖßӂyßÃG°¼§(oGyCEÇ,HÞ( a5P ºÁdâå$o®OîÍZƒµ Øi8HÞËj’÷3§÷G|¹ê˜\³µs¼Õo©¥ò¦ÂMæƒäMy# ’7>^Æ&É +›$o (í2Æo +¨X'¾S¼Ù9>+… \Þo„9ž’NŒ7Âr÷³ Þ+¬Ô*½y¢;Â{˜h6 ÞÃjú ðÆqÞéÝ£ÇÓ5¼›Á<™ƒßëà„tò»QA}‚F +à’éÝ$ߪdšðnD] úx79Ýašîw ¢wr7¼+¢M2p·¯5©Ý؋ïííF@Šƒ`v3âÈZæ`v³7›¿IÐðIìf„OòA»Õ¥KÃ#òâVÝ- ±›«*µ! ("ÑË·{°lÕ²[æ«·6t1¯Ý0ˆ~ »Ù܆ø€@vkÝ`ˆ·ÖÒwô;9ÝêþHX‹‘ÝŒ‡éÙÍeN¶²›ÚsaiÌì¦>]߈™Ý´ècؙÝ4g~l‚Ld7”•‘²[’ÿ¤RZ»²¾Ù--ÿå¬ÙM÷‘a‚€vã¾=¢~Ú­°ˆ b7‚#·Ýæ@OíV¨ä1édB»ÓìGcf÷ ´Lf7ƒ3L|Ìn\ªœ¹`vÓW¤2¼˜|YÀ{0»±€(<¹h„•“Êa‰ì&êŽ/ҁìVdyԅìÆGÄÏDv§ç :ΆìfсÔáÁ°!$§â@vÓõW‘ٝ¦Š!Ý´05È†mE‘™ßùìF&r +®”§)DåQá ‚¹Èžé²›f683²?AÕÚDvÉïDvÃL8ÏDvӢ중ݲ0é¶#»ñ£¤tNd7R¤o±)Eõ.܁Ý̈’tÀîá\ÚdqcdMÄÁìnwä‡mFK÷ÇÄîZ¢HivÃz9òÅÙÒN×]˲¯%Au¾gºkŒM±Y5èêDuWwJŸ¤nðê.G×CvÎC¨›¤ë>–µ· ™™Ó= §{YÍéî9Z†¿ 6–öî˜îö8 ?73g~Bº§á`t/«Ý-š¢ _w@7iå÷èF”[qæsàidÇsc?Îûçî!3 +:w¿üöpî Ô‚Í ŽÚEÍ à ‡©ƒÌMsQw‘†¤Ëá´Ò’ñ•;–FR.ƒÊ Cq™]WĔƒÛ½˜ÜíZÊ?¦I›»]M$7 ÔDn ïX@n„YÉ" w‹yãqYWM»et«Få qƒÑʒ‡ÆM«!æT `?aXâ~Y;HÜ5Öq#ô«ÞmæILùá¦6•mþLáF^qC¸›»'ƒ›MÂÇXîµÐAàÆ ±äèpó´0n·šBà·a w¿Ó·8áÛ,«,m±·÷ã,ôöìâäíy¬àlÏâo7ëÕ&w»¹UĤi£¨‚£üAÝîÕUs³ÁÕâDnCŽH­ÇNÜ]t,à6 œc¸ÝCìrð¶aåp¼mÔu0ƒ¸mPÅU·Ó¶QEÃ@À¶±ôfúͬíù÷Ú^V“¶AÇ©nµÈ +¶Ѧƒ³=?˜m,MÝÑ;ºSÁŸÇff­„"®G¹ÐáRzUSwÌ6¬µf +[&f›Ûðfs­ÂâÙfKMÊ6–Gjû¾C¶_©Ê—€lóÄx—²MB$öªžÓÉkÈ6)ìKm>ÐîÝ ²ÍÇÊÚlC¶ù~p È6-Š‘îm6 «P€ýê.01dû£÷ôyzVLÈ6# –mš•}5d[‘ÉÜR›G• ïm†Ä¨n +È6³Ðmà0ùÂŒmÜ×q›±½–ÉÁØÖ·î†[ 8G?é`lÓÂ+xf„´*r{2¶SÐm&c‰‚±ÍÛ®MbW*‘] ¶ñ +‹ˆmx….õÞÛËžÊ +¼¯!+##E•ÓØÞÌFl³É33Ø†E*·±MbãØNäŸ'•Îª=ÄÂxÄ6^a+GŒØ¦ÄP‰ØÆsèî@l£\ô´`l£nMœ{—¤³{Þ§“¯ œRQÆkà çtm¼.òäwº6ƒHÎ¯Í ’:¡{ ¡…k֝®-+IÆkóXOÀ´Uœ=¼xmÆEÙ¡$øÚxîŒ9N¾öèÁAßÛ¨'Šr]&sz02¯Íú¢$Œö¢k£ÍOÙØÚ‚2’lmtíèJk¬èc‹‚Á k³|±hEËÞl˾sµ±>rÆA +W¼œ¥Z ÀB:T»¹ÅØdj7¯M¤6€lŒmDm4â¸@mê?.SàzV;Ož6°hŒÑO»ÞÂ0N› 5¥«L›­(H2KÇÙ@Ú5µG»¯5 Ñ©Ytþ˜AQ\†òg;EJ +Æ¢¤!?«`h—îm2憴ˆŒmÀÀa9Ú¥)ªr´¡÷Ri°çÐö³þ;ðÙ%ô=%‚Yž ‘]÷yÒõÙ¹¼³Q¢,Ѕ¹Ù¸AÍÆŠ…¶3V¹b+è{ 9–è/;0ûq Êäe?îÁ¼íFÜæ ˞ —‚•]+¨lè_8‰¤l\.@ÙO´WN6jÌÔêjÇd?¨LösZP²qF·ñ˜+7©†Á‘`dczj†fÓ'z\ˆw"²áô+œàNox²¡Ë¢¢zçc£ÞZ!ÇQÇíMÇÕé읎 #ÃLÇÑÓ<ØØÁÌ<ÑؐIÆÎCL06 ñs ŒÍDËeÕCg‘ +™\l¨Ó"Xµ°Ø½E; c±G`NƒŠ="¿C±‘êÑKTg2 ¹OEˆµ¹x¢ûw@±ifà# Ø‰lâ4>M(6sô¹*6ÌÊ+›®ä×Aš 6·é.X¥•ëˆÆbâüV`±SŠ*ü‹­uÓ( ‹Í8]¢Àb‹a´ûÖWþ¢šÇ‹ÍijšÇE'°®æ +~c.6\68<°ØCÅàŠ ր:њ‰=¬ ;‘ØÃø$bà X ØÃ蜇Íêá».ö¦uP®½dô aŠArõÜNvu ö–ÉÛyØ\W¨ƒˆyØ\Õµºp،ªV×u.¦5c«Ôw›gwߋ†Mÿü÷WöTÎ2hØ´ˆÚ¢¶%»ìfÇa³E¥gÆaóÒõÆaOˁÃƞ†<‡•à‰Ã† VT²³ã°a¾ÕFµ…ˆÒԉæ×ÎGuà°éԑ]8l€.Tù'6·à£;pØ<¹û^4ìt¹RrÒ°YÃQy§aÓªÀ4lZª`°XñJ ++ž4lº¤Ùu ·–"®\š4lXT™qà°¹˜¾Í=Ñ8ÁÒÀ,ͲNƒ +e›ËëõîŠrÜ9‚‡­”3þéàa3“̽ÐRë+!Ä&”ŽãÑÄ&(H’j± ¥S‹±•¢)Rr. 6Å/üw±i¸¿®ê÷˽ó°‘Kõsˆ˜EŠ2Ôàacݶƒ‡MÈeô®PnIWEêG€°†£;›3êHç†Oð1ƒˆµ§Þ¤ƒˆÍ°¶pÀ&bÃ5•kHlD#h;Ø"Hõ¼ØÔ1꫌éJš$¶´¡õ^HlaÅ›;ªâlb36xtB‹ŸäµR±¹UFgá°%÷Âaóì™x +6bc*ý8pØ0û'‹WOOÇM‹À;f#J„ÃævºÆaóà±v6×Fä®O^¢Hó°—ábof±ñ +Úèša¨Ð¹oؚ;\¹aŽ1>ˆØ›e'b/s±¹*”¨ÀDìùîžLl¦ÇdžÄ&8€‡@b3©™]Ž¸ôŸ4ó] (6³š|›Åfb’Q‰Š-Q~ ŠÍÒ¥ŠÍm¸v>¨ØR\·º¨Ø«/YP±ëýy£b§ªž¦b3Å AÅæ×⃽k‘â𓊠oá¤b3fÆN›'¶W ,6-šè„ŦA¢ˆ‹ÍÇ Ng#ð}O4¾6qºXlâĊ;2ªü©b–Òƒ ¾º‹M- +5TÁņ³éææb3C´ËÁņ™ øÉŦ…+¸Ø´¨ýâÎÅæ)( +.6Ã1*Hq­®m:¹Øô…™6.6Ù|ì\lf0ÔPsçb/sp±9²`p±yãØáàbÃìÎ;N@Á"­Wp±¹ 5\›f>³àb uØÒcSYß°ØÔy²=°ØÐq¬™\l憲;µ,.6cäd›UÍcÇ]Ãëhjƒ¸s±‡q$Ó:›+*u(ö²šû…þGѵœïä‡ÕÀaÝÁû~=ŸN$öÍ»œ>M"66)Zˆ]=<ìêðËÄaW‡¦' »Û×8aØÝÑÇ ´v‘ÿBa÷xvWo…m7á‹'»»¸æÄ`÷HƒÍ÷åÉAÁ†ÚEù‘‚Lâ Á†c]p¥³Å|FA7MÀF +êê‹ÍdÖ¸ßð×¹F2Ïôk†»äjx¬ê;p¯‰Ç*Hìkô:¡BmžãˆµôŽ¾F½¾ _‹j’¯ïh~€¯!ÿB@:°×T?—{Q¯ª'òú~Âï4ñúŽNμfŠëêo¼ë;.»Fƒ×»¾?9h×0ÒE ØõÊŀ]#-ƾÞëµ@#/Ò5ÒZøUBÅ ;ëœë2LVÌ5ƒ‡ã^”ëÊÔrÔQ q É ézA¸®Öž€ëêEÁä[c?âo3þwЭŸÓû'º±Ûúñv¢­Ñî0²Œ:AsÓZðnÒžóÁµÆBMÉJa­ch¨u3jædZcíèø=Ý(®%‹²ô•±ßÒhPÎ,ø`Mq±61p֐ jÊÜiÖ¸âêþ®L˜RPó(‚Ï@¥"Ì~í,kÐM’5E N01 [99Ö5º¾Æzr‚b]Px@¬Ù%çÖ„ ÓUØí‰ópÁ°†•“b¬TfÂ3֏ùB¿šÄþŒ¯~‚ ôê'¤¸¼Vä»TÆÿ]_K“e×÷£ÐQ€«áӑºÜjfÔǧ“Zä #­3ˆŸ]0«o˅Ndõ=9šXºN ¬¾#Eu«'ò)xÕ0hbtrFJ\õý‚V ºGƒ€UOXûÁªF…ê0]’t[ŠnRu®þ|Puapªs((S 磶7Hu¶'2!Õ00ˆ+FuŽ¾©¢úå hq: Õ%Þ/ªŽ`ï|ê‡ã䆧f!H•ú—Ë+JJºE½3M÷ ôï*«ÜÃ)‰Ç¦FЊLäM=˜—MŸ&™º¸ÚS7w°:¹Ô K÷I&/œmó ÆI±Ð7˜Ñ㖠ùdFCY&2zDeP£÷-`tLq𢻓dÃÃI‹†’—0ƒ z©ÀÁ€nѧò`EC¨@RhX‘X(šû6Þ8ÑÈc1¾iL4þfŔ)ÑíŠbóüXTœ‹Syˆh¤ÚX€}¢«Ãë“]£ì.ÑÓp0¢—Րèj–Ô$c…̨ӁˆF·õQö`…B¯crT,.\<Ñàu=¾™LÊaá”ëâCcE¥Æ…;Ë2øqÕ›ê­\`V,{8áЏU$“ ª“š MISù ]­öšdh.ó\üÇzpBfµ_rúq)-.t,'š‹çÚÞ°ÐXh“÷¼ä€" +]¬4=™ÐàvŹ󃉬ÜDB¿»FŸ¿¹óõ¿/úk¤çŸ=~ùôÿùO¿ÛÃýæ·ü¿¿üÿþúý̗ß|ÿËÿ÷‡ÿî_x®Oÿø/~øË¿þÊnÿׯüåŸÿðÛïøéwÛ‰á¯×öçvûW¿~ýÒ¿ýõ¯~÷Wñ?w^þÛþÿ_ÿðû×iýõßü<{;›×ùÿú‡¿ÙOæg7ÿòÃúÝ/_wöÿþío~úÝÜú_ýæ¿~Ø8*Oþ§×ùÏ~øõþ«ßým/ô/~óû¿ùÙ'û§¯¿þÉ?¿ù§?ýÊ»ÓðÀðË?ûÍOþzû~÷z¿ûÎöúÃ~óö/¿ø“?û¯ü·®û§¿ýoóWóXÿèÏ~øý'ÿõ)ý¿¸>ý“_üÉõéßýþòßð;öûúôÿ¼þ뿼l¿ÿT>ý‹Oÿá?^Ÿ~õÚãßýÅ/þä»60ôã~\]n{û…¦Ë…‰?oíôå8Ö믟ðÃÿòõ?¯‘‡™¸ mB³þ«]”)4xé3½–—¯5þã5€WZ!DŽKŽ ÅÉ u¶$ó¤ÝcìeDÆkÕp±hx8Òv ¥íõÇaéF½†·ã¨#`GñÜ8)üuvÏsØìë„×a·Kûx^GøO¸É ýÓ´{­ûáÙ±‰¦gÂá_îPGÕÈkÁ}?7AXþnoº>ý‹_Äãl@K +–|!iºžÝ£kÚ^FÊúï7£%º¾Í^„æ8 oìõ:œç`ã÷ëU;Îí¯yÝñOõå† øYH£8þ½Û}&¬^å՚ތÌ»Ù‘ÇËõÓyXÒ9îOç9ØøýϜÛ<íx£ÿÐ]zÉFÚu†r^KýqÙv•‚—ùa«]Ôò¶^ðRßD¬ÃnwlÃy{ñ#pÊύáÔæ·xßñ²oïÃ<ìþæ|¸ßì~ÔÔó}dËâïöï4ð tvŒl›ñÙ6ûٶî‘m;‡cdÏ +qnÜ y?ì2žç°ìÛ ¯Ãn—öá>|£(æ™r¥·óÌu¿SJá'³ýâf܇ï?º+$âµçƒ»öÃ!;§½ù0™u–탻‚‡Ó êj>uº +6¾»+ûÆËY‡]Æó6û:áuØíÒ>އo2™®9ú¼½Ë©ØÎa¹ÛÙnÆãÒ6f݇ÍZwlóŽÛ»9ÛÆËý؞Ú4¾=âeßއyØýÍùp¾Õdº¦éó/¿b;ål'¼«Ûܘu+6/hÝ´ÍU8îðæWl/d{pÓøö”—}{%æa÷—çÃ}ø&/ðú.ð-µûãøö㓿Ý/÷4^S~Žhïuµs|È֐Ÿß¦ïãþñúä×a—ñ<‡Í¾Nxv»´÷áÛ/gÎ;¼¾åí4ÖW¿ðf<®n:Ö­ØFžuÓ¶Ïó¸ÃÛ·¼m¼¾úíÁMãÛS^ö하‡Ý_ž÷á/gÎÛ»>äíÖ'¿íf<.m7Ö}؆uǶoó¸½Û‡¼m¼>ùí©MãÛ#^öí}˜‡Ýߜ÷aù¨=ÉÛ + Ã—€ðêŠÃë،‡‹²Ù—?³vy>Û9nÒÇs[‘–+(ú~[Añ$´öXÞöf<\ó;üøí°Ëã¿?.žŽ_Öyþk‡zÿô§_Þ¿Uøþ`ßÀ÷(ðëŋ÷sÖØýËÇ#±àÿõ0åÍö€œn±Þ~½Xk¦É +2ÚîÉHR/ãÓófÄ(\žm¦‘‚V>‡e(¡çOÇ9„qÍ4£µ·­‚?»Œç9löuÂë°Û¥}¼ßr¦Áïw8Erœ†€ÞÏy›ñ¸ºeßnÅ:ìvÓÖ9œwXîM~Û8K¥w>¸i|{Ê˾½ó°ûËóá>|«™†….ï·÷riÒq¼Êûíތǥ-ûvÖa·;¶Îá¼½‰}ÄëÛÆfTOmßñ²oïÃ<ìþæ|¸ß2p͋Ù{l!È,—ý; ͹•öïöfıÚ8³½¨Äæ<ì-èy÷¤§yØXr߸I |vÏsXöí„×a·KûpŽÇ#ú¸EœŸ·ãpª­éüÅÍxœÞf_ײv]õvÇ-‚ÃÐûxÛؕuça—ñ<‡eßNxv»´÷áÛ¬çç{²VBËd7áxu¡8[ß_}ãù6ì‡]ÆçÛû2Mßh=¬µžX¦uÀõü¶Ÿ^÷î<Ïu£÷ç#Ù»ŒÏ‡×gžç·âß„°wŠ2ʛÑWý~[㝇=c >‡1P=Õ·¨à~Øe<ÏaÙ·^‡Ý.íÃ}øʀpÞ¢õä·ã¬‡´ýâf܇o2 ÐS¾?Þ^¤“ Ûωg¼çÇÙnÆãÒ6ûºÛaÏäºÏáCrý<·#¹ÞêÌ+ÌiÇOy·ûLjÎQw3Côf_ãùvØ5òoçpLÏí[ ˵gñ}‰öcÕ@'ÒéŠe´ù¾Ä×;ƒÝ^¹Ø?>Ý{ߗûÆkÕ°»Œç9löuÂë°Û¥}¼ß,Ø-¿ú¼½k!°ÃZ2lg»KÛÖë>l˖uÇ6ßþ¸½ÛB`Ûx-¶§6oxÙ·÷avs>܇oì¶k}ÞáµØNc­¶ތÇÕmKu+¶•Ëºi›{Üám-°m¼V ۃ›Æ·§¼ìÛ+1»¿<îÃ7 v×ÿõ–ê‡ñ!ìÇ'ÏÐ[~§{ú‡ñWú}Ž ÿ½}™4½ kÃõ±¯.ãùë›}ê:èvQïÀ·>œ÷v}ÅÛi¬ï};áÍx\Ý6h¬[±9q˶Ïr»·Û<7\_úö°¦ñíÉ.ûö̃î/̇;ðÃç]ïvë3ßÎv3—¶ë>lCMܯíkÜnìöáÎ ×¾=©i|{¬Ë¾½ó ûÛòá|ÿ÷Œ½þëŸ~úËøÕ§öwý»…^ËŞÆ%Ò]™îïîÑXè²Û¿¼ÙÑUXÛ/oÇù9ûvœŸ|žßFœ{œ,cl\íh_¿(ãj¹ŒÏ5ê>ÇêU¼q¹ûÇÛ¿øEëËúú©Êƒ ïÚãdÐñ9eÙ;v–±Þ(oàï¾^7Ÿûòɔ~ϓaÝ­4Õ×'f#ªÁt¨Ø’1µËçðb¶#\¨´Ó9ô+®} ×¥ns2ú ©ì·cà÷½Ë·7}Uód›^Kßø+åm֚èÞàÙú¤Ú4–§ÆeùÆ_X*ÜÛ=@/o_A™÷|)a݃·çð9Q…2[Ø\͏ ²×ý¶½úY“LNƒû×i9:´íãz­5ü{(ºóûéþ¾6b‰Ì/iŒ¾Œè¨Mcíq;`omnìM &k”¡Î¯Á:94‡å³~¢¶rÇÉ¡²ÎV´³²é~R_ߋoÚCüJS»픽ê&EeœŒ¨|ýêümžÔSº/2%7²×;žU.ÕO¦ø®ö?ð¸û-Üz{_/ÛÙÎÑ냪"çÈÁnÏ0²ß€·$÷ëó<¾ÙÁF‰ÃöØEK6öøÖ÷1öxÀÂã[¦~õ*Ö]EqTŠ·ÚÒ§ýzjØӈ»ŠÏ¹úQŽ¤FÏÒØkoa|’߶øøü3¿¸ÆKíÅûórÔjÜ펬uªëU1§êG‰!ÎÆòÄ£ë^uK{ãöx㫏){ÔáŠ7¹òy„x¸—ž}lŸÆÀ£ùêUì¯ÓëD»rº½N,’”uÀ_¦½L{ñ>Ä cŒÜŽ¼1Kã}>„Éý8íw¶ 0¢xÕOMWÔٰď ›x”»½£â>Ž‹Ï:ìy>=Rå…FG—Ã:¶ Œ …1Þù×hÁßÝxn*ÚÞy&s d!Ï=þ´yOÀÏ<½¹qžãm_ƔcÄöÐêŸÃ¨é#ßwœC‰¯£ÃøêU¬ D­«m¿øã´_kŽ{Ýëˆ …K [܊q÷yU½\mÏ56ÎӇÕ+ ŠÜlÓíÿê©}™S +:æ]öwèüöt%¯eègÚxßþÖەK5´ Ï\š¯*ì9<)–èÈX<{ûÖò§¯žÃéTÆ/ÒgŸãכËU´1·Ýûû¹Äö;´Ä½ØhßGÏr*[\8û|‡±Ú©Ä ñé«W±t^5Q‡d牢k¾/a·Ë{Ÿ¯j½"ìÀƒ|õÈóGï<4_QÏ=^Uçª¸c¡úeÚ¯Ò¶äƒøø0^õÓW¼®ôí+W +ÊZõêX+7§Ã>¨’¤1ÁI’ñÚ_ïÔ¿?#?q„×g—ùÙå+^b*>ÿ̹íq›~½çlóöÚk¶ùø-üû?°ñqäÃEë8ü3ª¢ ö~~ {~4·ÂÞùå“?/ÌãÉËx×6âsmá!ñ¡8îóëK«`èž>9›}\1Bå+…ƒa?Ç M×å)11H$cò×Õ<õìúÚ5Ãæ-óúùØ9]û¹†½ Èo“–Šô*^_@·1@IxH!i½YfüÍÆl]%ÆíK+TûÚ»#¦¡½ñ} {íq¾œD}ˆZý¿fۏÆçÉyÙ+#ÆÿFœ×]o_.=.SŠ+ËÏÚÿu›âÁÄä“‘Ó Zý ¥íõb¸d;ƒ1—ñµ¬k+óã¡'å;Öï9Œ0¾ÖLcÛr9_±þIM#.£Ä;ڇ/"œ7bæ¡}{G/_"¹=¦Vß´„Ša—˜%=ÊJÜöä%RA$kø¼î®ÛSàå¦øvî4Ö^ë¦9‘?Õ¿¾õxM6€9¯éçS¸÷yáåiĔн çöO‰{c1˜©Ol|ەX/^qÇ£4óžƒH)śÖ'AOÆ¿ôÌ-«p¶>nҝÄë©Û[ØÁ)b=¥‡ñõ•¥Í8p]ó½..® `Î⃄Gò5W/~WKÝ®âzÂG®Û7P³&Rô «q+)ô–ë%qèöçu·Z‹^ošÝÍG¡‰¸”ùiÂO˜¯/Z÷6ýºÞãÚfö¡¾¬ð f*6®Ok´¾¹´ùiōø¹Ã^ó.´Ú·#”ö§ÞÞxå ¸(ñ–£ÆdußuaE +c™[æª o8d0bæ›scZ_†gJŸðë¾ ûb°f:OÆüÄ­Hqdä)Ò L¦ùÅ 7°f¡{~1WDìx՚²Ì-qz·—/„‘G†£çÒ|dÐ|k|ò9_Æ&잇òõðÉKž÷í)6®Nb$ó¦/—ø8H^ëþIóÍ.ì¹ÃŽ¢+óÇ·¦qÏk µŽ¾ÆК—óÙҜ¥1#Nû3]ÍQRٜ՟qbK)‚(lüO°eEÎÔ5&ÞC$e?ÇR›OvhÔDÔ9[*4hã“ÇÕâ ¿ÙZ7Þ:DF¿„}²Zaó Žò•»ãç^ó‡:eèñ‘¼æ‘ûÏ!@A-nóÌëÌòW°ÿ̞Gã +6~b9ß{%¯•áœÀ“' žG¨#6¾®>½JMU7{gÄaQ„ã# Z|×ÒË»ˆ»ï«úUNqnÉD3Ç!e¼Tð÷}^jþbjW#\sˆ}îÑãs‰ûú˜UЌö‰§#°ò%ìõŽw"Ftà{ŸxrN|„é…–zµuäpI¼@•ñ¹Ÿ9Õø…¸">ÀQoúólQ;' yç¹Ýs~‹á[MZ"Òë£ú¬Ä}C„v9?qä!§"#‘¼Úä "cLñ‡»û­Õëç†>éöÞáFiÌ9¸5/y®GO$‡Ÿ€qeú °æH µª‰ÿù5s€„]¡ÃÍ}¼–½Ì yízHªîªç‹ØåZ«ôé~C.™æäf_Hòé“W8…2ÞW¼¥Íø5Ž0×01õ£¥ÙÜø5ÄVº«9&¡-B‹ÕsC'3¡ÏïVC]Fç•x¥ê=—!¹({èÏ@Ã<¨æsäfØƹRG¢báéñ–p­&cI}~Hóån»ÿ3PÚ¼iÏ\Š@9ZÅÎ>ÐzÇfžÓ°“O\E¯sV}͙xƒ¿„ýÎW¬ÓœmrLÔþ•fãì+ÐA.ygóÌ듙O͍"\à +zO:Úäa÷;EËáëÎþålÇk9Ë-›{ð¬ìñ£)‘Ó'¬Âajà<;LS_žæ͌ùÆü:BHåHpäˆLëëˆ3H}…Sz‘q)-3ȊFó9FýZµX,©Hz‡(걫_4Ç%ö +÷˜q{ª…Ž¨ÇÇžRJjcç6×薞㯞}â|~É<UZ9&½×ëÉÌ/¾;¡cûԘDØá[€btMˆ]­XUŸÞó…¦1Îåì(áçcÞoþ=_òký<Ã6Ç=S°ñt!GOq„üÄØ͗láºcäÍY ô‚Zã[+a¬ Û¯Ôù–k‰±ÛI¨ÅçÆCÓ{]1_cᚺ¡ø½½ãç.{yì{‡} -ñQ×9Ù\èE3ú>a,¯bÞ¥¶â»ÿI(ä·{NN/8‰qóÒÐÛ2Ö}uÅd®5 gIº¾SÔ¶×9éŽÈ%²ó}Þ´+Çfœä©eËÄî¹(¹vת£I©ŒŒ§Û“ØÍîjŒ"O³›A{sbº%C‡²vMßc„qÉÏz©‘%`ÇÛxpšPhL {Œ”ªm É —4óÍø²æ±ßÕ×RgHÄ¢"|Y±a€v;ÂZvø„›D¬Ë£µqƬø€Ö¦ź•™\*¶sŒ×œ/ìf£o;ñ¤íÜòü<#å2궖¸þ{ï¶äƑ$ˆÎs›é`vLǤ9]`Æ-/-ë²(²5]¹$[­ÙÙ¶2*‹…! +¨Å…õ3ó2ß°Oó¦ÚÇ9áá‘@È/³/,Àéááá÷йس¬bK`|ZKµ¼•œ÷¦ Žìl ®¥`ážVš{]Áîjê0r$m§ª ¾á¡e…‰úÔ2ž£B SZi.D¯0ädEQ0a &6´¥7f‹Ú+Ú £f­Å÷G‚SI–I¥|d”ò'\ƒbÀ|¼΅ “‚ÆÙqà’MÆ}€;+ێ}l\¾ÊqÚ;bL¹¤ä`K¬ñΦvÚ/±kA‘kÝÇâ7c@£¨Ÿ8%h­BÝv¢qZž°±NÌx‹<%  p’ó¨!<ˆ”C´å<ÈG˜,Åð`¾’&j]pD©ñ´“<ÈÄ)G¾¥¢Ð-±N +‰` ÞÀ#¨qJ@›–F> Ïbø:ÐòŒŸ©1ɯ‰“ePyó—};o‘s-ÉÃëðn`7d P²æ |ˆ´dSd7°µEl&‘¡Lâ€ŠMlùpð”ÅùLR‰b iJ+0CZ>Ïî#;Rá]˜±ÇC¨H‰‰¦<p¯‹9ªÛû—yY/qÆ×ÒGBHwpfWB¸±0X-;Óà2„à òw8xw-sx-уX¨Ùã#LFçgžS´ò$#—;ë¹#v,?‡ËyYò"iáÁ\¨}`ož¹òç~\nÖs{>ОJ˜+æ)Å©@Ӕ¹´öAR)Fô Hñ!§¥' (ÞÄPtg¼BPcËBµoŽú‘¥Q Æ{ †b@R2'"PjҒ$ÅÜ6Î +ÁËn2as$’‘£y5L‰YÂÝ̘1˜ €`4$^«ÉC,%`6ÔX3[•iF@Â-:[<yåÐÇ÷❩J>ÍxhÐGZ!ÊGšåޗèé踴d·1ûyâ¤"×ÛBS˜(À9ß/ÇÄEoúµËqº…¦mVd: +ÉÍ}%X +Ýy"}1h^ڈs+õ,÷c ±øؘ¨ I@ÍÒ²¬`ЬI D扻4Å3!Æ  +2öaT;cH G©HÁeí3 +ÖÅmo¥äð™ÂÕÓvô+dΞ)âô.î +&#ÙϲUéÊóŸÕÀ˜ƒ«UpÂFˁ9qüqùÎ0tÇq‚ñǹ¦pvŒañrv¬Cš‡*œ¶êN$È ¢-ʈ€!¥ %ùu…"IUjMqØkU¸RC–’ì'óŒW†×øòÜ2ÀÃöPZGp:cÁ!í3h¬Ü|½Â÷gFžRîGê*»øÆipsùø{¸ã‡ºM ôvdØÁ!T*‹|2ªà>ˆ4gÎîÃI3×w d|’eP,A°ëÐSWêLNJX¹÷̃+ψr˜i쐥`š]ºT€p¡97 w<g’¹xÊ@vœ(Ÿ›áàÁ¥ƒÇ + ÈÚd È|.Ü?Åç®ä8òLG¶~¡œÂ÷ 埊v¡ :ËýыÄÁ0P>紟”ÂÖ +UЂ‡³è_¹1‹]Â+A™r· ùɝRÚ«mÛjÈo¡X8J%7ffBø^šÇŒÇi!’O#ÉÉŠ¢o /e20wÃD&SijKC¹&9çZ9[Ɩ”à˜w®}cŠÿÁ %´voÒçyÔ»¬Yâç|—à‘Tړò"‰yé(…Kº›eýYP¾W8ºHLÍDäÊ۝<0³+¢¬<´%úQHN æôÛx ¾meô¨o9Y’ï0_„4 Lƒž‰€!ñ¶p“k>Nðæ:ß7UÔO³_;’Ö)ÑÚ¡ã c$9[DIæå†56XÚ ¥9ω–[ ËÀ/᜘%º‡x½EJ‘ +ByZdWš åû Ó82•\f‰»¾É%‰¤ Ôf²øݬi&sî#)*x ú%åAKNxÄQ2ó‘)9ўô~kNÀ´àì¿(fV;÷ŽƒƒŽëûfØ.8גkL!X‰KPs-ɶ™8§æ)a@§*‘0fòðc¶Žà!¥„’ÊŒ kö$òñ¿VNÏè*dge`±!Fj|JOf8è+q®z´%àM|á8HirÎRʍ ñg©3b9º…´"¸PÒûéTâµLñRœº¬ÓCFôÁ+üüiË9$,°_‰øZ‡øh–^և›d½®àÜe4aÞ‰žÄš ÊÔ7²}¡ˆBCKDH۔r&iýhÊYÎ9Ž#qaÉ^äË){ÉÄrÎpõ褻4¡Æèbó¢oJ»ÍYA$aú@V9ȓ„™Õ,l”eg Az„ɈÛ ü©¦+¼Tﳂn¸ŒlP BL«CrIÈL|°œÓP4­¡éi “½^Q¢„% }<#λGãìGôµ‘¥¤,8J Y¶ž ^ó†ô½Àò2?§¹¬ðaœä“å:£Æ±]£3Jº ÙÔ¨æƒ ½ƒ„Æo2LéPI©²’ÑÆ}àtJÌ;#¸Jˆ—b1afŽқoÉ\Bç1fŪ¨ôâh.)§ ÷M{M¹V&` $ä…ZÉˏŽ9l’wž° —í4Ë$åÖ¦5z¸ U+ñùc¡1¢uç¥æŒVäa–ƒ½7ñQxظ©³Á„ás)Ž1HÅ;×ýb¼mŒ€¼  ö`I5ïPo¸QäÅ4sCҐ“.L„!+ˆK$^ûSŽÌ3Ú¶’€RÑò“‘¥LÃÜò™Ë +#À Jä¦ÔD@’d¼¹”!  –‘™‰Dפ¯jš­·‰ ͸3Y®Y ÷ï5Nz©RÏ°# qa–l6£àªÄY?Ø *ÈL±M0Ò¥"[ ù1ý)ï1g@øŒáøšé@Çnx "qUWØ% o0Ž¡´€ÝZ™fY¬ !É­ðJ±æ9%$Þ —±¿1 >O×6 '€_2©w˜•¬É + "d’†Ý;uÆ'ß ²úú(À@û)RÛò ¤‚58ãÔPl¼FÒÉI[*ôÔħáç¹ © [‡1ç9¥"¦ÁÓ—=»ÓÒoÉw’DÌ[AÆöÔøaÙædx'9•b)ïðI(€y€÷ž%Ñ|rüÂ3ѓüIʹ™ä锯ÀØûb8”’ǘҪt) èéIå ãbf vs˜µ>¬Ô(o“_‘&yYC´û(| ‚½?VÆɆÞT%3˜9%I„Á‡#§÷<#àuívø–òÞ„m Øû0óRP:K ­Ê€ÁPÁ ÜÁñ–¤†Ú{·Ž$×}ytéQ.&ú³7PՍ-|`Dµ¨¸ÝQŠÅ< •ñVl,¹ìdž!©¦sÅÅ>:o¨³èQ)jÉóM‘&A;¬ÈɊç‘[×ÒwL³µÑWƒ` & g[JŽ^oŠ˜D¡ÝuŒ~9pU Iízâ€^åÝáé`1é{‹ÒMÀPÐ,gÞƒ>lš —k‚@£hñDµ. ± ³…²pHžÜküÈN³1’yŒs|ÝHn)#̆+[`Xcö +0À}â*\«îÔ-fŠ”ÁŒjCpógD7J¸G´Ìàia'û£ x]SÅ !¥ìÑOØh1’ª•d[·!.!$mg7ٚ…6ŠƒRJ× m0A+Skï… À´…!ŠWèÒƒwxÜWU &vKfâÚ2 žå´éȓ œMžz™¸È"v‹»š1•Ï…Ébcd¯óvsὌ)kþâ3VžQ½ÏŠÃ×q¼|ƒg8‹} ”0?ñ"8ù”s iª>;ß7v* +&l:xF‚&3„Ì ùÓÏS8T8T<æœN?XTԉ\Óó䂃Ê’\øyrxåɽÅg¨ `ž|‚uoC‘’â˱Z¹‹w[ˆøuNù90—Áã¡a¹'!^,#’Iïñ+à ¼Ö£°š‚Äœ!_*¡p~g$~]¸Bº~g†•Z@a-¿R>Í +Îåð†“C!HTˆ‚OŠË(¨«MGcÖd I¼M€’t’Þ-É»ŠUSèAAU¬rš¢‚“†WZÁGãe$nȄ Ҝå&̸=#¸Q¼—} p’eu*—8–p‚Î| +K9¯”,¡¼¡$\ÁìÄ42"ðÀ „F‰OYðI’Ü7.¸ +zÛO¶—÷H>—¹@ˆt*õ ɛ…*+gºXx®©o™ä £DQá.x£tI‚å™Py$I1š +œj¬2I*U΋í÷h–Süh(’ì )—Ás9`ÈiØc^–"ÓÌϝ¢ãK+y šLi†J©¹ÐؔD”$+(^vS©“Ñn¦u¬Ÿ@¶`+yŠIb ž‹"WÌ9À7K¹V\üWn\EâB„Cæ`\ó®¥?¬SïÞ÷¯3ó‹*¥˜fÉ fÓ\_>$‹l£IÂaܚCÈš¸ ’ÒXqÕYdŽq.yߘ˛ù¢SX՜[†ô©$*ßäÒo,ò²›LPÌ»fk2C!œ¢e¨¨˜CËõ½Ð,åßÙ5˜d2Šq×.ÂÙ³" ~ùá ŠÜ—†k¼cÍc((øØIY\”£ œ*Ø¡DŸ‚ :ÆĜ™07Ñ!cVÁ]ˆžoÌÅÁ@Oø™köØ yÓ'0²t¢ÇƵ u[e9gA·Ùý +ö…’ ĄL(Å; ™Ã9æê BDVÆė l݇í)›?uÆááPéU²R¹@{á"›(æl$Ìþ0ì‚1øKÔ9ÿS°çÒx£€OüŠ÷†¢<™‡“ dª€±3ð)C§B’«OOdÉ¡ý '' +à¶Ì# }Ïc§!‘¸ 3M¨È•ªœP%ù´u%68æè¼å’d/¸jX!5÷XG…ÿʸI™®”ç'X°ÁË§ô|Æî×$w\Â}Aâ3è¸H›Ë¤éÞÅñƒ ”ù, ÌSš(3|ҙ0Š‚v¥½‰XO,BJ`æꧮ¼%¦#Q2oâjò8`(„‰žÇ`¨*ž×N6ÀK؄—¹ìo £À8!#ÌxPú-ž»è:ǑRIÅÆüé€úçCì”eìDQy³°„Ïx -Ȑç•Íœ.‡Ý5\x_€0'A¡ß=.ªÈƒ™p""Ý¬KHoÄÒ (™ÿ† – ñkT –I´ž¤› eFu21·&`¬ÞÃåžhéK¨): /^€†Î¹âÝlrÂ, ]ÁJ +È(èä³Rªô逺H©®`ž1Ý| ”71Ȥ/ZãÚSN!œ¥L•=,0ã²l˜8í1CIIz£ K@ O@bjBë3$P çe-Aþ£9u–iÌÅ$µ¤ð‡¤åJÅ£^G Kœ<¨18 '˜”ê]·N¶•è=t¤y̆bƒòI”ÆÕÙóIhÃ٩Ù* ‰H/8µÖðR£º'ÒPґIi¢-‹®|?ºÔY˜Ý2œö›²ÒïJyb6±ì„JÃÌe‘Ù’*ìȌ2ÌÝzåŒfÉÕ*“ÖʙÎÐÍ9ž4Û¬XY@iÉ %¡–öÔâ›øyÍË‹hF5ˆ¸Ê²/ +À„=FQwó,‹µ6YSyTö#P‡xŸ «Á>À¢¨¾’¦ª2HEgúJ’tRAô֑W-”Î% îZ»´‰CŽ +֮ζÌ«bš“ ‘¼nËk¨¾H¬%ÆJ‰âáï€2㢪:'´* ’mõ!ÀI<´Š$ã³£¡%‹u2ªÅd¨„Š-¾ôSJµ4©Ã¨ § ë©Wl*ή·¥Y8¥2S)3ŒP +ÏKòb +íÁɁ~0dîI<Ë}} +0gJ³ØœQcb…Æ—_K#NTaªŽ±†8ºÎXrÒºŠØê°>ÀúC; }ŒèÍwr¬"ˆêŽ<㽚ùZh™cª~)ꕿ“ÂøÚéŒA²ð˜kn\u·;"ñ,fŽ'ёŠEP‡ €ÝJhIa ¾(GÜ8$~ª¼ÓÀp.ãõQ°#ŸjZ¶&r!4˜rÆË2Î>L\iGOǔT8‚Îìē‘§Tá¥\ÇfªÜsÁœâÇñ,QÁ½Œ‰“ú҅:6h¥Tt l^xê@9BNä‘ZPã‚cäÈBÀÕʸ†`㤝}+ fa~ƒ¬n*P?± ¦K‡ZL9ž‡ŸQŒf’¹³Ú$Qjâ¢XyʹŒ“I¨´.2fËѐnjr*ýÊ1ŒTÞRÅa¡Ž‚QœË¬Û4d¬Ã0X vm +Éf†¯¯ªjœÅÛ圴`b½„£JĦÜsš;æ+‚fÎFí£¥Ø ðà2¡x{û-笰F%y€g†l¸Ä Aæb§¦ñå¡Üg»p¨Ajá4ɬÑÞóbŠ³›»`/êCê»3a -v4ÎÓܑAIȑnZZ{µO±‡mݔˆ†êoC€"¾5KE©ˆè,•›)Ì.aG‘t"B*(Ó ¢ÄiS,Ÿ4o×XrþVÂåX¡Ø‡¤E( ų̂&>œRˆ…¾ÈÈIeŸ¨æ¦gðýl¹B).‚ëOR,{äF¤"ª¨–§lÚÃD,*ãé˜;ÃUù@‹exÆ5y°°|Dd*1—(Ç®I¨SçËha—N¬{QšŸk싃¦‚/A +e™1‰Ž2犔]ž)$XR-ÌY8#xÆcÌgKÁ0EÉÃTôZ†â«9k"©ª÷ã×´h£Â¥¾Ò0 C®r(1‡[ÊQC)Á ®îõfô?„šlkÂE•BÐ~è\!#W)¡UœsÆ®|/{SXæýÇx`p•ybn™Âú`ó;jˆ”h‰Ÿž«p²³ñ…2͖{R¸IÀ&w¾z7äÄiTJ—aBÇ)q¶Âó +éSòÕ-õvú‚mҕ ¼4åŒÞK¬[S¾sAüĖ°VɐÂý 4Æ7-¸&+‰ÕT”Sœ­Ý„¨ZÁ¢›I—Ëõ䚀:çr¡™Ž0hÞÏhÓtÀP/Ý‚˜-qz †ŒýÄö<†,Ü9àV$uTZKdÌ;^„Òynñ×ø5~zLT6;ÆBöh.ƒâÚ>™W…-PrI7¬6ÂB"$ÓpÀ¨p˜vê¦ÑNüöûŠ%@££ªAX¬Ø7TQøêaP#>åچ&”ƒ÷—²ÉPB|­ôü¿bezÑ{Lbo`Úԛ:8kV10—5À"ÒkBÊ;ňT +$ãm€'± +–úšÞCÆÀ£Œ‡dåíÊ(N©è?jž´1¡ñ†àg{kªl(š)©Êè« -#Í<¡ iÏ3±1UӑR0Ú4yûCã„#¦‚ùŽqb±ÒaXE`æ–…Ó á¤à, +2ô’/€lr)ÎÈ6A,žºŽÁ• Â×%,@š”u5,Á”ëH-£À>—P耚4q²a#äÕTJUÁ ×_Ç1ÌF°Î»BG¢þÜ´ù˜U´ª{Ãp_νüƒ@6û¸ +êJÈQPþÂ:ÞRŽ¯£È' +fÚ¢>JíÈ?…J4kÆ딛”`™x&ùu¬{é0Š5Ež/\IIÙu5¤¢@Î0ÒàšåœSÉÀú„”š¼’PÇ@¬}*emúÌÙÏCE`ÔTo¼®4uÝ ˆòéÙ>stream +¥¢+ë=›e:®(øÆ>ϱ4«y¡êß«`(A€´Ú UÅQ)¾Ì¢îñmÎ+„ÎpÕeÔCg¸ÚÂ=0ca‹*«Ôu†_Ê£c]ò/ÍX9çÀãË ×ðžFד¥:¨Ë"¾¤”U4,{.)5T² *!!Ö¯é6ë5Ìá¥ÚU©r?¥|»o¦åÂÁs¾‰1gíÖÝ àóˆ¸víÖn‡j^t­q_Oàë[èvêö†;w“ÐmC®1:ø¹@C¡8˜rÏ|}IÀ Ùàžˆ¨¼‚ +ɂt“­ášgI¨Á´Ö·øpJCV2N>\œ…¾q0d*iÂÒ° -G™ºPäH³‚.¶[ëC¼2Ç4›?o.ØÓ§œ(i»b%e³J€¡^¯#ï,\X­;+S¾û+¼7U”ö™s¥IwÎÔá ¬6‰b$L”Jtz4À•Z A¨3œmÀsÝ×ÄY,Ê÷хÜAΆq%£Upº º…S~ðÕ×bæs@3Ž'3|ƒ/Œ +r$§:„€²8õΡ\ñôŠî‡¶¿ÑrR«/ˆ½Þ‡ ëÈs„YY7÷4cR½„+r1¤úlGv«U½o¾íýò÷µÏ_?ü!?ÿ~rùh¶œ_?,ål‚PÐ󟦓ç³Ñd1š¼>9ñðGåëÑ$þå«?üt‹¿‰Äýøòç§OFc‹ê«?<àϽ?Ùo¿üxöÓô²ÄϏGÃÅh:ÌÞïøé»Þ7¿ÞŒ'öÇÛÁÙèb¹(çßöþh>œÍ«m†×£ñ嬜` Ù{ðÃd~„ïoKüñ¡“¯¿í=øÛd4´ð—÷äuµíÛÁxé¿].®··ž n\cÛßüÇ0´ërôúzÑ|lÔþ®w"[ î}óq½?’!ýÚ|H¿Þݐþpþðâuy5 ¯å_“Eùãhñrx lfr.wti›î(4úc³áz9]ΆåÃñíõ 9M&Í×Àhrw‹àb¼œ5Ô¬œ/Ç-øµ¿«ÁéÆ#›/.—oGèVóñUŸj¸º7 ElJýþŠpU>,çóÑ`òhçŒFCØ>3>i—-øìå2Ú#jq^Þái؊k +œ^]ÍËÅîíóqâ]²Šg8ÒcfcpAëNÇÓٟÞ]e fÿ~¼£u•Ëcó;Ó’æ»-‡Ëñ`öý¯·ÓI9i±0ן¼³á¶íét2_ ömxò®Fkšv9» ˗ÃA«µ[yª;.>â `=[îXuŸï¬84}"ûŸûf0mÆtf€Ùj¢~k>¨ßî\Ðy>Mg­Œgüt½y鏝3/¼³¶ŸMD¶aíòîöÄ®3(Ôô¶œ Óæ*wôı]ݑ|PêÛéôæv:ß©ñ6i.ç¿iÁ5ÞÜ!Óh~†¾Ù1øʈÄQŒh‡«2"} ÚåÕbDêxxÞñƒÙhq}S.FÃ{};Iêélp{Ýb¤Çr$G‹çƒÑ.ãLw&ï3#‡v¤ïa@ßcßå,ÿXÎ^—@×c–¼ZoÉ/a’>ig #ãÕ¸—W½ï¾:ôð°äþ†‡µÚ±…‡Ý»à°{¦½Ov7ÒÉÅ¿—ÃÅ£érriûøhºc&֘§m»˜7Ÿ½ÊC OÄCc°‹åìb9.'Ãæ¾u÷pS"ñ«îdx“éËÅh1Üq*T ù«Ñ¸l±*݇ê'Í]̓yùdVþ諾ù xå±»êóF4ÎÉòæÙp1xÛf6ãgîj„°-ï»>ýª!ë9lU«ÕLeÇ>›Eîè VrÚ)§rÚ)§‡¡œ6«ï”Óû§œ^ÍVÿ4Í;õôèÕÓ憦ãÖN›ó¬N;í´Óš©N;í´ÓN;ÝݏãÐN­ ý¸¼ž”“óan_PšsJÌ—£e‹c™Úß˸-ò#;®x \ñÇéìöz:ž¾n.÷vlq?¶˜vlя¯9%:¶Ø±ÅŽ-ÞO¶øýlz9*gÀøEŒ¥íŽ1vŒ±cŒ-c'2Þ‘±cŒcìc#Æøt°üý?æÃërö÷r4¼þ þ™”³Oäµ?F6ٕ§ì6ÝgÚtY·éüøšS¢Ûtݦ۽ž„¹¿qžm†vlqž'âÞEz¶ÒÑÄzþe:þíf0/gË]Óº€ÏC½Ÿíªˆ^¶PHïpÜïê/Ýí_º$yhLdÚ ôù²‘î҄†#ê.MøT5Ÿfåe»r°Gû}ü—'\§ÓKsÂÅx0|ó]ρ¦·ƒáhñþOI¿ÍÙvL—)à ï÷o7ª#ÝwO`‰ó¶›_.§ïNïå +ü€c K,9ÏoKÞØ (Ê(ïEyðËÑÕÕ²Ebï±0Êæy®žío7Z{ððÇêvNË»*ÝÕÛÝíVâA®Dñ¥±ÄG‡"„ú”y5LæW-nË9Àݱo¢Igñ9‹Ï^"ñ1Éûn}’Äߙ}¶L†O>e²>{.é.¢÷;s¹—ëµ¹ÍìÈ.ÖÓ÷ùb½6ƒ;’‹õLóͽzýý¿®Çå£Y›XþîZ½êPïõz-|ñÇRT­ßÂq6¸-[Ì8µ¿«±]ŽÆƒ5-Qï¼Ï¡÷>XéÇéìöz:ž¾n~² ªÙ"¬ ã‰O<$¾q,œðއZÝNØ<›éXXa› ö#‰ø¾ap-Öݑò‡ãë¾÷åZ` óû‚*$-DÞã®pÐ<–öX ´CŽå„û,ÑÝwyÂݏz;já!°#ú3öfœ^&“rü²—ÃV:óú“w5ڇͽQ{výÉ»móÕÚ ¿r¦ßñ½?-d±£‰ »ÇZóx¤ÇÚãÑüv<–7ådñãàö˜Ï¶{\«ç¢¹•çXŽíPb¨·öQT>6ú±U j#Œ Ãl¾P”aޓ’CÍÕìcá(m˜ä±l§æ³ttIÓ-ŒvŸ-eúÐvéÕ¬,knŽ¾í +(_‰÷Ãü_ͦ7-F…­ïjTÍ÷ëbÚBøœÞ¡œ¶C ŠíÎåë6ŒÕ7¿« Æïï›ÎòËÅ`֎Áºîl-6Üe‹J®ñ] ªùa ûð£é@W»«!G“rÐüšèá`<üqÚ"¥$z⮆8+ÑÑ|B//G‹ÑÛ6sÉOÜÕ'ÓI‹‡Ë›åîH°Ê£gîTILF7mzþÇOՑûS«fx#—ò.réàÐëîHí9]äRƒ¹º[ë÷°‹\:êÈ¥îr–õkìRAäXθ.vé(ιa»ÔÅ.OìRsõæ¸b—ÚHcG»tµ.véxζ{»4üb—Ä»ÔF;†ÙÅ.³Þ¿Ø¥6LòX¶S»Ô]÷°ÿÌ3Ói¿Cïr‚÷*ByhÓÓ&žµ›žÏ>=Ÿ´äËÑÍÎ'íÌtä>Vp}øÃùóѯåx~;*Çç-Ã1Yô4IÏ4×SÝܾh£ªFÜÕ»Jš­I6+o¦»ìŽ4ô|4¹,¯F“ä+Êm9Xžuöñãc!ÝwG]T»Ý p$\rHW½=[î`÷Á9®µkn}ӂo¼¹C¶ÑÜ4úfÇà+#G1¢Q •é;Ô]šhGØReDêØDßc9Š³Ñâú¦\´3ŽñHÞëô:Æ£ùÞ'‰~ì³ùBûMxçÎÿÀÎ@Gî¿;¿e‚ñ!Í:w~çί!YçÎïÜù›×¹ó;w~ûQ}iîü®[çÎ?w>ŠàЗÉwíDÂ΅ œÎ…ç°Î…-;þÁ°ËÑÕÕ²E¸cá"Í͍ž§Ó‰•ø'-öÛڃ‡?VÇ"^¶+Syè®Æø¾§ït¸rl¿µ³`EÜ±ùêñmgpp@¸í*Mgþ ?ê ÒBw¿-‡–3Ͼÿõ֞mlOëOޙDÙ|ÇP§Û›Ú֟¼;‘d‡ô¡Ú¬äÎ +uXV(Ú1”uhŒº³Du–¨ÎÕY¢:KTg‰ê,Q_ˆ%Ê۝œ%ʛ¥Ð ÕY¢ŽMÑï6^càJg_sM;ûÚGìÏK¯ÞÛýNt¿ç5gö±Kt6—{ŸÝ~èUMŽ¤òL‹ª&]å™ÃёTžiC~4‡ñRufß:~Çq,G‹çƒÑ.wcw&ęÜUƒëÎäƒ^uGr&ï§guçòAË­O®c;’»*p-ÏäcŒ³h?Ù]¸ìÌtäžV€{9¼¶HËÉ}ºÎ­«¶§ÆÜ©8º"ÍË6vE*f·5¿éü²ù-õØö®–a‹½o1¢÷GÂ5Ž…N¯®æå¶Ï¬¼lÇíTay†#þ‚µ•˜ò/Am9´éúl®‹£›©NÁ<>SèäëƋøÝè²MìŸo~WG©P-†v]¶ +œãöw5¸aš®…@w‡ò\«!µºïPèŽÍ7÷¨|g¾éÌ7_Šù&íÌ7Ç'£ç÷Î|ÓbDù¦3ßtæ›c˜ò/Á(phÓՙo:óÍý1߀‚¹°²ã|¸Ã.Ó©—÷Z½¼š †‹Áø§é¨EV„{¼)™øew2ÀaKóIS^}‡Ë|2}¹-ZlÜ965·Éý¯EC!ñH=:_”û#ùRüÍãԎÕýÛòP¼~Úé§÷T?mµÍ: µÓP; µÓPkGÕi¨ŸNCm.ÖvêýÓPï}Ôᥣ6¯sÜ*jóqv*j§¢v*j§¢v*ꪨ_?üA$çßO.YUE˜ÐùOÓÉs‹/Î<ñðGpÿjüËWøéÖáÑîǗïo.¦cÛ¥Gå娜\•ãK¨ï0•¿ÿG99RãÅÕø÷ÿ^—ÏÞÚ>•ô~õ‡¤÷Ë»¯þ°¤ÿýó(òàÏàÑKð¿¿¼‡oÿb?ý»…½ëéޏ½ûGÒ»üJô~y¿Ù¥ý$ItÑ;)z7öü=ûê'ü!ë§&“ +¾Âÿàk* ~N{§¶AÑK±aÑãßèlS@+øs^†_¨9| Ÿ)>x†é—èÅQ—mÛ+ˆ|n½?Y_$FgøWÛfðCŽ]…¿nLôËIh~’»wÛ¿îåð~”F÷ø÷ëIîu’»ðoÑ#¹'Pîèóè&雿M`e]ö^Ï0㋞úç꤀ys3Gÿ>²Ós’À`“DôN„Å(e/²Bê^VhÝûå¦ÒRŠú–©é=6Åù¨N™"Nœ…GìbüL[ÒÏ¢Eˆ„ºq«ª:'8ÌD´Oµè/ÏS4{+[ýڅ‡ý{¬4ÓQ¢ŽÑ4oš9Ù|æ,*™Tig€ÊjuæDQß2•k3·ç£f8eV9œ¸o¾íýòwïCË©’~Zè&=Uv¥Ø?Raì“«TÀáÿ¿ ÖypÙÏe.TO÷¥V÷è |–)¬=ÿ#L1|.l÷ðG,‚>ڟ”@­¢;Ã|}nO°EõœþúüK…,7ªÈ#SÁ£G!€ðÅtJd|}üýÜ÷ ÐÒknÂë:V7€¨Ùºí½•}eRQ覽ýÛ&T$fؓF=‡jA³É÷¿ÞNg‹WtH~}žô<šNÇÕF“ÁŸ|º]z¹àës±Žê…=ºæ‹v(B¨û¦'ýß`!¸môó B…HXªpûݼž×g$Ià.Íøo淁Eš•jx™Lµ!Þaûg;¨28ET&©á-©;íO2>À¹àx?ý%Ö`¥ž¯ ¼û&ê |@vbÂß­Ç´ÙÎìí/ÀiM•ËæÀòø؇ÙÐÄôÝÁ¼Ë£]X’*;ǑÝDC…ڏUÇcßS4ÙÒÛd÷˜õî1';ǬŠê˜—n”Â2ðáÌ}PDþ ¶<-ÂÐuýÐQvH 'v¡Úr²Ý•_tNã\äQý#je*íÒIú%~ôWîΉ@.ÕzD± ¡ª-ì†Ý:²-ÖŒÐø?Bš)ú»u©âՇŽ/]Ÿn>¾tÇø­JA«RÐbTч¸*ueUfÕ´©š®,ʕ'jF$ý€¤OâGA?îšÔw™Þ´ËôÆ]¶aDƏÈøѼÐߏ¹õÎ=¦7í1½sÕ/ñKPúe&ýºKÂߏ¸üDeºtõ-kF%*³µòÄú`¤‹tCIÜüŸ»òĦ$6í$±i'ÕŸ¡8ý¦ç'Ãÿù˜KNlÜBbÓ·PÝP•Ýà_á% ú‹Ã!V÷Q–˜“jæÅ U룡'ÖæÅý°6\bÆ­&ã֖¢?u‰­ E¯ ¥f·¬ EïŠqCñ²®Ÿ ÿç#.±O='±"2{&ýBJ!rì(/¢Â€ +4gítòàM-x‹1Qfhñd» 'Ÿl‚ÿJߌ^ÞdÚK/è) yÅu•›]…”˜MSíP>VΑUåÌ-¡5a…ꚶ&ï¯Û 7ã]“„6á•ÅÚ\JÚ|Bÿ¨»PégÓÛËé»I­BïÍüN¯ßÛØ_ô‹D +;GhA¿YÐIÚ×ø!†å}aÒL÷ò~jLnß(¥8E;/™êªxP0О+ÐÎì’FØõu+Œ±Ñ ߈ûE°æûþ‘@D»J»Ó­Ö={dIV¤;­{cïÁOÓŋr8]Zžà×>*öOªrÑOU +»MIº¾^OþðÔó‘WWÓٍû–©]ϗӋòüáŹíóËÅûqyÞ^]ÍðÚ_.›’û˜ `Ó§´%‹¥yÈ„5˜"e˜]&®QÖOñDtgX¼hÅuàPÛ~åñÍÃ:KÃZgTð¤t+Tû5P@¯îð2¬o-ÑP-5åF¶J£¦›-ËğpàÔüü}à%èÃûAá Üb¿XjãS‰}•Hòè1\ºMØdþóÆ3¸£T•R°rsµ«›û&€b´Æ&VØȯ©œšª®3´U–·Æw2Ëø$Ýcv¼Æ°W9Ö.¶Êì"6K u~¹vâ6rÏ6à…Ù&þä$ؔø“Žy¡Øȟð©D3/Ô1/lù®GMÞ¥õÊk¾x^¸ÃA¿²ÃcÕò£8¾O4í2áwXFh¿‹°óP7°å¸î©³n\ÉûŒcÊ<ýZŽŸ—³«r¸p +ŠS®Þ°ŠÓDIßïšgYO🼄þÏçWזÃ7ådUQ[ Ʋ ]¯BçڇÄôEšd9x=Ó,19,¯‘¦Y}%sQAƒ]õ Ž% +ƆvwKÊ~ڗ*sx ïgYªCO +cŸP¢_¤™ þqÖ!„çÌK~•W¬vædµÃpÊԌë$:~_¥ÍIL¹“˜ªÀ¬á»´}ÀØ#ûÅvHYÝï_ÝOv¨if ’Åc6 *§Léã) ÐçG¨ýÚdð¥ú¦¨¡w§n9P¿ã1½ .KðÌ@ŽÎ¥J•bmŠ: ™õó¤@SÕړŽI™ÐGr@8¹®¡=þL ž£MB|¶þ.×l½þ¤`DÎ>^¾ú½ŠÔ’ßöèzã§Æ¥™ÊàiY„©]„N6÷­o´*d‡sXˆ¼ Ï¼†ì·¾‘Z 8'Ö¿îR@±‚=¼ú”í–‡e†iOç=mÉo„Fn»ÿ¹yû÷£É›ÁòjþnðºžÃæ.ìë¡%KðBN„³9%’—2Ša±Ùu›)¡aiä–I }úWHZià2¹€•–Øݕ¹ƒäȤûãvOñõfyK’;Geuhßg$œ1î»´ß-‡±ïVørå,v®‡:‹A©3ÒLÈ ¹h¢SÇ~ +‚­}«Î-›€­É`à9@ïˆÄ 4Ò«~šË'à‰2öÀ(w¡%P 7ŽËÌö*…0{¤x<îeôÝ7n,:tÀÀ£Ðw€=·,+. |°;±È3…c…‘ ԇ<ñ3C߁ò¾/âûj7‡VJ_¾×†¶)L/=íÖRea96 Á_¢rXIž$žsZÝ0ѶßöÜȍ +w œ¯Üy^éÑcs\4µp¥Rnjßai’åóž ~¦sGS~2uJY†g‘UÛuk9ˆ]ËJCü¼%÷(e_f™BÉ°¨ßôh ˆ°¹—€Y'JÅCal=‹:^ëvñË\Uölô’5lÁ§dUk·í/ ×à{¤OæÅzBÏîJ+r¥á»Æ‡ê¦‡äôwšÜKü÷!*!™eZÜÂêtij™N@A€è-¢ŽxÔϕ¡8Õ>Ÿ™xxöéB%ü”ý“Û #œô•ßJß/zÚ÷Ûcã²íð˜÷%ð%ô4}eìðo§§}ߪ}wã9°ÃÔvMjÓ3V̔cUšÕÌ$ò³«OFã›ú–ʱÚüD§–UÁž;ð·ðæö3Æ[ì,‚Á•Ž øgë`ѳW^§ƒ­“9º $,)- +{T¦ö ­ѓ[¬øÚÛ-t½ÝBëÒx胇¦Æ@à„NMŠáö ¸]S87­t+ ]Í2<•Ô²þÙÌî"{RÚg ŒHw~[ËûÓÜiJÚÊ3Þk;—Ìò&ë' +r n #KEöF#T’oxVf‰QO`ïÃG›uY€Þg\,mbOìñ²ñx1ww0ùƒó7+æ&oËÙ¢¼\ݤ§ãÑí­Ý«ðÇ£9lYjÿ˟áß%üƒIav”âo¸?^ æ.™ìÜöOô~yêlnåÛÞ+ö¾÷ËOù7^'†ÿüt;[ù—ë-äºÿåѺÒ= XÀ>}zø?ÿ÷¿7þçÿÂï›þïÿþ<¿oèx÷{÷û?ÂúÜþû®ýõaÿ¾`Ovà +ÈÑþÂìËBóúiWÌÀEïÉò·ßÞ÷€ÏV%‰¯Ï‘+âü—ÿÏ $þv‰љÕϙÃ~‡ˆÏ×Q:ö&¥î$t%ÄހU9d¥…gêÿ¼t=ƒ¸8ž¹?¯º.™|}^'›DÐX ê¡ Wͺ€A#yÄbYR0S¾>AÆØZT±rïþÂÊ×ç"®|}þ!Ë×ç ²4íx­Ðòõù·‚œçÎyè7 ,œ·o…‡‡?ô.Ӟے£ßÊàZ÷®=»˜—³·å幕éÏ]«yuûØù~8™Nz…,܊_ CK"7G¢2pZÙVð+-|€àL «Õ¿- b &§*Ï06LʐÖÍÀ2í߂`/NëhFÊ ‡žd ˜êðÜÍ +С¼0q¬ê- !?î¼ÝíEšçÕރy QáÑ¢/²,Sú½ÀÐû +ÐÏ«GÏÓƽˆ§œºÏ8Š ÷ØcÏøͼ]HÛ&:UZÆ@7XmÙ¶6*"ˆ桳*1Mß }¶BLÓw6µð¬é[¯„À¤dXDɆCeÔL îALHîkLI?†íÑǦäÅÈÂfŸA¿ZLÉè}_ä´ËüÆ°Éõʞ‚½. +%íÇBeѶ cþ´ Àˆ˜10q™á=S„{QáDÔß +'¢aNÄC'N'Z¥ÚÙwó +ƒº©Âp¬–‰ÜDäÀsLQ¡¤åC>ñ=¢$XeU…¼Á+Umð +„(%+@j@OÔ½ˆ(ÉݍÉc"XµÃ'*®Q‹|›ªHWˆÃp˜Æb11ÍìÉ.tZå’Úž–‰Ì*4TvH‰ŠH¨ú©†´_Fˆ€èÃ`ˆŒ™hÀ¯ˆÇ݌ˆÇc!X­Ã'â­QÉ/·< |Dċa8Â<âªHƒÜ¢i^!^æbbÚY¹Mfñ1šös“j0Ç¢]€ÚÅ0!c&ÐÛ#Òq'#ÒñHÆêÇ߉tk4ògµp^÷˜t1 (D8üÝæV0Í« +ø´®ÒÞ¯bv LUD»@´ °@»CdÌD~}¼i©›ñx,ü ÖcŽ¾ñÖ¨<5ˆÌþ&Ï*2caÑÜK(^}+YäAd¤ï±ÄH°X` Ïy¡/`öz},.¢R–fiþ:}Ï£_Mæ)|?"Q‘@±¤ž#0æÀןÖPɏĜ˜xã!’ ÅDð‚VL<Èbâ‘ØÆϑ`ǘ añ"˜"¡f"ÐûcâùnÆÄ£¡ðsL˜x«TZ‘c⌇Hb„«˜z$…ÅÔ#YôÂcößcÚ("]¹ñZ¦½;¦õ1& „äáêÀ¤[¥ÑŠðWÙ´¶–?¦Ãæó’TL:¹bґ`Æ’èƨ aõ"˜#¡f*Ðû+»Ö÷³²mý`¶%𶠀°mWèT•ö"êI¦•!ÉED’"Ò±Œ‘Ž%1‚±¬Fˆ‘.ÀébŽQøý騛åh$’ˆ7úNd[¥OU¼‹¨F  D4zš"ª‘lä/‘|FXé{D1‚E a¥qӋ#jQ÷"jÑăöX£ïD­UºT幈Z¢qå|P¸q“œQËKS±Hà" d„”¾GÄbP VÂaV¶oD+ê\D«<°zñ=Òè;Ñj•*U.¢hX$òð~ôbQD+’ž"b‘„ÅOy Œ±úﱈœQÙc¥qӋã}è»Q‹FÀOÑ  køNÔZ¥ËÙîÄOëŸM¼ÿ£úi“þ󏞴ªX²ÁOˍ些øióL°›Ö»’èÿ¾èÿTý}êþÓý‡ÿS³†þé㬾Í?îûŸÎZï u~ÐZ'Í +¸¹›Æ{.W5¼«Æ=¹æ¬Y·q×À£ë7â½\6u4DŒwD‘O.'“ë½9öé:Î +¸…GÇ>YçÓ±à}½:øèº_gܳƒƒ[óí t/ïN ·Î@­ÛgÜÆñc­sý xç>¸æþ©B[8€pdë. ï媣àv‚×y‡VÀmüCöÑ:‚÷óá£ë^¢p ?ŽnÝS„à½|EuTÜJô:'RÚ܍d_PçHðž®$x´Æ™´náN² µÆ¡ÞÃ¥TC½­´®ó5U¡Í½M5»îo‚‚Gûxœà¹uŸSÚØëCZ÷;tÏS Õ¶Ò¸Î%U…6wJA¸Ðš[ +€û8¦ riÝ5U…6uNÁ€ÖÝSÝÃAUC³í’Içª +mÏÕx¯º‡ÿ +Ÿ[ó`U¡}X8¤5/BÛû±j¨¶ã(\wpEÐ6.®HڎŒL‘°ÝÊÍÉԑ±© +mîê +bvdsŠ¤lÑÆÝUCµí4®ñƒEÐ6ž°Hœ®Òx/oX$3Wi¼—G,ÈÑUïå«¡Z3ºJã½f‘ü\%òN³ %W)¼ã,œ«ÞËyVC³fBó +§Øǯ ÌU +ïå[‹¤â*‘÷ò¯E’ò +¯ØÇÇVC·FRr…È{¸ß" ¹Báý\p‘\¡ð~n¸ W¼‡+n^Äâ +q÷ðÒ‘¸BÛ=¾-qBqGªHê!g’E}Í}å¤:XxËAïk@ p%ÚÕldº (ƒäêôPÏ¢v+=Øm–õ•åP)$:7:ƒ +!©«#–~þ\ϧ·»­\[[¿ýÍ·QÝ•úÂNÂUæt¸YSÑg>ŸÄNTÞÏ~;ÑpiäÌ&yÂ_}Œ+|vñ¢øáù‰ÃӈU`5&úxúç¿åP® ¿UÐxô{è_zF© = +=}*"ANT¸n裿žÂ}Æbø`ÀW9– ëám0ž ž.Ò&ª‰$>û‡ñYÀ›Ó½¾þå®S¡'Ü(—=|­°<÷æè RU?úþp?Ïâ‰ON¹Cgã"_xr¾Í<ñyäÊ +Ë@W¯ò5›Úfbõ’Ž­xW¯ó݈WêÝúƼ©7&z4Ñ ESQŸˆOSÍ«!Z‰+³Ï[ԡӏqe¯LV/ÍÍ åhi*sR1ÞOXß:+Ö/SيûQsÜÒ¬^`Fópí´ÞjÑ û$¬ìÕ oU?}§•oø“xl¢¿hEÿ4¥Qc±‘ÔÑßWÜÔ:Këé¿÷£æ¸WéÿU£¡¼˜ín(7ë¸æ}C‰e>s†swâQü/]×*cÄ:,‹ Û›D}‹«hŽ©ô)=,ªË`}El+‡v ŦU¿È,ãL¡¾® ½ý¬"Ћ—/·Þêû ¸pÕ¤)ކ^¨œÒØÌò t±Ry¦ šrÔàõB ½Ô†(`§Z¤¡Má-¡Œ…ôª!&t9˜}ƒÖ.ì ±@r!›0ÄT&×nDf,«£n)¬þà—ÏþöÃãޟzß G³á¸*{’y LyAw’,¾H^dõ/÷˜H°\.àsڎûpƯT Y&Ñ#¦‡X½™1#C"üV@5u÷ô*C¤M;Ãc\8+a:)—ޝP4}‚¶™äJÏ' Þd†¨q܂Õ3Ivô0J}HHzÛÔãě\R–¡E¸(Ía?õCùhZOšWä(¼ä¤^ç©kY¯ñlÀY£ïԵܤíTîú‰hvS¥%K¿>ƳQ™'&ð Q¸2ÍkkÀ-Óx¡Ô} ¥5Sëf–Ô*¿|xõē/†hÈÏ¥O­HÑ`Š«‘æ¡øX]Ë4o ÇÎÕÙ߀sU‚?jyU÷ÒDUõùŠ¥= Öêäóÿ>ƒÀ +u ­ÈG¥}µ ¼/UÎËÂ`¡ðܙe!àL¹ܙÎ7)„ñòªÐ:ØפY†7òdV&‡1Mà+±òI‘Ú“Àœ] .Y€ZqV\˄r‚¯ý,¬œ|A "²lO@ÖÕÒK_™J4¸œÝ[á©|«VϳŽ»€Äv×.WN&™ ×%¨hœã)K„«Xd*uÕ¨1‚Š$,a<¦*IªËø)*Ù?õÅ}Úä3™Òr‚!¶f}ÞºÇÌadÝÚܹðµÖ³g«™?ŒHÚc]Ðãêúš­g±†jˆ U™¿¹ q³õõy4_4K9Ö¥‡ÛL‡ðG¸ ŠÛ+Y˜0¡ ÄId}.ýïš*±ð*MÐ*ÚÍÀ+Ç/y,‹ýò'ü<^9ÓèïY°k@9Ç˜DF°¬_(¼~¯lÀ[ee* ܏,5^À‚Wiœd«Åhpr+•àmEI^‹ ütö 3ZêÜ?#S«¯ipíºpgXeºi 0Þ®Êèû©«?jd_«¢€Jq¡Z•)ƒù³=—RP¥âÐö-°ÿPD(Œ»mÇ®C)p×8E"I \Ö}êtԉUùÛ};¡¯5ßèËÜ­Ä4z50èÜn‹w_eà\Ötx‡ogô턾Ö|£/ó#_€îÍ´BޟÙ+àÄsØóäóGÁýÏeïÉàít6Z”“ÞõhòÛòê÷ÿª¹‘òóØØ  •p©¨½ÕÙà¾ÄçEwу)Üí`"Á$-ÓwØ¢ŸŠœâ£ (Àå˜d$8Ye2÷gÞǘô]*8 9æaC¨¢tBª´pÎ_Ъ3ôh è½ÒAœšmÀFcLÐ5³šºNwO£.³ÏÕ/Èû¨Æ´%Ô¾½ª4lž"¥§CÙpƒ;¿ ÿøåCÔòÜ-•ÜÈؙËeš€‹- +Y!˜R :‘Éþµšx( ób0ÞÓÛ ËFãÃ?t“eRaÜÊUQ1‰ÎQ6vQ®…íÐ΋ÝIŽzV‡tNf¸o5ÍáȹB_|fr(: ܽ&hó%â]|Ÿú{O] õ½ða´ +´£€<2q¾œ»P„‰T N4ìÁr\maZÁ c@ZË 2'bUB—N0eI"Üm½0Áhç aç:…‹¤í6¾ ²p¾{Beô:XÍH騄" ýÆ{Yµª ¶r&O _"õ ©t¢dØwqNTÞ¡Šœìðl*áÞX™ÀÍ&(éb¤§ŽÆL݄…1 ïTL%Ø7À¶â‚©!Ó'µ[D+b+itÌ3(q7~£ßþ:GÙm*ŠBâõ’¹(@®Ó©Â[°UÜâN§Û_Ÿ×ò20>îÉÍÀðYÃϼ'GsÙ‹§¹ôö=¸ZL—˜¯Aºägƒ”¸¶¼Í¯{q7ûÜ^üÍÊ5ÎAÛó8|nËYh Ÿ³’ì^œÎ>WÃëÛÜÒgöáw˜¶¹Çäô}xž[ïûp=·Éöâ{àæ©á|އ÷A6s[îy­küÄÐ5¾›=x &ToIÊÞoÙÃ˳ŠÜ¬#JKÀÔWƏ@v† ­kÀ ÎLÔÂèÑ3'˜¢…º, Ð*~´„4ÌRzŠ©EâÌ”­ƒ¢^¬ŽólË©QC“Œ)à3[Wè Ñ˜Gn•64ê~@P ŒÈºU ¬<^C§¬ô©†Vñê:H«{ +^­¢§í†Ls´ºgÇ*µüä¬ zþÓtò|6š,,Š“G=/þå«?üt‹¿åî·çã¥ý÷ÙÅ¿[õØj‚˜²Ü{4[ί{?&ƒ×å¬÷lv Fû?öܯ§ƒñxôz6¸½ }ÓW–Òz/–“ËÞIOõž/úÖÛ³=þ¦þ«!Ö>³Òú‰Ã1 ¯íC&~Æ®’gKêëʝ^Ëùbtµ v—lTi:XüVZµxòº¤¶~æjð:•£yùàÛ^ߓÛNQ•ØŸ`â.­tf&ê<|…Ïà0pÿWÀÝ!öÓ~S½‡?œ?šÙõ=.ÅÙèÂn«óӗ¶ezþdÕ$؎JÀ?ñ9‡³i»Ë[†óSùŽZ÷Dõ«Zû +ÿ…m¨íœ¹½ÒØoâEnEZéh‘l¤Å'˜ÚÂýfgñå⽝°¯þðà¯“é» ~ƒƒö›‡ã÷óùàüéËo{~²ÇՃ‡ö,~[r£§Ó›Û©] OFc;d|îôz0šô\vž¦¾Íá ðóh>²Ç1"­Aòr1¾i…äÑ`>V0̦oÊ6($þ4~6óÖXø°d˜.^”é=/ñW×ÐS£×ÂJBáƒÇåUï»ÞWè}áBÉ໾¼gåƒÞƒçƒÙ¢v”§ÓÉår´h6Àí¨`ì­(¾6€.Pæ/¨o×WwïßD?ó5÷ɀ“ÎäèûËrÔÅþÑ»mef†¦+$æ.!YFüÛ¼üþm9yvyقðŸšZpr'¹ÆXã4‡!ûÁdÂ]„›Z -ðVÇKróB ‘·5Å\m'Ø£qiϱG1Ä·Ç֋ÆPl”}æû_Ëá:ã~D5•—c`–¥'«3ìRÏ<Ÿ]]ÍËÅ·8/Q|óÃx¼Dmk:뗿B‰%w¸Á¥)DF+QLËÙÛr6^Ê +çþ©wf {òýÕUùƾãÁ«ÑbOþͳåbn5Â(@ìñh~;¼w_¿ýä|ž·˜ûÁÑ퇉ëTcvt¼»ëÓnŸdrž¿Éˆv8ÇÞ}Xg÷u„­Î©ž0RLJÕËÑÍí8V^Ésù‰•Ê +‘FÚÙÞëò¹Ý…‹FÝ3Ü=4€w'}wÒw'}wÒï£Ý}«NèD€F"æ¼}âC¬þèxx{§ÓÙÄòúrt|?|SNzƒ‹™E\Nâ“bû䈾PF:ç]ïŽ_ηl†ÎTyïM•B™ÎzöÁ,)?¹ºÛǼ‡QÄJT}öƒ4 ZÉéØY4TîXý{Àöswpƽn?5±%èMÃE0º­?5ÿ))e﯃ɢl~fBæ¯ÉéÌ|±ëÌüryYÑñ²Ž—ÝKyä ¸Qµ +:n´‘=–v$?•ÓÉlp}S‰“òØ&d*™¸+¬D&³Âg߆lÌÌH¸£)8á×Ò2…xi™©©IÉ‹¥Ý…L’fWۗ™ÌS‰éÖ")0ÓʄWÆ£ €Pª"ÝB(q_ •¦)Ü¢aה1™ÈýRR–@¨†L€YŸ¶Pê#ßGeyŠë¦¯%^âM£˜ñ ˨D‡ØF·JbÝK +å™R¹À ¤Ȩì€%˜ ²Q³…2úc’å“ ïn{ªÔ(Œš6 +/ô†*Žã÷•[q–îYª3ä÷»)·Pú“.ÀO,¸Ø:ÑåÞ. “ª¼€E¢%PýÖtç\Š)²Ô]†© `ß楓õґ¦[;­×ŽÖy'Ÿ„ˆp·p )ÔaÇrÂÎNµqÝdǽn>˲é,g¢þü/VAîò :cÞÇqLàrªÍ‚€ì×‡cLˆÒ2íõÚ=QXy´¯ŠäË˂HDZ ÂœÒÉæE‘éãcû¹U¨S Ö{n¾y6^ÃPN¯gӛã䓇‚¶=/t‡¹}Ãc›Mïõ\ÊÛÑd^Ž?,Ö²š±Û{ð·Éh8½,[^¾hQ‚qK¼DjQành/?xúìâß_؟ÿÔ[ЮÙyçhÂmOø#b-rU<œ¼ÌÆ{/`Mʹs`?ÙyÂ5仢ðøãòÖîäù³Iþöó`6 +5Ž+½(Çؘ¯¦•ßè=°rïê1óÏ'ìÕ§Dóð×"}nÕã î²ZgV&Ã& +cRÁô ú¨7ׯ~ضáLžåûm·Ïh_t»×`C¶öõG A|~5¸ìqðz› D*iòï“Å-ÒBӞ¹n¥ÌáŸ^Í-¶Ow˜ío·Ü²‚U*óôX ÙŸåȐè×ü,GÆq&8´WÅ P¹¬+Tž$ÛK•»²Ýǘí WÊËw‹èÓ-"Åܽ\Cæn²¶ŽhþUþÙ¦ÿ‹7½^—–³L@ü,ÿr oGhê,è;ì_Ì+”Køþt<}÷QôÉê>ú_Jeûè”ãÉe՚t1^zµ +’By;~» ·º +åCLðóáØõŒ¯cXÎËç/ÏQEJ* Ü÷¾ÿõv`™ê£òj:+{?[ ü€4…ƒáÉãÁëùðJÓuñ¿¾Ï|øñlzÛ{y=¸üxŒ¸ºyšæ{f5œÏoeóÝõtö›cÊlê¸ÌÞT½-g‹*7¼Œ˜?v̽cÿ›å­»~.ÿ±³bN¯bÅ9ý(ž¶Ú!‹ÞÆ¢:XôûÉeTtw!Óçƒqiw Æó‹æýþæߞæórvc÷X9ùÇ·H_~ÒUøêχuT‚Ô¤ßÿƒ~n±e€w¼ØÍΘë+|}óâé£Þ‹é‚_‘¤nùÄR#tÞ#͕›?-ÇÜ>•YŠɠ܆†³ßÿkÂ-È +wZ_H£\’F)4-5¾BÁÍÚ]`}Íða1–îìE†]zÌÒRëéŸen1«4šÈ̶V8éiž¹Dã$nP0¾âÎVQZØÓ?I%æ~~¤á*oÆ]šˆ¤iæ¸aŽ×£cN—Ò!0oŽY?gãhOpK “â& +|V S`ª.Dî8¾²ç®©"/0š† +skǀ` Q8^RØêO¬\Ì©Tnwd:A̹Nìg<]RàáàRtfûs§rpá¹1Ke%6œ½T[6‡«²Û”ìîaÀ©åšX™=Xº(D¢Š2—„hÑ;2Û]!q£Zꃱ~Çڍ‘¹R8"ë,sÌ3³‡Yêvi&pߦVžD&©Ç‚6]âã’b¤±BFM[Í»…PŠÿcdòH̯w­>PAö—ÑÍ „¶ìDâV~6^.˲ÁãÜ4 üÑ5"{9µ/˜5@ånDôt:¾tQ4;QqS‡lsP{„ƒ×]KÿÔ¶+VŸóméxüæél°œ/–W`‘½ç¯[*fî@Ž“Ò8†¦)rx«yy†]|.8D;Qó8=,> «:’4ÒB;V§\¼å È6ŒU­p‡ÿ“Ð"‹ÞfÂq‘•áe¬ê§¶=¨1Tϲ8×=E½Zýàñf¸™AGÈ"Vlù9Š.FOI–!>iÏt<,5ÿ¿"À¿À%/³ò…ÆãØTaâIf¼|A[ý@¸%r`T¹ì¿;HËÌq¼:Ë{µÇ’q§ºm2Â¥•ãÒlF­—VµD^-­b˜:!ËξSf2êØêBš¹3%—,ð/{t¥ØC²_†ŒòêvÎÿ§Å’h”0à8°ÿ+צpW?…ëÏ +òYêU.êÑê–5Ô³`iËXܯª–(i˜jûo؂//®³‹xú%nY¾¦$PR±"A¿¨H©bI_F¦=E’Œ, ¸aP¬ò²@F†tHyé8¡ ł,’ÚìPK–T©ò–’Ê´15ʴ뉛Ö¦Wz,®óA!µ¢9,Æ¥â®Ø½š¹œ%3Hït⩻ԝr=«=‘¸z³°Í¤åšÌœ€ Dš¥^x¤´ÑHÌ%úäEXr‚ð=ìolekwƒÐÙh¾¨Ú"×-çۃ¾ª«T³–\òUÈÇû*¾¤hݦèz´çýH"‰ïPTÿäz?/®Æ¿ÿ§Æùô­»ïÕà⬴-Êû)@Ë_å j?™¾YÎø|zû·Ûz,൸œ¾›0àQ ±+Wåøòè8*Z'•‡ŸÑ³ƒÅòfŽMéé'£1ëÅK$ÔË¥m>ñ·Y]Žo³^iõýhòf°¼š¿¼v¿?öRœ¼zøòÕ÷ðmóÕñÐã%T]ývíÒBO®-¤÷‹çñt¸´³¼°ýà}‹5|]¹ûñÁ/?žý4½,7üü]ï›_oÆÛàÄ.¸Ùèb¹à»<œÍŸÍGzKÔÎ +‚Vê*'¾¹øégøgî¬üæÿÌÏßfóçqÛ·ƒñ’Ãó !˜Ê·ó½™W¿=©&ÓIلJã©]ñ—ÈDMÿx¼M.m‡E“AÚ5ó²\ü„£i0иùÇ\N±(ÍH1‚kcíŒ&3}ç ¡=SøÓÛælÚƂ‡q­‚8½9ö÷I—èŸæðôÂj÷aó•ú9öÍK¸ä°ús¿¶òüêݬï#àäs¸ûÞ֢̽ŸçÇ +mö»Ñ%¤76˜wßò ¸·bçȬùúºwá¦1¶“¤;÷¾Ñ¸ÞȐ4X¤Ú9ª_›1 Ç©mÏÅta勳òjñl6²êl£á­?t0¢òȗÓålX>‚ðÝÐ%ìwý¸)ƒK+d}„ÎܙÿçÒ[J­¹¨5‚8êôѸ,/a-þ!§ìÜÓÙôöᬸñºcuOfàÆÿóéh²À}ób9.g•2ˆ1ûGŠµƒûŸX|â\püjÒw¤mòIñüá >>dïþ ½xQŽ_M_¸¸=ŸÎGÐyüYr§’æ‰UFñÃüálq1Ì.—Wƒå¸ªÓdP$$Qu•’ŠÏˆÛÁåe ™{Ñ –\¯Âæ·ÓÅ*l0ɈÛ]ގúÄ·)@yêCs]ÿ~è=\.¦½ƒù¢œ~+W±>üÁÏ´¢zo&Óá›érÑ{=›.o··ͧãÁ¢ì]@,¥ëWZ½ÛÁm9ëÍG7ËqHùûš <{¶ãS까,fƒÉüv`7Üð½í×èÒâãq©e¾[OÚÞ-·}=+yWïlìlú R•+nJ–×ÓÁäí`þ2KT¦òù¬œ—³·eÌÛ½ï/G‹ÁÅhLÊÓr<þþ×E…‰c÷7?‚Qí8;/ƒÑ7‡ŠH:5ù«ém¥ÿ€«š£x„rOKšY,€ª–ZJf…iHI8åZ2œY?L.Ë__–Ãéä²åCOF³ù®áBÙ2c›žã!}èD3¢½ç™1¬Os–‰†Óì‘šYŽyPÒ»bæqKܼ^·àbâã.0ÁÊ3ä 'oí[-;¼Ø.ë8]üÌp<ºµüŒl¿ZþùÚ²y˜™HrcE©uÃAU”YŽÿ2XXÞs6ÆÀç±`Ck;²röÃãJÛø÷W`ë‚WWºŸô“HV|óð‡'Ëñ˜¸žÏ«±¿G•Yšmc0O£Cg+'zT’Õ¶}Á‡S8j>» á£ÍÖÆOÃ2TÎÙÖàZë|cW~•ï,5­»ˆ–QóM›•„ÉtG6‘sgÛ&äĆUrÊ 8_ E¦U°™+Å«ÃäE.¶´}TџM¯Fãò¯åû­x©=DçëŠV¥Ù߯­F¾Ž2ˆÝ•Ö/—v±>™Úãøp¸ðÄwÐ>dS®kٖ¡7göÜ&Åù‡Çt¬ýۏååhyÉöÿˆÎ8X=«ÍnS6ªT_`5Õý4^Fˆñ$‚S/¼¨HkmŸùÕórãZ«4{Y,Ã`§Ð<øÙ /V…—JÛg«Ñnb‰Þ÷Ï_¶ ´ÞE.‡³!½\ãÝ«¶Û@1ר!É<ÆUš‰Ø01™1³7š Dæ ZY¯f)Z?Þÿ>½èßZEsfÎՎ­µƒWÆãÍæoF·v oV˜Äj»Y Õ*KèâlGÓát<ŠE’¿úÙÚ ‹ž‰¼Þæÿ—éÅ“«i/kwQøqj9è?¶†["ꪡq­ûóŸél}8 +&äÁsþÈRÛä¡ÛËûóxÒ¼_·—ÍÑ»ˆ‰ðHÝz¸½ùv[:|èØ+LŸËS®69ø675¬¸òŠ~¶ãèÆnªþ؊#$Yô‹S2ô˜ÜìD=‹:’'¦oÒííß‡¦âñr6¼î½š•£ Ëi-¥F“Ö{Ø6C€lRáÆë/®’ss« +-· ›Æ²çt«íÖ6CÛìvsYÎG¯'±ùWnãÞYµ'¶D¦IÃÁüb´¸Ü6çxՉYûxÖ¿ ’é¦&Ãéê~€1ۀ )F–׉×g²¶ùì²o…mHºhº©å•=­¹B Ê«µÍn½/dëÂÀ¿îo_Œ¾ŎEbåj³9ètŒmg÷;F:ގ‡ï·°1×h8Y3á­6ZX©<ögl¥²ñà¶9|Ãm¸}}ó¦_NÀÔ³•]C³9WÙ¹–±½ãïÑfiòÝ ¨ŒCkÀêX"´µ„·FUßù P¢v5Φ·»Ú€œ5²2Ä®v`ãê@Û÷Š{/¨œƒÙšE°~–GƇRƒÖ‹x\»LJRýyÍ¡ÜÉ|¥' Z‡ž4h÷¤ng]MýËñŽèÝή¦“­ìÚÍ­ÒɖŒºÙšÛásK­Ð2ï_Œ@šÜ6éóþ¤|=ˆ<âZ ×4ë í¹4فm,†¨þ³©¦~1ÌûóëçËmԂVåì\7ë ™êìDþI&‰þ_ßîÐo¬Tˎuâ¨m +]ÅkU׈œVÛ÷Û4ô¨åtq½SCwâjݞÙufT“œ½Ò¾–VÐ/çåãé ¡õŠýCz2Víc³ Îùç£_Ëñór¥ábB¾gûzJeŸ¡rœ‹Ø1àž:cÒÙ{ +Ã֞ª¾ËZ¿Ì=Öàmû(xª­ùB&ƒÝm®§ïþ2º\·Ž«ï¾LøÝmƒ‰j,žÄ•ê>†ýÅRF?üäœVؖMÓ M_Í··»Z +h‰Þ„GA´ÛÐl˦Ãm]ÐÝh«}ŽÚ>Ì//ÀÓȦƒQ9ïÙcç²g×](jùÎ|QZRO^—“ÞE9ºé½¼Å8ºÙ¤g,g½x"[Ž.µyϾåäñô Îo +,¾+'—ÅK‹Ü¾`^ö¾Qÿ±gç_{Ïüö÷ÿ„ÝÑ$~IÏÎ.Âàõ7vžŸ.–¾ž nnzïìÓ¿õ{ú½&Qß·½†lrL5½ùýÿ@ÖïÄá€ÿÛ^½þý¿Æ‹Ñë’zi;4ÿí]9|ƒ \W–“‹ò=G جº%a_?œnw±ÍÊü½Ø!߆EäÄÀ‡³m*$µþÿ»û®ìÖufÍ÷³–æ°%Ëʁ¤rŽT–eåd+˒­|ÿû¿ô zýÒéÑô03ERTØ}{õÚgùH"ˆ +…BU¡> 6_ÂDHEgBЌ$__/ÞPt’˜¢ï@¯ä•ý$¦hã°úá·X†ˆÍŒ¨ªnm‰sO$íÎÛr;dÛE¥‹ÁœŠß½ÇÕÎûv³bƒÒ-ÓÚòöw;…ðt°Ôýë—Âc].J§WzÞ쁹u@bSã•a·š«á1ÝþüïT„r xyñúΨ¤UÀª>öˀÞÿ×ö°N^3˜7ÁÒùoÞ$½+®ìâ¨Ïï“ö,ÊýÎђîâŠM SD6…‘‹á¹Ë¼ÉáVì)l-×Î< F'&[Ö}åÙ4b>«I½¼Ça76#‚Újä-öÞkCǓ>ë9åíö!W™ +vÅ¿*xÊ7 +žæÁR{Z-V¬}›¨_…„,N5‚Ñ®\»·ª‰"3\*TbbzØNÆ'`=Ì÷é#nÑSî¨H%\ôô¦¾XN˜&x®Šv¼QäÝ«ÕÚ¼ˆTŒo“ˆ3I®éiiM§¸*ri ( D )uýG¼nçȉlˆÂïòö4ų  †ËÀ¼l|&¿ãÕæ¨BM‰V7Ûd¨˜ñ¦h¯Q;ÉÐãåè©×ìþ÷›ê}hžÙ ,”±:7Mü†`å»Ow^Ùg›¨íù-ÊRRÞCÀkNg¨Å*Åú¨Œ'œ\1^p¢žÊçýžôö=uÇ*†¾5܎C㎭à2TìÉø!ûó\þj ­ÍdL­ÆŽ£ÞÛ̑ޗ`¼™–ݱ`éÃXŽÎS_†$ÊþWÜí~Á°cú;½´aúxhà°ÄöÝ1~,N@&*iL©Â)¹ÌUKñ°{^O­"ÑiÚá0./h•f]@Зμ}½ì)ýý™t÷ì¶Ä϶tLäë§/kÔûrΤÝúvò{cl2éV˜HÖ¦÷¾Vµÿ‘h¤-yªürÁÏxxùŒŽkÚözΘ²³ ƒø•qO/>Û¾ä&¾éɯSêË×ÃÒS¼´‡cÆ6Uhô15X¶à“aŸÎÏòÚ¤Ýÿ­OÔí/¿T#:ãِ |›¬Sr꩚R_îa(œxu¬É7ÛÈO›™Ôül‰¶ +/_¡ét¼†ŸVVrQú¢Hã˜sì;¬ô£àjP˜%7¯1£ý`ý8'JuÃvÀ¾\€Œ7ÔúŒ'~§Æk¤rú~>"+ŸÏy\¸‡i·®ƒ8[å4]8¶ç|ƹ¯íÂfÁUÊ9ƒŒ—#&»mžÜøÞ¨>tK¯ñT>üÒ&m¹&à¦H –š»Ñom2=Dì:&æöö¼ßÓD#ýmM/œÅ=9õIï¤Y ¼¿vš‰J*ùž^ÔWûøþ3¸d’încH1´çõÈ!nm%ݝD%“þnS«o¯3´øy]fR xù|µÙ–#è¯ïŠ‰JÉR̤ͳ"ņ×Ô€"pÚ9ªÖXk¼§ºõúÇñPã¤K4 +§óeçDÌåq‚ŒÎAËTU3¨’‚ÉÐdoöº$FáXË|Ä]H£p& dÄb³&·x¼„Ìå.3”øľŽgÄ'Ø>« +¥lbXÀ‘Ü„­»Ð(cZ ,Üèfý LµDÈ﹘gL†9õå­­Ikɑáä̃î)›:9ƒ‚³ëÇ:÷bN-¿È£/4m־яÃ{nÓT®Ë’vÛ$ 5,õ¼˜dòÌ +”M4N–ºk©ö¢¢¼rÙ®o&I`DÖ]¾ŸÓ{Æü¾ eҞafGðì3®k _ÓE†L{|I¯½ÒBºÇçZ6D5íí,ÉïÓì'¹ùmm¯ŽÔQ´²ìHÛöÈì¾~¢¶ø2‚×> I¯µôE«NszaÌyA{·_”J$[£Ñ…âgՉ/#¨ïGé‰û«h¾NÂr†D­Ñßø¿7ö0ÒnܺÉp¶,œ\›v«L8‹›xª¾W³Œùlk OuãØäLš"û6·òˆžB6|KÐÀyý¢€d å  ¿§/ž$~ÞôõQ!E? $Fñp.åEF- J†$Þ;õsÃÍ=E…¡N¿üÄÓ 2þDµU±Jê×ç+Ž_°Âºʦ]ü™%±">K`…n$@}¢˜c5ðiÌ<€ŸàH½„~.œ: "| ê0u¢¼—¨¯ø8Î|…d¸zê5øÀx§ÿàß)T„"óf +€—èvôc‚ÚÂUAKúQþSÓÒÿ!™nÂæðªš%)2\w™RT•ëYú¢m\˩Ρn¯æd~·§/3¦Ÿ²LC´hêˆ_¨^†û…S%L½YX÷üŠPåfo…aè5ÇD¿Ð3¾A2tEã$¿ÏøŽä—çF„eÅ>V"„cΓ†i4ƒ:ñ›FõbH{Ú#xÂ&Ò" ¶mtsø<¿`8Õ: ¥þâ+‚Ɔs®7‰ª +}ex­HF<=(>°¢½±¿Ñdm–!ƒZ‚ÑgfxÀÍ®mHZØÚhN ¹I*H‚˜^W"‚¯ˆ °±‡™Þ°º”œ£œÎ[ž”°¯Á&–f‡:7o)2REù¬ðUê7‘àƒÆ–æé3¤Kž`ÅSõ4‰6â ä&¯0ê ˜¼¬@KµòšðrdXF"}À©]FðÈ N3Ò +ôChkZVñ77ÎÀ¿Xüu)ø«ò²”•»ÁŒÖâøÂ擠Ÿ1+ìz@ØIéu¼ýÒ\¦Vƒaœœ®÷jÍäÙ.žÓ»¼Å·q¬m7ʒ^ÚÍ1ÊÖ|ϛ?¸ÅTàça/ñ–ÑH}k½t±¸Oò»”εßt%^&ÀûÁ/ÈX‘Ë|Ã6ð}”Ùr¨§N¹à֎œÚΤ×FØy.+žœ,Ós ™ã™rÂ9À1¡­¾…×]¾ÅübèX6™íBªPAÇ ^³oåÚG6ÌOóˆ Gp³St»G„ ¨[¢›="huÂþQ»Àó¬9ÏÈ¿qrô84_×´9Ö)$‘å,d]•Ð›¡ÌÁç;4"oIÚ_phϸq¹èx“^# `ž$«ñ¾%Y}ýh¸÷ŽU<%mñƒ®ËXÌ67 TW8V¶Ù/X®j™ÌЬý‚ÝuÅÓÁo¼]µ‚_Öú +,ˆo$î<]}BÉÙӅƒe$Z €FkÉ(U”É‚Úrj¦1áMè%Q0á"}9“]\ü“›ÉRӘ×8º]¤VǕ7½°÷-FîS¨>AHUE”WoU sf»ðlª¸AE‚¸_û–1wßO‰bŸ±:R|›¥g?#…&]zaŒaéTî…b©}«:¨@µfµ#žà|d˜Ó¬Ê½;“G õÖ9[$øÖô’ÃÁkŸ +¦,µñ}r`b—°/Vú€öê_3y¸-ɉ³·Z6H÷Qè€^ÂKK Uå][Ì®¨/ì"çä 2‹%uÏÂLN­ØGÂm +T6lû)û€¦ïz‰‡cMC:ÿ³ê'=­Ž#Qµ¼/µ†5“}Í~ú’k|v@Ö œž”C-0g:ß/Y RC¥€®×¥šïoôõÌðÅÐM/˒¿Þ–.˜Ì&Îä¡m‹åëΛÕ1  -ôõ/¾ÙDSuƒeµv$­ÞÁñÚ “ƒxK:±¤K`˜—Z穀©%= ‡{@‰€Q‹åûÙ0]»ä¢xqù{±®ŒÕ2°õl‰Lº›³HuNPÎc }nû\f‘”jY|oÓPETQh>0¯QgoéE`ä${ó“AÄÒÀ÷ÁضÀ ›Ø~U,"y¶F¿|pÍ͊åybx]RRX'ÈF¨!{r˜^TEJeЍ͡e-•ø\fRñe-§àùDÀ¹NˆJÑE–ïx«‘gÂé¯9@/¿èâÁö|÷ïC^ˆT@†$Ì4d@–Þ¿Dݕí+eÿq-µ„³›ò5êËæâû^¨ËÒгò·ª@F¾ ñÖ¢qæUõÎiGmfß¾×<Ëüixu™ß½%ÄÎÛ}‚(%Àb(ØXäŒç×|0bØMô4Gr•s:78Ó¶I† ›õ¯M ‘Ý}ò§õ\ +MUV´u/¹á& ñܯÀ€k8ÑzÓ8[üð¦bþø9ʾf´ÅøáepJ/¶‡„ÜÀ:º4ÃM§N&µˆ¹.§Ñ§Ƅ  4½2úÎ÷ +#<ë¯t6ú:vGÀKE„§­Þ‘­7”1ågmè€~@mÑIÏÃèHœ­b…鲘Ì~Ï!Ô–RöÍ<éÞxlGw/üIÉXGàÓÌÉ«;ÚzÞhÓM&<öbª \LAídˆ”4©EJ—)ý’SÏ/ mw˜%øeLøêå ‡î{b›X\¨H°¾èG@¸¬ÃŒ*l,[]ýD£aÐ +¦lr{ûWF§ f»)€Àœnü&0"–©ùaä´{ð¤ã¹Ýž)lÛBƒÏKIU¶ß ½MdwX#…^A°Àµè3¹ñÅõÈÝ w[½pÛÃg9CýQ ÚáÛa~À¢œ3cÉÍf7;ûìb·¾™õ|BN°°‘oiÓUz©‰Íx7L^àN–¨mK§´­²Ÿ1VÔúÌ.·è 2Ðä §:ï'ðx´‡ é¯åD«ŒoŸ«•OZü ÀËÿö +í$‘iPJœtˆ$‡¿Þ°ÖF¨MZ+F+àáÀ.µ˜0å¢e0)‹z@:ãP$ÝFLÛdÌ|+]\[]a‚ ½O½‘µÊD½§0Q—"¦ª¹ ƒ)Àys®^‚aÚæeJe†§hMï&îë,Ʉ?{<Á]z{ÆT°·Rxóçš ? ×53ŸttÿCۘ±é\ ÐPžþÉnÉ[)îUÇ9` n±Ðâd+ϘO¡-9õš=ɲټòýæ«V. ™ÆA9cR­ï‘ö®™t·]vž¬¶e¢‘>Z¼ûâ8n´ ¸`a\H­Å M‚ëHúsÕ}AÞëù²¡Xƒ~äêpUS_ñ™=ß¤Ú"[#ª/S1éO¼÷l[ÔZÒaS+è«zÈIƒôpjR@ºŠÜ …»™ˆJ/€b0(±é~¨Ó˜ M¾m‰ß˜ö=32}pR|¤ ÚÆk ]ùpÊWr5o°Óœ€ÞÌ3´ ŽÖl -@3¨þÃ.ÌOó_>U¥DyC+Y¶À´ÚÀ\jÉi4g‡š†>Ð$ûúÀ²} ËÁ¨¾c€Â_Ólå‹jX¼!úSA0Ÿ#D l ¼Jžwz¿/Ք˜m's„—jmËñdO<ØRÅǎñëà%G^CËIey®~כãÉ1åëgúßÿó¿ÿ¯ÿ¡œ4I¿vœ‡½x™ÿ]ÿ—ôñ—¼¶êãÿ˜—Ï›Ój·™'.eºluHÃ^¾(ºÑR£®úƒGæ¡æ”kÉÿI:kÒõŒ|ÖXkâĜֲÝû:¹à'®]ìƒ*û =¹bSVÙuî¥Cÿ(Ê>%¬‘š÷Kk²ÍZ{é?­ÈZ»ÓèÓZ§ŽºÖüÖÝjÍ®ìÃU +h­Ñ¬Öà>ºôUDß«Œ¢XnTˆÁÖù)«y~HžIk¹ÔNóÚ:ó4½v8ž\`ÔÈF þk'絸ó¸ ?ßˁt/û +Åp¿#iþ1ÔSŸùMšì¬c^¿mÊ\¥©ÞÐ9߁ý3î{­íë;»z8œõa7ëZSîhƒ_»tç"»W®sѝ9¼-/üÐÝג‚S]ÚScSß]”ÎSGæ·A˜]=63à¨#Žñ‡ãÒHûÏ4_‰c™©×ŸuµC/ ð5»ïvӐ ÝûÒñp{‡ÏÐ{sºë&þ` ªYüÃÝù*Ù$©~.“9Yª0—øvj9ÂBª“ÃÀimKS}Kš_š»MIŠêñeàMrTa^@8­ú~[ÒTÝæŽ54­”¥¨Σ Éò֎¤¨¢ø Ët×û¢÷‡ªÝ,ÓHV%ûªË삯•U¹†¨2"ÂXöe[’¥j,”Üe97S¢©šET0Bº¶ëÕs2‚7Ýۋ¡ ê£4Õw£Q4´î†/»ATÁ¬šBªŸ‡ÏÖ¤†¨"I TpèiΖNIª{ãM–ªÏ¹¨¥¨2‡CXk>ƒÖ£Twþw߀ã ªGc´‹ËPõ|™ÉyQ…ûpâîºÍŸÖpè§&IU—{^öÞsYŠ*–)V“RT4´¯¿'&Ídwwˆe¶†4Õ¬>b(Í¿š’T³U QEÊæ‚É9ƒ]ëø¢¨’ë ŸjXg>ã6ÄaËÕÜðdz·ì0@Õ·ã¨2ª+åß>éîví&‘û<GOšª»—ÄJ?UŸ4Õ¼îì/u§~8=…„)ª•Í<'KµèØïl2TûV¬^ڟET!ŠpÑ5(e21­$ÕF~•—¥Z/{#9ªi¬… ŒdwKö—Ælh IRm "GYª-Ó|¸QEdhÂe¬m%e¨’ÖvÜHIRíÙYªßºF)I-kRÝýðbŸã‘Ušê[sµ¾¾Ù$©¡ˆ*E†&¼ÇLK9ªelD–ÒÒT3M\×9UóRT‡7;tRh—Y4y¬ 風Žu§¬`òhƒ‡³+…Aª¶ ª•ˆi? ;q@5r@Tá²Æ¶·]Mu°ˆ¨¾.ú:jy'’]Е‹0ëξ8W‘‰Ì%yôWƒï¥ÐÆÈ»ZS $´Óø„=_ÐÚJSuw;òTu™™S–*r£€+ÄSú|ªÀê®ÐXŽêHjÖÚi3ƒá…#Œ|–ªKÄd脪ٍ€Ã:Ÿª»®ç¨Âõæ<¼î +©"ß@†ª÷úÒTÝ]Þ¸Òæ ^ÀäB–*ò d©Bß`&E­žîî\¶»`á®vä©BCC–ÃÐÊòì4qw«Cû´ÑôÑ'Z܃*˅(;ízQ÷GI]9ó;UŽÒDÉËSLŒ7‰3gà’û).˜ƒŒ;JÏ0Ìåæ~·5qû§Ï÷é) +²v'–Ya5^Ä.únØÂBS½G3ˆG¿ày}Eà¶ùÖ1¨Thu‚¥¡{˜A¥DÁªh Û|_ ¯ôŸq‡gMÓ16fƒÂý4N~³\‡y(Øè(ùJÿ±•·ƒ(«^}r˜ðÏú¤ókž~…€XÆ°¼À’j*Åq›l¤úC³— + V)OÚpVÁxô‡î!ò½%{ø®•ê!$#è$úS“FÞº|m ‡g Óvߎ–4q'‘h±#-Ã/Õc²ÂÞÜÆ/…Úl²UA¸.ö|™Ïvwjå‹.Žiù¸®{÷eYÏ臹)³žaš¿„Zȱ½ÐB]ÛN@í¿`p™ë#BŽdyu°h!³ɦìôìÚNÊ-Bªý¡Ù'µ=ÙG~´´RJ\qzR®Dçbx±tSçP¸[$]û‹ +vców‡ÚŠdsöý‡ë—PÒý2Pý’Ö©›×mµ]’U6@‚„k†KZܳEƒÈ UډC™ƒðf(¿pcóSӉ$G(Д#YÛ䨢6¹ªv¢¨úß]LÀ ±W!ʳè 9åtx6#°lcU¢IF6Æâóœ,Š†”6 £ +ÿÐͧ"ؗz(\½bKšè61 £Ú*Û6l‘rôeºY©JYg¢aºFîýÅ°¬ýeÍ«V A×éåVª+Ö¤P"³bË.S€Ì­ƒ<Ëâc½1w“Q%«Öí5~E&&m"’½@Avõd[tÝփmz‘m§Ô #`éZ¯hm¼\óøÃxÅÖ»a ±ùxØd6½žPÛ÷¼¥Ü0J UÖ&\`ni˜`³˜ªmaÜwžÄ4ÖÚ{ +ÓASïyLi·›™FG˜˜Í)ºy·D²3ÕGò–3×Xfÿ´h™9Œ +¶®ôšƒÛ39eÆ·¾% Ð¥µîYÓ37QŠ·¸Óf™Ñ\æ\úP±„¸Ã:ì·3èÏ°ÆYb ªã r½áԃì¼Q3TÃ+^ ×ƀ’lÌ} ª%„Ø꼋-WÓž'ÜK¯Y§è­€êG´·)È_âÇlì¨Y\(´è;ôÁ˜TOA&üuÚçñW2"§Iä&Êw^ÖÑüózS³@›N/·«¾¤qs/ÿ4UðGªà¦¸€lOV£2סe£’ñœ¡.òÁ7ó…ÑÁ˜)}Â-ÉïÌzxü"8Á¬7W<#×xDُ½ +)E‹ôu~©œì²nëFA~Ý8Ùü¢ ú ‡h¦S«çOA8Ùeœó«±(—>¨Ó© +¦(~ + +® R W"˜éˆÂµ`Êõ@.èNM(N ïˆ¨ü\±V£¬"B/’«’KØc‰ +€L (½PÝ%ñ*+$¢’,âz`¨ +g¡‚¿#HÈ@Þxn —ÈÄv +²± æ”¨ $!4³cÁ÷“ÈÌvŚ¯’ñGT=­¡¯XÚ §wÅ;clœFµW–y+YȾ¢h]P·.»"g%?0ob͈ùAqßÑjÈì{ÞƆöºV¸Jv ‘Q’x(AîGUA‘"#\ïãhå2†Ò¢ÅOÆ̅ ®|W×%ÆÌeì4áâg¤_Œ¼M]ð)~3ý\ïµäì‡:õ‡w7PÜ^´üIm¯ª oÁÚ$¢´R!Zžã!¥µ©…JÎüQ‘…#g6ÉÖ"Ø)¼^‘åÎæðwØQEÖ§ôË&ªE ¡o©È~ÓBÈå§I×æx`Yåí2Ò¶€ùÒíì4ž¶=Ñ¡ì4¡gv÷ò&³k¤¸S(Ë͙pÞd˜" }éÇsÚ ¸6³H»ß‚Û›´›|0¥Ó|†vk]n}«¶ï%kSÔn¸À5íÖÚީ݄Ós~\»Öp__¬”îÒ— ך#å@©Q'כãxÂ..ªH8ƒ[7_[kÉ™H˜pЬ +~6Ò)e¸pV'3e Sd猁ßÔ †ªŒ®x–—ÝÈVi±uZR—¼¿Mé¶nÒ¸´Uº­Û*.gu +´Z§[ÖlA#'L˜’W6W+RaøËւVO¶¢G³*¨Z$Ün©ü«]ËÀ»´×e¶"¨Ú rs‹#eÙd­âõq¬+©ðy®ûޝ6Zu +¡ ¦"øEé4ë#¨M¥õ=r k{Øú‡›ªâàÌ}ËÚXW~β*Rc×^oÎ3’“PEj"{ȍºV®b}T^9eƒë쏬‹cÐdãGŽLÐt£“!“h˜-éŸDS›¿z +R³¸Ô9û4LÞep“šžW¶ð€/qg[bÕöÀ<5L4ÉUdw+0Í«v4Õ)ë2m©wgeÔt‡ +tµd"{¢6IŠ#Ð*æ™h¥"’®]´L]$c¨ˆCË®T]%7N:5N).Úö%Á¾m’A¦-RŽ+ΓÚl,X•ä>«lnÙþµ©–eLëê ·Ør‰Ž.%Ðïªc˜2Ó~rTÊô­@[€“ ÍRŒ&ËO2þ"½ãO/x¨Mf()Õô8 Ü^´ò•Ý´ÆÃôËìLfúø ӈ¾“", ó8Ÿ2–O#Zº ׌åƒÛDOó)cù™çÀù”±|tñn8Ÿ2–’y +œO˧¹€.Þ çSÆòià 0πóIP­Š ‹Ï€ó)—CdžçSÆò à|—(>–³Ó®Âù„ Ð +<‰ š+™÷ò`¤ýMm’ƒf]Ë/oU¶Ö¼Ð“¾;ñ¶ŸÆâ6Ý ~7ޔ¿®°SØO R÷³êæs™Ê&pÊ@iªRþ„;… +µ]ËòºÚCÚ¸UâSÝC)ÍՌ*WÅm’EE@4à•@—B›Äà=:¤z~OÚ\´‘ö¤ïƒqUÄ~¹l~ £äRLÈçlðQipòáðèÜNjlçø颳0µ÷6ý5!Îj=c6©O÷:Ö %S5o½jXL¡:D¥Š [¢n +ì4Q¬ME¬Á6aD% CŠ Œ{7½fY…¥îŒFy²x4ÿ隍q ¦pp¾ð"œ¼Yñ&¡$¦ÐqÉcäæ² y3[:xŸUʼ¯ÔD˜Qå1T‘y¯Sxå0ÍM˜BQÔS½D0LÖvásKÃ.v<ªíú1·Ô&¿÷qӈç1Íõ ӄñbêÀKAÕ2Çò9@™*37' %Íy´ÞÜ +ݻв0ºG#ÄDó¿:ϗ9ePè^ñO±+󜳫¥*@dN1Ã#u 0¦xŽ “£µwç(Im¬(8E²`»+óV󏎨DȱmE\CìZTìÁ.¹e»Äd© +0%)}#u?Ë“2×)[€³0e,¦78ľπRÀêI* yXÖ¥Ýq¯öW1÷¹‰OihyV©ž·ÊP±‹ä¤ûY%Úȁ†û©‘ƒë=™6iÄ8éü­Ñ¥6±"¥rYS`•ªèÍõ”x5ð<…6]œ29‰£7õŒèÍ<0ãát1—>hÒ+Goø;…Ê^Eá‘è8.ðSx8z:ç6)¤Œ¨ÇÃݽÑHA 燣7 ÇÛOEÕoà +ªÞÈï@¬ @H=:p.k÷„$ iç¥!½+"CúJ®ºCº¨"u^s!¬¾^SWý&lçŠ5}Ƈ#@4Îï2KW´H«ÂÙoOûXoŠ*“!®BüÉoí6ˆß-W&BüÔ Z•!~Ü¢Çetݛvq~òçkñZn&‹ÒÂ4ŠsåÁoW$­|"_6ééqd“gópڞ22ïÊ.yri×OFæ=˜ «™w5ö9ÈVµ×« +Bª<ÃÚNWì#õ–MW|„ò-;\o88Š= ¥“‡¡bwŠÖ@™ë¨kQ›DØȉ?¤*µ\pÞuA"APp|Mïƒ×¬×µÀŒ*ií~ûPk)†p ¼U>]kkm­A^·ÞÐZ /üô‹¦´öâЃ9;km,F¶k~£™ø”vg!†è”v÷îÄøœàŽFý–M¬vgšèkkô›ùC£öÓevYªX&é­ÈPõ¾°Y`¿ìN둧šÍº,U1" QÀ…µŸ +×ÊUã5UÑz¡M󍣪¹¼§0Þ¶ìä h]%ØÝ“¥ +‚ÌgNì÷ºv¶&rTÇ +T³XPhuŠ±Ë‹,UíNj·)Ça›"ØO—ÉDC §®ÑGŸ˜;þÎ3Uå*/sQ9z#ÿ¢¨®Ѫ¨òp®ùÇ0Â^_˜¨`3nxÝf­±J1çëù½—Æí»áGœŸ/ŽÃÞ .Ú]Íë¼°ÈßéW>‹ú"£K¾YW¯¨QJṸϺ^Oên=Ì 0×cQ²×ëݶ{7êžÎÔP'\*—.ÊTºYïjîà R¥p³žl%÷oà]x×.ZQÛËÓàîf¼ŠŒM&öz³®d£ß0o°EÉý¡ŠUü} 5·ò©ß +ì»?fs°OÊKà‡ížì“Bõ‰lègû¤¢ˆ’óæ1`ŸªOóSØ'ÆWHð¿Ø'…êî>Ø'U•æúa&·ûd2!Ÿ ì“Ú笞ÏöI¡ú.6VöI…d4¢³ížì“ŠÒó]Ü'û¤L.@ü4`Ÿªï"Kõq`ŸÔ:NˆŸ +ì“j“æòàæG}RcÈ-kOöI¡LªÕ#À>‰ªb[à À>eÄÊӀ}72í^`ŸDUÄS™æzi7û¤\0Ƹ}"°OjÑ×P¨ïgû¤* ÓGŸ ì“Úl‘ȼØ'…ê»tqöIÁØÄ+OöI¡ú.כ‡}Rì™êÏöIùˆùû¤P}ò)#°YûˆÁ#ò…Lƒ¥çÕDwxJ¹QjÑWjõcr<÷?©6]19î¹ÅïŠÉ¡ŽUWïˆ*Ã'FÒ¬ú’_Ôo’¡‘‡cK6K¢MWqõ¢¥+÷„{[7·‰IÍºib+µé27CYÙ(°Ê{“þd—5¡ËäÒÖN¡ËT»L—‰Ýò¡<Á²&{ÿßMà9© QžJ{ýæËÿ”” wÿß#C)V|OúNLß3Ž/ܔð(Û%Hæúý_þ§.ùðå|ËFþþ?Ux)¥Ëÿe£|ÿŸêí'°L¼HõšMƒS{ÆcW|RúèÜ3ÐDEUù@J)¦)`ú”3ÕH)u×Õà½:LßµLc:æêµ}ò™!ªáqèƾ+ tê’Ô ƒ|êZÅ}cíÒT—]ù4r§ZÉlÁ¨þø²ËT+ÐT÷•¨²ÚT+ä<-Õ +M𸤞«œ…W˜OØIAµÈœzΉ€ÊŠî[ʼnc°¢§"]‹ÀÏl¯Þ†´§j»ŠöU¼¼^Œöýž›.оßó+»Q\ôLsíxCX›ªû‘3 Xej³¨Rl¼ÅL–›õ_7edžïl*mN+î2e»%:ÎWúQUYÛù(wcšÏ»Ü±)á°ß!mÊB(nÓ­í +ˆi}ØÆ@µ(§ÞRÑŽ1 *zô†oê¦>ñ’7^F$š(ŠŠÛ7‹Mv9ÁoŠ +õÁû‡îýã…¤¯þ»o>ŠïýS¥Ó¿÷OÑT‡<ν ™‡+R†4©sq¾÷]Öä®þ»½_R©¢˜ZtÊ­÷þi®Þ‹{×½ªoÏ~쟂/SD¬ÜˆöÅuWð¹‚ÜÁkh_\wïýòs®|t˜: æ%ôþb7JeE7¿$£¨¢ÇѾm.‰êš·v½"ù³íx);4*âúþ"kçÆ[¹Ä1Ku™µ![MåíJŒS6 ÷*°T*TÑ^•xY»†¥ºD¦M®Dûü,•1ò¥"'QÞ»LOPÛZÅôT¤êˆ\ü‡|ÏáA-JÃÞÀ, zt(,¾7XŒ$«K¥ÎbœE#EüüÜm²3;K .Ëq+î6åP“Ê'>ó^™öœSµ¦= w;9Jnï´lRɐ¦l"s”‰Þ˜~4·`eÎù5‹]ùTfgš˜Þv”úékW¨©½]ìݘmz]ËFR¸,P˜¸%Û&|¡Ð¬·d÷ʨé™Q>CHí.WZ6kK¹Uwê§e·d‡î4ë¦Ä-šåyð¸+™ ìĪ¤J¼qvK…ˆÐÉ«‰ðj€›\jÞ¨g¼êt9ZÙ(5K>¾|ë¼ É§ÑÒ-ºÌê.‰Ã=äō1wz¤Úsv•#·]ÛIÙ¸U ƒL#?ZÊN·ÚMpò9ÛD]»d®Îñ4ò‡PB<âåþ·(EQ%$ñæ èe–*„$^9‚ôzR yníšWC*怩‹§ SQðËÍ¡ ±¿&î*•Í8óDOzâÒ© (ý±®,yP³qãA]€_ +ÿ_Æøh¦)E`Öþø^qLòª‘B-Òr8;I÷ M#¾Çせêü⣪óVÔDõQ \›¤ð7ë€üQ *LuA›è)ëû^\¢XýK`K5â3ºp‰×nýQCÑFþÚ¸ +R-5·Ç©¯íêEB—_¥ÚüK¦]E©ï&§vŸÁ´«W +ÝÄ4dÜŠYl6ò™v$Q-õæ~H¢Z<"“dq'$Q-‘2ï†$ªÅ# +’ao‡$*H¤öÖî‚$ªÅ#JåÜÞI”[jä²î„$ +Xª€Gär9î‚$*¸‡âíUÞjw3$Q¡M<¢Ø“®4¥ûõàe…š›.©»û²B$û—.+”?<ý²B^Îíß¼¬šžßù¿|Y!½!yãŀ7_V(¶{úe…²)Š·±êÚe…µ÷{>tY¡ ü›5—Éqª9×ËÒ·^ƨ½ðð§Z©¸ðPý©V]x¨|Ûá]©½Rޑuυ‡’À'œj%ºðP9„¤‘?Õê¶ eGéÊ©V7^x¨|Û¡Àä¸~¨µü…‡Êé&Â@ת”=éÙÛùëÍC*wN"Êq߅‡l~Êå'*wI.öæ å°ž§à=¯ß{­žÏ¸ðPù¶CÕùȅ‡Ê+e§=áÂC«âm‡~á¡ä‚Ù]lHÞ{ááUВz”Ò…‡Ê{חi w^x(WáÒ÷šê*×ÂtITôðù?ôm‡ +Iä·]xø„#&./<¼áŠB)ìý*ßvÈm¬}Û¡0žöÀ…‡VÅÛùú¡ •³Ç¤–µ».'NpWk¿¹µv§±‘Àiˆû­hõi~"µÖª.Ia­w‰-WÒZö/ ¯ã½ŸíÌjr +•¨·¤ðPj5vâ°_°7ñPI{@”!‰²|ªïpÛrŸZ{äþcε΁^wé?' 39œè+Ԑ&úÓ÷ÜÞș© Mƽ~µ¢¯pl€Åb‡¿Øé%7]Ð'rºÞ0§'%~¶¥c¢Ønb¹I¾“šûE܆ýŽ˜v-Ö´íõœ1åòyܖz°-À{ÖÄgì3ÿÁ2ÂŒ–xó´KÒ¼ÉÍ`Ð^ÌØÌd +2¿Å­¨0 Ëpr 3Ï2v¶¢ʲ¿•œ”íäÌV0>¶ºôÁWhÎuí+>¼Ž™&V­è*G|²Ã!Ÿªv~€XTŒ ÚUUjêMð+†Òði®‚¾ÒõN{}œ¹nÆê,××.ð´aCO ³7È2¦á`É`f½#6õWÒ0â!¬¥çÇé€SòÜ£KӗÕË §T}HÒî®ãU‰;_Žak3tðF›î·„ïsfBZ›0÷êZ@†ÚnŸ`Gdä҇Ã#$K„ù<[3½oÛ8± Ò¹ˆþæ ¸”îåq$ DzZñП6M}‚Û«és€Ö1‚4‡ô'b Ç·í¡êöâ°Êž]¶E 7ÀøG Ï5ºò‘¹óÅ4§Gðš3 +;yӳ綒­NöfÂëͨ­MÁyrŧZrãXZïÓE)]Ìk뜉1÷¦Ø0‰ÛKáG9’®×s~ÎPýt¢Ž¸ DÓM)C¨ï¡?¥Ç+¶œ‹.×úIˆ›SI5>3én +çM­ña$'öxØ ¥0:ÁŸž#§—R@×u*s÷jkÏœß̘ƒh-Žz_Sçt/3ï¤_fg2õYxɑ‡~xèÙLb[òðÙ*fúæ<1­ŽJd;¹oe=Y‚ý·¬CU`¤eÓSøa÷= +5Sju¬+ …aeJÕ x qÕGøÔɎáøê:ƒ›ÐÆøف¯> ¢ê«»IƒªsÏhȸä¡þìK¬u æùüݦŒ* Nû’žébÿ gû>ÀmÆ/'Å´¢™¯&'¨Â‹Vþo%+TNEJ‰CMêLÂ[ hҌƒ§Iõõ&¹Ñýfp»>ÏÊ÷›™Q6”™•-éDÚÞ·"Ý +G° ғñ-Ò©HuZÛSêÔ3)B~Ã(ú9o‰«œÓ©vQØîŠ}¥ÄHd˜º ²ê\EóQ¬ðýë§úcœÚ“Žb®¤³]„›1kŒ ¼ø¤”7ƒ™¹é¡"PQP.äs%ýŸ¥Û‹ÐÉI>ùÒ£ÍÕ`æOœ-êv%,®A†§1^•× ‹ºw<ø/Â~É¿yÓk¨76ÊòðòŽe¸`Dºu øUŒ -I¯³ì?EñÉr‰9WïúF"ý“¬P;…N3žó…³.Ãaہ‡AÁòڏ漫B)l €|Œe³÷ÃO® 7NIP¾ÀՎ<, hl„¥þ†0Çæ¯ \=¥Þ¼WDÖ¥Ý6=op&Ñ=å8‹RÚ}’e]úÔ?=Ð, þT›\s\­·è\e›ºêJ<<Ï劙ö ú…]â½{Ãvê—Ê7oyhñKTïé-ށ(p15³Œhw^‡[×ùÕáan†Î`qÌ®”†~q /t4@Ê凜 +¸­¥O¤«]¥(‹÷  .·ËàŠ½Æö P—øñ젓¢ú‰"P1s(˜a/ÒEI²Ûfs%æw|Ú+Ñ/-á; ñI„](+#¦a…Îc^ª–áÍá°Ð“€Ó^’Gæ–×Po›×õ:³€7G€ðMœaÐg µ’Oð†×esù&1"! »h ¡ +‹z ó+ç2Œ>CUyçj²«`…ã©K»Ó‘®›svqKr–¦âÕÐñA– §!^b&´ìÇñls‰c‹ÔwŠNnn”wêÇÀ⃑PâÃôàf‚浀“‹7҉U1E˜_µE~as( Z®bR…¡¨.¯ß€!9ñ %‚zŒÃ[@,ìkT.‡ê7qºë3ò LÔ¬›~ÍÒn°ýωÈyØ×r®¤Áã˜v뛷ðšõo¤TYË@ÏÌAŒ\dô:a`>¥„¹Ÿ,Zc!ghRÊexË“cá‹å5æ0>ÀT6ØbèʃDG g;“Á˜Á +وU¤(`ŒH9`.Q)µEø 畋•ÑêI³;ª¢—:“¼Hb +w‡íԞ +ò© S ëâ,&*ÜûšÔ§™:¦‚Ð'ª éäU€g:Yœ ·S;d͙P؄MÅ$+[0Šb’Ìo­=ó[÷à\U~­\4Äk½¾¾n؀ïŠëjè­áÐO‰êš;ðÙ dn¾ñ7Päv ºÇžÚf‰·-cà£Z3àî@íD̦X#H‰§FƒËWYӇÞgRÕÑT§•2Œ&ë.ÿcÎ5BLëh·N’ +·’]:_Û=_¦‰¾ödߝ¥ZÄw^ÐÑ,¼ø6<Ž‘eBÏÐŽ ˆ :G„âCÜÅãÃkX;bøàvr|€ÍYó®4Gû®ŠL €1ë_†–W!ì,hªÜYˆª˜€@yµ ÞÂZŽZ÷±oP# ÔUgH¾“æ"˄ܧC÷Ýd˜à°#&hÐAš´<ðñǵ™ad—(ºÉ +ƽ…“HJT %¿\g½©€ÌEA“í±Ž¤vÑÔb˜¦¾#Í SíˆÈMO[àdyD´á„Uª@F-3àF…ýZGÆá7®Wƒû[߸m—Â$;¢’›0N‡£ +Žºl.ie²´ô®½iÙäÞL…g¯²E_ÝoéÑè1I£nUzDÒJn‡¨IIS¬cÇ–4ã—é1IÃ~Ír’¦ºŽ’ÕvUJøpœà$mà3ô&n¢ ±l(íúzْîú¼U¨’É6M·)‹F ÒÜd×åÉ.ÝWç¾r#vAäx<ґœ>îT!›ÌF¾dGröÌs„_·D) Šiw͑\¬F\iÄ!êÄù‹tÎ}r4ü:&ƒ×ǖ„ÉÒjåÁ_¤%Û!݈~E´DdÄí˜ê}ö‡Äbj8DÜd˜¦bi¢ëð¦ä'»JÕ9åcü¯¹JœÿµÚLÐ[<܄lMQ>Žß®ºÓ1밓>³¥ÔgØxtÖÚQ£7®:؋U˜?Ä÷`€¨µm­µgªhmæØTkˆTz̬3ŽÚ® —¿*Gš«Esq¥8lÖÞ +½ôjȂ7¸õ¼ƒ]/éOÔþwvM¿ç2É®•¼ tNm¼í/X%pݵÌÙ­8Ðk0þê÷6#ÁT¢iý2›õõâ¡g3™Ò½L:p[ÄË6邮 ^n›YCEmÕÓ;š“|z·WŒ/y(Oº»ãgÍxF¾WénPÜK|Ø6ýÉDoõ™fMÖ»F»Óou®"2p«>Ùså8>øÞƱJB#òЦóÞ}AÆ¢•æ–)&ª ïRŒô Jí<##LÓió³%FÛ,J—ãrn ÒâMQd¢ÙO ¨`§Só.ße²íT½ÞYC™kí ù­Qoš@l&LËq´ü;­Î7O0@ û./ø±¡ìû B ga¿vÄ|õx•(†ôÈ¡$*˜òfƊx?cžðveW¬évcóu3A£˜~ÁÞP][ÑR&c±»cbõ`òŠzã±Ë68]‹…ƒ0ÇP’£ÞY·Ð…–®D¨æƒ™®@ªˆ†¥Ý.}àDßM ¼¨ÍŠÁƒîºô!²ÀßqY“ æ|^³îCL›éÁ/“|m,ÀMû¨ãè…âùq!_ÍY [˜j06nð€ÙêÍê;a+ë\Ùp?1*裂¯9—W@ï{ڝ_ wîÃ;–­;è6N8 +p³ŠŸWIk—Ëü$TîH#ä?m×ZÏÁ }5[tc®ž6?;{­­5¨ƒ§Æw­a¼$`âZ ¦÷uà§7ø©•hCk÷Û[ðk‹JpÓ¥:.?NCd!L‘cÄ Òç_‘MÙ¸|ZMvúžzˆv'{¾Ba’äT’¡£y©¤XȽª†C*C)¸ü563aÒ½e¢Zã®i .óЧ}­¡3vi U[žGŠ;ÁiŒR;ä x@uwp&g¯±¬PÜQÎT²ß.HwÈÙZЂ,L»Iò7?™µ…J,GÙ"0NÊD‘® Îz±.£!TIxÞ‚^ ¿˜ÂÓFíQ èˆH&…؝†7¼;x.0Ûj©‹Y²Äpšñ2e7Ò®pÇÅ òà S0p˜€­ƒ[ÿ¸5f֝€ÊÊâp_ :wÓ’Z—¡¼ôíí1À„´ñyz ¢7¡šŽÐEBýÜ<ð1g…|áo¬ïÄ°¢é'Om[¿NwP»6`!°çœ«Éa£@G|ÀrþŽàö×XRë0ª|!²”nOE@».ܖªYú²”ÅîN0²ÉWÎH3#TÄ_Uά²1¸ó6¨b´B˵AåYE<ÔÚö»Ì%ŽÁ¯M­m8íi­Ù}TkO¸&P%'èߦŽ}õP¹óÁ©i ˆù<5}ЊÔô-dPÓì²öwÕ4µSÈÛ!BjšxXMS)ö¬šf<•jÚ|©¦%’G€‘$«¡‡ÞVXçCðlt ih¬PùhÞ¢¡qè–$ўÈbV§¡aL–JºÏàihÆæ}‚Á›ÝÁÄ·`²Ž´ÀÖ…ÁÅÁe³ºD•qwœ”ëLe˜2é˜ÊQ°4#ZxÊfÀ'¥fæ<ÂÅ¡ƒ®wÜâù>9@T¿ (bBµ¶Ó³P»{í<¯0ÉÙCYñ=ÌZ#ŒA†~"P‘ YÏPßûàW„µÑÂOA@áõì2˜+>àDB"…ÍKg‚ºÏ6wn´‹k!KP]'a^v€ÒÕÙT)A-ØÉÑnL— ›ƒ0@@ +$bƒZۋgK¥0´L†JÏCI‰€Û,Ÿ…/Q·‰šÁW”³à(€·‹{Š½OC< ì`{‚i •¾“Òß6"Sgv~mð6ÒÕ¶¯U^7„O߀M¨ë\¦0ŒÜ +/‰»X.øÛÁék}{˜<Ü<½Ÿ²šY½…Në²,ðŽòx«•—ÄMíØÖé ys,b¥:é9½ëçÙÏÞ¦Ä'7þ?|ýni f Š`½#`T†€{â'ð‹ž*–/BÓ¥‘ì[h+PÓ +←Œ9{&ÆÅb êd &Ä·¤ú=XG{ã2¿˜^å™è `î¿wy1Áì&©uhøqÁlaò8cQ#¾ÊE^˪KH){´Pú^¤ÎZ~¾J¤²4yÚÐ4S LñTÅJé#ˆq)û@®{†§dyàç„Ù¡-Q‰óc]ÂÉÙSÈ£gí)çX{=ub‹´>/³Ñq¦,ZDPŠ"ZG„Ö¬h úü¸¨Šƒƒ†ù~¡€ÒàƊ,º5{±”Y=yÊf14¦ b#Aç>œâà" mâeðÂÐrvæ~áf†”8Deø)ÚÿŠ d˜/aÊ·à›¦3T‰¤«Úü5Â7ÃPÕ{AE6(R°{ý]‰Ñ— +X @³0Ü)tQÔ7q³ždµ(4»1Ò¥‘öÉÎE‰í´ÖbÔ4¼:DZs&‰EdŽk ÝtÄ®³Ñ»+èkÊCÀ9û&ŽÍ?û!êfY%DÃü4öL 0zÊ>°ó |,š¾ÈüòL0+8Ç@ó&±p?óîȦl¼c}*Â<È; Ámìû°RAöÏã÷<¨á(§fHÁt¢*uˆ\=Q+'K+äM•^ò€J ÒjÚVÞRP¼©=Í«ª“>€"–‡ ªâôÕ&ªÞÃ~Aë´¬^ÙÓÌv74n<Þcσ8="݁‹‘¥†›ØDÌÇÊKÛNŸ8QMÁŒ®¶Éåã“wH Tº¯ŸàO· 3=>qöÁ/W^ºáonQÊÝ¢jfÔê¦ÒV¿9“!Ë-?½~<Àû zh‡ôÐé"§˜>ž"Ò¥ºz>a¢ŒÛ ÃKàNS¥Æ{(ä]x(ƒÛ•¾…:XÍk„¬ía¤ÙJ+b0—ø‡åt·Hd$Œqí'¨¡ê‚'„½Û€h…óÎUç䠜h`1 ˆY9Rg£ÝKæŒúRÓôQ\¸£èØU4båý6ÖåwM¡óL@§LÖÔéí†Ê×Ê¥FëÄLt”:ځûàVuø t õ»¬ðÍí¥ÛÁD>¶Tn*}ÄD¶‚!ÆWÙ&F‚=ЫêÞþ7à|ø.ÏôÇY;oæ‡Êaµ\ýþ±iþ iþq&ò8Þüm3‡ù¼1ÿÏSz;=ÿÌO‚œ‰z*Ÿ÷{Òóév6ÿC/èqRa§Eˆvo]rñnJc¤ì:÷R‹ŒÓ ¬íWj»Æn3ÂKµ`Üÿ³ûT´ß”;Úà×.…Vá¢?G ãØò’ž’gÒZ.µEÚ¹_Q# %àhÍkqçqvæ½"òÅâζe|ç àšŠãªDgUÁÞèÓ~'ÜԈß p‹ù öð >ˆÁ‹ÜIÎÝt\•è¬*Æ1öqU¢³ª­¬â¸ªñ)À,è>3Fq}M+nåsK0 ÝŒ1ÏòNþÑ*Jvƒ +£AÜ^¥Òn ¦\¬©_ßã\åCtÔ)ø-ƒ 5 㮦×0¤á§g»èŽ +ß÷Š:36tt$øÚDõZ¨r¾÷]ì!UVžA¡»%îl­‘À+îA¦¥ã°ÝÂÿ¾ºëCŸÈÌíú0ÇýÑUJÕG´TWÉøBß=nœ7ÒùYD{™Ð „‹±y3|aα»ÙޏùB6© ul£5ö¤é¤¥ÒÁÐÙ +àS§¦É€ˆò¯É؅¶ƒ¨/37ªƒßu UiGP‚¯æp¦uc> 8™›pÉBàÁÌÅ{0к†ÌòEŒÊ{æT®õ—ç6ÎæEê˛©Ð[zr¹Üj]ãr+NÞLi‘9 0مKðg>͸Á¦tôåôí¾hŽçÔÊXÌѐ¯eו3£òk€±.]†áч²VxÆק—‹tð¦Ô”Œ­°7ŠVËgŠ•&ik H !Û­ù­g¢•è9ølŽÊâ1¯6Q­ý·úk@¸É+o¼ ‰Ç…€þ–ñÂl£þeㅯÓþ¢ñ‚,*<÷WæÄqê|TîàTAZ˜2’œJxºŽ$×pç þM$9Kø«Hr ulò/#Ééd +í_F’k.I®xèd·oý»Hr6yïï"ə使Œ$×pÇæþM$¹†¶û{Hr BÛ©?ÞàN$¹Fÿd$¹æ>Hü­Hr‰éù7äšÊw"É5B òßB’2Lþ—‘är’öd$¹¼¤=I.%iIÎJÚßE’‹$ío!É57¾ð’\Ã@âÿ.’\ÃAâÿ&’’`ò¿Œ$×\…Ä?I®á ñIÎ_¤ÿ"’œ²Ó®!ÚF’3Zà/#É52ø'#É%Tçß@’sYb$¹ð¤Rw݄[×>#ôMŒÛYþåâiÜp¬7*AÞýì¢Ë¨ðã—Ó^»Çad>á&´¯E{Á¼³¤¡ì‰Ø(ç‚mÀהƒy-ãd]|†åo^¿Ø˜ëÅVè#û "2»Ô’}†óûFißøGþeËùÿfã?XºÙcí¡Nm +C•D¥”CÅ'À½e)Ü +}d”hU[¡ìƒRá•û–÷ïƒjþQ½úÈ>(ë¼¾j}`TÃü¯o…>²z±ñxõ…»öA)ISµúÈ>(³U§6šxg(é´¢‰w†5ÿÜM¼3”ÈO QM¼3”H¥†Ü°‚ÑÑ<ŽÉß³üü +~ªÏOç*â&çËÕoiüï9Xnð?Ô? üƒÿ'ßàÓ¸ýÄϟhæ›ùEEë›ín><¬–_'™–š0‡ßãvù<æ?Îúé°ú]þ1%“‰)`im{ʅ}Âÿ$s‡ßQ9ÜåwxqÌÏþ@^¨è~rµ¤Æi8ÝnÎ?W‹ê™Ë‰^{ü~7l• ‡ý @Ê躨4ÿ3û¦Ê&ÖƛÍ͍Ä].–ƒ<2üó}}Råqyqö— I<ª† ‚ûz{K@®†ïãӗš&—’´úÚ)»]BŸ`<}‚Éê“Äï/-›Ç?¦Tå­Þ¨5S|åíìRÏðªÿ“ðùµ€CZˆÑ?ð/Jš’Âþ8aÖ́o¡¯ãŸyþw6ÿOú‡úi{ø7ûl-|±¹IŸáDàÝƒy¡ÁóÄ_KÜWwH®)*-þNÿeÆ©c‹Ágjû»XýuǶøㄽKüžVãÍj|„š‚J”‘ã6Ë)ÐÖhГù¼Åø&NáJœ"ÃëñA‰û¸›@ŒÀ±€ÃE¸ÁdôÑ÷…ŠúŠ9€|=êó€ô#áò:Ü^T®˜ßá#hHÔJ1Hº›Œ +unS¡Ïcôí-xlL¥1q{<ÌÍJ%R9´Œ¡Ï<ùcŠJüôÿ¸Tº9@€îà ?^—¨SjÀu€úw9<­ã„s`@·÷Ñë ÆóBƹ˜Ïƒdõ²VE¡ü/—Éÿ»"éV Sà1îÁ©éN¯š.æð`žÅs ‚ìonÁoÔ{nÄñ‹ºGØ> ØCÿe£pk¢²ö¹Ýa‡úՏc8e\¹ÐÔf¥{=@wSfˆ0: ø ½ˆù)]rQÛÿç!m?½¾—óÆa¼Ú@ëiyÿÇüϘ2mæ;ðèÏò0?‚!™ÿ9~mÿ/±/ß®’Ñüó7íXP +endstream endobj 5 0 obj <> endobj 22 0 obj <> endobj 40 0 obj <> endobj 39 0 obj <> endobj 67 0 obj <> endobj 66 0 obj <> endobj 77 0 obj [/View/Design] endobj 78 0 obj <>>> endobj 75 0 obj [/View/Design] endobj 76 0 obj <>>> endobj 50 0 obj [/View/Design] endobj 51 0 obj <>>> endobj 48 0 obj [/View/Design] endobj 49 0 obj <>>> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 14 0 obj [/View/Design] endobj 15 0 obj <>>> endobj 95 0 obj [93 0 R 94 0 R] endobj 118 0 obj <> endobj xref +0 119 +0000000004 65535 f +0000000016 00000 n +0000000248 00000 n +0000042339 00000 n +0000000006 00000 f +0000183270 00000 n +0000000008 00000 f +0000042390 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000016 00000 f +0000184311 00000 n +0000184342 00000 n +0000000017 00000 f +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000023 00000 f +0000183340 00000 n +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000032 00000 f +0000184195 00000 n +0000184226 00000 n +0000000033 00000 f +0000000034 00000 f +0000000035 00000 f +0000000036 00000 f +0000000037 00000 f +0000000038 00000 f +0000000041 00000 f +0000183479 00000 n +0000183411 00000 n +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000047 00000 f +0000000052 00000 f +0000184079 00000 n +0000184110 00000 n +0000183963 00000 n +0000183994 00000 n +0000000053 00000 f +0000000054 00000 f +0000000055 00000 f +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000060 00000 f +0000000061 00000 f +0000000062 00000 f +0000000063 00000 f +0000000064 00000 f +0000000000 00000 f +0000000000 00000 f +0000183639 00000 n +0000183571 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000183847 00000 n +0000183878 00000 n +0000183731 00000 n +0000183762 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000044681 00000 n +0000044351 00000 n +0000044281 00000 n +0000184427 00000 n +0000042772 00000 n +0000065709 00000 n +0000065596 00000 n +0000043349 00000 n +0000043716 00000 n +0000043766 00000 n +0000044563 00000 n +0000044595 00000 n +0000044445 00000 n +0000044477 00000 n +0000044819 00000 n +0000044846 00000 n +0000045310 00000 n +0000045583 00000 n +0000045653 00000 n +0000045928 00000 n +0000046032 00000 n +0000065784 00000 n +0000065985 00000 n +0000067021 00000 n +0000074284 00000 n +0000139874 00000 n +0000184459 00000 n +trailer +<<1F85C3F3F3281849A05EE2E218B76CF0>]>> +startxref +184640 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_black.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_black.svg new file mode 100644 index 00000000..b61a1330 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_black.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_black_512.png b/plugins/net.mograsim.plugin.branding/raw_files/icon_black_512.png new file mode 100644 index 00000000..25c717c9 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/icon_black_512.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png b/plugins/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png new file mode 100644 index 00000000..18b26e33 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/icon_black_annotated.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai new file mode 100644 index 00000000..bf34ead9 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.ai @@ -0,0 +1,1441 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 6 0 R 33 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_blue-orange + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T16:29:46+02:00 + 2019-06-22T16:36:11+02:00 + 2019-06-22T16:36:11+02:00 + + + + 224 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Ann5Hfmx9aWHyprs3+kqA mlXkh/vAOkDk/tD9g9+nWlev9oOxuG8+IbfxD9P6/m6Ts3XX+7nz6fqe25yDu3Yq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7aztZru6lWG2gRpJpXNFVFFSSfY ZKEDOQjEWSiUgBZ5PF/Ln5mXPnH84tOhti0WhWaXQs4Dt6jei49dxtuw6A/ZH051uq7JGl0Eid8k uG/Lcbfjm6XDrDm1IA+kXXy5vAUd0dXRirqQVYGhBG4IIztiLdC+m/yZ/NVfM1mui6tIBr9qnwSN t9aiX9sf8WKPtjv1HennvbvY/wCXl4mMfuj/ALE/q7vk9L2drvEHDL6x9r1DOcdo7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kKCzGgG5J6AYq+afzp/NY+YbptB0aX/c HbP+/mX/AI+pVPX/AIxofs+J38M9A7B7G8CPi5B+8PL+iP1/2PNdo67xDwR+kfalf5C/+TM07/jF c/8AJhsyfaP/ABOXvj97X2X/AH4+P3PPc3rrlexvrywvIb2zlaC6t3EkMyGjKymoIyvJjjOJjIXE soyMTY5h9W/lZ+ZNp5z0ekvGHW7NQL+2GwbsJo/8hj2/ZO3gT5r2x2VLSZNt8cuR/QfP73qtDrBm j/SHNnGadznYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/PH82OXr+U9 Cm+HePV7yM9ezW6Edv8Afh/2Pjnaez/Y3LPlH9Uf779Xz7nRdpa7/Jw+P6v1vC87J0T0L8hf/Jma d/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FUx8veYNU8v6vb6tpkvo3ds1VPVWU7MjDur DY5j6nTQz4zCYuJbcWWWOQlHmH1x5D88aX5w0JNSsyI50ol7aE1aGWleJ6VU9Vbv8655h2j2fPS5 OCXLoe8PWaXUxzQ4h8WR5gOS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkv51 fmuNBtn8v6JN/uauFpdXCHe2jYdAR0lYdPAb+GdP2D2N4x8XIP3Y5D+cf1Op7R13hjgj9X3ftfNp JJJJqT1Od8847Ch6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxVkHkjzpqv lHXI9TsDzT7F3ak0SaImpRutD3U9jmD2hoIarGYS+B7i5Gm1EsUuIPrjy15k0rzHo1vq2mS+pbTj cH7aOPtRuOzKev8ATPMNXpZ4MhhMbj8W9bhzRyREo8k0zGbXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwD82vzOt/J+l/VrNll1+8U/VYTuIkOxmkHgP2R3PsDm77F7JOqncv7qPPz8h+l wNfrRhjQ+s/i3yvdXVzd3MtzcytNcTMXmmclmZmNSzE9Sc9IhARAAFAPLSkSbPNSybF2KvQvyF/8 mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVZn+WH5j33kzWQ55TaPdFV1C0B7 dPVjB/bT8enuNR2t2XHV465ZB9J/QfJzdFqzhl/RPN9Y6bqNjqVhBf2My3FncoJIZkNQyn/PcZ5p lxSxyMZCpB6uExIWORRGVsnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8xPP2m+TNDa9uK S301U0+zrQyyDufBEqCx/iRmy7M7Nnq8nCNoj6j3ft7nF1eqjhjZ59A+Sda1rUta1S41TUpjPeXT l5ZD+CqOyqNgOwz07T4IYoCEBUQ8nkySnIylzKCy5rdirsVehfkL/wCTM07/AIxXP/Jhs0XtH/ic vfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV6X+Tn5pyeVr8aVqkjP5fu3FSd/q0jbeov+Qf2x9I9+e7 c7HGpjxw/vY/7Id3v7nZ9n67wjwy+g/Y+n4pYpYklidZIpFDRyKQysrCoII2IIzzsgg0eb0wNrsC XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk/m3zVpXlfRJ9W1J+MUQpFEPtyykHjGg/man0dTtmXo tHPUZBCHM/YO9pz544o8UnyN5w826r5q1ybVtRf43+GCAH4IYgfhjT2H4nfPT9DooabGIQ/tPe8l qM8ssuKSSZmNDsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdir sVdir2j8kPzY+oSReV9dm/0GQ8dNvJDtCx6QuSf7tv2f5T7dOS9oOxuMHNiHq/iHf5+/v7/v3XZu u4f3c+XR9CZwz0DsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLHStOudRvpPRs7SMyzyEE0VfYbn LMOGWSYhEXKTCcxGJkeQfJX5kfmDqHnPWzdS1h063qmn2dahEPVmp1d6VP3ds9O7K7MhpMfCN5n6 j+Ojyes1ZzSvp0Ylm0cR2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f+Jy98fvdj2X/AH4+P3PP c3rrnYq7FXYq7FXYq7FX0N+SH5sfpKKLyvrs1dRiHHTbuQ7zoo2icn/dijof2h79eF9oOxvDJzYh 6f4h3efu+77uh7N13F+7nz6PZs5N3LsVdirsVdirsVdirsVdirsVdirsVYn+bH/kudf/AOYU/wDE hmz7G/xvH/WcTXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv +/Hx+557m9dc7FXYq7FXYq7FXYquillilSWJ2jljYNHIpKsrKaggjcEHAQCKPJINPqH8nvzTi812 A0zU3CeYLRPj7C5jXb1VH8w/bH0jbp51252OdNLjh/dS/wBie79T0/Z+t8UcMvrH2vSc592TsVdi rsVdirsVdirsVdirsVSbQvNFjrV/qVvYn1INPaOM3ANVkduXLj/kjj175h6bWRzSkI8oVv3ufrOz 56eEJT2M7Ndw2Sz82P8AyXOv/wDMKf8AiQzf9jf43j/rOl139zL3Pj/PU3kHYq7FXYq7FXYq9C/I X/yZmnf8Yrn/AJMNmi9o/wDE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2KuxV2KuxVE6bqV9pl/BqFh M1veWziSCZOqsv6x4g9cry4o5ImMhcSzhMxII5h9Y/ll+Ytj5z0b1fhh1a1CrqFoD0J2EiV/Yen0 dPn5n2t2XLSZK5wP0n9HvD1ei1YzR/pDmzLNS5jsVdirsVdirsVdirsVeXfmn+YPpLLoGky/vWqu oXKH7I7xKR3/AJvu8c5ntrtSrxYzv/Ef0frey9nexeKs+Ubfwj9P6vm78i/95dX/AOMkH6nx9m/p n7x+lfa/6sful+hkv5sf+S51/wD5hT/xIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C /wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXYq7FXYq7FU18seZdU8t61b 6vpknp3MB3U7pIh+1G47qw/zrmNq9JDUYzjmNj+LbsOaWOQlHm+uPJPnPSvN2hRapYNxbZLu2Jq8 MoFWRvH2PcZ5f2hoJ6XIYS+B7w9ZptRHLDiCf5hOQ7FXYq7FXYq7FWB/mX5/XRLZtL05wdWnX43U /wBwjD7X+uR9n7/Cuj7X7T8EcEP7w/Z+3uel7A7F/MS8TIP3Q/2R/V3/ACeHszMxZiWZjVmO5JPc 5xZNvogFPW/yL/3l1f8A4yQfqfOq9m/pn7x+l4j2v+rH7pfoZL+bH/kudf8A+YU/8SGdz2N/jeP+ s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4nL3x+92PZf9+Pj9zz3N66 52KuxV2KuxV2KuxV2KuxV2Ksl8g+etU8na4moWhMls9EvrMmiTReHsy1qrdj7VGa/tLs+Gqx8Euf Q9x/HNydLqZYZWOXV9b+X9f0vX9Jt9V0yYTWlyvJT0ZT+0jjsynYjPMNTpp4ZmExUg9biyxyREo8 imGUNjsVdirsVYt5+872/lrTuMZWTVLgEWsB34jp6rj+UfifpprO0+0Rp4bbzPIfpdz2N2TLV5N9 sceZ/QPP7ngF1dXF3cyXNzI0txMxeWRjUsx3JOcJOZkTKRsl9Ox44wiIxFRClkGb1z8i/wDeXV/+ MkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/wCS51//AJhT/wASGdz2N/jeP+s8Frv7mXufH+epvIOx V2KuxV2KuxV6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxV2KuxV2KuxV2K uxV2KuxVnP5V/mXd+TdW4TFptDu2AvrYblT09aMfzqOv8w28KabtjsmOrhttkjyP6D5fc52h1hwy 3+k8/wBb6tsb20vrOG8s5lntbhBJDMhqrKwqCDnmuTHKEjGQoh6qMhIWOStkGTsVSXzb5psfLelN e3Pxyt8Nrbg0aSTw9gO5zD12tjp4cR59B3uw7N7Onq8vBHl1PcHzxq+r3+r6jNqF9J6lxMasegA7 Ko7ADpnAZ88sszORsl9S0umhgxiEBUQg8pch2KvXPyL/AN5dX/4yQfqfOr9m/pn7x+l4f2v+rH7p foZL+bH/AJLnX/8AmFP/ABIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc /wDJhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXoOi/lhP5g/LWTzDpKtJqtjdTJPaipM0C IjfAP50qdh9r50zRZ+1xg1fhT+iURR7jv9h+x2GPRHJh44/UC8+6ZvHAdhQ7FXYq7FXYq9S/Jn81 n8t3i6Jq8pOg3L/u5WNfqsjH7Qqdo2P2x26+Neb7d7G8ePiYx+8H+yH6+75O17O13hnhl9J+x9Mq yuodCGVhVWG4IPQg558RT0reBXz/APmlfXVz5zvoppC8drwit0PRE4KxA/2TE5wfbOSUtTIE8uT6 f7PYYw0kSBvKyfPdiWap3bsVdir1z8i/95dX/wCMkH6nzq/Zv6Z+8fpeH9r/AKsful+hkv5sf+S5 1/8A5hT/AMSGdz2N/jeP+s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f +Jy98fvdj2X/AH4+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8WK fnl+U/oNN5r0KH9yxL6taRj7LHrOij9k/t+H2vGmy9n+2brBlO/8J/R+r5OL2loa/eQ+P63h+di6 N2KuxV2KuxV2KvcfyM/NZopLfylrcpaOQiLSLpjUqxNBbuT2J2j8Ps+FOO9oexrBz4x/WH++/X83 edma6qxy+H6v1Pe84p3z54/Mr/lONV/4yJ/yaTOA7X/xmfv/AEB9T7B/xPH7j95Yzmtdu7FXYq9c /Iv/AHl1f/jJB+p86v2b+mfvH6Xh/a/6sful+hkv5sf+S51//mFP/Ehnc9jf43j/AKzwWu/uZe58 f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc/8AJhs0XtH/AInL3x+92PZf9+Pj9zz3N6652KuxV2Ku xV9N/wDOOf8A5L+T/mPm/wCIR5557Uf40P6g/S9N2R/c/F6gyq6lHAZWFGU7gg9QRnOg07R8zfnP +VLeW7ttb0iInQbl/wB5Gor9Vlc/Z2G0bE/Ae3Twr6D2F2x+Yj4eQ/vB/sh+vv8Am8z2jofDPFH6 T9jy3OkdW7FXYq7FXYqnvkH/AJTry5/21LL/AKiEzC7S/wAWyf1Jf7kuRpf72P8AWH3vs/PJnsnz x+ZX/Kcar/xkT/k0mcB2v/jM/f8AoD6n2D/ieP3H7yxnNa7d2KuxV65+Rf8AvLq//GSD9T51fs39 M/eP0vD+1/1Y/dL9DJfzY/8AJc6//wAwp/4kM7nsb/G8f9Z4LXf3Mvc+P89TeQdirsVdirsVdir0 L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/wDnHP8A8l/J/wAx 83/EI8889qP8aH9Qfpem7I/ufi9RznHaKN9ZWl9ZzWd5Cs9rcIY5oXFVZWFCCMnjyShISiaIYyiJ CjyfKX5qflrd+TdX5QhptDu2Jsbk7lT1MMh/nUdP5hv409K7H7Vjq8e+2SPMfpHl9zyuu0Zwy2+k 8v1MGzcuC7FXYq7FU98g/wDKdeXP+2pZf9RCZhdpf4tk/qS/3JcjS/3sf6w+99n55M9k+ePzK/5T jVf+Mif8mkzgO1/8Zn7/ANAfU+wf8Tx+4/eWM5rXbuxV2KvXPyL/AN5dX/4yQfqfOr9m/pn7x+l4 f2v+rH7pfoZL+bH/AJLnX/8AmFP/ABIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+ TM07/jFc/wDJhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/AJj5v+IR5557 Uf40P6g/S9N2R/c/F6jnOO0diqX+YNA0vX9JuNK1OETWlyvFh0ZT+y6HsyncHL9NqZ4ZicDUg15c UckTGXIvkfz75G1Tydrj6deAyW71exuwKLNFXr7MOjL2PtQ56f2b2hDVY+OPPqO4/jk8lqtNLDKj y6MbzYOM7FXYqnvkH/lOvLn/AG1LL/qITMLtL/Fsn9SX+5LkaX+9j/WH3vs/PJnsnzx+ZX/Kcar/ AMZE/wCTSZwHa/8AjM/f+gPqfYP+J4/cfvLGc1rt3Yq7FXrn5F/7y6v/AMZIP1PnV+zf0z94/S8P 7X/Vj90v0Ml/Nj/yXOv/APMKf+JDO57G/wAbx/1ngtd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJ mad/xiuf+TDZovaP/E5e+P3ux7L/AL8fH7nnub11zsVdirsVdir6b/5xz/8AJfyf8x83/EI8889q P8aH9Qfpem7I/ufi9RznHaOxV2KpB538maX5u0KXS78cW+3a3IFXhlAorr0r7juMzuz9fPS5BOPx HeHH1Onjlhwl8jeZvLeq+W9ZuNJ1OP07mA7Ebq6H7MiHurD/ADrnp+k1UM+MTgdj+KeSzYZY5GMu aV5ktTsVT3yD/wAp15c/7all/wBRCZhdpf4tk/qS/wByXI0v97H+sPvfZ+eTPZPnj8yv+U41X/jI n/JpM4Dtf/GZ+/8AQH1PsH/E8fuP3ljOa127sVdir1z8i/8AeXV/+MkH6nzq/Zv6Z+8fpeH9r/qx +6X6GS/mx/5LnX/+YU/8SGdz2N/jeP8ArPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz /wAmGzRe0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45/wDkv5P+Y+b/AIhHnnntR/jQ /qD9L03ZH9z8XqOc47R2KuxV2KsM/M78ubHzno3pjjDq9qGbT7s9idzG9P2H/Dr7Hbdk9qS0mS+c D9Q/T73D1ukGaP8ASHJ8n6lpt9pl/PYX8LW95bOY5oXFCrD/AD2PfPTMWWOSIlE3EvKTgYkg8whs sYJ75B/5Try5/wBtSy/6iEzC7S/xbJ/Ul/uS5Gl/vY/1h977PzyZ7J88fmV/ynGq/wDGRP8Ak0mc B2v/AIzP3/oD6n2D/ieP3H7yxnNa7d2KuxV65+Rf+8ur/wDGSD9T51fs39M/eP0vD+1/1Y/dL9DJ fzY/8lzr/wDzCn/iQzuexv8AG8f9Z4LXf3Mvc+P89TeQdirsVdirsVdir0L8hf8AyZmnf8Yrn/kw 2aL2j/xOXvj97sey/wC/Hx+557m9dc7FXYq7FXYq+m/+cc//ACX8n/MfN/xCPPPPaj/Gh/UH6Xpu yP7n4vUc5x2jsVdirsVdirzT84vysj81WB1TTI1XzBaJ8IGwuY139Nv8ofsH6Dt06DsPtg6aXBP+ 6l/sT3/rdb2hovFHFH6x9r5glilileKVGjljYrJGwKsrKaEEHcEHPRQQRY5PMEUnfkH/AJTry5/2 1LL/AKiEzD7S/wAWyf1Jf7kt+l/vY/1h977PzyZ7J88fmV/ynGq/8ZE/5NJnAdr/AOMz9/6A+p9g /wCJ4/cfvLGc1rt3Yq7FXrn5F/7y6v8A8ZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/yXOv8A/MKf +JDO57G/xvH/AFngtd/cy9z4/wA9TeQdirsVdirsVdir0L8hf/Jmad/xiuf+TDZovaP/ABOXvj97 sey/78fH7nnub11zsVdirsVdir6b/wCcc/8AyX8n/MfN/wAQjzzz2o/xof1B+l6bsj+5+L1HOcdo 7FXYq7FXYq7FXjH53/lP+kI5vNGhQ/6fGvLUrRB/fIP92ooH94P2vEe/XrPZ/tngIw5D6f4T3eXu dN2loeL95Dn1eL+Qf+U68uf9tSy/6iEzre0v8Wyf1Jf7kum0v97H+sPvfZ+eTPZPnj8yv+U41X/j In/JpM4Dtf8Axmfv/QH1PsH/ABPH7j95Yzmtdu7FXYq9c/Iv/eXV/wDjJB+p86v2b+mfvH6Xh/a/ 6sful+hkv5sf+S51/wD5hT/xIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7FXoX5C/wDkzNO/ 4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/wA45/8Akv5P+Y+b/iEeeee1H+ND +oP0vTdkf3Pxeo5zjtHYq7FXYq7FXYq7FXi/nH8p/wBHef8AQfM+hQf7j5NVs21K0jG0Dm4SsqAf 7rb9ofsn26dboe2fE0uTDlPq8OXCe/0nb3/e6bUaHhyxnDlxC/m9ozkncvnj8yv+U41X/jIn/JpM 4Dtf/GZ+/wDQH1PsH/E8fuP3ljOa127sVdir1z8i/wDeXV/+MkH6nzq/Zv6Z+8fpeH9r/qx+6X6G S/mx/wCS51//AJhT/wASGdz2N/jeP+s8Frv7mXufH+epvIOxV2KuxV2KuxV6F+Qv/kzNO/4xXP8A yYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxV2KuxV9N/845/+S/k/wCY+b/iEeeee1H+ND+oP0vT dkf3Pxeo5zjtHYq7FXYq7FXYq7FXYq7FXzx+ZX/Kcar/AMZE/wCTSZwHa/8AjM/f+gPqfYP+J4/c fvLGc1rt3Yq7FXrn5F/7y6v/AMZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/yXOv/APMKf+JDO57G /wAbx/1ngtd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJmad/xiuf+TDZovaP/E5e+P3ux7L/AL8f H7nnub11zsVdirsVdir6b/5xz/8AJfyf8x83/EI8889qP8aH9Qfpem7I/ufi9RznHaOxV2KuxV2K uxV2KuxV2Kvnj8yv+U41X/jIn/JpM4Dtf/GZ+/8AQH1PsH/E8fuP3ljOa127sVdir1z8i/8AeXV/ +MkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/5LnX/+YU/8SGdz2N/jeP8ArPBa7+5l7nx/nqbyDsVd irsVdirsVehfkL/5MzTv+MVz/wAmGzRe0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45 /wDkv5P+Y+b/AIhHnnntR/jQ/qD9L03ZH9z8XqOc47R2KuxV2KuxV2KuxV2KuxV88fmV/wApxqv/ ABkT/k0mcB2v/jM/f+gPqfYP+J4/cfvLGc1rt3Yq7FXrn5F/7y6v/wAZIP1PnV+zf0z94/S8P7X/ AFY/dL9DJfzY/wDJc6//AMwp/wCJDO57G/xvH/WeC139zL3Pj/PU3kHYq7FXYq7FXYq9C/IX/wAm Zp3/ABiuf+TDZovaP/E5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/nHP/yX8n/MfN/xCPPPPaj/ ABof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+ePzK/5TjVf+Mif8mkzgO1/wDGZ+/9AfU+ wf8AE8fuP3ljOa127sVdir1z8i/95dX/AOMkH6nzq/Zv6Z+8fpeH9r/qx+6X6GS/mx/5LnX/APmF P/Ehnc9jf43j/rPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/AOTM07/jFc/8mGzRe0f+Jy98fvdj 2X/fj4/c89zeuudirsVdirsVfTf/ADjn/wCS/k/5j5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0dir sVdirsVdirsVdirsVfPH5lf8pxqv/GRP+TSZwHa/+Mz9/wCgPqfYP+J4/cfvLGc1rt3Yq7FXrn5F /wC8ur/8ZIP1PnV+zf0z94/S8P7X/Vj90v0Ml/Nj/wAlzr//ADCn/iQzuexv8bx/1ngtd/cy9z4/ z1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVdi r6b/AOcc/wDyX8n/ADHzf8Qjzzz2o/xof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+ePzK /wCU41X/AIyJ/wAmkzgO1/8AGZ+/9AfU+wf8Tx+4/eWM5rXbuxV2KvXPyL/3l1f/AIyQfqfOr9m/ pn7x+l4f2v8Aqx+6X6GS/mx/5LnX/wDmFP8AxIZ3PY3+N4/6zwWu/uZe58f56m8g7FXYq7FXYq7F XoX5C/8AkzNO/wCMVz/yYbNF7R/4nL3x+92PZf8Afj4/c89zeuudirsVdirsVfTf/OOf/kv5P+Y+ b/iEeeee1H+ND+oP0vTdkf3Pxeo5zjtHYq7FXYq7FXYq7FXYq7FXzx+ZX/Kcar/xkT/k0mcB2v8A 4zP3/oD6n2D/AInj9x+8sZzWu3dirsVeufkX/vLq/wDxkg/U+dX7N/TP3j9Lw/tf9WP3S/QyX82P /Jc6/wD8wp/4kM7nsb/G8f8AWeC139zL3Pj/AD1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/5MNmi9 o/8AE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/AJxz/wDJfyf8x83/ABCPPPPaj/Gh/UH6Xpuy P7n4vUc5x2jsVdirsVdirsVdirsVdir54/Mr/lONV/4yJ/yaTOA7X/xmfv8A0B9T7B/xPH7j95Yz mtdu7FXYq9c/Iv8A3l1f/jJB+p86v2b+mfvH6Xh/a/6sful+hkv5sf8Akudf/wCYU/8AEhnc9jf4 3j/rPBa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c// 2Q== + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:73FE812EFA94E911B987F622BD994B0C + uuid:004ce5b9-fc7c-4b0d-93ee-bf4717f6614d + + uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:73FE812EFA94E911B987F622BD994B0C + 2019-06-22T16:29:45+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Cyan + Magenta + Yellow + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/Properties<>>>/Thumb 38 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 35 0 obj <>stream +H‰lK +Â@D÷}Š¾@:ý™O²5Š« âãÂ,Ôûƒ=ã' +20Ý5¯Šiw¶ãÀ¸ZL¬™L£ß½*Þ&h·ÆéWd?‚3ºã8CÑ3ô½K!)‰ö.-td]ÙÏp‚=È\ _0Ëd +"iA6I°ÉÞ§3Tåoݤ•ý%žð¿Í—1ûiÜä\+—Y;q%ê.S +)¼”w"³X35fÊñ“¸ýà Œ[>¤ +endstream endobj 38 0 obj <>stream +8;Z-Q9+lk"$jPWQ],\i6ZcXl0:91<&O?ajCF]t))bSU7-g/@oZJb=TD4`>/`f0_;N +8C70HZV1@\[_^QkYh(XZhc"omWBGXj"MjeZ8*Do-[FJI3=#Ahc:OcT?i2RIgeHAe+ +eTESII-RNAZO,\Bil_dEc,:DoOCXu,(2q'cVX^Jhe38'i1)g(1JrG!;\,&'M7RVCu +irj;VlI-Cj3d`.0dN +endstream endobj 39 0 obj [/Indexed/DeviceRGB 255 40 0 R] endobj 40 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 33 0 obj <> endobj 41 0 obj [/View/Design] endobj 42 0 obj <>>> endobj 37 0 obj <> endobj 36 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_blue-orange.ai) +%%CreationDate: 6/22/2019 4:36 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%%DocumentProcessColors: Cyan Magenta Yellow +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 45 0 obj <>stream +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 20905 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C4585FD6DFF7FFF0885FD6BFF5B0EFF0F08A9FD69FF850837FF080908 +%A9FD67FF8508090EFF0F080F0FFD66FFAF090F0837FF080F080F30FD64FF +%AF080F080F30FF310F0F080F31FD63FF310F08310931FF080F080F08095A +%FD61FF3009080F080F30FF310F0F08310F0F5BFD5FFF310F0F0F08310937 +%FF080F080F080F08097EFD5DFF5A09080F080F080F30FF0F08310F0F0831 +%090F85FD5BFF5B0F090F08310F0F0837FF080F080F080F080F080FA8FD59 +%FF7F09080F080F080F08090EFF0F08310F0F08310F310831FD58FFA90F08 +%310F0F08310F0F0837FF080F080F080F080F080F0831FD56FFA931080F08 +%0F080F080F080F30FF310F0F08310F0F08310F0F085BFD55FF3108310F0F +%08310F0F08310931FF080F080F080F080F080F080F085BFD53FF37080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310985FD51FF5B +%090F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F08 +%85FD4FFF5B080F080F080F080F080F080F080F30FF0F08310F0F08310F0F +%08310F0F080F09A9FD4DFF85080F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F08AFFD4BFF85080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F30FD4AFF +%AF080F0F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F +%080F080F080F080930FD49FF0E09080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F30FD47FF300F0F0F08 +%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F +%080F080F08095AFD45FF3009080F080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F7FFD43FF5B0F08 +%310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F +%080F080F080F080F080F080F85FD41FF5A0F080F080F080F080F080F080F +%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F080FA9FD3FFF850F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%37FF080F080F080F080F080F080F080F080F080F080F080F0831A9FD3DFF +%840F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310931FD3CFFA93109310831 +%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 +%0F080F080F080F080F080F080F080F0831FD3AFFA931080F080F080F080F +%080F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F0831085BFD39FF37080F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F +%080F080F080F080F080F080F085BFD37FF5B080F080F080F080F080F080F +%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F0885FD36FF310F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F08A9FD35FF5B080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08AFFD34FF310F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080908FD34FF5B080F08 +%0F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F31FD33FF +%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 +%0F30FD2DFFCFFD04FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F080F5BFD2BFFC2FD05FF300F0F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F08095AFD29FFBBBAFD05 +%FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30FF +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F7FFD27FFC2BABBFD05FF310F0F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F85FD25FFC2B4B4BBFD05 +%FF5B080F080F080F080F080F080F080F080F080F080F080F080F080F30FF +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F08310931A9FD23FFC9BAB4BABBFD05FF310F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F0831A8FD21FF +%C9BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310F310837FD20FFCFBBB4BABABABBFD05 +%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF +%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F +%080F080F080F080F085BFD1EFFCABBB4BAB4BAB4BBFD05FF5B080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F085BFD1DFFC1B4BABABAB4BABBFD05FF300F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F087FFD +%1BFFC2B4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F09A9FD19FFC9 +%B4BAB4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F08A9FD17FFC9B4 +%BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F0FFD16FFCAB4 +%BAB4BABABAB4BABABABBFD05FF310F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F080F0EFD14FF +%CAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F +%080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F31FD13FFFD04BAB4BABABAB4BABABABBFD05FF370F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F080930FD11FFBBB4B4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F30FF310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F5BFD0FFFBBBABABAB4BABABAB4BABABAB4BA +%BBFD05FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 +%0931FF080F080F080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F08095AFD0DFFC2B4B4BAB4 +%BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F31 +%080F85FD0BFFC2BAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F08 +%0F080F080F080F080F080F080F080F087F3009080F080F080F080F080F08 +%0F080F080F080F080F080F080F080FA9FD09FFCABAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%85FF0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 +%A9FD08FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F +%080F080F080F080F080F080F080F0885FFA9080F080F080F080F080F080F +%080F080F080F080F080F080F080F0831AFFD07FFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F85FFFF8508310F0F08310F0F08310F0F08310F0F08310F0F08310F0F +%0831095BFD08FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FFFFFF5B080F080F080F080F +%080F080F080F080F080F080F080F080F080F085BFD06FFCABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F080F85FD04FF5B08310F0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F080F087FFD06FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF +%300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF08 +%0F080F080F080F080F080F080F080F080F080F0885FD05FF31080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F0885FD04FFCABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F +%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F +%0F08310F0F080F85FD06FF37093108310F0F08310F0F08310F0F08310F0F +%08310F0F08310F0F5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD +%05FF310F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937 +%FF080F080F080F080F080F080F080F080F080F080F0885FD06FFA931080F +%080F080F080F080F080F080F080F080F080F080F080F087FFD04FFCABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F +%08310F0F08310F0F7FFD07FFA90F090F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABB +%FD05FF310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%37FF080F080F080F080F080F080F080F080F080F080F0885FD08FF7E0F08 +%0F080F080F080F080F080F080F080F080F080F080F087FFD04FFCABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F08 +%0F080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F +%08310F0F08310F0F85FD09FF7F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F080F7FFD05FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF +%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F080F080F0885FD0AFF5A09080F080F +%080F080F080F080F080F080F080F080F0885FD04FFCABAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F +%080F85FD0BFF5B0F08310F0F08310F0F08310F0F08310F0F08310F0F5BFD +%05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD0CFF3009080F080F080F080F080F080F +%080F080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD +%05FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30 +%FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD0DFF300F0F0F +%08310F0F08310F0F08310F0F08310F0F5BFD05FFBABAB4BABABAB4BABABA +%B4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F08 +%85FD0DFFAF080F080F080F080F080F080F080F080F080F087FFD04FFCABA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F +%080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F +%0F08310F0F08310F0F7FFD0EFFA9080F0F0F08310F0F08310F0F08310F0F +%080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD0FFF85080F080F080F080F +%080F080F080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BBCAFD04FF5B080F080F080F080F080F080F080F080F080F080F080F080F +%08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD10FF85 +%090F08310F0F08310F0F08310F0F080F7FFD05FFB4BABABAB4BABABAB4BA +%BABAB4BABABABBFD05FF370F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F080F08 +%85FD11FF5B080F080F080F080F080F080F080F0885FD04FFCABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F +%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 +%310F0F080F85FD12FF5B080F08310F0F08310F0F08310F0F5BFD05FFBABA +%B4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 +%0F080F080F080F0885FD12FFA931080F080F080F080F080F080F087FFD04 +%FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F0831 +%0F0F08310F0F08310F0F080F85FD13FFAF3108310F0F08310F0F08310F0F +%5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD14FFA90F080F080F080F080F080F +%087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F30FF0F08310F0F +%08310F0F08310F0F08310F0F08310F0F7FFD15FF850F08310F0F08310F0F +%080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD16FF7E09080F080F080F08 +%0F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B08 +%0F080F080F080F080F080F080F080F080F080F080F080F08090EFF0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F85FD17FF5B0F0F0F08310F0F +%080F7FFD05FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD18FF300F080F080F080F0885 +%FD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F +%08310F0F08310F0F08310F0F080F85FD19FF300F0F0F08310F0F5BFD05FF +%BABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F08 +%0F080F080F080F080F0885FD1AFF0E0F080F080F087FFD04FFCABAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F +%08310F0F080F85FD1BFF0F0F08310F0F5BFD05FFBABAB4BABABAB4BABABA +%B4BABABAB4BABBFD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F08 +%85FD1BFFA9080F080F087FFD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F080F +%080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD1CFFA9 +%090F080F5BFD04FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF31 +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F +%080F080F080F080F080F080F080F080F080F0885FD1DFF85080F087FFD04 +%FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F +%080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F08310F +%0F08310F0F08310F0F08310F0F85FD1EFF7F080F7FFD05FFB4BABABAB4BA +%BABAB4BABABAB4BABABABBFD05FF370F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F08 +%0F080F0885FD1FFF5B0885FD04FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F080F +%080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD20FF31 +%5BFD05FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD20FFA985FD04FFCABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F7FFD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F08 +%0F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F +%08310F0F85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F +%0F080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F +%080F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F +%080F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F +%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F7FFD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F +%080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08 +%0F85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F +%080F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F +%85FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7F +%FD26FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%85FD27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85 +%FD27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F +%080F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F080F08 +%0F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD +%27FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF310F0F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F +%080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD26 +%FFCFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF310F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BBCAFD04FF5B080F080F080F080F080F080F080F080F080F080F08 +%0F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD +%27FFB4BABABAB4BABABAB4BABABAB4BABABABBFD05FF370F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BBFD05FF5B080F080F080F080F080F080F080F080F080F080F080F +%080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD27 +%FFBABAB4BABABAB4BABABAB4BABABAB4BABBFD05FF300F0F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F +%080F080F080F080F080F0885FD26FFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BBFD05FF37080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F30FF +%%EndData + +endstream endobj 46 0 obj <>stream +%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´Ù243wdEÂÝ#؜áQBöµ;;’’Ì +c:’Ì,rɗهÙ[ý>U(`æG±9ӕ +34ÌÃ¥ÐãSÅßýo_ýöËë¯_ÿîîËp5ìž|ñwwxs÷ìÝë7?ݑ¼ûù‹ß½}÷¤ýæÇ»q¾ðÔõÏËS{òŸïÞ¼½ýê§üÝUÀooñþxsÿöÝý³W»Û»—òЏw?ú1~û÷ï^ÜÉï~õôw/¾»ûòõ›g¯¾¹»zvÿcÿ©ñøì<6ÿdš~2 㲋? óî«_ò‘g¯þøìíÛû¿Ü¡ÙPØêþõw¯¾¾õÍþõÿóÓ]šw_ƒwÿ˜"~ÿ÷¿¹{ûÐCW%-|òøúùw/ï^½ûêÍëçwoß^¿xýæíOw‡?K_~ùìùͳÝÿy÷âÅë?ÉÓ×?OOoï_ÜI§_>{·'ŽÐõÏÇééþ»û_ÿ껗¿»“ñ˜—‘ôð”õýÓ[©HêÄ¿IÏOþRH¿½{÷N¾Ošã@ÿægûþ+„Êò£ÿö•ôÿNZ|óow¯þûkÍo^ ÞÞ}™Æi‡ÿöÛ¼{ùí Tö}JóU’^ó¯þ‡ú°t‰~Æ«’—e÷凫y¤Ò¯F™“ݘ–«¥ØmÔîþx÷§Ÿî~õú՝ Ðõ›w¿Õيqô¿ö«ß|÷âîÍ?½º'=“¶èýòõ×w/äVÅí‹g–±ýמøÇgo¾¹{'“üúÅwï¸$‹·"³ð‹g¾Ã4ŽÖȯ¿½{õ¯ÿ™Ÿúå8Ía—Ç°d Æ4•Ý’ân,l$I;ãìíŽí¿V;ªBEµ‰Œ©ûJfó×oõÓúùéÏÞÜݦ8O»¢ÿa?®J÷ÿ¥þß>W:ÿîÝÝ«úý²¼¿ìËpõË_£Õ›W_^¿Ä<¼å¦¸“öe½xýý¶ýÀßIß}kÝ á©LÛWoî_¡â'_üJWž~õâ;ùåÏÞ¼þî۟¿úýë'_üHÄ?ß=& sûõî׿ûòƒló_={þ‡oîþrwÿü¯îÞݽÝíeݟ•­þíßS±ô÷ÍÝN+ïòGùû÷øû1ïï~/;²U Ôø¿CŽ/^ܽúòÿúîí³wyùúëï^Èoo^ýñîÅëoïvÏ^}½û—go¾}L_½xöêٛQ[èëÝýüÕ»»7ÏþíÝýw/ŸI£òÐ/îÿ(/>“ñ}T ²œ¾•QãK|fÝÚCt¿zTSÏÞýa·—üú­×~ýꛘÅï„=oGŒÑçSýoÿüòw¯_Ü¿}é•÷ÿ÷#¿T†õÕ¯_é'¿ùîívÿøúõ ¯ù—rdݽùöþÕÛ»›¯.¢ïýM5äŸk›çŠ&Ï^¼¸ÿæͳoÿpÿü\+ÿÕ~ÿûû»³]xÿQ«ë9§ê\«¿ýöî/÷Ï^œmñôµ¿¹Æl în¾¾Þy <øÌoÿôìÝó?ì~qÿ»7ÏÞÜß½g·b²ÿêkùÐß~wÿîÎAgp®|s÷öîÝ_Þ ƒö +6#/Üv/´êÓS9núãäË/>häŒÝ¿êùٛg_ßËQ&ÒâÏ^¿øZþFªnÿ–c3ïö_?ùâ¿=ùbèþ7ÖÿÅÝß=݋|õŸ…¼ý3nÊԕ`%ZIü-3þ/5Ϋ’½”aY•ë®ì¥¬»r3ÜJ·µ¬>­ÿ3u%t%®JÒ"c€¿ó8KÉü»teY•ëqïåàe?¥ÔŸŽRãq¼!í8Þö¥>~^ýº»’¦åÉú÷”»R¦EŠþ÷º+{-O¾ø?ÎÏé¥Y «yÝì¶9–"5ÖyŽÝlëìö³\¤àoÌnYÍóÒÍ´üWjÔ9¯³¾÷ùÖ¿1Û7ý¬ËõÏpvÎ'™~ƃÌ/þÆ c®g–ÂÙΛ™¾¶²žcÌ)þ¾a9nf³68—mîPt®êÌ-6g2O2§:W˜³ƒ•#ˍ•[”ºÍН͜Žœ­hã_8®{î™[ŽÐĘÙDžý9ò«Gûʙ«çk…m£­)„òhŒKØK9†[™ö1†cŠ9–¸Ä븏Çxoe8§’h‡)§%]§}:¤›$ûT>i”%ç4Ïs™—ùzÞχù8ßÊ¢e0bNy΢6å}>äc¾•3–©Ä’Ê\rYÊuٗc¹)·²pdN—°ÄE*Zʲ,ûå°Ü,·²|Æëp¯Óõ|]®—ëë뽔Ãõñú†Kj’.Ä}Úç}Ù/ò«ýþ°¿ÙßÊ2“Ñ䠇C<¤ƒ|Âa9\ö‡Ãáx¸•e7r2â1ç£|Þ±—ãþx8Þoo™žpoæ›|Sn–iìæp#«äæææKãVí6ÝJgoåóo¯¥H£·òêíæçtà´:í¦+Ç®º²_•ë®,µH‹4ßJîʼ*©+±+¡+²¥ÆÉKÏÙWú¿éÿWå E† ï»rݕeUJWrWæ®C¿I^⪄®L]»2ôE‡ýÉ6}ú?‡®ìµÔ­ºšÏõ,®ç®ÎÚz¦Ö³#3"5Æ~Fº™XÿzÔm´7#ÌQ•ñZ6cj#¹Ãõ¸mFk=>2^ëqÑ1¹¶²°+ÙÊ̒¬D–`EÖ7£©z*øV¨ÓÆêŸ=˵•…¥X‘Í.›?f+ÉJd V”'×3@øj7§7œÇ=ç­pžçs1pôíkŽmæhFŽÞÈѺáèì9Ez—Ùwô½Ø«#{qÍïÎüÊȯ’o‘es#Czvv-l­{›…ÉEav“ðyùRYR72Øa†×ÂËu™„Q9oF9ƒoeê2(ûåZØiY²0Ö$ 6È 5ʉ}+ â(ƒµ6¼ùFaɳ°æX‚0éQÎö[Y*GÊ}¾&^rvž„­aî£È·²ˆŽ2¼{aý‹Y‚$BcaœåeIßÈdäи–ãÈ2§$‡ICeùâVÞQ¦d/Î"OŽ³AQŽ¢I¤A¶À,ƒR×rXÉ7ʱ5‡$Xƒl‰æVëQ¦Ç,^ÅIŽ>Õ0Ï)ûíD`{ÏÖ'ù¬l0=ú!îA@X(@¨@!"F]ZeM¬£ÖÐއ€2­øÅmw(§Xd%Y_£¬­s+kꎞRø£'ÕÈ ‹Ó*q[×ËÎ,œXr(‰ÀP?g£Ÿ‹³,½ræd ~2â\¼F›õ}—1‚I°¹Ê”2n(gŒ&i$—5®·SaŒ7ÜzÍò3eÁc¥`CévêÏQ?€ëc†ÏÓ5E››p²(bŽ.>©À¨"” +†Š÷7ÒÈh¢»v³ŠâMô¦ÊÂÚj]­&ÖÁÒ÷Ï’?™:‘+ÁƒBG’e¥ì¹f6‚F?<ɎÊ¬zvՖUcY=Ó"ÛòÑ?ÃÌÖ¬ì}ŒÌ§c³•?ËFÞ»|]KӘÊJ—ʦ_iI+Ìô2©13Ð?*ó¯T⵶WO+×]›`‘Q\i‘JèUóÀß˦”Mi«þk6]¶/ñ¤„“2)öGjìÿœ¨ŽØ½ìçÏa-² +^ö^®/”åb)UÔó¦Ì,M{M}‘W?»…£ýû´„ …KCjœYÎ ò™"5>îÉGÿ9k+ø¤?Ÿ¯Æîx}`Uú­RüъÊmÕRm#Åtïj;±}/»ZõôºÛ«=¦m…íÞ®²oÝËýîÝÛ®®V„Ó½›Ýê0[In“hv©ÐïV·f<°Oå_n i¶±ÍÞ¬»óÈ£©ÚXzÛþìÞܯ,s§»³Úp¶»µ¬¬|Í*T-Cçö«ÿ¼²¦“WÖÆË»rm¹ÚÚ,Ïíۇvóf¯rW_ø݇ïèwõßÀüü5^z{õêTÁR©åTÁª²Ê@…ý†Éb +æl2ÉäêÕm'•ä•T2u*ÖA”,ªXO¾% j–*YP³ªXªdhuRE«¸¢Lтªu5kOE«Ð†%«‘ÊÖȍrKýûˆ&¤‚"ª–*[P·&U·¨pMáÚSá*T¸ r•ÉÚ1µë–º4/U½ |*_P¿"Õ¯‘Ûê–*؁*”0¨aYšÅ£¢i‰Š¨Œ‰:F{Ð ²£(dPÉ ”A-ƒb–c¢jå,u TÐnM‡ßk¾P¾ƒ„—)åÍx!àÏH«qvˆÁ:!MŽSÙ­P=C‰äà=ïî¸v'…U{®þÝóä^†¢¼$ü6žÈFÎYW¼t%Ù¬¸æŠGʎée” ·;Ëç/Îȏã¹ÉgÞÕ®Šjé-dýŸµQ°3u®ípõÌ¥Ê1šJÛJX•µÍ/mʼ*"¬,‰yec,Ô±ÖåzSöÛb;OÊéŸÛÓRW›0Èþ$ϔél gKµ"ž–t¡Ì‹Û“¥Æ¼)åÁ²¼§ˆH±²jŸ/ûGr|©ñðÈr|\‘O©ç¦òÑEj¼ô»üsæxýèšÜ@4¸Ö:™EK´¢öÔj_ÍVªýu±bÖY©Q­µõOem Õi©ü¶êÖUꯖbµËú¦yJËì¥Úš‹—Åʵ—ýžu„yé„cãU͏pž;u|iå§Xñ¤ Üèê9Ϟö Ë¼çž³â1ÆghK»ÌcÎp–÷q©ñA>ò²áôr9×øhNÑíþ‹|â‘\á”<°«.Å]ýAfەáV»ƒÚRé(†,¢ìAçÎa¼Æ NãÁÜÆp'ºŽ‹žÕ}|„Yu Š¬p"ËCA¶º’áL¾¡;YÊR(ÊøÇò5Ee8—±™ÔÁ 3äOº™Ÿ|AWsTNwó^ØÓѝ΃H‰8áxŽò¥3EøEÄùk:¡Â>nÌ=\ˎ¡¢ð§4ÜÒóu¦Z°tîi:¨¥`aB^i« tVÃ] Ù=Ói]DõXèºVçõÌ ý–nìÁ¹p忕óVŽÛ8­ñXᷕ»6®Z¹i㣍{6®Ù¸eÏ#f¡v®¸â†®e²žÛ­9œ Œð²ÆÙÖ¼lýÎHF§ü©—yÎË5—¸ÎF*é‹Ôøy/×xìéÿñ»ºšÃýê Ùãn’Í»2\EÙ;»€^ŸððoŸ|ñwOóìþí™:¯’<™†]¯Dœ/W¸}µ]s^â(¿¡OðJ™¢ü#§É~=i^vx@k™®Âbkî“kÒïD©M³<6ȶŸñ¢h梺³²%¦a!]8eLò ]eájNÓ}ÖgªÐ¾n„Ï¢²4)óÅ"üY+ݲh“ðYT&ӗ–Uei–þë>O…Ÿ0—S¾*!,¨ª¤¼|ê„n«;·fíã—åJøüÅ»~ +õì ¿Y!˜`™ÿpÿòåÝ €2í_Rq¬Ìÿì¬óÖæd¬2™›/c¼6Vxì}¶Æ梡f(bzœ  OyÈQµçávKó‡j3³kd7äpÀSáàÒC뚶­ã4¡"«gDm»j#Æi2öR]ž;IÇ©#ÐÒÅs.£Q{Ëmêì4Ž)"˜G%lÍcÙÐ ŠO0„ d7†Q8$w{>Œ½èÂ]l—~²æ†ïñÍÐÓ»sÇG?­—ê’?úÄA>3¤²R!|”ÅÀW(Aî‚Ô•dD id ”®’õŽÙ½É:ʆjh¸†2Œgƒ»4©9,›Ù+š}lFáGcS…KqOz3«‹zR<‘ሎŽº6ÄP5'C)"hàqsâtÝTK¢zƒKωôL):S’.4^SžÞS–Ù£àtKɺÉÖ +ÅÄ<ª|­v“±)e8Sᙐ³!i‹ÄKi»PÚ®òöq%so¤n“¹±*„“rw•¼e—­eo¬’Å`ŠŽ7îœ(yWˆg/y(yß@䒹WÉ;t’w6©{O©ûH©[áŸMގ¼ YÛ¥m‘ʏ”¸«¼}*q'“¸)s»¼½§ÌM‰Û™•AÞ šÜéN;ý÷ÿ{M5C2qfV6—ÝMsÞÕõ;º¾«‘ºÂŸG7[‡Á·¿ÃêïhŒºB¥“ƒãÕ$.Œq<¾‚ä³ýWéú_u{¶ÿ^¯LïGƒQWùBÅ%ó&n— €:)®T,ØG¡ÁFgקpÐÝÌÁf âÚÍÆ[svSóÈÜA™­t@f©q f>®À̗×g1Ãú¼^¥²²¹‡1¾foͶ¢Óö¾zuý.< +¹ŠeeëJžyT¶õ f§\^]Ÿumßؐ:¹®s)²²uµg[ñ3µÊ1ʓÉÛõ QGªî€îîÇœsfmöå¼Ël:1{Ÿ8œ tXƒîO‚dž„>l@ùç Nƒ ¬/5ž …Èç¼q^ˆDӞŠØE—öЈà³;iß¹[Ú^ê÷S·«N YW‹¥ö‘9Cî‡Ö/Ü£@ýFaa‰¶„K1WÁ2)¯”xyº³v}® +ÕðQæyñj\Dt.fHÝV¡vžf7™¯DÒ*Ý÷|tú9a‰°Ð„,§‚½<ŽY”tÿBoK^Úõ#ÍòêØYí>¹&3•!f +K¡ùKŽâZ:‡Œ +`dÒ!¶z–«”¤”èÌ@ŸZÕšn~ýæù»ƒñÆÿ-ÕL}DíÕ,’1¢äkÂ$‡g¯•£±ŒÏÀ”·µÈڛ»ú¢&ë°·vö’`‘`cz ÕG¼m°Ç¾‰±‹ó•ΫiøØ +>pð‹o0ôö/šâÚÀ÷rz•ž{ ¸LÍF¬0ƽ‡ßT}ËàÎPBªN”\ïɮݴÐÐâÛk/-œ—ʺL+ì´ÂP[ ®BVÀzÙfh5 îÂ(—ª½¨Í`鴘½I7ÕrnŒeWVDë„.ªù²,©¾Î¥–„jMØWùÅNŒêBQÑ|2”¹™3’U›DȤ½è4Z–ŠÙ´˜ Qî’KK(GÉRÈÔ¼$/íOöR¼\{Ù·"5ºÒ`k·PSW%t…Ã÷䋽¤U9ýS6e9SDØÌ×'åp¡(î܂aø‚³}øàÂ- +Åô9ÊÙàæޜ=Àyßö츎­)Ü¡ûª});Pí «î¹ÛÎ>ÐüًÅ;«[¬{¶6Ù/º?tf,ºÐ–zm+û†v5¬å@ër²U +«ÚžkòȵX}ÙWTóc_ӏmóH(èH.ÐêYíh…æ}ØÑ ª m0Z¢Mý֋{­fðKœ(n7 óÅmhôWӆöÏºy­—Î~v`À5lÚ7†‘tµ¨)kõLU¦!…ªçZõ“†jH †â„÷W¸Ÿñ³œà}V^ìßãÈS ×Xž*>o;§HS”à¡ÃžÃå¬9Ñ9+åd•}ûwIIZ#tâ|à%làƒ¥ÚZÆu,t‚®ÑÏ5î¹Å<×/iŠš)aš¥JÕ:ª¹E‰WU¨©=-~ÙšN9Êk¯ÜԒÓ(å¦ÖoTú^•7¬ÅZ•?oh:Qã7*¼)ñ†¿[«ñkE~­Ê¯•ùbVîì¡Ì’«ôM­¯ŠýäO†N½¿í”ü×å<ÜZxEm¼ýY¼/íXk‡tò[‘CWZL߸*=îz Ýè5hNªpÈÆ«²?)כrîhä±ërö`§ÑîrqAIjLJü࣍i4>Cù¨Xø‡£áB*;pDz¿%]GÅ÷qñ杕Õ=¯<´ÍG{\™^W†WõÖº¿¶zl¯}ž³Í“Žë´ ä8¸wrلs„f|5óëM–µH°çVXÌk™)ÆV¶šb›{íÅna™R°¬ öPoö´ +ø¸![‡},”Z²›l“Éò"2ýHC| ÑPƒs×!¢S ÑÐÕBèl9ª‰Üš¾¢ UÙޞàk3×°‘>pd6ÅԚ «’ÚRÙτ ^ +¬a&ëa‘õLc[:QõRØp+ñ\±Ÿþ9ì»Kvüìæ¦Ü|LyfŒ˜š²¶œ ÚÒPD+$|H¤ßÅÌ ö£±Y’Ün´5p|Äëhcø§W¯ž½¼ûz÷‘v#ì g¨½Ñç\¦ä*J—…i¼ú¯Inkš ¹ÝÂm×9Ö@[…(àz¯`trpírâÖlƒx¢`Õ¯¯É Z¶½Ø3+ÖÑ͏ÍøðtX֟÷ꃾzo_Ý.ôã¾ys=ߚ¹æ$}ÃY*ÎÝe¬ÛL¬ó9}?yb>S–˜ká-KÌ÷žÝ懯^õÊ©bNrOY½ Ðï3MîWj×:óóŒó3Ô.ª)œIj•¯ˆŸÌk‡á<·:RJoùídHCì÷!0ð”…û\(,²Ð¬z#ûWÍ:…;VáošÃN&Àáoùd¦YòØe­«ð·dÐrÖe -``A6=ù¡MkX“šVÁÉL2ë`‚Þ0s³À„SÍ3 +ršLù‰f¨©á³©PU©jzJýcÊÕ²ª¤U¥míllñ2«-íåºÈ˜NJ8[⅒ÖŔÑVæG•|¹Ðw}¾”+ þ¸rF›<-äñË5^z¢“*ªü6;WQ©m¢äWY3'ÂÑ2e57é¬ {•&”rÉ Ò@Ÿ'3Ð@<ôҝpÙÀ–Þ$*\ZÖð¦up“ó ,O›d9»qXø‘ð¨}ädœÉB¢Â§UÀSò §ZªYCÿHÆjêð6#J5­4³K‹¢ifšq[ˆxj%œ)ñBI'…ÜQjœ/–3þ• ¥­ŠaW>¤œXÖEj|ÏZ]ã£ÿHŸùÏÿ5>ÀQ “ÜX,D¢r­Î)Oü6›ÎQ³ï‚Ÿ˜®'å@-CPš{ZÞ­ƒöÓ*﮺š*|»w3ç(•§TØö™É³\¥ò•Ì´Ê]®WœEmð[ÞÒøËdÆe’™>å´î8MýӖëšÏ¬ÀC[˜Tå8*G­¸Î%î3](´1F_æHïãO^¤Æ~ûåa®÷Qå‡ÿZ5~`\Ô£ÿúÙÿH5vf²ãI:á½,ß|“d "—îÑò¦Í̗60Sڞ&¯™æ®Ñ2£íe½©s F.˜¸`ނ; ®4u£iÜ‘ÙÏ4Z!Õ¬gt•yzé’kŸH5.á1©¥·É¥=½t‹Fxò…¹¹ª‹«º·‚E%ŒîÔ:v± ×]n³æÆ¢ KxÔ´Êq¶v]UÇUsZ5—Uï° +ÍYe™-Ç3™-·nª­“ê‚{êÉÕ%÷ÔÊ9õcJj¼à˜:ç”z„JƒÀ[)vOÇûË%ƒÖIa>ÏÏZþרñŽòGù£üÀQ>_?p”8ÊåŽòùj\¹Ù¼üðãIï}žb:Óã’•d‚’sRgü8 |ïÌ?øÏùœ#ÿ³V[}úÃ.Wƒp»•gó+Cš•ßÌãMìB¼šÇ.Ý֏ljÈRqšæÝ4\…iÉçjØ>ÒjÈù¡§:aº€G˜€GÁ3¾ÝlØÇ ûb©§Ýõñ¤>¬xM[À5þ<äù9ñRyÌ|ƒÆ ?:0þô +¯roÔY0û[ +s‡‘ëïùìïøܔ¿Ùšú”MOÌØìk¶B|vÖ³¶šqævãºb7<‘߸d—ùíN]Šš–f©t –ºôJŸå™5 sQ&•Cµð¶†È|w%Ž¹í†—a:ó P¦ÏW§ÅF§aYdZ/<û€˜ã ÏjHÖ ¸TÐ}ÐÇU`­–Þ|þñùtÖyžqN›½1ç™û²2k°M^ŒK°é#À¢ù,zæº뚐Á+`lá|oÎChWý²k Ž†¿þèè{ÁŒàÇ5 â{Ü`+҂…m¼§…e®Ûh¡!§¼§tÀÄ5Ùþæ¯m g÷CØîÖM›¼¿}2=Xn<×oËô›ºëù4+àž),³oÙòùΞÇ÷Úâ}]Óɦ1ÝÏD%4di¡ËmoñÚ75hð¥ÐEbà 'ÂĬñÖð? ªúÆ"¨ƒ)Ýq}|kŸWP÷ç;Úf<êsMD ÄÔ¼G}æ£.Dz Áñ›UjN©8Ÿb|aO>b|fåh²Íöø˜×õ4“‡é?Â8æ€ÐW…¿Íeîó¦ö ~È[Ÿ¼ ËùmX¶)X={`ÍØgì®ðYÛêr8É^!½ ºâ°^çÆÁÀCˆio×÷åO}g•Ÿó`.ïÀ=¶7'w°½äí\¸CõB²­¿â;½ÐŒ¡é#R·é¥Î%˜Ï$˜²äRT€šÊS£K1Ÿ5–Ô¿ÕS„ÊâH+¶t¹²«jlg œZd ·ÝÚIg[›Hyå-6V(m¯#'[Yƒ³DŸ/šG'a%7¼Øjá…Va?Êx™¯v–/™¤]\XµÐ¤Aaü Â.aò\dµ%YuÈʁ˦ö²³ðþ ›ø–‘…×¼D +«Ãï0=/Á=êzØ÷ÝØ Ûûâ趻½ÖeNõû +<´ Ü.qÀ5dÈcYÖÙTG“dZ@ïïAú‹w®V`å3w1<Àk·Ü–iáZE@q>„böþæT×a]ÎڴʶѾñWßòõ™Ö¹èa‹  Ø€ˆ§á¨Ùò:§DµÉðLðԅó#œ FÉÌ•…:{Ø醧H8 L,‚’B!ôÇ¿®¿ïûÓnûÖ ‚ ‰ýè+‚ëíÛ?|Ý'~ÝJe?L´<ŒÃBËÃ< ¢ä•ì™ˆ¦ âNÿђèû+#>s½&²Æab‚²4#üÉ(ÊSÍjÙ ¸J`:ó¯sž®Qçûoý¬õš±èӌÿµÎñ +Çõçs*lêµqûÝfþ¥q §h˜‹öŸWHœùÇy5á3Õø©*D<«AÄ­?€É°Œ©Ø- ·¼a¡²Nܯpki–ÀÀ5=¹§7v|3à€DÓuK=¾º Úuý…~µO±OwQšìmÑ6WW¤m.G[_ŒÖÃêח¢u×£­²{>|±ãã +îmýÀ;¶ÞWþjtá¦Ç^GšÁ(S …D«h¸÷eÉÿ2ӕì ×Xy=ê!Z:2Oû-_5Ýx„Übz¢Ñ&zÊ<â¦åЩÍk5XB²‰&jv½biìZhXƒ%wŽ mº¹íöLev¾¤³%҂s®Ì[x Øg-^£¯‘–]¯f¬—dèM±5•e¶ÿ/½¦Q‡):x +ö‰›>azÿ_üÝ'¡ºtô}lÀãb>êÏ5>öv¯Í Ûó j®uƅίqÞóúfȅeBH„! F^Ë<ðBfȁ½¨ÐžKR`'º$x4xʵÝúP¯P®w¾†ÔëéëmíŒþ²äþ*ùådù{*PÞ&pþrä÷^Ô~þ’ä‹—­ô¥ë3ËD/7ÐËÍm>=$®Xn +ÍLáY)¾­Èl\ÍøîÖ­•á}ß彪†÷šûª7½e Ø4ð`¸q#üѲ™îÍí9±ªY¾˜q¾þéR¾òƧ¾Ä“.”é|áí6çÊø±…×´Öòá5:У¹+z‡EuYŒ'ð +þ(ž ±Ï„!sZeAl×<&ÿá:"s»yˆPð҇­s›¥³½Þð†­K嬤ûžrpÈg+ 5nmˆÿþ‚ô÷Rãƒ*‰Ôxþ7ç/ 9½è ¿ð€êØ§W‡Ì'™E×ÙEǓ]U÷Ԟ·g_›Ë°ø…5ч-;ÑùüDãæЫ9pún ­Þ€ Çý­|øž~ž>?sþýéOªñ¼b/¨"¦¨Ð~½.'JÎ&×v”kj“«RÂÏkŽðz²iŽq=yT,ÒÔØï©ÀeËþ)NȀ¸5ŒòáÁ2=f—3¯£es„íPÁä°Ân80~•S%Eµª”¸g^D•)šDIòä=Hy×TP ¯¹ïíß_Bú_ãZµ³°oF¶;ɂã›úÿ6%²bŸ‚ßѵVSª³UQ-E5¯T\+Šó‰ãsòç¯Tãà +Å¥ûK­P[?½öm{m[¯¹zt2˜T§¤ÆŬýÛê—v×N®]}QüþÖ½eO¬îÌÞ¡ùKó4‡eË`©×O,î®Zgd;0GÒDK.ràu¤~Çí¿» ýI5^P9.ST˜Í`]N•œµÔ)Hç. ý +{ËÓ®•¸éòÁ ž桬0—ܸ½w^]ìyè.õœèøL×z™çµe®«ÖòÉl兎Ç-ä#]I>q‡Âüû ÒßKª$py|H懯¾ºÍÞU©št~£põªXSÐjֆ¦ÆÍæ¯Èír©qñ ꇕcíŨ—<4(ãl> óRˆhmÆ“û´£âãWwinŽgÐtY`oÂÍp…‘Ã᪖‚”ÌÔËn<Úåx5¦Ü;?­uª¥aZ1Æiæ=[ÂLǤy瓫²»Í>¨W%ï¦x•×_òÑU|ª#/uä¥-"÷,Fg{¤=:1pŒ'h-^gìnhF2¯uÚãzkl½áªþ·Ýtº¾+¶Édaûsw¿ëö–×­8 M¤³õ-߶úá UÓ;7Yqe:×·¥·,ü-Äíï¹í®Y<½ dé.H\ßý6ù’‹7‚4þº³}©œº ‰—Sɹ^–7²»&†cˆ´ôøÖmÒÞÛîדýB¸¬’8e{µÔ`E¼à¸ñò'ïÄóàøô:BáèøÐñtü¼œÝ‡B>µ5>"jëòu¦0~~ÐúŒzä"|DønY·;«ŽvKs½·ªÝ\Uü檹»G«]4Ì[ºÎœÌ~×ëó£^·Ë9NnîX/ÅK|êªËç±|"‰¹AeZÝçy_÷À5+äõÅø½&ÍçÖu×B5¤u„àq­Î²‰ Ü^Qqò͗£//ìËüuµ¼äُåÚošÇºŠáÜУœjThdAC;e˜—ÅÖ¿qgßÛ Š·»è“+û^¢ +ÿåîþÿûÿÓî·Ïÿð§goþ‚m³¡üµ.¥95é}äµ4O¾8I[\“ ×¤Å}Ââ£ß‰¹N€^0»±$ÅS‡Ô_G\¾„¡¿‚aßE|J„Ä¡»V”d?2FŠç õäž[CÐƌó}_ùsbþýèK˜¨èòš©‰_“ݬª«¦¥»®2vKy ÙzaD•®oì&ßG¤Ñߤ»6£æƒÍÇÅ¥œ¹Üãc#S։!ºË=¶©AŽçÓL‰¼ÊåÅÏ9ÕÎÝŸ×Oj<åxg4—³©¬×‰¬-ëÉŸƒ•5 +«Å`É*ûè(,s…ìÕêA{G8Ê©.eDææ|™ïíN­±ž½U‹i³m?tübE/ÖǖäOÆ[!LôçiþŽJô·Nóg±["ó|Rô–FOj—Ñ[²Ê>:~‹ˆ] 4fC꣋½u»Iö“ϧúaMü°&~X?¬‰×Ä:-ØdÌ:Íÿõá/¯æ-¡<ýÕëW_½¹õîþÕ7_~Ù«îýož|ñ«où» ¿ûêÙ»wwo^‰VýâÏoß>ƒ6oÿÚ-ËÕ2O ÜÀqžÃnŠñjÙÙMã|%‹kÖ/¾Ö¿þõOøû;ý¡:PÿõÏúó‘ÿ¡þI†b÷ËÝûïÃîë'|ë7x ¶T+Þ½õ¤½Ý/Väú]¿è«8K\Wð +ÿùÉõ›wÇûçïî_¿zöæÏ»ŸªQä'ûׯ_ÈXüÜÆåéÍ×÷ï^¿yºöüßdôžþãý‹»§¿¹{þîÇ»ÿ„7þwüÇûý÷ßi-Gíô¯u­L¸öR¡ã”¸j¢¬–bY"íÒàRlK²û×gZ×z$Ã8^ aw©\Ql ¤Ÿ“T´KËÕ,2ÙNXÃjKWÇÝTäqa»”®Fف»ç|­¤+Ùäa—¦«¶¢E\Åi.»¸\‰þ€K“ç«1Èó1\Ɏœê{ËՐô òÛÌê3››ÊUšàv(ÃUZð~¾ +0ëk9^‰>³›f„>Kk³´"Bé.LúQ á\» Ý Ù^ê(ÎN¦½Œ² +ç|%"ëÀ‚\Ñ©drÓÂJíÜØ¢)¶‡D26ÑUR ֖½V©2Û2 ;¯'cãÜZ«{O?©=U¿ÙëÙtm»øÆÝõ·Ÿù@EXÏŒl5ɌÉLËR½ ‡‚% N#:qp‚ñ°¤òI{Ls†DäõT‚5gïUj¾‚¾¿k‰Üd)´öŒ`ïÙWùSõ³½žMïºA4½Mñ3ìáQNʹäaH(˜ûYfIDµQx¾ÃüÂ1OØÂ…²ìRÙÓ 6‹­Yt °$“/+_è« ›L¶Ä<Èf Üß"$W‚4‡anOÉV"¡ F¨?Œ*âόy!Ÿ’íG{Oª’q|kös`„’ƒˆüdD¬ŸrqÔ„`Ü(“,èè¯:YDk˜_xB-˜#°]øjv¨~á´QôU9‘Ed/݃ò™9ÅÈ’ +QGícS}µ’ÉZ‚,Hh`ì6r’©’ݺ0b®êË> \Ór¤Îd’¯Bı$‹sãDf Ç昻aš™«‰šš'lXÞÈ3ÌØì²ò2^–îœå2hBžƒ=@ÃȘ†¡kÉqže«G—a¬ûI~Š³|¢(ÅA4 ùTIá©»eÐØ.ÖÓcºW숦r•Šb¦tiwËÊ!ÈÜGáçH•Ó(¾VbÁÔ´'„yìêr‚µio:Y†#ˆ’ÖÕ%âì,Û¨kÔ(öª?èðʶ=mƒ1.¦À>¤É¤~ÌsIXܕ,j¶ÈñØAÖ’VóÊäSãd쵒v]e²AFüªµj{5\MÂêûå@Ú¬«Ì)ëVìŸç•y¶}íÆAö ÇHÔäP¤å—k*Bv]ÐáŽø%FQ7–e%8—B– öØ\t†½"'X{ÏëâSjõ¶W4Y¯¼=#Ø®¯ŸåÕ¯mû÷Iï“ \ÐB˜ªzƒ¸Ÿ(nςr‘€;­­1Šô&*ÜÚ ÉV°Å Zª~Èjª-ˆ¹²ÞâÚ …Ú–´ÀKÙ^µh´”YY´ÈNÁ«IKºÓº›´@˜äƒV­qŠKµhý†IÆ Z´È1ó+‹+ìWfС2Ìóâ­ú@gÏG'¥}·º0ñŒnÏ'Ù e™×ö,Ps‘¡Ú³\v¨ö,l;€Öö,°fœ´dgÁ ïö,ì4¨'+s–lȄY©Ö,a eæI@c–ü"¾¹·eQ„¡³¤Ž€³e o焭LY"ªg9iܒ3i‘A¨†,9?&|Ôʎ5ªøÑ YáˆY YÒþükCÖ(Ms£UCÖ(«7®]5:áÇ\Ä+CÖÍ8/nÇÂQ;éXµc"ƒsQ¯ìX8Ô(W;–´,G¸ì¨jÇ:Ùj§ÇƒšÆ¸¶c9µÚ °8 +“™¨Æ‰ &Wf,œkÓ\Ú3#̦°õÕJ*ae\jT³Ay=ÕJU[Ù²ü‹ÚSµ'µžm×Öì\¤¨¸¶e5ª™ À7ÒÜF%+BԖµ) <UÝcƒ6Üꩄ޴Ԩfj™ªµ×›²ü«ü©úÙ^ϦwÿSY²>Áˆ `*C‡È;gª«ÄȲÕg1îâðZ!Œj§J©³¡¢Dilfà ÚR0k)8y@X™;/Ì7“R¤¹ê`…ÛTLùðqv‚ù ì«ÑFƒÁ? [/ż•°,hÁÍFÅ6f|§}’Tã  ûðĨJ±Q_ÀáýABìÊ)÷”:¨§Fˆ<¨Å'†HQfkdaž¢ODµ.Ó±1¿fµ‹´07Š!|$MۃÜ]UúsmÑ é‹êƒˆ¶»V ”1N¡·W)öbý0°õ©VvÒËïQFrÄe9ðãÆ뵇¾ºýð\˜€¯~?¸)ÍîÀ3ǟœí"CâÍêùåQ}¶/pþˆ®POÕ÷G!1° uþáx‘ÃylÞ?¨!"MùR÷”g9Û§æÿïãǹgWgS«@œqr@‘0d ˆÂê 6Y÷>—æナ'’dnn@a†Ò<·d}†šXµß©Þ ÷RƒÐ9ac(îÃ1o åÖ§Î\”vàH¥’ù©ºC©q $W9·¦Î!1,UlhA9ò´_Õ%8â̕IkNAZ4ÒèÎDzÑ}õûT· ”ÿeÂr¯ŽA ã)VÏ µ¥ý¬®AQð…ÿˆã¾Aá­"-Õs«:'ºpÊؼƒ|3R݃0ì¶eT݃¨¯d©Âýƒ°Rßq¡œ€"àU;’»§ J¦|“û'°Ë‘Þ?sÂÁeºöÂôDÕ݄ÐX£ úît›^vân³—r‘c€…꜃µ„}r'žSÖîÂîAz»ªìgk±w‚-ˆD»4Ÿ!tcZ—½=§¬½†Ýƒþñ^Ù¶—g‡2×òcÚxaäá"tÝ4Ê9œÇæÊ«„µë°=f>Á®&§X“kç!f:AÀnuA·§®I#¬½‡í1ÿx¯iÛËÿ R—0=óÛX#ëǹIe¿­Gî`>9¨³P‘iö&E8#)®Áj3bf¨Âó#Ì;ÂCÔ< ie•b +XPçc{¾Aªà6 çw2†6&0f5•úªœZlU^LD0ÑBh8éê©> ¡Á2—†îàîÈ£J¨ †q؁—Û0Àñ-T)¦çUzۃ˜ +tÇVW£ jdé…¹VYV1±kµRž×Iå×µçj¼®“ž¾Gú,.jx—¸$Ö>jؓuº«“~…!®]½Ô£O0HlÜÔ´YóÕê€_Ñe甐úEæäXYõTO)Öõižj§¬=ÕíÁꁞ¸+BO ¹[eŒiM½ogސlºÖÃtÙ]=A”ÆÅ/7dÞÓÜÖ~ÆV/²ÖNëö\õG·ºÅ];®yÓDà•AȦ=¯6Z kßu÷œwÀëÚöô{s_ƒ£ Û(ÍÓÉUót[dÕ<±LhÂYiž`/¢3L®yB?™sqͶ ÝVª§«êé¶ÀªSÂ*ža]©žÐ'‡NA…m ²*žõç•ÞY‰®vÂlS—+“ôN8ŠVZ'Lg9âëüA¾ªužèËլƑµÖÙÈUU¤ˆöǪLât诵Nڙ ß´ÇÊ/½2§¬´ÀŽlêb«¬ª”­Õ•îÙ>¯=è=óʶ}½ì ÿ$Ó|L†¸þê—28=±:5gÕH°Ûˆ=Nqû<í¬ÝƒàGl•9ÅZuÆbäf +…±herj ››»V+Å­ûæ\õ½ ^Ù¶¯ß£o|ž'Uì`ÕDYò Œ2Çh\Ÿè~ȋvŸ3äÂQG«Èj¡× vþiTÞ*âÊÄ¡.T3xa'ø‡¥yš²1ÁgŠ#\Í>qŒ™’N!®W]ùޑºjgÜguΤÇjO5iâ«ymB¸Îa±ºÎaFhCä…¾\:å +)p£ÇDtÀ8Óo7»ãCE?”³$Ó{ð 4Á4ê4W@²Èþ"_€RpEPC™Ì#v¨öìN©2 ®›«(vÆõC0JLîmœ`Ë @ÀŒ +r’Ïó¢î:ÚåaɛðIsª¿©Ì%W4o“†£@ûԅ%ujU²#šÎKSYä±ÍÚOƒ«ÅŠƒíM)aõ¹Ñ@TOiôE>Ùb=]ö§Ü˸=t‰V»—²?…f‘c"4{àå[x|Dö²RlsȀg0Öö œe©¯Ê~½°n\w]50DÁt×Ú3Š½èæúÇ{eÛ^v^AY¿ô¿aåó({¹!/jBü†ž;(҄e9O +ÏsŠ6FE%uÊæÒª2§X«þª‘³JÀ­2¸wahm­VŠ½Z?¯=è]ðʶ}íÆA¦gI8—E$ó嚌vRîZ5Ë`Ba9̅('8ˆ_hÏE¤ ]]N©Ú«N†¨D×A­ €H1µMûÙ8Gý´úTëT­è¤›m`ó¯pªçP=Ä9BrV\¢oj^¢d«ìDÖP)Ə`7±¾’ ]›æ¹UÖQ¬U{ÕÉDÁ²ë*ƒ["¤¾U£<¯lŸçz¬²Ó¾vãà’ž­%úOuí96=ÈðàÃ<%ÂÊ(Ý-ÒßÜ(Ï«ô’Ò<÷ÎQºÊœR[uaÂÈfi• We —7jsZԏ«µn՚N:ú½ ՍÃ$ȑ¿»ã<›™w¶¢ÝqLÍ Ž¬ +w‡Õ#wTÀ;Tº¤ñlzÊ´xä}¡h Ÿ bÞ! B–rÌ;ÆL=¯ôŽgCr’Þin‰sl¨wÊDŒú«°w0Ý°laïèYŽ{‡)nã:¢3ǕÁÃñ*tkè;´¡ JÍyª^ëxt§<÷ñÇÉÐ=hÐö®®J©ºBeärPY«Kښ2¥ÀÚh¥¸ü˜bèŸónÕª¶ý¼¬ú<Ýs“ã]YQ'rŽ%&kiiÈt§˜EÄì݃roU9Áš´7,ÿ<„]WW6stk4÷fkÿ8Î?ßëÚö³ãv0G²–EÍ­'‹Ü%¯"Ô%t6ÆÑ|ž.|uŠma8q»¬å¥««j›Î²H…I`¶VÖV\ú&+ÅÄÁúmþ ¿WvÒÑïÑöáPkl,"ÌW‘æh¬¬¡Ø=)ñYl”¥.Ê´Ðýîàѐ‘–¯KÐÈ£ÙjZeƒu¯µjãþyþ w¡VvÒ×÷͟%l` ‰«qŽˆóÀ‡ÄyäÀ硉ó؇ĹÃn ‰óè‡Äyø€câ<~`‰óÅyƒâjÁç1Ž‰ó(ÇĹp‰«a‰ó@‡Äù#+Dœ;½Màˆ¸.œ GÄy<#âZ@AEÄyDÁ +牫Žˆó‚ Îc +*®8®†¬Ñp5®Àáp5°ÀÑp5´` †«±Ž…«Á…«Ñk$œ‡8Îã  +ç+(œ8Î# šû½Æ¬¡p5ÈÀ‘peàH83X#á<ÎÀ‘phàH¸ÓÝyÆakxü5®#|Í¡ýp«k œ +´çj,A««Qz`ZG6›Wæ(·Úè ç×=ç¨uôt}>œ¿FÃudðU˜E¹y0À + ç1í1‹*è*rJLëÈakuÊ­5كáüÃü)ÿt¯hÛÇK:kswÂÎ'̣ڗœ kEV-ý¤¥ZzÊÈƌbÖSîÂÜ×åk´&”,›l¢=Å+3¡kµÚ×ÕçZj]'=í6È'iîÛÔ[ÔCԐÁ^nÈ£'Áæ#²Q҉‚ê-"„Fqcifþ ÎÎ9ô•9ÅZ}^-…FÜU– ¤¾U£Ø«þyþ wÁ+ÛöµÕOÐY᮲ª/)/Ušmd˜Ó˜Vø{çÀÝS…Hƒ+Å4¹šFÅd„bš»ÊÅZ5¦_É E¨y×*J^èõ®­VŠµZ?¯=X»Ð*ÛöµãV±˜l‚ +›ç册Q6”Ý’’%w!lé}]K£Xgñ)Sÿ äc_™S¬U?üœ\f‚ke°Ù•®MýÙ^«ŸVêúdÕl{ù¹öæ6™Òhà4¢¦^nÈ@|ÑL;Yeb^4H€Ô½t”¶Áæqõà€8ÏÜWækÕmLN¦ŠÛê‚ivéÛT‚³û¶úX×+­hÛÍ~@?E Ø2;U ² Ð—2€uAcʽ¤2Çy²s=Rˆ¯SíØ÷çJ…{]bº·ÚȆ‹q×ꂙwJ}›Fy^•gû8Ð;àum{ú½-RXbDy9«ëˈQÏ3¸ DϙwPFŠê_äÄö³õKäÄ,òº?„ˆ•’»Z*ÁÚrÍ_©²½#]÷µž¬áé­µÜÇÇû7Õ?ÚêÙö¬÷ýNª[/r—§SeȆYµÔ¸¬Þ `jǕ`lwQÅØ–¢¨"¡9ÁÚ³÷*˼Ê+†‚ÐîíÁÅúYþXýðZѶß׆ä‰<˜Þ2ã*ɗ2dÃÙŒ&ø¨ ò “JCi¾RœÃ́V^ƒ°ôuU‚µéüM©Y1î]MÅ¢ø[“¥ËuÒ}›?èßï•m;ú™Dí€NIàØa•}¹&â76Ô½8. +þ¡€>ф39ÁdUxøbêԕ×ÕT)µI{ÓÉ»³kuÑZJ×f¥Ø«õÛڃÞ-¯lÛÑïKBO-©ÏèH—F ™ï2`Ø£Æ*륑¤L% ¸-÷ÏaۍK_—S¬M×& g  ­2$°KרìMÿ8®~¿Wµéæ÷³@iè¨7‰ø‹± ³VR!MMŠÈõ„$Ê8cÃÂ4F±¾1»rìÌØÔ*sŠµê¯yRfÑ*Šhç±kµR|.ôóڃÞ¯lÛ×Ïv³Ôáðû—kj©©!f3Z2H*ªA×>4Š #±f[ôE8C&¨®2§X£nïQ² óãµÊ¦AC¦Z«•ò¼~¯~^{ÐzÐêÚt´à猐{OàÛgôo–šÚmíč@«Šì–ny, Ø Ïê®» V¥4T7,3¨;crhví1ݲ-„iäéFÖNàŒÑ=#-!Þ= ;1]vlxnkéT®pnxGˆ¾[¡¹a*~ ¢]$.34,w2Ÿ +gå–ö4¢¡"¹gÓQÈ=÷;IãÎ@«…¥Á¸ó"›:„†â¦¤ ¦·qÔl¨1q +´ˆ› X,× n¦Áò²Ñ×aŽ²yÅpŸÌü‰Í³ÀN<\ànT3ª#áf..ñô῝កñ©R³|b±t§¬¨z(u£äºUd¨ìÖ^ÞnŸUó·ŠNú÷Ч!TD]lXA·\¡Û ²èÈϹ ŸîÛðpƒUܶ0x97Sƒm3Yc€Ï†ŠLEm§Es,6örٖ-¿04ªR’v0l„sm±Ú¡'  =lÙCƒd- ÀUEdOPw¶xlhï ‹=ٗT€5òa™TٚˆI±ý•ˆtüSˆ „­–Û$$_Ç^ñ]C¯±Rs\ò p^*ð+ŽÑÄ+àu.Æ w¢%©Â®™¢8¥ êZ˜O™ÉØ@×0\󱊹.Ù+ÈõÈüP«*äº-Î +¹>]®'ܼ+bºVˆëF5”4“Iuàê\Íd+´5V0¥> ñÃÜêi„úܨ‘nŠºµ×£­ý«ŒØ>Ûê9é]ë? })¥ кQ+4Ú¬êžFPCÞb¬EÈedMƒXËù<÷Õ8a °®Ô +‰®9jښ[ƒ«í›*±}´UsÒ·ÖíÀxìâürE­PhlA\þéhé-Yæ +U ÛÜXº§pðAôòz*a…onTÃA×z (íõpjÿ¤ú÷¤V²íZë5Òo1Yã +Jݨ~ƀŽ=l ŸÔ¦U€HˆéEõ괊œÐÙÕ`Ï­"CF·özuû¬ú˜x­hÛ¿ÖuØ¡à§_§+±¢e¿hÎ +ˆ†qŒùUWÀia|돉(4¤ƒí„„¹Q êìڛë!ÓþQõ¡Ú“Zɦg—|ððOÌ%¾‚T6r…A"Ðw¤\V‘’rŽ—\âQ û8çF-ÈÖÍÜðV“VØF§V ¤WTa’ÞÞ +NÙ¾«’۷תN;ùýè4Ÿ”õã⇤a÷“ßÜ=;wÎñþåÓ¯îÞ<¿{õîé½û³Õw?ùù«wgÇ_Ï~÷âN;ð‹×Ï»—Ò¥—¾zs÷Çû»?=ýÍë?½­ý p‘‰Vré»x'Ï?ÜÝó‡w—‡¦>ûúÛ§2¦·o^¿zÿÿ¸ûý»Ç?á‘®Þß½ýŽ^¿ðŽjPÝüpGÿåþëw¸8³7Oôn§›W_ÛËOÎ^öô_îÿx‡«žø7ÕçÂLò¹, +€ÆfÃk8sô”e+„eiáRvjÊß¡ ë:D\ÛGu*1#-ø¢œÔÊQ0ÏE¦§àD^Ô½W äÅ®X˜‘ÐoÁ0;©ÕÙÏH¿=ÍÎ1q§(«Œ²J‘8ãÜ[jй –ñ«˜F¤2NÔ9(sqb)¶&ÀÔHÀ‘„ÚéæŽE“QGÞÜ°˜C…ÆVÌÀâÃä¶úÙzÛRً8¥“Õe2*¶&FFÃÛÕQ3Í6>Ïí¾¤€ÁzP· ϸlüâD‚<±2RFÀ1*Œ÷ôvY &^” +ˆ.Oÿ‰©6qý& ÁÛ%côPô™‰ËH%¿ a@À×hòÜb£òk{O˜^ÁYT촄¯e ö¡*˜ð©„çU Ðs·>†{¸“%"BêHa·ÂÒ8Ô×挳dя!Jâ¼h³%dà?&tÈã$æAW ê™p2€Gw?ˊŸùÖèG/ä眵. +P3ã…C˜¦ÊGšÁVÝc¨éà „lxì-Î:ã¦îç¢3è"­è ·y$Fµ'€Æ"¯œÍª–/")BTž}fÐçaá#ªy¦av"!,z­LdPñÞà—! ¾pmÃFYߣ¦#rU¾‡Y +QÏJëž|–œÌ`)f„Ex­óÊt&å"Øà%w‚žnLˆJIMo o(f²!)ž©ô«ø{üúy©Ý™ô!Yþ„ß3C“׳®1dvN–¢)ÈÇL©€ ™0͉u¨b>G;59Siª •L.2‚·u0âÝޓ³ƒK}"úÉ·˜Ç[’B1Î0ª)ö¹E2¹ÊMÌ5½ÑRÍ*=òPTåñ׈pÂñ”`Å'¼˜øÿEßɓힱ¹Q· +5SÇ`m:¶1LؑKp6‡ˆ%ê:Ñk•í+ 3ÀՕp§´5Ùß<ý1$"Ž1²¥RSAà6‡^–äuQ²HpÛ w øN~@…y>Ö`È7÷÷¦åIXa´©fþ>î4©ŽJ`>oDBÈó÷l¬X¯ +™h8:£æ<,È} Bñ(Ñä´4è爋ï%çX4!3ڀWƒOé`ŠÈ9#½ŒƒÖ.Œ†Qc†Á‘ú?ÎñÆ5' •i1°a@(5a©,¹õi"¦(jf>ãS  9qH(>šH v‡… Õs@m[¨¡*pÔW@ ƒK¼dò Ÿ¿‡„¨ jFÄ &E38AÿЫƒ:&†„áYfC GæJWíŠ&#ìD¦ u‰MÆӐ"ÅVØÄ  “è±Ãha )ǛþCfAØræj/ê2™žkmnñP†øB*–$̲¢â~‰jÙã4"ö¯Û@#€H¼­œßI- AMŸâvçNÀ¬««L7ªñ7& +¸Ÿ`ýàÕX¡òèhy¼p2++÷D|žY¸° +ãÂԉšiÅצ([µ +×fÐY–+jHvdឿÐûI #ã*P^Òa», +çüXü~ +Ý[%ÚäH©Í79´Æ Y1£”É°A ±ëâ.;Zt%¢H¹ª·{R4Ö×`‰A©#DÙQŠ”°*7 ÁÓ‚(ïA€­“õpDæجÕeïá××ü”™ˆ þ‰*PÌǽ¸ñm ú€ÉGEG€™Kª!穘¼Duæ¦Onr/|2Ƚ5dzÊè©"H½_ÔªÞÞÂ4ÏËs$Uãç0èQʜ½×š ÏބˆMÐàñ èOzõ‚ìþ¤oÂÌ V]x'e}z!53E ¦Ð‚h&®Yõ9Z×´ÅÙ ðð +Ó,|0¥E}¾´q*%¨»wŠ¾Ðf^¡nUڂY™ZaUÊØ*³R€ÒZ…„ŸGµ»=V¡‚`üI³² $û¤ÕÒÄ¿¤k]¥Ò£œÙåbé¢hƒPœcýÎû®Æ éT±Æ–Y£zõζ ÉI祅 'ÚÜ@&£¡éR'4ŠÁ…”ìk˜„QŸ£cŽ^Îɾ³S] ÓÀÓc՗k²¦—Ä‘°%‚5@`ÚÓdânûƙ=Ï7k¬qOÂî`ÒSÎ?ê.ᭈöÏ,ÂÚ{¤PG;ib¨^ÕÔÁLڂU€¹)P+AÅ$®1®>†$y boÍHá?¸mTœiðä"QV Ít¼{R+~®ëDÈÁ@SažÔ(gOѳ‡ìÿ¨µÁsOÎOâN5sø Þ­¤v] pÐُ&aê3ÌTDÓñ@ûZ¡E¥ŠB,iQ<(Ï@@ƒŽýl#T÷hOA*’^„¢Þ-'àŽÁ´´Wb´;ÜeQ¸2ᢀOžÛ4.ÍÏ +"†´dŽû^8î4ÑwÑ!Æ]SCÿäÂÔ;ÙSäÕ8©NFfE_ë Ù·]À³èZcjHèÐ0¢Ⓥ**Ñ#jIf +"@¬Öð™PŒ‹^'q²͓ýòPpÈ££ƒ@›tš Y­Ÿ 䖯qQÿïdn̼¨cgÕ¨ŸÉlõxmð€?qˆôéMÌ8“xA9M½Å6+,ìíC]Ž«á¦ÚÜ ¶§0)² JœGa8’HO>_ƒïŠ© ²F{ÒÂÒ½ÆcæuMŸ3("€©ÙôG‡Pmç4œ!z,°Â©¡ +.ò»©ÔßÄ¡åŒCÏuïà=8Ë蕢¥ÉÔ,H@T\ð=øÚ(B|I]ÆLÓáb ³z»)"á^E5-êpÂjowÐÏvÐ#k&Õ> JF.ÌØW”¨ZZ{æE¹‡"»CGÓàÜ`¨Aå×t¥;Qay³á°ÊRQWJ0F-Mj} ‘QPà”,M~E•*ÅÆthǪ_ðg9;[?ûÀØÝâK`<Ÿ¢­ )êhÿƒLŒÓ P[pk6;6°Oª;¼†žfj'Àµ“»a”¸°‘úEpàÕõ ÐÃÊX¨-ƒº·§¤3%1#åÉT‘!ÈåLÇrV¢k5ô‚©Õ ?\A&½c‡ÌçT-Z…š±:³$ðΘ¿K—àVS$•j›@^Aj™Wˆq’aC:S¼w%Ó «¾m¦—Ó§8u¼"BAÇÙójÈiÉ?itJŠ>e¨ +£¥F’-9:vö¶Œ{MÏH!>Džú¸·ºwF1:˜8­ ýǺA  *ìfrFM‹ ¥vÄ°ê]´tDNÆø­ƒƒº­Ûkź“ñC‰„ìYÞ¸ µ¨ÛW.„#cDÙè[…W…á¾Fvò¯«v”€!åÄÅ!Ú'd˜%©b°S"c`½â7/ê·ÑãÑÜåEýgÀ²bÉN³‚)™ÈþÇ)t–P‹%ogú‚9˜SÝD~º›²â°RPpÑnr˜¶œ{tÄ÷»u¯(^ê u‰ + D¶b±B öW6ižœy4ˆ5‹•3Iͣʺö^PË5ÒÕóŠ4bÓ²zl‹57Üæ¬@”Mî#Õ€$™ €’³šh’±±CU&Ø^ª÷ÎY-ó g&˜Ê9àÍÉubP3‘ÐTÿñ3á<À8S˜‚(ÏzJï÷Æg‚wΪþãgªø!+2{h÷‰ ¦ìv»a.*Ôш7è%a´/¤E &jš#c6 ¦^f˜cƒK‹‘×!*ÂÄxXRæBnðBûàAX< ЂۘÀC‘Û!*Bê ¨§ ž¬Š­ÍíªC¤Ë7ýÕ¯óUU© À‚·Ý7Ž9S2E®C¢Õ«ÿÚ#l`¤0æ'×XQCT@!Çr}O#¸Šr|?¥xD ²Ÿš‡q‘˜§PYW&Ñ>ðÈ%›LÚ)¸ãº³^z¾j™èÌVÂhsK¬ދ1µ÷ègVŨï] 0–$dþÌÓØz4ABIjÿbÊiXQrµmƒyïâ0k“Á¢2ãeÌ`¢6A^ç*@ˆ—›c(pâãAÕEnÑÀõRvÔƒüì£Ò‹]Ÿ ϞÕË8[»Ë”n3žuׁgD& N“â×4<>›cv`.È7«¿7ËɸcÖ ¬cêE -á*2e:óЛÔiÒ‰9¿„ˆˆ4<ƹ¤ÿCy…z×ÖY³wc”)!@×c=@÷Îv’Ûkà‰cÕ^ˆcB˜‘W\Ád%ÃêAÌzWÀzQVÈÈ9 €ÕMˆ¥æ?š§€Æen᱗N¤ õ%Cjáڌ´3qú‘ýh¢&Œ÷Lvîâz(‡Cë¼kÀÿC.uoB¦ƒf¨I@ëõG…YA§viRQk8H€aÀ-€ò½"<NæÙÛ+ŠB¢.=˜f¤>­ >¤kFEÈÃ?TÃ=~ÂJ!mS%ÁgbB€ˆ—Át^¢.Xm.k.*ü„¯ŠÊkH€rDÁŠ‡ÆCÄÃ(ÔԖ¨€%(7³Ï¤ +`홱£ܝºáÕgd?‹üH¹ÞÞ2¢YÑšLp·ˆÞ×3šÇ}ìBiæJ“FÊèc!)x"2¸ÅØØ{F-Iý}R=Ñغ,áúXücâú‘Çk4 r©ÂÂq‘álP6t„öHßðp®Âõ7ŒÌ£ÉŽþ»¬’^‹”áš/:‰Ï,¢Sr:&ÝÈ°‡9kœ [¦søvëæGxH†j€Ä‚ý·Ðn~¨S­!ü£ŠÑÏ!Lú–î2ÈE½í>ྡ¨gžÝ@ÂüÀxJ•†?%û¯yŒùDE*óèDÅÏp€ÂQOfÎx*­'¶mƒ±†£1¥X}ð W&€bԀ©ESŽ4Õs­HÆ!*ìbeT\æ?¯wÄ-<0ƒC–0Þԁ5º¿9SŸ8Ât0¼¡(’›×4 –©™ˆ£EÁƤ`bè%i-F¼À òV‹beV÷¤`Ä¢«…ö3µ¯‘ҁýÔ{Œ¬s‹^“M¤=å7z'bõ´wh‰á't„†{ã[9¯iÐûö@7aqqê©!!f}NY)Þ$iŒ] >ɜ)XÅ!Ýó²ÈQßTS }à¤t測ב²Ä¢IkçIî£*S…FXh‡Ÿ³d⼕C¯™œUEò[¡Ñ5lÝ͸¦ð~{ W23§9°ƒd2N±”.°Óȳ…îb Žêâ×¥x"Ÿ~U€q Ÿ2/©g½#èò0ÃüÇzW… e¼.ˆ@¿¨b›ê‰5  æÒ7 B[5@ÇîTÕÀ¯=i{÷‹J­ä¢Æ,%Ü)¨)"B{Æ±öžiUµz%ÐOÔdF6Ç(Ղ‰ú¤¿qQÓ£'Ê[j’ÓÞ7ÏûiÔ¿ì¨ÖV¦k3pZ0ç’6ÆÐÁŸ4xîKZw»YÒU¨SyHIªŽ°QµKëG [Ö´V4Ü^Xúæ`OÔÐüلÆ`*Ÿ€?XÏÜn›õ@ ‹EdÏ®Qg†±—ùiC‡ÆpNOÚ;Š ÁüŒ”ÇA +b˜lò̍I60j2î¼daÿÀ+ÆiiƉ³VRQP7/ƒ‘…œ, Ö_#òT ?š™»!©GŽ?â¸L–^ÃÞÊ®’ Íh$?jŸh,‚%O±©›4à2jÔ ŸÂ±Eã-ï¹3coʽ™>8ŽðQätÁ@ 0´ øv@p³¨QŸÒ¸è`2xÊ­923ä(œf$jëeé“!¿!¾‚7ŒAYX°Üúd6‹ÌS@ÑhaÁ͑†Êfò÷xØÖB-Ë56ÐD‡Ÿ»æìöðP͎4û"¢p6«#PÛ\ÏEÁ¥&á5óL€HŒzx‡Û;3²H'·ÈPȃÁþ\Ñã àª7ˆ \ߣŠ4þÍ ˆLŒ¯Hõg‚‚Åš€3êz„V¢Òh2ŒÒdé˜& /«8ߘs†HEã5ɾM ß;žß?€¹(àÄP ÐÎdWb(!k€a橆DÖXìzøÑ2Œ ušÌâ½Ó»jýܱ^ñ>Ut ƒÕ£rL,}“ßf]æ`fš Z¡rbb+ÄU:OÔhs°˜s±˜×7Œ+¢Š¾é–uié%*ØO‹~å öÝb™½…õ@°nC¸ÄeQ„!2²MÝVdÿ´0i…ÇӐl¹ôd©aQñ:ÖY½¨<±rªÙÁƒÏ&Íå`GÀ =y‘L0/Bºž£ú;™øSlå.w¨–ƒvdԞ*½Ô©G¨Z"üރ倥S‚WŒz»€>pd }³æ›c§yÓ%¸é\è`…5 æøÜ嬏-نE£iÛ½A£šþÜ_H±¼ú ð5,p‰õ4{{hÂÂbhÔb¡˜t;‚ÕÇH§A=¯€ªK6]“×Kb¤³y˜™h¿É«l4¹Pòñ§ð>œT„bMWB‰«×ŒÊ´ùXñÅÎx4x'XI*qU‚ÉyE÷?¶ +“Cxãŝ0t3§–šufW,ÀRãݐ+âG™zq1;A±Ì$@Â*v5< ùÊZŽ vƒ”A®ô†âÈÇ4íå±콬HPãcÐ$^ >+®‘&hrO]—HøÄ,\5'Ïb Dæ(çÅ}“fÅÈKÄ!›sEnµ¨j—maágjˆ¼íÀwëba Ғ}ÄÏL¹XêiiªL`“‰W³!™5ØÛx..¶}iŒqT!V¦b à´9:€°yfÀ< #O1Ϛµ8*÷+vîó½h¦zt JŒÅBÊý=5¨Ø̌¤Ãç "ÆeNYS蹡‡1°H”¦Á•QåGœÀÌ:ÁñU£‡¡¬ƒ–¢ dUŽ–ªœà†2~zîÀÞúi¼*f6§b 9y“¥Ú"e1ÉҜp¶^yO=~ þøܪ¨ÕduVÛÜW÷-°“³®,À҂856Q ÖÅÑì)èÎý8$ EUq§Ôl••bŒ"›âÂg즢HøR1t€P¥%8[ÔÐìÔÄs=VfŒ3ž†KZ¼âéFç]4ŽQ½—²ÅKò™BÛ8ÛtP»Ö4Š“…•×ŸÇ>b¢Ò&½Ä [ž$8wÙ¢¯i, £4N -Cœv&²LÌMU³cÀ~šK‡>¢¤ÆÑESÎ[¶Ì¨.]&%"O Õ/OYçÏQÊÈz¢I;-Q !˶#5et°èƒÁX#PêœĽò´.¶¦†a)0*Plڟ*~ú¯Š`FUúrÿ0=’f)J +¥„Áô:æj– …5{&‡aìÆQ;„¸ø (2;]èÌwYœ·L¨#D™|2£Ìb@£­Øtøì‚Ùß_̳ý1µýÍd?M|ü‘Oî œ5n•»øóšÿxš5Š®¦?†Q™ûìÇaQgM~Œ«oY³å>†L ÔJŸúzy Å3CµE0aM|  zÏ*ï1 ÈLyhiñ3¾¶f=ÆÏìZe=æK*Ðl†šsMqœí¼l2Z ðrMx [. šï8`†íÛ¥;ö{ŒÁ³#ZtP„)Ñp[ëdÇ=•i|qk+0ўê8K±»Êtk"æšé9ù)’ÔDÇÑ|ñëLÇôôiÂY‚  +â#5Ñq²“v•èpPM+dyŽé†cËs 3r„>Í1,!ˆüõ,Ǽ̩Ėä˜è€©lr ÀT&5ÅñÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc§@¡ 8æßã oLãóLº1SïsO Þv¶1º'‘ãa´1d›iD£±°sb%‡¦5ÁÆÃüïä•ÌíTc¬Ú9™Æܪq'ÒÓôQހƜÍÏgòŒY®VÊ\[_þ,v ñüñŒQw=çÄÀ’‘f X)XÌѨ•>YÆWWìiCý>ÄȖ³¾<“ö$È™dê7Ž1*J/õ`4éõ÷ƒú½ ãïrí cìÃÂo!Œq\Ô˜` g uÀøʈ¿5jn_ŒsDzы!$ÃÕ¼˜%Âøt^Ìœü ^¬yR­ƒŒì@ú > /–äÍ4ã„7PñVŒ4¾Ô3ÙÅü›ÊË{ƒ IY‚]ŒÛÀN°‹Ñ~ +ï]ŒËnBÄR +ªûµQ‹9‰£Êf#Ëz÷ Ãp@C2XvhÌÛÐÅ|o&¸˜.d¦ËN£Œºs‹±’@©v`‹º jÉZ%@+³A‹”'±˜k§—/Àâç¶ÌkåÈo+pŏg¡ ã}ƒR|²AŠO«R ¸~8Å`;@k·!ŠOGՂPŒ’güRŠñ÷!šèD"3l@ð‰©žowâ‰áUÀÏ_éÄÄt•;áÄCùÉ@#Ž´Æ†&f‰ñ¨A&†t +õסSï.øظÄÈ×B$\b ä.Õ*P—AÌà¸w*1]„cŽPà" =f&1ñ÷%ÞõŒæ°0ˆÄ̬@_) qïâo<âæq3pÄ{Cµc1<®ß&ßÀÌ*Õ; {R +ñ»+7£ž–3c¿ëØAĨü€üHb6NÖ ¥¤_²–•BLžëg’P;Þ~ìTõﳚø´¶5Äø%ÿM>«yc+˜å Ϥ³¨™`6ч‘<Çòc…£¿]O²‡QÕ®»Å¢L5 ;wð0ªx¿Ì>Ù5xù‹¿ : È4f©`ãoWZ2’€¿Yªº‡‘ü#€ÃüjQõ"`þ¹â†Q,ˆù*hï•©_FßΦ¢ÓÉFÎNB †2îdÖ4| °†áõÀÙ Î0Æ&NŒÆ¿ãal”áS€‡` #aÇ=Ãgg# ÃȏÌãþFb+øÂUú†‡F>«ÙÂÐâû´0À4à’ldaä?9 , i%¤œÁîîK±a…©³8zR…¡y0F”ÃSc_ʲ3…±„-Â\8àlM”÷ +†j®õš@a?Ï3yÂø›³ÝŠ®ð>A® +1Kû´s' £ç%Þmƒ„‘Ćkáfë†FÍΗxˆ)tàñòÎÑÇte£ l;¨ç†Sl‚ðÁ7¡=oá×ÛK؈ÂC3q⃡èý|ˆÃ—ð`W&;øP6uG›h—ä`Ü¢>¹Á‡¿LiŒ„C½ÙÔËR5y‹…  ð/æ$#!ÒÇ?â4í¼`k¿Œ" ž¬àjá6ñ"§Š‡¨`nÔê$#Эß]@Á—ƨä$o”à0$øQlÀø_ðWé+-ˆàjÇ&6ñÚ!Áù÷ÊcàQá„ã&دÜ~˜ÇîÉjM .§õõNåe*¡ |p%Ðk¢ŠÜÚ½£ñ½Šem6ðwøYÑk >X@\ÚF9,e.Á†Ö®D30}ž;HIˆñ ~½7“ Ìõx{ãEâQ’ +|PaÞkR1j0°²QqKé¸ø [Š;>Þ À"••É> ì $0‚7íމÀˆQ#f@`hz°¢1£_–‘A……RQ„0Tk; ¸º‡—QÀ¬ø&Ú@*ü Ïuã@í¼’Œd·¸L ž +­`8n ž·ZznÑ!”Dpgc‡1À¢K"€yW.Y¤ðEáµ 0” +ƒÿ‹'°tåÿ6GØÿÛ\ãô_äÿ© Z*ðˆêF6Äì_Hš5úHaú{+ùþ F ÿbÄC}G0}OD°ó +þ¥³ß¦‘yïüoàß4ü{bêèOrßÝÜé#mðيýU£“«$÷·P?d.=×_ÐK<—3 þ-Ð^Qhà_lG _€ÑKóíþ¥¹˜ñ.!1ÊÉ~ ðoayäYßÀ¿i<¦üzO,Ñ®gri¹ËýÆýÅëIx¯¹¿Â¶šš¦ •u¼q‰‚o÷“Ü_ìÙÈ î/Q¶WioÜ_šÙþ+¸¿øûûËÿ}¼aEûmmby÷ýLì/ÿ©øŸ&#¬¢F·õ‰ýeŒ/I`ù€È£Û°¿ÈT‰5lì/îÕÁ~́ýÕ+5džýe†®ŽIý%f‹ þ²}ÀÃDçJýÅ/Ü'Û šú‹S:ˆü ê/ +ÜÇNý-5°‚Aý¥J«º5¶2XÔm=õúË]YT4Lþ_ÿ þÂRîÐ%õ—´\ÐÐ_„Egê/ã‹ã|ƒþ2Q§ïÊÔ_†„¢6õ÷yý?âlÔ_`*ڙÌ_ð'k¹&òÝÉx¢ñV¦ÊøËÍÆ9y¿8Ð;ì÷qƒŽdý2è¥"ã~q!œrvÜïóø›ÚïSQLØ/r*+YY¿ˆEV…1å~Sw3I¿ø»Öó ô{cÍ9)¿·]¦„ü2kr=oŒ_Ô¯Ÿ£LÄ/cs +7ֈá#%pÕ7Ä/¯ºe2~ùøøAf¹¦Èç†ø}T“iÀ/â`Ì7ð‹¿ÎYù¾°¡Š&ð¾8Ý Ó}IAEDy…ûªŽ‘p_æÚPKÃKëĝîËAm¸£šJ‘p¤ûòna@ß辌á#¨t_ƒõrŠ¬7º¯ò?ýJº¯4óíNá€>»Ñ}qÚìt_V¡4辸”[:¢ ÷ewŠª‚<¥ŠQ؁ÏÎt_Þ ®x_Záaïˬ=‚݁÷…©‹ ï kP‡jÝ/ÑeïK³+ޗÊÍë‰÷ewŒÁ÷Åh‚õÕÎ÷•–$ƒ_¹KBÍ÷-Õɒ ð +×ø•äS›]¥Ñ¤eãûÂHo#ø¾4 D|_° ß¿ÉÅ.6àW}ô%mã1m€_XY9€ßBvkk ø¥cïFø•õ~’ð˱ú҄_Hßß¿ìak~U‚šv~Ù¶J8 ¿j¦vö$ü¢§ô ü22E坄_ +½Ÿ«$â·tC—øåß|¿WÄ/­½&áWzñª<‚`ó=ÀÿáWñ¢t•$lëô¨0’„_i¿{'üÒÿ;«†>‰UÑDîN0~Q'@ºÛÎø…¹4}Éø…Åӗ¿´D¾s2~KöŸ0â—ÇŠ<¨Y@ 3·!~q¡rÆñËɚD ~á±þrCüR›ÅY$ښ`…£¶&üâf\lÜ°~!Ò7ºØ„_¼cçhç$ü–ÓK¬ðË"!º‚Aøeï5%ŠMø¥ó®– á·D> ¿´\ÖÇÈôÑí_–gñ=o„_q%ʙ„_ ¼¯‰ÿ +¯^ƒ{ì„_ZñáGš¿$üÂÀ‰k#ü2 ±"‚ÎaÜ|~e}'üâ÷ÈÛ Â/¿’£%à“ÇqïËLßyäû2MZJÂ{1BÝ +ÀNÄ/†;ç9ia÷À߁Áçh;ßÆà Þ[Û0Ã#º/DÇp2W¸/»*ŒÌPÒ_¼ þÄh±‘}Ǖ 2/ÃyÍìEgaf6®/!¹÷6ÙÏ{Æß+Ö7mÆúޞžƒ× †-–·Õ÷:¥ÎLš¦oü½"}Óf¢ïëü/¨YLô½õ]x¾·‡Œàùއ†¾ÀùâoÜԍ拝¸<7Í÷¶Ö%`¾÷¡7ycù^np(ßË"à ùÁ€ÌÀò%Õµ·äøòoÁB¼i‡â #Þû€øâo¼4ÁðEPœßá{NŽá{¹5M|¯eø"³‡s~/>A”¿÷ŠÆ+¾X®!ЦBÂX'õ‘ðÞQ%Œ_Ù½´‰rÌl6ö! Òä^ДNõ¶K)&¸cmœÉíE~qa{Ávi£öRóˆz^C{‘1V›C1{//-7d/{ß²WÄÞáuR{q Þo¼^ž ˜fÆõ¯ƒÖKDP+¬—Õnx9ÍêeM”JFõ΃,¤Þì^jPot?òë6§t8€é½ônü.öy7H/Äh\èÄF^Aè%Q ɶÐ+Êá|^ü9X›,>ïmeņç…ñ—x^¨û¿:/pÃV78/ê&^Ø¼X½²q‡«§ãï•Ì›6ƒyAËÕ¤$ž – Ëû˜µT^,ëÔœÖ +R"¸Ò_©¼°ª½€bb¢œwRy¹Záô¿Ry‰œb£ÞðCŽPטÊË-H÷_©¼˜ì**/<Ò*Ž#Ë*±ŠÆÃߘ¼XvÁ+&/ÏéÐVª†q›¢; &àcœºœÐè^¨yHHÁPpµÉ+£ÞÉ䅁Ã]0yi`³ƒ•ÉK7'o&/Ap ƒÉûÁQùœ>Ì“ÉË`Š"6&/­Ì"šÉ«^½ÁËÀËAW&/ã.Í“—Ü ^LÞ§ëÝؐ¼¸t®þɛ+̨eE„” ɫƘòtˆä¥§Ý3|8Öì[ôÐì@ò*~'àoUÛÏÁab#ò2‚…÷3ˆ¼Œ1`íD^I0—lDÞt-Mäå iQƒÈô‰‘8[‰¼«µº7ðAä%%ƒ×Fä¥Ê¾ ø*|©ÈåJ"¯P õى¼T>R»P¦ò›Æ òâQrá´yQ£‚Õi yQfEÖµêÙojÇñBY5ô=Òõ†O‹Ñ!`¼ŒRu•NN/#*ã®IãM1mÐxi`G«µˆF²ô$QäqNÃwC\Ë¡y£ñ2$x>éú)¬3l3Ž—Á¬Rv/¢=¬ž4Žˆ¬‡È ‰FX;¢4þ„ñ¢„ªOÌUÅ ØþÝv/lèéúYmÖïäð^þ.6 /TvÈ?˜Â‹?Ñ× ¼P©a¢Þ¼—Ûö‚÷BµžIàE$±‘ À{9ØüÝó(Éߎímø]@žˆ)1~w8hô]R¡®½Ë&1P½½;Õ îîp¦qÃîóƒ¢è Jú ê.N½©Aø„î²5’vfî²F½Ü‰Üí–zmÄ] +ž+»h!‰ÐSðv=ëo«Q|âÛŚ ©‚¶‹¿áÄo°]¨`ÞÖ.ÔYÈ jhؾsvQ Šèv`vOԗ&cZ¬¸7Ä.ŒˆÝaÄm” 9y³ðþìʇ^÷TÏÑeŸ×‰ß;[¥ô”©2 ².ªj(Ù^Áº€và‡‚«{º9p`uQ„%ñFՅ_QPuOO:Õř4Ãù2… Á;¢zFê"Áy™° ŸL…¦ö9€ƒëåÚÚ@]¬ðÞOUµ@pm8ݧ8ápáãÎLӅd™|½¦ #†Ý`鲦èé‰Ò…Á¾•¤K±öy&H÷q=8ºø;~(9ºL l] +úk +7FµN€]m]Ô/ö6)ºaŠÑ}GÞºÈJè5‰Xvs>´¸¢gÕº3ti½ÕÄ^ТM˓ ]†ÒáÞn]¶JG¬1 º˜÷ö ˆ. ˆó­Ýy°}_NqPtY´€`ÇFх«/‡2fðÜ¡ Šnæ‹7Š.=4öVºf g¤Àè~ðìfPìctçºvŠ.B¾‡Álñâ ®‰+v‚.j wCS]Ü-¾ÌÏÅ~Lælø\Vn6ùߤç>À (.csŒ±oð\UFôºlˆ¾]x哞;M+>—>ë³ãs ê@/®Àç* _Jòs‘$àp³ñsIKéìh¬öq›àç*¹ Ñlòs)º@µWðsihâåª=ö)|ïŠÏE‚O÷Üø\‚Y h|.¶àmÚð¹Ðg°¹}às™dÌù ÐÏ£pÈÐь™ôÜ ÎæÅè"×eèÂÚI%@ü%:AÐEʈ!¨ KÖ®AЅn^ti€Âu#蒉Ô®æì(HRòs¹Ë~V~n9íÛ?eÁ\”?Wýà7z.³iEþ0•Œ<ç.ÇAý“Ðòýž «~ÌôÜB(P{’žKÂ1=֎ô\nÆ;`z.\„‡žô\$'9Ö=ϗºÀç¦aãçN«º8<ãAÆ-TQ׶t‘Ô¥§–›U/€ ; +@7­Ð-¥ÁM2@7_Ì ¡Ëìì3 º,¸F=ºL¯U•~Má ­XÚC—É5¬k‚¡Ë ÍC—¯=Ö´d貘)(3tù¯X‰n]âÅàJD—ÉBu_¶$xÑpè@}ùxªR¹¦è2Ì´uPt¡¼cÅàNÑÅ—,0(º$"\j$KŠ.eh˜•7Š.µ XFÑÅKÈ6`;Ff£K Mbti¡6oÃèòˆý6V•/ä¬ã Œ.,Œ‰­]ú¦LÑ£KˆØuÚá!›*9„­VŒn£Ëéêqw[=IÜ06Ü0º0ëõ2F†£ËM$;Y1º4óQFW¶Ë`]Ñ-Dú´St©¤T (ºP®püHŒ.áÕ­Ù'F—áaVvF—ݳðqùðÊWŒ.W>Ç4>)$D7 CwZ5B›’è¤Ë÷ðƒoþGX°F‹… «âü’]8û\­?wh´Ùñ¹C±Œ¤ç©Éž{Ë/ØÙ¹/ã%R® ·J¢“œ{G»Êœ{“‹¼ìs±ê*¨¹Ö²îÔÜÛéSsÑLE´÷“ªN¬Ì\h̑ß53á5D;F[-øڈ¹0 `.bÇ¸\Ô`¶Þh¹Ð£+-%X.þVFJ°\ü:³•Kê0:í• Å=^Ÿ<;7)ßH¹ÌÇÀ£M jrÓ»è ´À‡ÙÂɅ~Ð* ¶íÑàÜ6Øp}%äÂß@ò'¹ìÉw´äã6ˆ0÷ŽÇmÖK$òw„q³&„v8.¬˜±‚Ûܼ Ù¸­I•µ£qÛC,Á¸HÒ"ªo Òálƒ±bqûca©¸ µ=-¡¸p¼2q÷蓈‹ªÍÏRÒ Æ6.ŒL‡‹(†6 W±”g‡ážk ÷tcÂ@áž1-$\èe½7à ç†ÁEؕ¹6Sp¡3x&5²X3o\äékO.þ‰#ø·ØoáÆ¿…L§ºÍ‹6ѯs\A¿…ª¬ +;á·¸H£û7ß‘£¡Võ%œ‹]Dø„²d²€éô~'÷vy°ao‡[6õ6j«z; Sؘ·ìjÑz"o³@ÖÄÛæªîx %b SR4n:{ðn÷Å »án è(OÒnO·– +Øíi æƺ…1‹@݂×o-H·ø¥bòm:çÝeÁ¹…Ï¿&0·¨ëo[ê# ­0ã|GFÜâ.àýÚ·0²kŠ· d"l|ÛæÄËÆ· `Màmñ7â@ÆÛâO6º-n œÕ€Û¶a„¡-͘ƒ m‹(Ö鬤YU`[ÔXáSܸ¶,~@ÀþŠ>0 +ÕIÓqíLÛj!˜¶øÁÍ@Úâod¡7¢míZü%жûÏöäô†³E†Å%e¦±ŠpfKÃ}î,ۍȎžUo˜;áEÉ‘'D6’íòû2A¶]!·äØ^êý°clO…דb[<§b{K/½1lU7Pa{ómžۛ¤Œ7€-Ø„ß›_{«dÁôÚ[š¡7v­d?‰®½,Ö1¹¶º>j'×ñF\kYlrk)b~ÇÖ2œÑ'µV3K2k‘q-ãY‹˜÷³ kñÞ²=„‰µÔû´7`m“—¼ÚêÙ;pµ¬…>ûN«…d\ɪÅڃxÂ@Õ՚¼¡j_Ï ÷$՞Œ%–ÕjÝÓ몕˜ë=ƒj¨to)]–˝¤ZfûOY ï/‡¨ÿ¦!}p¿½÷1õòR7Iµ.à +Pmp«‚S‹d% +¦+{¸XA©EÅ8ÜـԞ®Gܵ éEÍR`°6µøûÒ?ÏÕÇé|ði‘±DÈ?ð´ä´Œ¾ÓiOxFp€*ŒˆVÅù²‰¦½K¦fiÄڛ÷Až`ay¿qia¼˜å<¿‹r݈Ø≲ªJ‹:fǀҢ.ˆá3o„d]’ö¾µ2$-Y¬÷•¬Yz0ol@ZDñàŽ„qܒº6þÞp´a íåy8(³Ð bIº±h¡ edÅÆ»(’$Úü{ц18´ÄçÞObh¯S¢B mš–BBæZ-‰sê[¶ø§ŠÙ‚@{Y¼Y¼êM;ÍH3®Ò~qDö3}²½¡Þf“?‹ ^Sl’!þ]GÒg³<Î>‹@¾°`ÏÞî¾ìÙÛÝÄ7ô,ƒ¤ý ò,3°âÕrVd†¶<w6˜I½o7 +êìí/r‡Î‚3Œ7 ˜³@Ú" ÈYü]¢žÄYKKàìƒE‘ñ²X=¢jžÛ†›}fW9–¾æ;FÀfY÷RΝ5 @SUê9ÊúTH¤ÙÛ«Á4{‹¦•˜Ù'=A™eeš{éL-2iÂ,p5cçÄÊÉ@Ì¢ç4œv"fƒä¤Vy¿T¥€ÙyŒ•/{GrÓxÙÛɞ€ÉÆ'¿Áe!éTØApÙ»è&2öê&ÃmhYðUH +R>ÏäÊR-}=oXYFö ª,Ñ#.G&Îá:fÕn +™¯cî +zw(ŸDٗA•¬Pv8Ɯ@ÙqD¥© –Ó°"e§QLÙaN"M±ìäB{#ÊRlÃͼ˜@¹M@öèˆtWˆíDY(íUWm ,åùŽâÖb -Àf*i¦Ò|0ý8¢Ñ%Ý)ú%{Zà(YäØP@$Yʖ˜w^I²Hlbõ Y.¬¼Šj «tŽ9Õ(˜j¾¬MîUB¬ÄÈbÙ¢˜ÜJ‘íX²—:ï8 ª+7C¶[ž¸!dÑ%Qgî`dž‚ ûîÎ|þæÓßdÿnYvëb£.¼˜ÓL1„C¹>©Éay”4¬Š®Zæ,W`4oçè OÖOܖKŒÇ‚täOŽÌøc›Ø¾N5¥!¼ªäće5žòÀ%uÈ`muO¹ +ŠÇL(Znsá±Ü\ö4÷]Ñ閴Ÿ&A«&Õ|ÀñżRCò'À4*É)|á‘ðÀ«º9“O^ŸºµD= úf§q•ÁžŽç ]òÔy.æªÈQ!·ê‘EIJØ –V–])6-®³€ÁmL°æ…dÿTLÄÀïlʀU›¥R΀à:$SŠŠG }»§\l%®R‘Ÿ"‘€Õ^ê}ì€åP¥8úf;Û#aƒ¶Ö#è0¨ ­¯IŒe&._SÊŗú8AèZ]Eh5e¹à=<þ›rZÙÎý‰Á‚“¨V +/X¸RâO²?#,#êäÔS¬é'YHŇÎn]‡›‹qQU/º¨„aãxvµ„öW ›!í-,R#â~â 'ÔúŠÎt +ø›îŽ¦·këpùÀç¸Ü»wWÝÌ.tYE ˜ßkxk´”<[x‹ìÊ)XV¬K½õäJ2ðùr¡Žïß@ååÑøn4¶…¼«¦O´…\4.·ãhjs,JžÙâúaçn7ÃÇÃ:>ŵ I"Rú0z‘–ë҆Œ7À`xeaÉl^yh~‚™>E B-4V–&ãC¤%ËçQƒà?̒ü‘IË=º ïqMìf²"ED¨bÏ÷JbßN7žSäZ¼’w]ë ¦™….˜ã½á DÑÖáìõ¸÷Øæˆ0Û®S;)âÅ ÕÑ¿±‘†‚$ì]#-|GŒ’~FÑ3B,}2$ЊC…/µ©ù#Ûo@d‡=µámF/;aE”Á&š‚*\87@gÚ2 ýM† +þ,y‹ŽG”¯Bh²÷S…qì‡*q†“|äïã±°€‹_tvÁ¹Bò\X^,Îý(¿à«,þI,˜ Óƒã)î ÈhŸ5^,Û{æaf§Ã«jµD çBhÞ ¶à‰ñ`W•Z+weU%ÍÌÞ@cK5Çåt;,·zCTQn¼kŠ­€Ø–Ë'vi~˜Í܈@ ¥(‹ê±¬Š,€÷M D–%Þü¨RÃè¯$ñ9ÖQf&³fǟ:L2¤Ñ@=G¹,-gnÔzè.3^ì!‚4Äµ§—Gç™± x/tµáÂDOB¶èÁ1oG©ðޒà©Ñu$Õ`ȕ‰Pä¡G¯E 4Â|ªðžñ/¿\·ÉÌâVþ¨8÷À}_.W³ŸñŸs9t ƒÄð ]Åf,¥º¬–HE= øà!X€…}$ðˆ ÐB^À:.<( sÕÚky@%?}l2W=‹+E1‚^"ÇÍėà+ãJ[:“”›Þ®ÿ>½N±Ëº|Zø()‹ö²›Ã:£®V,Óñ@ERa—æ]Gdü¢6¯qz”¦o–ÂÁ€»æ4O¶æ¥#20Èf5ÁÂ29nCU5ªŠ®+•`ÃHv4K ˜WÏWà4u±Ü¢ö¥/Í¢~Pœ}@»¤j¾G£qæ°áÈ&wÊÝF4«Ax +ÖXuÄξ͐5–hàvqrO-·±æ-öäj ÁFØÄþÖ³á¤ìK½-ëa +To©9ØWWµäòrÊw\úžo%·iá:üºÝÒf533\-wÕeè7TýÉn@·ÁªO,ç\7\ÑHhÄÐðÖ+z/`p 7œôúK±ø²uõžv8^²«W<¬©ð®@βÒîS#•zž^•&ýªæ+R©<ŒÀ~¼ä} Ë<ÙT’:ÌîDϔÝEwÛ‘xY8¾ +âpWªÄCŸßM/á=¸>¯tü kä°~ìÕ÷mTé0›;˜]ցëóîB™ƒRÌ­mqB¬+);7D;EN–W¼G¶´]}ܔ¶•ó‰ÚŠnŸƒÊQœ(‚'¿r¤¿*FÀkˆ,C†LfMKÇy“»2ˆ.bN–O=ZñJ©“È வ‚w ‘*šÃ%³¸bÐ$([¤ÜeèöR‹Öu`/^ÔÓW`o LéKÌAPþ(̧é‡Ò +ÃÇ ÔèÂëÝŨÙ`ÚmWe!r€ÇÊê.ï:ìÊpé.óS+*>=ŒïÛëPøm”j×ËM¿AÇÉe ԍp/‹5ñ(h ~¼õî0q«J!1zb8T#¸*î8„zìxGþÃò·†©—×ÍNù.’¥Š]£Õ³ç¹«ê&ಠtó›DߑqÃæx ,xzï…ýW?è.Ñ;µü"ã·Bt&r@J3aTÉRÊæ/猻Æqÿg&ç½q0U€7†> + ‡`1å€+ÌÜS Vž;Rüš³óÄ]]:BýâÚŠï{¹ôș+BI´Ê#°ñòC܈¦v?9ƒ³riÁ\÷­V{3Š ŒN½¦!Wvѧϛ©›³Ê è~Ûaâ3Òÿ kwrŒÝJšòTz?, æê¡Û*d†x1ÝN Ù/D󼘬æºULbø[Ä&œÀµüï†íÕfÝJÅwÆÐ+bky½4LÈÔvÏÈ)¬ +mÀ“Áƒ…9QZ¨ÀD©Wӎ|Ž¹'•÷۞„ÓñŠÿF3éfÝ@îH?¨RN‰È^pÜÛZ½PÅupˆD–ó‹®|2¼£ë”Æ«2»©¶Ö\*±äYô}Â,©¯’f·–»ÊÂw–Ù0FÿpDyè©W:hp‚‘š—z†¨…?Ê'íÔd é|è|ñ/ÖÀᒍòž®úãg“˜ŠZ D%ñä +U”Ü ×ð®]IçuŸfíFS@üˆªóÊôrÑÌ3ß3±å<øŒ(¨D‘óR‰Êa¹{H`溆fDÒaQ»´ÝÀ +¾õJž2÷ä +fFy,È+`¡Ë…¼P–АU6gâ·%Ôµï_9"Ø/áspÝπ"c](ŠFDD1@Ä_ „gЫ‘d Ã?ŒŠ†£ ‘l àL•É§ð¸´€Y˨}îI ¬ r»Êù4ÿ°¼…–ìûP÷¼¯äˆ] +HŸü\Ô\¦x¶â“¾B›ˆøöˆ\á°ìiÍð)@V¬úA´³j„k[.j/#ë@Ð_¹2 ðxJ‡€i°{Ï-efîɺ’JWñX;i°8ÝeÍ,cö #ä™&DH(F¿bÀΛõ(5h])nÀ©=Y†ËÇY}§è1±SïÑÿeœd"ù¢†‹«…°RNƒ|›Ãi1XÎùqÃ|1;p«¢˜ÇRXýæôÀT\¿µgÍwˆÍ>ð~§G êüœå¸Ãw„x¨b •.³2Ç<_|™:N!ðOjód͓ã Fw®l‘þý¡%" £»r zÍwÓvB»àX÷¥ ×®l¤xW[êò•Ç{UËãŒNW³h&KñN #tœ*÷µ£Ž:~H¢Qp?ûY\\Aå¤è1áT‰$«Õ_´¸Õ·e¡üx=à6³ ¸fô´n×mTʚ«6dÿnîh:cþÊs…õD‹võ¨¾5ñõ8ÂWN(¸Ÿéãõ4hÔpj‚ÖÙÅýòœ¿9sGÍ \Ê9ûêç.íHXTÓKŠ‰aÖÇyKÄS)Ho:Vþ&1HîFNÞ¥s¡EQ%^ÕîڞJ¤î7ÂN¬1äõS`Ö¿Ñ[õ4؟#!(0²<³€V ÒMº'K_LãYò7cÔ~–ßìrÁ‘c˜§«÷î03®’:s¦P"ØWÑ«üˆOW{ɃÝö²Îàa}“Q!˜o6ÛyTz !BL 1§‡M”î{”R˜{²¢<¯ç<#‘òHéWÌ{t0j±½«µ¢0»ÅؐsɑŒÃ;Èޑ2ŒÌ'ÜǪÁSÂ-t¡0º }RGЮŠiúÍáæ{4«ãoۗ1ñ\à lX֚ƒªì73Òx§y0 +³‘PWkë“h™¿z¢¤¥&¥>I´Ì©ìX6<òÂíµiú & a«à×`5SÙõˆ¶¦,%ç]CŸŒáJü0„R¢Œ¹÷ÊÐ/œJñÁ÷áëS\£mBeä>+·³…X8Èå®j‡j%¾pðJÎýҏîK‰e™© çÊüõfk™ÁŠ¯CA)v„E²ô"4 _\C¥’ЋDw =rÎ(æ_îÞ çk˜évgf„®‡·“ \%¢ºo QeÉ(ý r.ƒO†F0Ϙ +$ÊLÃD€›«'…3sQ碈ïÐâóeIµœ°¡'Jœ¬ú§bR¨ µCS„i£\æ=– &¤•¢µr¿`¤0ýI®ZÓéª +ÇꉬBoRÆ¥£³ÁLC×w|ë¤PÆeBjï`[ÕOj¨Å¨—_Þ¡»æ·r8 ¢ùÁtôa +fL^°(VK[wucƒ¦þHMS’­uQ›Uz°¬ ÖáE½9šÆFތ’…œ}´«ðQ\|ûRÙzñG µÛ81V´³WL‰xze)‰‡À9ÇXXû>žIý9sÏmná KsF/ïz¬²Ü_÷0eßôzémPڍ~HY”0èJ™å:ÕaGMuŠçý%|•ò3²Óâ!¥»Nnøê†t³Ë*ê_ˆç:ç(& ä~š[)5s6žÈêÄ̟{6ãwÅjx윒ÛË%Ê8ýp›Çб¢Ÿ—ŸËe/¶”èß´ª;>d$ÀæÇ*Uöyvf6 è +/XÆÕy˜æNéN5æúvµè’X'TâŒË–k‘PqˆŒÈ! lë\¢!0,13ئ/²-µð®á\Á‚ú†‚*!•¨ÀÈŎ5 5×ôßÉ÷ddžT2JÖØ&ÃÁ¡¼Nª1¡5 n+IÞm†—éˆwÑÀ=kÑ%žfæ¼YÙÏ0c‘C‹‚§ÅÀïӃ†;IuOÓ»E«1ª§(ŽþN ú™?z¸;U?¢`¤Åêïƒ/ö9ý´?&—™QNE¶‡ÜëÓLÃÁ1øy «ŠšÃœl–\ê;Eñ,}ìâÚ)j®SK<½3àêÔhÏM'°Ùiâä8—ÜÀÞG@Tˆs 77:1W©¸sw…Á™QØn-ʹGa»eµg4•ÄoP‹reJA[(v`ÇKÕÔÇjî"W¹- ÀÙµ”z+Æg^køÔљYolÕ[MåIe î©tWù:=! àÌE H¨l>Ü#Žº›vÍ]å N‰2cv[i®¡£¥X¬À¨õ÷qilC‡ìŒ‚m§ôÆø\IÑ`ŽµÄ¸¦ZF˜¯” Í{¤gW&ã8Í?ÆØg(•«^Š`mͱ…”CѦ“J + â¡bb:Tukej€\É036áGXú½„ß”8<,êE€+I +±ã'9äÃrå“2`ý‚`ˆ×±xŒ®¸Õ¤(<Ä,ƒU±#¢±E ’S¬DÑ*ÏÞŽ4›¢Ò’$»,¡{@×JÞ ‹Šúï̸fQ÷ÝX +ÎÈ]m¶Ðkfí 3‘•›ÜQhÀæxqR–`I& “Î9¹6Ý67ÖrR8ڝ n•²@ˆœBX…Ù©ªÐŸÊJ$9”Š‡²®\4éh] ïàŒ2X ‹¦ÒËAJN&5½9˜9•öîëÄOðí=œžH Ã2ó”—À%ÌWR±[ôa-*A©yé.ÕӅB£W=(R‡õåh§‰ ü:ÁXìé©ÀÌ"ñ+ú÷!ÇI9ÓåŠ-XÔÙµ m™{JrE{@¬+Ôݵ:I!k¬0§Æ+É7O«Ð-Ò³"ÒWxõª˜µãK½UîÍÅ×?õƬcÐäSU³‚§¶,`F%ÌRâÃòØ"µNˆrD”6Ô|‡q—4Ÿ§TuÞo»ª¿2?µºÃxV>ú1ëyª•@—ëDKô'ù+ ý*¤™,j„¶˜Z•Kµû +­0A™|ÒÅ`¾.+à¡pGÇ$ +­¨€oRSùX÷*(.u£rOK†&©ó*váÑÓ]áJCñè»MŸ¢§¢3XÕ²´Q©ît—Ÿ 9´‹¡^êS™íe÷Ç&e~zŸ0ROú¸7“<‰€Áâ,UWõOîʲ`˜¹Îd¦€¿‰ ™ôàô¢=¹*ÎñZ—‘e†¦ óü)¬gç^HÑF*å@»õò²k_Í.˜$).<üŽ{J਺yw¦)ÅM¦&è9Š\.÷Ïü>²;ú¯;'ãÃ~d±ëÚ$Á&©.…UúçË$a†)O¿ +êUMVÆpQFÆqæ#DÍ6°§¾IöŠãò|Ùí·©8,#‚Û§ X¨ëfµØ9 ‚LŸá³gN„¿z(£Ä›É+s¶a±c3ÔÂ|nç`=kÞ´6ŒDãPï»Ï±#)gªâ#È¥‹¦ÃÅ$f„Vè¸Ùç ¼—¤ú<¹«<¶T9ÔÚ¿ïz8­Z,º¢åT(Þ¥EŕOE½¬sAê*ÁËÙü3f8®™V +&Cé‹=ÅUARŽ«žbÉSµ饒)ìó‘r‰Î¢1*8·C¤åôC&°€»Þ£Ì]É#£™V“³&,výhsµçv_hӐޡ.4¨‡wd0ÆqœÆ蒲Š÷Š¬”f+óäQ¨;䎛0Ô±ìه+>šÞúÇ]raáâpÓMrþäsM÷ÀWĬc8_'±EÑV3`>çš]qÃ¹àêNS¾8rZËŽ7Ê3rWQÐKy‰ç På ‚3!ÑÜQˆfŽ­¨`Xï:B¤Ó-~»ÌÁË¥js0â、“<â’ì)ßܒ–k¾óÍmZq“´¢ªn\J]µ²Z4º,E>‚ð +¥Šœœ ŠÆL‡!Õ§Tv ™;uu…{›!‹ÄBå—+¢Œ>\¢bÏ~zS•¬òªÊB†Fq0ödG±§ñÓ\ŽÂžy¡¨‘L$¾e 縄æ°°³-&[F{sWQó àL {´ ¤> »Rl Ëqç¯Þ#[t>V£o!Ü+äUß} ¥ºtw™T½$oW÷0"òsjaÙ΅܎+ã!¨ÂЏvU=Ce¯“‹²dX˜¢’Ó`à5(xô܎w¤+ÝÀƒSü8¡é=Oc`xcŠRĮ€• 1ߦõ{¿°F ,ÖMtÅÁ.Br¬ö"ˆ²TiAP%ÁPn´6¿ÑÛܐłâì\6§ù1i¼²‘%£²êÙýæ2×Î̆wËaÀÀ§¸À­ o—V"'è–êUæ\e'߃ûþՋÚMBjüåWü2¢ô—Ñë:¬'à3¢>V}ýPv‚õ8ÝÂøK¹5u*’oHހ3 Ÿã5P„ÙÕ"ݧ‹p‹?3Òÿ+ òaY¤¹¹“8‹,䎃 ­g{敒ŠF’ò­;¤Y +ŠG£D‘^Ãï}^¨rþT’ã†Dބu¿Õ_ŠK!¢œkª ùАl Ž zUªQ8Ê£¶¨ +xù,ý7åº<&´.ÑÁ€/ "^ã–/Ö§/Ö܂æS/îíGEÕB“ÔUò,j<"£”ð÷$.½-ˆ€¿P†¹Mö¥§+̌>'Aº‚g}!…šJg_?‡G.s±Ú‡’¦fñj‹í³X¡RjŒgXò¢…:êÊ0îJiYí b‚f>2H1æãIp ­ñ"°öPxº–RR˜ª@»¹Nø÷Qð¼µj©–¬@΋…tNÞ¼nYJá—ÛÆe"bϤsSéÖ,±¥eg1S½SyošÀ ӂ–6=cºÓ<\t)P‘úB¯å‡Á·_|°„ËGçàEWé(»ªÅ¹ BöGÁú™M¨Î©“À6%׬µ;XÃ'éáF;"ç¢aXIñÄ¡u=Ώè^ªó¥2ŸÕ#'Ò?¡ ˆ‚[4Î]£•Pü†,ΩeÀ™?ʌT1Í +¹ÑUÁt©,CYo@/áaë:‘qeˆ2̍è÷ˆà2⪪xVëuWcó +ªÊhØÜL]›k*׋~âÞõŒôauF¢Ÿøpï‰Æ° ®òJA,~”éÂîh،ٹy®·•1øºÙÃá°÷ ñ]hõL Y®öa5èÿ³" UŒ{da9TÖà†½lÌÁX'ÈW×R€¡ü\‰’ ÔÊ '‚E¯AˆV0{³V¼kˆt`¦Cˆ4bÅ}v¸ ßx(ÔÊRÍ(5Ìž~¡ÚÀéîÆnL5Ï|1ø?íP½‘RÍ(æRÖ/Ɵ—n÷ôٔ ò7U²¨â‰à›Q(út1©èõï#®©|0!ºF/*¼há W×N䮢Äc1%êè—ÛÐT¨VKêPƏú + Muâ•w”‹Róò˜7‡/ˁØ×eÒÃÍ8!ò`Ê*þþQ30ƒ“(k-· +’¨•€„…|"6e”¦EĄ¶ÕÇÀL·®›%‡¨¶˜Çº”}`Àɱɮ.4LN©Ž{iÒâ¢à3ʚ<ÔŽ‡ªº.|QCT‰”ºÃ˔;0ˆÞ벸W–ÉYcÆ%Æpê‹)béFØÌ£*v2c©7ûT•µLÂC"Ð.SchYÞ¤âè7`ÍÕz×ØGωnÐDsîBWÚÝûƒƒ•DèoB˜ŕóš PÌÜ7j»þ?1¢ÛJ÷j“›X,ÜxƗØJ… ˜»›«øë(Î/ã—8åóBG4ô*¢¿ò`Ä1 þ‰Iú ´»ëNíSK×Ptuå\sJs#ÄYuñb¤/Ó{´‰UnŠ×ÉÉ¥L†Ý#]°øšÓæiv¤n‘®ãÌímF|eQÝi9תcµðãz&šwÓï͚×#yrðÐZ„é¦~ +꒼Ð5ìÞQo!*É)ÀŸâlX«q‡ÖJѓÕaLëÏ9˜UTM€%o!7#OÅôe=¾ìÂNgÑãÛíÎU‹ÂèqWU¿šØÃr¨XLZªKXx¨P]éø̺K‰?Âr…2S—`\.Xe˜odt<•À "hßë.~‰§“cJ«…}ƒÞ>›¢5¥Ú4oÂ2¡»Ði‚9(1Myäî¦H°(ڗ~CR„ÅpRHØRö‹†ãT5!íE&:g¦t‰Iãaîãí²r4¾I!È#r£%=!Ä¥•Í÷f€ë¹È›A°Ç±;.K2×ÊAü9¢´èñ;ÿ¸,,¢wÀ2}´,-Ö· c¼-ÀؐO8|J\x¨ ñÚ—KJ; bÓÞÑbòÞ0NDt÷e;vÇ;ɇ2aAÐmÙsD­^ô +»íG(%Ìb®Óa€°Øϼ•›˜2…p*¡söõïc‘ ¦™Ì©jõ‹'×ìÞ͊¢§®y÷;ºyÁŒŠ Z¨xªâ/´Ãðìþ´A¼Œ§o(ÞÝã6-üÕ«,ïzh3רÈ쟮f†*Ïä…^ÛÇÅ)Œ<“jELuÑÉ*ä7š£±ö9É3´Ìú:wà}Ô¨ 7ÃH%µa~ÙěRð(bÊ;J} ,Ä¸R;Ý֜92žÑsGÞá2㰝ëñ§^Ùl"DÈðA—Ž(ã$…›UX…ïH±JçqfÒ¿ZìL?v+¸kwò¢TKîêã +ñÜSÚ¤4XãsŽÎ »‹& ‹mØ{,iÞÊö覫jà. ÂR$­ˆ'û„43ð̏¬h¾¼z{¼ŠdàÉÖEí ËꝑìØóHAŒ·k<JUwv\¹']˜)ö¦…üM4ÝÊÛ8֝··<‘ ï‡iEO ƒÅÜôcHI‹¯´0@IJun‡¯·—å–ô©Ð€£uX<¤\f×憘}°rExx\U3 Õ>Κ6–=ô®Û{qO7ï`ѤÅ2T6±Dr),¸Õ0›µçÍj öª¡…ÎXgó6¹*AÉw—JÆ©®³ŠçR²p)Á cqïÄˌ1–í±e5Äøgâ¶óžr%"x˜'Þ +Õx‚«6—ú”Å`py5c ƒ•·]xŽðŽÕ¾äÀÉàòcʟg·šÛÄM*IMòל²91÷}[‘D‚­†—wwTMv9ðdêlèr ¡à%º¼·hfåøM·ŽaG—3ãix4‡„T¥mrùSòJ.‡„WpmÓ©`èJþ1ÎËr‡.S’ +ÎȂ¶uãÌ絜ڊz¿AËٍï¼'³õj b9ÿ;¯œ¶ç™¸r£Þ礕Ÿ–î°ò³œÆ¬r„µÔYѬr,/“&¤—yé^&©|˜òŸ ò¡’ÌSŽ>F͠㠗¨/ÇÊ?#ìÈñÓxÞDŽÃ¼Ê‰EHÕÄŽG;ØàSI½ÞŠgB¤¸üÚáäm°Æèg +gc#Å×'P㐫£Í +„¡O³ &hi+Vúh¼;•œq”ƒžÖ˜NÌ82"½„”þ5Êü1üp|€á +È}†˜x4Ö»1ÎTôÐgFÙ2‹€YãXêU1_ÙL•D/׎€ò.^Ǭ“RÃOuÉÿà9Έ­Uéð (‘ßÈâ(º•¦å¿,Ã2†àŠÃàºaÅ ‘) +’¶Â juù[ÜF +rcŠcÅD o Åñ{\0(œÍó (Žì _Ÿ°²<ëQ“°·h8¼ÓđïQzÙ0ñ._)QâHRDz‘Ä+çkØpœÕ +‡Ü ŸñÓø´„ˆÃÕ½Ì=à BÁŠ‡šâ4§›B \.§’ˆOÃʏBÐćŸï zøyJ€´ÃÃÏèJìpàɇà$lÃw&dá6 Zˆ 58+J¥ŒÌ '}ùÑC˜ØpœÕY'4 Öï3üìΙmÈpXõmšC1å‚!VŒMšÁ'-œ—j†8/¥ù¬p œ•XQáHkl7)¼8@á½}~å„÷Pë&¹¸æâ`Žt-¦â ayÁÁ'"¼<~#„·¿!-jU·i@8{ÖZ1ùàõq«ÂÀƒW5kL88vk:̬œÃû®éÜdp”«Ê o!V^¹à€ ÔhÞ@6@—ì{¨÷AZ³ñà:µŠnáÕ5Þ÷ªXà\ᝓ>¢€Q<ðÃYÃîêÜI:愁NBï,pÓ$' +ü ï;AàðÂÊœ¾ÚÐgj¹³w¯ýªúìÊ%o ð›!oÕJ ~36 àÓ9;½q¾QntÔ» áNցF=½x-æ”Rˆù>ç±Ec›êKB€ò݈•ŒOà îW±ÖRRÒïˆïjZC¾[UiF¾1˜Iý´ò½!j!¸%ðÞ­:=toàÔ%ö\áÞ5Û»ºUt¢½aˆ6«3!ˆ£¡f!ÀÞŒÐ:P_|:B¶a½áKJÿi ‹æo]/k ‰Ü÷§êÖ(ÿ^ƒõÕÁôæ}²×6‹"ȇi×$z7×`%Љ±½[Äƒç •‹Çç °„fÖxÖ— ón`y§(oEyCEÇ,HÞ( a5P ºÁdâån$o®OÚbÁZPl6’÷´šä}>ŽÓÈûƒ#>]u L®ÙZ9Þê·t• ò¦ÂMæƒäMy# 6’7>^Æ’ä …Í ’7<'õäM+ë ‚Ç­×½ö$yVãžõä÷í1¶Û;¦òæß·iÑÇÃwF3AސrÖà*vLýTUQÆy“!‰Aޔ…ŠÄb7éH,\Ù@Þ4  o>©kLŽ7E6Ìoo +k¢ÜƒihHjp9Éñæ&üd7Ž7Ìl~oŠnþ$Ç’!"7Ž75ûšºÌñ.ä,_Ïäxã UÅÐÆñ¦VÛ%ـ™aŒÄx 4e„ùÒ'2 –ã ¹ÔAg`¼)|&ågÃxì`n`¼)•c ×oiçX­¶b¼¹'«jã]xoX¼Û1Þ¸°Ëå¡]ÆØãMëÄWŠ7û/Çg¥pÂb‚Ëã0ÇÙˎñFX®âý`…U®‰ +FoEžèŠð~L4K‚÷c5}¼qœwz÷sÇÓ5¼›Á<™ƒßëà„´ó»QA}‚žÀ%Ó»I>nªdJx7¢®ý¼ŠœÛaš¾[ ¢Wr7¼+¢M2ðm_+©Ý؋ïííF@Šƒ`v3âÈZæ`v³7Ëß$hx'v3Â'ù ‰ÝêÇrKÃ#òâV·[Lb7WUjCPD¢—›{°lÕ²[æ; +V›6t1¯Ý0ˆ~¿!»Ù܆ø€@vkÝ`ˆ·ÖÒ-úlÈnu$¬ÅÈnÆÃôìæ2'ÛÙMí¹°4fvSŸ®oÄÌnZô1¬Ìnš»3¿ + ^‚$²›?ÊÊÈ Ù-ÉQ)­·²¾‰ì––ÿpÖDvÓ}d˜  Ý¸o§¨†v+,â‚ØEà„àH3¢Ûèîé/ Ý +•œ&$´»d?3»3ВÌng˜øܘݸT9sÁ즯H$¼˜|YÀ»1»±€è<¹h„•“Êa‰ì&êŽ/҆ìVdùٍ7ŽˆŸDv—ó :΂ìfсÔáÁ°!$§â@vÓõW‘Ù]RÅÈnZ˜d÷ÇUò¢ÀÈÌï|Cv#™‚+å)@ +QyT8ƒ`.²gú†ì¦™ ΌìÆOPµ–ÈnX8ñíÈn˜ çId7-ÊNÙ- “n+²?JJg"»‘"¥x+ˆÝH)ªwá +ìfF”¤ëv?Î¥%‹ k"6f÷Õ"?l+0Zº?&vEJ+°ÖÑ/Î>0v¸îѧ}. †ó= ë16Åfà«Õ=Ü)=IÝàÕŽ®36†6윇6P7I×÷3­÷43sºÓ°qº§Õœî»FË0ã·ÁÆRÃÞÓ}ÃçfæÌ'¤; £{Z…è¾¢)a ºâ`ðut“VÞ@7¢Üªˆ3ŸM#+žûqÞ<÷2£ s߇ßþ Î}Eµ`sƒ£v‘FsøÂaj#s“ÅÜÂã]¤¡èr8­\ÅøÊË #)—A冡»L®+bÊÁížLîë˜Ê?¦I/w»J$7 ÔnDn ïX@n„YÉ" ÷òÂã²n˜vËèֈÊA㣕%Œ›VCÌ©À~°Åý2(²¶‘¸G¬ âFèW½Û̓Hù†á¦6•mþLáF^qC¸//vw7›„?ÏDp¨…7Nˆ%G€›§…q3øÛ¸Õ¿ ½û•¾€À„o³¬²_“½½g¢·³‹s·¯Ècg;ˆ ¼}Y¯–ÜíË­"’¦¢ +Žòuû®ÈÍ®¹ 9"µ+q[tÑg·aàÀí;Ä.oVGÁÛF]3ÛU\µq+mU4\lKo¦ßÌÚο7Ôö´š´ :Îp«EV°ÝmÚ8ÛO৳¥©;zGwc*øëó†Ù†Y+¡ˆëQ.tF¸”…^ÃÔų «@­Ù†…–ÄlsbÁlc®UX<0ۏÙRIÙÆòHmßWÈöë"Uùmžïr@¶ A¸‰=«gàtòÚ²M +ûd›ôv‹î Ùæcem¶!Û|?8„d›ÅHWÈ6›…ÆU(À~Ü.01dû£÷ô9=«?&d›HË6È6Íʾ²­Èd½&R›G• ¯m†Ä¨n +È6³Ðmà0ùÂlŒmÜ×q›±=—ÉÁØÖ·î†K ¸F?é`lÓÂ+83B:¹ÝÛ%è6É؆Eâ†`l³ÄöÖ&±+•È.Ûx …Å +Ä6¼B—z¯ˆí駲ïkÈJÄÈ(Qå´!¶³ÛlòÌÌC ¶a‘ÊmCl“˜Áø@ ¶ ùçE¥³êF±0ž ±WØÊ#¶)1Tcb#¶ñœºÛÛ(×#=-Û¨[çÞ%éìž÷içkC#§T”ñÚpÃ9¤]¯‹<ù•®Í ‡óÀk3ˆ¤NèChášu¥kËJE’ñÚ<Ö0m•W/^›qQv( ¾6ž;cŽÉ×~îà /€mÔE¹.“9w02¯Íú¢"Œö¤k£ÍO_ØÚ‚2’lmtí¸•Ö˜ÑÇ+ +ƒ¬ÍòÅ®-xٖ}åjc}$䌃.®x9Kµ€…t6¨öåcÉÔ¾\¼–HmÙ ZˆÚhÄq;€ÚÔ¦Àõvî݃yٍ¸Í– —‚•=+MT6ô/œÄ7R6.‚? ì3Ú«'5fjuµb²ÏT&ûŒ9-(Ù8£f<æÌÍcªap$٘ž.C³é.ÄÛÙpúNpȧÇ7<ÙÐeQQ½ò±Qo­Œã¨ÏíMÇ~†ÓÙ+F†™ŽýDOó`c3sGc?„$ûq"ÁØ0ÄÏM06-‡Uw E*$¹ØP§E°jb±ï+Úa‹ýæ4¨ØOàW(6R=z‰F&ŠûT„X›‹'º›f>Š]È&.ϧ„b3'AŸ{£bì¼RP±‰à*~¤Ù`s›Ûų´rÑXlX”ß +,v)Q…¿a±µnzúÄb3N—(°Ø¢@í¾ô€¿¨æqÆb3ñ¬æqÑ ìƒ«9ƒ‡ß˜‹ —ƒ 7,ö£bð„bƒ5 N´fb?քíHìÇx±a,Ð@ìÇèŝ‡Íêá6&û ¦uP®½dt£aŠArun'»º{Éä­º ‡Í“kmÒ°ËáJɤa³ +†£òJæUiØ´ 7À`±âQVÜiØtI«ëš–"®\J6,ªÌØpØ\L7sO4N°4°J³¬ÓÀ BAÙÆÃæòºF½»¢Í#Gð°•rÆ?mf±±öԛ´±ÖØDl¸¦rM‰h„m[©»N$6uŒú*cz‡…’æ ‰-mèh‰-¬ØbsGUœ­@lÆæNhñY¼V + 6—¢ÊèL¶Ä O›8lž=OÃFlL¥fÿd÷êéŒb8ã°i¸bÅaÃlD‰pØÜNwÃ8l\#֊ÃæڈܕÀaãÉKiö4l@ìÅl"6~BA›]3 :÷[ÓÂ%Ì kŒñAÄ^,+{šƒˆÍU¡D&bç»»3±™$6Á8›IÍêrÄ©ÿ¤™ïJ@±™ÕäÛ$(6“ŒJlPl‰ò¯gB±Y T@±¹ ×Î[ŠëkL*öìKTlFÀîû|£b§ªž¦b3Å AÅæ×⃵k‘âðIņ·0©ØŒ™±ÓÅFÅfĉíÕ‹M‹&:a±i(bÅbó1¨ÓÙø¾3_‹¸‚ +]7,6qbÝUþƒT1K鋍AP_݆Ŧ…ªàbÃÙtós±ˆ!ÚeãbÃÌ|r±iáà +.6-j¿¸r±yD +Š‚‹ÍpŒ +ҟ¸V×6í\lúÂL››l>ö .63j¨¹r±§9¸ØœÙ +0¸Ø¼qì¿°q±avç' `‘Ö+¸Ø܆®‹M3ŸYp±…:¼ÊcS9Þ°ØÔy²=°ØÐq¬I.6sC՝Z&›1r² +‚‹ÍªægÅ]Ãë¸Ôqåb?Ƒ¤5›+*5 {ZÍýBÿ£èZÎwòÃjà°îà}?ÎO;»ñ.—OIÄÆÃ&E+ØÃÃÑÎÿ${844ìÛ¾Æþ}L µ‹ü' +ûŽp#aßê­°ì&|qb°o×ìì;FÆ`ó}9kP°¡vQ~d…`“8!ØРq¬ ®tµ˜oC`Ã(è¦ ØHA÷ä_3™õ´7üu‘Ì3ý†Ç]r5<õØá×Ċc$ö5zP¡–çøÄZzE_£^ƒ_¯ƒE•äëÂ7ð5ä_HöšêçÞ&õ¨ªgG^·3üN¯[trà5S\ÇýÆ»n!p Ü5Š ¼Üu3þd£]ÃH5`×-”‹»FZŒ}½7Ö5jž:I×HohaàW 7쬳q®ûc²z`®<|Ú¤\P¦nk¤Žú3א̐®„ëaà¸^$ßû1xk˜ñ¿n}^ñ8¸?£k°­OÏa;Úí#›Á¨47×¼[„ôƒç¼q­±PS²RXëXj}5³3­±vtüžnג]ÙúÊ؍oé´F(' >XSÜ­M œ5䂚2Wš5®x¸¿+¦ԜŠà3F©³_+ËÚtI²¦¨Á &¦a‡ ;ÇzDחÀX'7 (Ö#…Ě]rš \˜ÎÂnOœ-ÀÂTNŠA°P™ ÏXŸæ müjlû3¾ú &XЫϐânðjXYìjPmÿ t5~­$˺ÎïG¡£Wç#u#¸Ǫ̃?Ÿvj5’'Œü´Ì ~vÁ¬n– íÈꖍM¬F]Š§V·HQmÀêD>¯MŒNÂÀHɆ«nÑ hÕ ûq4XuÂÚ7V5*ìT‡é’¤f)ºIÕuøóÝ@Õ5T„Á©®¡ L5œq½Aª«=‘„TÃÀ ®Õ5ú¦nˆê—' Åiª{¼_TŸÁÞùÔ'ÇÉOÍB!õ/—W””ÜõfšîDéßÑg¹%†SM ™Èšúa^¶|J2uw+´S_î`µs©O'K]|³øTSÏ÷‘­Rˆ¿Ú¿ÓÀƒÐÙ6²-Æmd[ìsd[;G¶å¶‘ ?‚(ľñÉûa§q?‡i_Nxv¹´÷áûE1Ïô£|¸E˜gŽövL)ŸÌò‹‹q;½Å>¯e9ì¼êå¶[„‰ñBäsÛ4¬ò¶ÃNã~Ó¾œð<ìriîCÞ¢y÷öi}>îeZŸ/Æ2­/ÆmZ_ìsZ_;§õå¶i}>îuã|1ÖÃNã~Ó¾œð<ìriîÃWÞ¢ýÍǽg¾Ë/.Æíôû¼–å°óª—sØnÑ|ÜëÆùb¬‡Æý¦}9áyØåÒ>܇ï?º+$â]çw%ì›BvÎõæÃTÖY^ÜÌ È8ì^ЭæS»«`ã»»²n<=yØiÜÏa±Ïž‡].íã}ø&“霣÷Û;Šå¦û±œíbÜ.mñaæ}X\ yÇ?a»½‹S±l<ݏ婥ñíOûò>äa×7çÃ}øV“霦÷;<ýŠå4¦²œðbÜ®nqcæ­X¼ yÓWa»Ã‹_±l<=åÁ¥ñí)OûòJäaחçÃ}ø&/ðü.ð-]íãøöí“oïãÚ{×>>TkÈ÷oÓÆ÷ñaÝx~òó°Ó¸ŸÃbŸ'<»\ÚÇûðí—3ûžßòró«_Nx1nW· óV,#ϼiËç¹Ýáå[^6ž_ýòàÒøö”§}y%ò°ëËóá>|ãåÌ~{燼œÃü䗳]ŒÛ¥-ãƼË°3ïØòmn·wù—ç'¿<µ4¾=âi_އ<ìúæ|¸Ó@ ÀóѓlVm¾„/PWl^ÇbÜ\”Å>ý™å°ÓóYÎas“>žÛŒ´|\AñÐímœÐÚczۋqsÍûôã—ÃN¿}\ÌÃ.wlžÃ~{ ûˆ·Í¨ÚŸZßñ´/ïCv}s>܇o8ƒæŃl{–d–Óþ†æzõöÛõfı®5pf{W‰Í~Ø&è~-éãßéGN6–\7¾$Þ;û9LûrÂó°Ë¥}¸[È㔽Ý"οçÛq8Վ²ÿâbÜNo±ÏkY;¯z9‡íÁa¸ïçmcWÖ퇝Æý¦}9áyØåÒ>܇o³žÏ÷d®„¦ÉnÂöê„C±=¶0¾¿:ëÆù6¬‡ÆóÛû2¥o4Ö\OLÓ<à|~ËOÏ{·Ÿç¼ÑëÆùHÖÃNãùáõÉóü–Büâû€öíNñBžþfôU¿ßÖ¸Eûa÷¨ÏáC TOõ-ª¸v÷s˜öå„ça—Kûp¾2 ì·h>ùå8ó!-¿¸·Ó[ìóZ–Ãî1PŸÃ‡¨^¨·h¿E‹q?‡i_Nxv¹´÷ᛠô”ÛÇۋt2Abë9 ñŒ÷|;ÛŸ]ÚbŸ÷a9ìž\÷9|H®ïç¶%ׯ‘y…œ&püRW»ÏdÜç>ê.Æmˆ^ìs<_;Gþå¶iâã¹}«ábºÖá,¾/1¾­èD:]1v"ߗòz3Ø핋ýãݽ·ñ}‰±n,CMܯåk\nìòáæ†ó_žTßë´/ï@t}[>܁ïÿ7c¯ÿ槟þòÇ~õéz»þÝB¯ý`Oã^?鿎J÷wí¹Xè²Ú¿¼ÙÑUXÛ/oÇù9ûrœŸ|žßFœ»,ϳ\ra´W l|ý¢Œ¨å2žÇsÊXP‡ô9Ž0Žî{»?ކøÅ/òX_Ö×O=¨<8и;NŸK•ýÆÎ2Ž†òþîëu³ñl‡O¦ß-O†u·þÑ2^Ÿ˜¨Ó5¢bKÆr>‡×³á@¥Îá>âÚôºÔ a.BF´ôõv©+ýqY¾ñ– +m¹èåí+èyÀ—Òæ=x{ŸãÝ ¡Bæ` ›ãò#ƒìu¿m~Ö$“ŃÓ` CÄþ#-ûAó÷@Û.ñ8Ž×Zÿ‡¢;¿Ÿîïk#–Èü’žçžFtÔ¦qÜq;`¿®Ü؛vLÖ:(C_;ƒyrhËgý:ĸz‹“Ce­hgeS;K_ߋoÚIüʧÖí”}è&EeœŒ¨|ýêümžÔÙo_d)nd-žUíÃO¦ûnÜàq]ì·Ðôö¾^¶ÙÎÑ뉪"sä`·gÙoÀ[’ûõ9€¯Av°Qâ°wlŒ¢%ïøÖ×1öxNÀÂã[¦~õ*æ]EqT‰·ÚÒÓ~œ#ì剻ŠÏyøQ>EŒ(ž¥ñ÷Ƴø a‹Ï?ó‹s¼DÑ^¼?/GmÄݾ‘µŽCÝzU`¬eøQbˆ³±Ÿñ(Ÿy¯nK{ãëôÆÇè+Jõ¨Ãoråy„x¸‡ž}lŸÆƒGóÕ«X_§×‰Þ:H{Æò:±HRvÔI{Oûxâ} ˆAƹ?y>b–Æû|“û1í­<¶w 0¢xÕOMWt³a‰"6ñ(WûŠû8Bí6žó°û9øôh(ƒoëØÞý-0&Æxç¼FywÏÙX¨hûÍ3ájn|_ùsu9Âzyz‹×¤•°j²W( hgÙbz9õ>ýtΎ%¥‡Ÿ«?›gæ¯ýb~ û„øé´ÒãýH5Û/¥CïÆz†ñ‰×û@hxãŠV6^ñsüš¾zy¯€H¼cÐ`sÏÃþúº|ð×u}’Ñ_¿^m<õAñ“÷Ãö3fðƒ¯%e®ËÄôµsX¿>¶µÑ@Šé4¿¾9ŠžþšjúAçao‚É9Þæ8\kÏ¹àˆ¹ ÜÏçñvë­{»ð¿fÇxûÁør‡ÿCÞèldA[ö§Å@ˆŸrÄüøº£÷Ïޝ!˜Ö5¦fNC?¦½\~Φ‡«î¹~ÍÎëha¼ŽpŽ/<íµÅÆWï3Ûõ~<‡é»\Ò +yŽhéXæÔcî$áKØïQ|¨×Œã9Œ5>ÒÀ¿zäyO 0ê²ýa·›Á1ðÖ½ŒgŽ,¡ñlyðóÊ{ÄsæéåÆ5ÇÛ{KÛC«£¦ÜZœC¯ã†'ðÕ«˜ˆ&Zǵüâi?æ÷º'2Ž'&.5l¼âV<íÎ êåj{±qMV¯$l(r³M·ÿ«§ö%§tÌ;ìïÐù1ìå(^ËÐÏ´±5ë×Q{5´ Ï\ÉWöžKtdìž=€}»ê§¯žÃîTÆ/ÒgÏqˆëÍé*ÚX¯Õûû¹Äö Zâ^l´ïƒ#<çr*¯¸pöùã°S‰AâÓW¯bý,è¼j:}D’ýî#ìXó} »]Øï|UÇaä«GÎm'xh¾¢»Þñª‚„œ«â Õ/i?úµ< ÄLJñŸ¾zäy¥'øh_¹RPֆWÇZ¹É˜ûC•$N’ŒÇúz—ëôûóÔ3Žðú¬b㞟]=âe ¦âóϜÛú·é×;g›·×^³ÍÇoá?ü·#ÿ[þ(ZÇáŸñPM°÷ócØ멹ö›_>iñyaO^Æ6®'>×+<„“m°}ÇójãrÕ¼5y„£Þþ­2rDBŸÌÁsx¢’ñŏáå.W ƒ”±ç‡½G¬äÿÍÆGàÛcãêÇ=0¿´öˆîéYc±y?GŒPõ(á`ØÏñ¸Òu9{ F ÉxŸõë*@=»¾v °yË:>v.Ç:@ÎaïòÆ¢¥"½Š×pÛ "<¤P´Þì³1[GqûÐ +Æ{î}#¦¡½ñ} û¸ã|9‰úcø ~ͶçYë<²WFŒÿ=q^m4_.=.K‰+«çÜÿu›âÁÄäS‘Ó :ü •åõb¸d9ƒ'—ñ£ÏkëùñГò»[NO_k¦gÙ2\Xÿ”K#.£Ç;z?¾`t6ŠpÞ3íË;zøêɽcjõÍAK¨v‰YÒУ¬Çm/^"uD²ŸW»u{:¼ÜßN+Ï<Âkݔù9¼ñë[gqiÂ0ç5ý| +÷¾Î#¼<˜n/ùýÙã^ÆX fê7»RëÅ«ó´xô€f¶DzïÞtÔ8 z2þ¥3·ÂÙú¸Ew¯§nog§ˆõô;Œ¯¯¬,Æ<Âqäz]\\ÀœÝ <ä#W/~WûX®â„zÂGË70ª&Rô q+)ô–ó%qèöóu·®+^x½ihv—BqïùiÂOÈ×­ûž+ýºûŽkË %ì>ú>Ã'x˜¥Û8?­çº—#÷+?­¸?wØ#ïÂ5îåý +û9š7ž9.J¼å3b²jmÌ#ÌHa,s{®ºðöC#f¾œËü22h¾#>ùœ/ã%잇òÝá“÷š÷­W'1µ•ôå +Ékw„J¾ÙÀ…-ì(º’±æ8®¸5sä8_k¨y„ð50†Ž:Ï«ä,1ígºšO/}qVƉí5\¤¢°ñK<Á«*r¦®1ñ")û9ŽP®|²FM´AÍÙR¡A˜<Ž+ÞðÆÖºñÖ!2ú%ìs”Õ +›qp”¯\‹Ÿ{Íÿa|Ô)CGˆä5ÔØ?‡µ¸]Ì3¯3«9®`ÿ̞=§Æl|Ær(¾=öJž+ÜÀ“' žGOl|wz•šª{gÄaQ„ã# Ú}×ÊË»ˆ»ïkøU.qnÅD3Ç!eꑓ́^T1£?OË«˜w©­øîJù­åd¡áô€“琗†Þ–±î3&s̹JÒõ¢¶÷ÈI÷‰\™ˆe‹hn†±3aáE¼¡111w’1Š9µ¡aœ¯n¹í-ªölÞ4ýܓéê8a8rámöDFÿÌK»žs9‡¹,Ëg4 -ñ¦I¢÷œ‘d¥+xäÎ5Ð6žÜ8#NŒWè°ÓG½ ÖÊ#pì_9GÈdkV6åKðŽ…AÁz> ɤ°ñõáæ ÉL:ç•ç€ž•-cÇÖF ùjê»ÄŽÔ´Eú¨Ö[’ñž¡öø^ÖÔB‹ 4Y÷«ûG`PÔ®•xWÁmûÓ§Nëe?2X×ϔ^ù—{„ñœðqçUC‹CÆò¾„}úG,–Jû _ÕsÙúIEéé{Wó"-Ž¼e éVºX´Ç‚ÄVف§ÄÆ#ŒÖ¦%'aûµÚ?_cÆ¿Ã=äËÈØþzý‚2²‹œ¶<Ï{þ{ë’áAÉXsåÐ,‘ÖŠ\´èü‘ѺØ0K ¬Á‘±e("#²*‰"cÎIíhiÌ)­õÖæf Œ‘Ï/a·²c§ +d¼2ãQÂôŒDG> ôµH7§ƒnﳯw(x¢-­ÅÄú]ö®JѵÁ8£–§æ44C˜É ÷:}ŠÁµåŸûH =3>å¼bþ¼ïP[qL²FîVô\· kȿќ7=¯ð†hŸáÂnaï}‰ôíëÒS¿_óC|SGŽŠ÷ +69`k‹¤=4µœäzõÁÂ;FºîyÜRbã×Ú½ñœúð•EA=±p†dD8‘ÆÚc•TCs{fp¶”|íÐÉ$Ѽ©æí0Á½-r`¦˜ F c¬ms¹§–G>cãžÃjWÏtl™lñê’Täðe,©ïeϊacÍÙ,/ çoH³Òìv.Ñ÷Q£¶ÌwŸšýûW¤³}zÈDaO%¾_ÇCêM¿»©Ó}z|fÏÕIîm%"…šO§Ò—¢ù‡]FîV–3»}mS‹Ïã.”£†±§·\·#ô\IO‘÷¡¦)„òí‰`Uíy„ãL•J-y„gwEÓkñ×Ù֚ò™G€<Éŕ*Û>ˆ$ŒL%—Yd®o²@N"饙,v7 … ƜÚHŠÞ̄>IyÐÒ%<â(óá 9–ô.ü֔€Iæ²ÿ‚˜YaÜ;:®í›tvéȸ–Lc +ÁŠL‚šiI¶ÍÈ85:UŽ|Äa&?&`‹îSJ(©Lš°fK"ÿ«åtEoŒ}v–‹ 1RiSz”tA_‘¹pÕ¢U”T€7ñùã ¡Uèr–çÐð¿JŒËÐͧÁ…’ÖO™ {¨©Ø 9" Å) Ë: 0(¢^ágO[—Câ6ð+Ÿ@ë;š¹•õá&YF¯Ë\nO,aà։…š ÊÔ7²}¡ˆBC‹˜O›—rÆiýÊYN]Gd’­È—Rö(’ÉaH]†®E#Ý%5F›}ÚuhÎò"±Óú8•ƒ+è†ÉÈÕÀ÷AF¡:4'G‘„ÌÈË EÐúa1#=-rÄtÞF«(Q†>‘ +gÝ£aö#úZ‰ÈœS%ˆú,[ WÌ­yIúžgyÊÎiÊ ›ÕܶÃÀHï ¡1ś :TêÏ8whÃ>¸tJÌ;"x/Å bÂì8Ho¶¥ã" 1ÇNåVM9åtábs}ÖGA®•ôHñy¡€–»Ž)æFç8hâ.îhË« Kr1Ñ÷è0[UÝX€ÁF‹:€»Ñ¥XÌCR9k%ÁÆܕý˜S#$t®˜ØGã 5=*¥@-ݼS$HÇÇädÅóȬkn;&œµÑVƒpdâ϶„½Ö0‰L˜ëírpUq4Ü'µcè‰Z•w†¥ƒÆÀ¸í-J7CF³¬¬ }Ø4&ׁ2¦ÅÔº€Æ&ÌÊÀ!yDp«ñ#;q˜¥äŽÇÇø×%w-y€YºÊÖà0[à6q®U7êU쀔ÁŒjƒwó+¢%Ü#ZÇàiaK#Û£À{]Å !%Σ9£9Ä@pªV¢”³nC\‚OÚVÊ5N©š…± VH(M\DNhÀ Z™BXß(\&ì(„¹ˆÝJ]Úc°€ÛªJÄnÉL\Z†ÁÀUJ›Ž<™áá²É+g*`·¸«¯ò™0Yllƒ áuÖ.a.n/cʚ ±+W”Fo³âðu®V¾Á3܉} 9~bEpºSÎ$¤ÅåÙù¶±QQð0q¦€+4CP&XȞ~–Âi Â¡`1§túÁ¢¢N¤‚ž'Tà¤à¢Ààž'Už ÐZÜq†2¦É'X÷ÆaÈR|]¬Vj¢ÃÍ"~R~Ì¥÷øAh˜gSD2n=~¼Á­õ ¬&#±gȖJȌßى_g¦®Ý™~¥fPXË.‡Äf™Ëå°'‡‚—¨…;a(.#£@¦6AŒY1$²6=rÒqHz´$ïÆN5…dTÅ*¥)Ê\ÒpdJ+Øh®Zæ㒷]y3[t +«š»–>}*JƒÊ7)·[C^v©ż gMvÁP§h**fкú^h–²ïÎ5)ĸ a‰ì9& vùá1ŠÜç’k¼cÍbÈ(øØHY®(GF9U°C‰>t¤)2ˆ9qœ…~ó8¨"Ndä鬐hì¦`]Dz#–n°@îø¯Ÿ`¿FUа`ë‰[± Z*ª“‰¹5sê=\îi€’‘¾„š¢Úâhp97P¼Û™œ0 Í.sJ +ÈÈèäÓR*·é€"K¨®`ªÝl ”51Hȸ-ZcÚSN!œ¥L•=4P¹²l˜8m1CIIz£ K@ M@b +Bk3$P w˚ƒüGsj,Ә‹IjIfI Jã8íó"`ˆXêàˆà^ÁIØäTëº5²-·@ë¡#-Èb– b›D)M=k`à„ÖŸÂŸ©\’ˆðÌ¥ÖJ·Ô¨î —‡ttÇ$—Á–EW¾]b,Ìf I—ö›8¥ß”òÄlbΜ*ñ3§³%UØáŠ2ÌÍzuÍÜU«Œ|Z«Ët†>—ãÉA³UÙÔÂHK·P"Êg^QÒø£ÀœGf/ՈL}“¶êX켊23ûÏbpõ™žI×8%íÚX)L!gçÀÀ ‡A¥™ë°}]ìr4½þ@ã#Æõã2"M݁po¸B LÐÀ©ÐEljTÚmÀèu6üGçŠï@ ?ѱã±<T jWHÏLm´$¨Å‰q8s#IpzÒm™ƒ$(G›wÄÀ/ÆÐGÛ7e"ÔÍXb£çŐÿNÓl«a€¹&uKÐíFÝÔÆÁªòIüº=w +åÈB5_\Û¦ŽÇ ½“)ÉxŽEh,ßõe‡Òþ·q r4÷“g +åh6Ÿ’ßÏ f€+WV36r%YÀ„­Ã&"O2O#ÔW÷m ¼`ÌÖŒÊÖàlø‚/,ˆÅˆ™‘Q§Bʸl8åù’vd1ðàdÄžG÷»4³Åhè4[[Ät3·5 FŽ«ÆI#ÓЩÅT€Dc̜å>n{êÆd2ñ£òAXË¥óÔâ›ÜóÂ-S,¢Ô rU–m)PFÎ(cênªT¨µŶʣ:0…×±Ù°ìÎCÔWTU©h,0P_‰“NʈÞ"ðª‚ÀFI‚»&OÙ µ… èXIH_IqØÒ[°ðÉíÜ*B†!G™Ó®îl™™UńK&Dòš-/ ú"±”_JäÊU)¡#/Ù¦A<œÄ@“$"mv4´tbj1I*a„b‹-ý”P-Mê° +æ„ÓÈ驏©8\½-á„S*3•8&€JþyNþBL¡="¸?1ÐfŽ{ÏÒ@[E§LxÌ*NlVԘX¡´åגÀ…T؃ªcÎC]('¹aI]òEl…_`ý¡†>F´áÒ:9¦uG®Ü^U¶š2LÕ.F½²wRH[;ÝaàNxL…k\t·PLâYÈN¢#‹ ðA;ƒs+¡%Åa°E9ÂÆI ñSå˜'§<\™säSÍ#@묉®Ì ¹FÊeÊeF¦´£¥cB*A¤ËìēÑ=îO©ÌJ¹" ÍT©å‚)ŏãY‚‚{Ê'±¥ EhÐJ¨èؼ\à¯7å]"Œg.FŽ,DôQ¾Œ;`ð6NÚ9Ðw¿ò\ACåç×Ëê2¢âaÁ)õ3bºt¨A¡ÅÄÅó¸çY£)sVË(¨BM\Tb«›rWÆIFTÚ ™cËѐn*S*ýêb©¼e†yø: +2v¹¬Þº @IÆ: ƒµ@a‡×6 ¬’nñÚªªÒØX¬]ÎH 2ÔK\T ½ؔZnÀL¸ŽÙŠ Êبm´”3Ü»L(Þ^K]ÖX£¢ÔÕ$.1C¹œSSÚòPf‰;»°¯Aªá4ÉN=¢½gÅc77Á^ԇÄ,vcÂô’ÐEº‰˜Ðê〬}±óР­›ÑpBímPÄ"#÷pRQÂ:óØÌf—8G7"BÂ(Ó¢Äi,Ÿá5oӘ»ü­È•c…bœ!—ÎgF5i¬ða”B,ôEFN*ûD57Í8½ïgÁqìŠàړË™‘Û*# *ª¥‰3ía"•q +ô̝qUù@‹upåjò`aù€ÈTb.Š »$¾N-£…@®t*sº¥ù™Æ¶8hÂÜ%H¾,3&ÑQæ\–8—g –TF sŽ®ÜUdìc ¦(y˜Š~BK_|5ušHb£êíø-Ú p©­4 hŸ«ìK̡ǖrÔPJ°ÀÌU·z3ú|ÍGgkÂE•BÐ~h®BF'„6v9gΕoeoÊSÖŒ†«2OÌ-sA¦°>œù5DJ´ÇÄOËU\²³´…2å‚{R\!.’€ej|õfȑѨ4З.Ďâl™åܦä#0¨[jí´Û¸)Aáyiâ +0Z/ °nAùÎñs[üZõ'B÷'Ð\HÛ4s5YI¬`L9Å©×Ú¥ªeNt“ éºr=©  H]¹P% Âíg´i ¯—@Žn AL„ƒ8-IÆ~b{ƒòw˜‰G•ÖbÊñ€g¾tžY|R†5~¥”MŎ9 >{4åCìjû(« +k w%ݰڈÃà!±˜†…ÄQ7¥0â·ÝWN”"¨„ÅŠmcFÕ™­5âWÛPúrðöR6îKˆÏ”žÿ+V¦gC{=Óp ^”ÁfS^̽Ƨ¼SŒH¡@2Þ¸ª`‰­éÝvÜ(ƒÆ>Y9@;5Š*úš'­DLh¼ ¸rÙނªKŠ&B`Bª2ú*}Ë@3(CÚòLlLÕt8gmânûCãˆ#¦‚ÙŽ¹ÄâX(Â05 +?@e–…Ñ á¤p3˜edè%_ Ȥ8 ³ bñüƒY ¦\¾.r¤Lœ®†%ø¼r¨eØg + P&N6l’¼šp0ðÙ×¹fɜÎ;EC¢?ý7m:­¨À^8¸ _N­üƒ@g¶q…#¯üù;t¬¥_G‘OÌ´@}äN´#ÿ*ÑN3VN§œ§óÄÃw¯sº—ð£˜Qä݅ƒS))Ë®†Œ)PÀe pͺœSî€å )%y%¾,Ž €˜ÚTÊÒô™3²ŸûŠÀ¨©^xxYiê$¸AåÓ£9xŽ‚K§jz¸KãÌív’X¨éµù-ÐÕ½#ˌp*†À)Ù- +.?uÙ+euEܵ‚SÅ(ܵ‚Ò (qæê5ÜWT£òbtõb* QVæ¾lI.}œŽwØbºµT9՗8ݺ¾HclÃêƒ+Î]} ÆÂÔÔbߎÂk´ŠÕöÜ5Z”ª pIÑ»^4wq¨àòsu¢U’جCˆ‘uu-Œ ÊFﺣ‘«×7[ñÏvo¦j×Á•)¥ìeŒ²_`v"WÊË×Hà.š•¹df(Ó`%¼ÌšÁà™Ò„×ÙMÈMqpU´$ÃF¡1]”² ö%]"`k +X`4ݛs=RiÏü„ó €.‡ª0îBÚÈ]oaNd“tãÊKS‚ï\Šf Éâ6Û:ã(KEWf{à7Êt®~ s7öYŽ%œšç«>¸{$%hV»¤ª,(Eâ.³({cx›óÔ#¾3®ê2ꎾ3®ÚÂ-P9a‹*«”uƽԗGǺäK_ªœrînc®ˆ˜»ÌpïAp=Y"¼ºÌÂKJŠ†eÏü%¥’Jv!C%$ÄúÝf=ƒÙ¿T˜*Uæ§ÄÝ±\xênbLvkn0È݈\íڅÝöÕ¼èZc^O`î¡*ë›ïvbö†9w#ßmI®1:ø]†,v9À”{tœñÌ֗ ÂÜ#”Wˆ}² Ýd+]ͳÈ×`šé[x8%>„NÄÜN6\Ü9 +mcoȖTÒȇ¥a%w´(ejBm ÐEšet±ÝL¼ä¥ ÎüyáàÌyxÒÄ%Jênû˜GNÙ¬ÜÀP¯gûwf&¬Öœ•‰»û+fnoÆAÚgê*åpºs¦ gµQ#!ý° T¢Ñ£É Ô¢:@áhž£à¾F/Îb™PwÏtÙ0¦dtìîŒnaÄTƒ|õ¥˜Ý¹ ÊœIwƒ/ŒJ +r$§:„€:?pb;,6ÅÓ R¸mìÚöLDë’ZmAìÙ>xXž#Ìʺ ¸¿§“ê\Ћ¿"Cªæà1d×ZUÖ¸ùiãÙO3ŸoÜyžÜíwö‡“ÑùãÖxœû•=ù~Ð<ìöÇÝþó½= ßϟwûá/ôý%þÆ"óãñ÷ïu{ÕÇÝrŸ_èoÏ}?èäøù°ÛwýÖð͒Ÿn7n¾¾èõõ{ºƒÃîédœ>m|®Þ[ÓmÚçÝ^g˜÷±oÜzÐ +endstream endobj 47 0 obj <>stream +ûáŸñ›Ë¼ÉDtãÓÆ­úݶ†kÜýçŶ/[½‰müªÛŸ/nÝo]˜Æº;¶ùç›0´ó¼ûü|\}lÔ~]ƒ»óàäÎéóü¬×jŸóïZýqþ°;>nŸÃÊïvtÓe£…Fëé¯1¯«Ïàë қêCzãƶ¬ßW ‰Êä;‡ùËn ºU2ŧÖ5什ɰò@‡ùhÒ«Á‘¨ýºw<˜ ÛùÞåy«:ó©1…Ý~åÕ=olÑʹ`ÐÙ³ü~k2u[ýý¥ót|ñ|\ñÝÖ©Á}:oÖ·øjŒ¨ÆÑYã18;åãå+mƒ9F-v¸a¬âNß&3‰¸ õ´½Áð‹WçÝq^ã”~Ó[Òºxú@®ÏÒ7å0îuǏ[Ýeæ‹ >,uغ<¯±H¯ù™¼‰*ÿ +^ ›å‡ùðytÝdÉ«6ù“ô^;s:‚1^•ûqë0?kÜþøª‡‡EÛVgh›68ý5o÷“~G÷s°ÄN:³ŒuÛñ¨úp ­kÌÖ¤m +~ۺз]à[‘ãÉðtÒËûíê¾uópUÒ¸W­exK4Ä`TýÉÅ£ö¸õ2¯ÁvÂgÖ¶ ›Quóik”ßæÿšè ¯±¼§[×PûƒãqwÜ^rÄ¢@ ùÓn¯Î¤Z×Pa[~kÁ:…ø§YÏÕVµ¶ÜKVk!nŽEng°Ú)§;åt§œ^?å´z¤úN9½ÂºÊéÙ°¥Õ«Þ÷ƒîh;ÕÓê›qsÕÓêÖ°vºÓNwÚéN;Ýi§;ítÎþÚi§u$þÃü¼Ÿ÷O–W®(òo¢@YÃV§;©q.Sûu±ŒN·×ª‘¹‰ÌþZp҃áåù 7x^]Þ±ÅÕØb²c‹v|Õ)±c‹;¶¸c‹ÛÉïn>Ü Œ×B`ÌõlïãŽ1îc Ƹ·_dÜ1ÆcÜ1ÆJŒñ~kòïÿµÏóáOy·}þüÓχï)Æ`Ùä¯+ºÎ-·jyÊݦ{›Ní6_uJì6ÝnÓ-_OLnoœg¡íâ<7"Îó/ƒÞo­Q>œ,«?¶IÁž{lëÂ=k éZ|îÊðϚOv¥`¦¹Ð¦LòÔªƒª.n_5Irs™Èîvµ‰f®ŽÐ0ïÔ«Á¹i ñ}WŽ^ãüm+'ÜüËÎzƒAÇޜpÚkµ_ÜnÐà²ÕîŽß|5ëÈZ›t™zk¹I½Ñmؾ»Kt“·Ý–§[¼Å©½9É×H4©ÉL6D6·:ƒWÛÌ(·¢ÄJÜDõlÅýºaKy³#zßSG¶òb½:`mØÅzbw±ÞÜeüÃf^¬÷Ý¿ÿû¼—ïë„Æ_ý{õdõuº!×êÕÙz×âZ=Ö¬á[juº“›“Ú¯k¶;Ý^«FÈMÔB·7¶çÅ^ñYÛ°RxÃËóAoð¼:"ªæŽ'n4OÜÞ¥íã„5b>vœpòòÖE|ŸÖ½fsØÃ{  ºê“µaüaóú·¾@õ0ÓM­ÕtwÕª_j[,\ç8ؔnk¯-ڎzK +O†£æ}*ë½H¥ÎºÛ˜˜•Óê³µc}ëg}ÕgkÖ·O`uçÒÁy«ßÏ{Çy/o×2°Í>¹®Ñ. #½ƒ+vöÉ5k‡ÝÑe¯ÕÎ/òþøaër“϶-®Õãëñ4f>²ÂÇÊÃß´r=§ÕmwwÖ896å0¬>[¦lIÉ¡W…npÒñiu£×Æ1;lS˜FõÙº&yŸ óü·êæè³î²€ò©`ÃÞú&»?èWX«Ýž\L–»úÃá…ϬkÃ…ëêãìtºãîË:£tO¬kŒ½n?oU¿áµÝêµjD¼O¬kˆÕÀp.©ßãX*Ohñ±u Y.Q BWy2¦ñºÕê½j½©>0}ď[Ãz2y`mzbõÁæÏëȶùږcuµ~PC©¬oDÕð³áà¢Æ©Ž­×ª$µú݋:Gõçï«#ÛS«f/ݺȥö.risT³“µaöœ]äR•ƒr½•ê·ÿ"“hw“Éä¦Æ.µ·7v©Î°)gÜ.véJŸsÕEà͊]ª³î6&v©½½±KÛÈúv±K»Ø¥]ìÒ.vé= mIÀÒuˆ]jooìR“cSÃ]ìÒÕf–×#v©½½±Kuvئ0µÇ.m mC±êLpý5»Î ^©åU›ž:±ƒ»éùàÓ³µ÷Ùí*¸–td+¸Ê¨!«k¨†Oê(©Á#ëb®iµÓÇÝ×yotÙÍ{'5ö8ô|˜_ –"ohèy·ßÉϺý¥ä ÖeÞ։t Y×@w1öeãÜÀûÑ%DÙouŒ}ÅskìYXí]„}`¹ÚEØ¿ŸõØ`·yÔ`Rÿ5ôÿoëÏúïmýCõ[ÜÞÂ3³>-n…xõ«&­©ka?]j‚Ü`£ø6W¯5q;ûøš´¢Ê3´‰e´·ý‚»6݊öh²„ém0¬ÇG6˒¼×ÚU·Ÿ½X8δ]›À_}DK¼Ú…‰ђé,Œˆ­Qw©>¢ìüŹykØŸ_äãGÕæÊueÞM<’·7Ùu%Á㚟͛èZm5oØDïÜù%Ù¹ówîüÊ#¾Rîüš;wþΝ?_ÌÚ¹ówîü]ɼ;¿Ü±sçïÜùWȝò-8ôyt»ž¬»sáï\øWă³i¦° çÂ_' y“÷zƒW•g©×}~>Ö öڐ\}ƦŸ[›ÌU]âꞝMFùÁ ¯å~ Ž2óàÕ«a‚ÇõJ Z›ÌRýœ Ï´’XsÅ§Ö5J»¤¶ö|ß11i×ä~ŠUqgUÜYwVÅ7Äêëö˜wwqìL‹WÈ´h´ÌÛχyÞ¿­¥½ü¶>+»Ï·_v½||{˜wn†­þ²Ø…Íqíò[RÝ,œ÷ô·zÇà‘µñδú[¿u/&ã%uÉ ç=°fóÕaGp8^p!ÝT–Žìa½É¤Æգ˼­¥Üa}#Óì“ë5j÷îëK­@¬2\ÿäú´‚%jú6K¯‡u×. ju ÛÎ5ØY¢v–¨%jg‰ÚY¢v–¨Yiag‰º–(kw2–(k–BƒÔεiŠöÎõ®,Që;×í¿.öµc«ãnƒíZTÙÖ÷ë`lYeŒ–ô¼•gjT5ÙUžY— T}DRy¦Æí*Ï\¥ƒ¹v@çÆʽîøq«»Ì!·Á'òª•üvgòæ÷»3ùêhCÎä]5¸ =“WSµ6í\ÞÞJpµ%k~&obœEýU¼a“¼«Wґm¬wM«£·Ï5Ò¼¿»êÌQ¥z•¸]å+*z| Êë<˜¶¥HEõ»¿;ojD½Yßâ«1¢%‡LaD¯×7¢ÁÙÙ(ÃJæz»jÓ8ÇU¦~_,ãNã5ÖVÞboØToÅ-áײ¿S0¯‰‚ÉDt£ò"~ÕíÔ ø³Í×uh²¸ÆÐÎóZs®ýڄŸknx?EÓ×2¬=&«¯Ó²ùEóZCª¡@½ÙXóM²3ßlº¶3ßlŒŒžnù¦Æˆv曫Æ9v曝ùf ¦zg¾Ùê™Ú™o6Ï|s]Íc­èŒÚKlQ×(:àlØj[½ïÝéæñªsï^vÕkœõ'41^ÖɐŸY×£fõêW§­Q~o˜ÿk’÷Û54˜©ÇÖ5ÒþàxÜ×ؾ#lþ´Û«3§…‡Ö5ÔvuCå¦i5í÷^yÕgkW<ŽT±+Y¶+Y¶+Yö^Æx J–Õl¶¦bÙ®`ÙF,kV¿ q<¨¡g 6C9.jõغ¢ô~ @+ {_&±§“á餧YÜF›Rwe‘JMÉô¬£êl–ñ{¥ ȝ͹†)n{Cë m2¸¾‚óá«îð4ïMúÏO–Tðؤ°Á+u3‚k èZ„ Ž+ +‰êÑ©Ñ´¹hçљ3ÜÍõèÀ¶ü>uŠÐ;ýt§Ÿ®Y?­µÍvêNCÝi¨; u 4ÔêãNC½ÂºêÖGV/š²¹:jõ1îTԝŠºSQw*êNEÝ©¨W_E½qç‹Nîö;NUE˜ÐÉ÷ƒþc/Çܳð}¸'0üå㏾¿4x„ùñøÍÅé §»´Ÿwºyÿ,ïu "E¯›ÿû¿òþ§èÏzÿþ_íóüÑKÝ珣Ɲ?ŠÏ^}üфþ÷§ Päààֈð¿ÏÞÀ·oõ§_5ìUC46~þ%jt>fgOà7Ý£¤E‘È{YãBƒ¿G´ç>¨f"á+ü¾&\âç¤q df ÷=ƒm2hŽüËð 5‡¯þ3"ŏð/ý¼8è²n{уOõ£ðG5Y$…¿B7ƒRì*ü5c¢_ö|ó½Ô¼[ÿ5/‡ð#—¢á1¿î¥fP{©ˆû-x$µJ }öOa’nþЇ•Õi<¶`ÆǍøSœ«½ æÍÌý»¯§g/‚ÁFkì1‘󆨌‹†Ê„h<»(´ä¬¼e"ûíª8÷«áä âÄYØß׋ñ˜¶¨©‚Eˆ„º0«ª8{8žÌD´=Kµà¯›§`ö¦&¶øÇ·óÛ9¶Xi¦ƒ£iž7s¼úÌiT<*ÒN•ãé™cYy˄ÏÌÜ|œûÕprUœ9œ¸›Ÿ6žýã½£9UÔL2‘¤'±^)úg’IýA¦qÂàÿÿg­YÞ\†7Sž²¸!š\Ä ÷è|æ ¬=û#L1|Ît÷ðG†,‚>êŸb=šFw„#¸q¢O°qñœ¾qrSSA¥2ÎÒÀ°±¿¢ËŸ ƾ¶Éàï'¶g€–^sáßXÖ±²ÍfÐ-î-oÆ2a™¨ÚÛæ¡MÙ`1ýß`Nn=É[½‡-ù54jÜÔQüÊ ûÙq¯ÛΏۭž~íýa·ó]þƾŒÛ õ}xÆCìÒS:woœèWì½BÓ»ýÖi/¿?év¬¨qã„Ï"¼ûúr0¨ì݂ü0C•Wa¨^ΰÒA™ÀpØO.F(0 JƒÈì_”š’%BÁ&ÕKQd2ü)ÍlèˆeIÙ³­£f:G¨`‘“*Ì~ׯåõŠ$ Ü¥ÊýUvh¤JƉ€—ñDH⺺ƒ±‚S$V\Êޒ˜Ó~OÙóÎÃûé/±-õ|,áÝAgà²éÿ.<¦åbf¯N+‹\6~̐ÇGÀ>äœ&²iæ…Xö—a‰ŠìGv >;VŽ}EÑdAo£åcËÇ-sœÇ<1£d搁GæCLpØ¢‘'™º(:ÊôD/TýOJCÖ¢ð‹Hiœ³ì—?OM¥þ‘Û!q;¢ÈŽƒþòeÃÙcÈk($âb ½aŽlÁ£%#”v„ÒŽfŠþ.\ª8ÂømǗLOT_²d|1­JF«’ÑbŒƒïpUŠÂªTÅ„,š(,Ê©'JFÄ퀸OdGAßíšsw™˜·ËÄÜ]6gDҎHÚѼÐßw¹ÅÒ=&æí1±t•/²KÛeÆíº‹üßw¸üXaºDñÁKFÅ +³5õÄì`¸ 7C‰ÌìŸw»òؼÄæí$6o'•Eš¡ý¦a'Ãþy—KŽÍÝBlÞbs·PÙP•]à_f% ú‹Ã!V÷N–˜‘JæÅ +U³£¡'fæÅü03\bÒ¬&iÖVLÞ雊˜JÉn™ŠX6i†be];öÏ;\bï{NBE`öŒš猥Ø1P^XƙhÆÚiäÁ /[¸-æÅDFš  Å“íŸdîdcî/·íÁèeM& ½4¼žê‘UŒPW¹(ÑUH‰™7j‰ò1u0U”•YB3 +Õ%meڜµÎÇ;# ÍÃ˳™¹,WéQ›èŸøÚ¨ôÃÁegðª_ªÐ[3¿ÑëW6ögÍ,‘BÏZÐ/fAG´—4~ai“ÉD‰FÚL¤Tà&°jA€´ó’©Þ£ÚƒG…êsÚIÝC’ƒ¾.„9lôÆÌ6rý"Xómÿ3ˆÆH "ᝦÝÁBëž>T¤²d©u¯àolÜú~0~’·Îæ v¡¢¡ÿ$qʚIœÀn‹³(™Ý$wÜ·|äéÙ`xa~£eªWqgpšŸÜyè>ßôòÿöâj†×>ë6ÅW1À¦OhKKóú k ’Yâ`z™˜Fª™àÐÝÁÂEëð(®ƒZ°+Ï-ÐÔ¯³Ä¯u‡ +žäf… +»2¨Óé=^†Ù­E  +¡¥±&n…ù‘MÓ¨ªÅfÁ2±çÃì9µûþ>ð4á‹þã Ì¢¿hñܧ"ý*¥Ácx–Ô}×~•w 9õw¸ì6a•Mø§¹gðŽREJÁÊMepÖNoî  +YÐ ›˜b#3¼¦pj ¨8ËЦYÞ _\Ê,Óṯã†=ͱæp±if°YÍò˙·’{¶/Tóø“‘`âO"ä…l.§"áx¡yaÍwíWy—S¯¹ö¼p‰ƒ~j‡‡ªå;q|ï ÚeÌî2°ŒÐ~g~çE ã`Ë^ÙSGK<ܸ +¢·ö‡ê|Ü}÷çó¼=6 +ŠÑ„^8½J4S¥Ìý‰Àagÿ|u­]]›´_äýiEm*K/$t½2‘ +ÓdI¤Rðz&*’),¯4M¸*ss.ô´Æ`ÁmFR&hW€¯RóÇ ž5ãˆa\‹Šb­½óÄÖLSó‰$QtäAŒ7cž²Âôªq,Š õa¨w7g¨ì'M+ƒ×Ò¦R‰0 =ʤ~"fÍ,Q&øÇ4š…ž#+ù^µ7ݙ½éÃ)S2®½pèø}š6{!åöBª³†ï\÷côÝ¡Xë~5?é¡&JB$‹Å +lTNžÐÇ ýîP ô»oï‘Á—⛂NøÞ˜å@ýÇôÒ[¸4Á•„0-œó8‰ ™yБqÕL£ MU3O&%}KɅá䚆úø“%€pŽæAñÑì»L°Yðú½À!bpö1ÿòéïE¤šüº·@× ;5ö+͔‚§yæ§vàØóØÌ·¦qF =˜ÃŒ¥}vkHkJ.ƒsbö›t]ò(¦°ûW8»å܁% ‘6„¦„dcª1] SÜÝnÿEkr6zÕz^Îá?sgz‡5ВÅÜBŽ˜±9EÜ-eýbÓëVÅLÀÒH5“@û>ô/ËD,€Ë¤ VZ¤wWš¥’"“n2ŒÛ=Àטæ-Qj¤0êP¿Or8cÌw®¿k£ßã#Hcc±3=$ÐQJŒ‘Ž`Œ+䢑H ûÉ$¶ú­"ÕlN´&k€„ç½!’¡‘>n&)°|îÅRâÎbDIÃ¥áòÓ½J >R,ó2ún3á;`aÀQè;@Ÿ[šgH‹>蝘¥*ƱÂÈêC–øJÒw ¼í‹…ؾê)b ¥¯1¾W†º L/=mÖRaa6ÀÁ_§°$¢4Š,çÔºa$t¿õ¹‘Jn@8_©ñ¼Ò£% ‡ÍpÑDÃã8qMõ;4MT +1Ÿþij*‘šº'#P§bÉ @ÿ,²j½n5ÛÒk9¿oI-JÞäJÅÈ#,è7=Z"læ%``Q‡Cq0Øzu¸Öõâçi\سÁKf°yŸ’V­Í>Ö¿€\ƒïáö=ʊ?ô„†Þ•ZäJüw;ÕM Ié5î4=˜—ØïmTB”fZ®…Öé’D3‚Á[D±8¨ŸSC1 +ª~^Épxúé,ŽÜSúOª'ŒpÒW÷VØ~ÑӶ߻—n‡Ç¼…Ä _BOÓW‡öíô´í[±ïf<óS݊ ِZ$S±„c•ËU%#~=ŽÕ{ÝÞEy +KáX­~H¢S‹ª Ïø›Ùsýã­ vÀàC¬2Ãì³e°àÙ3«ÓÁ։²]÷E۔`…>*}–€èÉV|aí¢ÜnÁu ª”1 ö€}°È,7ÌèÑ0VÒFèõc r½ bcîU³3(ÿ¨·C@°e4#eƅî)ÈL„îb +hЃžÉ° Zõfv^ïö,IÓbïÁ¼†(ÿhÖdJ©8@B\ï=Ð÷¾´ójÑ»is½§œºθ”{ÔÜbnÆghfíBB7 +Ò2šÁ +Ͷ…Œ‚`B‰)›í³bʦ±©ùgeS³Àp%GJ (Àp¨µ£†ëAHH×א’nHîY?l‹>8JÎPŒ,lúô«…” vÑ7YJ»Ìn ݑTLí)؋à",PRÌb,` Q»àñ‡GK ˆ#“nÑ;Š¸^8õ·À‰hXž¹¡' +žMSíˆì»iA]a8V͋X*r0à92+PRó!›øP¬²q¼ÁËã4ØàQ2zJ€0Tž¨á{PÒu7 ¤Áü¨ îð;Qq†Zäی³dŠˆ! ‡)5ÒLŸìL$E.)ôiqU a¬‡Å ãf" íסD@óô a0D‡™hà^Ïu3 ž Áüh æð;o†J†x©æXà# ^æWE¤-KÒñ”‰i§å6®Âc4i¦2ÒcD;ó´ a0B‡™H@oHç:Î„`~¬qøH7C#{V3ãuIÂp€ŒùÃßl^¦Ó´x €ŸAˆ"íàýqÈ.¡ƒIÐ.í<ÌÓ.„Áf¢{}¸i©›ñÜX܃n´sðˆ7C%ï©Adú/“©*Ȍ™DS+I x•5µd‘z‘‘¾‡#ÁBÑ?g…>Ùèõ¡¸ˆJY¢ +Ò"ü5úžE ¾e)|?Q‘@¡¤èŸ#8Ì€¯?(¡’%‰9!ñæ†H2”#‚´Bâ‘@Ä6÷ v3Bâ9X@¼f†H¨èý!ñl7CâÑPÜsŽ„98âMSiJ ‰G07D›H¸ +©GRXH=’Õ܃V˜s˜í÷v +HçAf|„ÖQ€ÞRŽú’ŽâtÃ'ÔÀ‘nšFSÂ_aÓZ˜ßZö˜ö›ÏJR!éHä +IG‚™{D7‡š!ñ, ^3c$Ԏ +ôþ®µý,l[;¿m‰nÛz€ß¶St*J{õ¸£•!ÉED’Ò9+ “Äæd5Bìé<̓.„áøj¢€{@:êf@9 ¸'$â ¾Ù¦éS愈Gž„¦€j$[D#ù‹@$ŸVúṔ<ÁŽ‹°Ò¸éŵ¨{µhrƒ¶XƒïD­iº幀Z¢q¥î 0ã&9) –•¦b‘ÀE È)}ˆå@žX‡EXiØö½­¨s­RÏêä†l‘߉VÓT) +p­DÃ"‘ÇíG+´"é) IXî)+9¬ö{@,òÄ +@ƨl±Ò¸éÅá>´Ý ¨E#pOÑ  «ÿNԚ¦ËÑòÄ÷럍¬ÿúi£þóKƒkU,šã§udš«øiS%ÞÚMk]Iô¿ÿñßßöÇÿ(þ>íþ³ûûOÉúw³úæÿ¸êvÎÐrg¨ñƒ–:i¦ÀÕÝ4Ös9í¨1àU\5æÉg͸Ž»uؘ¯ä²)£!bì›#Š|r)ž\ÏèÍÑO—ùs¦À5<:úÉ2ŸŽ¯êÕÁGgý:Sàž܌o¡+ywÊh¸pJÝ>Sà:Žýh™ëÁ«8ðÁ÷OZÄ#›u!x%'P¼Ì;4®ãҏ–yˆ¼šõMkø‰pt³ž"¯ä+*£âB¢—9‘ŠÐên$ý‚2G€Wt%Á£%Τ)p w’f¨%%ð +.¥ê-¤u™¯©­îm‚TÝYTYZÅãÏÍúœŠÐÊ^'Ò¬ß  +xžJ¨¶Æe.©"´ºS +…fÜR\Å1‘K³®©"´ªs +4ëžè +ªš-–LJ¶ºU’’ D^ÁýHÈ +¯æ‚ Äà…WsÃyѸ@à\q³ôª$ˆ»‚—΋ÄÚ®à©ó‚o®+xë¼,\ ê +»Y:U’ƒ D]Á™çdàMWpèyI·@ÓúN=/üHº‚co–J•ßIWðùy¡·@Óü~^´-Ðtߟ—v D]Áÿ7K§…D_«ðÃ$A¤KrGWʈþn˜wºã­á8//32gñ+Ž`± SËÀ~<2Ւx–™kâ°#~1·µáG}êšÚ +æ«þ¦Oaúns°á“Ch?pnª%q ÎÀGXåˆ~ 2˜Lu£àÅ؞Ñ'ÂŒÄðÀÌ@- “É0›_êÏí_0è$ðÜccÇýÏ{ÁS{¶Í +œýê2ËMSÓù úšXâ7ö JÄ,3‹ƒky)Æ¢™Å҄@,Ö/1®//€q`»‰ÙÞX>ФªihÛ":”‚WsWÇJï= ¶³;›K,m‚¢3è" b4©Ûw‚F¦Ê!¾ D?Mß™G¡8‹¡ +U$µ#QA_S[9© æŸÄòFÐû(\‘05Ý”A2uz¨gA»©ÎVÙfªëm •B"(9#TILI¯äšàz<¸üá²pýmiUüú7ßuCâÄvb¦2§¹¸ÀÌZ|æþó^Øh/N›Šá·=7@Îl”Fq…Ï&^?b#ðã˄5ð6KOn?ÕXä‰FŸíÃø,àMé^_ûrÓ)ß×(å |­°næÍÁx\ühûãúyN|d)‹Xá«*ô‰ˆpà:tô..ò'u·Ù'>̀\*Ó tú*_9¯­bӗt,Ä;}ï\¼\,¿Ð7¤àE‘¸!у¹f(˜º€úD|šj·‚•85;á¼:xWöòhúÒÜ4‹ -eaŽ@*Æû Ë[«lö2•…¸÷«ãærú3š‡‹`§í¹­la¿°÷üʞސáVµÓwPØÙá†ß Á<ú³ZôO5ûgQýmEÀy­URNÿ¹¸÷«ãž¦ÿ[V†òbºs¸¡Ì¬ãš·e 9–ùLÜeqGÃÿÒu­Æú$³*˜ò¼îĝøÂIxá §™ÇX„årŸÑv̇#÷jF’yÑ B!ˆÕšá· ª©› WÁm +ØãŒÄY»ÐH¹ôîˆzÑ é´UÜUzÞ³hð&3DãfN=cdG£Ô‡„¤÷йM=Ž¬É%q24ó¥ìv(ïLëI҂…—œ”ëÐÒêù©53Kj•]>nõ„“.†`Èíw¥OMIÑ`Š+‘æ¡øXYË$­ ÇÎéٟƒsZ‚g—£4’DÕøzˆªÇ}@ÌÔÉwÿû+ԁÖ"#œÏZP´Õ‚Ò&3t^f …§Æ, g±)Á­3¾IƤ•W™ľFW +oäQZ&‡1Mà+ÑòI–è“@Œ] .Y€ZqZ\S,6‚¯þÌ´œ|A "ÒtO@ÖÜJ_*Ž¸œÍ[á© |«ZÏÓŽ¹€DwW/W N&ž2Ó%¨(ãIEÌÔÌTœ˜jÔ AEš0Ó•z$•eüd…ìŸòâ‡6mò‘L©9Á[3;o]aæ0²nfîLøZíÙӏ•ÌF$­0ƒ&èqzmÍÇÚ³XB5ĆªÌfBÌlÝ8 æë­f)źôb«„„ z ¸}Ì3é&b qªéJÿ›&1ÈXx•Œ hí|à™arn,?„~yåŠ~¯œl2ô÷À,è5Gʈ0ÕÌb¼~¯lÀ[ey†* ܏Ì^À‚W œd­ÅprÇq„·E¸~46ðÓéƒL +.Rû O´¾&Àµka•)ô A`¼^•Á÷SÔ>ñ¦ˆ³ f(Á…ªU&ó§{Î9£J!Ä!ô[`ÿ¡ˆIsێ^‡œá®1Š"D’J¸¬ûÀè¨i‚òŽ^È0F:ӝHšú`¥nT#üo±‰D…\y½càšíÁýzƒ“ë,•M‘$x¡”é7Ñ*v„)MÆç®!Œ¥ >nÓd4›^S¡UmØdXR#Ka?3=£Lá•øœ âÖx״řñÙèµ%%¤8Äx€~rєŒñØM +}GmTë1±Ár‡kG8– e°³Sa/Z@ÙìoÆЪ0h7p7‘¹uM€¨ ×rÈØT”Õ,ËØKÐa OaMT.MPy^a俞†w|›P¼†1åTŒÖºŠa¶˜0°ÄpF`IÌÏÌÌì”Ìh(\j§gAÝÑj—Ú ¼d}ö ›£ÛK͌5 +ânUC@0¯4wgqyM‚ž¶Nrݱ|O*Uî£{£g5ÆéBoܵ±U…ÐõÀí‡4$ã-<øݘñ^ ÷”©ù΅mLx ±Øìw0ÑÛy¸œ §Â啕 Ðrã2S¿ë~ ûŒÔôxøE«zayâÑâÛÓ=s%¿7HN¥ÞÍÓ¾d å›ÙH;RïaÒr‰2?b!âY} /¤L—=šdx¥Ê´ŠVã½Ó:[µ÷–Þx:í¯,¬’‹à»[F…E®À’êV/~.®ë’—Ád×_É*Å%ù.\hDû¸„€©£½(™s(à ™Á‹MTéœ×x^é½¥sn½axC1/K0>^ Z²²ÓèvUX?Y”•,š–‹Òm™ùëŠéPðЙ}U\ò*zòb7|Mgñ–€‚‡Þ©ÏM‹]xQþYîvå×èŠ×§ùëñi>Ì»íó“{ƒ“Ñ<‡ÜÔ9Ò$a¨h¤ g´ôk5C`*EÊc-'>»3ïHƒ5‹5š=Y\K‰|«0ºoGôm¾–|£/#³“àÕÀ S½-^}¬À¹,èðöߎèÛ}-ùF_Fïn2¸ÂR ex•e#ƒ #L'O£·îõ÷·Iã^ëå`ØçýÆy·ÿÛäìßÿ]r#凱±A.@ÂáRQz«5²Á5|‘Í‹`梙™ÛÿÀD‚IZ²i°Y3a)ÅGË1R$8ie2µgÞÇ5M*8 )æaC|$7BÆIfœ¿ U+ ´h%è½Ü@Œš-ÁF#=ŒÐ4ӚºH"sO#g&³ÏÔ/H›¨„´%T¿½ª4lé"Nƒ +²-àw÷.Tü×·QË3·TºFRÏ\ÊýÐ\l‘ñÀtÕ‰Lú¯Öĕ§$̋ÄpxKo#,MŒ ÿN–L˜4WüŦŠŠŒDŠ²±‰rÍt€vVìŽRÌÐÓ:¤q2Ã}›¨i0GNcôÅ+™BÑfî5A›(ñïbû£¿÷ÀÄÀPß3Fã‚6´C‡GÆw‚3¢ +“0‘1¨“ {°\$Wk˜ˆáX“ ­)(Ì ÚX•Ð¤…,Ö$aæ¶^˜`´sЂÐsÀEÒÆ vÛ ™ß=!ò‹2x¬f¤tÐ N_¦|¿ñ^VÛ'6&K _"õ ©´s¿ïbœ¨n‡Æäd‡g÷Æòn6AIó ˜8E0fê&,ˆix§bÂÁ¾¶L ™>‰Þ"Bj[jqH cށ"sã7ú÷ef¯s$Þ¦,Ë8^/™² ä:0Æx vv†¸ÓÁ\ãö“R^Æǹ>Kø€Wäh¦3+ñ4“Þ¾W éò5H—œálW—·éu%[‰¿é£¹„Ãh}‡ÏÍp9 -ásZ|^‰ÓéçJxb[ÛAÎÎ*üÓ6Wâx˜”¾ +Ï3ë}®g6ÙJ|Ü<%œÀ«ð>Èf®Ëý ¯u†ÿì;ÃÁw³ĄJï-Iœ·ÄZöðò¬,5…F™Ó¥&`êŒ)ãG =و kÀ NÅJaôè‘LÑB]‰8|´„4T‰ =Ŏ”€‚qfaÊfAA/¦Çy´àÔ(¡‰†°™­StñÐàeÆ#7M›tß#(äðÝ*/¡“úTB«pu-³º'à`ÊBï$E«»âøZ.ø2(|`£;Ö=ù~Ð<ìöǺß{{Žz^øËÇ}‰¿¥æ·Ç½‰þ÷Ñé¯Z=֚ ¦,7ö‡“Ñyãa«ßzž†0Ú/ù±a~=hõzÝçÃÖåy·m›>Ք¸Õx2éw{¸ñxܼ5ÓøӆîñÍòG´†XúÌTë{G¯Õ>×Éð½Jõ5Ï |78ïå£q÷lLí:û6*4m˵ZÜžS[;_%x Žï†yw”ßú´Ñ´äÖST$ö{˜¸ÎþT×af‚ÎÃW(ð óÿ¸;œêoqã΃“ý¡^нQuOõ¶:98Ö-““{½ÖøÄ îñ@wêÃmμÈî…s¦?š¸º ÿgÿ»¸Ã+¾¼°HÍËõgüŸù¿·œ¿×Äþýq#.¼½Òðßõ|•í9\n×Á7ÍäzP·ô_ Ø­†M5ñ¶#æ>EàŸøÃ™·Ý?u[†ó}þŠZ7Xñk<óþ ÛPè#X™½RêoâYªEZnhÍ¥Å{˜ÚÌü¦gñxüFOØÇÝú®?xÕÇopÐÞ¼Ó{3µNîÚ¸õ½ž@8®nÝÑgñËÜ5ºu0¸¸èz¯ÛÓCÆçÎ[Ý~Ã41`ãiºeÛ|ý­»£®>.i ’ãq«ý¢’ýÖ¨Û.`^äuPpü©÷hh¬¡ð¡É0?ÉÛ}$vðWÓÐR£QÃJBá­Ãü¬q»ññG›.” n7ðå -4n=n Ç¥£<ô;“î¸Ú£‚±×¢øBÚ8 é‡Q~÷eÞÔ1•Å‘ÄžbÜBûtvÕ7~fMe=mæ“çD{ƒŒUŠJÚ/ËZögh:E{ק”_¹àHRAÈI +‘CúƒTÌܐ›hÕMóZ9ÇÛsÓL0–ֵѯF£ÅÛïåú {g»…øVØ{Á˜<Š…ƒÒÏÜ}·'Ðó#¢(a™¨½l·|'=™žas’Zîùèìl”?Åy™‹âæƒ^o‚úÕ`ØÌ_C%sºÁ­)DF-RôǓáË|8jŸwóS-è~Ñ8҄ݻ{v–¿Ðï¸õ´;^‘‡ß|4´ÊDˆvG—½ÖóõÓ÷ÎèÝÖ7?º=è›NUfG›»»ÞÏéö^øÚxþ<ëڇ?ö¶amëkS &¹«ãîÅeÏVVØHÓ"-~e, Ô³•×ßc½ Ǖº'¯p÷о;éw'ýî¤ßôïR»{‘W;`'Lbê½båGÇÀÛ8 ûš×¿“£ãnûEÞo´N‡qÞOŠÅ“Ú,–ܸ 7!:~2Z°v¶Êkk«|Ší¬g•YRºrõnoâF+ŠDúé\Fh%§`gPÒcúï°Ÿ›ƒ3¼éuñ©‰-Aoj›­îeù©ùä¤äïZýq^ý̄Ô_™Ò™ùdٙy}yY¶ãe;^¶•òȕâF)+Øq£¹Üh¿×šè‘|ŸúÃÖùE¾!NÊ«À–0#3摹Ê)®2›~ëÓ1•äpI“w¶Ïäe2=ñ ó2Y’“ÉÞK[…d”(ÈæmrÅӄc¾5‹2̯„:!ÌÔ1Æ0( Tœq–, ÛVB%I×hè5%¥b©]J±&AT’©Oeði… @ò6H¥ ®›¦àxKˆ5bÊ3, >`]@ ¨‰µ•JU§ ££LQÝM0û£7"—reÄ»$Ë{1®o{ƉŒ1lZÆx£7”‘0¿›§é®¡ßCð&_@é÷ºß³à¢üþD—­]@2‰Ó IÅPÕnMsÞÁ­˜L%æ6Ì*öÍ_:ÉF/.wk§öÚ"MáäãnŽ$Á BìXOØأ段Ùëæƒ,›%`癨£?«ä]"ÄΘ÷~¸ÌJÓ ýAà½â ž4á¾íË´œÚŒ³èúeAD,ÉP‘Ž2ndö,K$·ñ±ÍT+Ú ë +xn®‡<ê¶Ïa(çÃÁÅfòÉ«‚¶81t‰¹}ÎcóMïßÙκùe·?Ê{okQâ{ÿy/’÷Z°ž( +ÒXêñÇ[î/Ä[xî0¿Ô‹tôÈü$é±Ã®î3Ò3D†Eý|d,ÿYñ%†‰Ütúë½|¿hLe7–ÑúV˜r —7ᏈuÕ­úÝö “×1}R£Ú䂊,Ã}__ú¦‰[>-ŽÈÅ©™„òÇ yñé+¢yØ˘>´ê±FC…„ˇ´Ö©²L*ü #cì)˜žAµæúé‹–¡LUºÚ"ü€öE³ßM6¤kŸ/ã§AÓù<ôñY«ÓpÁëu‚¡P9\çc÷Ñàl4F’‚\ôºŸÚÙǽôk|Ycûì“Ïá[}˜Ø}i/ò\°WㄧÉîÈXåÈàè×ü GÆv%8ÔWÅ ‚9/«`E‹k˜›zÞW9ہO՗ß-¢¿ˆìÝs½†äz²¶¶`þãôOÿµ7·ÏsÍYú Ë´&ÿþ¯¼ˆ4hÚYЗؿ®_¸ᰏ&ðý~oðj™Ju8\6ŽÏ[Á«ùjTqý=ŽU­Ä6"Ûd”?>>ÚïM†séuî:ySú¨Ý³ªÔ$$m÷²Õ.šøN©¯¤ížöúfÎYBJÜ7î¾¾li¦ºŸŸ †yãG­“qÎç+Ó{­ç£ö9Ô¦ÛÅÿîøð6óျ¾+F\ÜÿpMei†Ñ4T€[cЈüñ’ÀVgxb¥ÜcNxlv‡bNE¤?ãé’ôWLg¶=w +ž[³ŒµÄ†³—ÍæñpõvÀ%½{™_pjمƦf–.Š¨¢§Ì$!jô†ÌzWpܨš:R¢ÄáŽX»cõF Ȝ) ‘=…R†y*}˜%f—*†û6Ñò$ò0N=f´é"—d#cdÔ´Õ¬û¥øÏ$“b~¹ãgú²¿t/. ´e)Û°ðð£aû¼ÛÉó +»¦‰àûçˆìx _0¬€Ê6œ‹èþ ×1±%KQ¹¦Ùüàõ©›–ö©Eµÿ§Ÿ³méx¼yؚŒÆ“3°È°Æãç53s GŽI. CH’9¼Ö¼2†¢+ù@œ‡UHI& «‹M¼æ È6¤V­pûÿ“Ð"‹Þ&ýq‘ÈXá%µê§¶>¨1TO³8Ó½˜z5ýÁâU¸™AGP+ÖüEɀ§À‡H)ÄÇõ™Ž‡¥pÿ/Hð/pIÏË´|!ðx6•ÉðC¤¤•/¨sÓ7GŒ*—þ×s®™9ŽW¨Ô°W},IsªkÑFÙ.)—æ`“ñôq©UKäÕ\+†‰²ôìeFQǦ?ReÎ`”\”ç_úèJ°‡ d?…dlÕíÔýŸK$P€ã@ÿë¬TÈÌ\ñÀb\ZW‰U¹¨GÓœ¬¡žK›‡šàje¯PµDAHÀTëýü)?=k OÃh—¸fù‚’@IÅ +ý¬ &±“ôy `êS$RdÁ ƒb•• Ü uKÇm(¨@jÓCñXÒ¤Jbk)™«LKY¢L›ž˜iÍ`z¹ÅÂà>R :‘ÁÂa\qؽW•É]‰¹‚ôN#žš[Ý)׳ØŽ«WùmÆ5/¸Ð¸2c‰J¬ðHi£˜KôI3¿äá{¼ïíoÎÊVï +¡£îh\´EÎZÎ|\V©f&¹äcŸ÷qxKѬMÑôhÅ ’X^¢¨þÃô¾ÕŸõþý¿ô0N/ÍÝxO[§G¹n‘ïéOš¿ŸæC¨itroðb2àãÁå—åXÀѼê;À~1*gy¯stìæ@­½ÂÏèÙÖxr1¦ôô½n‰õä u<ÑÍûö:«Nwü¢5ãVw»ý­ÉÙèUë¹ùýñ£c¶÷ôÎñÓ»ðmþÝñÐã T]ýtæÖBK®¤·‹çpОèYëþ·ðÂG€Å¾N]þxëÙãï|ÎÏ·7__ôúºÁž^pÃîédì.c¼ug8l}P4ïè-A;-j©+ïOÝ/I?Ã?cµäÍ?ôG'/[ÃÑí æyØöe«7qá‡Ñœ†4eÛÙތŠ_7žT§Ý~G›U¡”&éq>þiR\aóϯÄ`ûƒþ¼®ÚèíÝ©4Hjú.ÅÛ‚-&Dµ¹î½®•vF•Ù]ûä×g +_¼¬Î íÕXä0ζVW€ý½×%úŨž^8C5£©¾R?ľ9†›A®V¶k+Î^]õ½œ|÷~oÍ܋ÈÅ Íñ«n2+L¹my%·H8d &K‡§õÈç畸‹kz%(—íuµzE´'RµtHo* éÍ’‹¯›;žÓÁX‹GùÙøÑ°«5ÙJÛ}èÊHȏ“a;߇ÈÝ«!FèÓíJôã"·:Z¾zÉÞº3Ÿt¬‘¤Òš Z#ȝû½<ïÀZü1@N‰·ÃÁåaÞ2Ñáe'þôžTà ÆÿãA·?ÆÝ|2éåÂ÷齘Ðü"_õàþ†5ÀûÖ¾×ÀOgAš4£±<¾ó„¸+ã=øÇ÷âIÞ{:xb:`zôx0êBçñgî:UˆM3Š£;Ãñé 5ìæg­I/Tøýš 6HH¢ê4%cw@\¶:O2ó¢ ¬¶^„.ãiX«×%¢ˆÛu.»M:f)¤x`£vMÿ4îLƃƓÖhœ»¿åÓXï<`¬A+ªñ¢¯ÕþÁdÜx>L.·íŽ½Ö8oœBð+å¯ZgËÖe>lŒº“žÏ÷ûš´,ºãê9Œ‡­þè²¥7\ûîW·£ñ¹qH.x:[ƒëÞM*·}>ÌÝ®^Úxè¬#‰”°Iæ5ea–¶ û°´±ïKâ4vMÉèzÐê¿lŽ=¹Xa*óQ>|™7À²Ý¸ÛéŽ[§Ý^wL ùæì^ÅçœMW+_“Ëƽ:ôD#Âq#ÜÐ>Fð0»µˆ+¢ñ$×ëh,Ž8*<òh2¾Ô rÉC¯˜ÙµúÏ'­çyãñàÒ­j¿~¿78mõžä—“ÞÈ#,rÕ§ƒË)¦üødÑðgZÞ/î>¼X5ù +Sîí¨qæfRó€^·Ÿ7Æze”¬²¦#̎ÍlqÆOŽ5;;€5ûpÐqjLñ¬Çºƒ—9žL÷õ?¹× †÷ƒÀý2šnû—^ƒþ_B@¦s›Ãùx÷õØŸñܦy¯ìHq°2¹ëÈfŽïR"Ð]¬ÛÂn:ؔÿ9iÁŒ6Žò—¾b:».[m¿€Í̙hü$ïL-ÂéVšGøEÂfąéæÇíV¯ìJ‚EÕꏻ =¬ÖÈQ?Kق^îûíǐžß´°°æ´{¨wKf¨@˘«D-Z՞šK›CJ¡Æ=.%î¸ådZ6óîÝü•^BZl·úm¿5-ž{­vî ç,jÛbºù|rbóÙ¥)çЛ/_œØ, å"²cÛpyÜd¢5£@.×LõޤףƦ/é_ç SúÞqÞûKk¬×ȇGÉqNÛ£Þ2pªZ‡-ž‚-^]zBí£šQ¸ TVaAÁ”?îµú¹>ÃU5Þ®=f`áYkrZ)]ñ+<è"úüõ½îp´¬‹ÓÏçíAŸÖ‘ʤÞj1KªSXzû§‰Ò8€ÄËpX١ߝëåÒ·ú–GØ3Ï3X*ͳÇRq¢ýå3†a=•é1ÍP2Òº_-Ç`«ˆá**%'óReA.:žœêöÞ ?=ÎY"GMÉ;í^÷RKàà¡y­%ðçz³;½ÌKë…G†(¼î½Ô=Ör»–6f;ï5—$œCüÇ%[¸·(VqucÀ[-.·Èg×ÖmxØ'RNñ¾™DK/irâüàXíÏóNwrÈö¿|äȆÖf)EaT_"î€áõӐވñæóÀÎç“Â|δ}deÝガÍköÔKÏáÒÀ6F¡¹õ£YûÓk¢ÐöÑôXN,Ö¸ûø¸µ õ2rœée/'X±ÝŠ™FIf1Nӌ…†‰þÀï«F·ûÌAÎ2¶d){ZßòÞ[¿N›—ZÑj…sºc3íàÕ­^oI³Ñ‹îå©è‹)n<Ýn˜C¡Êº8\Ò´=èõ<›.Qò§ »CaÑ3ãÑÚ€âßNôύ@bYFqˆ¸÷S~zëÇn'Üz8ÐçÎ/‹GÃÍuÑÐ8ÓýѸ×ì[ŽÂr ‰à9û@`©­òÐeçBÿÜëWï×e§:z,á)[——CÛnA ‘í ñ™lºš›ÓMCçc*X3×°àÅ˚j.Æî…ÞT͞>ŠHçhfKÎГʥ¨‡AGÒH6½K¯¼½ñûÐTN†íóÆÓaÞ=՜VSªÛïb9ˆE3Èún<ûÂö49ç·*Ðr²AhPX€nºÝÌ¢Àfh›]Ân:ù¨û¼šù"ÞqjU qbK´{Ui؝vÇ­Ëê¯81³cï ›ޔ5¯‰Ö* ,ó šºÃHóú6ñzÅK›;ÍÁŠÝ…4×òLŸÖ®ìZ=K›]Z_È…/~Þ\¼m# + äîéf#°9lK¾\2ÒQû²×~³€™FíþŒ~8Ýh¬u™ÐŸ1g”zÊz­Ë +ä°  àòùŋfÞ-~!»†f#WhdéZÆö†¿›¥ÊCzŒ¡(un+c‰ÐVs<Þ¦UyçOÁ±¬Q{8¸\Ö䬮–!–µ m¤ùԒ½bÞ 6êÓÖp´hJý04 ¥ +­ÇḖ5¥òóšC¥“ÑTO*´ö=©Ð8ìIÙÎ:돛ÞŽh]Ïý…ìڍ´Vî ôe³5ÒÃõÖîR¡eÔ<í‚4¹hÒGÍ~þ¼xÄç´jÏuÈÌ4ÔçR ¶k£+†XÎùtÃÑyK‹óù"jA«| fWß_ª¡qµlÏ,;3 +ŠIÎ^h_ÊF è'£üpÐFŸB¹b‡ž UûÐ,$½sþq÷uÞ{œ¡*\È@È÷ol_÷©²33ñ #ÌSG`Lº34OaxÃÌSÅw£Q헙Ç*¼­~€B`$;n½Ìjí»{ÙËïLV–ÚMþ¿ÿûÿüÿ¯Å[¢ÛÑéS·=<þkÁÚ´íځûš¦ÿAÿE²Ãy·uÿÞÛûQë­ÓÄÊÁåؘ ‹¶Ýo§Gæ§ÐJ© *P` ›Îù[û]¢ÀãƒRy˜ÃhñWñçGøù³/úꏷ[Ï>ÿ6þã½ýo†÷/οxÞÿÝ·÷~÷ùÍ?t[ÍÑï“þr7ùä‹o~¸ÿõCñç/ŽþþÇ‡ß 'muï.˜Þ`B|E£Ã_Ÿýþ›Ûÿhþé›/?¿}3úŽßÒ¯ùæöÑï†ÔêÛñþó¿üçÑ7_Šüø ûÕ×íÃfóÏgÞuÔù«~¡:¼wã õ·ûãÃ_ÙÛûüÎÅàh¤ç}|þÙ×É'“{‡â÷?íÿÚûãOú5‡gÑ·§¥Ø~¯²3õãþü÷;Oš?ÎkØî‹_¾ùòŽ_¾ùbÔ¼øìðó“{7ïwÎôk^÷þyòhrxöËOj¿÷MïÙgûçãƒsõ7V È?ÿpØfGÿúæË?ÿñ'ƒHwztðçÿèOø×áƒÎƒßí勵þþÎñÞ'}Ӊg­ÎD¿&ûõægí»mùŸ7ÎÅÉí/ï܈ÿðÙþ÷Ÿÿó³oþøýƒ|ò§¯üö“óÛívë|ê~v÷ìèܼšE·ZjØýý?¿èþãÛÎ~ïƟÿ¸7üìï“;GÇø àÓon{ë×$·üå›;ýö/>ûêáí[êâï_u•º5:‹ï ÛØg/¾`eûðÛяšrꏹú)Ž:_tnµô$³‡_ÝÜû<ßï©Çf =ºñÍÁƒ/?ùéî癄Š‡‡~N>ùZ þñٗ?v~þ‚Ÿ~ò âýºCéëäOŸÀ´üœü”ügHõõþ‹O“=»@ìEì—OÞj}ù‡{¿ûìoCxM?ü±`ýšèôÿx ðËg_ßûÒ~úò§»ß™öŸßý§ÁÆÿÊèü,úìë¯ï~Îÿüü+‹è§¯¾¼Ýùõûàlºk|ö%½F·ÚÿÖuáßvó«'Ð*“¿Û?e‚Îú+’=.OñՁ°æܓ-ó{šÿe֛×mºóÝ3; `—wl_¼¤É¦[_ßfð³S&h¯~ӢӚû2ƒ`¼ÛoJ$æ_{EF¢ •ŽL-Ÿ{PÞOr3ÿ÷[ºûôyä¿gJ·:ÃuøwíŒ#éƝ  ÷¶LÄ3+Ë<LÔZ¶)Np¶`¢ÛCÌÎyËóþ;yO!C[N¡%à¢}ñBxb•Ž_@~Ïy=L·'å,ý4’ž¤âŬ ¼2yò jÊxçqº}îø¹§èe(ÓÀ7©ÃgÔD-¾Qõx²žÝ„B•©(¯ºI¢bّàŸy†¨xæi¢ÜŽPŸ¨Öd |š2à'ø¢A?B_—O=ȳ0,½ö#êOÏ4Åü Ñppêgð5Ò ÿñüfÑ+šßóø=Ža’-Þäd˜ÀŸZFÿ_ž™&jž¡ÐpÓeÞ¢@®æ¹‹±q#§&‡¦ ÿ´fÚôoÆCaú)K4„‹ÆŽè…à2Ô/Ÿêqê—åÕ0BÀ­Á:C 0kŽ0y`~hh@Ó >gÏ.¿Ï­K Š|,Gð×ã†h4z)M«z±¤}•a<þiP;6z88Í/N0HuøÕà^Akî97››XB2´–E#ÜXÖ^;_h4^}AƒF‚1dvxÀínlˆ[Xh4¥ùÔôFꈃ˜Yןy""ÀÁRffÃÊ +„PtrR€¿o1.a‡XÚܾ¥Ðˆ½Š“–GW±ïŒ[]ä&̒.1)À²§êm$`mDHMìe4°yY†¥órhXB"yÀ‰]F`h¥n úÎ×5méÎkeC¦Ì‹°/¾¼ø¹IoÀ©¼¬’“Z?Jêm®ob1‹†µÂih€ž”[¥Þ Ýeög4Nå?W{ufbºKàԐ6£pÇþ&cFÙrK§5I隍’õ;LyvaH½š-‘ì÷¹5ÈU*û >¥Ìx‘nmrõT{t˜cìÏsÆŽL–è ±ǝr˽@=u?Z‡À~Ýå?w&èð:1“Õ“™-s [¾ˆ©rò9 ¡µ¾÷p›.®±»֑5¹ýƒôüàgέ»ÖzOÁ9p´4EÚ-"¤@i5Š4[DPë„ó£ vžå=Zq–Qxí:éuè>­hu¬WΠ͙O*ߚ¡ÔÁû4kqÚ¿`Ð #ž1ãŠïÐð¨d‚f€Á:Ë4SC[¦ùôqB*8Q.xB"¤ÂM Äý‰`ŕ+ý†¦ÊÑôOoŠ¡_×ÕNºÞ­¶ÛT8)[†"i"´±û Y—CÍÁ)·ØPõ\aõ´û¬‡n•OðÉq*ìg‘ˆ=æáíJØFq3šn¯SvðÛå ñ|¶’uoª«ÐfrǶôZùœÞÁʐý~×GÁ Çc†>\`®JfU³ë§ñågf …öÈ(³ò>ë¹g,ÛÑùߚ€KUæYèÁ Ï¿»Øí"G6™ßœ'Þ§È_˜b.‡Ñ=h¡Ïj9Ól¤^kÿï…ê¹ÿ”n¾´_¡©ÏA½Êîd´â»šmì ¦Mô‘ÈÛÆð¾ÜÉ>ÎÿÉíd±mŒnc`…n¿²?ǟ`îË9ºX~ŸEðx.U^ nSsfû<…le^‰zÂúÒÚoœÒ•¾gÎJèçÊË<7ÿ‹8.´<æ¾ÌI"—-(’:·ú„‹rDPgÖÛs º˜˜4©Š wfíjyÜö†ÓE¢/ÝðG~µÏŒ,ìöÍrÁAã F¤Ï e~æüð5$¿‡Èu@áÕ%àªÚ®Íæ ÷j(îË/ò£úl 4–”=_Öü§xOû-‘&†oaJ? ñû ©x²kʕþ~†™ÀkϕnÚËt«c' O…Pf噐ö·'¥ÀP̳;WVmPi¡·€¬Ž·Å†mrl0õs_€d™uØèȕ-V §òкÅòi÷ÍÏ1òû2¶¿qµ‰ÆêÇj똷ۂ_øy×k7ΌR¯ÆӉE]˼ÔOU²• t\NîÅf=Qâ4 öÈEþâÚï×WôÇܬ]ϑ&sý¢Mlr¼÷öØÇvøνÂÒ¼·^m¡—ÏX](¶YWȟ}YÆ~òŽíÀÄdÀ“nȏÂßÉf†ïýR†ÏH”Êa8‚³¥öMé$É`¯}ɾ&Y…æ%*¦rЁJ½o•Ní1µ‘f Â(ü¶CArK¯ƒ lÔJ0øLî‹ñܺàdz-G}î«=ÙfÀßþzz“(mE–ÔM1^}û¹‹Ô¾Ü¸oêÑ|%Ëìpµœ[ܒ:8#g(¡SéÐÇü%÷™¸óƒÅÉ$ iä÷`î]`ÔOo¿ë6¿@]€q £oÞ¹áƒa%K%žƒ>1.‰¬ÒùN:i!}rœûj+”È [DÇZ6ý±$³©e«h|ö”Ò÷*-x‹~%mûM½vJS2ž;aÃrÙ𘊾-–©ðî0Æ\¤<4y¯Õ†– ðRã[0]ɹRú7%^X×þì‰P¡˜Úb}v©„žÿå0tÐ<òkJ½~uÎðD°|ιZsg*úò»Â4wðO'øHn²tHˆÝ·û´·šù‡!/°Й×îïÅh›VèiŠëç\qt<æ32·Ÿº€#ûûÌ_=¸dšæ#8ÑVƒÌ*汉ç +\ǍΛÎ؃Ä׶KǏIá‰ÔWRÃè”ûÚ\"|çèÒ +ƒN=2û•ô]n£ô —!¨z‘ÆÞïá ¬¾s…ÄÓè‘ åþ|Y¸1ÒRš¿AôJ‹^nACâl +LŸÍb ±7 )~Ѿñd|ÀO®RñÄ΀oJF;Ÿæn qt ‚‰®?Ÿ8+M(2Ëψ¸×´iAêAz=]À€‰F’ˆtk[=åõýœÑ¢Vgvq¹C¡*Gþó1ø,ýÌ‡[EÁ)Ú[UdSǾþL&`åÿùz’@5¨!žw 8?oXm#ö–·×Ív@ÑSì0aÞKÔÀ¦¬jÒ%‹ú mMZq-]­-³ Á†Þg_ò‘ uÊ$Žƒ'0єž-Mk:S€óâþ1Dã´Î˼EŽ×î šÁu*Ô[æÓáÂñ£ôNÒRv¾f=Ý¿cl5ýY·¬8êÄþÖ1“Ÿ CCùyN‡g»%vR ÿìD½S[#³vz:…Þ ·ksÊpN@ꕗÑìLN>Îß0=Č,(çÆÑñ ÖÊÃ)µ_n'Ü7`õ»–ôf¶<²¢ŽräýCG#–ƒû +”ÛÑаÿD\óÌú–îtC„†¡`d•ú­‚Éÿ½ñ|Ò“7ppíˆcšˆ¿ì0o*¢WÆïäl?îϸ£_ɤ΄gúáC֒– >³@´þ—ŠVæ3]¯aPwه”ðòÆÔ|gÅb›¾msîü/ÐÏ"Û(:G½ï.?ξÈû“`·>ü¥…M•|—NZO±mþ3h djVëOhSjÚ9G6$ó*Pj¤pµqwöÃˌÿÍçÄXàgäX¦;¹£-¸¯L“ÏÀŒ¶,îá#d¡Øžc³èê9÷ñÓ7 kµ|Y@ÈΠ?)¾fö;5wæJëì›@ ¼Íwi©dÂéÆÀ±Eó§9ÍËw£sbâÚªü¬“pb’‡z•Šâ¹»Ê ‚|0(±É~(Ó'M4?ü:қ¤¾AN,^¸)Þseý >ÅJõb+íug`6 ’V ÃÑr£L,¡hàߝüü´`Ôð¡*%*Ûó5{l@»ì¥Î1ÿ™(:S±®igŒtóCcdùv+B¯¾k„Üߟ'8Êÿàù‰{9tóžÊ²ÏÒz}FۃµäS4{æ.6r䘽;O&N¾Ë B&Q’Û9üüÁËðä2ø™wÓå¢Ä+hQnG¾˜„÷nÏó•Ek±Ä,Aô*sKUú [ÃG «$±ä~LJãÏfþ0ÿ%âY?›ãi}³\lf‹Ÿ¿‡ö]"xØ<€‡‹Ã΀—ðª #Ê3ÍmW(±ÖKÿg±™m 8.ò8hÇxÎ>} àwÿó`k’Ÿ Žäðú¢ÿ{¨Nÿ»=Ÿv‡íò0ýû{øøõÿr=d\¥M;‚QÃ.:¨ÅÆßÿü_ØídCÁ€ÿ£ZþÏÿ·>ý,Ì(Á€Žÿë?‹ÏzÊy3[¬¦tÓÞÉ%Ïð kôŸ‡ŸB³"äôxz[Ìà%@*–›Ú"?l%ºÜ»lñ½ŠQ ‹Á2¼¢+É­×9Lw;îÒ;ñ7ýˆtšºŠÁ2×àa ïÂDÎNwԍx?l Žx5 ª¶Ýl?aW›EnûŸ uûE*¸hٍ¶C$ Dݖïڜè›á ll×?²µ‘¼ÅàÆ^ùaïőªŠº7¼Y¡N„?êìv3NjPåæ ,}Õ67•±Ÿ¿¨.Ùg~Ü¢* +ÿû"_…ñºÒ»ULâ²w e°Óÿb×b '·ÜˆH›Î÷ùo¶™þ¬ÕTô¥"ì^N[·{\ JtðâZo@iNàõ~¥ìöã.óAwù¨!@!ÊîbU‡øÁ'r‘¢Òž¹SQ~þh3 + iG]È­WB‰É€¼ñ =Û²5’¢eE¬äG÷@µà?[À󬖢F§?ÛÙôNØ{ øU \q旟)õ/&ª((1œô%ŒW‘¨u³Ä,=çôóõÃV–I ]å=VâuœâT»8Þ9Z|¥®)…H$xɺæHüZþ/Õ]F뗥ä¾»m•ÖMBXýzž~r +¦šà§„ìD"A®(NHeu÷÷*Éè;í´ŒR¹£¦»mŖ‡¶¥Í'P&…ëlaðÅ£YÖF@…DÔ֝- ¼¸ùó{ûŸâ^‚/ñކ½ %&bpÇtlßEA3?HUªË,qdêþAäÆ¿¯Â³'“=ù:sn{ÍiO~Ÿ|ð“×oF}ìƒ&û =ˆù’S&÷)¬Š†ÖóÆÛìS¯ý¹üÖ[}Åg½Óm†i×z{b×[_½ãû<›|¹ôös´­wÔz9½“¨y ÷s߂ðôYkÓôk`t¹•?YŸ$|™°/ÿ(ûyj¸§Dq¼€+‡Cây–vì^Ê©Jä˜ão.r;ð¿æï"7 ûò9ýüé±¥CÏØ´g¶@X JM˜š’ËWÀ,ÕË·ªÇÃ!vì,Žáö·©‰pc;†ÉÓ«w´]™ˆ¹ÉƒP×9¸‡âÀÃg{¢ 7¡©Sk“[¹ÜÇpÁÞÇ~ÁŸ…5øy?ÇÇú~ø¨½7űB£@´4r‰b_`xU€˜Ãü©žÄ±Æõ–ÃÑótÇÚð¼û½Q‡¦Z±ˆfGÍ)5ðm™šûyq¬~ë»=î]ŠÏõ‘ÁT+Cw·®ŠM— 3•”Ö Á¸9XŸ%°öGùõÒæ°êPõ*‹¸ ›<åqGk¡èíHRØ;Ht&+àÈYž¿®Ð«~x?'ª±õri-}ßpí±¬þíCU‰ µa6 °ã‡ch +ñøðñ½éH`MMƒ!ÒèÅ:JNZRXa^§Ñg‰½‹O7®ÿ8¾-q¬Í¬5±7þUÅ°Úcëh‚à +׆ÏP¶ä UÇêï÷ 2B¼ˆb}$—!cëÏ[ÊRF>>H‰é O«M-+…uJ“Wq¬"m^XB}„ ùdp$i¬}§E@ää‹ÿ™¦pþ}Eò°âD5äô@¬6V€æøX\lƒ­©Ó ‡vB6®S ¬ACh5'GRXsDÍöAX§ ¦[ÚGS¿‡—–(ÖvÌì“ÄZY´}„Vtø‡N¢=¶>ŠM÷øX).^†«Eë«y³”ÄÚþnNf+@s9Ýax­ìââX«¾§.™Š?‹cݕÅ°B ¿Ž ' "ëÄ[²’ÇZKäÇ£æLJ(֏úª„°¢óærº¿ýÀœ”Àú&>Žk§8֗ßÝ_=ö °B4ñ¸äÜHùðÔ¶ë%°ö»Dþç¯,Š5üâ|Ô§>œ¨ÌgnŠî…›ç<i¬3ŸU°y¬ƒêԆ°zÍ K‘?×*1±EÓ«ƒÃ +Ñ@Äîïž9žB¬Ç­é™ÆzJÚsÕ¿O‡V +k¦ï)ñ…¢ãpì&ô @캔P%'š.Àš=]ÈÅâcÂšôTœ¡èØù_¨“ÇgŒf++BC#6ÓÙb%X‡ôbË°qY/Àz üFé“'mº~Ü.&J³íb:ò‡UìšFÛ¨äÓ~Óó÷*õô›(NžÎÜÓ˃âœIâç`Lö,3°ßEHð4öŒ;ôÓã*|¹=ƒ›ïÇžØ ”„l”¢ï’OÃ^[k"ýô{:2sD»|!í5 >%ŸV훤Wúé¬þ㞠+‰4Ô?gE‰Ÿ‡‹¦b¼{¤ž~™÷Áo»öFmýò…¡mÀε°æaEÙvÄ<"?{%±"Û@+0m0â°ÂÙð¦û!‰ùè—Æ +mI¬ 4¾Å§×»ä°V͒X‘¢ÁaER€‡*ÞÒ." ~ô‰^ kv0ÿSóÞèü·áI‰Wƒ†ý(ß«+¾ø¦¹–0ë÷4#:/6ñÄò Ôœ9 ò| åŒ©ì}˜¬éàþIì,ómÓCñDû;k|ǂ´ ‰HÑø‹Æ‘ˆ†9 ĦyˆÚlj)"ÿDÿã¨mi H;f0pZ'˜ßóŽzKà¬20ãþ^äžØZ¸6MûØêìË9ˆ¦€OxRN2(0èn|c‚ºîÙƈÒêiáŒÍ¡aâӐuсåÀÓú²å›ÀŒÖ*R Óøl\sxÍIó» ˆˆêPt~œ3%ÂÃèáSF¿È Ízɵa'‰þ‘\Ff ۏÊkh`ghc8Ml’P¯íÊÐKýn—Ò†‡JzÉ@óØ2¿¤$(Ý?j؞¡WÌ©‰¿8æâÒÞ÷Ú©/Jz ò †¾™úÞÌ R–'="š½øRÈz)…Fy¾òIJ!$ÓdW$ÿ^:à4dÍ£¡‰’Bâäå‘fCYbDŽ¼ƒú‡&Ÿg#N¾¾S/)Ä%·'rà‰N®ÿ¨}r¼c Íϗ|íԔÈ]¨˜èP„èHrvÁ¼xÇ6¯EÃe¢YàB¦æš×­¦)‰ +ÀAÀâëaôe÷#Îî« Œ®—“X*ÇÎ35š‹htŒàJÚÒ÷÷ÖþÌ°ÎÐÈ$Í£š(Dzöβ jð8ºüghÇB¼Ĥ%_[RH4|Uá?`U9ö%ƒ€²"ñ’AêMvLØÀ¨Ùœ +¢cKfG©i¦ˆÅ©ë¾ÐÎ.—3 +köËe™”´3µRh†~hɓJ…6ɽ tœáIò˜‚†‡†E.@²µ+U¢R`^àKmzÕ¶ÜY,3¦S²,}zÖ[ôˆÔèz`LҊ³|Ôé©b#FymCÑ"à-ãæIVÛа†…ÆŠfè µ7*·§*hüFëÀØ`1 ­/oäh™&®íÝN´ñážDãK7Û |6“Ðáº=%ŽWjÎüø QQÌ`”ÒuEÏlo¦÷­W’i˜ö-¾=OÉÇûmÏLooÔfNS‘Ý‹Õ,ˆK•£2ص¨ÿhRk›pZ§@‰#{R+úÄ5Æ¢@<ˆïå¥Jå­@ÁH†¾Œ‚µ\ʽäè¥~³KšE”è¥q³óèÅnvô Ÿ1²rówz͆¿ÙEse_`ÞG•Î9§CYèÈGΑ+t¦ü•ùú½„é¬ìÈ“Ã6Ú=*e˜éPSëáÌ(á`ÊgþI}…#0Ãދ¦D%À\,™úõœ²N"ZO“òëý•aœ¸““F…wP $|;@Au  QžKbÇS³Sg¡š ˜AÚÿÈHhš6¤tE¨fk!­§¡=ɏH­#—ì†Ì¶À­5MGcE %_¹o¢M«üä”ٽ†Üys…{W„RS¢BxR8ˆ ^# +’ݧ€PO»’6cÿ>ãb÷¨”š $8ù”Î%\Í¥gƒ~0ÞeƓBà¼Àwj8Br÷á #rió–_κ×;þáUÕ¡LMÊK+梥 )/-„¦aŠT`ó47‡8ÐÊɟ\¤PßØÔ6&ÂNºu+RPX‹“ƒÂJh-€´„œ_@/ШíXåG͔Êá°ð•Ñ,ʈ½Kx"‹Ò\ÙøÜ~Tqü@h^—öH¡„f“Fmª¨‰)¦Ñ=ÿXJ·ãÊz!ݎ+aP…tw¦dmRû[¥[—“n¬‰«E¿BS–nœ_@!¡]/ݸíYxÝÞAº•“nÚ¥¤]º]z9(@·K7åQ\H&œäÈXØ(Ólxž0üTzÝÊÙÙxR\qñ;Z‚¼N`]xÕáw·†rÙóæ˼—I*5¶,Øñõ“Ø®¦÷ڄ.€öª×$qaÄCJè^™PÁßÕ¯Èâæìר-`å S’ÂF:Å_ +å³€nϪ@P$Ìna _?†¯Ò--Š@Ðîáä¦G0C;R9øç#øÚy‹ö±êô±u¼Ý(콩u~á^ÉóñM“ö¯à¹…Ðn×þß÷b‡£æc ®œv˜È±Ý¢ýcPØÃñ†c ÑþÅ p&® µç£üáH ›÷ýÍç#ïp CÎðõ]R (ÍòbNO^j—Ú!©Œ2˂SÓ¡&„×ëÝâäÆ´[÷960‘M®Ý-C4Uš0³š”ÉÔ¥jÇ˄a³€¤¯¸:xMƞ`L’lAe )î3áI•u9/Ž©¬Ë­ÎöTqRy3½¹d tjœ”_ŒÍ«Žš*6ÙìxÇÔ^M2öù†Ôæñh>c¬R½‹3-¤MïHt„«9v©óÜRÐ$¶}_6ӗb ,Fœ¡jX*Ùâb“1‡4µ‰¹.¨mD zPÝÞq©wnšc½ãu”×;Ó¾¬àˋÕò騋fn/çϵËZ> héêr>ùZ>JBß¡œO+ªåÓI–.j,瓯åÓ᥋·”óÉ×òñÕÁÊùäkùt¼ÒÅÊùäkùt2¥‹šÊùäkùt¨tñå|òïéèªï›Ëù.v0¯–3^´L¥[ÃLŠiâ2™÷ÒÅH‚$cwç”sÅmꊶH¡%}uâmN¨‹8T;ˆ‡9¾ mùðHaN˜r5©b6Ó +ªWÙsߢ¦(mñ»xUò·"…rÐä³¼Ô͐ò*ñ©ž¡ÀÑ%²oÔÞ­}L¢UpXòŽ.¹1‰ï¡ÙhªßS%vò‚ü,kH[×IS~ Ÿ&šb¢ÝÝ,åk¦.6»Ù½Õwä'ÇZkJewü„K­®DŠ¡ÁÂßêi¦Êî¤Â>3J©ìNڈ•Và¢3/›b³_•¬”¼ ŽBÇ+`VŸà幌ø̼{ÅBLuòkJj²Œ©í)eÏ|Ò©ššŠ^u¨ +¯¦²RÙè%çô´K_›’¯qÞ <*à·]ÑÝk‚^IuL² W „õhŠê˜êšÂ³b潆šÂ™býç㒮‘“.‘W³E2ïÍÏß©a¥ÄjF¥×P9ó^uZ¼À÷zŠ®¡NmMaø T“#Ç‚”xín5«.n"Y£š2ãk ß-{+Ñ WÕO““n׍ï/öfz}'?‰ª(Hç׉”©Ss/\ŗv»ç[¾NùÒ= «GÁ!-câyà?Ù}^TarF¡‚=¸,ª¶¥\dB^Cé°Ö:öúuU{W­Ò˜PqÞ0ŠŽøö€ÅvÊÞÝ?²¾lX'aç]p¿\µž wP†"rú ˜’üý,ÌÚ¨Ó0£Ç‹Kêx`EŠ¡KÚ|A"¶­@)Ôê] 鲬“荞VR»÷¹/­§ý–´ù‚¤+þ.’“®&Õ·‚K‚Þ7| Ñ{ÃϾÃòjñ”ÈŒ‰¿«Uk2¤ò«“BJ¼ryžÜ˜.nq üÆTYÔ=¼7eä½¹5 hÉFÞ&R¨P dŒºL·xop¿@ùvï `‘KÑPw÷FwQºx»÷Öà ¼7åV}­ _“÷FÌ®¯Ìã½T¤t^W™wa­IŅ`MÝ +ÿá‘w·ÔKŠŸz)©uªI½|ݪJ½T”ǕïVÕ ‹r.Ô%\*r(²€J@jªX$¡Ðzt‡‚²‹Ü¹Ì{eéëü¤h—ùÕ:¬›DŠµyo»H±6ïC°¥]C½×[ö#Wÿ„»nݏšì58¢2Mr?öwj÷£œªi®Í¦e·;]uŒiÛFâ&.t—ºÌœ[屦Hú¾c©«À¤»/ï;V¼ÎïÍDq'VÇ¥Ë VÁÉßH¥hv³>›/Ïãµi'ج¥nM¾Æ ¡U”µª-’>ÎÔøÊïS$û¾¿S‘,t—"YX·v{‘,„r—"YHÝE×»Y4wmé«`5ç/Y ð÷cïæý((ʓi÷.Ê£êds…îQ”'¾6w/Ê»Á×É'š¼‰¯Åö¼¡(÷§QuyÿJQž˜ûá_(ʓ𧩴àúr#.tøýÐrÕWߒi±jn¿èiY—‚ݤ6 ‚ +¨sBªpë5Üia |۞âú­NªØÏßïɕÝÍݒX ²“‘-ö{ªÿÔ¦RX'2X ΆUXµq·°ìÎßû®²M¥h¹²;K€UÇïSû“*ö  ûàù]ªìn(Wýö§Pì·ít$±šª‹ï¹օBŸÂfOkþeX¤°q㋍¥°BåöbiÁÖ¥'Ž>ÑìUù^Lì=ÚýÀ{Õÿ^UÒomPïчi5(¢¢¾°fT‚<¯…g¬œÏYE~/_¹µoèÙð¢L Óö>ÅE*’a…éž^{cÂck2ÃRʃUJ¡MÜ{¶×k¹¢¹F…/J®½ž6·Ý0§:S¡8“ºáRCî Rg=ùÜAõ\¥ÐYOr†ñ›œŠF+jg¨¢»‚jÂ+õXÞwCS= û¦°îÇ$™Z«¶+Ÿ‚ƒøšÂ¾+}6Z ûĬÆmwÇÂ>µ÷ÙÜXØ'æE¼Ø7·ö‰Uõé®-Ĕ.ìsãK$øßRØÇ# ½y¹HáÝ +ûÄ@é.3¹¢°ïÚCZcaŸXœ‡;=ïVØ'VÕÇó ܧ°O¬ªOm֐†Â>1/=câÞ±°Ol…)ñ] ûÄT^–ê} +ûĪútWëßPØw9¦oƒŒumaŸ˜ÚŠˆvßÂ>±5Kµº±°OJ¹óU…}’Zç} û4í–Â>¨‹û +û®#šæÂ>ùJ¯»öIT}ß»°O DsçÂ>±`‹0óþ…}b‚B`âÞ£°O)°r§Â>çÍ= +ûÄȁ©ê÷*ìS,(»OaŸXUŸxÊHñ.6¢“³1¢ý–´Ý9%ÝÓ첇§ÀŒR]}µWØö<úû·R*Ç ]ü.ÆtBa¢{wñ“Q9ԑêd7k"G'~Â%,UÔ6Tò¯4B'QŽ-5,Á˜Ô +6%3,~lëª1!¢aiêS-7&ñÜ ia#C*™>Õòk|“)é)&“ÏÙ)t„—wå±Çšlÿ¿››ÿé°;ºTêë×4ÿ“6¼þ×NŽ½öM'UP¦®¦OU΅B>4×ÿï¶õ*ôw:5mvdZªšÿ);!!mnnþÇh6òýÿnnþ§£ªðúÿ© ?í*÷¸£Ë—ìzäRCGånéO» +§Ž‹¥ó¨žÜ³U-—J‡‰`Û>Å G%.…}ÐĖwÞ«ªéS“A Ñ(Õ;Jg†¨.v„hd’5$©AI:  ­®ß@m0 KšàU°’³Ö‰Ýj%0*4þ®¬/ã§ZÖRÈAWj@)秩NµÐT&‘ËgR#AxŸBÌÛ#)°×¢Ì­ç ¨¤ª®}šša"jÊèiýûݪէBxwª»íKÞªu…f3;jj†©Ô@Ð}eÝ-¶QÙԝŠrlåº[0&õåØru·´».F5$ŽÑ aí]ñ¹“[y²wù-gX”¡w0—´·;Ïۉ=>¨Ôì½“s¯9ñ˜£"äÆ|Îô'^=àK²…cåUæ4GÃk¿{¶ø­é¢Ùa_¢2Ï*]x8O¢„”6©BÄ ÁjY?¤êß%±ÂÙ<’;Ÿät‰‚aЕÄj.Í\K©ÖtV«Ž-(ãˆÜx1¬ü¹£9dâ:,úE—VKr¸à +Ð@" ;ññJ§ÂBDœÂ•xCkÐðäÉM0Ï­°8o,ƒµ` Jc-4 1¬:Ô /\ä•z +±¶ä:,V^¥±æó]’Ÿ8á ö]z¶=»ù, ñž/KH¾§Ãë=‰‰-šVÒݞòÜÁ fÝ÷ ÕQ6Øø†øçiVƿ̞|*³3]VNÂ5›œŠMÇ5þ,,®Rv¦H—E]&nIŽ 1´ô°²j꫔‹«Žº{5¦A~`¥Æ4jýN9ùÄ-Éåc4Þ°ÚZrÜä +…iÞP§ JÑI÷:®δΐswÃ@Í-(%Æt‘v±oT^S@#7,iÿ²¶1AÑ)Fè"W ºòï ?žés¥€—T\ï­ä¹åïueß© +›ë+¢dÝÒªÃD£ü-Wìê¸ +ɋ{ï®*»ã)ŠªJ¯óHó³TQIâ­·ëŠÝw§“¬[S²j.ﻓ1$üiüT‘`í”ÔÔâAFؐw³¤§ä…°¹6†NÕþImh*è¥Üԏ76aŒ@ÙǧC} +%=0þýEFÂ*|Ю¤Hì`^=飶‚¶Ë>7tª“¯¦ÒiªôŠhºŠ“°þf^ó9+ªê¼1aLèÛ¿ëWFµ¥:üŽ.™ºD¥Ð +kˆòçåR!Õ!h­m³£šR#!óEɯ 4Á)s#Ñ«‰ÔO“½•hŠ-…´­ê—€vQÅ,¦62D»²$Qm=¢Rýr¡šªzD¹”x%‰jëEüÐZJÕÖ#rÉ°W•$ª­G¤ÜÝW—$òøEÆ +½È¹ÕV’¨¶íú’DŽ¤òDǯôÒZ’¨¶‘³¤¯*I”ÓE="/îIèr^·7+Ô©oRwK³B|6ÿb³ÂK÷ÿҬP§Ô¤î>Í +éŠyµåöf…ºžDôÅ»7+¼tÛý+Í +ESï߬P§ª¿ç-Í +yî8¬ ä°h*)U,Kw;”/ŒÑÐðPÞ%¡œm§²á¡º[­nnxˆMî·ZI5<ԘumÃCùn‡bNÈ«Ê»$ ví ÅYPþV«+ª`è{4<”O7á]76ÅSnokxȕ‘‰q$çLÑVrqÑðPž†”r{‡†‡2{î¸ò© }+7<”‡Â*P·6¡€Ëÿ®‘=WÅuЪÿ$ÓZu“óv-øöÝY¼ö¯–Å—ñ-mõç~;­Ê*ºŽ÷¶‹¤e³‡öO‡Ô&ø¢{Iš>K!øô5,•¬çoÃп}_D)€ªMÝNûUﲏRzïrÿjûÌ)‚ÌT2ùõY& +ASëp˜D,‡cø­t4Œ‚³c`6l°•Ÿû³ÛùæòU#LÞ¯ûp|ßÂ|¥Šˆ^ÉklPGҟÍ4»Ù™°Ýæyây²¥SÕ²½9À„O&´6>£^rº¨ÀÒ25/†×A'aÜܤÉë_ž ë¹~k[ËL¹ªþìØù_`B\mƒ*$õi²Óy"Œ‹9åhlù +ýN°ÀäY¬~óÒb“"NŒ‰àSææ䢇ZŒf?ʆbþ0ŒQpfR{ËfòÞN.—´‡+Ü{dÄÐÞ@¯{.Õ_ÔⱯB°°²?JŪúšWúo‹:]y{Ûó¯½"üæÜX»`)±ƒ2ÿþ™V„ûdù ã%—Ý—™ùä± Ÿ3 Ihþ ÙP-2=¥øóÙA ƒkÃø&ëb~IºÉ¼·p‹„=çx:“–b©äq˜¿ÿòŸ«}„p'BV4T8º-ë‰e¦nxðlÇLÙg€†y–urϼ™A7É<(±+8B§±ôÍÐæÅ +„Çvå)T§ìwvîeŠ(Œ\Ÿì3'¨°‹ð;7­6^Xéôç)«AXei÷%»z );Ä1r׀ïH¤“ Øè‹ ã †"1 …^´Èר»!  æ F׃~ä3FþNàÏ¡Ï]k¯|à·»=aˆàS;Ààú#Üý*G˜ †f(8sîiÜ]nÌ]2ž÷ÿ +*PááÐĵ^Fõeår q“ƒÐ\ ’©pG ­åp3.)ó¢“+͟õ´Ôî÷M=̧¹—{èá-0ÃÓ¯ÿb8Ó+i³&b¡Wç#Œx“ÚS.mÆgCD¹`€õúÒ¨Gd*­×W£x„g7ÃÙ ³ØöAžõŽïߞÞñ:Êëµ^Qï ;Æz󮳟œ½3í[èíkUït›_á±^ÕÛö†v¬CQ(á6ÁÕ´0»º¶ac@c°AMw·m´è4‡eN¸Q ×|ËOÑB ”¤E ’ PE„^´¢Â]^ޜshgD'+!HEBòjb=ZB*V:4 +Ä©¸e(ÌNƒÆËä¡ß³à]È×i±D1E±xò£hœù.…„“…^n I‰À¬®Š Ý»,‘+Ç·x¥Îñ÷ˆ`lPœVx¶yÀÊ&(Ù +W±¬NJ¦R2xuÓâ4ôZÌNVé ëü´0àœLEç2®C˳QœE„M@èƒJ+ +:©§µósbþ´Éϟ&\½A­Âã•7Vù(z³™ŸÓIÑw°t0y8Ïð68 H…ÏW›Þ2¦i£ïôÏ}˜}Ñ:Aí´Ë»£z„w)4p-)à+ ÿ(—‚Ñæ7:P‹A GrlöZÿ2!Èø°^Kî+ýÝto£¿[=ÚÁRͬn1çǤ©'ŽîᏧÞlSp4ÙIð1Cc{y9Ré®Ç6«Ž~ M”‘öغû‡úŸõùׅX¸µéé·î<¥ÿ2ý!£úqfl½ƒcÍ_öú†–F´³"ÖSõ‡&H*=s5JÄÀ 7”fà蠉òÙyÝ×' ünFëdG´Âk¡Û%(:äŽm–ïœFn‡u–‚›ZI:øRM‹…¦Ã4Y¿Ì‹‡D ±êñe¹$œ€T´ 2Ö +K‡â‡ëñ·«‚¨ä?Š—CõwgŠ÷ìÁéðY¯I1ƒ™ºƒ¹wÙ0”$ÜÄ5SÅèRL©Ì‘Pi.ØÅAIUÁ9BÃDð|3UuÃD€:ºr V„[n{ÊLĂ¯È5¬mAYC܊à0ÔÁà¨)6–¡“ÑՆaô²·pĐ„œ Bü͍(æÚ3öžœ ÿU+uuëO'î~ÿC°@Ü{×s.ƒ¯æ4pH¸®„AqšÈÞ×Êi81®å4œWÁÀ÷¾— щøàVlß^CM Z–hWÁ°ª¢€X@ƕÒÀn|8›«VÄÊ­ˆäÞç¡£îèŽãiLÀ–ÌMëD¸M¦b"h”ÀaH 1ՃPwHë͹÷& Ã{ñaخܨø!mãØS’òƒ<—¢S†6ü\ºRtÚÔ°§Ü¹d“çMU¢ÓæÍô=%ìϏS´Ìýé3F³*ijø]@[®èÀmïnO½³@“| ·ºŠzGÝê@ö ŒÍ)Ge7²×¤Ñv¹×ŽloÜ1HŽÇŒk®±eŒç6ôrxËe9Hi÷Îêх~Nù΋ˍþ„º…þô»€œ­´qnÞÃËð‹vúϨÅI[æèÏ*RÕ©_~u£'ÚSÌoÎIg¥rxÄf µbÍèìӌ}àÀt=9(‹€oy/Ÿ„‰*†Ð—|ÝehÚ¢H?°âÆ~!Å9RG¸Å_ ÐÅ>CÍÈÁ×UƕU¨”KÓ}‚~œjY<³Ñë9mÚ)ÿçl灤j:YÞ0zÍ ,Sm¢ó½õÌzá7¬¬=x>‹uô' ÷s0ôÐ+×'í¬›Óžz­ÁèœÁÚqQh«1Lx×í§¼#b4©ñj´cIO ]¸@9S.Réèä7Ò-R ,V’À@z܆cÜލ‚‰®ÿ%ú˜[ÐðZm=ãÀr~· @ã3ÆãÊ1h=ÏWÌìß0–ñæŠÏÐÛô梨””<”»*÷YПÖ]/ýé<¡ÝêÍ[§c& Λ÷.áú¾QŽïx‚ .d¿zÇë*Aý||nÑÀ'ÖëPàîØIlþË>ð³Î6“7}îó<3Z™µkiK7>¿ª¹JIßæ&lª{–͐2a™WŒ(ã{:—ؾùpS>9“·ë§€)6 ПrÓf€>ú½×¿´p8õlçƒÌ­?ӭλ9?s¦ÞG ÕsÞÁÓ.HÉ J~‘〼_Q“Sí:¿¢&§¢0ÕJ½_Q“S훫üŠšœŠ(~s•_ 9þï„îŸPÄx@ÿ¸[çõâP?ü,6Ý?1Ý?îtÉãénæ[ò°Xtÿï)·ý<ÿ-6§‡èƒ;ÝΖJá@nñ¹/tð%ÄÊD'=Ú‰‡ÇyžIĈ™ÜW¤°*ZÏÓÜÑO`~KJ‡ÙuöÐý:ð\}Ò;Æó¡Þá%ÛzKñè€ö) - Т¸‹Í[2ç¼½V}ìA䧉L:Ë¿e­”û¸Œ»‹éŒM¾¶Sî±E.:,ÊËFÀ\í"w  œLzküÅÏzèaR¦Þ˜ »õk*¿.ëíÍÇ8Ãø ÝúsÊßO9ó§û0 Q§4PkÓÞýËJÊgzƒ’ÒÀ«4DD¹p(~ #¢˜ª`Œ-ÓÌÁ.ƒ±d°Á0UC]È:ðˆÕÇ^(¹ œŠbïݎ´°Õ~Ïh«¡?ÕFD¹p(•ø÷/ED¹ð%ŒÂÿkQã ùW"¢\8†’þµˆ(Åb£÷ˆráP8›-"ʅCñ}s÷ˆ(…ù¿å¡PtâÑ·žÞú2°ÐBôm@ Ì/k²£·þ¬zç¦ùkF® „^´ç>%öÀæI#GÕ÷‹RhÚ;ú­éÞÉ$“ø-\2 «‡˜áu?{(:í´è„: &:û[•DbNé?ÐÒ#љu9ëý8ÇKîŸÞÉEi?Ž¨å„™–/‹Õûè¥"`ø  Єœœ¥eÚ½Rå¸K©1ÇÙ*³~ܐÇ(´`M8‚U3æk 2H ¥´QÄ0¥?{ +] <³–u¨¥8è`èÒ‰öBiò@ÓI¹ib”$Åäw¡ëE‹þ±cUE\Â,— d;w Sv·°6„Õ¸}g©¬·ü(ÀÆ›B‡ eæ;ñäg¸rÃ^¸5hÐ?eŒ9™xmƍ𐽂%ꨒí -Ç#]Ýý“èæ‘ÆÙ-ØùîuÏ|×?¸ê;gÝ Æã¥hѱ3Ú}¤>»ˆ!"qFÅŸ½T‹‹4‚ðçÐRë¸öĩȵ§:–êÙ±táD@n)šœ`8‚;VᝊXªt •õ³ÊÆäjN–4V:¡-‹ +"<Ÿn ('£“Š@*/ , ¬SåÎ7Dæ©úL²€J¦¼€ÚÜ©Éz µæºe"¨l€ÙZÑ4O¤uk +m‹lOGäd»…µ¡CÑ.ÀM-1 ïÑ©4‘iü…à®=a^²âE'¢’š0QӃ ŌíaÐ؆ß{µÙ[éWÉ_]¤Ý ÍîÓ±ùVNj‹å6N«ú]iN“…1J7sšùÛr§«§©†Qµ;¹€f!à´QÈuˊ@wº[ ä4µ0 +ÕGå}+€Iÿ…š jA(>ˆ‘KœšpT†„âŠÕSqïË ‚ö¹Ý¶"Pᕧ&uÞÈM¤è$µí‘‹A«¤ªß°GŠÉ–Wa‡„ÛƒÒEÿÉՍc0f£§ÛŽ„ÙÒngiÙqÈ bç‘f-Á ) ǧ1伉->Ï.Žš¸èT8špÁ¬èf—„ˆèüL–’øŸÅz +ÿ³ÙM#[ÕK ]“ë݆vê?ý¹¤}Ü˝§…jö£LÏP¾ˆ@ŠñSA— ?€%]ä¡¢ÂCGßApK‘‡Š +8^‘ës­Xñ‘>¬ØñU;[uQÁ«.xƶ[€f—]²ÏP1g¯Õé‡<ÚqâõÉTLE(M`b¢i­¦Xç€×Z$㚣s¼nL— ›Õg.°85Œ‹ÂÇ ¼L·ÏƟü`ހU5ÇÆޏó(E»:ú#ëëôó}¹dˆe™7'mf¡Hzs3à Ÿ}@#öÍÃ8®ÞP<Æ-Þ|ì'? û ‚?”…"¢ŸhõlÙπ`?yðè§wÄ>üAned¼˜¿f6ƒ ë V;ã1gîaÌù ªùLÖ:¤ëø§ÿf¡c£ôüäÅ_­-ýð;¿H¼IN^ûٜ=l%É|핉užþÄb B.u±îí¼©õ&^éJD2Mƒ7ñJW¢îmÞÄ+]‰(uAƒ7ñJW"r?¨ô&na(4½£%gœßÌñ`'øú |Õ^œÎ;ôJ`œY,6Õéà¸ñTa­Í؝>œr?Ÿ§ŸífzøïC}׫U»¥ÜCô~5ö`ƒ!Æà]ð½XÇpˆcÝ?ÄCþÓûĞÞÁÏuð+ì÷|þ ‚A?á"¼!ŒÏåóü`T®ˆ×FzSøCjàØá_eðé|÷ŸñP{~sxØÒý㠄œþpèAþ@ú\¥?{ý®pÈっ÷<¾°+è!ÂìôË_*æŸùYŽ?ËïÓøs»>ÿ)Ð`Gfï ‡ý4!l¶hš>SÐã +€Wà¼!8hŸÇ 80ô=Hô6þ™ý¥Ê´ÿ¦ëµö9\±~Ÿ]lM˜% DИ½èï€ßð=ì¾@ À¿¯7âòrjX±êâë4nLOßj¦YÍЛì)´…œðìyjL—‹Îaú³†{jyœþ?‹‡éf³=MO‹xô°<,Ž§íañpüÞþ~ÄþìÐ:0™þù/Vœ +endstream endobj 7 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 34 0 obj [33 0 R] endobj 48 0 obj <> endobj xref +0 49 +0000000004 65535 f +0000000016 00000 n +0000000176 00000 n +0000046465 00000 n +0000000000 00000 f +0000000000 00000 f +0000175432 00000 n +0000175365 00000 n +0000000000 00000 f +0000046516 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000175639 00000 n +0000175670 00000 n +0000175523 00000 n +0000175554 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000048167 00000 n +0000175755 00000 n +0000046845 00000 n +0000048464 00000 n +0000048351 00000 n +0000047096 00000 n +0000047605 00000 n +0000047653 00000 n +0000048235 00000 n +0000048266 00000 n +0000048538 00000 n +0000048734 00000 n +0000049777 00000 n +0000070877 00000 n +0000136466 00000 n +0000175780 00000 n +trailer +<<5B95C5AE6D270C48854932B225484F55>]>> +startxref +175973 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg new file mode 100644 index 00000000..7712f662 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue-orange.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.ai new file mode 100644 index 00000000..dcdd0e08 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.ai @@ -0,0 +1,1467 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 6 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_blue + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T16:33:44+02:00 + 2019-06-22T16:36:14+02:00 + 2019-06-22T16:36:14+02:00 + + + + 224 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8Ann5Hfmx9aWHyprs3+kqA mlXkh/vAOkDk/tD9g9+nWlev9oOxuG8+IbfxD9P6/m6Ts3XX+7nz6fqe25yDu3Yq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FVK7u7aztZru6lWG2gRpJpXNFVFFSSfY ZKEDOQjEWSiUgBZ5PF/Ln5mXPnH84tOhti0WhWaXQs4Dt6jei49dxtuw6A/ZH051uq7JGl0Eid8k uG/Lcbfjm6XDrDm1IA+kXXy5vAUd0dXRirqQVYGhBG4IIztiLdC+m/yZ/NVfM1mui6tIBr9qnwSN t9aiX9sf8WKPtjv1HennvbvY/wCXl4mMfuj/ALE/q7vk9L2drvEHDL6x9r1DOcdo7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq4kKCzGgG5J6AYq+afzp/NY+YbptB0aX/c HbP+/mX/AI+pVPX/AIxofs+J38M9A7B7G8CPi5B+8PL+iP1/2PNdo67xDwR+kfalf5C/+TM07/jF c/8AJhsyfaP/ABOXvj97X2X/AH4+P3PPc3rrlexvrywvIb2zlaC6t3EkMyGjKymoIyvJjjOJjIXE soyMTY5h9W/lZ+ZNp5z0ekvGHW7NQL+2GwbsJo/8hj2/ZO3gT5r2x2VLSZNt8cuR/QfP73qtDrBm j/SHNnGadznYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8H/PH82OXr+U9 Cm+HePV7yM9ezW6Edv8Afh/2Pjnaez/Y3LPlH9Uf779Xz7nRdpa7/Jw+P6v1vC87J0T0L8hf/Jma d/xiuf8Akw2aL2j/AMTl74/e7Hsv+/Hx+557m9dc7FUx8veYNU8v6vb6tpkvo3ds1VPVWU7MjDur DY5j6nTQz4zCYuJbcWWWOQlHmH1x5D88aX5w0JNSsyI50ol7aE1aGWleJ6VU9Vbv8655h2j2fPS5 OCXLoe8PWaXUxzQ4h8WR5gOS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXkv51 fmuNBtn8v6JN/uauFpdXCHe2jYdAR0lYdPAb+GdP2D2N4x8XIP3Y5D+cf1Op7R13hjgj9X3ftfNp JJJJqT1Od8847Ch6F+Qv/kzNO/4xXP8AyYbNF7R/4nL3x+92PZf9+Pj9zz3N6652KuxVkHkjzpqv lHXI9TsDzT7F3ak0SaImpRutD3U9jmD2hoIarGYS+B7i5Gm1EsUuIPrjy15k0rzHo1vq2mS+pbTj cH7aOPtRuOzKev8ATPMNXpZ4MhhMbj8W9bhzRyREo8k0zGbXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYqwD82vzOt/J+l/VrNll1+8U/VYTuIkOxmkHgP2R3PsDm77F7JOqncv7qPPz8h+l wNfrRhjQ+s/i3yvdXVzd3MtzcytNcTMXmmclmZmNSzE9Sc9IhARAAFAPLSkSbPNSybF2KvQvyF/8 mZp3/GK5/wCTDZovaP8AxOXvj97sey/78fH7nnub11zsVdirsVZn+WH5j33kzWQ55TaPdFV1C0B7 dPVjB/bT8enuNR2t2XHV465ZB9J/QfJzdFqzhl/RPN9Y6bqNjqVhBf2My3FncoJIZkNQyn/PcZ5p lxSxyMZCpB6uExIWORRGVsnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqxb8xPP2m+TNDa9uK S301U0+zrQyyDufBEqCx/iRmy7M7Nnq8nCNoj6j3ft7nF1eqjhjZ59A+Sda1rUta1S41TUpjPeXT l5ZD+CqOyqNgOwz07T4IYoCEBUQ8nkySnIylzKCy5rdirsVehfkL/wCTM07/AIxXP/Jhs0XtH/ic vfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV6X+Tn5pyeVr8aVqkjP5fu3FSd/q0jbeov+Qf2x9I9+e7 c7HGpjxw/vY/7Id3v7nZ9n67wjwy+g/Y+n4pYpYklidZIpFDRyKQysrCoII2IIzzsgg0eb0wNrsC XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqk/m3zVpXlfRJ9W1J+MUQpFEPtyykHjGg/man0dTtmXo tHPUZBCHM/YO9pz544o8UnyN5w826r5q1ybVtRf43+GCAH4IYgfhjT2H4nfPT9DooabGIQ/tPe8l qM8ssuKSSZmNDsVdirsVehfkL/5MzTv+MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdir sVdir2j8kPzY+oSReV9dm/0GQ8dNvJDtCx6QuSf7tv2f5T7dOS9oOxuMHNiHq/iHf5+/v7/v3XZu u4f3c+XR9CZwz0DsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLHStOudRvpPRs7SMyzyEE0VfYbn LMOGWSYhEXKTCcxGJkeQfJX5kfmDqHnPWzdS1h063qmn2dahEPVmp1d6VP3ds9O7K7MhpMfCN5n6 j+Ojyes1ZzSvp0Ylm0cR2KuxV2KuxV6F+Qv/AJMzTv8AjFc/8mGzRe0f+Jy98fvdj2X/AH4+P3PP c3rrnYq7FXYq7FXYq7FX0N+SH5sfpKKLyvrs1dRiHHTbuQ7zoo2icn/dijof2h79eF9oOxvDJzYh 6f4h3efu+77uh7N13F+7nz6PZs5N3LsVdirsVdirsVdirsVdirsVdirsVYn+bH/kudf/AOYU/wDE hmz7G/xvH/WcTXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/AMTl74/e7Hsv +/Hx+557m9dc7FXYq7FXYq7FXYquillilSWJ2jljYNHIpKsrKaggjcEHAQCKPJINPqH8nvzTi812 A0zU3CeYLRPj7C5jXb1VH8w/bH0jbp51252OdNLjh/dS/wBie79T0/Z+t8UcMvrH2vSc592TsVdi rsVdirsVdirsVdirum5xVjvljztpfmTVNYtNMPq22kvFCbsGqyyPz58KdVXhQN3+WZ+r7PnghCU9 jOzXdycfDqY5JSEeUUL+bH/kudf/AOYU/wDEhlnY3+N4/wCsw139zL3Pj/PU3kHYq7FXYq7FXYq9 C/IX/wAmZp3/ABiuf+TDZovaP/E5e+P3ux7L/vx8fuee5vXXOxV2KuxV2KuxV2KuxVE6bqV9pl/B qFhM1veWziSCZOqsv6x4g9cry4o5ImMhcSzhMxII5h9Y/ll+Ytj5z0b1fhh1a1CrqFoD0J2EiV/Y en0dPn5n2t2XLSZK5wP0n9HvD1ei1YzR/pDmzLNS5jsVdirsVdirsVdirsVeIfnj+bHoLN5U0Gf9 +wKareRn7APWBGB+0f2/Dp407D2f7G4qz5Rt/CP0/q+bpO0tdX7uHx/U7/nGH/eHzB/xltv+IyY+ 1v1Y/dL9C9i8pfB6H+bH/kudf/5hT/xIZouxv8bx/wBZ2Gu/uZe58f56m8g7FXYq7FXYq7FXoX5C /wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FXYq7FXYq7FU18seZdU8t61b 6vpknp3MB3U7pIh+1G47qw/zrmNq9JDUYzjmNj+LbsOaWOQlHm+uPJPnPSvN2hRapYNxbZLu2Jq8 MoFWRvH2PcZ5f2hoJ6XIYS+B7w9ZptRHLDiCf5hOQ7FXYq7FXYq7FXlv5z/mqnluzfRNIlB166T9 5Ip/3ljYfaNOkjA/AO32vCvR9hdj/mJeJkH7sf7I/q7/AJOr7R13hjhj9Z+x8zO7u7O7FnYksxNS SdySTnoQFPNPfP8AnGH/AHh8wf8AGW2/4jJnFe1v1Y/dL9DvuxeUvg9D/Nj/AMlzr/8AzCn/AIkM 0XY3+N4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/8mZp3/GK5/wCTDZovaP8AxOXvj97sey/7 8fH7nnub11zsVdirsVdirsVdirsVdirsVZL5B89ap5O1xNQtCZLZ6JfWZNEmi8PZlrVW7H2qM1/a XZ8NVj4Jc+h7j+Obk6XUywyscur638v6/pev6Tb6rpkwmtLleSnoyn9pHHZlOxGeYanTTwzMJipB 63FljkiJR5FMMobHYq7FXYqwb81PzLtPJukcYSs2uXakWNsdwo3HrSD+RT0H7R28SNx2P2VLVz32 xx5n9A8/ucHXawYY7fUeX63ynfX13f3k17eStPdXDmSaZzVmZjUk56XjxxhERiKiHlZSMjZ5qGTY vff+cYf94fMH/GW2/wCIyZxPtb9WP3S/Q7/sXlL4PQ/zY/8AJc6//wAwp/4kM0XY3+N4/wCs7DXf 3Mvc+P8APU3kHYq7FXYq7FXYq9C/IX/yZmnf8Yrn/kw2aL2j/wATl74/e7Hsv+/Hx+557m9dc7FX Yq7FXYq7FXYq7FXYq7FXYqzn8q/zLu/JurcJi02h3bAX1sNyp6etGP51HX+YbeFNN2x2THVw22yR 5H9B8vuc7Q6w4Zb/AEnn+t9W2N7aX1nDeWcyz2twgkhmQ1VlYVBBzzXJjlCRjIUQ9VGQkLHJWyDJ 2Ksb8++edL8naG+o3n7yd6pZWgNGmlp070UdWbsPegzP7O7PnqsnBHl1PcHG1WpjhjxH4PkjzBr+ qa/q9xqupzetd3LVY9FUDZUQdlUbAZ6fptNDBAQgKiHk8uWWSRlLmUuzIanYq99/5xh/3h8wf8Zb b/iMmcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdi rsVdir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq9B0X8sJ/MH5 ayeYdJVpNVsbqZJ7UVJmgREb4B/OlTsPtfOmaLP2uMGr8Kf0SiKPcd/sP2Owx6I5MPHH6gXn3TN4 4DsKHYq7FXYq7FXqX5M/ms/lu8XRNXlJ0G5f93Kxr9VkY/aFTtGx+2O3XxrzfbvY3jx8TGP3g/2Q /X3fJ2vZ2u8M8MvpP2PplWV1DoQysKqw3BB6EHPPiKelbwK+UPzw1K+vPzG1OG5maSGy9OG1jP2Y 4zGrkADxZiTnpfs/ijHSRIG8rJ+bynaUycxB6MCzduA7FXYq99/5xh/3h8wf8Zbb/iMmcT7W/Vj9 0v0O/wCxeUvg9D/Nj/yXOv8A/MKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf8A yZmnf8Yrn/kw2aL2j/xOXvj97sey/wC/Hx+557m9dc7FXYq7FXYq+m/+cc//ACX8n/MfN/xCPPPP aj/Gh/UH6XpuyP7n4sU/PL8p/QabzXoUP7liX1a0jH2WPWdFH7J/b8PteNNl7P8AbN1gynf+E/o/ V8nF7S0NfvIfH9bw/OxdG7FXYq7FXYq7FXuP5Gfms0Ulv5S1uUtHIRFpF0xqVYmgt3J7E7R+H2fC nHe0PY1g58Y/rD/ffr+bvOzNdVY5fD9X6nvecU758j/nL/5MzXf+Msf/ACZTPT+wv8Tx+4/eXku0 P7+X46MLzbuE7FXYq99/5xh/3h8wf8Zbb/iMmcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JD NF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+ /Hx+557m9dc7FXYq7FXYq+m/+cc//Jfyf8x83/EI8889qP8AGh/UH6XpuyP7n4vUGVXUo4DKwoyn cEHqCM50GnaPmb85/wAqW8t3ba3pEROg3L/vI1Ffqsrn7Ow2jYn4D26eFfQewu2PzEfDyH94P9kP 19/zeZ7R0Phnij9J+x5bnSOrdirsVdirsVT3yD/ynXlz/tqWX/UQmYXaX+LZP6kv9yXI0v8Aex/r D732fnkz2T5H/OX/AMmZrv8Axlj/AOTKZ6f2F/ieP3H7y8l2h/fy/HRhebdwnYq7FXvv/OMP+8Pm D/jLbf8AEZM4n2t+rH7pfod/2Lyl8Hof5sf+S51//mFP/Ehmi7G/xvH/AFnYa7+5l7nx/nqbyDsV dirsVdirsVehfkL/AOTM07/jFc/8mGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdirsVfTf/ADjn /wCS/k/5j5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0Ub6ytL6zms7yFZ7W4QxzQuKqysKEEZPHklC QlE0QxlESFHk+UvzU/LW78m6vyhDTaHdsTY3J3KnqYZD/Oo6fzDfxp6V2P2rHV499skeY/SPL7nl ddozhlt9J5fqYNm5cF2KuxV2Kp75B/5Try5/21LL/qITMLtL/Fsn9SX+5LkaX+9j/WH3vs/PJnsn yP8AnL/5MzXf+Msf/JlM9P7C/wATx+4/eXku0P7+X46MLzbuE7FXYq99/wCcYf8AeHzB/wAZbb/i MmcT7W/Vj90v0O/7F5S+D0P82P8AyXOv/wDMKf8AiQzRdjf43j/rOw139zL3Pj/PU3kHYq7FXYq7 FXYq9C/IX/yZmnf8Yrn/AJMNmi9o/wDE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv8A5xz/APJf yf8AMfN/xCPPPPaj/Gh/UH6XpuyP7n4vUc5x2jsVS/zBoGl6/pNxpWpwia0uV4sOjKf2XQ9mU7g5 fptTPDMTgakGvLijkiYy5F8j+ffI2qeTtcfTrwGS3er2N2BRZoq9fZh0Zex9qHPT+ze0IarHxx59 R3H8cnktVppYZUeXRjebBxnYq7FU98g/8p15c/7all/1EJmF2l/i2T+pL/clyNL/AHsf6w+99n55 M9k+R/zl/wDJma7/AMZY/wDkymen9hf4nj9x+8vJdof38vx0YXm3cJ2KuxV77/zjD/vD5g/4y23/ ABGTOJ9rfqx+6X6Hf9i8pfB6H+bH/kudf/5hT/xIZouxv8bx/wBZ2Gu/uZe58f56m8g7FXYq7FXY q7FXoX5C/wDkzNO/4xXP/Jhs0XtH/icvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/wA45/8Akv5P +Y+b/iEeeee1H+ND+oP0vTdkf3Pxeo5zjtHYq7FUg87+TNL83aFLpd+OLfbtbkCrwygUV16V9x3G Z3Z+vnpcgnH4jvDj6nTxyw4S+RvM3lvVfLes3Gk6nH6dzAdiN1dD9mRD3Vh/nXPT9JqoZ8YnA7H8 U8lmwyxyMZc0rzJanYqnvkH/AJTry5/21LL/AKiEzC7S/wAWyf1Jf7kuRpf72P8AWH3vs/PJnsny P+cv/kzNd/4yx/8AJlM9P7C/xPH7j95eS7Q/v5fjowvNu4TsVdir33/nGH/eHzB/xltv+IyZxPtb 9WP3S/Q7/sXlL4PQ/wA2P/Jc6/8A8wp/4kM0XY3+N4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvy F/8AJmad/wAYrn/kw2aL2j/xOXvj97sey/78fH7nnub11zsVdirsVdir6b/5xz/8l/J/zHzf8Qjz zz2o/wAaH9Qfpem7I/ufi9RznHaOxV2KuxVhn5nflzY+c9G9McYdXtQzafdnsTuY3p+w/wCHX2O2 7J7UlpMl84H6h+n3uHrdIM0f6Q5Pk/UtNvtMv57C/ha3vLZzHNC4oVYf57HvnpmLLHJESibiXlJw MSQeYQ2WME98g/8AKdeXP+2pZf8AUQmYXaX+LZP6kv8AclyNL/ex/rD732fnkz2T5H/OX/yZmu/8 ZY/+TKZ6f2F/ieP3H7y8l2h/fy/HRhebdwnYq7FXvv8AzjD/ALw+YP8AjLbf8Rkzifa36sful+h3 /YvKXweh/mx/5LnX/wDmFP8AxIZouxv8bx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+ MVz/AMmGzRe0f+Jy98fvdj2X/fj4/c89zeuudirsVdirsVfTf/OOf/kv5P8AmPm/4hHnnntR/jQ/ qD9L03ZH9z8XqOc47R2KuxV2KuxV5p+cX5WR+arA6ppkar5gtE+EDYXMa7+m3+UP2D9B26dB2H2w dNLgn/dS/wBie/8AW63tDReKOKP1j7XzBLFLFK8UqNHLGxWSNgVZWU0IIO4IOeiggixyeYIpO/IP /KdeXP8AtqWX/UQmYfaX+LZP6kv9yW/S/wB7H+sPvfZ+eTPZPkf85f8AyZmu/wDGWP8A5Mpnp/YX +J4/cfvLyXaH9/L8dGF5t3CdirsVe+/84w/7w+YP+Mtt/wARkzifa36sful+h3/YvKXweh/mx/5L nX/+YU/8SGaLsb/G8f8AWdhrv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4n L3x+92PZf9+Pj9zz3N6652KuxV2KuxV9N/8AOOf/AJL+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8XqO c47R2KuxV2KuxV2KvGPzv/Kf9IRzeaNCh/0+NeWpWiD++Qf7tRQP7wfteI9+vWez/bPARhyH0/wn u8vc6btLQ8X7yHPq8X8g/wDKdeXP+2pZf9RCZ1vaX+LZP6kv9yXTaX+9j/WH3vs/PJnsnyP+cv8A 5MzXf+Msf/JlM9P7C/xPH7j95eS7Q/v5fjowvNu4TsVdir33/nGH/eHzB/xltv8AiMmcT7W/Vj90 v0O/7F5S+D0P82P/ACXOv/8AMKf+JDNF2N/jeP8ArOw139zL3Pj/AD1N5B2KuxV2KuxV2KvQvyF/ 8mZp3/GK5/5MNmi9o/8AE5e+P3ux7L/vx8fuee5vXXOxV2KuxV2Kvpv/AJxz/wDJfyf8x83/ABCP PPPaj/Gh/UH6XpuyP7n4vUc5x2jsVdirsVdirsVdirxfzj+U/wCjvP8AoPmfQoP9x8mq2balaRja BzcJWVAP91t+0P2T7dOt0PbPiaXJhyn1eHLhPf6Tt7/vdNqNDw5Yzhy4hfze0ZyTuXyP+cv/AJMz Xf8AjLH/AMmUz0/sL/E8fuP3l5LtD+/l+OjC827hOxV2Kvff+cYf94fMH/GW2/4jJnE+1v1Y/dL9 Dv8AsXlL4PQ/zY/8lzr/APzCn/iQzRdjf43j/rOw139zL3Pj/PU3kHYq7FXYq7FXYq9C/IX/AMmZ p3/GK5/5MNmi9o/8Tl74/e7Hsv8Avx8fuee5vXXOxV2KuxV2Kvpv/nHP/wAl/J/zHzf8Qjzzz2o/ xof1B+l6bsj+5+L1HOcdo7FXYq7FXYq7FXYq7FXYq+R/zl/8mZrv/GWP/kymen9hf4nj9x+8vJdo f38vx0YXm3cJ2KuxV77/AM4w/wC8PmD/AIy23/EZM4n2t+rH7pfod/2Lyl8Hof5sf+S51/8A5hT/ AMSGaLsb/G8f9Z2Gu/uZe58f56m8g7FXYq7FXYq7FXoX5C/+TM07/jFc/wDJhs0XtH/icvfH73Y9 l/34+P3PPc3rrnYq7FXYq7FX03/zjn/5L+T/AJj5v+IR5557Uf40P6g/S9N2R/c/F6jnOO0dirsV dirsVdirsVdirsVfI/5y/wDkzNd/4yx/8mUz0/sL/E8fuP3l5LtD+/l+OjC827hOxV2Kvff+cYf9 4fMH/GW2/wCIyZxPtb9WP3S/Q7/sXlL4PQ/zY/8AJc6//wAwp/4kM0XY3+N4/wCs7DXf3Mvc+P8A PU3kHYq7FXYq7FXYq9C/IX/yZmnf8Yrn/kw2aL2j/wATl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+ m/8AnHP/AMl/J/zHzf8AEI8889qP8aH9Qfpem7I/ufi9RznHaOxV2KuxV2KuxV2KuxV2Kvkf85f/ ACZmu/8AGWP/AJMpnp/YX+J4/cfvLyXaH9/L8dGF5t3CdirsVe+/84w/7w+YP+Mtt/xGTOJ9rfqx +6X6Hf8AYvKXweh/mx/5LnX/APmFP/Ehmi7G/wAbx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL /wCTM07/AIxXP/Jhs0XtH/icvfH73Y9l/wB+Pj9zz3N6652KuxV2KuxV9N/845/+S/k/5j5v+IR5 557Uf40P6g/S9N2R/c/F6jnOO0dirsVdirsVdirsVdirsVfI/wCcv/kzNd/4yx/8mUz0/sL/ABPH 7j95eS7Q/v5fjowvNu4TsVdir33/AJxh/wB4fMH/ABltv+IyZxPtb9WP3S/Q7/sXlL4PQ/zY/wDJ c6//AMwp/wCJDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVdir0L8hf/Jmad/xiuf8Akw2aL2j/ AMTl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/wDnHP8A8l/J/wAx83/EI8889qP8aH9Qfpem7I/u fi9RznHaOxV2KuxV2KuxV2KuxV2Kvkf85f8AyZmu/wDGWP8A5Mpnp/YX+J4/cfvLyXaH9/L8dGF5 t3CdirsVe+/84w/7w+YP+Mtt/wARkzifa36sful+h3/YvKXweh/mx/5LnX/+YU/8SGaLsb/G8f8A Wdhrv7mXufH+epvIOxV2KuxV2KuxV6F+Qv8A5MzTv+MVz/yYbNF7R/4nL3x+92PZf9+Pj9zz3N66 52KuxV2KuxV9N/8AOOf/AJL+T/mPm/4hHnnntR/jQ/qD9L03ZH9z8XqOc47R2KuxV2KuxV2KuxV2 KuxV8j/nL/5MzXf+Msf/ACZTPT+wv8Tx+4/eXku0P7+X46MLzbuE7FXYq99/5xh/3h8wf8Zbb/iM mcT7W/Vj90v0O/7F5S+D0P8ANj/yXOv/APMKf+JDNF2N/jeP+s7DXf3Mvc+P89TeQdirsVdirsVd ir0L8hf/ACZmnf8AGK5/5MNmi9o/8Tl74/e7Hsv+/Hx+557m9dc7FXYq7FXYq+m/+cc//Jfyf8x8 3/EI8889qP8AGh/UH6XpuyP7n4vUc5x2jsVdirsVdirsVdirsVdir5H/ADl/8mZrv/GWP/kymen9 hf4nj9x+8vJdof38vx0YXm3cJ2KuxV77/wA4w/7w+YP+Mtt/xGTOJ9rfqx+6X6Hf9i8pfB6H+bH/ AJLnX/8AmFP/ABIZouxv8bx/1nYa7+5l7nx/nqbyDsVdirsVdirsVehfkL/5MzTv+MVz/wAmGzRe 0f8AicvfH73Y9l/34+P3PPc3rrnYq7FXYq7FX03/AM45/wDkv5P+Y+b/AIhHnnntR/jQ/qD9L03Z H9z8XqOc47R2KuxV2KuxV2KuxV2KuxV8j/nL/wCTM13/AIyx/wDJlM9P7C/xPH7j95eS7Q/v5fjo wvNu4TsVdir33/nGH/eHzB/xltv+IyZxPtb9WP3S/Q7/ALF5S+D0P82P/Jc6/wD8wp/4kM0XY3+N 4/6zsNd/cy9z4/z1N5B2KuxV2KuxV2KvQvyF/wDJmad/xiuf+TDZovaP/E5e+P3ux7L/AL8fH7n/ 2Q== + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:75FE812EFA94E911B987F622BD994B0C + uuid:717f5cd6-4b5f-4555-8584-c15b50a65740 + + uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:75FE812EFA94E911B987F622BD994B0C + 2019-06-22T16:33:43+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Cyan + Magenta + Mograsim Blue (7,83,235) + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + Mograsim + 1 + + + + Mograsim Blue (7,83,235) + SPOT + 100.000000 + RGB + 7 + 82 + 235 + + + Mograsim Orange (255,83,0) + SPOT + 100.000000 + RGB + 255 + 82 + 0 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 40 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 36 0 obj <>stream +H‰TM +Â0F÷sŠ¹@“ÌL~š­Q\P°.¬ ½?8‰b+L|yùˆ=´Cq¸Ûg'tF8螙ñ5=^N <‘Ðé"”P㠕gÈYǽÙg‡â{#}=ßà +g°E=ã¢÷q[$U:ã‰â*í"a—´Q/ªh¤µ4Ä;~õ‘È_½.¥Ö¯ÎVГ±¦„þKú¼ MÏ!™~òà¿ó`’œ;¥ +endstream endobj 40 0 obj <>stream +8;Z,f;%eL($q1-eQc!eB@rRu>;'_62QH[j`r(36'S"3HHo3X%<%o@Hk2!FU+O9'@A +Vh?='VDRf@#r\p&mleqUMK\/E'E9[l2>lmZC]&"^j +95"(G'%j4=D]?'P$/_8'Cjt\dhLp_Tn>uh2^311(H[bs]?mAGAP!15FM;J6P"GI-O +gBipRN)0DM8H7ZrS4'1QL/FR>IM#j!_u/>@4FEE#&mRh+s,t5QJ+tT\q=:+;q6F)l +*<>sij2C`PIB^T7."CG!'gL> +5C)unqL8tSl2I=;5M^gRs4[,`!7BdB$i~> +endstream endobj 41 0 obj [/Indexed/DeviceRGB 255 42 0 R] endobj 42 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 34 0 obj <> endobj 43 0 obj [/View/Design] endobj 44 0 obj <>>> endobj 39 0 obj <> endobj 38 0 obj [/Separation/Mograsim#20Blue#20#287,83,235#29/DeviceRGB<>] endobj 37 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_blue.ai) +%%CreationDate: 6/22/2019 4:36 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%%DocumentProcessColors: Cyan Magenta +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%DocumentCustomColors: (Mograsim Blue \(7,83,235\)) +%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) +%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 47 0 obj <>stream +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 20907 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C4585FD6DFF7FFF0885FD6BFF5B0EFF0F08A9FD69FF850837FF080908 +%A9FD67FF8508090EFF0F080F0FFD66FFAF090F0837FF080F080F30FD64FF +%AF080F080F30FF310F0F080F31FD63FF310F08310931FF080F080F08095A +%FD61FF3009080F080F30FF310F0F08310F0F5BFD5FFF310F0F0F08310937 +%FF080F080F080F08097EFD5DFF5A09080F080F080F30FF0F08310F0F0831 +%090F85FD5BFF5B0F090F08310F0F0837FF080F080F080F080F080FA8FD59 +%FF7F09080F080F080F08090EFF0F08310F0F08310F310831FD58FFA90F08 +%310F0F08310F0F0837FF080F080F080F080F080F0831FD56FFA931080F08 +%0F080F080F080F30FF310F0F08310F0F08310F0F085BFD55FF3108310F0F +%08310F0F08310931FF080F080F080F080F080F080F085BFD53FF37080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310985FD51FF5B +%090F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F08 +%85FD4FFF5B080F080F080F080F080F080F080F30FF0F08310F0F08310F0F +%08310F0F080F09A9FD4DFF85080F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F08AFFD4BFF85080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F30FD4AFF +%AF080F0F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F +%080F080F080F080930FD49FF0E09080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F30FD47FF300F0F0F08 +%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F +%080F080F08095AFD45FF3009080F080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F7FFD43FF5B0F08 +%310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F +%080F080F080F080F080F080F85FD41FF5A0F080F080F080F080F080F080F +%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F080FA9FD3FFF850F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%37FF080F080F080F080F080F080F080F080F080F080F080F0831A9FD3DFF +%840F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310931FD3CFFA93109310831 +%0F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F08 +%0F080F080F080F080F080F080F080F0831FD3AFFA931080F080F080F080F +%080F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F0831085BFD39FF37080F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F080F +%080F080F080F080F080F080F085BFD37FF5B080F080F080F080F080F080F +%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F0885FD36FF310F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310937FF080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F08A9FD35FF5B080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08AFFD34FF310F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080908FD34FF5B080F08 +%0F080F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F31FD33FF +%370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F080F08 +%0F30FD2DFFAFFD04FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F080F5BFD2BFF5BFD05FF300F0F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F08095AFD29FF3031FD05 +%FF37080F080F080F080F080F080F080F080F080F080F080F080F080F30FF +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F7FFD27FF5B0F31FD05FF310F0F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310937FF080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F85FD25FF7F090831FD05 +%FF5B080F080F080F080F080F080F080F080F080F080F080F080F080F30FF +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F08310931A9FD23FF850F090F30FD05FF310F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F0831A8FD21FF +%A90F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310F310837FD20FFAF3108310F0F31FD05 +%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF +%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F +%080F080F080F080F085BFD1EFFA931080F080F0831FD05FF5B080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F085BFD1DFF5B08310F0F080F31FD05FF300F0F0F08310F0F08310F0F +%08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F080F080F087FFD +%1BFF5B080F080F080F0831FD05FF37080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F09A9FD19FF85 +%090F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F080F080F08A9FD17FF8508 +%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F080F0FFD16FFA909 +%0F08310F0F08310F0F30FD05FF310F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F080F0EFD14FF +%A9080F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F +%080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F31FD13FF0E0F0F0F08310F0F08310F0F31FD05FF370F08310F0F08310F +%0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F080F080F080F080F080F +%080F080F080930FD11FF3009080F080F080F080F080F0831FD05FF5B080F +%080F080F080F080F080F080F080F080F080F080F080F080F30FF310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F5BFD0FFF300F0F0F08310F0F08310F0F08 +%0F31FD05FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%310931FF080F080F080F080F080F080F080F080F080F080F080F080F080F +%080F080F080F080F080F080F080F080F080F080F08095AFD0DFF5A09080F +%080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F +%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F +%31080F85FD0BFF7F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F +%080F080F080F080F080F080F080F080F087F3009080F080F080F080F080F +%080F080F080F080F080F080F080F080FA9FD09FFA90F080F080F080F080F +%080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F +%080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F85FF0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F08 +%31A9FD08FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F08 +%0F080F080F080F080F080F080F080F0885FFA9080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F0831AFFD07FFA90F080F080F080F08 +%0F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F85FFFF8508310F0F08310F0F08310F0F08310F0F08310F0F08310F +%0F0831095BFD08FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FFFFFF5B080F080F080F08 +%0F080F080F080F080F080F080F080F080F080F085BFD06FFA90F080F080F +%080F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F +%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 +%310F0F080F85FD04FF5B08310F0F08310F0F08310F0F08310F0F08310F0F +%08310F0F080F087FFD06FF0F0F08310F0F08310F0F08310F0F080F31FD05 +%FF300F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF +%080F080F080F080F080F080F080F080F080F080F0885FD05FF31080F080F +%080F080F080F080F080F080F080F080F080F080F080F0885FD04FFA80F08 +%0F080F080F080F080F080F080F0831FD05FF37080F080F080F080F080F08 +%0F080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F0831 +%0F0F08310F0F080F85FD06FF37093108310F0F08310F0F08310F0F08310F +%0F08310F0F08310F0F5BFD05FF0F0F08310F0F08310F0F08310F0F080F31 +%FD05FF310F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F083109 +%37FF080F080F080F080F080F080F080F080F080F080F0885FD06FFA93108 +%0F080F080F080F080F080F080F080F080F080F080F080F087FFD04FFA90F +%080F080F080F080F080F080F080F0831FD05FF5B080F080F080F080F080F +%080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F08310F +%0F08310F0F08310F0F7FFD07FFA90F090F08310F0F08310F0F08310F0F08 +%310F0F08310F0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F +%30FD05FF310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F +%0837FF080F080F080F080F080F080F080F080F080F080F0885FD08FF7E0F +%080F080F080F080F080F080F080F080F080F080F080F087FFD04FFA90F08 +%0F080F080F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F +%080F080F080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F +%0F08310F0F08310F0F85FD09FF7F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F080F7FFD05FF08310F0F08310F0F08310F0F08310F0F31FD05 +%FF370F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF +%080F080F080F080F080F080F080F080F080F080F0885FD0AFF5A09080F08 +%0F080F080F080F080F080F080F080F080F0885FD04FFA90F080F080F080F +%080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F +%0F080F85FD0BFF5B0F08310F0F08310F0F08310F0F08310F0F08310F0F5B +%FD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F +%080F080F080F080F080F080F0885FD0CFF3009080F080F080F080F080F08 +%0F080F080F080F087FFD04FFA80F080F080F080F080F080F080F080F0831 +%FD05FF37080F080F080F080F080F080F080F080F080F080F080F080F080F +%30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD0DFF300F0F +%0F08310F0F08310F0F08310F0F08310F0F5BFD05FF0F0F08310F0F08310F +%0F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F +%0885FD0DFFAF080F080F080F080F080F080F080F080F080F087FFD04FFA9 +%0F080F080F080F080F080F080F080F0831FD05FF5B080F080F080F080F08 +%0F080F080F080F080F080F080F080F080F30FF0F08310F0F08310F0F0831 +%0F0F08310F0F08310F0F7FFD0EFFA9080F0F0F08310F0F08310F0F08310F +%0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD0FFF85080F080F080F08 +%0F080F080F080F080F087FFD04FFA90F080F080F080F080F080F080F080F +%0831A9FD04FF5B080F080F080F080F080F080F080F080F080F080F080F08 +%0F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85FD10FF +%85090F08310F0F08310F0F08310F0F080F7FFD05FF08310F0F08310F0F08 +%310F0F08310F0F31FD05FF370F08310F0F08310F0F08310F0F08310F0F08 +%310F0F08310F0F0837FF080F080F080F080F080F080F080F080F080F080F +%0885FD11FF5B080F080F080F080F080F080F080F0885FD04FFA90F080F08 +%0F080F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F08 +%0F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F +%08310F0F080F85FD12FF5B080F08310F0F08310F0F08310F0F5BFD05FF0F +%0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F08310F +%0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F080F +%080F080F080F080F0885FD12FFA931080F080F080F080F080F080F087FFD +%04FFA80F080F080F080F080F080F080F080F0831FD05FF37080F080F080F +%080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F0F08 +%310F0F08310F0F08310F0F080F85FD13FFAF3108310F0F08310F0F08310F +%0F5BFD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F +%080F080F080F080F080F080F080F0885FD14FFA90F080F080F080F080F08 +%0F087FFD04FFA90F080F080F080F080F080F080F080F0831FD05FF5B080F +%080F080F080F080F080F080F080F080F080F080F080F080F30FF0F08310F +%0F08310F0F08310F0F08310F0F08310F0F7FFD15FF850F08310F0F08310F +%0F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD16FF7E09080F080F080F +%080F087FFD04FFA90F080F080F080F080F080F080F080F0831A9FD04FF5B +%080F080F080F080F080F080F080F080F080F080F080F080F08090EFF0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F85FD17FF5B0F0F0F08310F +%0F080F7FFD05FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD18FF300F080F080F080F08 +%85FD04FFA90F080F080F080F080F080F080F080F0831FD05FF5B080F080F +%080F080F080F080F080F080F080F080F080F080F080F30FF310F0F08310F +%0F08310F0F08310F0F08310F0F080F85FD19FF300F0F0F08310F0F5BFD05 +%FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F080F +%080F080F080F080F080F0885FD1AFF0E0F080F080F087FFD04FFA80F080F +%080F080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F +%080F080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F +%0F08310F0F080F85FD1BFF0F0F08310F0F5BFD05FF0F0F08310F0F08310F +%0F08310F0F080F31FD05FF310F0F0F08310F0F08310F0F08310F0F08310F +%0F08310F0F08310937FF080F080F080F080F080F080F080F080F080F080F +%0885FD1BFFA9080F080F087FFD04FFA90F080F080F080F080F080F080F08 +%0F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD1CFF +%A9090F080F5BFD04FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF +%310F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF08 +%0F080F080F080F080F080F080F080F080F080F0885FD1DFF85080F087FFD +%04FFA90F080F080F080F080F080F080F080F0831A9FD04FF5B080F080F08 +%0F080F080F080F080F080F080F080F080F080F08090EFF0F08310F0F0831 +%0F0F08310F0F08310F0F08310F0F85FD1EFF7F080F7FFD05FF08310F0F08 +%310F0F08310F0F08310F0F31FD05FF370F08310F0F08310F0F08310F0F08 +%310F0F08310F0F08310F0F0837FF080F080F080F080F080F080F080F080F +%080F080F0885FD1FFF5B0885FD04FFA90F080F080F080F080F080F080F08 +%0F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F080F08 +%0F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD20FF +%315BFD05FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F +%080F080F080F080F080F080F080F0885FD20FFA985FD04FFA80F080F080F +%080F080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F +%080F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08 +%310F0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF31 +%0F0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F +%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 +%0F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F +%08310F0F7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF31 +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F +%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 +%0F080F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F +%080F080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F +%0F08310F0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF37 +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F +%080F080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F08 +%0F080F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F08 +%0F080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F0831 +%0F0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F +%0F0F08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F08 +%0F080F080F080F080F080F080F080F080F0885FD26FFA80F080F080F080F +%080F080F080F080F0831FD05FF37080F080F080F080F080F080F080F080F +%080F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F +%0F080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F +%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 +%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F0831 +%0F0F7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 +%0F080F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F +%080F080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08 +%310F0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F +%080F080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F08 +%0F080F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F08 +%0F080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F +%080F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F +%08310F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F08 +%0F080F080F080F080F080F080F080F0885FD26FFA80F080F080F080F080F +%080F080F080F0831FD05FF37080F080F080F080F080F080F080F080F080F +%080F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F08 +%0F85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F +%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 +%0F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F +%7FFD26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F +%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 +%0F080F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F +%080F080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F +%0F85FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F +%080F080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F08 +%0F080F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F08 +%0F080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F +%85FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F0831 +%0F0F08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F08 +%0F080F080F080F080F080F080F0885FD26FFA80F080F080F080F080F080F +%080F080F0831FD05FF37080F080F080F080F080F080F080F080F080F080F +%080F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85 +%FD27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF310F0F0F08310F +%0F08310F0F08310F0F08310F0F08310F0F08310937FF080F080F080F080F +%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 +%0F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F08 +%0F080F080F30FF0F08310F0F08310F0F08310F0F08310F0F08310F0F7FFD +%26FFAF080F0F0F08310F0F08310F0F08310F0F30FD05FF310F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F +%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 +%0F080F0831A9FD04FF5B080F080F080F080F080F080F080F080F080F080F +%080F080F08090EFF0F08310F0F08310F0F08310F0F08310F0F08310F0F85 +%FD27FF08310F0F08310F0F08310F0F08310F0F31FD05FF370F08310F0F08 +%310F0F08310F0F08310F0F08310F0F08310F0F0837FF080F080F080F080F +%080F080F080F080F080F080F0885FD26FFA90F080F080F080F080F080F08 +%0F080F0831FD05FF5B080F080F080F080F080F080F080F080F080F080F08 +%0F080F080F30FF310F0F08310F0F08310F0F08310F0F08310F0F080F85FD +%27FF0F0F08310F0F08310F0F08310F0F080F31FD05FF300F0F0F08310F0F +%08310F0F08310F0F08310F0F08310F0F08310931FF080F080F080F080F08 +%0F080F080F080F080F080F0885FD26FFA80F080F080F080F080F080F080F +%080F0831FD05FF37080F080F080F080F080F080F080F080F080F080F080F +%080F080F30FF +%%EndData + +endstream endobj 48 0 obj <>stream +%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%d_²Ý#)ɬ`1¦ó(ÉÌ"‡|™}˜}±ÕïS…fîy›3] ²2Cà 0\ +=>UüÍÿñ«ß|yýÕëßÞ}®†Ý“/þæoo{ýæÇ;’w?}ñâÛ·ïހôƒ_ÿp7ÎWžºþiyjOþÓݛ·÷¯_ý˜¿» +øí-ÞÿÁá÷oîß¾»öjw{÷Rúáî?Äoÿáþ݋;ùýýóׯžþöÅ·wWÏîèMKUÇgïä÷ó¦éGÓ0.»øã0ï~õs>òìÕž½}{ÿç;´ +›Û¿þöÕW÷¯¾Þ¿þŸ?Þ¥y÷e,yñ)â÷ÿë»·=tUÒÂ'¯ŸûòîÕ»_½yýüîíÛÃë¯ß¼ýñîð'éÄϟ}-¿y&]ÿ4=½½q'Ý|ùìÝnœ8&×?§§ûoï_|õ‹o_þöNF`^FÒÃSVôo¥© ÿ&=?ýéK!ýæîÝ;ù0igè¿á ãþúeý„üüõ×ož½½¹ÛˈíþíùïJø»)¤û!Çî×?Ùw/HUWÔcåaJq‘¿—iLóòޚþÏ]÷R÷ô/ß<{õ5žŸRÂCk¹.išåÿú+™¨;¡7ÿ~÷ê¿ÿ°ŽÄ›×߀„Þî¾Lã´Ãÿûí?ܽüæ…Ì>'iJóU’éá_ýõa™>øe¯J^–Ý—s®æyJc¼eñìÆ´\-ÅÞhÓ{÷‡û»?þx÷‹×¯îlB¯ß¼û.«‡Aÿk¿úõ·/îÞüã«ûwòÑ3i‹ÎèÏ_u÷BÞhUܾxƉdÛí‰xöæë»w²_¿øö7MñVdÕüìٟî0Ù£5òËoî^ýÃëâ§~9NsØå1Èä$éÖTvKŠ»±°‘$팳·;¶ÿZí¨ +Õ&2¦îW²ú~ùæþëûW?®ß˜ŸþäÍýWmIæiWô?ìÇUéþ¿ÔÿÛçJçß½»{U¿_¶ÃáçÝâ®~þK´zóê«Ã뗘‡·Ü½wÒ¾¬ ¯¿¶ß¶ø;©âÛo¬$<•iû՛ûW¨øÉ¿Ðߕ§¿zñ­üò'o^ûÍO_ýîõ“/~ ,ìŸîž ›’¹ýj÷ËßþùAÑ/ž=ÿý×w¾»þûWwïîÞîö²o…îÏ +Oúæ‡ï©Xúûæn§¿•wù£üý;üý˜÷w¿Ò*Pêßÿ[Èñŋ»W_þ?ß¾}öîÏ/_õí ùíÍ«?ܽxýÍÝîÙ«¯vÿüìÍ7iâW/ž½zöfÇ_Ôúzw?}õîîͳwÿ‡ÝËgÒ¨<ô³û?ȋÏd|Ղ,§odÔøŸY·öÐݯÕÔ³w¿¦u÷ê«·^ûõ«¯_`¿Þ´1vDŸLõ¿ùÓËß¾~qÿö¥WÞSüߏüRÖW¿|¥ŸüæÛ·¿ßýÃë×/¼æŸ ¯¾{óÍý«·w/6_-\Dßû«jÈ>×6ÏÿMž½xq/çÙ7¿¿~®•ÿf¿ÿÝýÝÙÆ.¼ÿ¨ÕõœSu®Õß|s÷çûg/ζxúÚ_]c¶w7_Ý ï¼À|æ7|öîùïw?»ÿí›goîïÞ³[1Ù¿»õ•|èo¾½w獠38W¾¾{{÷îÏï„A {›‘n»Zõé©7ýqòå—4rÆî_õüäͳ¯îå( í'¯_|%-U·˱™wû¯ž|ñ¯O¾ºÿõq÷7O÷"þ!oÿŒ›2u%X‰Vÿ_ˌÿKóªd/eXVåº+{)+Ç®Ü ·Rãm-«OëÿL] ]‰«’´Èàï<ÎR2ÿ.]YVåzÜ{9xُG)õ§£ÔxoH;Ž·}量ŸWÿ„®Ä®¤iFyò…þ=宔i‘¢ÿ½îÊ^˓/þïósziVÃj^c7»mŽ¥Hužc7Û:»ý,)ø³[Vó¼t3-ÿ•uÎë¬ï}¾õoÌöM?ëò_ý3œóIf Ÿñ ó‹¿1Ø뙥p¶óf¦¯­¬çsŠ¿oXŽ›Ù¬ÍÎe›;«:s‹Í™Ì“Ì©Îæì`åÈrcå¥n3tg3§#g+ÚøŽëž{æ–#4qföqaŽüêѾræê¹ÆZaÛhk +!Ä0‡,ªíöRŽáV¦}Œ!ƘbŽ%.ñ:îã1ÞÄ[Î)…$jlÊiI×iŸé&É>•OeÉÆ9Íó\æe¾ž÷óa>η²(FŒ˜Sž³¨MyŸù˜oeÁŒe*±¤2—\–r]öåXnÊ­,™Ó%,q‘Š–²,Ë~9,7Ë­,Ÿñ:\Çët=_—ëåúúz/åp}¼¾á’š¤ qŸöy_ö‹üj¿?ìoö·²Ìd49èáé ŸpXׇýáp8neٍœŒxLÇù(Ÿw,Çå¸?Ž7ÇۛA¦'Üěù&ߔ›åF»9ÜÈ*¹¹¹¹ÅÒ¸•A»M·ÒÙ[ùüÛk)Òè­¼z»ùÃ98­N»éʱ+‡®ìWåº+K-Rã"Í·’»2¯JêJìJ芬F©qòÒs¶Æ•‡þãoú?ÇU9h‘!Ãßû®\weY•Ò•Ü•¹+ÂÐo’—¸*¡+SWÆ® }Ñaò…M@߁þÏ¡+{-u«®æs=‹ë¹«³¶ž©õìȌH±Ÿ‘n&Öã¿uíÍsTe¼–͘ÚH®Æp=n›ÑZŒ×z\tL®­,,ÅJ¶2³$+‘%X‘uÇÍhgªž +¾jç´±úgÏrmea)Vd³ËæχÙJ²Y‚åÉõ ¾ÚÍé çqÏy+œ§ÄyÁ\ ý#Gûšc›9š‘£7r´n8:{ŽF‘Þeö=F/öêÈ^\ó»3¿2ò«ä[dÙÜȐ„] [+ÂÞfarQ˜Ý$|^¾T–ԍ öA˜áµ°År…A&a”AΛQÎà[™ú£ Ê~¹vZ–,Œ5 ƒ rBrbßʂ8Ê`í… /E¾QXò,¬9– Lz”³ýV–ÊQ†rŸ¯…‰—œ…'aëA˜û(²À­,¢£ ï^Xÿ"G@–ƒ ɁäXgùFYÒ72Ù94®åð(r„Ì)ÉaäPE¾¸•…w”)Ùˁ³ÈÁ“ã,GP”£h’i-p#Ë㠇ԵVòrlÍ!Éä E¢¹•Åz”iÄ1‹ƒGq’£G5ÌsÊ~;؞ijõI>+L~ˆ{ +*PˆˆQ×ƅVYë¨5´÷! L+~q۝Ê)YcIÖ×(këÜʚºc„§þèI5rÃâ´JÜÖõIJ3 '–J"0ÔOÀÙèçâ,K¯œ9ƒŸŒ8¯Ñf}ßeŒ`l®r¥ŒÊ£IÉeëíT`X ã ·^³üLYðX)ØPºúsÔàú„ƒáótMÑæ&œ¬Š˜£‹O*0ª¥‚áâý42šè®Ý¬¢x½©²°¶ZW«‰õp ôý³ƒäßßO¦NäJð Ðd…dY){®™ ÑO²#¤2«ž]µeÕXVϴȶ|ôÏ0³5+{#óéØlåϲ‘÷._×Ò4¦²Ò¥²éWZÒJ3½Lj Æ ôÊü+•x­íÕÓÊuA×&XdWZäzÕ<ð÷²)eSšÆªÿšM—íK<)á¤LgŠý‘û?'ª#vg/ûùßdzEX‹¬Âƒ—½—ë e¹XJÕ0¥Æ¼)ó#KÓ^S_¤ÆÕÏnáhÿ>-áBáҐ§G–sƒ|¦H{òÑÎÚ +>éÏ竱;^GX•~«´¢r[µ…TÛH1Ý»ÚNlßË®V=½îöji[a»·«ì[÷r¿{÷¶««átïf·:ÌV’Û$š]*ô»Õ­ìSù—ÛBšml³7ëî<òhª6–Þƶ?»7÷+ËÜéî¬6œín-++_³ +UËйýê?¯l‡é¤Ä•µñò®\[®¶6Ësûö¡Ý¼Ù«ÜÕ~÷á;úÁ]ýW°?„Þ^½:U°Tj9U°ª¬2Pa¿¡D²˜‚9›L2¹zuÛI%y%•LŠu%‹*֓/Dɂš¥JÔ¬*–*YZTÑ*®hS´ jDÍÚSÑ*´aÉj¤²5r£ÜRÿ>¢ © ˆª¥ÊÔ­IÕ-*\GS¸öT¸ +.¨\`e²vLíº¥. ÅKU/(_…ÊÔ¯Hõk䶺¥ +v  +% jX–fñ¨hZ¢¢*c¢ŽÑtC…ì( +T2(ePË ˜å˜¨šA9 d]´[Óá÷Z„ƒ/”ï áeJy3^ø3RÀjœb°NH“ãTv+TÏP"9xÏ»;®ÝIa՞«÷<¹—¡(/ ¿'²‘sÖ/]I6+®¹â‘²cz™eÃíÎò¹ä‹3òÄã¸ÆEnò™wµ«¢Zz YÿgmìLk;\=s©rŒ¦Ò¶VemóK›2¯Š+Kb^Ù u¬u¹Þ”ý¶˜E³/Ǔrúçö´ÔÕ& ²?ÉÇ3e:[ÂÙR­ˆ§%](óÅâöd©1oJy°,ï)"R¬¬ÚçËþ‘…_j<<²W¤ÆS깩|t‘/ýî#ÿœ9^?º&7 ®µNæDÑ­¨=µÚW³•j]¬˜uVjTkmýSYEÛBuZ*¿­ºu•ú«¥XíƲ¾ižÒ2{©¶æâe±ríe†ga^:áXçxUó#œçN_Zù)V<é7ºÄ…zγ§=è2ïy€ç¬xŒñÚÒ.ó˜3œå}Ej|<‚ƒl8½\Î5>šSt»ÿ"Ÿx$W8åìê‡Ë_pWÙve¸Áî ¶T:Š!‹…({P¹sï…1¨Óx0·1lj®ã"‚guá@–CGȁ"+œÈrÆP­®d8“oèNV‡r€J§2þÀ±|MQÎel&u0ÃÅ ù“næ'_ÐÕ\ •Óݼött§ó R"$N8ž£| déL~qþšN胰sEײcDèŸ(üÃ) ·ô|©,{šj)X˜GÚ*ÕpWCvÏtZQ=º®Õy} sÂF¿¥{p.\ùo引ã6NkÀEÞË5{úü®®æp@¿:hö¸›ä_ó® WQöÎ. ×'<ü›'_üÍÓÇ<»{¦Î«$O¦aWÆ+ÑçËndmW㜗ìÿÅxª€ïTÊå9Mök#ÀZËt†[sŸ\“~Ï JmšÉ Û~Ƌ¢™‹êÎʖ˜†…@ôqòIãZeájNÓ}ÖgªÐ¾n„Ï¢²4)óÅ"üY+ݲh“ðYT&ӗ–Uei–þë>O…Ÿ0—S¾*!,¨ª¤¼|ê„n«;·fíã—åJøüÅ»~ +õì ¿Y!˜`™ÿòåÝ €2í_Rq¬Ìÿâ¬óÖæd¬2™›/c¼6Vxì}¶Æ梡f(bzœ  OyÈQµçávKó‡j3³kd7äpÀSáàÒC뚶­ã4¡"«gDm»j#Æi2öR]ž;IÇ©#ÐÒÅs.£Q{Ëmêì4Ž)"˜G%lÍcÙÐ ŠO0„ d7†Q8$w{>Œ½èÂ]l—~²æ†ïñÍÐÓ»sÇG?­—ê’?úÄA>3¤²R!|”ÅÀW(Aî‚Ô•dD id ”®’õŽÙ½É:ʆjh¸†2Œgƒ»4©9,›Ù+š}lFáGcS…KqOz3«‹zR<‘ሎŽº6ÄP5'C)"hàqsâtÝTK¢zƒKωôL):S’.4^SžÞS–Ù£àtKɺÉÖ +ÅÄ<ª|­v“±)e8Sᙐ³!i‹ÄKi»PÚ®òöq%so¤n“¹±*„“rw•¼e—­eo¬’Å`ŠŽ7îœ(yWˆg/y(yß@䒹WÉ;t’w6©{O©ûH©[áŸMގ¼ YÛ¥m‘ʏ”¸«¼}*q'“¸)s»¼½§ÌM‰Û™•AÞ šÜéN;ý÷ÿ{M5C2qfV6—ÝMsÞÕõ;º¾«‘ºÂŸG7[‡Á·¿ÃêïhŒºB¥“ƒãÕ$.Œq<¾‚ä³ýWéú_u{¶ÿ^¯LïGƒQWùBÅ%ó&n— €:)®T,ØG¡ÁFgקpÐÝÌÁf âÚÍÆ[svSóÈÜA™­t@f©q f>®À̗×g1Ãú¼^¥²²¹‡1¾foͶ¢Óö¾zuý.< +¹ŠeeëJžyT¶õ f§\^]Ÿumßؐ:¹®s)²²uµg[ñ3µÊ1ʓÉÛõ QGªî€îîÇœsfmöå¼Ël:1{Ÿ8œ tXƒîO‚dž„>l@ùç Nƒ ¬/5ž …Èç¼q^ˆDӞŠØE—öЈà³;iß¹[Ú^ê÷S·«N YW‹¥ö‘9Cî‡Ö/Ü£@ýFaa‰¶„K1WÒNä•/OwÖ®ÏU¡>ÊXª­e\ÇB×(èý\ãž[Ìsý’¦¨™Ö©YªT­£š[”xU…šÚÓâ—]¡é˜£¡¼ÖñÊM-9RnjýF¥ïUyÃZ¬Uùó†¦5~£Â›oø»µ¿VäתüZ™/fåÎ~Ê,¹JßÔúªØOžñdèÔûÛNÉ¿q]Îí…WÔÆ۟ÅKñҎµvH'/±©1t¥Åô«Òã®×Ѝ^ƒæ¤ +‡l á°*û“r½)çþˆ@».gví.”¤Æt¡Ä.<ژFã3”Š…8ž!¤²×A¤§ñëPÒuT|oÞYYÝóÊCÛ|´Ç•éuexUo­ûk«ÇöÚç9Û<é¸N›@Žƒ{'—M8GhÆW3¿ÞdY‹d{n…ż–™blõ`«)¶ù°×^ìæ‘)Ëʱ`õfO«€2°uØÇB©%»É6™,ï "ӏ4Ä×@ 9˜1w¢!!*1ÕÀ Q-„Î&‘£jÈ­é+ÊP•ííi¾6#p éGfSè«÷öÕ-áB?7×ó­™kNÒ7<¥â<ÜYƺÍÄ:ŸÓw“'æ3e‰¹ÎѲÄ|çÙm¾ÿêõW¯œ!æ4 —ñ”ÕËý>Óä~¥v­3ÿ8Ï8?C]࢚™¤VùŠøɼvÎs[¡#¥ô–ßN†4Ä~?OY¸¯Á…Á" ͪ7²Õ¬S¸cþ¦9ìdþ6‘Ofš%]Öº +«A-g]¶ÐT`ӓ/Ú´†5¨iLÌ$³&è 37 L8Õ<£ §É”Ÿh†š^0› +U•ª¦§Ô?¦ŒQ-«JZUÚÖÎÆ/³JÐÒ^®‹,€é¤„³%^(i]Lme~Tɗ }×çKù¸bÑà+g´ÉÓbAŸ±|_ã¥':©¢Êo³s•Ú&Jy•5s"-SFPãq“Î +²WiB)—Ì ôy2 ijA/-ÐÉ— léáM¢ÂU e oZ79Àò$¼IA–³‡… ÚwANƙ,Ôi *|Z<%zª¥š5ôÔh¬¦o3¢TÓJ3»´(šf¦·…ˆ§V™/”tRÈ¥Æùb9ã_¹PšÑªvåCʉi]¤Æ÷<ñ¡åÑ5>úÔø™ÿüïQã:ɍÅB$j!×êœòÄo³é5û.ø‰ézÂQÔ2Ô¥¹w¡åÝ:h?­ò©Â·{7ÓyŽRyJ…mŸ ™<ËU*_ÉL ©ÜåzÅYÔ¿å-¿LfÑi\&™éSNëŽÓÔ?m¹®ùÌ +<´…IUŽ£rԊë\â>Ӆ²á@côeŽô>þäEj|à·QæzU¾¯ñ/UãÆE=úσ5®AèáÄΒWÖ!³ 1'g0i©KlÙGyѤv•*7U‡ûlV-ÂUTrbØx Qº¦MëÖå§Hãtï\¿¥ü,`)“‰@! CaO¾ ;]A`-0µ«¿ †@Gz2؎úäàÇUÞ܉ž”7 GÑ?‹›ƒ§w0Gº–ºçëœVVÝb Im‹ {o;ͪלzmh­¿l¥ÛîaяgÊiÎõL–Éò¥?®ÄÇÃ)¿¿Ì-R㣟ýÏTcg&;ž¤ÞËòÍ7I¶ ré-oÚÌ|i3¥íiòšiî-3Ú^֛:×`䂉 æ-¸ÓàJS7šÆ-™ýL£RÍzFW™§—.¹†ð‰DQã“Zz›\ÚÓK·h„'_˜›«º¸ª{+XTÂèN­c›pÝå6kn,º°„GM«gk×Uu\5§UsYõ«ÐœU–Ùr<“Ùrë¦Ú:©.¸§ž|±qP]rO­œS9¦¤Æ Ž©sN©G¸¡4ì±åð˜b÷t¼¿\2hæóü¬å¿ç(ßs”ï9Ê÷åóÕø=Gùž£|ÏQ¾ç(Ÿ¯Æ•›ýÁË?þ—ôÞç)–q¡3=.™PIV!(9'uƏÂ÷ÎüƒÿœÏ9ò?kµÕ§p°1ìÒx5·[yö7¿ò7¤YùÍ<^!ÑÄ.Ä«yìÒm=ðȦ†,§iÞM¸Þ{ÉçjØ>ÒjÈù¡§:aº€G˜€GÁ3¾ÝlØÇ ûb©§Ýõñ¤>¬xM[À5þ<äù9ñRyÌ|ƒÆ ?:0þô +¯roÔY0û[ +s‡‘ëïùìïøܔ¿Úšú”MOÌØìk¶B|vÖ³¶šqævãºb7<‘߸d—ùíN]Šš–f©t –ºôJŸå™5 sQ&•Cµð¶†È|w%Ž¹í†—a:ó P¦ÏW§ÅF§aYdZ/<û€˜ã ÏjHÖ ¸TÐ}ÐÇU`­–Þ|þñùtÖyžqN›½1ç™û²2k°M^ŒK°é#À¢ù,zæº뚐Á+`lá|oÎChWý²k Ž†¿þèè{ÁŒàÇ5 â;Ü`+҂…m¼§…e®Ûh¡!§¼§tÀÄ5Ùþæ/m g÷CØîÖM›¼¿}2=Xn<×oËô›ºëù4+àž),³oÙòùΞÇ÷Úâ}]Óɦ1ÝÏD%4di¡ËmoñÚ75hð¥ÐEbà 'ÂĬñÖð? ªúÆ"¨ƒ)Ýq}|kŸWP÷ç;Úf<êsMD ÄÔ¼G}æ£.Dz Áñ›UjN©8Ÿb|aO>b|fåh²Íöø˜×õ4“‡é?Â8æ€ÐW…¿Íeîó¦ö ~È[Ÿ¼ ËùmX¶)X={`ÍØgì®ðYÛêr8É^!½ ºâ°^çÆÁÀCˆio×÷åO}g•Ÿó`.ïÀ=¶7'w°½äí\¸CõB²­¿à;½ÐŒ¡é#R·é¥Î%˜Ï$˜²äRT€šÊS£K1Ÿ5–Ô¿ÕS„ÊâH+¶t¹²«jlg œZd ·ÝÚIg[›Hyå-6V(m¯#'[Yƒ³DŸ/šG'a%7¼Øjá…Va?Êx™¯v–/™¤]\XµÐ¤Aaü Â.aò\dµ%YuÈʁ˦ö²³ðþ ›ø–‘…×¼D +«Ãï0=/Á=êzØ÷ÝØ Ûûâ궻½ÖeNõû +<´ Ü.qÀ5dÈcYÖÙTG“dZ@ïïAú‹w®V`å3w1<Àk·Ü–iáZE@q>„böþæT×a]ÎڴʶѾñWßòõ™Ö¹èa‹  Ø€ˆ§á¨Ùò:§DµÉðLðԅó#œ FÉÌ•…:{Ø醧H8 L,‚’B!ôÇ¿®¿ïûÓnûÖ ‚ ‰ýè+‚ëíÛßÝ'~ÝJe?L´<ŒÃBËÃ< ¢ä•ì™ˆ¦ âNÿђèû+#>s½&²Æab‚²4#üÉ(ÊSÍjÙ ¸J`:ó¯sž®Qçûoý¬õš±èӌÿµÎñ +Çõçs*lêµqûÝfþ¥q §h˜‹öŸWHœùÇy5á3Õø©*D<«AÄ­?€É°Œ©Ø- ·¼a¡²Nܯpki–ÀÀ5=¹§7v|3à€DÓuK=¾º Úuý…~µO±OwQšìmÑ6WW¤m.G[_ŒÖÃêח¢u×£­²{>|±ãã +îmýÀ;¶ÞWþjtá¦Ç^GšÁ(S …D«h¸÷eÉÿ2ӕì ×Xy=ê!Z:2Oû-_5Ýx„Übz¢Ñ&zÊ<â¦åЩÍk5XB²‰&jv½biìZhXƒ%wŽ mº¹íöLev¾¤³%҂s®Ì[x Øg-^£¯‘–]¯f¬—dèM±5•e¶ÿ/½¦Q‡):x +ö‰›>azÿ_üÝ'¡ºtô}lÀãb>êÏ÷5>öv¯Í Ûó j®uƅίqÞóúfȅeBH„! F^Ë<ðBfȁ½¨ÐžKR`'º$x4xʵÝúP¯P®w¾†ÔëéëmíŒþ²äþ*ùådù{*PÞ&pþrä÷^Ô~þ’ä‹—­ô¥ë5ËD/7ÐËÍm>=$®Xn +ÍLáY)¾­Èl\ÍøîÖ­•á}ß彪†÷šûª7½e Ø4ð`¸q#üѲ™îÍí9±ªY¾˜q¾þéR¾òƧ¾Ä“.”é|áí6çÊø±…×´Öòá5:У¹+z‡EuYŒ'ð +þ(ž ±Ï„!sZeAl×<&ÿá:"s»yˆPð҇­s›¥³½Þð†­K嬤ûžrpÈg+ 5nmˆÿñ‚ôwRãƒ*‰Ôxþ7ç/ 9½è ¿ð€êØ§W‡Ì'™E×ÙEǓ]U÷Ԟ·g_›Ë°ø…5ч-;ÑùüDãæЫ9pún ­Þ€ Çý­|øž~ž>?sþãéOªñ¼b/¨"¦¨Ð~½.'JÎ&×v”kj“«RÂÏkŽðz²iŽq=yT,ÒÔØï©ÀeËþ)NȀ¸5ŒòáÁ2=f—3¯£es„íPÁä°Ân80~•S%Eµª”¸g^D•)šDIòä=Hy×TP ¯¹ïí?^BúO_ãZµ³°oF¶;ɂã›úÿ6%²bŸ‚ßѵVSª³UQ-E5¯T\+Šó‰ãsòç/Tãà +Å¥ûK­P[?½öm{m[¯¹zt2˜T§¤ÆŬýÛê—v×N®]}QüþÖ½eO¬îÌÞ¡ùKó4‡eË`©×O,î®Zgd;0GÒDK.ràu¤~Çí¸ ýI5^P9.ST˜Í`]N•œµÔ)Hç. ý +{ËÓ®•¸éòÁ ž桬0—ܸ½w^]ìyè.õœèøL×z™çµe®«ÖòÉl兎Ç-ä#]I>q‡ÂüÇ ÒßIª$py|H懯¾ºÍÞU©št~£põªXSÐjֆ¦ÆÍæ¯Èír©qñ ꇕcíŨ—<4(ãl> óRˆhmÆ“û´£âãWwinŽgÐtY`oÂÍp…‘Ã᪖‚”ÌÔËn<Úåx5¦Ü;?­uª¥aZ1Æiæ=[ÂLǤy瓫²»Í>¨W%ï¦x•×_òÑU|ª#/uä¥-"÷,Fg{¤=:1pŒ'h-^gìnhF2¯uÚãzkl½áªþ·Ýtº¾+¶Édaûsw¿ëö–×­8 M¤³õ-߶úá UÓ;7Yqe:×·¥·,ü-Äíï¹í®Y<½ dé.H\ßý6ù’‹7‚4þº³}©œº ‰—Sɹ^–7²»&†cˆ´ôøÖmÒÞÛîדýB¸¬’8e{µÔ`E¼à¸ñò'ïÄóàøô=:Bá÷èøïÑñtü¼œÝ‡B>µ5>"jëòu¦0~~ÐúŒzä"|DønY·;«ŽvKs½·ªÝ\Uü檹»G«]4Ì[ºÎœÌ~×ëó£^·Ë9NnîX/ÅK|êªËç±|"‰¹AeZÝçy_÷À5+äõÅø½&ÍçÖu×B5¤u„àq­Î²‰ Ü^Qqò͗£//ìËüuµ¼äُåÚošÇºŠáÜУœjThdAC;e˜—ÅÖ¿qgßÛ Š·»è“+ûN¢ +ÿùîþÿûÿn÷›ç¿ÿã³7ƶÙPþR—Òœšô>òZš'_œ¤-®IÐkÒâ>añÑïÄ\'@¯‰Š˜ÝX’â©Cê¯# ._ÂÐ_Á°ï¢>%BâÐ]«À J²#aÅó†zrÏ­!hcÆù®¯ü91ÿ~ô¥?LTtyÍÔįÉnVÕUÓÒ]W»¥¼†l½0H¢J×7v“ï#ÒèoÒ]›QóAƒæãâRÎ\îñ±‘)ëÄÝåÛÔ Çói&µ&>æB¥ás]©Ô_å+báDf¿"ú»vëz蒠?¸&ޗ}ÝÌÝô$J4Ðvu»¸¥ŽêÖJ·b좂óÉþWiE>ŸD^åò¿`çœjçn‚ÏkŽ'5žr¼3šËÙTÖëDցõä‹OŒÁÊ…Õb°d•}t–¹Böjõ ½#åT—²N"ss>Ìwv§ÖÇXÏުŴُ¶:~±¢kŠ¿cKò'ã­Æ&úó4ÇG%ú[§ù³Ø-‘y>)zK£§ µËè-Ye¿EÄ.P³!uÑÅÞºÝ$ûÉçS}¿&¾_߯‰ï×ăkbì2fæÿúð—¿Só–Pžþâõ«_½¹õîþÕ×_~Ù«îýož|ñ‹oø» ¿ûÕ³wïîÞ¼­þúş޾}mÞþµ[–«ež¸ã<‡ÝãÕ ³³›ÆùJ׬_|­ýËñ÷·úCu þ˟ôçÿ*ÿþBý£ Åîç»ýïÃî«'|ë×x ¶T+Þ½õ¤½ÝÏVäú]?ë«8K\Wð +ÿùÑõ›wÇûçïî_¿zöæO»«QäGûׯ_ÈXüÔÆåéÍW÷ï^¿yºöüßeôžþÃý‹»§¿¾{þ¿ÃÿþãýþÛoµ–£vú—ºV&\{©ÆÐqJ\5QVK±,‘vip©÷^Æ¥ aÙýË3­k=’a¯†0»T®‚( 6PÒÏI*Ú¥åj™l'¬á +µ¥Œ+Šãn*ò¸0ƒ]JW£ìÀÝs¾Vҕlò°KÓՌ[Ñ"®â4—]\®DÀ¥ÉóÕäù®dGNõ½åjÈaÚùmfõ™ÍMå*Mp;”á*-x?_‚õµ¯DŸÙM3BŸ¥µYZ¡t&ý(‚p®]nˆ„l¯ u g'Ó^FY…s¾‘u`A®èT2¹ia +¥vn¤Ö)îâ|…+ªv“ θÈʈã•t ßaO„tý­ñJ¤ÝÑ¿|šÓ•ðɤIóœnž¯âX–ݘdfç¹¾7_-vh¿ÅGż¤ÔW"nƒNAæ‚ÑÀü=éFîËñJøF,”«Aô½]”¡f)ù’yV@®“ì=ú3fëLÖ³àÃeæcâÏ1ã»1óK¹€ Â|w¨EtѲ“F1¢Sˆ:o1] [«óÆ+ùAÖÜ,ã;Jßä}QWæÝe“|tœdf—e7Kc˜b}OVß8Í»<#0¾p(…[/xMÎ0!È^ ¢ídð²ðô¶º&ì © ±Õ»0H—Y%ʄ/;ì.fYœr>ØÌɇ]̓Œ„¬ExÅdU¡9i¦ÈëI†*ÈÂãêΓ.@}OfZ4þÌ(÷ýù39†¯¿ùÓÓ׿ã™ò“7¯¿ýÆ‘ó¯üúgïî¾z*lO›e÷ƒîþåŸ/<²RÒ<V%ÒÉB·í L-ðÄ6•§ÔŸ8Yï«·'–+á[26ØGÑÖr£"=<¾²jB a'|n.…Gá¾|¹–EnÔ…áL‹.X}O¶©V”´z',ö„¾W©ã°Ø‹ö ”q6ŠpF9Ü;Š¾ÁãVʂÖ‡¢ß攥¨\ oVªp nïu?\v'cs díÉ°dáU“Œ¯0—kªH.`i£0Ì(btei#Î$™ûÑú<Ùs{C„}y%N°¶Úˆ“:ÊÄ´Uët{cC·«ÛùSõ›½žM׶[b³Cn øÞ G ½Wr®³¥Ô˜¶(|@þ±D9ãm NrÖÊð +Íp 'c§ØÛ³€Ëá*ìjˆH+ŒK ü ǒEøâa¬ìt.Ž‘§ +˜Ú(|^”ŸÝå .r@ÊV_DØ-r^ˆøaïá°2‹09#v<Gù˜E„%Ñ]„ ¼B–'œe™êé%TÑ®ôÔ)҇ B‘œnXAç‹ ¨°–!ÄúžPã$­Ë! ,Ûí"ãÔ-qÁ{›Q9=†°iiBÚNƒ´ðrMEÇq|K‡SäbÃ2š„âÊòúóslÑÛC"›è*©kË^«T™m†×“1Èqn­U‚½§ŸÔžªßìõlº¶]|ãîú›ÏÀüFH "¬g +F6‚šdÆd¦e©^…‡CÁ’§88ÁxXRù¤=&ƒ9C"òz*Áš³÷*5_AßßµŠDîN²Z{F°÷ì«ü©úÙ^ϦwÝ šÞ¦ƒøöð( 'å‰Ü +ò°$Ìý,³$¢Ú(<_Ža~á˜'laáBYv©ìé›ÅV‡,ºX’É—•/ôՄM&[bd³Œîo’+AšÃ0·§d+‘¿‡P#ˆÔFñgÆ<ŒOÉö£½'UÉ8>„5û90BÉAD~2"ÖO¹8ê B0n”ItôW,¢5Ì/<¡ÌØ.|5;T¿ˆpÚ(úªœÈ"²—îAù̜bäI…¨£ˆö±Œ©¾ZÉd-A$40v9ÉTÉî]1Wõƒe®i9RgH2ÉW!âX’Å9Èq"³ †csÌÝ0MƒÌÕÄMÍ6,oä™flvYy/KwÎrŒ4!πÁ adLCŽÐµä8ϲÕÀ£Ë0Öý$?ÅY>Q”â š…|ªŒ¤ðÔÝ2èlëé±]„+vDS¹JE 1Sº4ƒ»eådî£ðs¤Êi_+±`jڃ“ ÂjeÇUüh†,ŒáPDŒ¬†,iÿ +~Šµ!k”¦¹Ñª!k”Õ›×®ðc.â•!k„fœ·cᨊt¬Ú±F‘Á¹¨Wv,j”Œ«KZ–#\vTµclµÓcŽAMc\Û±œZmPX‹ÉLTãÄ“+3εi.í™fSØúj%•°2.5ªÙ ¼žj¥ª­lYþEí©Ú“Z϶kkv.RT\Û²ÕLPà›aIn£!jËڔž‹ˆªî±AnõTBoZjT³@µŠÌFÕÚëMYþUþTýl¯gÓ»ÿ¥,YŸ`D0ˆ¡Cä3ÕUbdÙê3Žwqȁx­F5ƒS¥TÙPQ¢´ 6³ pÈÀ í)˜µœ< ¬Ì曀I) Ò\u0ˆÆÂm*¦|ø8;ÁüöÕh£ÁàŸ…­—b^JX´àæ£b› 3¾SŽ>aIªqP}xbÔF¥X‹¨/àðþ !vå”{JÔS#DÔâŠC¤(35²0OÑ'¢Z—éؘÀ_³ÚÇEZ˜ÅÆ>ȦíÁ nŒ®*ý¹¶è†ôEuŠADÛ]«Ê§ÐÛ«{±~˜?ØúT+;éåw(#¹â²øqãõƒÚC_Ý~x.LÀ‚W¿ܔfwà™ãOÎv‘!ñfõüòƨ¾@Û8DW¨Ž§êû£؆:ÿp¼Èá<6ïÔ‘¦|©ûʳœíSóÿ÷ñã܈³«³©U Î89; H²Daõƒ¬{ŸKóñAÅI277 0Ciž[²>CM¬Z‚ïTï†û©ƒA蜁°1÷á˜7rkŠSç„.Ê@»?p¤ÀRÉüTÝ¡Ô¸?’«œ[S猖*64 yÚ¯êqæʤ5§ -itg"½‚è¾ú}ª[Êÿ2a¹WÇ †qˆÎ«gÚ҂~V× (øÂDŒqß ðV‘–ê¹Uƒ]8elÞA¾™@©îAvÛ2ªîAÔW²TáþAXH©ï¸‡PN@ðªÉ]„Ó%S¾É}„ØåHïŸ9 a„à2]{ az¢ˆênBh¬Q}wºM/; +ñ·ÙË ¹È1ÀBuÎÁZÂ>¹Ï)kwa÷ ½]Uö³µØ» ÁD¢]šÏº1­ËޞSÖ^ÃîAÿx¯lÛË3ŽC™kù‚1m<‡0òpºnåÎcsåUÂÚuØ3Ÿ`W“S¬Éµó3 `·º ÛŒSפÖÞÃö˜¼×´íå©K˜žùí¬‘uãܤ²ˆß‹Ö‰#w0ŸÔY¨È4{“"œ‘×`µÆ±N3Ô áùæá!jÆ´²J1,¨ó±=ß Õp›„ó;C³¿šJ}UN-¶*¯&"˜h!4œtõTŸ +ÐÐ`™KCwpwäQ%ÔÃ8ìÀˈmàøÀªÓsŠ*½íAaLºc««Q†Ž 5²t„Â\«, +«˜ÆصZ)Ïë¤òëÚsµ^×IOß#}5¼K\k5ìÉ:ÝÕI ¿Âa×®^êQ„'$6njÚ¬ùju@ƒ¯è²sJHý"sr¬‹¬zª§ëú4OµS֞êö`õ@OÜ¡§„Ü­²FÆ´¦Þ73oH6]ëaºì®ž Jãbˆ—2ïink?c«Ù k§u{®ú£[]b®×<‹i"ðÊ dӞW­„µïº{Î;àum{ú¹¯Áфm”æéäªyº-²jžX&4á¬4O°Ñ&×<¡Ÿ‰Ì¹¸æ ۍn+ÕӍˆUõt[`Õ)aÏ0‚®TOè“C§ Â6YÏúóJï¬DW;a6‡©Ë•Iz'E+­¦³ñuþ _Õ:OôŒåjVãÈZëläª*ÒDûcU&ñ:ô×Z'íLÐoڃcå—^™SVZ`G6u±UVUÊÖêJ÷lŸ×ôžyeÛ¾^v†’i>&CÜÀ +õË ‰žÇXš³j$Ømħ¸}žvÖîAˆð#¶Êœb­:c1ò3…ÂX´29µ„ÍÍ]«•âÖ}s®úƒÞ¯lÛ×ïÐ7>aϓª‡v°j¢Œ,yPÆ@™c +4®Ot?äÅ»Ïr á(‹£UdµÐk;ÿ4*oqeâP—ª¼°üÃÒ®…ÂםV˜dGíݒ§+âTuœ`S€µD^Š9Vèw#W+–Ñk‰ŒOFPµàyn[3AGÝs¬}U•`Mڋ• Üjšôlm-NÝaÛ}™?ç_ïum»ù +’S¸@ƒÜ ’N>€pú8*’¡Ô‰ù"!] SuÁ`}•Æ^o¨ºÂ:¿àP_„R:S¾;q+­¶&átÇ"WìTŠ†ØUÝèdHx‡°pۃy©@ÉE›à +U Dz’!ó† N©*˜¬Pz"©ÉœC•SÍÏ']ч)›@a˜e%ig×ÀШß;×ï•h£e°®VŠóŒ¼"«±ÇŒ•Ò6¦•-½R¾Äï…" ]]lj€!Ñ©à[ÔP¼U®öF¸ó`Ú"ˆ&ê”膏 jŸ¤9ÕßTæ’Ç+š7‡IÃQ }ê’:µ*ÙM祩,òXŠfí§A‚ÕbÅÁö¦”°úÜh Hª§4ú"Ÿl±ž.ûSnƒå ܺD«ÝË YŽŸB³‹È1š=ðò-<>"{Y)¶9dÀ3k{PβÔWe?‡ÞNX‰ 7®»®¢`ºkíÅ^ôóýã½²m/;¯ ¬_úß°òy”½Ü5¡~CÏ i²œ'…ç9Å£¢’ºeóNiU™S¬UÕÈY%àVÜ»0´¶V+Å^­Ÿ×ô.xeÛ¾vã Ó³$œË¢N‹ùrMÆ;)w­še0¡°æB‡œ Ä/´ç"Ò †®.§ÔFíU'CT¢ë V@¤˜Ú¦ýlœ£~Z}ªuªVtÒÍ6°ùŠˆW8Õs¨âŽ!9+.Q„75/Q2‡Uv"k¨ãG°›ÀX_Ʉ®MóÜ*ë(Öª½êä ¢`Ùu•Á-RߪQž×¶Ïó½ VÙi_»qpIOŠÖý§ºöœ ›dxpÈažae”éon”çUzIižû ç(]eN©­º0ad3Œ´Ê„«2†Ë5‚9-êÇÕÇZ·jM'ýΌŽêÆaäÈ_ƒÝqžÍÌ;[Ñî8¦æGV…»ÃêŠ;*àª]RŽx6=eZ¼ ò>‰Ð@4Ï1ïP!K9æc¦ž× +zdz!¹É@ï4·Ä96Ô;e"FýUØ;˜nX¶°wô€,ǽÃ7qљãÊàáøº5ôÚPP%Hæ<Õ¯u<ºSžûøãdè4h{WW¥ÔF]¡2r¹¨¬Õ%mM™R`m´R\~L1ôÏy·jUÛ~^Vý? žî¹Éñ®¬¨“ +9Ç“µ´4dºSÌ"böîA¹·ªœ`MڛN–ƒ®«+›9º5š{³µœ?çŸïumûÙq;#„YË¢æV‰“Eî’Wj ˆºãh>Ͼ:Ŷ‰0œ8ÝƒÖòÒÕU µMgY¤Â¤0[« k+.}“•bâ`ý6пß+;éèwhûp¨56æ«È +s4VÖÐìžÈø,6ÊReZƒè~wðèÈHKž¦à4> =W‘ÿØÍ _)˸RŒLn ™Úc(wª^cA`²M@÷(¸úU©àL¥ÐF™a¾ðW,rÐ0•Ò¢Z"ÐÀ£œb’“E ´+øʘh”jÑp¡ËÈã1Ò5H`¢*Ì-H`£¹}o €kD s5HÍ{NEJI§ÆÔ àˆñ j/F“&€ê›ãa€NФcQ˜‡qK ÀYƒ|GU²²8h÷séâpšñ#NWï©%ºè1›#ÂN^nÈ¢ÒáRnGã³çK*P ¾^ˆîoY@W“S¬I{ÓÉcÕ§k]…M}x‚SìÕúmíAÿ~¯lÛÑNi¨èyàØâèQ¤ÜïdÀn §£¤>B¦‘a!#¸À+ƒÄ+@kÕ(öªû»- «Ì)ëVìŸç•y¶}íÆ¡"鱔rtz# sÖÅAù"_ DœWð¾Sœgä߬q­²F±VŸ×%häÑl5­²Áº×Z5Šñÿ<лP+;éë{„æÏ6°†ÄÕ¸GÄyà€CâÎ_£á:²aØ*Ì¿¢Ü<`†ó˜ö˜Et9¥G¦udƒ°µº å֚ìÁpþaþ”ºW´íã%µ¹;açæQíKN†µ"«€–Š~ÒR-=edcF1뎁)÷ + aîërŠ5Ú J–M6ў╙ˆÐµÚ íëês­µ®“žvä“4÷mê-jŠ!ê +È`/7äQƒ“`óÙ(éÄ Aõ‘B£¸±Ç43gçúʜb­>¯–B#î*KRߪQìUÿ<лà•mûڏê'è¬pWY՗”—*Í62ÌiL+ü=Žsàî©B¤Á‡•bš\M£â2B1Í]eb­Ó¯ä…"Ô¼k• %/ôz×V+ÅZ­Ÿ×¬]h•mûÚq«XL6Á…ÍórCÆ(ÊnIɒ»Œ¶ô¾®¥Q¬3€ø”©ò±¯Ì)Öª~N.3A‹µ2ØìJצþl¯ÕO«u}²j¶½ü\{s›Ì +i4pQS/7d ¾h¦À¬21/š $@ê^:JÛ`ó¸zp@œgî+sŠµê6&'SÅmuÁ4»ôm*Áف}[}¬ë•V´íf? Ÿ¢l™ª„ YPèË Àº 1å^R™ã<Ù¹)ÄWŠ)€vìûs¥Â€½®F±FÝ[mä ßkuÁÌ;¥¾M£<¯Ê³}œ?èðº¶=ýÎ),1¢‰ +¼œÕõeĨç\P¢çÌ;(#Eõ/rbûÙú%rbyÝBÄJÉ]-•`m¹æ¯TÙޑ®ûZOÖðôÖZîããý›Œêmõl{Öû~'Õ­„¹ËÓ©2dìÎZj\ VoP0µãJ0¶»¨bìKQT‘Њœ`íÙ{•Še^åaCAh÷öŒàÎbý,¬~x­hÛ¿ïjCòDLo™q•äË ²álF|TPy†I¥¡À4_)Îáæ@+¯?ˆAXúº*ÁÚtþ¦Ô¬÷®¦bQü­ÉÒå:é¾Íôï÷ʶýL¢Çv@§¤Fp +ì°Ê¾\“aсê^ÿP@Ÿh™œ`²*<|1u êÊëjª”Ú¤½éä‰ÝÙµºh- +¥k³RìÕúmíAï–W¶íèw%!ƒ§Î–Ôgt¤K£N†Ì€w0ìQã•õÒHR ¦܊–ûç°íÆ¥¯Ë)Ö¦k“F†³PV؎¥kÔö¦œ?W¿ß«Útó»Y 4ô ԛD|ÈŁØN†Y+©¦&EäzBeœ±aa£Xߘ]9öflj•9ÅZõW<)³h• E´óصZ)>úyíAï‚W¶íëg;„Y +êð øýË5µÔÔ³-$Õ Œkń‘X³-úƒ"œ!TW™S¬Q·÷(Y†ŽùñZeÓ !S­ÕJy^¿W?¯=h=hum:ÚFðsFȽ'ðí3ú7KMí¶‚vâF UEvK·‡<–ìgõ +×]«RªȁH ԝ194»ö˜nÙÂ4rƒt#k'pƎ螑ƒï͘.;6<7Œµt*W87¼#Dß­ÐÜ0€¿Ñ.—–;™O…³‡rK{ÑP‘ܳé(䞁{€¤Çqg ÕÂÒ`Üy‘MBCqSÒÓ[¸aJ6Ԙ¸GZŽ ÄM ,–k7€@Ó`yÙèk„0GÙ¼b¸OfþÄæY`'®Gp7ªՑp3——xúp‚ßÎpOÀøT©Y>±XºSVÔ=”ºQ rÝ*2Tvk¯Go·Ïªù‡[E'ý{èÓ*¢Œ.6¬ ÛN®ÐíYtäçŠÜ†Ïƒ?÷Àmx¸Á*n[¼œ›©Á¶™ˆ¬±GÀgCE¦¢¶Ó¢9û¹‚l˖_U©É;6¹¶XíГ†Ð6Èì¡A²–àª"²'¨;[<6´÷†ÅžìK*Àù°LªlMĤØþJD:þ)ÄŽVË +‚m’¯c¯‰Àø®¡×X©9. y8/xÇhâð:c†»ÆђTa×LQœÒu-Ì'Ìdl k®ùXÅ\—l„äzdþ¨UrÝg…\Ÿ.×îÞ1]+Äu£JšÉ¤:pu®f²Ú+˜RŸ?†x‚anõ4B}nTƒH·Š EÝÚëÑÖþUFlŸmõœô®õ†¾”ÒhݨmVuO#¨!o1Ö"ä2²¦A¬å|žûjœ°XWj…D׊5mÍ­ÁÕöM•Ø>Úª9é[ëv` õÇDR‡Áv +ÂܨuöŠ íÍõiÿ¨úPíI­dÓ³K>xø'æ_A*¹Â è;R.«HI9ÇK.qƒ¨„‹}œs£dëfnx«É +l£S+Ò+ª0Ioo§lßUÉíÛkU§üntšOÊúqñCÒ°ûѯ»çxÿòé¯îÞ<¿{õîé»û“Õw?úé«wgÇ_Ï~ûâN;ð³×Ï»—Ò¥—~õæî÷w|úë×|[ûà"­äÒwñNž¿¿»ÿú÷ï.M}öõ7OeLoß¼~õþ‡v÷»wÃ#]½¿{û!=¼~áÕ ºùáŽþóýWï~qfožèÝN7¯¾²—Ÿœ½ìé¿ÞÿáW=ñoªyŒ–EœoXT…( ²ª§2Ӓõ¯ÕMO7ÿПj“µ†ßZµ«69Ù?ðg}ç©ë*þ¢w>Ñ@.çÉÀ쨩AË)ã4èåÝS½¼;®“ç$ÙFîÈèÙçAEX ²Æ#°‘o&pû ì) ŽÖ‚òQrU¼{bõ¥š†`ƒÈ5¡bT5¼ZŽ +XMР{g$׀éQŽwQÍèì™ÎïÈ0UÒ»3,v=Ãq„015 …>¡\`ãk©1A%Gí#0bè”PB^”¦Ö;½i (€"mÍàízþRÏCÎe훜êK +Ìi±pfEJæÙ úóÌ<Ð"ÍjßzrœG}1ÄE)‰³’S›06 »Wj*‡z +ø\²ð¸¬ÊfŒs=¤¤ÏãÈKؒ»£HBå‹b8~+CìB,"O˜×Ù½fÍ0‹ÇÆ!HIaêš%N4­3·1•ÅZ](!!Òí1·æ ªq„Õ›†>eµ¡Œ‘ׁ8Ð HLúq‘F«Œì° ³ÅÑÁÌÆ ´ÛÕÕÔg:á $-³3À¬  ÜÀè9¤ =å6]–'XŒ…’ôGnÍb›‡”Ù?˜Â0؃‰•±¨P'Š¨‚ƒqÍ#))øUæ*¸BmaFìWàÚ%u"¾÷DbñÏ°vü͈l3¼Ÿ@SûD1Ý™ÙF>¬=dD=¶pÐ]¾ÀGL⠁ºn—IݯÖ â0§î½01åsN“Ö¯‘ƒ@)rܬ?GwËÃë=Ó3ÆžÌE¾n‰–bý(‰(Ì´Ô)d¦ŒZ c0’ž¦[±0#°‚¹OR‡À;ɸD@`ê X†"îm-yó؅‘qÐ@͊iÊR-ë!NsL:ÌÓ{:F#ÍäÔaü)3ü .p9A¨.€Xç‚Æú@Åh^)ú "Å@z‘Ù‚1ÈÕyD*âó {„€‚…g)šèl?Ï>&ƒå@5Øk¢\,ÝkX›Ñ+~^ç€ç‚F0£˜âj4 ‘9):##´=/Êí{£¶—³®Pš…–‘·xM@®Ðz„ü s<'¨Ø|30‘LægšxŽò‹PýkCŽ¬Œ9#¥5Êx(‹¿@½•ŠDc0†å¡fƔ ˆõÍ@eMãD#n(­\iÒì¥3ÐI£:iq"ÍY2Ð*ŒË™ªWrÀiÿFë‘îl@܁\Û¸}΅™äsYÍ†×pæè)!ËVËÒÂ¥ìԔ¿5BÖuˆ +¸¶'ŽêTbFZðE9©•£`ž‹LOÁ‰¼¨{¯@ȋ]±0#¡ß‚!avR;«³-ž‘~{šcâNQVe•"q2Æ?¸·Ô s,ãV1He?œ¨sP6æâÄRlM€©‘€# µÓÍ‹&&£Ž¼¹a1‡ +­˜Å‡Émõ³õ¶'¤²qJ;'«ËdTl LŒŒ8†·1ª£f,šm|žÛ}I;ƒõ nžqÙøʼnybe¤Œ€cTîéí²L¼(]žþSmâúM ‚·KÆè¡è3—‘J~A€€¯Ñä)¸ÅFå×öž0½‚³¨Øi _Ë@ìB;U0áS Ï« çn} ÷

 9PÔþŒˆLŠfp‚þ¡WuL )6 ó<̆ŽÌ•®ÚMF؉L9ꛌ§!EŠ­°‰A&Ñc‡ÑÂ@SŽ7‡}‡Ì‚°åÌÕ(^Ô3d3=×ÚÜâ¡ ñ…T,I˜eE!ÅýÕ²ÇiDì_·F x[9?¾“Z@ƒš>&*ÄíΝ&€YW W™nTãnLp?ÁúÁ«±BåÑÑòxádVVî‰ø<³paƅ©5ӊ¯MQ¶(j®Í ³,yÄðⵑA\¸ji¯Q2£ð4ámªæ,ú‘9êÉ7ŒE«˜€d)sõè1ë ¢³&6Ê0bá€o\¥R‘G˜& +œS“^½Ä©ãákI›ºpYM%”-ŸÌ­˜‰‚€©ÈªœùkzÚ íULÇh5&Þс-f0MÔ¤Ä2Ù¡9wN£fð%×Çs43ë÷"þ‘¾!).•òª½ +Lÿb²IÖìN¡Àô͘:0¿É®þ™RK lC12;i:Љט ‘>ƹwAÃKgcEx£Þ‹‚ã 2ªØTnP( UŸ +3Ϊ!Úçb¢¦©%GexèIZ·¯«Ù¶rîpú\i s°²õUá>I 4)‹ßhOõ ÊI̗M‰–!h‚"«™`Ä n“e}Gš! ÿ±Þ-Š›ÂÙ8«×åyµ¹)›*‚:¥h!ÄÕÅ Œ–‚‡–P3–AÉ´ªñÁ)©Ï9«…«f…»¹T.:ÑP­ÅÈG†B/ćᾃYÃya_°³ eËmË+3™c ¦?ºî! 2b·ÌÙm›qp̨Ѩƒ£Ëa,äYëU©MLœÐ¥Þ4™}±˜×Åd-÷9…­C®_üHƒ[¦¦Oµ,axcV牦ïDìöbÉÌgˆ +ÚUŒØÑÔ²À å1X Ì0ÕѦ+c@ÓZ3àž°:‚ù.ÌWl?—È›ãßØe3Y5j¡¹ÔK[€£*|mn«>Øc—d)DFÍ»ÃÁžNˤÕÞ!yø˜Ö0¨Ù ëšJóÂ+;çÒ$D¨œ³=ø_` u5ØwÆ9¾˜ÞF¬²HŸkú Raê€7 Ú$+²›vÃ5F˜†wÆn_1LÉí WËbNA†ˆdÙª 0&Õdƒ}‹ÄÿŒJ4 /I#ŸÇ¸(ü™»Ï¶?®o™mK¼áÀY†ïŒÉpw%c¿ýÊ4d%†ä„Ê0Hm§V58Í¢&IX–À':û÷ÄÛ;‘6Ð%ÀF§…W½ÑÀ#œH4•ÞæŽéøvFÝpª|VԐìÈÂ=¡÷“@FÆU4 ¼¤ ÂvYÎù±øýº·J´+ȑRšorhA²bF)?’a;‚ @c5Ö!Ä+\v´0èJD‘rUo÷¤h¬¯Á$ƒRG&ˆ²£);`;Uo.‚§Q$ރ['ëá6ˆ*̱9X5ª/ÊÞï'®ù)3ü/T ˜{pãÛô“ŠŽ23—TCÎS1y‰êÌMŸÜä* _ &ød{kÈô”ÑSEz¿¨U½½…i†—çHªÆÏaУ”9-z¯5ž½ › ‡AãAџôêÙý…I߄;˜¬ºð NÊúôBjfŠ@L¡?ÐL\³ês´®i‹³àá¦Yø`J‹ú|iãTJPwï}¡Í¼Bݪ´³2µÂ ª”±Uf¥¥µ +3?jv{¬BÁø“feHöI«¥‰I×<ºJ¥G/8³)ÊÅÒEÑ  8dž{÷]AÓ©b-³Fõ ëmA““ÎK= +AN´¹LFCÓ)¤N>h‚ )Ù×1 £>GÇ)¼œ’?|g§º@§'€§Çª/×d!L/‰#`Kk€À´§ÉÄ;Üö3{ž5nÖX3➄ÝÁ¤§œÔ]Â[í=žY „9´÷H) ŽvÒ,8ÄP½ª©ƒyÊæNÓan¨°ú¤ ÞI.)܂ÌToðÂ÷x}w•YÌÌK»(}˜´«+rS V‚Š H\c.\} I60 ó@ÅÞ6šÿÂpÛ(¨8ÒàÉE¢¬šéx+ö¤V +ü\׈<4ƒ¦Â<©QΞ¢gÙÿQkƒ/ 瞜ŸÄjæðA½[Iíº@à ³M +*ÂÔg˜©ˆ¦ã…!ö3´B‹J „XÓ¢xPž€€ûÙF0¨îў‚T$½E½[NÀƒii¯Ähw¸#Ê¢peÂEŸ<·i\šŸD 7hÉ÷3¼4pÜi¢ï¢CŒ»¦†þ5$ȅ©w²§È«qRœŒÌ‹¾Ö² n»€…gѵÆԐСaD%Ä'UT¢9FԒÌD€X­)$à3¡½N2âdš'ûå= àG F6é4²:[?AÈ-_ã¢þßÉܘyQÇϪQ?“ÙêñÚà3âé қ.˜q&ñ‚ršz‹mVXØۇº#VÂMµ¹AmOaRd”81*ŽÂ q$‘ž|¾ßSAdö¤ „¥{Ç:Ìëš>gPDS³é0¡ÚÎi8CôX`…SC\ä…wS©¿‰CˇžëÞ?À{p–Ñ+EK“©Y€¨¸à{ðµQ„ø’ºŒ™4¦ÃÅfõvSD½ŠjZÔá„ÕÞí GÖLª} @•Œ\˜±¯(Qµ´ö̋8rEv‡Ž¦Á¹ÁP1:ƒÊ¯éJw¢ÂòfÃa•¥¢®”`Œ ZšÔú"£ À!)Y*šüŠ*U ‹éЎT¿àÏr8 w¶:†w'°»Å—À 5x>E[RÔÑþ™§A ¶àÖlvl`ŸTwy =ÍÔN€k'w7Â(q1`#õ'ŠàÀ«ëA¡‡•±P;[uoOIgJbFʓ©"CË™Žå¬D×jèS«~$¸‚6L8zÇ™;Ï©&.Z´. +5ctf=Hà=0—.Á­¦H*Õ64*¼‚Ô2¯ã$Æt¦þxïJ¦V}ÛL/§OqêxE„xŒÒ◘0ë SèáÈ Ó O¦l3…sOL.®Â®†¬cy„‚Ñ•Ghí×IýçCðöÿ'£+%ÌêçéŽKäDì9¸Dt>»Ì0¶ XÏU\20#®+Ì="°pÑ\5+€œ×›Ü°\'ŠQôB¾t*8 2kŽtLòÀÇÔ Û®ú­×yo2pœ€BrZ!x&Ý*šÏb¡³’‡èÁ¥­ ¢Ê™…Ì´U„®Qº¼näAÔ챸Æ(&ŠM3sŠÃõŠïŽn¢Œj;+ eT 0ÒFÃhÃÚc`$#ÙÀ )BB錌Êj'„ldžÂ´£Í’9ü[8xU3µî™¨ +¹"L¶$'.Z$XD @kv^ÙSq¬ðgˆj¼/[‹üÂîUò×(uMfñê 0Œ‘0|‚Ž³çՐӒ7~Òè”}ʄ!PFK$[rtììm÷›ž (B&|‰<õqouîŒbt0qZúuƒ@@UØÍ䌚JíˆaÕ»h鈜Œ)ðZu[·×Š3t'㇠ٳ¼qjQ·¯\Gƈ² з +¯ +Ã}Œìä_Wí(Cʉ‹C´OÈ0KRÅa§DÆÀzÅo^Ôo£Ç¢¹9ʋúπeŒfS2‘)üSè,y ‚ÿa‰ax“†ûüè$,Qe@JŸ*!ÑÒ§¦f;ˆÌr§ÀVxZi,L.¡Î€f⸣lp5pCð¿Í.zá=ˆ Õ×Ó!S¢F QFÙ,‡ØšCêƒV×ÌÃ?›Yۜ'^6¹쿸•' àÄÕqèGÆt@ ½ž÷ˆåL)NcÚÀË ¨4auŠF¦l"/ÝoÚ7ޗŽÝœTà?ŽGÜî³þӏ”ÝèWþ‚ +‘P;úᶃc™ÀΨïaããH|þ + KÞÎôs0§º‰üt16eÅa¥ à6¢Ý ä0m9öèˆ îwë^Q¼ÔêˆlÄb„ @ì®lÒ<9óhk%(*g +’šG•uí½ –k¤«çiÄ&¦eõÙkn¸ÍY9€(›ÜGª%I2%g5Ñ$cc‡ªL°½TZ:çAÏL0•sÀ›“ëÄ f"¡©þãgÂy€q¦0Qžõ”ÞïÏïœUýÇÏTð BVdöÐîLÙìvÃ\T¨£oÐKÂh_H‹:LÔ4GÆlL½Ì00Ç1–„#¯CT„‰ñ°¤,̅<Üà…öÁƒ°x@ ·1€‡"·CT„ÔPO1ëýØîÏcšpÊ90 Rý«9fÅôç`¢™,‹ê]æ›5ôëPßS‘S`$Ô¼Æz1ðÂ[bFE +Ò&×ØFBa ØÌ1äjÆ ¾ysЃd‚}HaÌO®± £†¨€BŽåúžFpåø~J5ðˆd?5ã"1O¡²(®L¢}à‘K6™´S pÇug½ô|!Õ2љ­„Ñæ–X¼cjïÑϬŠQß#º`,IÈü™§±õ.h‚„’ÔþŔӰ¢äjÛóßÅaÖ0&ƒEeÆ˘ÁDm‚¼ÎT€/7ÇPàÄǃª‹Ü¢€ë¥ì>¨øÙG¥»>ž=«—q¶,v—)Ýf<ë®ψLœ&ůix|6ÇìÀ\nVo–“qǬXÇԋZÂUd Êtæ¡7©Ó¤…s0~ !ixŒsIÿ‡ò4 +õ®­1²gïÆ (;RB€®Çz€îí$·×À!ƪ½Ç&„ 0#¯¸‚ÉJ*†Õ‚˜õ®("€ô¢¬‘s@«›KÍ4O Ë܉ /HêK†Ô2µ;igâô#ûÑDM5î™ìÜÅõQ†Öy׀ÿ‡2\êބLÍP“€Öë +³‚NíÒ4¤0¢Öp À[6å{Ex2œÌ³·W „D]4z0ÍH!|ZA|H׌Š‡¨†'zü„•BÚ¦J‚ÏÄ:…6 /‚é¼D]°Ú\ Ö\Tø3…_•×'䈆3‡ˆ%>†Q¨©-Q3KPnfŸHÀÚ3c+F¸;uëÏÈ~ù‘r½½eD³¢/4™àn½¯g4û؅Ò̕&”ÑÇBRðD6dp#,Š±±÷ŒZ’ú&ú$¤z¢° tYÂõ±ø%ÆÄõ#×h@1äR……â"ÃÙ lè9쑾?àá\„ëo™G“ýwY%½)Ã5_tŸYD§ätLº#asÖ8¶:LçðíÖÍ5Žð Õ‰ûo¡ÝüP§ZCøF£ŸC˜ô-Ý9d‹zÛ}8À}CQÏ<»„ùñ”* 3~Jö ^óó‰ŠTæЉŠŸá…£žÌœñTZOlÛc G3bJ±úà$®LŨSŠ¦iªæZ‘ŒCTØÄ8ʨ¸Ì~6^ïˆ[x`‡,a¼ ¨ kts¦>q„é`xCQ$7¯!i",S3G‹‚IÁÄÐK>ÒZŒxAå­?ÄˬþîIÁˆEW )ìg(j_#¥û©÷Yç½&›H{Ê98nôNÄ4êiïÐ#ÂNè!1 ÷Æ·r1^Ó ÷í5€:oÂââÕSCBÌúœ²R¼I,Ò»@|’9S°ŠCºçe‘£¾©¦$@úÀIéÌqY®#e‰E“ÖΓ:ÜGU¦ +°Ð?gÉÄy+‡^39«Šä·B£kغšqMáýö®dfNs`Édœ=b)]`§‘g ÝÅÕůKñD>ÿüªã>e^RÏzGÐ-äa†ùõ® +Êx]~QÅ6ÕkAÌ¥o„¶j€ŽÝ©ª€_{Óöï •ZÉEYJ(¸SPSD„öcí=ÓªjõJ Ÿ¨ÉŒlŽQ ªõI㢦1FO.”·Ô$§½nž÷Ó¨ÿ~ØQ ¬­L×fà´`Î%mŒ¡ƒ >iðܗ´îv ²¤«:P§ò’Ta£j–֏@·¬i;­h¸½°ôÍÁ.žx~h2è6í+‹â-F»¶V_Øÿ¶äµ DlOàJP$¨½UÔ¼X˜ #Øɉ!ƒƒhœhóð×Ìb‰Ì‰aš“áHÑh6Ú¥­Ì;т÷¢a>š ªàýLŸÁà‚¦O¸%0‚ =Óµ01Y䬈Õh6.äf-îÆ8ؔ¾®,ÁXt]O¢d»ªx†öº]O:g3Ü1VÓÂòjÀ>À6Ž"×+ðÀتe QŠÄ¸&…‘yµ¤Úeý=]ÿ©ù²©Œ•?Ñ4f;ëšo–5Îj®é<&5¬ÅÔÉS Æ`ÔQ`^‚]éo‡¦N_¦g ¨ÄXèÃÉ£bl°ž¹Ý69ꁋȞ-\¢,Î c3.óӆ7àœž´wA‚ù)=‚Ä0 Ø䙓l`Ôd8ÜyÉÂþyÄL¹j»|VŒÒӌg¬¤¢ n^# 9Y¬¿Fä9¨~43wCRÄq™,½†½•5\%šÑH~Ô >Ñ2XKžbS7iÀeÔ¨>…c‹Æ[ÞsgÆޔ{3?|:pá£È邁@`hðí€àf5P£>¥qÑÁdð”[sdfÈQ8ÍI4Ô>ÖËÒ'C~C|oƒ²°`¹)ô5Èl™§€¢Ñ‚›# •Ìþäïñ°­„$Z–k4l ‰?wÍÙíᡚiöEDálVG ¶¹ž‹‚KM jæ˜!,õð5¶wfdNn‘¡ƒ9ü¹ ¢ÇAÀUo7¸¾Giü=š™-,„_‘>êÏ‹4gÔõ­D¥Ñd¥ÉÒ1M^V=p.¾1ç ‘ŠÆk’}3š(¾w <¿?~sQÀ‰9 @ É®ÄPBÖÃ>ÌS ‰­±Øõð£e ê4™9Ä{§wÕ,ú¹c½â}ªè«Gå˜Xú&¿ÍºÌÀÌ4%´BåÄÄVˆ«tž¨)Ðæ`1çb1¯#nWD}Ó-ëÒÒKT°ŸýÊAí»Å2{- +ë!a݆þq ˆË¢ Bd:d›º­Èþh`Ò +§!ÙréÉRââu¬³zQybåT³ƒ ŸMšËÁŽ€A{ó #™`^„t=Gõw2ñ8¦ØÊ]"0î P-=íȨ=Uz©SP;µDø½ËK§¯õv:|àÈú:gÍ7ÇNó¦KpÓ¹†QÁ +k.>Ìñ7¸ËY[² ‹FÓ¶{ƒF5ý¹¿byõà),jXþàê?hööЄ…ÅШÅB1év«‘Nƒz^T—lº&¯—ÄHgó03Ñ2~“WÙhr¡äãOá}8©%Ě®„W¯•ió±â‹ñhðN°’T⪓óŠî;l&‡ð"Ƌ;aè fN-5ë2Ì®X€¥Æ»!Wď2õâbv‚b™;H€„Uìjx ó•µì)ƒ\é ői8<ÚËc#Ø{Y‘2 ÇÇ 7H¼|V\#MÐ䞺.‘ð‰Y¸jNžÅ@ˆÌQ΋û&͊‘—ˆC*6#æŠÜjQÕ.ÛÂÂÏÔyہïÖÅÂ@5¤%ûˆŸ™r±8ÔÓÒT™À'¯fC27j>°·ñ\\lûÒã¨B¬LÅÀ/hrta!ó̀yFžbž5kqTîWìÜç{ÑLõ蔋…”û{jP±™I‡ÏAEŒËœ4³¦ÐsCc`‘(Mƒ+£Ê8™u‚ã«FC?X-EȪ-U9À +düô܁½õÓxUÌlN1Ärò&KµEÊb’¥9ál½òžzü@ý‡q¹5TQ«Éꬶ¹¯î[`'g]Y +€¥qjl¢¬‹£ÙS4НûqHŠªâN©Ù*+ÅE6%Ä„Ï&ØME‘ð¥bè*¡JKp¶¨¡‡Y=¨‰çz¬2Ìf6< 3–4´x1Ä=ҍ(λh£z).e‹—ä3 „ ·q¶é v­i' +¯?}ÄD¥Mz‰A¶˜›ªfǀý4—}D H£‹¦œ·l™Q]ºLJDž@«_<ž²ÎŸ£”‘õD“vZ¢>B–lGjÊè`у±F Ô9 ˆ{åi]lM Ã*R`T Ø´?Uüô1^ÁŒªô7ä†az$Í R4”J ƒéuÌÕ, +1jö&LÃ؍?¢vqðAQdvºÐ™ï²8o™PGˆ2ùdF™Å€F[±éðÙ³¿½˜gûcjû«É~šøø#3ŸÜ8k Ý*2v/ðç5ÿñ4k]M £23*öُâΚüWß²fË} ™¨•>õ1ôòŠg>†j‹`šø:ôžUÞc@™òÐÒãg|mÍzŒŸصÊz̗T$ Ù 5çšâ8+ÚyÙd<´àåšð¶\@ 4ßqÀ Û·Kw ì÷ƒg;F´è R¢á¶ÖɎ{*ÓøâÖV`¢=Õq –bw•é8ÖDÌ5ÓñÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc`òÓ% Ðqw.~'3Ó'à,AX +â$:>=Ón cÈA…2ç˜iø^&ça +æ‘Tþ&å˜Íœî>!ÇTÔûq 1Q&8> +MÀ1ÿoxcŸgҍq˜zŸn|Z𶳍Ñ=‰£!ÛlL#mŒ…˜+Ù84­ 6æ'×x¨dn§c­ÐÎÉ4¾àV;‘Ƙ¦ò4æl~>“gÌrµRæÚúòg±¯à‡ˆgŒâ¸ë9'ΔŒì4cxÄJÁfŒÆ@­ôÉ2¾ºbOÊîõ!F¶œýó噴'AÆÈü#S¿qŒQQz©ÿ£I¯¿ÔïÅ—kgc~ aŒã¢öÀc8[¨³ØÆ÷PF4øÅø¨Qsøbœ;¾^ !®6àÅ,ƧðbΈàäoðb͓jddÒõIx±$o¦'¼Š·b¤ñ¥v½œÉ.æßT^Þ lHÊìbÜ~v‚]ŒöSÈx¯èb\v"–RP}د‚\ÌIU6¹XÖ»'`†’‘À²Ccކ.æ{3ÁÅtq 3]veԝ[Œ•Jµ[ ÐUK–Т(Z™ Zü ü;‰Å\;½|É?·e^+¯F|[+~< ­灃¬°b¨0«ŸÁ¡ã2)iõ¸ ©øiúTTÌw_²8ŘLá"o˜bPb± Jñùˆè”âÓø“ R|Z­bÀðÃÁ(ÛZ» Q|:ª„b”<㗂PŒ¿ÑD'²™`‚OLõ|»O ¯~þJ'&¦«Ü 'ÊOšv¤5641KŒG 21¤S¨¿zwÁÇÆ%F¾"à!w©Vº bǽS‰‘0è"s„aè13‰‰¿/ñ®g4'€…A$ffúJ‰{‡xã7›#Fتӈáqøø6ùfV©öØٓR ˆß]¹õ´œ“ø]Ç"FåäGƒ°q²)%ý’µ¬bò4Xߨ€<“„Øñöc§ªŸÕħµ­A Æ/‘øo²ðYÍ[ùÃ,y&¥˜Eͳ‰>Œä9–+|Åøíz’=ŒªvÝ-eªݹƒ‡ÁPÅûeÎðÉ®ÁË_ømÐa@¦1Ks»Ò’‘üÍRՕ8Œä?ÈæW‹ªóÏ7ŒbAÌWA~­¼Hý +Ø0úv6NÖ0rîp5 ñp'³¦áƒX€ 4 ¯Îfp†1Æ0qbÌ0þc£ Ÿ<c ;8î>»€<aF~d§ð7[ÁƨÒw¸0<4òY͆–ßG …¦—d# #ÿÉAX`aH+!å ®pw_Š +LÅѓ* ̓1¢žûR–) ˆ%„læÂgk¢0 ü¸W 0Ts­× +“øyžÉÆߜíVœp}„÷ špUˆ1XÂا;I=/ñn$Œ$6\»à7 \7Œ0rwUlv¾ÄCL¤—wŽ>¦+CxeÛA=7œb„¾ íy#¿Þ^ÂFš‰ =@ïoôàC¾„»‚4ÙÁ‡²©;:ØD»$ãõÉ >8ümÔ`zHc$4êͦ^–ªÉë\,lÈ`€1o$1 ‘>&0ø§iç[û¸`õdWë·‰9U<Ô@s£V')nýî +¾4F%'xˆ ™˜àø{£‡1 ÁbÆÿ‚¿J_iAW;6±‰×οW>pŒ +'7éÀ~å68ðÃÙfÐÔ_œÒAä_PyPà>vêo© ê/UZÕ­±•Á¢në©oÔ_îÊ¢Š aò7øúõ–r‡~(©¿¤åò€†þ",ª8sP_çô—‰:}W¦þ2|$µ©¿ÏëÿÙg£þSÑÎdþ‚?YË5‘¿èNÆ݈¿°2UÀ_n6ÎÉûŁÞa¿t$ë—A/‘÷‹ ᔳã~ŸÇßDÐ~Ÿ"ˆbÂ~‘“PYÉÊúE,ò°*Œ)÷›º›IúÅßµžo ßkÎIù½í2%ä—Y“ëycü¢~ýe"~›S¸±F )«¾!~yÕõ(“ñËÇÇ2›È5E>7ÄL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK +*"Ê+Ü·P pŒ„û*0ïԆZ^Z'ît_jÃmÕTŠ€{$ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿéWÒ}•  ˜ow +ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥ÜÒM¸/»STä)UŒÂ|v¦ûò¾°`pÅûÒ +Ãx_fíì¼/ L]lx_Xƒ +ž@¦nÿ²$À8‹ïy#üŠ+QÎ$übà}MüW~õÜc'üҊ×8¿8úӄü%áN\ᗠü[ˆtãæƒð+Ãè;á¿GÞn~ù•-¿˜<Žkl|_fúÎk$ߗiÒRދêVv"~1Ü9ÏI#C¸ü >GÛù¾0ñÞچÑ}!:†“¹Â}ٕPad†òþÂhämð'F‹ì;®L(éxÎkf/: 3³±p} ɽŸ°AèȾxÞ3þ^±¾i3Ö÷öô¼^0l±¼Ý¨¾×©(undÒt0}ãïé›6}_çAÍb¢ï}¨ÿèÂó½=dÏ÷>4ôÎã¦n4_ìÄå¹i¾·µ.ó½½ÉË÷rƒ£@ù^Éd6/©®½%Ǘ xÈâÝH;l_ñÞÄ㥠†/‚â„ü®ßëprÔßË­i‚àË°x-;À™=œ{ð{ñ ¢„<ø½W4~Xñ½Àr 6Æ:©„÷Ž*aüÊî¥M”cf³±i&÷‚¦tª·]J1ÁkãLn/ò«Èˆ Û æ°Kµ—šGÔóڋŒ±ÚŠÙ{yi¹!{Ùû–¸"ö¯“؋óõ~ãõòdÀ43®wxÕ´^"Ø ‚Za½¬vÃËiV/kâ T2ªwd!õf÷Rƒz££ø‘_·9½ { ÀLï wãw¡°ÇÈ»Az!FãB'6z¸ð +B/‰bH¶­€^QŸàóâÏÁÚdñyo++6]ïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8ížáá°fߢ‡f’Wñ;«Ú~‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Õ½1€"/)¼6"/Uö]ÀWá;HE.Wy…©ÏNä¥ò‘Ú…2•ß 4‘’ §È‹¬Nɋ2+²®UÿË~S;Žʪ¡ï‘®7|ZŒãe”ª«trÂxQwMoŠiƒÆK;Z­5@4’¥'‰"s¾âZ͍—!Á“ðI×Oa‰`›q¼ f•²óxíaõ¤q¼@d=DI4ÂÚ¥ñ'Œ%T}¢x/$e®’(^ÀöﶃxakDÏH×Ïj³~'‡÷òw±ax¡²CþÁ^ü‰¾á…J õÆà½Ü¶'¼¨õL/"9ˆlÞËÁÖà︘GIþîploÃïòDL‰ñ»ÃAÃ ï’ +uíì]6‰êEèÝÁ¨Npw‡3vw˜E¿hP‚ÐOPwqêM Â't—ý«‘´3s—5êåNän·Ôk#îRð\ ÜE I„ž‚· èYßx»XâÜ.ÖhH´]ü '~ƒíBƒð~°v¡ÎBn(P»@Ãö³‹QD·³{¢¾4»Ðâ`Ž!vaDì.»Ðð n \h|Ìɛ…÷gW>$ðº§zŽ.û¼NüÞÙº(¥§Lݐá`uQUCÉö +Ö´?\ÝÓ́«‹Š ,‰7ª.ŒøŠ‚ª{zÒ ¨.ΤΗ)dÞÕ3R Î˄]ø,`*4µÏ™\/×Öêb…„÷6xº¨ª‚kÃé>Ň wf +˜.$Ëäë­0]1ìK—5EOO”.4Øö­$]ŠµÏ3AºCèÁÑÅßñCÉÑebà°`ëRÐ_S¸1º¨uìj£è¢~±·IÑ} S ˆîã8òÆÐEVB¯IIJ‹˜ó¡Å=«Ö¡Kë­&ö‚–mZždè2”÷vƒè²U:bÑżϰ_@ti@œo…è΃(èØørŠƒ¢Ë¢;6Š.\x9”1ƒçEPt3_¼Qt顱·Ò5Ë9#F÷ƒg7ƒbߣû8×µStò= fðˆˆoopMôXi´tQKp¸šêâžhñe~.öc2gÃç²r³Éÿ&=÷ n@q›cŒ}ƒçª2¢×eCôíÂ+ŸôܙhZñ¹ôá©+|.WL,4=—ÃáÒºÉÀeÜp\.p@ðnªÈ!ÅÀw优ð\ÝõSÒsiaߍžË=Xdz./Ӎé¹ù÷FÏe8ø çªžùz’žË¤K+Vz.#ðlx…ïh5è¹t—ñ„6z.-hƒž‹$ë°B`|XX¹ÑsyV­%<—Å6i<—u e7x.­üÚ Ï¥£á¹éP8±ÁséâÜž CÅWð\(°ßè¹\ž6"8˜A…õdàs9lÜÊQM|.—«¸wÏÅ[Κ…Àç*óYŸŸKPzq>WiøR’Ÿ‹$‡›ŸKZJ—`Gc%°‡ˆÛ?Wɍf“ŸKѪ½‚ŸKC/Wí±Oá{W|.|ºçÆçÈEãs±oӆυ>ƒÍíŸË< cÎO€~…C6€.ˆf̤çfp60/@y¾,@ÖNÊ(ºà/с‚.RF Am]à°v ‚. tó‚ K®A—L¤®p5gGA’’ŸË½Xö³òsËiß.ø¹( æ¢$ø¹ê¿Ñs™M+ò‡©dä9w9ꟄƐïoô\Xõc¦çBÚ“ô\ŽÙè¹°v<ð çr3ÞÓsyä"<ô¤ç"9ɱ.è¹x¾Ö>7 ?wZ ÐÅáß2n¡Šº¶ ‹¤.=µÜ¬zÝiXºi €n!( n’ºùbn]fgŸIÐeÁ5òèAÐez­ªôk +iÅÒ.ºL®a] ]fÈhÞº|í±¦%C—ÅÜHA™¡ËÅJtƒè/W: ºLªûj,àÂW¸@t‰j<Š%—>µ3ˆ.?.ç¹×N"^„!ºøs ½].–f©2¬ÌE—÷±%Á‹†CêËÇS•Ê5E—9`¦­ƒ¢ å+wŠ.¸dAÑ%áR#YRt)Cì¼Qt©mÀâ80ºpÿ”Ø Œ.^B¶Û1º0îœ]Zðh£K µyF—Gì·±ª|Ñ ÿco`taaLlÅèÒ7eŠÖ]BÄ®ÓÙ,PÉ!lµbtӘ]NW»ÛêI↱ùà†Ñ…Y¯—1º00|]n"ÙɊѥ™*0ºâ°]ëŠn Ò§¢KE ¥Aхr…ãGbt ¨nÍ>1º ³²;0ºt螅Ë€W¾bt¹ò9¦ñ±H!!ºiغÓj¬ڔD']¾‡|ó?Â*€5Zäx,]ç—èÂÙçj-ø¹C£ÍŽÏŠe$=wHMžðÜ[~ÁÎÎ}/‘r…½UäÜ;ÚU®àܛ\äeŸ‹UWA͵–u§æÞN‡˜š‹f*¢½¸ŸTu*`eæBcŽü®™¹¯!Ú0ÚjÁ×F̅>`s <îÄ增³õF˅]i)Árñ·2R‚åâoԙm¬\R‡ÑiϨ\(îñúäÙ¹IùFÊe>µhJP“³˜ÞEo >üÈN.ôC€Vi°mÿ€ä¶Á†ë+!þ’?ÈeO¾£%°A„¹wx 7þ-d:ÕmîX´‰~ã +ú-TeUxØ ¿ÅE¢%Ø·¸ üŽ E°²¨/á\ì"Â'”%“L§÷;¹·Ãȃ {;ܲ!¨·Q[ÐÛa˜ÂƼeW‹Öy›²&Þ6WuoÄ[(«X˜’B qÓكw‹¸/Ý wK@Gy’v{ºµTÀnOK07Ö-ŒˆYê¼xkAºÅ/“oÓ9ï.+Î-|.ø5¹EEXƒÜRm…·à à;2âwï×F¸…‘]S ¸!aûàÛ6'^6¾mko‹¿2Þ"È°ÑmqKà¬ܶ ë$ miÆlh[Ô@±Ne%ͪâÛ¢Æ +ŸâƵeñöWôQ ¨¶HšŽkgÚV;Á´ÅßnÒ# ½mk×â/¶Ý/x¶' 7œ-2,.)3½P„0[êîsgٞhDvô¬zÃÜ /2H¶ˆ©µšY’Y‹ŒkoÌZļŸY‹÷–í!L¬¥Þ§½k›¼œàÕVÏށ«e-ôÙwZ-t ãJV-ÖĪv¨Öä Uûz½'©öd,±¨Vëž^wP­ÄXïT‹@¥;xKér°4Xè$Õ2ÛÊjx9Dý7 éƒküí½oŒ©——ºIª…p¯P€jƒ[œZ$Ó(]1µXÙÃÅ +J-*ÆáΤöt=âƨÅõH/j–ƒµA¨Åߗþy®>N§àƒO‹Œ%Bþ§%§eôN{ºÀ3‚ÓTaD è,°*ΗM4í]25K#ÖÞ¼*ð ËûK ã%À,ç ü]”ëFÄO”UmTZDÐ1;”uA Ÿy#$óèڐ´÷­•A iÉb½¯d͂ԃycÒ"Šw$Œã–Ô5x´ñ÷†£ cÐh/ÏÃA™…KҍE )#+6ÞE‘Ü Ñæß+ˆ6ŒÁ¡%>÷~C{mlZÈh»Ð´‚0‡Ðr0hIœS߲ҢåqîðYÚð…{öv÷¥`ÏÞî&¾¡g$íOg™¯–³"3´åÙ¸³ÁL +ìì}»1PPgo‘;tœa¼ÁœÒYÈ@Îâïªõ$ÎÒXZg,ŠŒ—ÅêU;ðÜ6Üì3»Ê±ô0ß16˺—rî¬YšªRÏQÖ§BÒ ÍÞ^ î Ù[4­ÄÌ>±è Ê,+ÓÜKgj‘If«³8'VNbµ8§á´1‹$'µÊû¥*ÌÎc¬|Ù;’›ÆËÞNöL6>ù . I§Â‚ËÞEw0‘±W7nC˂¯Bê`X‘òy&W–jéëyÃʂ4°_Pe‰q92q×1«vSÈ|³pWлCþ$ʾ ªd݀²Ã1æʎ#*M]°œ†);bÊópiŠe'ÚQ–bnæÅÊm²GG¤»Bl'ÊBi¯ºje)ÏwÜ·k˜h6S™H3•æƒñèwÀ.éNÑï,ÙÓ‡DÉ"džâ ÉR¶Ä¼óJ’Eb«ŸÉraå­PTKX¥sÌ©þ@ÁTó`mr¯b%FËÅäVŠlǒ½ÔyÇaP]¹²ÝòÄ !‹.‰:s'#óÙwwæó7w˜þž ûw#Ȳ[s€uáÅü˜f +ˆ!ÊõIMË£¤aUtÕB0g¹£y;GOx²~â¶\b<¤#rdÆwÛÀöuª) áU%'>,(«¡ð”.©Ck«{ʵPPtvë:Ü\Œ‹ªzyÏÌÔE% dz«%´¿Ý ioa‘ª÷;_è8¡ÖÇxTt– SèÄßtw4½][‡ÛÈî<ÇåÞ帻êfv¡Ë*Áü^Ã[£¥äÙÂ[dWÎHÁÀ¢°~€dXê­'W’ɀϗ uÖñ)®I‘҇ы´\—6d¼Ã+ KfóÊCóÌô)jhA ±²4"-Y>ÿa–äLZîÑ]xkb7Ӑ)"Bõ{¸Wûv’¸ñœ"×⽐¼ëZo0Í,tÀï _ ŠÖ°g¯GÀ5ȸÇ6G„9ØvÚùK/n¨Žø Œ´0„$aïiá;b”ô3Šžbñè“!P *|©MÍÙ~";ì© o3úøxÙ)+¢ 6ьT᩸:Óΐièo2TðgÉ[t<¢|B“½Ÿ*Œc?T‰3œä#…\üÂð ³Î’çÂòzdqîGù_eñObÁL˜Oqg@Fãø¬ñš`ÙÞ3G3;^U«%Z8Bó±OŒ»ªÔZ¹+«*ifö[ª9.§Ûa¹Õ¢Šrã]«PllĶtX>±KðÃlæF-EYTeUd¼oJ ²,ñæàG•F%‰Ï±Ž‚03™E0;þÔ9`’!ê9ÊÍ`i9s£Ö@w™ñb¤y$®Ý8½<š°8ÏäˆMÀ{¡« &z²EŽy;J…÷–OF¨« ©«c~L„"=z-J æ»P…ðŒùåºMf·êôGÅù¸îûr¹šýŒGøœË¡c$†é*6 d)ÕeµDz(êÁÁ,ì#Ÿ@L€¢(ð։ páA٘«ÖþXË*ùé+`“¹ÂèY\)Šô9n&¾_WÚҙ¤ÜôvÍø÷éuŠ]ÖåÓÐÂGI©X´—ÝÖuµb™Ž*’ +»4èú;"ã 3Å(#pXˆâ†Â oýՓ:fB `a¥È ô×`¡ÜÄۋ]£ú• ñ¢~]Â6ꬳ?˜úàØb¿ët—ÜA[É,,ŒÊ¦˜Â7\é_ž £,íp«51c—¸ênf,ªlM’kŸðáµ™xÓ£4}³Ü5§y²5/‘A¶0ƒ¨ –ÉqªªQUt]©F²£YÅD¸z¾§ù«‹åµ/}i%ðƒâìÚ%Uó=£0‡ ¯@6¹Sî6¢Y ºÀS°Æª#vöm†¬±Dw°‹ƒ”{j¹5oy´'Wc°6Â&ö·ž 'e_êmYû«P zKÍÁþ¸¸ª%——S¾sàÒ÷|+¹M ×á×íð6«™™áj¹«.ƒˆøC¿¡êOvºÕV}Â`9çºáŠFB#†®€·^Ñ{ƒݸá¤×çXrˆý×­«÷Œð@è´Ãñ’m\½âaM…wr–àvŸ©Ôóôr¨´0éW5_‘JåaÄ~ôã%ïÉXæɦ’Ôy`v'z¦ì.ºë܎ÄËÂñýP‡»R%†úünz ïÁõy¥›à_X#‡õc¯¾o£rH÷€ÙÜÁì²\Ÿw×Ê´”bn l‹b]IÙ¹!Ú)r²¼â}<²¥íê㦴­œOÔVtûTŽàD„Ð8ù•#ýU1 +^Cd2dú0#hZ"8țܕAtsš°|êъWJDîXw­¼kxŒTÑ.™Åƒ&AÙ"å~,s7œD·—Z´¦¨{!ð +¤ž¾ƒxK`J_bŽÀ‚òGa>M?”V>¡nD^ï.FÍÓ&€h»* ‘<–¨PVwy×á1“Ú©%G¦<Ÿg‘–¦²rï™f—2ÎË(Z30%-¨ÜH[ü⇟77ô +~)“Ó"AŒ÷ ëiB7مü |ý\9çÛ 4 ¼?ÓKJ5mV£2¤Cn +K²wíœ4—òÖ Gxíè=T9á; Ê–>Y=ªêâáwÏR¯n<(& +`áÚOtŽ‚ °ÑQ§rÿV‘„ÛÉ=f¹"$Æﶻìîs¼ *Rƒ4NŸÚíÖ6KŠðÝxFlðÖb –ÈWñ´xWªØ¹kÏÀXÜp,ï—ÊLi!ϵ£ÔôaW†«Hw™ŸZQñ¡èa |ß^‡Âo£T»^nú :N.[( hl„{Y¬‰GAõËà­w‡©ˆð(XU +‰áÐá*ÁUqÇ!ÔcÇ;ò¦¿-0L½¼nvÊw‘,Uì­þ˜=Ï]U7] ›ß$úŽŒ6ÇaÁÓóx/ì¿úAw‰Þ©à1ˆ¿¢3‘Rš ƒ J–R69gÜ5Žû—839Ç荃ù¨¼1ôQ¨Å8‹)\aæžZà°òœØ‘âל'îêÒê×&P|ßË¥GÎ\J¢Uuˆ—âF4µûÉœ…ðK æ¸oµÚ›Q\`tê5 ¹²‹>}ÞLݜUE÷ÛŸ‘þgX»“cìVҔ§Òëøai0WuÞT!3ċévjÈ~!šçÅd5×­bÒ Äß"6á®å7l¯6ëV*¾3†XƒXËë¥aB¦¶{FNaUhž î,̉ÒB&J½šväsÌ=©¼ßö$œŽ¿Pü7šI7ërGúA•rJD&ð‚ãÞÖê…*®ƒC$¢°œ_tà“á­X§4^•ÙMµ%°æR‰%Ï¢‡ìfI…xˆ4»…´ÜU¾ë´Ì–p€1ú‡#òÈCO½ÒAC€ŒÔ¼Ô3D-üQv8i§& lHçC狱—Ìh”÷tÕ=›ÄTÔ!*‰ÿ W¨¢äN¸†GpíJÂ8¯«ø4k7šâGTW¦—‹®`˜ùž‰íð(çÁg„@A%Šœ—zHTËÝCr3×54#’‹Ú½ íV0ð­çPò”¹'W˜03âÈcA^ ½Xþ(䅲„†¬²9 ¿½(¡Î¨}üÊÁ~ ŸƒÎè|ëBQ4""Š"þJ <ƒ^$K®pøaT4‰dcg2¨L>…Ç¥Ì*XFísOJ¸`e°ÛU~̧ ø‡å-´d߇z¸ç}%GìR@úäç¢æ2ųŸôÚDÄ·Gä2‡eOk†O²bÕš UÛ \ãØrQ{!Y‚þʕY€ÇS:LƒÝ{n)3sO֕TºêŒÇÚIƒÅé.kþ`³g!/xxÈ40!BB1úíÎpÞ¬G©1@ëJqNíÉ2\>Îê;E‰z¦ø/ã$3Éå0\\-„•räÛN‹ÁrΏæ‹Ù[Å<–Âê7§¦âú­=k¾Clö÷ã8=Qçç,ƾ#ÄCc¨t™Õ9æ¹øâCÈ Ðq +ɀR›' kžÿб0ºk”pe‹Dðï-iݝKлh¾›¶ÚǺ/mȸve#Å»ÚR—¯Œð8Þ«ZgtºšE3YŠwZ¡ãTÙ¸Ÿ¨u”ÐñÛ@Â€ûñØÏââÊ*'E §J$X­þ¢Å­¾- åÇ è·™ýHÀ5£§u»n£RÖ\µ!ûÏpv@ Ðó‡Pž+¬'Zì@°ó¨Gõ­‰§¨Ç¾rBÁýL¯§A£†ÃP´Î.î—ç4x”ø͙;jfà*PÎÙP?wiï@¢š6XRL ³>Î["žJAzÓ±ò7éŒAr7rò†( -Š*ñªv×öT"p¿vâ`!¯Ç˜³þýˆÞª§Áþ A‘åÑ@˜å´jnÒ=ñXúbϒ¿£ö³üf— ŽŒÃ8]½w‡™¡p•Ô™0…Á¾Šˆ^åG|ºÚƒ|H춗u×뛌 +Á|³ÙΣÒKb‰9=l¢tߣ”Âܓ-ày=牔GJ¿Ê`Þ£ƒQ‹í]­…Ù-ƆœKŽd†ØAöŽ”ad>á>V žšÀn¡ …Ñé“:‚vULÃÐo7ߣY«Ø¾œˆ‰ç^`òÖTe¿™‘Æ;̓Q˜„ºZ£XŸDËüÕÓ $-5)õðI¢eNeDzá‘n¯HÓo0a[¿«™Ê®Gô°5ýc)‘8ïúd Wâ‡!”z `̽W†~9àTŠ¾_Ÿ:àm*#¿ðY¹- |ÀÂA.wUƒ¢â@œ[¸¹¹Ð‰¹Jŝ»+ ΌÂvkQÎ= +Û-«=£©$~ƒ*X”+S +ÚB±Ë8–Xª¦>Vs¹Ê…li@ήՠԃX1>óZçŽÎÌzc«Þj*O*KpO¥ë¸êÈ×é Ig.ZèDBe£¸ðáqÔÝ´kî*O0pJ”³ÛJs -ÅbF­¿ˆKc:dgl;¥7ÆçJŠãp¬%FÀ5Õ"4Ætx¥LhÞ#=»2Çiþ1Æ 8CA¨XõRkkŽ-¤ Š6TJPÓ¡ +¨[+SäJ†™± 8ÂÒï%ü¦ÄáaQ/\AHRˆ?É!–+ž”ë£@¼ŽÅË°`tŝ¨æ Í@á!f¬Š¡-ѐœb%ŠVyöîp¤Ù•–$Ùµ` ݃r¸VònXüPÔgÆ5‹ºèÆRpFîj³…^3k™‰¬„ØäŽB6Çs(ˆë”²K2a˜tÎɵéÖ°¹é°–“ÂÑîôu«”BäÂ*ìÈÖH½øS…–øTîP"ùË¡T|<”uå¢IGëjxg”ÁZX4•^Rr2©éÍÁÌ©´w_'~‚ïhïáôD–™§¼.a¾’zˆ}Ø¢ kP JÍKw©ž.½ê!@‘:¬Ÿ(G;MLàÐ ÆbïLOf‰_Ñ¿9Nʙ.WlÁ¢Î®MhËÜSz+Úb]¡î®ÕùK +Yc…95æX©¨H¾yZ…n‘ž‘þ¸Â«‡PŬ_ê­ro.θþ®5fƒ&Ÿªš<µeé3ê,a––Ç©¥pB”#¢´¡æ+8Œ»¤ù<¥ª£ð~ÛUý•yø©ÕÀ³ +ðяYÏS­º\'Z¢?ÉçXéW!ÍdQ#´ÅÔª\ªÝWh…¡Êä“.óuY…;:&QhE|“šÊǺWAÁp©•{êX2¬0IïP± žî +WŠoDß-hú8Áª–¥Ju§»üDXÈ¡] õR€˜Êl/»?6)óÓû„‘zÒǽ™˜üàI| g©ºªrW–ÃÌu&3üMlȤ§íÉUqŽ×ªø¸Üˆ,34e˜çOa=;÷BŠ6R)Ú­——]ûjvÁ„$Iqáá7pÜSŠGÕÍ»3Mq(n25ñ@ÏQär¹æ÷‘ÝÑÇxÝÑ8ö#‹]×&ñ6Iu)¬Ò?_& 3LyúUP¯j²2†‹22Ž3!j¶=õM*°T—çã‘Ẩ‹!fº÷ÌÚߊ1QOSٚ¸XÚ5Ë9àkJ=üðG»$í§:&½û­3®ù±Óô^ØëXƒ~ 󭢦'<½KËlZFwŠº‡?‹ö‹ñÉn¿MíÄaÜ>]ÀB]7«ÅÎYdú Ÿ=s"üÕC%ÞL†X™³ ‹›¡æs;ëYó¦µa$‡zß}ŽI9SA.]4.&1“0 |°BÇÍ>g@øà ¸$ÕçÉ]å±¥Êi¤Öþ}×ÃiÕbÑ-§Bñ.-*®|*êe RW ^ΖàŸ1ÃqÝÈ´JXX1J_ì)® +’r\õK®˜ª}üH/•L`Ÿ”KtQÁq¸"-§2ÜõeîJÍÈ°šœ59`±ëG›«Å8·ûB›˜†ôu¡A=¼##€1Žã4F—”õP¼Wd¥4[™'BÝ&u܄¡ŽeÏ>\ñÑôÖ?î’ ‡›nó'—èœkº¾"fÃù: Œ-Š¶šó9×슃ÎWwšBðÅ)ÓZvp¼Qž‘»Š"€&XÊÛH<_Øà€š(ñœ ‰æŽB4slEÃz×"nñÛe^.(U›ƒù œä—dOùæ–°\óonӊ›¤UuãRꪕÕz¤Ñe)ò„W(UDàä\P4f: ù¨>¥²[ÈüÛ©«+ÜƒØ Y$*¿\eôá{öӛªd•WU24Šƒ±';Š•8Ÿærö„È Eµˆd"ñ-9Ç%l4€…m1Ù2ڛ»ŠšgZXèÜ£%õIؕbKXŽ;õ¶0ÉÜ¢ó±¢} á^!ÿ«úîk(Õ¥»Ë¤ê%y»º‡‘G˜S³è Ëv.œàv\A†~´«ê*{\”%ìý“œ{¯A)À£çv¼#]éœàÇ MïyºÃS¤JbF¬‰¹øû6­ßû…5J`±n¢+v’cµ—A”¥J ‚* †rC µùÞæ†,gç²9͏I㕍,•}TÏî7—i¼vf6¼[>Å}vh}»´9Aß°T¯2çÊ(;ùÎØ÷§¨^ôÐnRãï,¿â—¥¿Œ^×a=ŸõA°p°êë臲¬ÇéÆÇXÊ­©S‘ xCòœiø¯‚$Ì®é>]„[ü™‘þÿX‘7Ë"È͘ŒÀYd!w|m=Û3¯”T4’”oÝ!ÍÂPP<%Šô~ïóB•ó§’7$ò&¬û­þRÔX +å\ëPɇ†dulЫR݈ÂQµEUÀóÈgñè÷¸)×å1¡Åp‰|Iñ·|±>}±æt0Ÿzqo?*ªš¤®Òè”g)P㥄¿'qémAü½€2”Èm²/=]afô9 Òt·8\<ë )ÔT:ûÒ@ø9”45‹ïôP[|„h˜Å +•Rc<Ãê”-Ô TW†qWJËj_4ó‘ABˆ1O‚ch¯µ‡ÂÓµ”’ÂTÚÍu¿ª€ç­UKµdr^,¤sòæuãÈR +¿Ü6.{&›J·f‰--3px<‹™êÊ{Ón˜´´éӝæá¢sHŠÔz-?¬¾ý⃅$\>¢8/ºJGٕèT-ŽÈ`²? +ևÌlBuN¶)¹f­ÝÁ®8I7ÚÉ8× ÃJŠ'­ë p~D÷R/•ù¬È¨9‘þé„ m@ä€Ø¢qî­„â7dqN-ÎüQf¤ŠiÆPȍ® +¦KeÊzz [׉lŒ+C”±€`nD¿G—W¥ðP=À³Z¯»›WPUFÃæfê’Ø”XS¹^ô÷®g¤«3èDýć{O4†q•W +bñ£LvGÃfÌÎÍs½­ŒÁ×}̇½gˆ˜èB«gbÈ¢pµ«A@ÿŸa¨ú`Ü»˜ Ë¡²7ìecÆ:A¾º– åçJ”l Vf8,z B´‚Ù›µâ]C¤3B¤»(î³ÃMøÆC¡V–jF©aŽðÌð Õ–Hw7vcªyæ‹Áÿi‡ê”jF1—2°~ÑØ0þ¼t»§Ï¦‘¿©ªEOߌŠ@ѧ‹Iõ@¯qM…äk„ Ñ 0zÙPáE O¸ºv"w%‹™(PÏ@¿Ü†¦BµZR‡2ÎxÔWmª¿¨¼£\”š—Ǽ9|YÄvø¼.“nÆ ‘SVáð÷šœDYk¹UD­$,ä±)£4-"&´­>fêpȸuÝ,9D%°Å<Ö¥ìNŽMvu¡arJuÜK“ŸQÖä¡þszNtƒ&šsºÒîÞ$¨$B¢8ÀD(®œ×l€bæ¾Q‹ØõÇø‰ÝVºW›ÜäaòýÖiÍ=¯;ˁ_P' Çd á³r™–Ùëår×(ðîJ·Ô† •îÜ-÷àgՍöô3Î½¬ðlGéC·€Î•oé@©àX†U&¨Í¢6»ˋX­Å|½³iÃÝ5rO••Â¬¶!ÐËp>“µŸ¸ˆñž—‘1PÖ¨áä(rùªÓU[X@ø™â£d-«+¶¸ápš¤»V›_ü¸Ö”2ªÌ±Á̘C N—Ê,~èÔ ^Ê[ä®ÝÛ©¤¿E_t°ÒO²XŠ<­1gÃfŒY#GuK”®*­"k»1-Ú1-U‚^Ö=—Ëðæ‘[QB ÓYË]ÙÛ"KW¥:eq©vS<Èx—½ŒÖ¯.ƒÜ‡ë!;FG¼õÔÛ§jNx°û;‘vz‹ôÁbæÄ3¾ÄV*LÀÜÝ\Å_Gq~±¿Ä)ï˜:¢¡Wý•#ŽõOLҗh Ý]wjŸªXº†¢«+çšSš!Ϊ‹#}™Þ£ M¬r{T¼NN.e2ìFøé‚ÅלÖ0O³#u‹tgnh3â+‹êN˹V«…×3ф¨¸“˜~GhÖ¼É딃‡Ö"L7µðKXQ—ä…®a÷Žz QINþgÃZC8´V¢ˆž¬cZÎÁ¬¢j¬(y ¹y +(ö /Ëèñev:sˆßnw®ZF»ªúÕÄ–CÅúc +ÔR]ÂBÀC…êJÇ×`Ö}XJü–+”™ºãrÁ*sÀ|Û £ã©né@“øŽÐXwñK<SZ-ÔèôöÙ­)Õ¦y– Ý؅NÌA‰iÊ#w7E‚E©Ð¾¬àð’z ,†“B–²_4§ª i/2éÐ93¥KLso•£ñ¥H +A‘-é !.­l¾7”XwÈEÞ ‚=ŽÝqY’¹VâÏ¥EßùÇ`a½–é“ ei±¾]{äm9Ɔ´pxÂáSâÂÛ@mˆ×Ƹ\RÚ¡h›öŽ“÷†q"¢»/Û±›8Þ H>” ‚n˞#jõ¢WØm?B)as„Å~æ­ÜÄܐ)„S ³¯‹L0ͼ`N}P«_<¹fðnV=uÍ»ßÑÍ fT\ÐBÀS¡…†g÷§ âe<}xCñî·iá¯^e±x×Ë@˜±¸FEføt53Tqx&/ôÚ>.Naä™T+bª‹NV!o¼ÑňµÏIž¡eÖ×¹ï£FMø»F*© óË&ޔŠ€GSÞQêay$ƕÚé¶æ̑™ðŒž;ò—‡%è\?õÊf© B®€o ºtD')ܬÂ*|GŠU:3“þÕbgú±[Á]»“¥êXrWWˆçžÒ ¥ÁŸÃptnØ]4YXlÃ~ØcIóV¶¿@7]Uw–"iE<Ù'¤™g¦xìdEóåÕÛãU$ëO¶ö(j‰ðXVè쐈dǞGzbD¸]ãiTªºk´ãÊ=é +ÀL±7-äo¢éVØƱå‰\x?L+zª,榯CJZ|¥…"–­s;|µ¸½,·¤O…­Ãâ!å2»67Ä샕+ƒÄ㪚a¨öqÖ´±ì¡wÝދ{ºy‹&-–¡²‰%’KaÁ­†Ù¬=oVc°W -tÆÀ:›·ÉUJ¾»ÌP2.€HuU<—’…K N‹{'^fŒ±l-«!Æ?k·÷”+ÁÃ|8ñV¨Æ\µ¹Ô‡ ,ƒË³¨Á¸c˜¬ì„¸íÂ+t„w¬ö%N—Sþ„8»ÕÜ&nRI:h’¿æ”Í ˆ¹ïۊ$䙪çl ƒ`ñ¬.)†Ïvj!š^ÝG¥û"!WÕ9NÁ—š#Š«éóŸìݬÁ¥Rz‡øô­¾Žäè!?¨åÔVÔû ZÎn|ç=™åè¬W[Ëù×Øyå´=Ïĕãõ>'­ü´Ôp‡•Ÿ=à4f•#¬¥ÎŠf•cñx™ì0!½ÌK÷2IåÔÿ••dî˜rô1jæÉcî½ì%£³ø!\øtÃ8ןÆR°Íäã2á@”_þLvBùTœ”£îòz<…"÷Bôó#:ʤg£ˆN¹hÓɃrpò«›³±ÉÑè0õž–×rˆÅiI&ÅÂ&Ç2C~ž¹ä;H–üEk‡’SìÓÌÇààO3ÉÖÇ=¨w"ù=<àaߖ<òË*ÉGþܪÑK9+í8eœÝ@ˆÕÚhäjÒåX‰bDÈ6hä°2³ÓÈK8ÞI#‡…}FNƒ¤°÷ÆÊK‘¿aäX†3„0r¬˜X_´±ÈQß،t™å|Ü.Päìg¢"ñE.3‹ê ‡E³Ë\¿#Ê^W9Ì×B"g§Š€s¯AÕù"Jµà?™³‘ÔE(”mrÌ$ ‚üñ2 äÏúº@kTxD·&M`Çéð@}Á¹úøøE'¡³~.Sð7ôøhá ßg¬B Gõ2—ówLg.ö;~>á—;žÕåuü´žÔÔqKøó¹D}9Væøa¿@ŽŸÆó&r†àUN(ò@ª&6p<ÚÁoœêLêõVÜ8"Åå¯Ô'oƒ5Ž@?S8ky(¾>‡\ímV }še0AãH[±Ò7@ãÝA¨äŒ£ô´ÆtbƑé%¤ô¯Qàá—€ã W@î3ÄÄ£±Þňq¦¢‡>3ʖYÄÈÇÂP¯ŠùâÈfª$Êxq¸v”otñ:f”¦xªK¶øÏqFl­J‡g@‰üFGЭ4-ÿ`–1WŽ‡Ð +NˆLQœ°fP«ËçØâ6RS+&})Žßã‚1@álæxœo@qd_øú„•åYò˜„½EÃá&Ž|Òˆ‰wùJ‰G::–$X9_ÃÀ†ã¬V°8|än8ø¤ˆŸÆ§%D†¨îeî +V„8Ô§9Ýbàr9•@|V~x‚&>üŒxgÐÃÏS¤~FW²`‡O> 'a¾ó0™ ·YÐB\¨ÁáXQ*edn8éˏÂĆã¬Î:¡á`p°~?˜ágwÎlC†ÃªoÓÄpŠ) ±blÒ >iá¸T3Äy)ÝÈÿ`…á$¨ÄŠ +GºXc»Iá=˜À +ï%èó+'¼‡Z'0áÈÅ5s¤k1opÈ Fx·T=á-àñ!¼…ø%áhQ«ºMÂÙ³ÖzˆÉ¯[¼ªYcÂÁ±[ÓafåÞwMç&ƒ# 4XUf0x ±òÊL F󲲸4`ßCm¼w(øҚשUt ¯®ñ¦¸Włç +ïœDðŒâÎî8pWçNxÔ1' üpzg›&9Qà}ß ‡VÞ0àôՆ8S˝½{¥èWÕgW.yc€ß y«VJðC˜±IœÎÙà!úþ7—?þ?©¾ØfûjU{²¿¹™É1J0 ™¨Ý…üíp`‚¿‡jê'÷; ö;­Aý~ê–7c‘嚝fxX¹™ýé$~OÃüNcð¾kV¾î;^ˍöýPÐ?ìk-êá‚õ}0êi¨÷”Ï⋉õ-–C¯“õ}°¹Ýo¬ïƒHLŠS ûþY?³§MûÉA“ðFû†›2ÜVC’µ½=ƒ\ñ õ;S$Aú~èãJ&…oˆ…öéór£# Þ… w²´0êéÅkÙ0ßð ”B Ì÷A8ˆ-ÛT_l”ïFä¨d|fp¿Šµ–*¨’~G|WÓ’ðݪJ3ðÁL꧕ï Q Á-÷nÕéñ {§.±ç +÷®Ñˆ0ØÞÕ­¢í C´Y A 5 ö†x`„ցúâÓ² ë _RúOiX4ëzYIäî¸?íPï´Fùô¬¯¦7¶YA>L»&Ñ»¹+Þ؂KŒ èÝ"¾@Þñéªc`rÍÖÊñV¿¥«L7~l2$oÊY𰑼ññ2¶$ol(lf¼ñà9©o$oZY_¾3š ò†”³ÇP±cꧪŠ2&ț| ±H ò¦,T$ƒ¼IGbáÊò¦™H yóI]cr¼)²axãxSXåLCCRƒËIŽ77á'»q¼afóëäxSt{ô'9ސ ¹q¼©Ù×ÔeŽw!gùz&Ço¨*†6Ž7µÚ.áÈÌ c$Æ[ )#̗>‘Y°oÈ¥B8ãMá3)?ÆfsãM©¹ÆxK;ÇjµãÍ=YUï’ÀËÀxÃÂàݎñƅ]> (í2Æo +¨X'¾R¼Ù9>+… \Þo„9Î^vŒ7Âríœï+¬rMT0z+òDW„÷c¢Y¼«éàã¼Ó»Ÿ;ž®áÝ æ1Èün\'¤ß +¨êŒð”.™ÞMòqS%S»u%è?àÝPäÜÞÓôݽ’»Ñà]m’oûZIíÆ^|o7h7‚T³›GÖ2³›½á‰;ژݼèzhWåÃððnsjBõïÈ¢ì`Û<͵pþÌَݩ%ùv`7¬¬¢ +^7Ž£¸³pÝø5•-´îBÑÄ¡5w +þlàº5Ç8I3qÝ¢ìE[Zv¶#‘âÖÁ„bW‚þ†ë†Yë¦…ô5ãºi¨ªM\7Í,Ç +\7¢'œS0“iOû´ãºØV½jàºY»!A¬›QåmeÖ¤u³^„•>ëF†~=pݼI*5]yÝ% Éëf‡vÆúƒ×Íâ Õ)¬¼n–Ð$ê[NÂå‡àuÓBjâÆ릠–¢‰àu³?—ìÆÜ¥ŠÏ Ø-‰-¥fvsCUßцÞy¤ØMׇ+š vK‹ë {³ µ›»=Ý°Ê-1°›†añYþ&AÃ;±›>ÉMìV?–[‘·ºÝ’`»¹ªRҀ"½ÜÜã€eë°p¨ÞÝ2ßQ°Ú´¡‹y…ì†Aôû ÙÍæ6IJ[ëC¼µ–nÑïdCv«û#a-Fv3¦Ghd7—9A؞Ènjυ¥1³›út}#fvÓ¢aevÓܝùUXð, ‘ÝüQVFnÈnIþ‹Jix¼•õMd·´ü‡{°&²›î#ÃíÆ};Eý0´[aÄ.'GšÝæ@wOíV¨ä4é$¡Ý%ûјٝ–dv38ÃÄçÆìƥʙ f7}E: ¹àÅäËލٍDçÉEû#¬œTKd7Qw|‘6d·"ËϘÈn¼qDü$²»œgÐqd7‹Æ¤† !9²›®¿:ˆ¬Èî’*†@vÓÂÔp »?®–Ff~ç²™È\)ORˆÊ£Âs‘=Ó7d7Ílpfd7~‚ªµDvÉoGvÃL8O"»iQvÒÈnY˜t[‘ÝøQR:ٍ)Å[AìFJQ½ W`73¢$]°ûq.-YÜY±1»¯ùa[ÑÒý1±{ô(RZÝ°Ž|qö´“Àu>…ìsI0œïIX÷ˆ±)6]í¨îáNéIê¯îpt±1´aç<´ºIº¾Ÿi½¯ ™™Ó†Ó=­ætß5Z†¿ 6–ö®˜îët>73g>!ÝiØÝÓ*D÷M Ñ ƒ¯+ ›´ò¶ºåVEœùÜ0hYñÜ؏ó~à¹ïû>üöopî+¨› µ‹4šÀS™›,æ®ï" E—Ãiå*ÆW®XnI¹ *7 Ýe +t]Sn÷dr_ÇTþ1Mz¹ÛU"¹a Îp#ryÇúÈr#ÌJy¹¯ø7uô[F·FôP7­,yØ`Ü´bNµö†Õ(î—A‘µÄ=b}`7B¿êÝfžD’È7 7µ©lóg +7òðŠÂ}y±»3¸Ù$üy&‚{D-t¸qB,9ÚÜ<-Œ›ÁßÆ­æ€ømèݯôí&|›e•ýšìíõ8½]œƒ¼}E+8Û9@làíËzµän_n‘4mUp”ߨÛ÷p@nöpµ˜ÈmÈ©õX‰Û¢‹>¸ çØnß!vÙxÛ°r8 +Þ6ê:˜ÁÜ6¨âª[iÛ¨¢á `ÛXz3ýfÖvþ½¡¶§Õ¤mÐq†[-²‚íŽhÓÆÙ~?˜m,MÝÑ;ºSÁ_Ÿ7Ì6ÌZ E\r¡3Â¥,ô¦.®˜mXj Ì6,¶$f›Ûð fs­ÂâÙ~̖JÊ6–Gjû¾B¶_©Ê—€lóÄx—²MÂHìY=§“אmRؗ Û| ·[tOÈ6+k³ ÙæûÁ!4 Û´(FºB¶Ù,4®Böãv‰!Û½§ÏéYý1!ی@2X¶A¶iVöՐmE&ë5‘ÚŒ8ªy…l3$FuS@¶ñ˜ý†l‡Éfcl㸎یí¹Lƶ¾u7ÄXÁ5úIc›^Á™Ò¡ÈíÎØ.A·IÆ6,7c›%¶·6™ˆm\©DvØÆk(,V ¶áºÔ{ElO8•x_CV"FF‰*§ ±½˜Øf“gf± ‹Tnb›Ä Ʊ]È?/*U7zˆ…9ðlˆm¼ÂVŽ±M‰¡±ç,Ð݆ØF¹éiÁØFݚ8÷.Ig÷¼O;_9¥¢Œ×†Î!%èÚx]äɯtm‘8œ^›A$uB÷B ׬+][V*’Œ×æ±Î€i«<¸zxÙðڌ‹²CIðµñÜsL¾ös}l£ž(Êu™Ì¹ƒ‘xmÖa´']m~úÂֆ”‘”`k£kÇ­´ÆŒ>^Q0dm–/v­h™À˶ì+Wë#!gt¡pÅËYªÅ,¤ƒ°Aµ/·K¦öåâµDjÈÆHÐBÔFC ŽÛÔ¦þãp0®çp°sçi‹Æ]ð´G‹†qÚ©)]=aÚìhEA’YÚ8ÎÒ‘¨Ý8ÚÃx­,D§fÑùcEqʟ­m()c ˆ6’†ü¬‚¡ÝC¸·!´É˜{¤EdlËÐ*;@z/•;pm?ë¿ŸÝC±Ñ³¡Q"˜%àÙÙÝ>Oº~ ;÷7p6J”º07û7( ÙXX±Ðvcfê"0×àClÅ]`¯!ÇýefŸ.AI^öéÌËnÄmî°ìl¸¬ìáXi¢²¡á$¾‘²qü¹eŸÑ^=8Ù¨1S««“} "0ÙgÌiAÉÆ5ã1gnS ƒ#ÁÈÆôtšMŸèt!ގȆӯp‚CF8=¾áȆ.‹Šê•zk…`G}Îh¿h:ö3œÎ^éØ02Ìpì'zš;˜™;û± $É؏ó Ɔ!~n‚±™h9¬ºcè,R!Éņ:-‚U‹}_ÑÃXì'0§AÅ~"¿B±‘êÑK42Pܧ"ÄÚ\<ÑýÛ Ø43ðPìB6qy>%›9 úÜf啂ŠMWñë Í›ÛÜ.˜¥•óˆÆbâüV`±K‰*ü ‹­uÓÓ'›9pºDÅÂh÷¥¯üE53›‰g5‹N`\Í<üÆ\l¸lp¸a±ƒ'¬u¢5û±&lGb?À“ˆ ƒ`b?F/î©Á­fFýù´S«‘9N.xj‚ ©¹¼¢¤ä¶¨7Ót'JÿŽ>Ë-1œ’xhj­ÈDÞÐÔó²åS’©»[¡%˜úr«K}:ѐXêây;¨Ô–ÐîPj•¢ØŠIMbÂóS"©oReމÔ@´°qF©o/G±ù7µõ[É¢¾¢û„QÔ5ªïvõ0°'IÔÖX&ˆšÉ‡jFf¢\·'­„Pãý(®ä›jÔÆMD¼Ü^Âè£áˆ¨åÐ$P7»W ®á'š…ýo'~õC¥¨ô¨°âë™ìéáÞ oìiË×=}2äP&yZK²^ßÈÓÒ¸\m’§¦=Ù!ÈÓÔ§aI­5±!ã0°¨b §?ºìß~Y€¡ùŠ5y §»³|IžP\‚§Ï:á•;€„ØœÆNƒ¢ŽÓ¦NŸQ»A§A¡'Ìi A”†5r†Ë[ÌÒ⧑¦¸+xÓHœF·¢©â9£ôØñzÈ`9¢š"æՑhLÖô]"ë-#q¾½MÒôS‘ØAÓ°r€ Ð4 bí:Ãæ.+Ð7Ìôc(NR¦Qž¦¡7Ã?0è³1¦o—s&cš@åûšèh>8 m„éË$Œ´W£&`: _:¬‰—¾<×'4"e®¥7¸4ÄÅ +ÙzwZzþ¹’¥Ãš`é+4AÁ•¾ººa¥!¸î›ÆDuAO6T†hƸø²Ñs&ÒWè© wN¬n@i¿k2OµVªÅ7NßÑp¿Æ ”¾O;âÁ“¦¡Ž‰“f¼ü8ßhÒñk4LúîÝLš½èÏó% @¦ÒçFICf j„ˆoÃWvtâʂ#(ÌÀHßþzwŠ4Ê·Š;—Fe!+ђ! CuÄ~"¤ŸˆðA­#xѕǑ۸ñ£Ÿµu&¾@ºǘôhd{˜ÚØàѤU·™:ÔKõ*FGß^Äîäè[|»äF?^%6š…”gÛ©Ñ䅳mž¡Ñ8)ú3úi$ïÌèÇP–DF?QÄèõ@}G¦8xÑ·“d ‡Žáa§ECÉËN˜A‹½Tà`@_ѧrcEC¨@RhX‘XP45ö×óƉF‹ñMc¢ñ7+¦L‰¾Ž(6_!ÑȏEŹ8•‡`ˆFªØ!z8¼ž„èewˆNÃƈžVC¢‡YRI(Æ +™Q§ nê£ìÁ +…^Æä¨Ø]¸¸#¢Áë:}3™”éŽÉ‡ÆŠJ W<4–eðãÕ›ê­\`Ö-{ØáЧU$ɆÕIM‹†¦¤Œ©ü‰†V{%šË<ÿ±œYgí§Ü†~\)“ KãäBsñ<®7,4ÚdÄ=ï5 †Bw+Mw&4¸]qîü`"+—Hèw×èó7w¾þïEBôü³Ç?Oÿè/~øËípÀßüö—ÿô×?þòÏøí÷?üô»_þËþ§Þ?ý£þÓï¾²9þï/ÿó_ÿ óúò›ï—ÎŸÛéÏûÃÿøõ¿ÿå_üæ÷Dë¨Þø¹óúýú‘ÿç‡_ÿ׿úÝÏC°cÛßü·_¾nÕ?ûío~úÃùá¿üîo¿5nÏëRýÃßü].ôóoþz^(ªä_ßòÿòBÿݯõ»¿úÙ'û§¯¿þñ?o¿üӟ~åi8aøåŸýæ§?½}¿{½€ß}gû?ù῾®pù—_üɟý7þÛ­û'¿ýïóWy¬ðg?üþ“ÿúTþá/ŽOÿør|ú÷¿ÿşüwüNJý>>ý‹×ý/Ûï?õOÿêÓüOǧ_½öø÷ñ‹?ùîz0ôã~œn{û…¦Ã…‰?oíôe;Ö믟ðÃÿúõ?¯‘‡™¸mB«þ«]”)\ðÒfz-/_k<üÇk´0Bˆ—+@Š‹&êlIæ)«Æ[@²—¯UÃnÄ¢áäH·Ù1”^¯ßØK7ê5¼mçF«p8ŠûÆEá¯í°Ó¸ŸÃbŸ'<»\ÚÇûð:ÂÁM¾Ð? @»×ºž›ø`z&þåݨy-¸ÛÙÂzàáö–ãÓ¿úE<Î ÈcIÁŠï1$MǹÚatMÛËHY{3ZR¡ë[ì]hŽý°ðÆ^¯Ã~6~?_µíÜþš×ÿ4^nÈ?¢ +iÇo«ÝgÂêÅ¡¼1ʛò‚|°‹y¼:>í‡%£}ÚÏÁÆïæÜò´ÿþþCot¿{5Òîf(çµÔ0ێÞñ2Ÿlµ‹ZÞëîx©›Õm¿ßï0ÔXUl§Q¼îÚNx1nW7íË­˜‡]nÚ<‡ýƒ)PÎ÷«ÐúûƒKãÛSžöå•Èî/χûð>f|Çӹčßo/Î}÷~‡3GÛÙ.ÆíÒ¦}¹ó°Ë›ç°ß^üœò}c8µõížÆ·G<íËû‡]ߜ÷᛽À§šz¾l•BüÕþ„ζ‘m1n#ÛbŸ#ÛrØ9²-簍løD!ö/HÞ;û9LûrÂó°Ë¥}¸ßÇ(Šy¦åÃ-Âîå8óÅX~q1n§·Øçµ,‡W½œÃv‹æã^7Îc=ì4îç0íË ÏÃ.—öá>|ÿÑ]!ï:?¸+aß<²s®7¦²Îòúà®`EÆa÷‚n5ŸÚ]ßݕuãéÌÃNã~‹}žð<ìriïÃ7™Lç½ßÞéT,ç0ݏålãvi‹3ïÃâÍ;¶ø Ûí]œŠeãé~,O-oxڗ÷!»¾9î÷šLç4½ßáéW,§1=å„ãvu‹3oÅâ͛¶¸ +Û^üŠeãé,.oOyڗW"»¾<îÃ7yçwoéjLJ°oŸ|s¿ÜÝx¤|7ÐÞë¸öñ¡ZC¾›6¾ëÆ󓟇Æýû<áyØåÒ>އo¿œÙïðü–—Ó˜_ýr‹q»ºe蘷byæM[>Ïí/ßò²ñüê——Æ·§<íË+‘‡]_ž÷á/göÛ;?äåæ'¿œíbÜ.m7æ}X†yǖos»½Ë‡¼läa×7çÃ}˜>jžžd³hó% |ºbó:ãæ¢,öéÏ,‡žÏr››ôñÜf¤åã +Š‡no+(ž„ÖÓÛ^Œ›k¾Ø§¿vzüíãâiûeç¿q¨÷OúÕèý[€Û7û¾G—X/^¼Ÿ³Æî_>q‹ÿŸ‡)ÛrºÅzûõb͙¦*Èh»' I½Œ/監p?—™Fv®þi;,C wý´CçLó\×ÛÆVÁo‡Æýû<áyØåÒ>އo9Ó`ƒ÷;\Œ"ÙNC@ïs?áŸ]Ý´/·bv¹ióö;,÷¦¾m\¥ÒÛ\ߞò´/¯Dv}y>܇o5Ó°Ðåýö.MÚ΁WÙÞ^àŸ]Ú´/÷av¹cóöÛ[ØG|¼mlFÕþÔÒøöˆ§}yò°ë›óá>|ËÀ4/dÛ³„< ³œöï44׫ǰ߮7#Žu­3Û»JlöÃ6é@÷shIÿN?r²±äºñ%ð~ØiÜÏaڗž‡].íÃ}ØB§èíqþ=ߎév”ýãvz‹}^ËrØyÕË9l·Ã}?o»²n?ì4îç0íË ÏÃ.—öá>|›õ|¾'s%4Mv¶W'Ší±…ñýÕY7ηa=ì4žÞܗ)}£ù°æzbšæçó[~zÞ»ý<ç^7ÎG²vϯOžç·âß„°owŠòô7£¯úý¶Æ-Ú»Ç@}b zªo1P=Àõ°Ó¸ŸÃ´/'<»\ڇûð•a¿EóÉ/ǙiùÅŸÞbŸ×²vú>Ä@õB½Å@ûû-ZŒû9LûrÂó°Ë¥}¸ßd@ §Ü>Þ^¤“ [ωg¼çÛÙ.ÆíÒû¼Ëa÷äºÏáCr}?·-¹~Ì+ä4ã—ºÚ}&ã>÷Qw1nCôbŸãùrØ9ò/ç°MÏí[ Óµgñ}‰ömÕ@'ÒéŠi´ù¾Ä×›Án¯\ìïïKŒuã¹j˜‡Æýû<áyØåÒ>އoì–_½ßÞ¹XÎa.–³]ŒÛ¥-ëŽy–e˼c‹o¿ÝÞe!°l<— ËSKãÛ#žöå}Èîo·ûð ƒÝv­÷;<×ËiÌUÃr‹q»ºeé1oŲr™7mqï·;¼¬–çªaypi|{ÊÓ¾¼yØõåùp¾Y°{Døï¾Êø0>„}ûäz«oããtçýa|`㕻íãÃo_&MïcÃÜp~ìó€Ó¸ÿúbŸ§:º\ÔÇ;ðíƒû½_ñró{_Nx1nW· óV,cNܲå³\îíòç†óK_Vߞì´/¯At}a>܁ovØoìüx—s˜Ÿùr¶‹q»´e¬˜÷ajâ~-_ãrc—77œøò¤ÒøöX§}yò ëÛòá|ÿ¿{ý7?ýô—?þð«O×{Üõïzí{÷úIÿuTr¸¿kÏÅB—Õþå͎®ÀÚ~y;ÎÏٗãüäóü6âÜíd¤xžå" £½ `ãëe<@-—ñ<žSƂ:¤Ïq„qtoÜÛýñ6Ä/~‘Çú²¾~êAåÁÎÀmÜq2èø\ªì7v–q4”7ðw_¯›g;|2ýny2¬»õ–ñúÄlD5˜®[2–ëð9¼†˜å*ít÷×þ ×¥ns2ú ¥¯·ãÁ î{W›7}Õå3¨6½–¾ñG©Ëþ¬5ѽÁ³õI]iìçˆËò?°ThË=@/o_AÏ{¾”Ž0ïÁÛsøè…2[Ø—d¯ûmûð³&™,œ"öiÙš¿Úv‰Çq¼Öþ=Ýùýt_±Dæ—ô<÷4¢£6ãŽÛûuåÆÞ´c²ÖAêüÚ̓CsX>ë×!ÆÕ[œ*ëlE;+›ÚYÂøú^lF÷XQª‡0@ŽxC+Ï#ÄÃ=ôìcãø4<š¯^Åú:½NôÖAÚ3–׉E’²£øKÚ{ÚÇïA 2ÆÈýáÈó³4ÞçC˜Üioå±½kȀÅ«~jº¢› Küȱ‰G¹ÚoTÜÇj·ñœ‡ÝÏÁ§GC|£ÐèèpXÇöîo1¡0Æ;ÿà5Ê#ø»{ÎÆBEÛož Psãûʟ«ËÖsÈÓ[¼ ­„U“½BI@;ËÓË©÷é§sv,)m<ütXÍøÁØ<3íóyØ'ÄO§•ïì@ªÙ~i, +x4Ö3ŒO¼ÞBÃW´²°ñŠŸã×ôÕsÈ{D⃛{þö××僿æ¨ë“Œv øúõjã©ŠŸ¤¸¶Ÿ1ƒ|-i,(s]&¦¯Ãúõ±­RL§ùõÍQôô×TÓ:{‹ ÄHÎñ6ÇáZ{ÎGÌå~®Ø8'ˆ·XoÝۅÿø5;ÆÛƗ;üòþCg#{ Ú²?-:@ü|#æÇ×½öþë Á´®15sú1íåòûp6=\uÏõkv^G ãu„pŒxái¯-6¾zl|ŸqØ®ïôã9Lßå’VÈsDKÇ +0§s _Â~âC½`Ïa¬ñɐþÕ#Ï{ùS—í »Ý Ž·®èe{ŽC\oNWÑÆz­ÞßÏ $¶·XÐ÷b£}á9ÿSyŅ³Ïw‡J Ÿ¾zëgAçUÓé#êìwaǚïKØí2À~ç«:Ž;ð _=rþh;ÁCóÝõŽW$ä\ßX¨~Iûѯåù >>ŒÇøôÕ#Ï+=ÁGûʕ‚²6¼:ÖÊMÆtت$i,p’d<Ö×»\§ßŸ§žq„×g÷üìê/1ŸæÜÖ„¸M¿Þ9Û¼½öšm>~ ÿál¼ùßòGÑ:ÿŒ‡ªh‚½ŸÃ^OÍ­°ßüòI‹Ï óxò2¶q=ñ¹^á!œlƒí;>ИW—«æ­É#õöo•‘#úd˜Ã•Œç(~ /w¹ÚH¤Œ=ï8ì=b%7øo6–8ßÏøP8îy„ù¥ °GtOÏ‹Íû9b„ªG Ã~ŽÀ•®ËÙc0bHÆû¬_TyêÙõµk†Í[Öùó±s9Ör{ß0-éU¼¾€ÛÆá!}„¢õfÏø›Ø:zŒÛ‡V¨0Þsï1 íèKØÇçËIԇÃoðk¶ýh<ÏZ瑽2büï‰ój£ùréqÉXJ\Y=çþ¯Û&&Ÿ"ˆœÑáo¨,¯Ã%Ë<¹Œ}^[Ϗ‡ž”ïØÝr*xÂøZ3=˖yäzÄú§\™p=ÞÑûñ£³Q„óž˜yh_ÞÑÃW‡HîS«oZBÅ°K̒€e=n{ñ©#’õø¼Ú­ÛÓáå–øvZyæ^릜ÈÏá_ßz<‹K6€9¯éçS¸÷uáåiĔp{ÎíÏ÷2Æb0SÏظٕX/^§Å£4³å Ò{÷¦£ÆIГñ/¹åÎÖÇ-º“x=u{;;8E¬§ßa|}ee1æŽ#ÐëââÚæì>Hx„à!¹zñ»ÚÇr'Ô>òX¾Q5‘¢݈[ÁH¡·œ/‰C°Ÿ¯»u]ñÂëMC³»|šˆ{ÏO~B¾¾hÝ÷\é×Ýw\[)aôÑ÷>ÁÃ,ÝÆùi=×½¹_ùiōø¹Ãy®q/GèWØÏѼñÌpQâ-Ÿ“UkcaF +c™ÛsՅ·21óåÜXæ—á™Ò'üºï_ÂÞJ ÖLçÉXϸ%ŽŒZ¼1¢ß{Ɠãpâ#¤ÚÇqÍ#‡K⪌g;sªñ qD|€£^úólQ›мyn-ç·¾Õ¤%"½0ªÏJÜ7Dhç‘ëG~äTT!ŠW›DdŒ)~s—`oZÝÁ±~âÜÐ'ÝÞ;Ü(Y _——<Ç©'RÃOÀ¸’~¬5H×ÐĈ~Í aDWèpsO¯ƒeï4·’ª»Æþ¢v9×*wºßK–œÜì«Iž>ù€S(c;âýëWƯq„\ÃÄԏ–f¹ñk,ˆ#Ìt×ý䘄¶W¬žïS1t2îün5ÔUt^‰Wj´\†Ô®ì¡? ó šçÈÍ ±¹RG¢bá¼ã-áZMÆ^îüò½]«ÿ“GèWÞ´3—"PŽŽp¡«‡´Þñ„YsºvòŒ«¸GÎ*°Ï9o𗰷zĸälS‹`¢ö¯4W_rÈ{¬8£˜g^ŸL>47ŠpQ +è=éh“‡ÝïA›üÃَ×r–[^î]À³²Ç¦DNŸ° +7†Q¨kv˜¦¾„½ä͌ùÆú:BHåHpäˆ,óëˆ3(÷ §ÜqDÆ¥üµdækŒúch± +X~©Hz‡(êgU¿hŽ+ìî1£yª…ŽèŽ3<¥RÔÆÎ,×è–^㯞}á<¿d‚*­“Ž^„ãõdò‹¿Ð±=5&v8ž%@ñܚ!ºš±ª;½çM;bœ«ÕQ0Âϟ¼ßü;_òcþ<Ã+Ç=S°qºÏ]âõŒ±›/Yáh1òÖªÀzAÍñíêa Û¯ÔÃ9¦k‰±ÛI¨ÅsãGÓ{1Oá.uCñ{Ûâç{yì{‡} -ñQœlô¢Šýy|ÂX^żKmÅwÿ‹P"Èo-' §œÄ8‡¼4ô¶Œuߘ1™cÈU’®ïµ½GNºOäÎF, XDs3Œ /⠍‰‰¹“ŒQÌ© ã|uËmo¹Pµodã™Ë+—ºôˆ&8xž³ùUñld¾c Mò˜Ž"ž t9ͬ¨Ωj0¨{ŽùÛG@vþΛvÔ8BÆIÎÑÓØsk¹(9V×êF“RO·&± šÝEÎËníåɉ©I<†eב¾ÇÆ)?»ûˆ,;ÞƃӄBcõØc¤Tmš‘d¸—Ì7ãËÊâ݆7}dHÄ¢"|Y±a€v9Â\vø„/‰X§GkcƬø€æ҉bÝJ¦§Š­a.ñșñÀn6ú¶£OYέæç)—g,k‰£?‘b¿®-–ùøñĐú[#y>1"+– -K:÷ñ¦éçžLWÇ Ã‘ o{´'2úg^ÚõœË9ÌeY>£iáˆ7M½çŒ$+]Á#p®¶ñäÆqb¼B‡>êµVcÿâÈÑ8jD&[³²(ÿX‚w, òÖ+ðYH&…¯7MfÒi<¯<ô¬l;¶6ÍWS×Ø%v¤¦-ÒGµ¦Ø’Œ÷ µÇ÷²¦Zd Éº_Ýï<ƒ¢~p­Ä» +n{ܟ>uZ/û‘Áº~¦tðÊo¼Ü#Œçt€;¯ò X2–÷%ìÓ?b±TÚgøªžËÖO*JOß»šyhqä-[H·ÒÅ¢=$°ÂÈ<%6a´6m,9 Û¯ÕþÑø3þmlþë!_FÆæð×ëç씑]ä´åyÞóçØX— Jƚ+‡f‰¶ÌPä¢ D珌öÐņñXe ˆŒ-Cù}„ PIsNjGKcNi­·60eŒ|~ »•£8U 㕏¦gÄ :òa ¯Eº9t{ÿ˜}½CÁmiÕ(Î Öï²çpUŠ® Ƶ<5§¡ÂL¹×ìS ®-oülÜGŠXhì™ñ)çóç}‡ÚŠc’5r·¢çº]Cþæ¼éy…7Dû v {ïK¤o_—žúýšâ›:rT¼GèT°éÈÑ[[$5¨è¡©å$׫o Þ1:ÐuÏã–¿†Ðîç4Ї¯l,Bê‰}„34 #‰4Ö«¤šÛ3ƒ³¥äk‡N&ŽämL5oπi –èm‘3Ål0"hcm›ãÈ=µ”8ò÷Vë¸Âx¦cËd‹P—  "‡/cI}/{V kÎfyi8ÇxCš•f·s‰¾Ý°eæ¸ûÔì߇¼"íÓC& +{*ñý:RoúÝMîÓã3{®¾Hro ()Ô|:•¾͗8ì2r·²œÙík›Z|nw¡5Œ=½åº¡çJºüÿì½év9’0:¿ëœzÎév·««D'¶Df¹«§,yiWËeåZz©ÑPTÊb›"Õ\\v=Æ÷sî9ß¹pͯÛ/sßàû9@H2IfҋDŠ½Xd €@ìpGd–ØKSòDNÆ>Œj÷å£T8óe(é2r¯‹›ÞrîÃgr[OÛÒ®9$¸ÄémÜ•&ÙÏ°Uî€Âñ—Õà1Wªà„!$0$­̉ãóÈw†¡;˜ø>(X{œI +gLJ!óŽuHópÁA¹ÕVЊ*ÚÑ¢Œ( RŠ±Ü¿.$©r))[{­ +WªÇ S’ýx¦‰qi¼Æ×Ï]ÎíB{t–¹£ˆƒa |æÓ~R +[ËEN ΢?ûÆ^ìbN ÒÂނæ${JAh¯´mË!¿¹ðÂQÊ}cÏÁTßK³ø€q -„ûӈûä AÑ·¹“4Ì]y BsëqìRQ®Iæs­¬-cIJpL;“®1Åÿ‚`Z³7i‚³,êƒYÖ^â÷ù.Á#)¤# äEó’Q +·7˺³:¡|¯pt‘˜ªYäÊ۝0³Ë£¬<´%º‘sŸ Ì7è·q|ø¶‘Ñ£¾1Eæ dI®ÃÞø¸òÀ4áš ‰³õ€›\úão®s}yõ4»µÃiâ¡­:¾0FÒg‹îy¹ò,í„ÒÀ¬çÄ•—[ ËÀ-ጘ%º‡üzW‚”"0„ò4×Wª™p}i™J.³Ä^ß䀜D Ò*3YÜn–4 +9s‘%¼¹ }Ž’ò ¥OxÄQzæÃSs"é}ø5¬ÓÜgÿE1³Òºw,t\×7åí҉u-ÙÆ‚•Ø5ےl›‰ujtª"ùˆÇL~LÀ–<¤”PR™²a͎D.þ×ÈéšÞ(Bv–‹ 1RåRz´òA_‰½pաՔT€7ñ…ã ¥Uès–RïпN­ËÒ-¤Á…’ÎO—Ø w¨iᇜâÐeF4ѯðs§­Ï!ñø•ˆO uÈÍÜÉúp“,£×å>·G(I¸s¢'±&ƒ²õl_(¢ÐÐÆ¥œqZ?’r–3Ǒذd'òe”=Šdò2Ÿá†kÑJwiBÑÅæDߔvš³‚HÂô>^å OfV{a;§,;sd0Ò#”&n§T$ð§’v.sVhPœÏ +ºa3²A5}PI¬-ÈQ$!3qÁrVC‘´~˜`¤§%ž˜ÞÛè%JXÂÐÇCRáœ{4Î~D_+™sʂ£ѐeëàšù5¯Hß ,O»9Íx‰'ˆóI>:“šçÄv•Ô”t²©QÍíz Œô3¼É0¥C%¥>ðœs6îƒO§Ä°C‚‹„x)fÏñ@zs-=—YŒYxU”;q4ã”Ó…‹Í÷M:M¹V*` $ä…Zî;¦™çü±yˆû¸óÄ r\ÐJ³LRneZ£ƒ3Rµ—?#Z{^`æѲ,Ìr°÷&. +ç!u6˜0\î"åÑy \êxçZ ;P”³Ðïá{°ƒ¤ÒïPg¸äÅ4sEҐ“ÎT„AçÄ%§}ƒ)‡gš¶-' ´üxd)“0·þÌõ +#ÀsJä¦ÔD@’h¿¹„" £–‘™‰Dפ-*šÍ·‰ Í|gt&½îÞ«¬ôR¦žòŽ€Ä†Yz³W%Öúá z¡r×ÂÛÃÀm*²’ӝò³Âk·À×L:vÉ«,¸êÀ.™{ñã(J ˜­¥Pçd2zt0„$·Ü)Ře”8ƒžöþÆ$øèÊ« Kr1Ñ÷è1;UÝX‚ÁF”‹:€»Ñ¥XÌCQ9g%ÁÆܗýXP#$•t®ØØGë µ=*¥@-ý¼ES$IÇ r²âyd×5w“ÞÚèªAx * g[JŽ^gŠ˜D.íuŒn9øª8’Ú1ôĝʇ;ÃÑÁ``Üõ¥›€!§YÖ΃>lš ›k‚@%hñDµ. ± ³…²pHÜiüÈN—ÃYH<œ +A¢Bþ„¡¸ŒœjÙÚY4fIƐÄÙôÈIÇ!é В¼+¼j +=È©ŠUFS”û¤áĖVpÑxšÄ žø‚4÷rfÜ\ ¿—] p’eu*›8–øœù–r¿RtByCI¸‚Ù'ˆidD æ€A;žzÁ'I2×8÷U ÐÛ¾·¼¼GšøsÙQŒ#E¥8y³Peõ™.žIê›æ>Ã(T¸ ÞÈm’ Dy&T‰SŒ¦§šW™¸*֋íö¨Î(~4É@ö…ÀԗÁs9`Èh˜c^/E¦Ú͝ åJ+9 ’LiŠJ©ÙÐؔD”Dç/»¨Ô‡Ò´›)dë'-ØHž„bg˅<ÇE‘+f>ÀW§¾F\ü³o\FbC„Eæ`\ó¶¥;¬SçÞw¯Só‹*¥˜fî=2ÕÓ\]>DG¶Ñ$ñaÜ҇%4q’Ò¼ âªudŽ±.y×ؗ7sE§°ª¹oÒ§’,ª|“q·5täeWšQÌ»ôÖd …pŠ–¡¢b­¯ï…f)øî]ƒ‰æQŒ»´–ÈžapË'ˆQä>WtXãkCNÁÇVÊòE9rÊ©‚JôÉÉ £l‘AÌ)à‰ç&2dlÀª#¸ Ñs}q0о§ÆÒ{lмéY:Ñcc’‘º-tæ³ ˜Ýìn»BIbB¦G”â-ÐÅÌáûê ŒEVÆĕ Þº ÚSoþ”Ú‡‡C¥Wîí”ÂÚ3—¨ÙD1g#ñìÃ.<—c‰Z¢ÏÿdÞs©œQÀ%~0á÷† <ž…“ dª€±3ð)E§Œ“«OGdîCûŸœÈ€Ûzé{38 ‰Ä9iLD®¨Td„B îO[[bƒcŽÎ[_’ ṯ–sé{,£Â eܤŒLWÂñ̽ÁËô¼öî×$³\Â]Aâ3è¸H›Ë$­éÞÁ™rƒ ¤]–…f)ÍF”sÒ©0Šœv¥½±XOÌCJ`öÕOmyKLG¢dÞÄÖä±ÀP<‡AQU0<¯­l€—–*ï©Å7ùç¥_¦XD3ªAä«,»R L¼'P ên¦u¬µ9̒ʣz0eˆ×qÙ°ìÞCÕW’TU©h-0P_‰“NʈÞ2òªE‚À½FI‚»”6OÙ¢u… èYIL_EqØ*X°ðÉíÜ)RÅ!G¹×®îm™¹SŤO&DòÚ-/¡ú"±”<†PJ äÚU•¡Il³¨Nâ  $‰(— -½XÇ£ZLŠJ¡ØâJ?¥TK“:l’yá4ñz*À…7g‰¯·%½pJe¦RÏ0B)<ÏÉ_ˆ)´‡'úÁÐsOâYèêàè”Ë€Y éÅfM‰*W~-\8Q…=¨:æ0ÄÑ¥ö’–Ôµ PÄV†õÖÚièc´@®œ“cATwàÚïUíj¡iËTÝR`Ô+w'…rµÓ=î…ÇLúÆew» Ïbæp©X$eÚ ¼[ -)ƒ+Ê7N#‰Ÿ*ïÀ4x8ãñúȽ#ŸjZoMô…Ð`nÈ5W,Ó>û0±¥SRá¢|f'žŒþñpJåNʕYl¦ÊÌ(~ÏÜӞ8©+](cƒVJE×ÀæåoB½(Gèy¸dÔ8÷1rd!`ˆêeÜC°qÒ΁¾‡•ç ê0¿AVW ‹N ¨Ÿ˜Ó¥C +-¦>žÇ?Ï¢ÍDÛ³Z%Qj⢠+Xý”û2N*¡Ò^¸È<«PXŽ†tS•QéWÃHå-Eæê((ásYƒu€ŠŒuë€áŽ m@!Y­üâuUU•µ±8»œ•T¬—ø¨„±)sÜ€¹ôsAµµQ»h)oxp™P¼½ù–ù¬°F%Y€kE6\b† sy§¦rå¡ì÷váPƒÔÀi’½zD{ω)Önnƒ½¨©]ìք,x´ØÑ8OsG}$¡t“‚К〬}Â{hÐÖM‰h8¡î6(b‘“á[z©(e¹°3…Ù%ÞQÄ­ˆ2J紂(qÚËgÍÛ6æ>+ñåX¡Ø§Eȕ÷™QM'|X¥ }‘‘“Ê>QÍM;ÎàûYr„¾®;I±ì‘¹«2’²¨¢Z–zÓ&bQ§HÀÜ_•´X×¾&–ˆL%æaÙ uê\-Ìò¥S™×½(ÍÏ6vÅASæ/A +e™1‰Ž2çòÔ»z[.(ª‚öCô22‘Zásμ+ßÉޔ¦ÿ _ež˜[îƒLa}xó;jˆ”h‰ŸŽ«ødgå +eª%÷¤øB\$«Ìúê퐫Q`(]† ÄÙrÇ+¸KÉG`T·ÔÙ è +¶q[‚"ðÒÔ`t^`ݒòsâç ¶„µN„îO ¹P®iîk²’X @A9ÅYÐÚUˆªe^tS éúr=™$ Ì|¹P-# Òïg´iZ`¨—@ŽnAL„ƒ8EÆ~b{ƒw؉G•ÖbÚó€ç¡tž]|JÅ5~•›•MŎy !{4ãƒðµ}´S… û’nXmÄc‰XLãÂaÒª›JZñÛí+/*U ÂbÅ®1£jŒÌUƒñ©¯m¨B9xw)%ÄçJÏÿ+Ó³Ö}{Ӗp ^TÁ½f3^Ì#½&¤¼SŒH©@2Þ¸«`©«éÝõü(£Æ!Y9B;3Š*úš'­DLh¼ ¸öÙޒª+Š&B`Jª2ú*CËH3O(CÚñLlLÕt8gm€~ûCã„#¦‚¹ŽùÄb!5a˜E ¶ËÂê…pRøÌs2ô’/€ÞdSœ-ÐÛ±xþÁ<[._—xR¥^WÃ|A¹ŽÔ2 +ì³ …(I'6I^M9% |þu>†Y1¯óÎÐÁ’èwßÁM›÷½ŠVV`/<܇/gNþA 7»¸ +ÊRÈQPþÂ:ÎRŽ¯£È' +fZ¢>r/ڑ +•h¯k¯S.R‚yàšû×yÝK†QÌ)òþÂÁ™””UWC + +ðF\³>ç”{`uBJE^I(‹c f.•²2}æŒìç¡"0jª^Uš:nDùôpžÃèÁ™šþA‘ûÝîBK5=°6¿úº÷"ñ±Ì§bœ’Ý’èòSŸ½RUWÄ_+8SŒÂ_+¨¼€"rPoà¡¢• ¯ ¨4DU™ ÷R°%ùôq:N,ÜW`tk©öª/qº¥u'B‘FáÂêƒ/Î}} ÆâÔÔrßãk´ÊÕöü5Z”ª pEÑ»A4÷q¨àòóu¢ušº¬Cˆ‘õu-¬ ÊEïú£‰¯×7_ñÏuo®j×Áµ)¥ì匲_`v_Ê+ÔHà>š•ùdf(Ó`%¼ÌšÁà™ÊÄ×¹MÈmqtU´$ÃF©1]”²¤ö%]"àj +8`5Ý[p=ReÏ„ó¨€.‡ª0þBÚÄ_oaOd›tãËKS‚ïBŠæ)Éâ.Û:ç‘(KEWæ{6Êt¾~ ó7ö9Ž%½šª>ø{%hV»¢ª,*Eâ/³¨zc|›óÌ#¡3¾ê2ꎡ3¾ÚÂP{a‹*«TuÆ¿4”GǺä+_ª½rîoc¾ˆ˜¿ÌpïAt=Y*ƒºÌâKJ½Š†eÏÂ%¥ŠJv!C%$Äú%Ýf=‡9¼TÚ*Uö§Ôßî«¥µ\Xxæob̼vko°Èýˆ|íÚ¥ÝÕ¼èZc_O`ê[èvj÷†=w“ÐmE®1:ø}†\ø`ʽ‡:ÞxæêKé î ‹Ê+ˆ,H7Ù*_ó, 5˜æúNi¡“‚‡ÃɅ‹{G¡k يJ…°4¬Dãí£Lm¨úH³œ.¶›ëC¼´åқ?/<œyO–úDIÓíóÈ)›•ûêõ<âðÎ܆ÕÚ³2õw_ceÀÜïM¥}f¾R§;gªðV›D1* J%Z=à‰ŠJ-† Ôà9Œîk â,– õ÷хÜAŸ cKF‹àtgt #¦ +Xü૯ÄìÏ=Õ>žLù|!`TQ#9Õ!ÔûSçÜaÂO/Iá®qph»[0­Oju±çû`yŽ0+ë‚àážfLªóA/áŠ\ ©>\€Ç’ÝhUyëög­˜û|ëÞãìøÁàt4Ÿ?ëL&Åh€PÐão‡ƒg£Þ`Ò¼ÜÛsðýâeoÿòé'ß^âo,±?}ÿèa¯oP}úÉÿ¹õ¥ùöã“Ão‡§~¾ßëNzÃAg +endstream endobj 49 0 obj <>stream +ôvÅOw[·ß\ôæÇ=ÓÁQïd:)Ɵµ¾0 ïFÙ6Ýó^ÿtT °oÝy<˜„áŸÉÛ˼Ídrë³Öï½®܃—嶯;ý©küsïtr¾¼õ sa›î¸æ_lÂÐ΋ÞËóIý±Qû«ܽÇÇ÷N^gýN÷|Rü©3˜Oz“£î9,àÁ1«=ðÞ©iºj´ÐèªFºÇLã›ú3øfC†ô¶þÞú±­ê÷ucC²69ƓÓûÅë^ºUŸ2姮jÞOúÓQ큎Šñ´ß€#Qû«ÜÑp:ê÷ú—çú̧ÁöµW÷¢°e¨æ‚QgϊGéxÜë öWÎcÔñåóqÍwÛiîsúöê_ƒ58"N¯ðŒž‹ÉꕶÁ£;Ü0Vñ§o“™D\ÐzºÃþpôåÏç½IÑà”~Û_Ѻ|›³ôM9Œû½É³No•ùbƒOc+K=u.Ï,Ò~&o¢Ê¿†W`ÃfùI1zY]7YòjÌpnÂ$}ÐÎ\ƒŽ`ŒWí~ܹ_œµî~zÝÃÒí k2´M žü½èNö‡ÓÁ©éçþp…tn›¶“qýá–ºª1CHX“¶)ømëBßvoezL¦£“i¿tëûÖíÃuIã_u%Ã[¡!F£L/žv'×E¶?se ºÔ÷0ŸtÆÅÃQñ©™ðË{汫ê`x4éMº+ŽøR4Ñë7™ÔÒCW5TؖÃZp•Bü‹š¬çz«Z[î%k´7Ç"·3Xí”ӝrºSNožrZ?R}§œ^ãÝåôlÔ1êUÿÛao¼êiý͸¹êi}kØN;Ýi§;ít§î´Óvº`í´Ó&ÿýâ|P ŽWW®)òo¢@YŸ£ÎioÚà\¦öWÅ2N{ýNƒüÈMdö7‚+>Ž.χýáËúðŽ-®ÇÓ[tã«O‰[ܱÅ[ÜN¶ø`4<í£Àx#ÆÂÌöŽ1îãŽ16`Œ;‘qûEÆcÜ1Æc¬Åu¦ÿü¯q÷¼ýPôºç¿À?ƒbôb 6‘M~ôº¢W¹åÖ-O¹ÛtïcÓéݦsã«O‰Ý¦ÛmºÕ뉩íól2´]œçFÄyþqØÿå¢3.FÓUõÇ6)Øsm]¸g£!݈€Ï]þyóÉ®Ì,ڔ©CžZwPõÅíë&In.ÙÝ.pe¢™¯#4*N›ÕàÜ4†ø¡+G_áüm+'ÜüËÎúÃá©»9á¤ß龺۲ áe§Û›¼ý2i7‘µ6é2ôÖr“f£Û°}÷–è&o»-O·x‡S{s’/nhҐ™lˆl2>ïœ>ØfF¹åÁ›ÝèT¾ªþlÍ>wU«²~ìiïìl:.š_ñ4÷àõ«å€ o<*=tUc¼×:¹%µµ'àV*çM'í~×í¼IëßuPôÍ·f®…è‘+c»¢>SêüÒ»˜6qTû®jtx×¯ç¸aÝýžÙ×æ"«û–‡lÃ=V»Û5W w“o×¼YJÄÍ:iumóýe»ûDwÚ6 +h;ùìãÈg»‹F7Æk²ýnûa½Î7,]n+< + .³\‘ØÏÎîÂÑ«ÑÆ7åÂÑs´»pô:̍íäs(ï.ݝÉ×äLÞ]~ýÏäÝ%à»3ùšœÉë©Z»sùšœËÛ~ñðîðwŒÞ¨ÙÞݾ­“ôA;³É«eë¯Üi±©wîìn„]8Üͽs§î}4,<®ç(Û¨Ãj;nºètõ«élÔñÐJÜ«>yHí±ãǼ†Ú_Õø™§Ç«ƒÆ6˜Ë¬ÁH7ŒÉ`êۓ{ôzs™›Q èF$šÞ€“}[ªçìÕ×6¥|ÎÞöÕÏyzs’Ôo‚¡qó Îly ç;ì·ÍñNs†øâ#]ï»! +Άñ’íˆi7HuÚ`é?Þrõs[7mÏ­ÅX6lÛm‹üsõãY1zØm¯ èÚ×mö'“DÙ$Ã.oÕwü!¾oh¹-=tÅÌèátÐ}¾É\h{×a[·’ÖÍZ‰v+ñZ®DvÓXâþuBý Šf¼uã³·å\ÃݱåfŸuÓL6ÉâcǸÕâþZ:͆éŸ[aöÁðÉ{ýþÇX‰›¨ž­¹_7l)ovDïêÈV^¬×ä¬ »XOî.Ö[¸Œ¿Û̋õþôÏÿ>ïû£&¡ñ×ÿ^=UnȵzM¶Þ¸Vµø–:§½iƒÍIí¯j¶O{ýNƒ +›¨…nolÏGŠ ¼æ³¶a¥ðž G—çÃþðe}Þy UÍOÜhž¸½JÛÇ Ä|ì8áUÈË[ñ}ÒôšÍa4€êºOֆñ‡ÍëÞúrõÃL7µ@Ò@ÐÝU¨8| ªlq°p“ã`SN¸­½¶h;ê¬(<sŒ†÷©\íE*MÖÝÆĬœÔŸ­ë»zÖW¶Ö`}Wã ¬ï\:8ï Eÿ¨èÝF¶ù'¯j´+ÂÈcïàÚ£òŠµû½ñe¿Ó-.ŠÁäIçr“϶-®Õêñ´æ>²ÒÇÚÃß´r='õmww6896å0¬?[¦lIÉ¡W…npÒñI}£×Æ1;lS˜FýÙº!yŸŠâ—úæè³Þª€ò™`ÃþÕMö`8¨?°N·;½˜®võÇ˟¹ªAŽ +®ëóô´7é½n2JÿÄU±ßú7¼v;ýî“aƒˆ÷艫bý#0žKê÷8–ÚZ~쪆¬V¨±«¼AÛøªÕéÿÜy[`戟tFÍdûÀ•é‰õwR¼l"¸æW¶ë«õÃJýðêFT_? /œêØúJ•¤Î wÑä¨þâCud{jÕìe[¹ÔÝE.mŽjÖ`²6̞³‹\ªsP^m¥úí¿È$ÙÝd²Ä¹©±KÝí]jr lÊ·‹]ºÖç\}x³b—š¬»‰]ênoìÒ6²¾]ìÒ.vi»´‹]úC[°tb—ºÛ»ÔääؔÃp»t½™å͈]ênoìR“¶)LãÊc—6ȅ¶‰¡XM&¸ùš½Ê ^«åu›ž&±ƒ»éùèÓ³µ÷Ùí*¸Vtd+¸ª¤¥êk¨–ϛ(©Ñ#W%ÄÜÐj§ÏzoŠþø²Wô†9lqèù¨¸® +DÞÐÐóÞà´8ë VV/iX—Egr¿I¤kôÈU tc_5Î Œ±_B”ýVÇØ×<1·&Àž5ˆÕÞEØG–«]„ý‡Y-v—'-¦Ì¿IËüÿ®ùlþÞ5?Ô¿Åí<3W§Å­¯~ݤ5}#Lâ'+Mlßæ +á&ng¿"­¨ö mbím¿à®K·¢=®`zÌ#›ñ‘Ͳ$oŵvõíg¯VŽÄ³m¯Là¯?¢^í҈äFŒhÅt–FÄ®Pw©?¢ìüÕróΨ79¿(& ŽªÍ=”›Ê¼›x$oo²ëZ‚Ç ?›7Ñ!´ÞjÞ°‰Þ¹ó+:²sçïÜùµG|­Üù 3:wîü;±˜µsçïÜù»’y;w~µ bçÎß¹ó¯‘;å[pèóän3YwçÂß¹ð¯‰gÓLa;þ΅•,ämÑï®=KýÞËó‰i°×…¼àú36ûܕÉ\õ%®ÞÙÙt\ FÞ4à(s^ÿ±Z&xÔ¬Ré¡+“YꟀÓљQ²üÔUÒ-©­=?tŒÆFLÚ ¹ŸbgUÜYwVŝUñã ±¾Äº=¦ÅÝ];Óâ52-Z-óîËQQ îi¯¸kÎÊÞËáÝ×½a¿˜Ü§w‡£Î`UìÂÎæxåò[Zß,\ôÍ·fÇè‘+ãYýv~é]L'+꒗ÎzàŠÍW÷{hœ8„Ãñ„ ™þ ²tèëMÞ ®_]#厚™æŸ¼:Q£ñp¼¹4 +Ä:à O^V°BMß&céÍ°®ÑâÚeA­oaÛY¢†;KÔε³Dí,Q;KÔÎ5/-ì,Q×ÃåìNÖåÌRhÚY¢6MÑÞY¢Þ—%êêŽÃ«öŽßûڑÓq·ÁÀv#ªÎlk‚ûM0¶¬3Æ KzފÊ3 ªšì*Ï\• TDRy¦Áí*Ï\§ƒ¹q@çÆÊýÞäY§·Ê!·Á'òº•üvgò5æ÷»3ùúhCÎä]5¸ =“×Sµ6í\ÞÞJp%~&obœEóU¼a“¼«Wёm¬wC«£uÏ Òb°»êÌS¥~•¸]åk*z|¤ÊWy0mK‘ŠúwŸ¾mAôöê_ƒ­8dJ#zsu#ž‹ ¬´QqÚlWmç¸ÁÔŠe<Åi¼ÁÚÊ;¬ã ›ê­¸%üFXöw +æ Q0™LnÕ^Ä?÷N›ü¹æWuh2Ñ`hçE£À9ßþʄŸnø0EÓ¯dX{LÕ_§ dó+Í ©õvcÍ7éÎ|³éJØÎ|³12z¶uæ›#ڙo®çؙovæ›-˜êùf«gjg¾Ù<óÍM5LŒ¢3î®°Eݠ耳Q§;éô¿ö¤ ØÇëνÙu¯q6˜^<5ÄxÝ$C>~檆˜´ëW¿:錋‡£âÓbÐm ÁÌÈo@ɲ‚ÍÖT,Û,ÛȂeíú—!N† ô¬áf¨ g£áEƒ£[ׂ>ŒhdÊ$öb::™ö ‹ÛhSê®,R…¢³)™žMTÍ2~¯•¹³970ÅmoÈ`“¡íB7ÂWð}1ú¹7:)úÓÁËã<6)l°ÁJ݌ Áº!ƒ“šBâ†ztêG4m®C'Ùyt ws=:°-?†Oç*Eè~ºÓO¯X?m´ÍvêNCÝi¨; u 4ÔúãNC½ÆºêÖGÖ/š²¹:jý1îTԝŠºSQw*êNEÝ©¨×_E½uï1KŽ N½ªŠ0 ão‡ƒg ^Ž¹çàûpO`ü˧Ÿ|{iñHûãÑۋ“aßti¿8탳¢ +)ú½âŸÿU ö 8ErÖÿçÿîžO_›>š´î}úIÒúñçO?™Òÿ~7ŠÜøSø‡µüïoáÛ7æÓß ìç–l=iýõ§¤uú)kýø~3=JÛI’ȼµ—·.Ì7ø{øé'{þƒn§Js_áð5å +?§­Ó o¥Ø0oùßèl“C+øs^†_¨9| Ÿ)>xˆé—èÅQ—MÛ3ˆ|f½€?ºÍ%5þ•¦üaWá¯ý²šïeöÝæ¯}9|€¹’-ÿˆýu/³ƒÚËì@üoÑ#™#Pf鳓tû»¬¬ÓÖËQf|ÒŸá\íå0ovæèß}3={ 6IXkŒœ·@ç\¶t.eëNjRKΪ[¦ªµß­‹s¿Nž"Nœ…ý}³¿ƒiKÚ:Z„H¨ »ªÊ3°‡SÈLDÛsT‹þúyŠfofbËB»ð°›c‡•f:êAÔ1šæE3ÇëϜAœ2íPYÌÎË«[¦|næãܯ‡“ëòÌáÄÝþ¬õã0Þ{†S%í4—Lz*ÌJ18SL™*)ƒÂÿìÌóà2¼ñŒ‰–ls)îÑ=øÌSX{îG˜bøœ›îᏠY}4? 3šEwˆ#¸ulN°Iùœ¾u|ÛPAgJäYdØØß¿Ñåχ“PÛäÖ1ð÷c×3@K¯¹o¬êXÕ¢fsè–÷–·…JY.ëöö»E¨d[µ˜ àÌɝçE§ÿ¤c0¿F­Ûæ Ï üÑhõ{Ýâ¨Ûé›×>õNÿT¼u/£Ã6jýÜ^ãÉ»ô‚ÎÝ[ÇæûÃa¿ÔôÁ sÒ/M{§NÔ¸uÌç>xs9M"Tn„~A~œ¡ªë0Ô g8é J`¸ß™L/Æ(0 +ƒÄî_”ڊ¥RÃ&5KQæ*þhÃlè„åiÕ»­“v¶@¨`‰—*ì~7¯ãõš$ Ü¥ÚÿÕn¤Z‰TÂËx*ñÓ?ÓA¡áš+UÁ[R{Úïiw>À¹`y?ý%Ö`¤žO¼û"ê |@v¢ÂߥǴZÎìÍ/ÀiU™ËfÀòø؇ZÐDµíÁ¼Ëþ*,I™ãÈ.¢¡ÂéÆ*㱯)š,ém²zÌrõ˜“•cyyÌS;Jføph?"€ÿÀ–<ÍÃÐeõÐQvH 'f¡š2²Ù¥_dFãœd¿ú13•æGî†Ä݈7úËW g!kl<¢XåfÃ.ْG+F¨Ü•!Íý]ºTq„â]ǗΌOÖ_ºb|‚V%£UÉh1ŠèÃ{\•²´*uù©*†&K‹r扊q7 îƓ¸QÐß÷»&åÂ]&í2¹p—-‘r#RnD4/ô÷}®A¹rÉE{L®ÜcUãKÜän™q·î’ð÷=.?Vš.YþAòŠQ±ÒlÍ<1?nÇÂíP;÷çý®<¶h'±E;‰-ÚIÕCQv(V¿i¹ÉpÞç’c ·[´…ØÂ-T5deø—9 ƒþâpˆÕ½—%f%€ŠyqBÕüh艹y±?Ì —˜²«IÙµ%èÏ{]b3C‘3C©Ø-3C‘«†¢ìPœ¬ë&ÃýyKìCÏIl£ˆÌžI;眱 ;Ê Ë9S`‚ÍÁZ;­fΦ˂²¶KhNØA¡º¢­ÊÚóvÂÅxç$¡Exy>7—Õ*=jó ý#nŒJ?^žT*ôÎÌoõúµýy;ÏA¤0s„ô‹yÐaí¥m‰bXÖf*Õ²•µS¥4¸ \£”Zàí¼dª¨öàQ@áæ\v*`4ÂFÀ¨¯Ka½1w|¿Ö|×ÿ< ¢1ˆˆ@xgiw°ÔºgΝè<]iÝ+ù¾NžÝáèÔð·PQ‰0R‘±v*RØm"OÒùMrpïñ#ÇG^œ Gö7Z¦fŸOŠã{ócÓç£ÉÛ~qÞ^^ÍðÚO-›âë˜ `Ó§´%,‹¥yÈ‚„5¨<õ0³Ll#ÝNñˆèîañ¢ @xׁEm>¸•çhÖYÖºGOr»B¥[9aÔÙìž/ÃüÖ" …ÐÒXS¿ÂÂÈfiT×b³d™¸sƒáœÚx ÚðÅ|8({„˜/‡XøTb^Œ,z ϒ¦ïÚ¯ó.©f^ã—Ý&¬³ ·ð ÞQªL)X¹™ŠÎÚÙÍ}@1 šc3ldŽ×”N͈UçÚ,˛ã‹+™e|’.ƒyv<Ç°g9Ö.6Ëì"6K y~9wâÖrÏÖà…z²lJüIƼ-äOøT"=/”1/lø®ý:ï’ræ57ž®pÐÏìðXµ|/Žï=I»Œ¹]–Úï,ì¼tlÙ¯zêp…‡WAòÎ>ãXýQÏzoŠþ³btVt'VA±šÐ+¯WÉv¦u‹ù? 8ìܟ¢®±+WצÝWÅ`VQ› Æ2 ]¯Lf҅ĴYšè ¼ž©NTË+ËR®«ÜœK=­,¸íD©í +ðU~Ähñ¼-†q-:F{çiøl˜¦áiªè0€o ž±Â̪q,Pæ04»›3TöÓ6Úⵀ¬­u*-COrež¬§ÚÿØFóÂsè$¿Ò«öf;³7Ûa8e*Ƶ¿ÏÒf/¦Ü^LU`Öð›>`ì‘ùb:$Œî÷gû“jªD²8¬À¦Aåä)}< ºï~À*¿‡ö|)¿)êDè݁]ÔïxL¯ƒ…Ë\+Ã1Â9©°BL"U@‡Äu;Kr4UÍ=i™” +-q$„“kšãOUâ9Z!ćóï²=ÀfÑë÷JˆÁÙÇÂËg¿—‘ò›Þ]/ÜÔ¸¯4Sžæy˜Ú9@x`/`³ßÚJŠœ@f80‡9ËrúìאùÖV\JçÄü7å»PÌ`¯>ðv˅K[2kIC Å,ÆÌ`º¦¸½Á«Îôlüsçe5‡ÿ̝™ÖBKó 9aÖæ”p¿”AP ‹Í¬[-˜„¥‘&ö}è_ –K!Ëd VZbvW–g’!“n3ŒÛ=À×[˜á-If¤1êмOq8cìwn¾cÞ-ðdÂZìl tƒRk¤#ã¹h"SË~r‚­y«Ì ›€­É à9@o‰äAh¤í4–OÀ=¡Ì‘#î\ J ®,—'˜éU +ðx̑âðؗÑwwÜرÈÐŽBßqæÜ2¬8GZ$ðÁìÄ<ÓÇ +#c¨9âkE߁ò®/âújv¤J_¾× †¦)L/=m×RiaY6ÀÁ_"2XI–$ŽsÝ0‘¦ßæÜȔ‹ +· œ¯Ìz^éÑ +Çf¹hjàB¤¾©y‡¡‰Î æ3<@m-3KSÿdê”P¼ Ï"«6ëÖ°-³–…„ø5xKæPò6×Z ô°¨ßôhˆ°Ù—€Y&BÄCñ0Øzu¼ÖÍâç™(íÙè%s؂OɨÖv›_@®Á÷p÷íÄzBËìJ#r¥á»Ä‡ê¦ƒdô‡wšìKÜ÷.*!Ú0-ßÂètij˜N@A€è-¢Ž8Ôϙ¡XÕ<¯U<<ót.ÿ”ù“™ #œôÕ¿•®_ô´ë·ÃÆeÚá1ï ‚áKèiúê±À½žv}+÷ݎgñajZq©ZʈdZ(8V¹JðXÕ*á7ãX}Øë_T§°”ŽÕú‡$:µ¨ +æ܁¿¹ 07Ÿ1ޚ`‡ >[6àž­‚EϞ9¶N’gè‚à°¸/"ئ$³(ÌQ™šƒ´DO.±âKg·Õv ¬Kâ¡ÃšF:U)†g˜sŒ%àvMáÜ4Ò¬$tUk<—¼úYmv‘9)ͳ9F¤[¿­áýif5%iä™ï5Ërfy¥Û‰€ƒ HÅÐ)ËÑÞ¨˜H²ÏrÀÌ1ê ì}øh½.3Ðû”¥MÌéƒ=~H6'æ®&¿ó¤3~5cyCïK@7¯½Ÿ6ߋxÊ©»ñŒûAùGÃÀöàg|ŽfÎ.$M™²2-c ¬4l[*DóºLLÕVhŸ-Sµ­M-<«Ú†Æ+!xRzXDɆCõ¨=5|bBú¾Æ”ôCòφa;ô1ÀSrŽbda3Ï _-¦d t‹¾Í2Úenc˜ŽdrfOÁ^a‰’æc.t´€ DcìBÀC<-0"f Llf¸Cï)â{QâDÔß'¢aNä‡Nœ(N4KµC²ïf%uQ†áX /b™ŠÈÁ€ç¨¼DIÇ\â{DI°ÊŠy!ƒ—‹,Úà%Q2J–€0Ԁž¨zQÒw7"¤Á¨-îø;QqŽZäÛy:CĆÃT‹ŠifNv&Ó2—”æ´L¸.ÑP˜!%""¡h§Ò~=ê@ °@¿Cô˜‰þõñ|7#âù±,ŒÖbŽ¿ñæ¨d‰—ž>"âÅ0aqU¤Afв4+Oہ˜vFnã:>FÓv¦R©æ@´ °@»#ô˜‰ôöˆt¾“éüHÆjÇ߉ts4rg5³^÷˜t1 ÈX8üíæeF0ÍÊ +ø¤,ÓÞ/bv LED»@´ °@»Cô˜‰þõñ¦¥nFÄócñúÑ:ÌÑw"Þ•‚§‘™¿Leº$3æF͜$âUÞ6’EDFúKŒ‹Æðœúf ×Çâ"*e©.I‹ð×ê{5øj´;¤ðýˆDEŒbxŽà1¾þ ‚JŽx$æÄÄ#˜"ÉPžNЊ‰GYL<Ûüs$Øÿ‰çañ"˜"¡öD ÷ÇÄs݌‰GCñÏyæà‰7K¥Y0&ÁüIlòD á*¦Ia1õHVó:aÎcvßcÚ("]ÙñZOzwL9êcL:ˆÐŸPGOºYÍ¥Më`ak¹c:l>'IŤ#‘+& fþAÝ"|tÞK4nà'ÂÑÍ{Š¼–¯¨ŠŠK‰^åD*Cë»‘Ì ªI^ӕV8“fÀ ÜI†¡V8”`Àk¸”*¨·”ÖU¾¦2´¾· RuçýMPei<7ïs*Ck{`Hó~'€®áyª ÚRW¹¤ÊÐúN)šsKpÇD.Í»¦ÊкÎ)м{ + k8¨*h¶\2©ð\•¡õ}Wæ¹ +ïB×ð_áss¬2´¶ ‡4çÅBhs?VÕV…ó®ÚÄÅIۑ‘)¶¹¹"™:26•¡õ]]A̎lN‘”Íš¸»*¨¶œÆ~°ÚĉÓe¯å ‹dæ2×òˆ9ºLãµ¼bT«'C—i¼–Ã,’ŸËD^Ãi¤ä2…×qœE‚s™Âk9Ï*hVOhžáëøÕ"¹Láµ|k‘T\&òZþµHRžáëøØ*èVKJ.y ÷[$!—(¼ž .ƒK^Ï Dã×pÅÍÓ«–X\"î^º —h»†§.¾%º®á­ ²p‰¨kxìæéTK.u gž—K4]á$ÝM›;õ‚ð["鎽y*Õ|K$]Ãç„ÞM×ðûѶDÓ5|AÚ-u ÿß<–uq­Â“‘­È]+#úO£â´7yÕMŠê2#³y°â»°µ ÜÇC[-‰ç¹½&k!1à{[~4§®­­`¿šoæ¦ï.>y„îç¶ZÇà üpˆUŽè×è!‹éÀV7Š^Qî€ë}"LÑHÜlÀ ÔâÀ0™³ù•YñÜýƒN +ÿ¸Ê=.v<ü¼=µgQaÛ¼ÔÁù¯>³Ü6µ¿ ¯©#~k/à¦øÒÿZŠí1*þâÄO:„®ažÊ_ëÕ‚Êìf”+xöôˆí½¸wôâÁ•’PÌT Ár»8¸‘—àí\(E0a^$®/&–À8°ÝÔno,hSÕ TWDGÚ2BðjîëX™ýcÔÂvngs…¥MPt]¤DŒ¶"@`ûÎAðÁÄV9ÄÄèg àâÛû(g±T¡Š¤r :êkæ*'UÁ“XÞz_…+‘¶f£§ƒ2H¶Nõ,j7ÓÙ:ÛL·…Ù¶P)$’3RC…Ô–ôJoH®gÃËï.K×ßVVÅo~ómT7D¤®°³•9íÅvÖDô™‡Ï{q£=‘µ5Ão{n*€œÙ$KüWã +Ÿm¼(~ÄFx~âãð4beX‰>†þ¹o”ëÂo%4=ĺ—ÒGjBBOãA„J€H=‘#® ú讧°Ÿ±>ðE†eÂZxŒ#H‚§ wŸ‰j, D£Ïîa|ðft¯¯{¹íTè‰o”ñ>ŒVX?ûæè \”?ºþø~ÆŸ8Ê"Vø† +}""ø¾‹|AàÉümvà‰Ïr —Î ½ÊW-j«Ùì%KñÎ^ç»/—«/ô)xQ&nLôh.¢Š¦.¢>Ÿ¦Ú¯†h%ÎÌNºgÑSéSz˜•—ÁüŠXV­a±iÑεáa)”ºµQ°Û__úùÑÑÒ[}? â®ª4ÅÛÐs‘Q»…þ a2ŒT®…B³S†:Ü¡ž3´—Z@ìT²4´É%Ôc!½ª‹ ]fÞ ¥ ûB,ЅŒ±ð&t1•ÉvÇ7¢{,³£ê.)¬~çÇ'‡ß=¾ßú²u»Ûuûű8þ¬…Ñ•fêÌæÇòìŠv’14™¦Z +kGIÚ"cfï{ U¹$ÇrÍÚÈg*AH&À—eÛ +ËM2 \Ó+]IÆ,Oà 4áÈ 0 >[ÙÕÐ-UðS%~ã.cΡ´NS§¢™þ° /`ÏÁÀ߂¿ZCôJŠå¶gGs0?@»ÅÍ\1ƒ"vj‰N ß0mó4O`if)ÎÜ\§aãžÌo:è¤L%è´{P¢˜:¸î[ , +n+Ò0(+p5i²õۚàæ! 3åNÌ÷sƒbP¨_´$3œîtg@¼d<ÏUv3”°¬™ÃÌÞgo%ͼ^}æ$s*˜ò‚îĽøÂIxá-¯ÙÇX‚årŸÕvì‡CÿjF’yÑ-B¡ZˆÕ™5á·ª©Û WÑ"m +ØãŒÄY»ÐJ¹ôî„z”Рé´ÕÜWzÞshð&3Dãf^=c‘dG£Ô‡„¤÷йM=NœÉ%õ24 ¥Yìn(ïMëI³’…—œTëÐÒꇩµ3Kj•[>~õē/†hÈÝ÷¥OÍHÑ`Š«æ¡øXUË4«!ÇÎÙÙ_€sV‚o—£´ÒDUq3DÕ£©9 æêäûÿ}ê@‘Îg#(ºjAY›‹—¹ÂBá™5ËBÀ™°%¸µdÖ7ɘrò*“2Ø×$çZã<ÚÈDà0¡ |%F>ÉSs€µ«Á% P+Έkš +øšÏÌÈypÁ!"ƒÀôd]ɝô¥E"Áålß +Oåà[5zžpì$¦»f¹*p2ñŒÙ.Aµ@eO:a¶>`®Ej«Qc0qÂ8L3Tê“ T•ñ“—²ª‹º´É§.2¥áClÍü¼t™ÃȺ¹¹³ákgÏYC±·zVÛ +`œ.ôÆ]+œ*„®î> !oáÁïքŒ÷ùïð Êìw.]cÂë©Ã澃‰ÞÝÈÃÕB>ÏìH€–[—)˜ú}—ð[Üg ¦Çã/ÒZ-Ð ËӀ¿¸žîÙ+y½Ajö+õn‘ö¥(ß̍@¹‘“‘K´ý Ïëcx!e¶êÑ4Ç+UfU´ïÕÙê½·òÆÓYei•\Dßý2*-²xV¬P¿zñsy]—–¼Š&»¼þ*V©,/É÷áB#ڋ +fžö²bΡ 7d/4ՕsÞà½szz­÷Vιó†áu: ż<Åøx#ÉÊN' ¸UáüdI^±LhZ.*·e®+¦*@ÑCgîU¢âUôäÅnøšÍã­E½WŸ›»ð¢"ü ²(ÜíÊoЯ/Š7““bTôºçLJ¯¦ãE¹ç¨sdiÊPÑÈ Îjè 6j†ÄTŠŒ #'þxoё +k& š?Y5\K‰|«0úo‡ôm¾V|£/c»ÓèÕÀ 3³-~þTƒsYÒá¾Ò·=úZñ¾Œßßdp…¥Êð*ËV&˜Nž%) +îª×ß_¦­‡×ÃQoR Zç½Á/Ó³þwō”Çƹ)‡KEè­ÎÈ×ð%./‚Ù‹Tnoÿ &i©¶uÀæí”eM@.ÇD“àd”É̝!xcÒ¶©àp4d˜‡ ñ‘Ü^)ÒÜ:A«ÖèÐ*Ð{¹…X5[F>˜ 4jf4u™&öžFÎlfŸ­_µQ:ˆiJ¨y1zU%hØ*4<EJN‹ +²-àwÿ.Tüã—wQ˳·TúFÊÌ\ÆÃÐ\l‘óÀtՉLæ¯ÑÄu $̋ÂpxGo+,[MŒ ÿ9N–J™²Wü [EE%2CÙØF¹æ¦?@;'v'fèÒ:™á¾MÔ4#„#g}ñZePt€Ù{MÐæJ<Ä»¸> ô÷Øê{îÂh.hK;„yxb}'8#f¡0)@Th؃åÊ ¹ÚÀ¤€cM´¦- 4'èbUB›N0aHÂìm½0Áhç aæ:…‹¤­í6® 2·¾{Beô:XÍH騜¾L‡~㽬R”ÛGX‰#†/‘ú…TÚ<ì;„X'ªß¡‚œìðlÊáÞXžÀÍ&(éb¤§ŒÆL݄…1 +ïTL9Ø7À¶bƒ©!Ó'5[D*#b+#ItÌ{PboüFÿ¾ÊÝuŽ2۔å9Çë%3–ƒ\¦S·`‹¸3ĝ·oWò20>®ÉÍÀðYÁϼ&G³Y‹§Ùôö5¸ZL—˜¯Aºägƒ”¸¦¼Íœ¨kq7óÜZüÍÍÎB›ó8|nŽËhŸ3âóZœÎkµ¹Í•‰ý&ît¦ë03Qçá+x‡ý¿î§æ›hÝ{|¼?2 º_ ŠÃމÙVÇG¦ezü°ß™ÛÁ=šN}Ü¡-˜wÑÃxÎÀÌGW—ãÿÜ—wx͗—©}¹ùŒÿ³ÿ–óÚÞ/Z¢ôöZÃßóUµçp5ú]ß l‘ëAßiсbwZ.Õ$؎˜ÿ”€âcgÑvÿÌouηÅÏÔºÅÊ_ÅÜWø/lCiŽ`m÷lHe¾qˆ#d™i¹¥E²`jsû›™Å£É[3aŸ~rçOƒáÏüíí{ý·ãqçøÑÑg­;ߚ „ãêÎ=s¿.|£;ËˡY {}3d|îà¼Ó´l ¶ž¦;®ÍpÐßù¾7î™ã‘V 9štº¯!ÙïŒ{݆ÑðUÑǟúOGîQÀ † ÃÉó¢;4Gâ)þj:j´Ø@I(¼s¿8kÝm}úIëv„ %ƒ»-|yËÈ­;Ï:£Iå(†ƒÓioRo€ËQÁØQ|)m¼„ôݸxðº<=µ•Å‘ābOýBûl~Õ·þÊÚÚyÚì'Î;…ö%t†JÚO­ËFögh:C{ߧ”¿*rÁ‘ždƒÓ "‡Ì¥™½!75ª;šærŽ·çf¹d,kj£_FË ¶ß/ÌAöÞ(vñ­±÷¢1Kežyð¦èN¡3öGDQÁ2Q{Ùnù^z2;Ãö$uÜóéÙÙ¸˜|†ó²ÅíÇýþõ«á¨]¼Kötƒ[SˆŒF¤L¦£×ÅhÜ=ï'FÐý²uh»÷àì¬xeÞqçEo²&¿ýt:•-Š»ß_ö;oí×Ï>8£÷[ßþ`éöx`;U›mîîú0§ÛYàWÆóY×>þ±· ël[GØèœj1Åe|Xõ..ûá°rÂF– H HŒø•³4RÏÖ^ÏÌ.œÔꞺÆÝC øî¤ßô»“~wÒ¿OíîF^íD€0sˆé~ˆUÏoë`8^ÿ^ŽŽÝWÅ Õ9ÄÅ >)–Ok3¡¸u¶nCtüt¼d3ìl•7ÖVù.ÛYÏj³¤l3äêÝÞÄ=Œ"V"4Dú™\%h%§`g‘PÒcöï5°ŸÛƒ3¾éuù©‰-AoêNڝÞeõ©ù䤭?u“¢þ™ ©¿*£3óùª3óæò²|ÇËv¼l+å‘kō2(V°ãF ¹Ñ~¿35#ù¶Fó‹bCœ”ׁ-aF¦à‰½ÃŠi®s—~Ò1µâpISp¶Ïåe23ñ ó2SU‘“ÉÞK»2 +©$ՐÍÛæšg)Ç|k–ä˜_ uB˜­cŒaP@(‘s–.!ÛVB¥i +×h˜5¥”f™[JÂHƒ ªÈÔ§sø´„BP y ¤³×M[r¼%ę@1åPŽ°.!ÔÄÚJ +eZˆŒaa’kª;`æbÌFäJ-¡Œ|Ÿdù F«۞"Uæ•À½¡Œ„åømaWœ¡»N¥F~Á›| ¥?èüÀ‚‹ð‡]¶v©Td9,‘¨ê¶¦=ïàVL¦S{¦€Š}‹—NºÑK‡«ÝÚi¼v¤Ì28ù8„„Û…£H0H¡;Ö¶ö¨…ëFoöºù(Ëfg Øy&šèÏßy—±3æ}XÇ.³Ê4Hx¯8ƄÉÓ6Ü·Ýb¹‘SÛ"On^DÂÒé$çVfÏóTqÛΌ¢±®çæpÈÃ^÷†rp>^l&Ÿ¼n!hËCW˜Û<¶Øôþ'÷ÀY¯¸ì ÆEÿb-J|¼ìϋ~Á‹!EAZK=þø}gÔ …xKÏÝ/.Í"?µ?)zì~Ïôé#À¢A1¶–ÿ¼üËD==ùûs³|¿lÍd·VÑúNœr —7Ꮘu՝ï½îð´hbú¼AµÉ%ÿ.YŽû¾¹ôŸÌ·zZ<‘ËS3? ՏòòÓ×Dóp—1}lÕã +  +.2Z§Îs¥ñƒJ˜ÀØS0=ƒ>êÌõ³–-C•él½Eøí‹v¿ÛlH×>_ÅO£¦‹yè³³Îi˯7 B„BåpÛGóñI" rÑï]|æf÷Òß“ËÛgw˜”xßêÃÄíKw‘ç’½*Rž¥»#c#ƒ£_ó£ەàÐ\ƒ +漪‚y’,¯anëy_çl>S_~·ˆ>þ"rwÏmôRW“µµó/²÷>ý7ÞtÔ=/ g€,әþó¿ŠA$Òl ehgA_aÿº|á„Ã>Â÷GýáÏ«Tªû£áeëè¼s:üy±UÞGB7Jl#²MÇų£Ãýþt´Ð˜Þ䮓w1¥»}§jAMBÒv/;ݲ‰ï„úJÚîI`眥¤Ô!Ám@qëÁ›ËŽaªûÅÙpT´¾78é×à|¾6<¹ßy9îžCmº]üïŽo3Ž¸ëûbÄåÍӔ_vz–¡yßëbdM|ʛBN;£WåFçÃÑ/Ÿ9DÈõºãQ÷³æ fîlÇÜßsÿ«á­³|NZY1§U² ✿ÿSåYkaQ,Aú`p ]]ÉôY§_˜h‡ñì¤~¿oÿõYg<.Ff‹ƒŸ>C +üø ®üçŸ<ëVQ R“þù_ôsƒ-¼ãçŽÙÆsu%¯ÛÏí·ž'þIÊànQ| ULf-ÒP}óGEÿÄ·O¹NÑ ”ØÐpôÏÿø–ŠéÜÞ¼Öf\ ›¤F +¼í„öËk,a{H0òíyšÛÔY¸.Û]VÇÊíŸt^å»ãain† CÕY®1˜ƒkÎ$¹ÔÒeÙ¤†d3J·a6Ûbý +.2xô•È[û_IȘ˜§S{!šä_!àj íαŽfø°èJ—ö¢ Ã.fn¨õè+žÌ"&R›Ö'=Í´M(Nf—ã ßÙ2J{ôUž”PÂã†Ô˜å¤)v6S©r‰Ésáç PB/™ù×àLbœ–BÂ}Å0-š ›XaÐK?¦fÝæ)ƞ2a&€p*è&ô{ÿ+•œR1áz%X–I‡ÌåhäþƒË ë‘q £@:Š0÷p§qf‰'0tÚ¬{aCî3*gª¡£óNŒ™ÖF©GÌæ »šòDdvÉ+—×­‰Š†n‰Êý*’ Œ8‡N¦¥–)³F6ƒKãû$!N·Ím(·iDˇ[j:” +ç%c£–aW¥êØÂ*Vòƒýfä6gJi®pIq[óÇáÂÎI˜Ž4L‡n!$\? IJ¹f'&©²3 .]‰7}ØÊ°1¾è§ÂžÑf/*Û ³¬ufç‚ѬúaÚ5î0 éGÉX„+“ÓÁò$þI¥º›aajÛ9ŸI—Îw.… ͔Œ®a$ƒHÚU }ãÏÝüpå«q¼twuª"’¦Úrà /eǜ.+¤%Œaޜgý>Gòx²€ûJ¨7Qೂ©#MeÎ2Ëñ…9ÿpMåYŽÑ4T€[Zc0ˆÂñ’ÂVgxbe<`N¹°»CË1g21ŸñtI†ƒKЙíΝÒÁ…çVÄ,…‘ØpöRiØ<®ÂlLP2»—…U§–[hlfö`颉*fÊl¢AoÉlvǍj¨£Jþˆu;Öl´ˆÌ9Â9ÐXjm™§6‡Yjw©f¸oS#O"ãÔcF›.qqI1ÒX £¦­æÜ?(ÅÑ"™<ó«?³”ý±wq¡-+‘¸†¥‡ŸŽºç½Ó¢¨ñ¸o¾ŽÈŽ†æ£¨\ň û§6¶d%*ßÔ"[¼aÀ uÛÒ=µ¬öÿìs®-·:ÓñdzÖzö²¡bftàÈÑ1ɕeiš"‡7šWΐg˜Ågƒã@´cˆÓÃâã°ª#I#Í¥euÂæÁž€lCÕ +pø?  ²(àm*©,eT<µÍA¡z†ÅÙî êÕì‡WãfAG¬Øðs]ž­7g:–Òÿ¿$À¿À%/3ò…ÄãØT®â‰VN¾ ÎÍ~ Ü90ª\æßÀ¸aæ8^©3Ë^ͱ¤ì©nDíN¸´t\ڃM‰ÙãÒ¨–È«¹Q S+d™Ù·ÊŒ¦ŽÍ~ ¤ÚžÁ(¹èÀ¿ÌѕbÈ~?(áÔíÌÿŸK"Q€ãÀü¬LªÜ^ñÀ®?#ÈëÔ©\Ô£Ù^ÖHPς¥ÍcMp½²W¨Z¢ $aªÍ¿a þPœœuF'ñtKÜ°|II ¤bE‚~^’Sá%} ˜æI4Y@pàXådM·HýÒ±BŠ:’ÚÌPK†T©p–’…Ê´Rʴ퉝Ö¦—;, îóA!µ¤Y,Æ%⮘½ªmîŠàÒ;­xjou§\ÏrO8®^¶7¼@áBãÚ +Œ¥:uÂ#¥Fb.Ñ'ËÒcÑ\>¾uÆfJSimÅÈ4S)1O³h\**Ig¹•p<‚Ö~Z´þv[‘‰/̐þö™³·½1XÒ(Ð'›‚" ½(zÃÓQgð7ÔIõ;ªšÙ·<ÛöFoUlveÒao<)Û^ç=˃!>­ªÌ3—LóiÈ?ü4¾•iކj{´æ…P,‰/Tÿb{ßéOÎúÿüßfÇÃ×ö.À“ô(ö̧-ÞLNŠÔp:~8|5ðÙðò»Ëj,àz9þ<ð€ýbrΊþé1бWµöJ?¥g;“éÅ›ÒÓ{}$Öó#$ÔÑÔ4¸ë»N{“WÑïðzмêLÏÆ?ƒ »øôˆí½¸wôâ|ûË´õ°óz8ê™ùk÷¿LÏþùß®åýѪÌ~6wK£#×Ò»Ås؝šYž˜þwð‚K€…¾Î\vyçÇ'‡ßO‹?ßmÝ~sј{fÁz'Ӊ¿|òνѨóQѼ§·DíŒàk¤Ìb0sŸ&ý ÿLÂUš·3¿îŒÆw£ïqÛ×Ãt¨1ü0^ЂÄ\;כqùëƓê¤785Ãfu(eHzTL¾EšÔ WÜü‹k1ØÁp°¨ë¥ö‡f{ŸÖ$5}Ÿ‹âÝ Á–¢Þ\÷àÛZ;£Îì^ùä7g +_¾®Ï íõXä0ήQˆ‡׀ý}Ð%ú帞m8C £©¿R?ƾ9‚›P®W¶k+Ï~¾ë{8ùî9ߚ¹—‰“Z8âŸ{§ÉYcÊ]ËkÁ¸eÊ!ã6]9<£G¾<¯Å]|Ók1@µzhoêmÔk2 =™é•Cz[kHo¯É|<áÂñœ 'F´8,Î&OG=£ÉÖÞüC×FŠ@öx4œŽºÅ>D*_1œn×¢Ťsjä«÷Йü;ó«Sg$©µæ¢ÖòçÆ~¿(Na-~!§DãƒÑðòÞ¨èØhøªvOjð}ã?ˆÿÙ°7˜à€n?Ÿö‹QiÁ‡tfLà~B‘¾fpÁšçg߂kïg³¾#MšÑXžÝ{NܕñÖüzñ¼è¿>·°=z6÷ óø3÷Jê?ÄfÅãñ½Ñäd؝Þ/Î:Ó~¬ð‡5AmDÕYJ +@\vNOÉì‹.°º|6¾Nfa~xˆ&nwzÙkÓ1K!ÔC¥lû÷¸uo:¶žwƓbÔû¥˜Åzï1c-ZQ­W£ö§“ÖËÑpz¹¼mo<ìw&Eë‚})_¿Ô:o]v.‹QkÜ»˜öCî{ؿФã(Ø2RÏyÔ`2ê Ɨ³áºoM¿z§Ÿ‡â’g ±µ¸éÝ´vۗ£ÂïꕍGÞ:’*›dQS÷aeÛ¸+‡>°TdÂ7%£ëAgðº3> +äb¥©|6*ÆÅèuÑËvëÁioÒ9éõ{ZÈ·ç÷*>çmºFùš^¶öÑ`&NZñ†áÿ0‚'ÅøܯE\­ç…YGÓhqˆ¤ôÈÓéäÒ,ÈÉ°bæ;xؼœv^­gÃK¿ª}¼þ£þð¤Ó^\Nû〰ÌU_ /g˜jôãsEãŸiy¿º÷øYgd <Œ87|ðÙhxÖë*ÞÎNH©-dR–»3òÁÅIqZå³û«!_iŠã½´ÎüLÐï ŠÖĬŒŠµSÕtŒÙ@ã¹-Îøñ‘ag°fŸ O½Z 2M<ë™éàe'Ó#³Áö‡ÃÑ£h'ð°ŒfÛþqhVÅpðÇX#PÙÂæp>>x3 ǧXØô è÷£½³)®€V¦–a=0ÙÜñ]Iº{¶Äâa[¸M›òߧ˜ÑÖañÂulg—àée§Ö°™Ÿ§3‹p¶•áa‘°9qa¶ùQ·Ó¯:‡ÒhQu“^Ë «3öÔÏ3¶¤—ûaûñÂ7--¬í^Dê݊*ÑRpêe«:PseÓhHT>Ã8ϕĝt¼LCËfñÂý¾Wül–Û&A7lÍe‹ça§[„BAËZ㶘m¾˜œØ|~iª4Âæ«'6‹H¹ŒìØ6^·™l'í$’Ë S}8í÷é„qéZæ×EÂߌ¾wTôÿؙ˜ÇMŠÑãûã’丠íáÐl8UK­ã/À +¯®<¡öQM(\P:¯± `ʟõ;ƒÂœñªZDoß3Îð¬59«T®ø5ž‹t‘ǃÓâÍÃÞh¼ª‹³ÏÝá€Ö‘ΕÙj‚¥õ),½Äý³T@âU8œì0èÏÍòŠé[Ë#숝ç9,µæ9`©9ÑáêÃ0¦Z„ ˜æ(™Ý/IVcpUÓpU’“©²$MOÌûp8˜ŒŸ笐£fän¿wi$pðм1øK³Ù½^¤õÒ##^÷^›¹ÝH›³]ôšKÎ!þã‚-ü[4«¹º¬1à—_äókë.<Ggxß\bi  9Hq~|ŸXí_Ÿ§½éE$Ûÿñ]#[F›]¦l”… P}AŠ¸RDÐOcz#ƘÏ7ŸÏKó9×ö©“uJ²n²¨Ù‹ =ÇKÛX…æÎ÷vMìÏ®‰RÛ§³K`5±XëÁ³£Ԃ֫ÈeqÖ¤—m¼š`åv (fÕ$™Ã8K3&ð¯Z½îg0yË؊¥h}'Xxïü}xÒ¾4Š&†åÍtl®¼ºÓï¯h6~Õ»<1}5Ígۍ +(ÌY@G+šv‡ý~`ÓJþìdwh2,z&r<:›Pü›áÉãÁÙ°I,«(÷~(Nî|ß;-†wž ͹óÓòÀp D]64Îu<é·O­­Gá ¹‚Dðœ{ ²ÔÖyèòôÂüÜÔï×åi}ô6X"éŒÆ˦4 ÃðÈøPªÑzkUãøPª> 9TvÏô¤FëГãžTí¬³Á¤}Ú_Ám£ËÑÙp°”B»±Ñʽ¾j¶Æf¸ÁÚ])´ŒÛ'=&—Mú¸=(^v"ø‚V݅™¹†æ\¬ÀÖg]tÅЫ9Ÿi8>ïq¾XF-hULÀlàë¹Gnô™–3ÍtÕiðæ²]6P`÷ªšF³^8ôöU5}9×tACwd–ÝNKZ§ÓŠ¦ýÞ2nbZ€·¡SÖ{´^v—ql1^6ýØâtôøÞÄpÙQѺ7=ëÿóÿO/Wè3à +ñÄhj㇠6;›ºËVmäÌ~å¬8Að¡Î`àƒªÕel¶Rûè^IJÖ탡Ñ]O[Ÿ>z~Oä­¿Ý~|ô´Åx*õÿ’'‰„T¹¥úà…‘ +cÙ±J5@¡‹ì‡ÕÈJ×½x»LCZ'ç+5t+®Ví™UgFI1©ÁÙKí+Ùh ýt\ÜvѧP­Øߣ'cÕ>6 ©àœÖ{SôŸ#¨‚3òý[Û×#ªd EòlüÀ҈ûÔ!“îìSÞ0÷Tù]ÖhÔøeö±ok Ɏ:¯‹'Fûî]ö‹{3†••v“ÿïÿþ_ÿïÿµ|Kô¯úcsêvGg£,Y›®]7r_Óô?¼jA–`<ï®Îá³û÷¾7:A礱rx9±&òm÷›áIë©ý)¶RbU§È7‹œówö{D{Ggê~£Å_å¿=ýÍ_?ÿý_ýönçÇ/¾¿yº·ÿõèÑÅù—/ÿúÍÃýâöozöø×éw|þê˯¿{ô‡'òß¾<üÛoŸ|=švõÃüIv‹Iù«$ßÿûý—_$¿þúî´÷õ￸=þ¿c^óõÝÃQ«o&û/ÿøï‡_ÿ^G½¯þнßnÿöåÜ»Oÿl^¨ï?¼õ¥þË£Éý¿ÿ´/ÿ²÷Ž‹ááØÌûäüó?¤¿š>¼/ýÃþßû¿ýÁ¼æþYòÍI%¶_ëüLÿïýÛ½íï¿5n÷åO_ÿþÕß¾þrܾøüþ·¦o?:=3¯Az=üÏã§Óûg?ý ÷û_÷üòlÿ|rp®ÿÂJùÏßÜï²Ã|ýûûí‘éôøà?^þÇÐ|úÍ?î?>}ü¯û{Ùß}ïhïWۉ;§Sóšüï·?ï>調}p.ïþþÞ-ñ›Ï÷¿ýâ??ÿúà·ß=<(¦¿ûÃ÷ßüêün·ÛyŸzŸ?8;<·¯fɝŽõ~ýŸ_öþã›Óýþ­ûíÞèó¿Mïýæ0€Ï¾¾û͹0¯Iï~ÿÓ×÷Ýß^|þՓ»wôÅß¾êi}g|&Ù篾de÷þ7ãï åôo ýƒHN¿ìÜé˜IfO¾º½÷E±ß×Ï.ìþ|xëëƒÇ¿ÿÕ¾ÈTx¼ÿø¯é¯þ †ÿñùï¿?ýë—üäW?!Þ? n™!ý!ýݯ`ZþšþþûHõ‡ýWŸ¥{n~z˜°ŸþÿÚÞk;y½ÿÖâŒÁäÐäh2M6&Ù›d0¶ÉiϞ}±Ÿæ<ù:wÿ;’:©›ŽÀ·fæ7˜nª¤R©TQe¨åܓ¸‰ÔÛûˆ& ô +@CLK~ô‡=AÆéOñ÷|…z?ëȏ)hޞ·8¸K؉¼Ã›K.ži@ïÏñØìïeˆV“1€WÏ4à­L™Â'7å¹ ߚûÑw}&7BäÎ͏I°üûJ·söÜ·»²ÏO&fc&8í4"¯OÝNºžÍ¼æ¾[¿ûÔþ3ºh2þ^{D´œõó#ý-ãï¦ëdîï}”ýý ºcß맙ý¶y ãP¨9Ûríýº’®Wm2gU(ê0´¦¶dÓÎÕ°'ß&{jJ‰`x’ŠµOévùt¾œœ€¸%˜Åèô ¨ØAõ,Œ¡åû³§…wOæò#åC|ÇÉà›ÃžÙF†Âõâ_\f1(öIþψNp68©ÊÕBzTö ¾‰Ûw±1iù®¸ÒD¼Ý÷ZÃ85>E‚çfdNZL;kö'Ø\æíUÉñ+ؽ-6­ü 2j +쮵 LÎ`Í.~òÇPì«ÓL‡úÞwá:¼Wo<à…¼Ó1ˆ-Kd9¯dšt»6³a“ˆä2ÕÞRl¼èUì½B/ô 6OÞKx þÚ%ûœ^Iëë*Fæ}¯=QÃ2unj`^_ßd>e‚Îú’=.Oñ́°æÜã-ówš­3«ÍÛ6Ýþ錊°Ë;¶/^Òä ÒÍï3øÙ§)´WhÑiÍ}›‹A0Þí%óoÝ"#цÊgÛG¦Ï](ïǹ©ÿç=Ýyú:òß3¥›íÁ*ü·rƑtãΈ†{a[&♥e÷KÆ  &êûMÛ' 8[0Ñí!¦ç¼åyÿΝ<‚§¡-§Ð pÞºx!<¶ÇJÇo ¿¿ Œç¼¤[ãr–~ISñbÖ^¿yP5e<ýó(Ý:·ýÜSô2”ià›uêð5QK†oTG=ž¬g7¡Peb ÊËN’¨Xv$øg–!*žYš(÷ž#Ô'ê5ÙŸ&Ìø >€hЏÐ×åSò, K7ýˆúÓ3I1B4\„†ú|`¼Òÿxþ²è +Í_ŽyüˆÇ ɃoðF2HàO-Cˆg¦ ‡ƒše(4Üt™·(ËYîblÜÈ©É¡iÂ?­™ýÛ¾±ÆP˜~Ê ᢱ#z!¸ õ˧zœúey9Hã€pk°Î̚# Â_î›_ Ð$ƒÏÙ³Ëãïs+ƒ"Ëü5Ǹ„!M nJÓª^,i__e?DšԎNó ‚S£ R|¿r¯ µaל›ÍM,€@¡?ZË¢nŠ,k¯œ/4¯¾À A#Aƒ0; <àö 76Ä-,4šÒ|jz#uÄA̬ëϼ?à`) +3³aeB(ºG9)Àß·—°?ƒC¬Î-nßRhÄ^ÅIË£«Øwƃ­ÎscfI˜`ÙSõ6°6¢ ¤&ö2š ؼ,C‹R‰y94,!‘<àÄ.# +04ˆÒ ·‚ýà뚶tû­²!SæyØß^ü\Š¤7àT^TÉq­%õ6×1ŸFÌZá44@OÊ-Sï†Î"û;¥ò_˽‰:31Ý%pz•6£pÇþ.cFÙr §5I隯%ëw˜òì<z3["ٟs³Ÿ«Tö|J™Ñ<ÝÜäê©Öð0ÆØÚsÆŽL–è ±ŝcr˽@=u?ZÀ~Ûå¿mw&èð:1“Õ“™.rs[¾ˆ©ríò9 ¡µ¾p›.®±»֑¹ýƒtýàgέ»ÖüHÁ9ès´4EÚ-"¤@i5Š4[DPë„ó£ vžå=\r–Qxå:éuè<-iu¬[Π͙O*ߚ¡ÔÁû4kqÚ¿`Ð #ž1ãŠÐð¨d‚f€Á:Í4R[¦ñôyB*8Q.xB"¤ÂM Äý‰`ŕ+ý…&ÊÑôOoŠ¡ßVÕvºÞ©¶ÛT8)[†"i"´±û YÍÁ)·ØPçõ\aù4û¬‡n•/ðÉq*집ˆ=æáíJØFq3šn­RvðÛÅ ñ|5“uoª£ÐfrÛ6ôZúœÞþҐýùÐGÁ G#†>]`®JfY³ëçõÛÏÌ4 +í‘afé}ÖsÏX¶'¢³õŠ€KUæYèÁ ϸØí"‡Ÿ6™ßœÇÞ§È:L1—Ãè4áÐWµœi¼¦^½ÖÞú…ê¹÷”n¼´Þ ©Ï‹àñ\ª*¼ ܆æÌ6öy +ÙÊ +½õ„õ/¤µ÷zJWzž+¡Ÿ+/³Ülq0\hyÌ}›“D.[4P$unõ 删ά÷ç@t>6ÍiR_ݙ•«ép[N‰¾tŸùÑði@9SúÔ>3´°GØË}@O€‘<ƒù©»ÿË×lü ×}„W€«j»w˜4Ü«¡¸/?ÏëÓÐXbPö|[ó_vâ#í·D@¾‡)ý€Æï3¤âɎ)WZÿ2·®+Ý°½.ÒͶ,<>C™¥gv@Ú Üž”C0Ïî\iPµA ¤‰Þ²:Þ~¸m2¶È‘ÁÔË}’eVa£#W¶X-œÊC닧%Ü7¿ÇÈcìÛØúÁÕ&««ÍcÞn ~ãç\¯Ý(3L½O'u,óB€¿ýõô&Qڊ,©›b¼úök©}»=pßÔ£ùJ*–Ùáj9=¶¸%upFÎPB§Ò¡ÏÙKî;2vçûó“I@ÒÈßÁܺÀ°—ÞþÔm~ºãFß|pÃÃJ–06J<}b\Y¦óít(ÒDúä(÷Ý8V(‘A¶ˆŽµlúsAfS‹fÑøì)¥#îeZðýJÚö—zk—&dá2DU/ÒØýû%¼åO®xš½#¤<Â_oý# 7FZJ³wh€~@iÑÍÍãChHœíBé³Y¬áÀ!ö4¥ÂÚ7žŒXãÉe*žØðMÉhGàÓ̍Á ŽŽ~0ÑñçÓg¥E†Gˆ½‚Æ9$½mÈib‡Ô#YÝä¿€Ú鲊Иµj$X‡Þkz›þ¾ÿ }%Œ@¸„aJ±ˆÖì¾AºÝ6éUmY9îhx€'°Û›4áM’ ÀZc"ÿÕ;r©ânϼìØB]/H1T¡—Z¡°&R9ìÏå>gÕ PЫJ~fV¡”Yt 5#!ÛŠŽfÔù?°sÅ}µ¢•È¬V»±ÐÎçŸã(î¹þæ§D܌+Ù4È õ ½šÌa¬ÄƒHDº¹­žrŽú~Æ(PË3;rî¼AhLù¯Çà'ä´ÖJ óáfQpÀ„öÅf™Ó±ïµÉ ü¿ _Eh5 ¿ó.1¦¡íVш½çíu³Ðpè;G˜÷5°+F€štÉ¢~OÅW¤•bhVABkÉl@°—÷ٗ|dL0‰c?ÂÉJ4¥gKÃڃæ ôª» Ñ8­î2o‘£•;fp• +uùt¸p<Á½“´”oYOg}ŒÍ£¦5˜uӊ£Nì×´z™üš_ˆÎs:<Ý-°C‰ß~cRJà–ˆ}Ÿç¡ ÞÚrn쬧qNp€&Þ"ÉÔ"µB,pnϔÙ8ˆŒcD h%Ô½{’¯¥[ŽX›…m#`Ðü×ùq”;]¡ª08Ÿ6óŒ9›ß:ŸoáP2[Ìþ fÐ +{Lža®R‰?²ñláÏbäĔOÅ>;@ 5ìPð:ö_@è÷—àþÞ¥›«À;O$Oº©£µû˜«”}Ÿé–!³“®LrÁk?ԝ7à½ìsn>Æç_({[˜I¶='¿h¦de+¦ EË´#ms¼šìÏ©Ðc%9€‘|fC­Ù6^؇NÎh¢³ÙW;êØ^3+§§]èö»°6§ çÿ£^yNÏäøóü3CÌÈxrnmÿŚ§ Z Ã;ßÁÒw,6Óőu<CX>îÐk‡g@ÃÞq3ÿé{ºÝ µù @ +F–©¿*˜üúç愔¿ƒ3kGÓDüe‡9R½2æx;gûuŽJ&v”àŠ˜~:!® +¨Ï,­ú偎•ùJ×+EÏ]ô 1¼¼15ÁY1Ä&ïÛ¿œ;ÿT³Èö7?ì"÷?ΞÈûã`§>ø£…M•üNZO±mþ+h djVëohSjØ>lÊ"h] FšWûyg/¼Èøß}NŒ~‡ŽEº;ڂûÊ$ù ,h °¾â>BŠí96.ŸsŸ¿=b7ÚöÄ!óœAk)¾Fö'5sæJ«ì»@ ¼i©dÂé×¾cËÍ_  àbâš©ü´pb’‡ºõ‰â yºgJ?‚Ü/(§ˆ“ýŒ?-?ÿ9қ¤þ•[>½pS|äÊúo |4Œ•êÅf0ÚíLÁlæ$­;†£åF™X@åÏ +0|PN~6û!5|ªÊ† +DFö|ÍÐî{©}Ì%ŠZÇ´3F:ù1²x?€¡Cß5L·¾Npˆÿ7Á%òörèÆ=•åž¥ÕêŒ +7¶'ÞÿWk©§hÖ,ÌY|͑#öÎ<™X8 ø.3™Ilû𻆗àÉeî3ï¾Nó¯Ea¸mù"Þ»<¿WnÍù°ЫÌíTéƒlå oM¬‚Ä’ûŽ¿›ÙÃì–†SdÿnŽ§9XôÍb¾y˜Î×­º<ð°y燜%/ÍáAG”_šÛ.QB­ 6ÐþÏ|3 Z8@pœ?äqЎðœ}ú@Á9îþçÿ-I~78’Àgè;ˆ~ýPüw{>í°ýÊzýððëÿãzȸJ›*r£†Ý‚Pkõÿü¿°ËɆ‚ÿFµøŸÿouú]̙Q‚ÿÏæ_Kô5”óf:_N6膽“KžáÖè¿¿;…ú +fEÈÉñô>ŸÂËT,7µE~Ù +t¹wÙ¢{£@‚exÅV’[¯}˜ìvÜewâoú%èôtƒe®¿Ãށˆœì¨›ð~ÙÚñ*Tm»Ù~Án6óÜö?êúö‹pÑrm7…Hˆº%Þ)´9Ñ7ÂAøº]ýÊÖDòƒ{嗽GªòO(êÞñd…úþ¨³ÛÍ />•›'`t°@ôWØÜT"Ä~þ¢ºTŸùq“ª$üï‹|õ Ç^èJHì61‰_ÈÞ}”ÁR8Lþ‹]ˆ-œÜr " mÚ?çõt3ù]©9¨èËDÚØ}œ*¶nç8G”hãEµÞ€ÒœÀësüâJÙíÇ]âƒîðQC€B”ÝŪ ñƒOäE¥=-r—¢üüÑf@ӎº Z¯„“%xÓAzºek#EˉXÉî jÁ¶€çY-E N¶ÓÉ œ°sö@ð«¸âÌ/?Sþê_LTQPb8é˯"Qóf‰YzÎé÷û—­(“ºÊû«Äë7Å©vq¼)r´øJ]S)Hðr+t½‘øųü_ª»„Ö/K È}wÛ(*­š„°êõ(<ýäVL5ÁO ى +D‚\1œÊêîíU’ÑwÚi¥2GMwڊ--lK›/ L +×ØÂàŠG³¬*€ +‰&¨ ÜM6l;[xqãçÏö?Å_¼ô^â½ {JLÄàŽéØ~‹‚&~ªTw?XÚÈ<ÔýƒÈ%^}gOÆ!{òmê&ÜöšÓžü9ùà'¯?ވúØ özó%Û§Lî;RX Íç Œ³%ا^ûs3ø£·úŠÏz§Û Ó­õöÄ2®·¾ô#zÇÏ/x6þvéíçhKï¨usz'Qóîçžáè³Ö†ÿè=ÖÀèrK²>Nø2a_8Ø®û(ë¹i¸§Dq4‡•*‡Câyšvì^Ê©Jä˜ãï.rÛ÷¿å}"×'{mò9ýüå±¥CÏØ°g¶&@X JM˜š’ËWÀìÔË·ªÇÃ!vl,Žáö·¨‰pc;†Éӛw¸]šˆ™ÉƒP×9¸‡OâÀÃg{¢ 7¡©Sk“[ºÜÇpÁÞÇþÀŸ…øy/ÇÇúqø¬}4ıBÃ@´4t‰b_ S€˜Ãü­žÄ±Æõ–ÃÑótÇúêùð?z£6+L±b͎šSkàÇ21÷òâXýÖ{Ü»Ÿë#9„)V†ÎnU›.Af*) ¬Aƒqs°>K`í òû¥ÅaÕ¡ªUqA7yÊ£¶(ÖBÑۖ¤°·ŸhVÀ‘Ó<]a9éá㜨BÄÖË¥µô|ƒ•Ç +°ú· U%24ÖW³Y€5XvVŒ¡)Ä£ÃçϦ-55 †H£Gë09nJa…ùœFŸ%ö!>ݸþóhø™7ű6²ÖÄÞ¸®ŠaµÇVч® Ÿ¡lÉ~ª.ŽÕßëd„xÅúH.BÆæÚ[ÊbŸŸ¤Ätƒ†§å¦–•Â:! +Žñ›8Ö‘6Ï-¡ +Љ|28’4֞Ó" ròÅÿLS8ÿ±$yXûq¢rz V›+@s|,ηÁæÄéˆC;!Wý‰Ö !´œ‘C)¬9¢fûŒ ¬ˆÓÓ-í£©¿ÃKSk+föIb­Ì[>B +:ü'ÑYŦ{|¬ç/ƒ¾Õ"ŠõͼYHbmý4ÆS„ ¹œî @¼Uvqq¬UßS‡LşűîʏbX¡„†ˆßF…Ç“‘uâ=Yɉc­%ò£aãóSëg}YBXÑys9Ý¿^`FJ`ýŸÇ•SëËßn]„}¬ B<*97’D><µìz ¬½‘ÿ]—E±†_œúÔ§•÷ÌLѽpóœG¡uê³ +6µ_ØV¯9a)òçZ%ƶhbupX!ˆÀýÛ3gÀóAˆõ¸5=ÓXOI»`®úÉÀJaÍô<%¾PtŽ„¢ˆ]—ªäDÓX³§ ¹X| RX“žŠS ;ÿ uòøŒÑlaEhhÄÆÃa2Ý@¬„ëᐞo6.ëX¿(}ò$£ —€ÂÛù¸Mi6ࠝOFAþ°ŠÓp•|ÚkxÖoROˆâøéÌ=½<€ Ι$~ÖÁdÏ2û›‡OƒaϨM?=.×Û3¸ùy슽@IÈ×RôCòiØkkŽ¥ŸþL†fŽh—/¤½¦þ—äÓª}“ôJ?Ö¿cÜS!т†úã×´(ñópÑTŒwŽÔÓoó>"ømÇþ˨­ßžÇè%Ñ:Órk#ö%ñröåAòéûÓÔ­—~ú‘‹>³Dyaü4 %Ÿþ^wEɧË7o¦Á=½$ÚzI&†R?cjÄ’OË^¢+C´§¯Í´U•ú¹Io*}Ø$ŸæÓµé\òiٛ|ôÈ-­÷­Q‰§"‘¶1³ŽZb‚§öv㘤Ÿf]ñ‹íYl ¶4÷‚ÿèw4ù6Z–˜™YZŸVðéŽ6YÉQ€’B™íñ…úėiޓZ¡Y½³é+ô¯ ÿqÁïH½#×ÌÂޑ‰ÇÚw”´ NšF +½æçW'-݁Ä×ÓŸü²¼F{šBØÎp×Â30v»g gMáwœEhpÿ>O­@P=æç±Ëɓ½˜ûÄ!F¦Ö ÚAq¬þ^_+8Sþ¶:ûr¢)à—“Œ + ºó +¾1A]÷lcDiõ´pÆæðjâӐuсåÀÓú²å»ÀŒÖ2R Óèl\sxÍIó» ˆˆêPt~ž3%ÂÃèáSF¿È Ízɵa'‰þ‘\Ff [Êkh`ghc8Ml’P¯íÈÐKýn—Ò†‡JzÉ@óØ2¤$(Ý?j؞¡WÌ©‰¿8æâÒ>öÚ©/Jz òô†¾™úÞL?R–'="š½øRÈz)…†y¾òIJ!$ÓdW$ÿQ:à4dÍ£¡‰’Bâäæ‘fCYbDŽ¼ƒú‡&Ÿg#N¾žS/)Ä%·'rà‰N®÷¨}r¼c Íϗ|kהÈ]¨˜èP„èHrvÁ¼xÇ6¯ù«ËD³À…LÍ4o[MS6€ƒ€Å×ÅèËîGœÝÇV]7'±TŽgb4Ñ èÁ•´!¤ý™aœ¡‘HšG-41Pˆôx˜Èv¹'¤Ú (¿ûàé9yìžeÔàqt<øÏÀŽ…8.xˆIK¾"¶¤høªÂÀªrìK3dEâ%ƒÔ옰Q³9Dǖ(LRÓLóSÇ}¡]. fÖì—Ë2+(igj¥Ð2 ýВ'• +m’{è8ƒ“ä1  ‹\€d)jWªD¥À¬À—Ú"ôªm¹³XfL§dYúô¬7é©ÑõÀ˜¤=fù¨ÓSÅ2FŒòچ¢EÀ[Æ͓¬¶¡a ¯kÍÐ7@kmT nOUÐøŒÖ±ÁbZOÞÈÑ2M\Û»h£Ã=‰Æ—n¶ølơÅu{J¯Ôœùñ0¢¢˜Á(¥ëŠžÙÞL÷G¯$Ó0í[|{ž’÷۞™îި͜¦"»«Y„—*Gd°k'PïѤÖ6á´N!Gö¤Vô7ˆkŒExß7ÊK•8Ê[‚‘0 }9y j$B­ó:²(l$´%m—8³Eèóh0Ý©Ø&?‰Ëò~§.Ì>• ïç5`pQ/§ÙˆJ‰R’×E¨}£zX†+E@t½÷yz’?©ÕŠ‚' +Tû¤ghVAuÚ«®Hxž¡ìùªù˜wð¯Cƒï÷`­Üɓÿ<8Á϶µŒ$Lw°~|j¹” zÉÑKýf—4‹(3 +ÐKãfçыÝìè>cdéæïô2š ³‹çʾ(À¼*)rN‡²Ð‘+Žœ#WèLY—ùú½„é¬ìÈ“Ã6Ú=*e˜éPSëáÌ(á`ÊgþI}…#0Ãދ¦D%À\,™úõœ²N"ZO“òë­Ë0NÜ»ÉI £Â;( +¾H  :†Æ„(Ï%±ã©Ù©³PÍÌ íd$´ +MRº"T³µÖÓЈžäG¤ÖáKvBf[à֚¦£±"В¯Ü7цU~rÊì^áNC½«B©)Q!<)ŽÄ?¯ÉÎS@¨§]I›‘‚Ÿñ@±{TJÍœ|Jç®æÒ³Á?ï2ãI!p^à;5!¹ûp†Î‚¹´yË/gÝm‰‚ðªêP&€&å¥sÑ҆‡”—BÓ° Å *°yš›ChåäÏ@.R¨ˆolja§Ýº)(¬ÅÉAa%´@ÚBÎ/ hÔv¬ò£ŒfJåpXøÊheÄÞ%<‘Ei®lüFn?ª8~ 4¯K{¤PB³€I£6UÔÄÓ螬 ¥Ûqi½nÇ¥0 ¨Bº‰;S²€6©ý­Ò­ÃI7ÖÄÕ¢ß ¡)K7Î/ ƒ‚Ю—nÜö,¼mï ÝÀʉI7íRÒ.Ý.½ Û¥„r‡(.$Nrd,lȍi6‚¯·hÿ«N›ÇۍÂî»Zçîå<ß5iÿ +ž[ívíÿc/v8j>ÖàÊi÷€‰kÐ-Ú?…=o8Ö í_ +gâJR{>ÊŽ”°ùØß|>òǑ0äL¡_ß%Õ Š"Ñ,/æôä¥fq©’úÁè ³,85jBxÝî-NnaŒ@»uŸcÙä +ÙÝ2DS¥ 3«‰ÐH™L`A]ªv¼L6 Hú†«ƒ×dì Æ$ÉT֐â>žTY—óâ˜ÊºÜêlO'•7ӝIfJ§ÆIùÀؼꨩb“MwLíÐ$c?œkHm?€æ3Æ*Õ»8SÑBÚô‰DG¸š#—:Ï-MbÛ÷d3})¶ÐýÃøþU K%[\l2搦61wÀ%µ¨áA¯ªÛ;.ôÎMc¤w¼ ózgÚ7„|y±Z>uÑÌíå|ø±vY˧-]]Î'_ËGIè;”óIbEµ|:ÉÒEå|òµ|:¼tñ–r>ùZ>¾:xC9Ÿ|-ŸŽWºxC9Ÿ|-ŸN¦tQS9Ÿ|-Ÿ•.Þ¡œOþ=]õ}s9ßÅæÕòq†Çå|òµ|”ž¦\ÎÇK€–©t{5“bš¸Læ½t1’ ‰FŘÄÄ9å\q›º¢-RhI_x›*Æ"NÕâAŽ¯h[>Sï^±Süšš,cj{JÇSŸtª¦¦¢WªÂ«©¬Töz‰Æ9=íÒצäk\†w +ømG4A÷š WAR“,FÃ(a=š¢:¦º¦ð¬˜y¯¡¦pªXcàù¸¤k䤋päÕl‘Ì{óóAjX)±šQé5TμW–0+𽞢k¨S[S>(ÕäÈq„ %B»[Íꁋ›HÆh¦ÌøˆÆwËÞJ4ÅÂUõÓä¤ÛuDãû‹½™nÏÉO¢* +Òùu"eêÔÜ Wñ¥Æîù¦„¯S¾tOCÀòQpH‹À{‡øÏXvŸU؃œQ¨`.ŠªíA)™WÀPºÇ¬µŽ½þC]ÕÞU«4"Tœ7Œ¢#¾=`±²7B÷¬/–ÇIØyÜ/W­'È”¡ˆœ>¦$? ³6ê4Ìèñ¢„À’;© :X‘b迒6_ˆ-E+P +µzHº,ë$zÀ_£§•Ôî}nãKëi%m¾ 銿‹ä¤«Iõ£à’ ÷EhôÞðÆijoà°¼Z<%2câïjǚ ©üjǤ¯\ž'7¦‹[F\¿1UuïMyonMƒZ²Q…÷†‰*£.Ó-ÞÜ/P¾Ý{XäRF4ÔÃ]ã½Ñ]”.Þõpï@¹U_+è×住”U©«‚Õ‚`ã©`hu)‚°I ÁW¤+œ"-“«®F‘ö%;vƒ +ŽÐÉWHî*÷ɍ@km˜ïã“‹Z”2ˆÕÔÃ]™5Ï;o`%›´/JCÛE2„N´tQ©ÄOs‚®H2,*ñS™([⇳ +Ti'Ùûµ°mŒk²é€¯—÷«ÂïTž|Ìl$“žîS™‡ÐÜ#mO¾2O&Š{ÏÊ<Ñ´ë×õ½+ón©ñÐP™'› {¿Ê<äî¾q+ª¨Ìã+ÊIˆ7TæñS­˜™ï]™§Þ¥JçÝ»2 H*f×Wæñƒ^*R:¯«Ì»°Ö¤âB°¦î…ÿðÈ»[ê%ÅO½”Ô:Õ¤^¾mU¥^*JãÒw«jE9ê.•9Y@% 5U,’Ph= ºCAÙEn„\æ½²tƒu~Ò´ËüjÖÍG"ÅÚ¼·]¤X›÷ +‹!،Ү¡îÛ-û‘«ÂÝ·îGMöQ™&¹{;µûQNU‡4×fSŠ²Û®:F€´m#qºK]fέòXS$}ß±ÔU`R‰Ý—÷+^çÆ÷f ¢¸c«ãÒå«àäo¤R4»YŸÍ·çñÚ´lÖR·&_㇆ÐF*ÊZÕÉN§j| +e‡÷)’ýØß©HºK‘,¬[»½HB¹K‘,¤î¢kÝ,š;ˆ6ŠôU°šó—¬N†øû±{ó~åIÈ´{åQu²¹B÷(Ê_›»åÝàëäMÞÄ×b{ÞP”‡ûÓ¨º¼¥(OÌýð/åIøÓTZp=9 +:ü~h¹ê«É´X5·ß ô´¬KÁnR›GAÔ9!U8ž!4éûù´j6W(kLè°RùžÊÜÍÃ@°‹åªka‰ß‡ä>³‚u©ŠÜN†­ôbéu@-@õŸÂêm2Êfç<1¦†d;ñšO¹Ofxíd¨‡Ú­çúùC*] ¶Ëٌë+›Í¸+°íBkǜOO+þ iÿ¿"L¬ú ™Qt¡Ô@º.܈¾âLÆ/»‹}Õk¸ÓÃø±=Åõ[T±Ÿ¿×•+»›¹%±d;#[ì÷Tÿ­M¤°Že°œ «°",j?ân;aٝ¿ûSe›6 +JÑ-rew—«Žß§0¶–*ö  ûàùCªìn Wý¶V(ö۶ےXMÕùÏL +ë\¡Oa£+5ÿ2(HRظñÅFRX¡r{±´`ëÒGŸhvª|/&öí~à½êÿ¨ªé·¾Rïчi5(¢¢¾°fT‚<¯„g¬œÏYE~/_¹µoèÙð¢L¯¦í}Š‹T$à +,Ò=½ö*ƄÇÖd†¥”«”ñ5…}Wúl´ö‰Y ŒÛ}jï³¹±°Őx±on/ì«êÓ][ˆ)]Ø'æƗHð¿¥°Gzór‘»ö‰Ò)\frEaßµ‡´ÆÂ>±8wzÞ­°O¬ªç¸OaŸXUŸÚ¬! …}b^zÆĽcaŸØ +Sâ»ö‰©<¼,Õûö‰Uõé$®Ö¿¡°ïrL?êÚÂ>1µí¾…}bk(–jucaŸ”ræ« +û$µÎûöi Ú-…}Pö;ö]G4ͅ}ò•^w+쓨ú¾waŸˆæ΅}bÁaæý +ûÄ…ÀĽGaŸR`åN…}*Λ{ö‰‘SÕïUاXPvŸÂ>±ª>ñ”‘â]lD'g#bDû+i»sJº§ÙeO¥ºúj¯°íyô÷o¥TŽºø]Œé„ÂD÷îâ'£r¨#ÕÉnÖD*ŽNü„KX$ª¨m¨ä^i„N¢[jX‚1© +l4JfXüØÖUcBDÃÒÔ§ZnLâ¹ÒÂF†T2}ª%ä':Öø&SÒS> +L&Ÿ1²Sè/ïÊc5Ùþ77ÿÓawt©Ôׯiþ')lxýÿ®{í›Nª L]MŸªœ …|h®ÿßmëUèítjÚìÈ:µT5ÿSvBBÚÜÜüÑläûÿÝÜüOGUá)ôÿS~ÚUîqG—/ÙñÈ/¤†ÊÝҟvNKçQ=¹g«Z.•Á¶}ŠŽJ\ + ú ‰-ï¼WUÓ§&ƒ¢Qªw”Î Q]ìÑÈ$7jHRƒ’t +Z]¿1€Ú`–4Á«`%g­»ÕJ*`Tx]_Y_ÆOµ¬¥ƒ®:Õ +€RÎOSj ©L"—ϤF‚ð>…˜·GR`¯E™[ÏP HU\1(xâXë[A¹(³×‰0+WÚ#hªª}%;_«}[›ËjßÖæŽ×BhwéûLq¯Á†f’Ôl‹QS|mpcS.kÛv†E—)Ûò»TÖöü¸¼Oa {³³võâTõ¬JëTSB +¼JG›ÕKŽ¦æޒ!<؋îfƒ‚"›>ªÐ=®1 ÝÚᛂÂlFîôÔԌHP=«XB¡-Xlµ‹ìÇ7%êœ÷7÷ýÓ1õžR­ÿ®Ø"ùÊ2í.}ÿ¤UuºõߍìF÷ýSQ|q¾*òlîÑ÷OÇ6¼}?ÊôýÓñk£ÔT§\Ó÷O'׶þÓÞ÷Oõõí°ëöjߏ=§üHš¸ª«}4eå‡5£”ª}?öWVû^bnõ6Ábǚh6/¥ÐBôÂˁݥÀ´F¨´ÖI×ç + +©XJº– +vÔR}/VHÅ ¯BYá¸ØQ‹Âb¨pƒé˜^x*k©ÔR™Ÿ‡Bk?ÖÔÔRñ§©àpå@qk#YKµ¨*Ÿ—µî¹íµ¨Ùžj +©ÌÏ¡b~µíÙÕTH%™œûJʾÚ4Æ®Ž®,¾¡ @c¹÷±Û£ÐÜ¥î6뒾 Ù7Zûôij†‰¨)£§õîw«V +áÝ©î¶'y«ÖšÍô¨©¦RA÷•u·ØFeS;t*ʱ•ënÁ˜Ô—cËÕÝÒî"¸Ր8BF'„µwÅçvnéÉfÜå÷œa^†ÞÁ\ÒÞj?oÇö øTxE¥†d÷ƒœy͉Çu!0æs¦?ñê_’M+¯2 9Þz¯¸g‹ßš.šô$*ó¬Òõ€‡ó8êHhAI a“*D Œ¡¦õSªðC+œÍ#¹óIN—(úI¬æÒÔµjMgå°ê؂2ŽÈ¯/†•_#w4‡L\‡EŸ èÒjIVbXHda'>^IàDXˆˆS¸•À4<ù_rcÌs+,ÎÉ`-ƒÒX C_ «õ y¥žB¬M¹‹•7i¬ù|‡ä'ŽÄFø‚ƒýDW…žmÏn> H¼çË’ïéðzObl‹¦U€´G·§qKrù͆7¬––7¹@áEš7”Ç)d‚RtÒý£Ž«3­3äÜÝ°Ps J‰1]ä€]ìՄהÐÈ KÚ¿¬mLPtJ§Ñ#ºÈÈ®üGÂƏ„çE:Æ\già%×{+yn‡ù{ÝDÙsê…ÂæúŠ(Y·´ê0Ñ0Ë»:®BòâÞ»«ÊîÄãßxŠ¢ª’Äë<Òü,UT’xëíºb÷Ýé$ë֔¬šËûîd $ ?E$X;!5µx6äÝ,é y!l®¡SµRš +z)7õãM#PöñéPŸBIŒ‘‘° ´+);˜WW:ƨ­ í²Ç êä«©tš*½"š®bÀÆ$¬¿™ä|Ίª:oLX…úÆö¯ÆºÄ¥QEm©¿£K¦.Q©´ÂbüYA¹TH5GÚ@ëDÛìh€¦ÔHÈ|Qò+MpÊÜH4Åj"õÓäG@o%šbK!mD«ú?$ ]T1‹© Ñ®,IT[¨T£\¨¦ªQ.%^EI¢ÚzD?´–’Dµõˆ\2ìU%‰jë)w÷Õ%‰<~‘±B/rnµ•$ª­GDD»¾$‘#©¼Ññ+½´–$ª­Gä,é«J%ÆtQÈ‹{R#ºœ×íÍ +uê›ÔÝÒ¬ŸÍ¿Ø¬ðÒýð¯4+Ô)5©»O³BºbE^m¹½Y¡îŸ'}ñîÍ +/ÝvÿJ³BÑÅû7+Ô©êïyK³Bžû+(9,šJJËÒÝå c44<”wI(gÛ©lx¨îV«›b“»Ç­VR 5æ@]ÛðP¾Û¡˜òª†‡ò.$ ƒ]{ÃCq”¿Õꊆ‡*ú åÓM8G׍  Êîä–ívȜ777<”ŸœÐËquÃCÞH.ºò|·4<”Ÿ’h2ì5 E‹#e¯oWOÕÕ»Œ?í憇ò÷–qöʞ|YêX»CÃCyo²NÓåY2 åíañ´ë+ŠUmr[ðzN4<”‡"ç~ÐÔðP +ŠÜ£á¡|<†s?ÜØðP¾˜W',’½¶á¡ˆŠu;Ä­5(5®nx(؏¿Û!®Ü^QC° •kqïÒðP¾Û!ÇÐ76<”OñƔÛÛredbÉ9S´•\\4<”§!¥ÜÞ¡á¡Ìž;.}*CßÊ å¡° +Ô­ Õ÷)¼©á! Eti.%¹hx(Sr¡œÚ;×ÚðP^͇³¹KÃC©cýM$ y]™ +]Ÿ H*íG¥†‡ò±kAZÂõ ù”×¨ê¢ å¡ày675<”‚¢¶ý®Ê†‡7^1q™¢­EáE‘ìm yñ‹n‡T`å Ùz-ÙÞ«77<”W~¤8MsÃCùn‡º›¯›¢ÞêTÙðPM-îÊw;ÔiîSxUi°Pt^6<¼¾Tëvˆ£¹©áᥠïvÈJèk÷#ÓðP>{Lx¬]ÝðP>‰J聺ºá¡ÈÚ`Ý%‰¦µáá ¾N>Ñ´^Iٞ74<䄘X·ÃëS eÙo~r[ÃCy‘6qoox(_¤ËÒ77<äOSØíðROS} ¿á¡´jDk6 +·p©lx¨N³¹¹á!¾š— ñŠ•+ʟÒIäʟ´.à9.úrº[½#žF"¼뇺Rxz‚¯¥=Âòùþ‚"JK±œÆ…Ï;¼JŸreѸ,¼3ÓµåhC¸ëó KÒžµZ…e>‡ƒ÷ø£ÇLYo¼ ww¢Þ‚U]zc-Qr–Þý5Øù}‡Ÿ2™X}F›Å¹¶š3û Q\¼¤ ûs&¨ÿ˜Ì|àÓ8õNJ¦Z}ß ì—=ØÇ#pù¿Â5²ëª¸ú@µàgšËNrÖªßÚó—ÀþÍ2ÿ6¾§­þÜßc»YYFWñîvž´lö£ÐþéÚ_ôï/I³Ñg)Ÿ¾¥’õücø·ó(#Pµi¢Ón½é]öaJï]ìßìqŸ9E™J† ¿¿ÊD!hjãˆåp ¿—Ž†apz L¯lågÛþìv¾»|ÕÈ#S€÷ç>?¶°_Ä@©ƒ"â„WòëWG‘ôWcÍn¶A&l·y{žléTµ,F/D0ᓠ­Ï¨—œ.*°´LÌóWÃ[¿0nnÒäõ/ΆÕL?ƒµ­e¦\Uvìü/0!®¶A’ú4Ùn?ÆùŒò ¼nù +ýN°Àä^³Xýç¥Å&Dœ%Á§,ÌÌõÉyµÍ~– Åüa¡ +à̸öžÍä½í\.iW¸÷Ȉ¡µ€Þö \ª¿¨Åc_†`aeo˜ŠUõ4¯ôz‹:]yÙóoÝ"üæüºrÁRbeþ'½2­÷ÉóF'J.».3óÉcA>g@“Ðü²¡Zd {J;ð糃638ÖðMÖÅü’t“yo- à {Îñt&-ÅRÉã0ÿ¬ó_Ë}„p'BV4T8ºO-ë‰e'nxðlÇLŒÙg€†y–urϼ™~'É<(±+8B§±ôÃÐæÅ +„Çvé)T'ìwvîeŠ( ]_ì3'¨°‹ð;7­6^Xé´öƒÕ ¬²´û’=Ž¯);Är׀ïH¤“ Øèó 㠆"1 …^´È÷ZwC@@Í=@¯ú‘ÏYŸÀŸŸ»ÖZúÀoÛv{Â7À§v€Áµ&ܽ*G˜1†f (ì;sîIÜ]lÌ2ž÷ÿ *PááÐÀµ^Fõeår q“ƒÐ\ ’©pG ­åp#.)ó¼+͞õ´Ôîu=h]©Ù´½ÜŠx­«‘æ¥ÞÄÏÎ~М"4[LëNÄó4O;nšç§]Â3­–¬àÓÀC3ítèE¶gÉ –l:ñ1Ÿf~ƒ^ßet"ÅüÙuÓ?_æÓÐÃg +½j‚Îræ÷çÔ;ÔûFäÈ:¨xǵý=›å:ˆö¹/ö…có¡õ;û$ë™UØÆÌH¶)5%î*–‚ùÓÀïºØ}Ñ,sž‚'eŸ&æÓÌ˽ôð&˜áéÏ1œÀ鍴Y±Ð›óF<Èqí)—6ã3Ž!¢\°Àz}iÔ% +2•Öë«Q<Âγ›álÐYlû$ÏzÇÏ_WïxæõŽZ·¨w†#½y×ނOΊޙöÍõö•¿ªwºÍoðX¯êm{Ã;Ö¡(”p›àjZ˜]]Û°1 1Ø &‹»[6ZtšÃŒ2'ܨ‚áK¾ç'h ¡ƒJÒ¢I¨"B/ZÑFá‚./oÎ9°3¢“•N¤"!ù 5±.-¡ +âTÜ2 ”f§AãåòÐoYð.äë´X¢Œ˜Œ¢‰X<ùa4Î|—BÂÉB/7¤D`ZWŅ‹î]–È•ã[¼Rçø{H0 6(N+<Û<`e”l…+ˆØ +V'%S)¼‹ºiqz+fÇËôÐuvšpN¦¢sסåÙ(΢FÂ& ôÁ¥ÔˆÓZù1{Úä‡ç/®Þ VáñÊ;«|½ÙöÔÏé¤è;غÆ? œ§¯ð68 H…ÏW›úÞ2¦i£ïôÏ=˜}Ñ Œïé\šcûæÓMùäLގŸ¦Ø @ÊM~™~úè÷ÞÖiápêÙö'™[=~¥›ís~êL½#ª漃§]’A”ü"Gy¿¢&§"$Úu~EMNEaª•z¿¢&§"Ú7Wù59Qüæ*¿"@sü¿ Ý?¡ˆ/ð€þq7Ï«ù¡~ø]ünºbºÜé’ÇÓÙ̶äa>oÏÿ÷)·ý:¯ç›ÓCôÁneK¥p 7ÿÚÎæ:øbe¢“ž í€ÄÃã<Ï$bÄLî;RX ÍçIî›è%0¿%¥ÃìÚ{è‡~x®>é£Ù@ïð’-½¥xtÀ?{”¿†Š–‹hQÜÅfÈÍ™sÞ^«¾ ö òÓDÆ팿åß3ófÊ}\ÄÝÅtÆ&ßZ)÷‰Ø"—åe#`®v‘ˆ;PN&½5þâg=ô0)So̅Ýz‡5•‚_—õöÆ㠜á |„nýå隆ù“}…¨S¨µiíþe¥å³½AIià‚U"¢\8?ȅQLU0Æiæ`—ÁX2Ø`˜ª€¡.dxÄjˆc/”\PNE±ûaGÚØjg´ÕПj#¢\8”Jüû—"¢\øFáÿµˆ(ñ„ü+Q. +CIÿZD” ‡b±ÑûGD¹p(œÍ¿å¡ø¾¹{D” ‡Âƒü_‹ˆráP(:ñˆè{Wo}é[h!zŽ¾B Ì/k²­·þ®zç¦ñkF® „^´ç%öÀæI#GÕ÷‹RhZ;ú­ÉÞÉ$“ø-\2 «‡˜áu?{(:í´è„: &:{[•DbNé?ÑÒ#љu9ëý<ÇKîßîÉEi¿Ž¨å„™–/‹Õûè¥"`ø Єœœ¥eÚ'½Rå¸K©1ŸÇé2³zܐÇ04gM8‚U3fk 2H ¥´QÄ0¥?{ + <³u¨¥8è`è‰öBiò@ÓI¹ib”$Åäw¡ãE‹þ±cUE\Â,— d;w Sv·°6„Õ¸}g©¬·ü0ÀÆB‡ eæ;ñäW¸rÃ^¸5hÐ?eŒ9™xmƍðÝ‚%ꨒí -Ç#]Ýý›èä‘ÆÙ-ØùîmÏ|×;¸ë;gÝ Æã¥hѱ3Ú}¤>»ˆ!"qFÅŸ½T‹‹4‚ðçÐRë¸öĩȵ§:–êÙ±tâD@n)š}œ`8‚;–ᝊXªt •õ³ÊÆäjN–4V:¡-‹ +"<Ÿn ('£¯'T^@YX§ÊoˆÌSõ™d•Lyµ¹S7:“õjÍuËDPÙ³µ(¢ižH'êÖÚٞŽÈÉv kC‡¢]€!šZb@ߣSi"“ø À7Xy¼dŋND%5a¢¦8>Š;Ûà± ¾=öj!³·Ò¯’»H»šÝ'#ó­œÔËmœVõ»8Ҝ& c˜"næ4óå6N#6V)NS £jw(r ÍBÀiÐ떁ît·ÈijaªÊûV“þ 5AՂP|C—85á ¨ Ū§âޗís»mE Â+OM꼑›HÑIjÛ#ƒV=HU¿a“M¯Â  ·?¤‹þ“«Ç`L‡O· ӅÝÎÒ²ãÄÎ#ÍZ‚A0R@8Ž/cÈy[|9Ÿ]5qÑ©p4á0‚YÑÍ.9Ñù•,%ñ?‹õþg£“F¶ª—@º&×» 6ìÔùsIû¨›;O +Õìg™*ž¡|㧂.8@~KºÈCE…‡Ž¾ƒà–"p6¼"ÖçZ±â"'6|X±ãªv¶ê¢‚W]ðŒm·Í.»`ŸyðRÌzi_ðÀ+¶làõ¼È¡l.(ӀH¢B_P°À ð⡍ódþÙÀƒ‰Û ÍyÀøQÚrqÔ¶T¤ð2來›‡&K´ºAÃl„àú0Gfqt bÎ^«Óy´íÄë’©˜ŠP›ÀÄDÓ.ZM±Î¯µHÆ5Gçxݘ.A6ªÏ\`#pz5Î Ÿýð"Ý:óýÙ+¬ªi{86ö~ž‡)ÚÕÑúX_§ŸïëÌ%C,˼;éh# EÒ»›Ùïøô±ïÆqõŽâ0nñîc?ù)ùØ:þìSfŠˆ~¡Õï³e?}‚ýäÁ£ŸÞ!\ìû𹥑ñbþ˜Ùôƒ¬ƒX9ìŒÇœ¹„1çO,¨æ3Y됮ŸàŸÞ»…ŽzÐ𓵶ðÃïü"Qð9~ëesö°•$óµ7&ÖyZˆù4„\êbÝ}ÚyRëM¼Ò•ˆdšo╮DÝ?Ú¼‰WºQê‚o╮Dä~PéMÜÂPh zGKÏ(¿™áÁNðõøª5?wè•À(3_ünª“ÿÎÁqãy þC€ÿÀÿ÷`@þ—xÀ/«SÝ?–Ò×vc}¨ÂZ›‘;}8å~¿N¿ÛÍäð߇(ú®[«vJ¹‡èýjìÁCŒÀ»à{+ +°ŽàGºˆ‡4ü§ûˆ=½ƒŸëàWØï øü„+ƒ~4$ÂExCþŸËç øÁ¨\¯'Œ‡×ø°ZÑ:vÿ7¸Î$èqÂa?œ¶7§êó¸‚!"§ƒ¾ §†ÞÆ?³¿T9ïÖz²Ziž¹Ççc—[fQ„ß‹þø]_ÐÃ~á rðoÆ델¼ÜŸÖ¬:ÿ>^'§5C®fèmvÚDNxú<½Nóöaò»‚»jqœü¯ùÃd³Ùž&§ù> endobj 6 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 50 0 obj <> endobj xref +0 51 +0000000004 65535 f +0000000016 00000 n +0000000176 00000 n +0000047815 00000 n +0000000000 00000 f +0000000000 00000 f +0000177312 00000 n +0000177245 00000 n +0000000000 00000 f +0000047866 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000177519 00000 n +0000177550 00000 n +0000177403 00000 n +0000177434 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000049541 00000 n +0000177635 00000 n +0000048221 00000 n +0000050025 00000 n +0000049838 00000 n +0000049725 00000 n +0000048473 00000 n +0000048979 00000 n +0000049027 00000 n +0000049609 00000 n +0000049640 00000 n +0000050099 00000 n +0000050295 00000 n +0000051501 00000 n +0000072603 00000 n +0000138192 00000 n +0000177660 00000 n +trailer +<<3B853B03CD4D8C4B8BE2F2BA0FBB0695>]>> +startxref +177846 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.svg new file mode 100644 index 00000000..37653cb4 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_blue.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai new file mode 100644 index 00000000..f036f2c6 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.ai @@ -0,0 +1,1420 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_orange-blue + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T17:16:24+02:00 + 2019-06-22T17:16:24+02:00 + 2019-06-22T17:16:24+02:00 + + + + 220 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7N+WH5gfpWFdG1ST/clC v+jzMd50HY/5aj7xv45oOx+1PFHhzPrHI9/7XqfaDsXwT42MfuzzH80/qP2PQ837yzsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLLSrCa/vZBFbQLydu58AB3 J6AZVmzRxQM5GgG/T6eeaYhAXIvFv+Vsa5/in9K1P6O/uv0bX4PRr/yc78vHb7O2cd/LeXx/E/g/ m+X6/P8AQ+gf6G8P5bwv8pz4ut/q8v07sIgmmgmjnhcxzRMHjkU0ZWU1BBHcHNNGRibHMPQzgJAg iwXvf5eeeofMdj9XuWCavbKPXTYeovT1UH/Eh2P0Z3PZXaQ1Eal/eDn5+b5p232OdLPij/dS5eXk f0MvzbOidirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i4gtoJLieRY oYlLySMaKqjcknIzkIgk7AMoQlOQjEWS8C/MDzzceZL/ANKEtHpNu3+jQ9ObdPVcfzHt4D6c4XtT tI6idD+7HL9b6b2L2RHSQs75Zcz3eQ/G/wAmJ5qnduxVE6bqV7pl9DfWUpiuYG5RuPxB8QRsRluH NLHISiaIadRghmgYTFxL6F8meb7LzLpYuIqR3kVFvLau6PTqO/Bv2Tne9n66OohY+ocx+Oj5d2r2 ZPSZOE7xP0nv/b3p/me6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVxIAJJ oBuScVeJfmb+YDaxO2kabJTSoW/fSKf791PiOqL28Tv4ZxnbHaninw4H0D7f2PofYHYvgR8XIP3h 5f0R+v8As73n+aF6d2KuxV2Kpn5d8w6hoOqRahZNR02kiJPCRD1RqdjmTpNVPBMTj/a4eu0UNTjO Of8AYe99EeXfMGn69pcWoWLVR9pIzTlG46ow8Rnf6XVQzwE4/wBj5ZrtFk02Q458/vHeEyzJcR2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvKPzU/MAky+X9KloN01G4Q9fGFSP+H+ 7xzlu2u1OeLGf6x/R+v5PbezvYvLPlH9Uf779Xz7nlOcu9o7FXYq7FXYq7FWQeTPN955a1QXEdZL OWi3ltXZ08R25L2P0Zn9n6+WnnY+k8x+Orq+1ezIavHwnaQ+k937H0Jpuo2WpWMN9ZSia2nXlG4+ 4g+BB2IzvsOWOSIlE2C+X58E8UzCYqQROWNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVeffmf5/wD0TA2j6ZLTU5l/fyr1gRh28HYHbwG/hmg7Y7T8IeHA+s8/L9r1Hs/2L458XIP3Y5D+ cf1D7fm8TJJNTuT1Occ+hOwK7FXYq7FXYq7FXYqzD8vPPUvly++r3TF9IuWHrp19Jjt6qj/iQHUZ t+yu0jp5VL+7PPy83Rdt9jjVQ4o/3seXn5fqe9QzRTwpNC4kilUPHIpqrKwqCD753MZCQsci+aTg YkgiiF+Fi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWI/mF54h8uaf6NuwfV7lT9Xj6+mvT1 WHgD0B6n6c1XanaQ08KH94eXl5u87E7IOqncv7qPPz8ngc88080k8ztJNKxeSRjVmZjUkk9znCyk ZGzzL6ZCAiAAKAWZFk7FXYq7FXYq7FXYq7FXYq9E/LD8wP0XMujanJ/uNlb/AEaZjtC7Hof8hj9x +nOg7H7U8I+HM+g8vL9jy3tB2L4w8bGP3g5j+cP1j7XtOdi+fOxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KpD5x822XlrSjdTUkupKraW1d3f8A5pX9o5g6/XR08OI/UeQ73Zdl9mz1eXhG0R9R7h+v ufPWp6le6nfzX17KZrqduUjn7gAOwA2Azgc2aWSRlI3IvqWn08MMBCAqIQuVNzsVdirsVdirsVdi rsVdirsVdir1r8rPzB9QReX9Vk+MUTT7hj1A6QsfH+U/R4Z1XYval1iyH+qf0fq+TxHtF2LV58Q2 /iH++/X83qedO8Y7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql3mDXbDQ9Lm1G9akUeyoPtO5+yi+5zH 1WpjhgZy5BytFo56jIMcOZ+wd7538x+YdQ1/VZNQvW+JvhiiH2Y4wfhRfYVzgNXqp55mcv7H1TQ6 GGmxDHD4+Z70rzFcx2KuxV2KuxV2KuxV2KuxV2KuxV2KtglSCDQjcEdQcKkPb/yz8/jWrddK1KSm rQL+7kb/AHei9/8AXH7Xj18c7PsjtTxh4cz6x9v7Xzvt/sX8vLxcY/dH/Yn9Xd8u5nub15l2KuxV 2KuxV2KuxV2KuxV2KuxV2KsE/Of/AJRBP+YuL/iL5o/aD/F/84fpel9lf8aP9Q/eHhucU+iuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxVVtrm4tbiO5t5GiniYPFIhoysNwQcnCZiQQaIYZMcZxMZCwXv vkDzxb+ZdP4TFY9VtwPrUI2DDoJEH8p7+B+jO67M7RGohR+sc/1h8y7a7IlpJ2N8cuR/QfxuyvNo 6V2KuxV2KuxV2KuxV2KuxVp3REZ3YKiglmJoABuSScIFqknlPzfpnmiDULnTKvaWV49kk9QRKY44 3Mi/5JMlB40r3zL1uinpzET+qUeKu7c7fY0YNRHKCY8gaSD85/8AlEE/5i4v+IvnL+0H+L/5w/S9 Z7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmkatfaTqEN/YyGO4haqnsR 3Vh3U9CMuwZ5YpicTRDRqdNDPjMJi4l9C+UPNdj5k0pbuCiTpRbu3r8Ub0/4if2TnfaHWx1EOIc+ o7ny3tPs6eky8Evp6HvH6+9PMzXXOxV2KuxV2KuxV2KuxV4F+eP5seu03lTQZ/3Ckpqt5GftsOsC MD9kft+PTxr23s/2Nw1nyjf+Efp/V83Q9pa6/wB3D4/qZL/zjV/ygt9/21Jf+oeDNf7Vf4zH+oP9 1JyOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYqm3ljzLqHl7VY7+zNQPhngJ+GSM9Vb+B7HMvR6ueCYnH4jvcHtDQ Q1WIwn8D3F9D6DrlhremRajYvyhlHxKftI4+0jjswzv9NqYZoCceRfLdZpJ6fIccxuPt8wmGXuK7 FXYq7FXYq7FXkH52/mv+hoJPLehzU1eZaX1yh3t42H2VI6SsD/sR7kU6nsDsbxT42Qegch3n9X3u o7S13AOCP1dfL9r5y653jzr6U/5xq/5QW+/7akv/AFDwZwHtV/jMf6g/3Uno+x/7o/1v0BPfzn/5 RBP+YuL/AIi+ee+0H+L/AOcP0vd+yv8AjR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxVknkfzld+WdTEgrJp85C3luO47Ov+Uv49M2PZ3aEtPO+cDzH46up7X7Kjq8dcpj6T+j 3F9BWN9aX9nFeWkgmtp1DxSL0IOd7jyRnESibBfL82GWOZhMVIK+Ta3Yq7FXYq88/N380YPKGm/U rFlk8wXiVt02IgjNR6zg7dR8IPU+wze9idkHVT4pf3Uefn5frdfr9aMUaH1n8W+WZ55riaSeeRpZ 5WLyyuSzMzGpZidySc9HjERFDYB5Ykk2VmSQ+lP+cav+UFvv+2pL/wBQ8Gef+1X+Mx/qD/dSek7H /uj/AFv0BPfzn/5RBP8AmLi/4i+ee+0H+L/5w/S937K/40f6h+8PDc4p9FdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirNfy48+SeX7z6lesW0e4b4+p9Fzt6i+38w+n57nsntM4JcMv7s/Z 5/ref7d7GGphxw/vY/aO79T3aORJI1kjYPG4DI6moIIqCDnbggiw+bSiQaPNdhQ7FWJfmR+YOn+T NEN1JSbUbiqafZ1oXcdWanRErU/d3zZ9ldmT1eThG0B9R/HVxNZqxhjfXo+S9X1bUNX1K41LUZmu Ly6cyTSt3J7AdAANgB0GenYcMcUBCAqIeTyZDORkeZQmWsHYq+lP+cav+UFvv+2pL/1DwZ5/7Vf4 zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCIvnnvtB/i/wDnD9L3fsr/AI0f6h+8PDc4p9FdirsV dirsVdirsVdirsVdirsVdirLrbyNPqPkmPXtPDSXUEkq3VuNy8anZkH8y9x3Hv120OzTk03iw+oE 2PJ0eTtcYtYcGTaJAo9x8/exHNS7x2KuxV2KuxV2KvSfyu/MD6jJHoWqyf6FIeNlOx2idj9hj/Ix PXt8unR9jdqcBGKZ9PQ93l7nkvaHsXxAc2IesfUO/wA/f972TOueCdir5B/NnU7+/wDzB1o3czTf VbmS2tw3RIYmIRFA6Afr3z1LsbFGGlhwirjZ95eR10zLNK+hYjm0cN2KuxV9Kf8AONX/ACgt9/21 Jf8AqHgzz/2q/wAZj/UH+6k9J2P/AHR/rfoCe/nP/wAogn/MXF/xF8899oP8X/zh+l7v2V/xo/1D 94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/5P/8AKGR/8Z5f1jO47B/xYe8vm3tP/jZ/qhiX 5o/l99Skk13Sov8AQ3PK9t1H90xP94oH7B7jsfbpqu2ey+AnLjHp6ju8/c7v2e7a8QDDlPrH0nv8 vf8Af7+fNc5x652KuxV2KuxV2KvYfyr8/NeLHoGpuWukWljO2/qIor6bH+ZQNj3Hv163sXtPjrFP 6v4T3+TwntF2N4d58Y9P8Q7vP4/jy6ZnSPIPjj8yv/JgeYf+Y+f/AImc9W7K/wAVx/1A8drP76Xv LGs2DjOxV2KvpT/nGr/lBb7/ALakv/UPBnn/ALVf4zH+oP8AdSek7H/uj/W/QE9/Of8A5RBP+YuL /iL5577Qf4v/AJw/S937K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8AJ/8A5QyP /jPL+sZ3HYP+LD3l829p/wDGz/VDNZI0kRo5FDo4KujCoIOxBBzcEAii8+CQbHN4T+Y/kJ/L939e slLaPcNRO5hc7+mx8P5T9Hz4jtbsw4JcUf7s/Z5fqfSOwu2RqY8E/wC9j/sh3/rYTmmehdirsVdi rsVZN+Wv/KcaV/xkf/k0+bLsj/GYe/8AQXUdvf4nk9w+8PofO/fLHxx+ZX/kwPMP/MfP/wATOerd lf4rj/qB47Wf30veWNZsHGdirsVfSn/ONX/KC33/AG1Jf+oeDPP/AGq/xmP9Qf7qT0nY/wDdH+t+ gJ7+c/8AyiCf8xcX/EXzz32g/wAX/wA4fpe79lf8aP8AUP3h4bnFPorsVdirsVdirsVdirsVdirs VdirsVe7/k//AMoZH/xnl/WM7jsH/Fh7y+be0/8AjZ/qhm2bl55QvrG1vrSWzu4xNbTqUljboQch kxxnExkLBbMOaWOYnE1Icnz7548m3flrUzHvJp85LWdwe47o3+Uv49c4LtHs+WnnXOB5F9Q7I7Vj q8d8pj6h+n3Fjea52zsVdirsVZN+Wv8AynGlf8ZH/wCTT5suyP8AGYe/9BdR29/ieT3D7w+h8798 sfHH5lf+TA8w/wDMfP8A8TOerdlf4rj/AKgeO1n99L3ljWbBxnYq7FX0p/zjV/ygt9/21Jf+oeDP P/ar/GY/1B/upPSdj/3R/rfoCe/nP/yiCf8AMXF/xF8899oP8X/zh+l7v2V/xo/1D94eG5xT6K7F XYq7FXYq7FXYq7FXYq7FXYq7FXu/5P8A/KGR/wDGeX9YzuOwf8WHvL5t7T/42f6oZtm5eediqA13 Q7DW9Mm06+TlDKNmH2kcfZdT2Zco1OmhmgYS5FytHq56fIMkDuPt8i+d/M/lrUPL2qyWF2Kj7UE4 FFkjrsw/iOxzgNZpJ4JmMvge8PqXZ+vhqsQnD4juKU5iOc7FXYqyb8tf+U40r/jI/wDyafNl2R/j MPf+guo7e/xPJ7h94fQ+d++WPjj8yv8AyYHmH/mPn/4mc9W7K/xXH/UDx2s/vpe8sazYOM7FXYq+ lP8AnGr/AJQW+/7akv8A1DwZ5/7Vf4zH+oP91J6Tsf8Auj/W/QE9/Of/AJRBP+YuL/iL5577Qf4v /nD9L3fsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2Kvd/yf/wCUMj/4zy/rGdx2D/iw 95fNvaf/ABs/1QzbNy887FXYqknm7ypY+ZNKa0uKJOlWtLkCrRv/AM0n9oZha7RR1EOE8+h7nY9m doz0mXjjy6jvH45PnnV9JvtJ1CawvozHcQtRh2I7Mp7qeoOcDnwSxTMJCiH1LTamGfGJwNxKDylv dirJvy1/5TjSv+Mj/wDJp82XZH+Mw9/6C6jt7/E8nuH3h9D5375Y+OPzK/8AJgeYf+Y+f/iZz1bs r/Fcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/7akv/AFDwZ5/7Vf4zH+oP91J6Tsf+6P8AW/QE 9/Of/lEE/wCYuL/iL5577Qf4v/nD9L3fsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxV2KuxV2KuxV2K vd/yf/5QyP8A4zy/rGdx2D/iw95fNvaf/Gz/AFQzbNy887FXYq7FWKef/I9v5k0/nCFj1W3BNrMd gw6+m5/lPbwP05q+0+zhqIbfWOX6nddi9ry0mSjvjlzH6R+N3gVzbXFrcSW1xG0U8TFJY3FGVhsQ RnCzgYkgiiH03HkjOIlE2CpZBmyb8tf+U40r/jI//Jp82XZH+Mw9/wCguo7e/wATye4feH0Pnfvl j44/Mr/yYHmH/mPn/wCJnPVuyv8AFcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5 /wC1X+Mx/qD/AHUnpOx/7o/1v0BPfzn/AOUQT/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKf RXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/ACf/AOUMj/4zy/rGdx2D/iw95fNvaf8Axs/1QzbNy887 FXYq7FXYqwL8zPIA1q3bVdNjpq0C/vI1/wB3ovb/AFx+z49PDNF2v2X4w8SA9Y+39r03YHbX5eXh ZD+6P+xP6u/597w8ggkEUI2IOcY+iMm/LX/lONK/4yP/AMmnzY9kf4zD3/oLqO3v8Tye4feH0Pnf vlj44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT/nGr/lBb7/tqS/8AUPBn n/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRX Yq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l829p/8bP8AVDNs3LzzsVdi rsVdirsVeWfmn+X/ADEvmDSo/jFX1C3UdR3mUeP8w+nxzmO2uy7vLjH9Yfp/W9n7O9tVWDKf6p/3 v6vkwv8ALX/lONK/4yP/AMmnzT9kf4zD3/oL0Hb3+J5PcPvD6Hzv3yx8cfmV/wCTA8w/8x8//Ezn q3ZX+K4/6geO1n99L3ljWbBxnYq7FX0p/wA41f8AKC33/bUl/wCoeDPP/ar/ABmP9Qf7qT0nY/8A dH+t+gJ7+c//ACiCf8xcX/EXzz32g/xf/OH6Xu/ZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdir sVdirsVe7/k//wAoZH/xnl/WM7jsH/Fh7y+be0/+Nn+qGbZuXnnYq7FXYq7FXYq7FXncvkD9Fefd N1nTI/8AcbLK/wBYhX/dLtG24/yGP3Hbwzn5dl+FqoZID0E7+W33PVR7a8bRTw5D+8AFH+cLH2j7 XomdA8q+OPzK/wDJgeYf+Y+f/iZz1bsr/Fcf9QPHaz++l7yxrNg4zsVdir6U/wCcav8AlBb7/tqS /wDUPBnn/tV/jMf6g/3UnpOx/wC6P9b9AT385/8AlEE/5i4v+IvnnvtB/i/+cP0vd+yv+NH+ofvD w3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3 LzzsVdirsVdirsVdirsVdir44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT /nGr/lBb7/tqS/8AUPBnn/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0 vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l82 9p/8bP8AVDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/AJj5/wDiZz1bsr/Fcf8AUDx2s/vp e8sazYOM7FXYq+lP+cav+UFvv+2pL/1DwZ5/7Vf4zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCI vnnvtB/i/wDnD9L3fsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8n/APlDI/8A jPL+sZ3HYP8Aiw95fNvaf/Gz/VDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/mPn/wCJnPVu yv8AFcf9QPHaz++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5/wC1X+Mx/qD/AHUnpOx/7o/1 v0BPfzn/AOUQT/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq 7FXYq93/ACf/AOUMj/4zy/rGdx2D/iw95fNvaf8Axs/1QzbNy887FXYq7FXYq7FXYq7FXYq+OPzK /wDJgeYf+Y+f/iZz1bsr/Fcf9QPHaz++l7yxrNg4zsVdir6U/wCcav8AlBb7/tqS/wDUPBnn/tV/ jMf6g/3UnpOx/wC6P9b9AT385/8AlEE/5i4v+IvnnvtB/i/+cP0vd+yv+NH+ofvDw3OKfRXYq7FX Yq7FXYq7FXYq7FXYq7FXYq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3LzzsVdirsVdi rsVdirsVdir44/Mr/wAmB5h/5j5/+JnPVuyv8Vx/1A8drP76XvLGs2DjOxV2KvpT/nGr/lBb7/tq S/8AUPBnn/tV/jMf6g/3UnpOx/7o/wBb9AT385/+UQT/AJi4v+IvnnvtB/i/+cP0vd+yv+NH+ofv Dw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/J//lDI/wDjPL+sZ3HYP+LD3l829p/8bP8AVDNs 3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/AJj5/wDiZz1bsr/Fcf8AUDx2s/vpe8sazYOM7FXY q+lP+cav+UFvv+2pL/1DwZ5/7Vf4zH+oP91J6Tsf+6P9b9AT385/+UQT/mLi/wCIvnnvtB/i/wDn D9L3fsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdir3f8n/APlDI/8AjPL+sZ3HYP8A iw95fNvaf/Gz/VDNs3LzzsVdirsVdirsVdirsVdir44/Mr/yYHmH/mPn/wCJnPVuyv8AFcf9QPHa z++l7yxrNg4zsVdir6U/5xq/5QW+/wC2pL/1DwZ5/wC1X+Mx/qD/AHUnpOx/7o/1v0BPfzn/AOUQ T/mLi/4i+ee+0H+L/wCcP0vd+yv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FUX+iNV/5Yp/+RT/0y3wM n80/Jo/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50 fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHfojVf+WKf/kU/9MfAyfzT8l/M4v50fmHuH5SwTweT 445o2if15TwcFTQkdjnadhxI04BFbl879pZiWrJBscIZlm4dA7FXYq7FXYq7FXYq7FXYq+RPzG0X WJfPmvyRWFxJG99OUdYnKkFzuCBnqHZefGNNjBkPpHV5HV45HLLY8yx39Aa7/wBW66/5Eyf805n/ AJnH/Oj8w4/hT7i79Aa7/wBW66/5Eyf804/mcf8AOj8wvhT7i79Aa7/1brr/AJEyf804/mcf86Pz C+FPuL6K/wCcdLO7tfJN7HdQSQSHUpWCSqyEg28ArRgNts4T2onGWoiYm/QPvk9F2REjEb/nfoCc fnKrN5RQKCT9bi2H+q+cB2+P8H/zh+l7j2WP+FH+ofvDxD0pf5G+45xfCX0TiHe70pf5G+448JXi He70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiH e//Z + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:7AFE812EFA94E911B987F622BD994B0C + uuid:5544eaeb-e005-4a01-bdb2-9e7085444008 + + uuid:e177ff01-74ca-4810-9fb1-85109f60768b + xmp.did:76FE812EFA94E911B987F622BD994B0C + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:7AFE812EFA94E911B987F622BD994B0C + 2019-06-22T17:16:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Mograsim Orange (255,83,0) + Mograsim Blue (7,83,235) + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + Mograsim + 1 + + + + Mograsim Blue (7,83,235) + SPOT + 100.000000 + RGB + 7 + 82 + 235 + + + Mograsim Orange (255,83,0) + SPOT + 100.000000 + RGB + 255 + 82 + 0 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 8 0 obj <>stream +H‰¤‘M +1 …÷=E.0m“ôgfkW£H0 ³p™ûƒiG´ wRèËK×5çfLvûʤlaZÖé¡ÌQìmUOiX9ìƒö@N®iQ¥·¨a¹qt AŒv½îûRÏêª.:å‚Îéô'ÒÖçYå ŒMæÌQàV;ÄðEw¡‹V۞Q“—!ªÜÆ4¹á‘¨ÉÜÅXS-©Ñ¡8$™bÒ.¸·“4šÙ×m䣎þ³ë0ʼö&QZ +endstream endobj 13 0 obj <>stream +8;Z,f9+ln#$q0jV3/j2:`@\UF.%lb@!r5fTjfhE9rL3Fab$V6Oh2lOOPm2G\:+Cm\ +ds[l\O9oeHa:fQI!FKRqdT4*+TIEJ4eQ&n>2sl\[0Gl<%Isho(*Q)51i,km_,!l4n +38[j??3U,:!Rsg'+NrB$,lb(6.cm!C(OjAnM-R]#[<8Irb6tTY3!P7 +`b=946k=it;]qTj= +fmc5HMiYRW(4O[%8["`biP`l'hmR.rohT&^s%6\cs-e9/`QKp+rnH5UIpXgWq%8,I +mJ$8Q)ZJ4a5L"\hIkUi0lSAOrVV`H~> +endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 5 0 obj <> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 12 0 obj <> endobj 10 0 obj [/Separation/Mograsim#20Orange#20#28255,83,0#29/DeviceRGB<>] endobj 11 0 obj [/Separation/Mograsim#20Blue#20#287,83,235#29/DeviceRGB<>] endobj 9 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_orange-blue.ai) +%%CreationDate: 6/22/2019 5:16 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -488 456 -23 +%%HiResBoundingBox: 56 -488 456 -23.5352 +%%DocumentProcessColors: +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%DocumentCustomColors: (Mograsim Blue \(7,83,235\)) +%%+ (Mograsim Orange \(255,83,0\)) +%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) +%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 20 0 obj <>stream +%%BoundingBox: 56 -488 456 -23 +%%HiResBoundingBox: 56 -488 456 -23.5352 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 20612 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45CFFD6EFFC9B4CFFD6CFFCABABABAFD6BFFCABBB4B4B4BAFD69FFCA +%BBB4BABAB4BABBFD68FFC1B4BABAB4BAB4BAC1FD66FFC2B4BAB4FD04BAB4 +%BAC2FD64FFC2B4BABABAB4B4BAB4BAB4B4C3FD62FFC9B4BAB4BAB4FD04BA +%B4BAB4BAC9FD60FFCAB4BAB4BABABAB4B4BAB4BAB4BAB4BAC9FD5EFFCAB4 +%BAB4BAB4BAB4BABAB4BABABAB4BAB4BBCAFD5CFFCFBABAB4BABABAB4BABA +%B4BAB4BAB4BAB4BAB4BBCAFD5BFFB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 +%BABABAB4C1FD5AFFBBBABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4 +%C2FD58FFBBB4B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4C2FD56 +%FFBBBABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4C3FD54 +%FFC2B4B4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BAB4C9FD +%52FFC3BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4CAFD50FFC3BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABACFFD4EFFCABAB4BABABAB4BABABAB4BABABAB4BABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CFFD4CFFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4FD04BAFD4BFFCABB +%B4BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4B4BBFD49FFCFBBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04 +%BAB4BABABAB4BABABAB4BABABAB4BABABABBFD48FFC2B4BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%B4BBFD46FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD44FFC2B4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAC3FD42FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC9FD40FFCAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAC9FD3EFFCAB4B4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BAB4BBCAFD3DFFBABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BBCAFD3BFFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4 +%C1FD3AFFBBBAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD +%38FFBBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD +%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4C3FD37 +%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C9FD +%36FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%C9FD35FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4CAFD34FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABACFFD33FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BABACFFD32FFBBBAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABBFD2CFF7FFD05FFC1B4BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BBFD2AFF +%5B08FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAC1FD28FF850931FD05FFC1B4BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C2FD26FF85080F30FD +%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BAB4BAC2FD24FFAF090F0831FD05FFBBB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C3FD22FFAF +%080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BACAFD21FF0E0F0F0F0837FD05FFC1B4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BACAFD1FFF3009080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BBCFFD +%1DFF300F0F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCFFD1BFF540908 +%0F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BAB4C2FD1AFF5B0F08310F0F0831 +%0931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD18FF5A0F080F080F080F080F +%30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BAB4C3FD16FF850F08310F0F08310F0F +%0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C3FD14FF840F080F080F080F +%080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4CAFD12FFA9310931 +%08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CAFD +%10FFA931080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4FD10FF37080F08310F0F08310F0F08310931FD05FFC1B4BAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4B4B4FD0EFF37080F080F080F080F080F080F08 +%0F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABBFD0CFF5B08310F0F +%08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4C2BBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BABBFD0AFFA9080F080F080F080F080F080F080F080F30FD05FFBABA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAC2FFBBBAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD09FF850F090F08310F0F08 +%310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FFFFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4B4C2FD08FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAC2FFFFCFB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAC3FD07FF850F0F0F08310F0F +%08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4C2FFFFFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAC3FD06FFA9080F080F080F080F080F080F080F080F0EFD05FF +%BBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD04FFC9B4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4BACAFD05FF850F08310F +%0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4C2FD05FFC3B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F080F0E +%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD06FFC2B4BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4FD05FF850F0831 +%0F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4C2FD07FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F080F30FD +%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD08FFC1B4BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABACFFD04FF850F090F08 +%310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4C2FD08FFCABBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BACAFD04FFA9080F080F080F080F080F080F080F08090EFD05FF +%BAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD09FFCABBB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABAFD05FF850F0F0F08310F0F08 +%310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FD0AFFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACA +%FD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BAC2FD0BFFC9BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4FD05FF850F08310F0F08310F0F08310F0F08310931 +%FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD0CFFC2B4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA9080F080F080F08 +%0F080F080F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BAC2FD0DFFC2BABABAB4BABABAB4BABABAB4BABABAB4FD04BAFD05FF850F +%08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4C2FD0EFFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BACAFD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAC2FD0FFFBBBABABAB4BABABAB4BA +%BABAB4BABABAB4BABACFFD04FF850F090F08310F0F08310F0F08310F0F08 +%31FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD10FFBAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F +%080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2 +%FD11FFBABAB4BABABAB4BABABAB4BABABAB4BABAFD05FF850F0F0F08310F +%0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4C2FD11FFCFB4B4B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFA908 +%0F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BAC2FD12FFCFB4BAB4BABABAB4BABABAB4BABABAB4FD05FF +%850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4C2FD13FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BACA +%FD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BAC2FD14FFC9B4BABABAB4BABABAB4FD04BAFD +%05FF850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4C2FD15FFC2B4BAB4BAB4BAB4BAB4BAB4BACA +%FD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAC2FD16FFC2B4BABABAB4BABABAB4BABACF +%FD04FF850F090F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4C2FD17FFC1B4BAB4BAB4BAB4BAB4BACAFD +%04FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAC2FD18FFC1B4BAB4BABABAB4BABAFD05FF85 +%0F0F0F08310F0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4C2FD18FFCABBB4BAB4BAB4BAB4BACAFD04FFA9080F +%080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BAC2FD19FFCABBB4BAB4BABABAB4FD05FF850F08310F0F0831 +%0F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4C2FD1AFFC9BAB4BAB4BAB4BACAFD04FFA9080F080F080F080F080F08 +%0F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD1B +%FFC9BAB4FD04BAFD05FF850F08310F0F08310F0F08310F0F08310931FD05 +%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD1CFFC2B4B4BAB4BA +%CAFD04FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAC2FD1DFFC2BAB4BABACFFD04FF850F09 +%0F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4C2FD1EFFBBB4B4BACAFD04FFA9080F080F080F080F080F +%080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2 +%FD1FFFBBBABAFD05FF850F0F0F08310F0F08310F0F08310F0F0837FD05FF +%C1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD20FFBABACAFD04FFA9 +%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BAC2FD21FFBACFFD04FF850F08310F0F08310F0F08310F +%0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD21 +%FFCACAFD04FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08 +%310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2 +%FD27FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAC2FD27FF850F090F08310F0F08310F0F08 +%310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27 +%FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08310F0F08310F0F08310F +%0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9 +%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08310F0F08310931 +%FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F08 +%0F080F080F080F080F080F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BAC2FD27FF850F08310F0F08310F0F08310F0F08310931FD05FF +%C1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F +%080F080F080F080F080F30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAC2FD27FF850F090F08310F0F08310F0F08310F0F0831FD05FFBBB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F +%080F080F080F08090EFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAC2FD27FF850F0F0F08310F0F08310F0F08310F0F0837FD05FFC1B4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F +%080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD +%27FF850F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F08 +%0F080F0EFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF85 +%0F08310F0F08310F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F080F +%30FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FF850F09 +%0F08310F0F08310F0F08310F0F0831FD05FFBBB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F08090EFD +%05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08 +%310F0F08310F0F08310F0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4C2FD27FFA9080F080F080F080F080F080F080F080F0EFD05FF +%BBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F0831 +%0F0F08310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4C2FD27FFA9080F080F080F080F080F080F080F080F0EFD05FFBABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BAC2FD27FF850F08310F0F08310F0F08 +%310F0F08310931FD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2 +%FD27FFA9080F080F080F080F080F080F080F080F30FD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAC2FD27FF850F090F08310F0F08310F0F08 +%310F0F0831FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27 +%FFA9080F080F080F080F080F080F080F08090EFD05FFBAB4B4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAC2FD27FF850F0F0F08310F0F08310F0F08310F +%0F0837FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFA9 +%080F080F080F080F080F080F080F080F0EFD05FFBBBAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAC2FD27FF850F080F090F080F090F080F090F080F08 +%31FD05FFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BAC9FD27FFA93031 +%303730373037303730373037303730FD05FFBBBAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%%EndData + +endstream endobj 21 0 obj <>stream +%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%d_²Ý#)ɬ`1¦ó(ÉÌ"‡|™}˜}±ÕïS…fîy›3] ²2Cà 0\ +=>UüÍÿñ«ß|yýÕëßÞ}®†Ý“/þæoo{ýæÇ;’w?}ñâÛ·ïހôƒ_ÿp7ÎWžºþiyjOþÓݛ·÷¯_ý˜¿» +øí-ÞÿÁá÷oîß¾»öjw{÷Rúáî?Äoÿáþ݋;ùýýóׯž¾~óìÕ×w_þöÅ·wWÏîè_ 5Ÿ½“ÇæMӏ¦a\véÇã¼ûÕÏùȳWxööíýŸïÐl(luÿúÛW_Ý¿úzÿúþx—æݗ±”]Ä?&þþïï}÷ö¡‡®RHž<¾~þíË»Wï~õæõó»·o¯_¼~óöÇò›ëŸ¦§·÷//Ÿ½ÛGãú§ãôtÿíý‹¯~ñíËßÞIßçe$=<å»ÿøöÙ×ò¥ü7éùéO_ +é7wïÞÉ·¼ýñnè›=Ȉ¿~i­î~ðó×_¿yööþån/ƒ´û·ä¿+á戀þ퇮ÿ³{â—MyfJ O ö̯²ï*•æ®†)Ç4Ê?”â"/Әæå­u/=®å~¥i–üë¯dþîdßüûÝ«ÿþÃ:Zo^Fd÷e§þ?Øoÿáîå7/dQpî¦4_%™5þÕÿP–iâƒ_†ñªäeÙ}9Çájž©4Æ«QÖÔnLËÕRì6ëw¸¿ûãw¿xýêÎ&ýúÍ»ßèj‹qô¿ö«_ûâîÍ?¾º'=“¶è¬ÿüõWw/äVÅí‹gœl–±ýמø‡go¾¾{'‹ôõ‹oßqKoEVÖϞýé b´F~ùÍÝ«xýOüÔ/Çi»<™œ$ݚÊnIq76’¤Ù;µÝ±ý×jGU¨¨6‘1u¿’úË7÷_ß¿úqýÆüô'oî¿jË6O»¢ÿa?®J÷ÿ¥þß>W:ÿîÝÝ«úý²e?ï6Àpõó_¢Õ›W_^¿Ä<¼å¦¾“öe½xýµý¶ýÀßIß~cÝ á©LÛ¯ÞÜ¿BÅO¾ø…þ®<ýՋoå—?yóúÛo~úêw¯Ÿ|ñepÿt÷\˜˜ÌíW»_þöȦ~ñìù￾ûóÝýóß¿º{w÷v·—½-tVXÕ7?|OÅÒß7w;ý­¼ËåïßáïǼ¼ûp™VRÿþßBŽ/^ܽúòÿùöí³w~ùú«o_Èoo^ýáîÅëoîvÏ^}µûçgo¾yL¿zñìÕ³7;þ¢¶Ð×»ûé«wwožýû»û?ì^>“F塟ÝÿA^|&ãû¨d9}#£Æ—ø̺µ‡è~õ¨¦ž½û½0­»W_½õÚ¯_}ý³ø­ð¦íˆ±#úücªÿ͟^þöõ‹û·/½òžâÿ~ä—Ê°¾úå+ýä7ß¾ýýî^¿~á5ÿ\xõݛoî_½½{±ùjá"úÞ_UCþð¹F°yþ—hâðìŋ{9Ͼùýýós­ü7ûýïîïÎ6váýG­®çœªs­þ曻?ß?{q¶ÅÓ×þê³5¸»ùê^xç&ðà3¿ùã³wÏ¿ûÙýoß<{s÷žÝŠÉþÝý«¯äCóíý»;oÁ¹òõÝÛ»w~' ZØ+،¼p۽ЪOOå¸é“/¿|ø ‘3vÿªä'ož}u/G™Hq?yýâ+yøk©ºý[ŽÍ¼Ûõä‹}òÅÐýo¬ÿ‹»¿yº™ñ¿yûgܔ©+ÁJ´’øÿZfü_jœW%{)ò*×]ÙK9X9våf¸•okY}ZÿgêJèJ\•¤EÆçq–’ùwéʲ*×ãÞËÁË~ì‡Ãñp+ËnädÄc:ÎGù¼c9.Çýñp¼9ÞÞ 2=á&ÞÌ7ù¦Ü,7ÒØÍáFVÉÍÍÍ-–Æ­ Úmº•ÎÞÊçß^K‘FoåÕÛÍÎéÀiuÚMWŽ]9te¿*×]Yj‘i¾•Ü•yURWbWBWd5J“—ž³5®<ôÓÿ9®ÊA‹ þÞwåº+˪”®ä®Ì]†~“¼ÄU ]™º2veè‹û“/lúô]Ùk©[u5ŸëY\Ï]µõL­gGfDjŒýŒt3±ÿõ¨ÛhoF˜£*ãµlÆÔFr5†ëqیÖz|d¼Öã¢crmea)V²•™%Y‰,ÁŠ¬;nF;SõTð­P;§Õ?{–k+ K±"›]6>ÌV’•È¬(O®g€ðÕnNo8{Î[á<%Î æbàè9Ú×ÛÌь½‘£uÃÑÙs4Šô.³ïè1z9°WGöâšßù•‘_%ß"ËæF†ô ììZØZö6 “‹Âì&áóò¥²¤nd° ¯…-–ë, 2 £ rތrßÊÔePö˵°Ó²da¬Ilj”ûVÄQk/lx)òÂ’gaͱaÒ£œí·²TŽ2”û|-L¼ä,ì< [ÂÜG‘neex÷Âú9²I„ ÇÂ8Ë7ʒ¾‘É>È¡q-‡G‘#dNI“ ‡Ê(òÅ­,¼£LÉ^œEžg9‚¢E“HƒlY9¤®å°’o”ckI° Ù(Í­,Ö£L#ŽY¼8Š“}8ªažSöۉÀö$ž­OòYÙ`zôC܃€°P€PBDŒº6.´ÊšXG­¡½eZñ‹Ûî$PN±ÈK²¾FY[çVÖÔ#<¥ðGOª‘§Uⶮ'–Y8±äP¡~ÎF?gYzåÌÉüdĹx6ëû.c“`s•3(eÜPÎMÒH.k\o§Ão¸õšågʂÇJÁ†Òíԟ£~×Ç8  Ÿ§kŠ67ádPÄ]|RQE( ïo¤‘ÑDwífśèM•…µÕºZM¬‡¥ïŸ$ÿþ~2u"W‚…Ž +$ËJÙsÍl~x’!•Yõìª-«Æ²z¦E¶å£†™­YÙû™OÇf+–¼wùº–¦1••.•M¿Ò’V:˜éeRc0f Tæ_©Äkm¯žV® º6Á"£¸Ò"”Ы恿—M)›Ò4Vý×lºl_âI 'e:SìÔØÿ9Q±;{ÙÏÿ>ž-ÂZd¼ì½\_(ËÅRª†)5æM™Yšöšú"5®~v Gû÷i  +—†Ô8=²œä3Ej|ܓþsÖVðI>_Ýñ:úÀªô[¥ø£•Ûª-¤ÚFŠéÞÕvbû^vµêéu·W{LÛ +Û½]eߺ—ûÝ»·]]­§{7»Õa¶’Ü&ÑìR¡ß­nÍx`ŸÊ¿ÜÒlc›½Ywç‘GSµ±ô6¶ýÙ½¹_YæNwgµálwkYYùšU¨Z†ÎíWÿye;L'%®¬—wåÚrµµYžÛ·íæÍ^宾ð»ßÑî꿂=øùk¼ ôöêÕ©‚¥RË©‚Ue• +û %’ÅÌÙd’ÉÕ«ÛN*É+©dêT¬ƒ(YT±ž|!JÔ,U² f T±TÉ:ÐꤊVqE+˜¢Uë j֞ŠV¡ KV#•­‘å–ú÷MHET-U¶ nMªnQá:šÂµ§ÂU¨pAå+“µcj×-ui(^ªzAù*T¾ ~Eª_#·Õ-U°U0(aPò4‹GEÓ-PuŒö *dGQÈ ’A)ƒZÅ,ÇDÕ ÊY 먠ݚ¿×"|¡| /SʛñBÀŸ‘VãìƒuBš§²[¡z†ÉÁ{ÞÝqíN +«ö\ý»çɽ EyIøm<‘œ³®xéJ²Yq͏”ÓË,(nw–Ï= _œ‘'Ç5.r“ϼ«]ÕÒ[Èú?k£`gê\Ûáê™K•c4•¶•°*k›_ڔyUDXYóÊÆX¨c­Ëõ¦ì·Å,š}9ž”Ó?·§¥®6aýI>ž)ÓÙΖjE<-éB™/·'KySʃeyO‘beÕ>_ö,äøRãá‘åø¸"5žRÏM壋ÔxéwùçÌñúÑ5¹hp­u2'Š–hEí©Õ¾š­TûëbŬ³R£ZkëŸÊ*ÚªÓRùmÕ­«Ô_-Åj7–õMó”–ÙKµ5/‹•k/û3<ëóÒ Ç:Ç«šáááß<ùâož>æÙýÛ3u^%y2 »2^‰þ8_®pû k»ç¼D`ÿG(ÆS|§R¦(ÿÈi²_kÐZ¦«0¤Øšûäšô{QjӌHÙö3^Í\TwV¶Ä4,¢ÏˆsLïÐ* Wƒpšî³>S…öuó |•¥qH™/áÏZ™è–E˜„Ï¢2™¾´¬*Kðô_÷y*ü„¹œòU aAU%ååS't[ݹ5k¿,WÂç/.ØõS¨gløÍ +Á¼Ëüûû—/ï^”iÿ’Šc…dþg·Æ0'c•ÉÜ|Ùãµ±Âcï³56 m4CÓã\øØhxªÈCˆª=·[š?ôP›yœ]ó »!‡ž +—Z×´mÏ  9X=#jÛU1N“Á°—êò¬ØI:N–À(žûsÚ[nSg qL Ä$8*akˆNP|‚!h »1ŒÂ!¹ÛóaìE‡¼xîbë¸ô“}47|ïˆo®øƒžÞ;>úi½T—üÑ'ò™Áø •• +á£,¦¾Bù r¤®$#Ië kp t• ¬wÌîMÖQ6TCÃ5¬f<Ü-x yLÍaÙÌ^Ñ èc3 +?›ò(\Š{қ1X]ԓ≠Gttìе!†ªq82HAû›§sÜtè¦ZÕ{\zN” gJљ’t¡iôšòôžê´Ì§[JÖM¶V(&æQåk•°›ŒM)ÛÀ™ +τœ I[$^JۅÒv•·+™{#u›ÌµP!œ”»«ä-»l-{c•,ëžNÞ¡[¯7¾n°ïM÷§®ÃS÷ctÀÖiyúSÿ÷öß=-9°¿…rċ°‡Ë ˆ°úw Œ¢þ7ÞÍqÞÅÛ~ï_ûÆ혌¶lå6k÷Ä +*º?ÍmðÐ + 5H¨D$Ã{O±àš*{!;™M<¨~Ãф„µ÷ðÚ½‡™,Ì<ˆÂ¸&î¢êG<òóô`Ô£±Ž~<úYH8yLÊAùä ;*ûò?.{ çʹs:œóÉ*.™7q è¼é|ÔIq¥bÁ> + 6:»>…swåý€îf6±ˆ×n6ނ˜³›š×@æÊl¥2K[0óqf¾¼>‹Öçõ*••Ý€Ì=Œyð5{k¶íœ6°÷Õ«ëwáQÈU,+[WòÌ£²­ç`0;åòêú¬kûƆìÐyÈuK‘•­«=ۊŸ©uPŽQžLÞ®gˆ:RuÜpp8~àœ3k¾°-ç]fӉÙû$Àál Ãtô ëð$ôaÊ?qa`}©ñ\(DÞ88çûór@D šö|PÄøÀ.º´‡Ž@ŸÝIûÎÝÒöR¿Ÿº]ubȺZD( °Ìr?´~áêÿ0 + K´ „$\Š¹ +v"¯”xyº³v}® +ÕðQæyñj\Dt.fHÝV¡vžf7™¯DÒ*Ý÷|tú9a‰°Ð„¼0‡^Ç,Ê:‰¡·% +/íú‘fyuì¬vŸ\“™‚Ê3…¥Ðü%Gq -CF02é[=ËUJRJtf O­êM7¿|óü÷÷_ÝÝÁxãÿ–j¦>¢öjÉÑò5a’óÆ×ʌÑXÆg`ÊÛZdíÍ]}Q“uØ[;{É °H°1 ½…ê#Þ6 ØcßÄØÅùJçÕ4|l8ø¿AŽŽ7zûMqmà{9½JϽܦf#VãÞËoª¾epg(!U'J®÷d×nZhh ñíµ—ÎKeݦvZa¨-PW!« +`½l3H´Pwa”KÕ^Ôf°tZÌÞ$›j9· +Æ2„++¢õBÕ|Y–Tß çRKBµ&ì«üb'Fu¡¨h>ÊÜÌɪM"dÒÞ@t-KÅlZL†¨aWÉ¥%w‡WD”£d)dj ^’—ö'{)^®½ì[‘]i0µ[¨Ç©Ž«ºÂá{òEŽ^Òªœþ)›²œ)"læë“r¸PŽwnÁ0|ÁÙ>|pá‚…búålps oÎà¼o{v\ÇÖîÐ} Õƾ”¨ö„UŒ÷ÜmghþìÅbƒŽÕ-Ö½[›ìÝ:3ƒN]hK½¶•}C»Ör u9Ù*…UmÏ5yäZ¬¾ì‰+ªù±¯éǶy$t¤hõ¬v´Bó>ìh Ն6˜ -т¦~ëŽÖG3øƒ%N·› ‚ùâ64ú«iC{ÈgݼÖKg?;0à6íÃHº¿ZԔµÇz¦*ӐBÕs­úIC5$PÃqˆû‰+ÜOøYNð>+/v‡ïqd)k,OŸ·ˆS¤Î)JðÐáÏárVˆœ‹èœ•r²ŠÊ¾Œý»¤$­:ñ>ð6ðÁRm-ã:ºFA×èç÷Übžë—4E͔°NÍR¥jÕܢī*ÔԞ¿ì +M§À 嵎WnjÉi”rSë7*}¯ÊÖb­ÊŸ74¨ñޔxÃß­Õøµ"¿Vå×Ê|1+wöƒPfÉUú¦ÖWÅ~òŒ'C§ÞßvJþërn-¼¢6Þþ,^Š—v¬µC:y‰­H¡+-¦o\•w½†nô4'U8dc‡Uٟ”ëM9÷G4òØu9{°Óhw¹¸ $5¦ %~páÑÆ4Ÿ¡|T,üÃÑð !•¸"=ˆ_‡’®£âû¸xóÎÊêžWÚæ£=®L¯+ëzkÝ_[=¶×>ÏÙæIÇuÚrÜ;¹lÂ9B3¾šùõ&ËZ$Øs+,æµÌc«[M±Í‡½öb·0L)XVŽ{¨7{Z|ܐ­Ã>J-ÙM¶Édy™~¤!¾‚h(ÈÁŒ¹ë€ Q‰©†hhˆj!t6‰UƒDnM_Q†ªloOðµkØH82›âaJMUIm©ÆìŽgÂ/ Ö0“uÈ°Èz¦±-¨z)l¸•x.„؉OÿœFö]Š%;þvsSn>¦¼3FLMY[Î?Pí i(¢>$Òïbf‚ûÑØ,In7Ú8>âõ´1üã«WÏ^Þ}µûÚH»ö†3ÔÞès.Sr¥ËÂ4^ý×$·5Í€Üná¶ë k ­Âp½‚×N0:9¸v9qk6cI_ÊÇ‹\9£Mž òøŒåû/=ÑIU~›«¨Ô6QrÈ«¬™áh™2‚›tV½JJ¹di Ï“h ž ziN¸l`Ko®-kxÓ:¸Éy–'áM +²œÝ8,üHxÔ¾ r2Îd¡NQáÓ*à)yÐS-Õ¬¡¤Fc5ux›¥šVšÙ¥EÑ43͸-D<µΔx¡¤“Bî(5ÎËÿʅҌVÅ°+RN,Hë"5¾ç‰-®ñѤÆÏüçà(ÐIn,"Q ¹Vç”'~›Mç¨ÙwÁOL׎r –¡(ͽ -ïÖAûi•wW]M¾Ý»™Îs”ÊS*lûLÈäY®RùJfZHå.×+΢6ø-oiüe2‹Nã2ÉLŸrZwœ¦þiËuÍgVà¡-Lªr•£V\ç÷™.” Ú£/s¤÷ñ'/Rã¿ýˆò0×û¨ò}©?0.êѬq B'v–¼²™eˆ99ƒIK]bË>Ê‹Ö µ«T¹©:Üg³j®¢’ÃÆkˆÒ5mZ·.?E§{çú-å§`K™L + +ÓxòÝé +Âk©]ýµ1:ғá0ÀvÔ'?®ò®àNô¤¼I8Šþ9XÜ<½ƒ9ÒµÔ=_ç´2°êkHj[LØ{ÛiV½æÔkCkýe+Ýv ‹~¦Nùýe~l‘ýì¦;3Ùñ$ð^–o¾I²‘K÷hyÓfæK˜)mO“×Ls×h™Ñö²ÞÔ¹#L\0oÁWšºÑ4náÈìg­jÖ3ºÊ<½tÉ5„O$Š—ð˜ÔÒÛäҞ^ºE#<ùÂÜ\ÕÅUÝ[Á¢Fwj»Ø„ë.·Yscх%O±Œ éqɌ€J² +AÉ9©3~¾wæüç|ΑÿY«­>}„ƒa—Æ«A¸Ýʳ¿ù•¿!ÍÊoæñ +‰&v!^Íc—nëG65d©8MónÂõÞK>WÃö‘VCÎçÀ=ýÓñÓ<Ân€ØK=í®'åðaÅkÚ®ñç!Ïω—Êcæ4f0€üсñ§Wx•Óx£Î‚ÙßR˜;Œ\ÏgÇç¦üÕÖÔ§l:xbÆf_³â³³žµÕŒû3ç°×»á ŒüÆ%»ÔÈowêRÔ´4K¥K°Ô¥Wú,Ϭ™`˜‹2©®…¶5Dæ»+q Ìm7¤¸ ә\€2}¾:-6: ÓÈêD ÓzáÙÄtçhxVC²aÀ¥ ‚îƒ>®ký³ôæóÏ§³ÎóŒsú(Øì8ÏܗåYƒmòb\‚MÍ'`Ñs0× Xׄ ^û` ç{sB»ê—]u4üõG@Gß f?®ßAà[‘,lã=-|(sÝF 9å=¥&®9Èö7hc8»Âv?°nÚäýí3éÁrã¹~[¦ßÔ]ϧY÷Lid™}»øȖÏwö<¾×÷èëšN6éž¨x&*¡Ù K ]n{‹×¾1¨Aƒ/….n8&f·†ÿQÕ7A H™èŽëã[û¼‚º<ßÑ6ãQŸóh"²` Þ æ=ê3u8–ýèLŽß¬RpJ ÀùŒã {òñã3+ÿC“…l¶ÇǼ®§™¼8 HÿÆ10„¾*üm.sŸ7µoðCÞúä]XÎoòMÁêÙkþÀ>cw…ÏšØV—ÃI†ð +émЇõú;7:@L{»¾/ê;«üœsyî±½9¹ƒí%o窒mýßé…f M‘ºM/u.ÁÔx&Á”%—¢ÔTž]Šù¬±¤~ø­žú€$TGz\±¥k̕]íTc;kdàÔ"½íÖN:ÛÚô@Ê+o±±Bi{‰8ÙÊœ%ú|Ñ<: +¹áÅV /´ +ûQÆóÈ|µ³|É$í⪅¦Ð µÀ +ãgv “ç"«-ɪCV\6µ—µ˜…÷ÙÄ·Œ,¼æ%RX~‡éy îQ×þ7èÆnØÞ/ÿS·Ýíµ.sªßWà¡àv‰®y C˲Φ:š$ÓzxÒwX¼sÅ°+Ÿ¹‹á^»å¶L ׂ(ºŠó!³÷7¯ ºëìrÖ¦U¶ö—¸ú–¯7È´ÎE[lÅD< ÷è@͖×9õ ªM†g‚§.œéä0Jf–¨D(ԁ¨@ØÀN78E™a`)”´j ?þuý}ߟvÛ·^LHìG_\oßþþë>ñëVè,ûa¢åaZæaˆ%¯dτÄ@4Mwú–D¯ˆ@Ø_ñ™ë5‘5”¥y™àOFQF˜âhVËNÀUәxótµˆ:ßëg­×ŒEŸfü¯uŽW8®?ŸSaS¯ë€Ü¿è¶0ö-CX8EÃ\´ÿ¼BâÌ?Ϋ Ÿ©ÆOU!âY "nýL†…dLÅnY¸å •uâ~…[K³®éÉõ8½±ã3˜$☮[êñÕuÑ®è/ð«}ú‹}º‹Òdo‹¶¹º"ms9Úúb´V¿¾­»m•Ýóá‹WpoëÞ±õ¾ò×P£5=ö:Ò FA˜)$šxXEý§( Lþ—™®ü`½ÆÊëQAÐґyÚÿh)øªéæÀ#äÖӍ6ÑSæ7-‡N5Øh^«Á’M4Ù P³ëKc×BÃ,¹smÓÍm¯°g*³ó%-‘œseþØÂKÀ>kùð}´ìz5ë`½$CoŠ­©,³ýéè5:LÑÁS°OôØô Óûÿâï> ýÐ¥£ïcCðQ¾¯ñ±o´{mٞQp­3.txóž×7C.œ(B"„<i0òZæ2Cì¥@…ö\’;9Ð%Á£ÁS®íևz…r½ó%00¤^O_o³h·`ô—%÷WÉ/'ËßSò6ó—#¿÷¢öó—$_¼lý£/]ÿ«Y&z¹^nžhóé!qÅrShf +ÏJñðmEfãjÆw·n­ ïû.ïU5¼×ÜW½é},ŦÍᏖÍtoÆøkωUÍòŌóõO—ò•7>õ%ž”p¡Lç o·9WƏ-¼¦ý³–¯ÑÍ]Ñ;,ªËb<TðGñlˆ}&D™Ó* b»Îà1ù×™ÛÍC„‚—>Ìh˜Û„,½èõ†7l]*g%Ý÷”ƒ@>[ùk¨qkCü¤¿“TI¤Æó¿9YÈéEý…T§èÄ>½:d>É,ºÎ.:žìªº§ö¼=ûÚ\†Å/¬‰î8lىÎç'7§€^́s ÐpkÐhõ9îoåÃ÷äð³ðô©ø™ó/HRç‹xA1E…öëu9Qr6¹¶{¤\S›\•~^s„דMsŒëÉ£b‘¦>À|O.[öÇH™p¢@ą¨a”–é1¸œy-›#l‡ +&‡åvÁ€ñƒ¨œ*)ªµP¥Ä=ó"ª„HÙÐ$BH‚ÿ ïAÊ»¦‚yÍ}oÿñÒúת…}0²ÝIßÔÿ·)‘ûüŽ®µšºP­ŠjÙ(ªy¥âZéTœOŸ“?¡V(.Ý_j…ÚúéµoÛkÛz5ÈÕ£“Á¤:%5.¦`í7ØV¿„°»Fpê píê‹â÷·î-{bugö͇\š§9,[K½~bqwÕ:#ہ9’&Zªp‘¯#õ;nÿÃéOªñ‚Êq¡˜¢Âlërªä¬• NA:w…ÔèNXÙ[˜v­ÄM—fðœ0e…¹äÆ흸óêbÏCw©çDÇgºÖË<¯-s]µ–Of+/t<h!ézLòÉ°ˆ;æ?^þNj|P%ËãC2?ôxõÕmö®JÕ¤ó…«WŚ‚V³645n6En—;H‹_ðP¯x8¬|k/F½ä¡AgóY˜—BDkƒ4žÜ§¿ºKûps<ƒ¦Ë¨{n†+ŒWý‹°¤d¦\®pãÑ.Ç«1åÞ!øiõ¨S- ÓBˆù0N3ïÙf:&ÍãÃ2„yzÞ;Ç°‹ùJv÷9Ÿ\•ÝmöA½*y7Å«¼þ’®âSyé¬#/m¹g1:Û#íщcò¹¨­ñQ[—¯;0…ñóۀÖgÔ#á#rÀw˺ÝYu´[šë½Uíæªâ7WÍÝ=Zí¢aÞÒuæÌø`ö»^Ÿõº]ÎqrsÇz)^zàSW]>/ˆåIÌ *Óê>ϓøº®ÙX!¯/Æï5yh>·®»ªy$­#ˆ lu–MLàöŠŠ“o¾ xya_毫åý Ï~,×~xÓ<î,xÔU çî€åT£B# Ú(ü,¶þ;ûFØ^P¼ÝEŸ\ÙwUøÏw÷ÿßÿûw»ß<ÿýŸ½ù3¶Í†ò—º”æÔ¤÷‘×Ò<ùâ$mqM‚^“÷ ‹~'æ:zMT| ÀìƒORIpù†þ +†}=ð)‡îZFHP’ýÈ +ž7ԓ{n A3Îw}åωù÷£/ýa¢¢Ëk¦&~Mv³ª®š–îºÊØ-å5dë…AUº¾±›|‘F“îڌš4—rærLY'†è.÷ئ9žO3ñ¨5ñ1* ŸëJ¥þ(_«'z0ûÑßµ[×C—ýÁ5ñ¾Dèë4èfî¦'ùS¢¶«ãØÅ-}pÆzxöV-¦Í~´ýÐñ‹½XSü[’?o5†0џ§ù;>*Ñß:͟Ån‰ÌóIÑ[=m¨]FoÉ*ûèø-"vÒ˜ © Œ.öÖí&ÙO>Ÿèû5ñýšø~M|¿&\ë´`1ë4ÿׇ¿üš·„òô¯_ýêÍý«w÷¯¾þòË^uïóä‹_|Ãßýݯž½{w÷æ•hõ×/þôöí3hóö¯Ý²\-ó´À ç9즯™Ý4ÎW²¸fýâkýë_þˆ¿¿Õªõ_þ¤?ÿWù÷ÿêe(v?ßýëv_=á[¿Æµ¥Zñî%¨'íí~¶"×ïúY_ÅY⺂WøϏ®ß¼;Þ?wÿúÕ³7ÚýX"?Ú¿~ýBÆâ§6.Oo¾º÷úÍÓý³çÿ.£÷ôî_Ü=ýõÝów?ÜýÞø¿ðï÷ß~«µµÓ¿Ôµ2áÚK5†ŽS⪉²ZŠe‰´KƒK½÷2.eËî_ži]ë‘ ãx5„yÜ¥rDI°’~NRÑ.-W³Èd;a W¨-e\QwS‘Ç…ìRºeîžóµ’®d“‡]š®f؊q§¹ìâr%ú.Mž¯Æ ÏÇp%;rªï-WCÓ.Èo3«Ïln*Wi‚Û¡ WiÁûù*À¬¯åx%úÌnšú,­ÍҊ¥»0éG„sí‚tC$d{M¨£h8;™ö2Ê*œó•ˆ¬# BpE§’ÉMS(µsó µNqç+\Qµ›dpÆEVF¯¤Kø{"¤«èoW"íŽþåӜ®„O&Mš‡ätó|DzìÆ$3;Ïõ½ùjn´Cø->*æ%í¤¾qt +2Œ†äïI§0r_ŽWÂÏ0b¡\ ¢ïí¢ ¥0K!ȗ̳°rdïÉÐϘ˜1[g¢°ž.3Žߍ™_êÌltxæ»C-¢‹–4ŠBÔy‹éJØZ·0^ɲæfßQú&2ïæ(˜ä£ã$3»,»YÃë{²úÆiÞåñ…C)ÜzÁkr† Aöj h'ƒ—…§·Õ5aOHeˆ­Þ…Aº´È(Q&|Ùap1Ëâ”óÁfN>ìjd$d-Â+&« +ÍI3E^O2TAWwžtê{2Ó¢ñgF¹ç«Qž/sÂæVùvÏñ½ßé?ê엫‡‚W¸o^®¨²Î¥’Kg)²_d‘¡#bðŸm%É×-2qþì¥ØÕÁkC¾ÔA“e¼ÌxÄj'àÔÚ©„¶dñ5í±Ú ¯hÓ­Öñ0–+á:2–AX€,¯—kjÔdyÊ1AC9 Avã,˺lîd½‰rÚ=µåVQ%X{ö^¥NW¢ËÜyEãU”Uеg{¯~–?V?Ü+Úô¯uýoÿÿýÇ8C~úöéϟÉ1|xý͟ž¾þϔŸ¼yýí7vˆœå×wßÜ={w÷ÕSid{Ú,»üp÷/ÿ|áà‘•’恰*‘Nºmaj'Ž°©<¥þÄÉz_½8±\ ߒ±Á>Š¶–é!àñ•UJ;áss.< +÷åȵ,r£ŽØ( gZtÁê{²Mµ¢¤Õ;a±'ô½J‡Å^œp°¡Œ³Q„3ÊáÞQôÕ·zP´>8ý6§,Eå}³R…qx¯ øá²;›N kO†% ¯šd|…é¼\SErK…aF£+Kq&Éü؏ÖäɞÛ3Ê ìË+q‚µÕFœÔQ&¶ ­ZÏ »Øº]ݾȟªßìõlº¶Ý›E‚pcÀ÷9J轒smœ-¥öÀ°Eáò%ÊoKp’³V†Wn„9;Åޞ˜\WaWCDÂXaÜXb8à9–ä(Âce§ƒpqˆLŠätÃÀŠ ‚<_d@…µ !Ö÷„'i]I`ٞh§n‰ ÞیÊé1„M3HÒv¤…—k*:Žã[:œ"–Ñ$ÌW–ןŸû`‹¦ØÉ@ØDWI%X[öZ¥ÊlË0켞ŒAŽsk­ì=ý¤öTýf¯gÓµíâw×ß|æ7Ba=S0²lÔ$3&3-Kõj,< +–48èÄÁ ÆÒÊ'í1Ì‘×S ֜½W©ù +úþ®U$rw’¥ÐÚ3‚½g_åOÕÏöz6½ëÑô6ÄÏ°‡GY8)OäV‡u ¡p`îg™%ÕFáùr ó Çhjž°ay#Ï|0c³ËÊËxqXºs–Ë`  x ö #cr„®%Çy–­]†±î'ù)Îò‰¢Ñ,äSe$…§î–A?`»XOuè"\±#šÊU*jdˆ™Ò¥Ü-+‡ s…Ÿ#UN£øZ‰SÓœdæ±«Ë Ö¦½édŽ JZW—ˆ³³l£®Q£Ø«þuþ wÀ+Ûö´ Ƹp˜ø&“ú1Ï%aqW²¨Ù"Çc`Y KZQDÌ+“O“±×JÚu•Éñ«ÖªQìÕp5 «ï”h³®2§¬[u²žWæ]ØöµÙ7#Q“C‘–_®©MHØuA‡;âsD”EÝX–•à\ +Y‚ÚcsÑöŠœ`í=¯‹O©AÖ @Ø^Ñd½òöŒ`»¾~–?V?¼V´íß{$½O2pA `ªê Zà~¢P¸= ÊEî´´Æ(қ¨pkƒ$[À7h©ú!«©´ æÊz‹kƒj["LfÐ/e{Õ¢5ÒR"ÕºLÇÆþšÕ>.ÒÂÜ(6†ð‘@6mNpctUéϵE7¤/ªS "ÚîZ5PÆ8…Þ^¥Ø‹õÃüÁÖ§ZÙI/¿CÉ—åÀ¯ÔrøêöÃsa¼úý à¦4»Ïr¶‹ ‰7«ço”7FõÚ¾Àù#ºBu4:c„eÄê:‡!  ‘Føré”+¤ÀÑãL¿=ÜìŽýPΒLï}ÀƒÐÓ4ªÓ\É"û‹|JÁA e2ØA¢Ú³8¥Ê€ºfl®¢Ø×Á(1¹·q‚-€3*4ÊI><ϋºëh—‡%oZÀóDu +Áµkøöq-¾®è´Â$;jÇè–<]§ªã›¬%òṞB¿¹Z)°ŒXKd|2‚¨Ïs#ؚ Š8ꞛ`Í諪kÒ^¬Ô`xàVÓ¤gkkqêÛîËü9ÿz¯kÛÍïPœÀ äNt2ð„ÓÇQ‘ ¥nLÌ éj˜ª ë«Ì0öÂxCÕÖ)ø‡ú"”Ò™òå؉sXiµ…0 §;¹b' ÚP4Äþ¨êF'CÂ;„…ÛÌKJ.ÚW¨b8–• ™7dpJUÁd…ªÐëÙHM†l䪜j~>©èŠ>LÙ +Ã,+I;¸†FýÞ¹~¯üC-ƒuµRœgäY•8F`¬”þ°1­lé•2ð%~/íêbS ‰NÍßò †ªà­rµ4 +ÀÓA4Q§D74xlPû$Í©þ¦2—<^Ѽ9LŽíS–Ô©UɎh:/Me‘ÇR4k? +x¬+¶7¥„ÕçFAR=¥Ðùd‹õtٟr,OàöÐ%Zí^nÈrüš]DŽ‰Ðìo”oáñÙËJ±Í!žÁXۃr–¥¾*û9ôvÂJL¸qmÜuÕÀÓ]kÏ(ö¢˜?èï•m{ÙyeýÒÿ†•Ï£ì冼¨ ðzî` H–å<)<Ï)Ø•Ô=(›wJ«Êœb­ú«FÎ*·Êàޅ¡µµZ)öjý¼ö wÁ+Ûöµ™ž%á\u’X̗k2pØI¹kÕ,ƒ …å0¢8œà` ~¡=‘f0tu9¥6j¯:¢]µ2B ÅÔ6ígãõÓêS­Sµ¢“n¶!€ÍWD¼Â©žCõwäÉYq‰"¼©y‰’9¬²YC¥?‚ÝÆúJ&tmšçVYG±VíU'OË®« n‰úVò¼~°}ž?è]°ÊNûڍC€KzR´–è?ÕµçdØô ÃCó”+£t´Hs£<¯ÒKJóÜ?H8Gé*sJmՅ #›a¤U&\•1\Þ¨ÌiQ?®>ÖºUk:éèwf,pT7“ GþìŽólfÞيvÇ15'8²*ÜVPÜ!PïPè’rÄ;°é)Óâm÷I„¢|6ˆy‡€ +YÊ1ï3õ¼VÐ;ž ÉHz§¹%α¡Þ)1ê¯ÂÞÁtò…½£d9 ŒëtˆÎWÇ?¨Ð­¡ïІ‚*A +4ç©x­ãѝòÜÇ'C÷ AÛ»º*¥6ê +•‘Ë@e­.ikʔk£•âòcŠ¡λU«Úöó²êÿYpðtÏMŽwmdETÈ9–˜¬¥¥!ӝbC°wȽUåkÒÞt²üóv]]ÙÌÑ­Ñܛ­ýãü9ÿ|¯kÛώÛÁx!ÈZ5·Hœ,r—¼ŠPK@”ÐØGóy¸ðÕ)¶M„áÄyì °–—®®J¨m:Ë"&=€ÙZMX[q雬ë·ùƒþý^ÙIG¿CۇC­±±ˆ0_EP˜£±²†`÷¤@Æg±P–º(Ó@÷#¸ƒG@FZò4µð§˜h¤ñí¹Šü‡ÄnùJYƕêddr[ÈÔ#@¹Sõ “mºG ÀÕ¯ªHÿc"(…6Ê ó…¿êd‘ƒ†©”%Ё%à“œ,J =XÁÿS6ÀD£T‹† ]F¯ˆ‘®APanAÍí{k\#j˜«Aðx„lÞs*ºPJ:5¦ '@$ˆ P{ 0šÔ0TßÔt‚&‹À<ŒãXZ˜Îä;ª’•Å @»ŸK'€ÓŒqºzO-Ñ@ÙvòrC•—r;Ÿ=_ºPJðõBt{̺šœbMڛN«>]ë(lêÃœb¯Öokú÷{eێvJCEÏÇG"­à~'{v}8%õ2 Á^$vXZ«F±W Üß=h]eNY·êdÿ<¯Ì»°ík7I¥”£›ÐY˜°.Êøj ⼂÷â<‹ ÿö`h•5Šµú¼.A#f«i• Ö½ÖªQŒøçùƒÞ…ZÙI_ß#4–°5$®Æ 8"Îç‘kHœ‡8$Îcç»5$Σçᎉóø5&Î犫!kLœÇ8&ΣçÀ5&®† 8$Î 珬qî@ôNx4#âºp‚çñŽˆkç+DœG8$®F8"ÎC +V€8)¨x¸Tàp¸V°FÃÕ¸‡ÃÕÀGÃÕЂ5®Æ8®8®F¬‘p^àP8/p(œ¬ p`àP80hî÷c°†ÂÕ GÂy”#á<Ì`„ó8GÂy #áNw燭áñ×H¸Žlð5‡ö;À­F¬p(О«±­®FéiÙl^™£Üj£k4œ\÷œw ÖuÒÓõù@pþ ב ÃVaþåæÁ+0œÇ ´Ç,ª «È)=2­#„­Õe(·Öd†óó§üÓ½¢m/é¬ÍÝ ;Ÿ0j_r2¬Y´Tô“–jé)#3ŠYp L¹PXXs_—S¬Ñf˜P²l²‰ö¯ÌD„®Õ^hh_WŸk¨uô´Û Ÿ¤¹oSoQS QW@#x¹!œ›ÈFI'nª·ˆtō=¦™ùƒ8;çÐWækõyµ9hDpWY‚úVb¯úçùƒÞ¯lÛ×~T?Ag…»rȪ¾¤¼Ti¶‘aNcZàïqœwO" 8¬ÓäjŠiî*kk՘~%/¡æ]«L(y¡×»¶Z)Öjý¼ö`íB«lÛ׎[Åb² (lž—2FÙPvKJ–Üe„°¥÷u-bħLýƒ}eN±Výðsr™ Z¬•ÁfWº6õg{­~Z}¨ë“U³íåçڛÛdnTH£Óˆšz¹!ñE3íf•‰yÑd R÷ÒQÚ›ÇՃâ£#]u2d¼Ë€a¨¬—F’J0•0àV´Ü?‡m7.}]N±6]›42œ5€j´ÊÀv,]£F°7ýãü¹úý^Õ¦›ßÍ¥¡g Þ$âC.Äv2ÌZI…45)"×’(㌠sÐÅúÆìʱp0cS«Ì)Öª¿jäI™E«L(¢Ç®ÕJñ¹ÐÏkz¼²m_?Û! ÌRP‡_Àï_®©¥¦†˜ÍhÉ ©¨e\ûÐ(&ŒÄšmÑá ™ ºÊœbº½GÉ2t̏×*› ™j­VÊóú½úyíAëA«kÓÑ6‚Ÿ3Bî=oŸÑ¿Yjj·´7­*²[º=ä±4`7h<«W¸î‚X•ÒPÝ°@Ì@b îŒÉ¡ÙµÇt˶¦‘¤Y;3vD÷Œ´„x÷€îÄtÙ±á¹a¬¥S¹Â¹á!ún…æ†|¨ø-ˆv‘¸ÌÐ°Ü È|*œ=”[Úӈ†ŠäžMGq ÷ Üì$=Ž;­–ã΋lꊛ’6˜Þ +Ä S²¡Æ Ä=*Ðrl nb€`±\ƒ¸šËËF_#„9ÊæÃ}2ó'6Ï8ñp=‚»QͨŽ„›¹t¸lÄӇüv†{ƧJÍò‰Åҝ²¢Fè¡ÔjëV‘¡²[{=z»}V}Ì?Ü*:éß{@Ÿ†Pet°aÝvr…n/È¢#?Wä6|ü¹nÃà nTqÛÂàåÜL ¶Í|@d= +>*2µm̱ØØÈd[¶üÂШJ HØÁ°εÅj‡ž44€ö°Af ’ ´4W‘=AÝÙⱡ½7,öd_RÖȇeRek"&ÅöW"ÒñO!6v´ZVlCpl|{ LÆw ½ÆJÍqiÈk4Ày©Àk¬8F¯€×¹;0Ü5ˆ–¤ +»fŠâ”6¨ka>id&c]ÃpÍÇ*æºd#¬ ×#ó@­ªë¶8+äút¹žpð®ˆéZ!®ÕPÒL&Ձ«s5“­ÐÖXÁ”úü1Ä s«§zès£DºUd(êÖ^¶ö¯2bûl«ç¤w­ÿ0ô¥”6@ëF­Ðh³ª;xA y‹±!—‘5 b-çóÜWã„5ÀºR+$ºVä¨ikn ®¶oªÄöÑVÍIßZ·ã±;ˆó˵B¡±qù§£¥C´d™+T5lscéžÂÁÑË멄¾¹Q ]ë1 ´7Öéý“êCޓZɶk­×H¿Åd+(u£ø:ö°i€~R˜V"Y ¦?Õ«Ó*rBgnTƒ=·Š ÝÚëÔí³êcþáµ¢mÿZ×a‡‚Ÿ~ž®ÄŠv–ý¢y8+ Æ1æW]§…ñih¬?&¢Ð: ¶VæF5¨³Wd`ho®‡LûGՇjOj%›ž]rðÁÃ?1—ø +RÙȉ@ߑrYEJÊ9^r‰D%\ì㜵 [7sÃ[MNXaZ1^Q…Iz{+8eû®Jnß^«:íäw£Ó|R֏‹’†Ý~}÷ìÜ8Çû—Ou÷æùÝ«wOÿÛݟ¬ö¸ûÑO_½;ó8þzöÛwځŸ½~Þ½”.½ô«7w¸¿ûãÓ_¿þãÛÚÏ™h%—¾‹wòüýÝý׿wyh곯¿y*czûæõ«÷?ü³»ß½{üÓéêýÝÛéèáõ ï¨ÕÍwôŸï¿z÷û‹3{óDïvºyõ•½üäìeOÿõþw¸ê‰SÍc´,â|â*DYè”U=•1˜–¬­nz2¸ù‡ÞøT›¬ 4üÖª]½°ÉÉþ?ëë8O]Wñ½ó‰r9OfG¸H ZN§A/ïžêåÝq<'iÌ6rGFÏ>*ÂZ5 ˆ|3€Û×H`OIp´”’¨à Ü«/Õ4¼D® 렒ШáÕrTÈÀj‚žÝ;#¹Lr¼‹jFgÈt~ïD†©’ޝa±ë9Ž#„‰©a@(ô …à_H *9jq€C§„ò¢„0µÞéMA¹hko×ó—2|r.kßäT_R`N‹…#0+Rr0ÏnПg恞iVû֓ã<ê‹!.JIœ•„œÚ„±Ñ`ؽšP³P9< ÐSÀ璅ÇeU6cœëì!%}G^–4Øý@ò*_Ãñ[bby¼ÖÈî5k†Y<6AšH +S×,q¢iåà¡ólñç D†“’f⬒‰ÆYÍÀ³šº‰©}Ýۤݛ°y´A‚,ÂLR,¨ .¤öj¤&<âÞ¼h¦ô™¹!¨,ÖêB !n¼5Uµˆ ¬Þ4ô)« }à`Œ¼āN¸@bҏ‹4Zed€ýc˜-Žf6v` Ý®® >sÐ¥h i‰˜fåFÏ!Ñè)·é‚´¶<Áb,”¤?rkÛ<¤Ìþ±À†ÁL|¬ŒE…:QDŒkIIÁ¯‚(0WÑÀj 3b¿׆(©ñ}¸'‹†µóàoFd›áýšÚ/ ŠîÔÈÌ~0òaí!#ê책ƒîò&8b Ôp»Lê~°‡9u)Ÿsš´vxåˆÔJ‘ãfý9º[^Θ1žðd.òuK´èGIDa¦¥N!3E`”ÐXƒ¹ô´0݊…Ìýx’:ÞIÆ%S_À2qoÛhÉ;@˜Ç.ŒŒƒjVLS–jYqšcÒa&˜ÞÓy0i&§C°à‡Héœá_pË BuìÀ:4Ö*ö@óJѧ`)ҋÌŒA®Î#R˜Ýs Ì,Ln«Ÿ­·=!•½ˆSÚ9X]&£b[`bdÄ1¼Q5cÑlãóÜîHÚ ¬uËðŒËÆ/N$È+#e£ÂøpOo—Õ`âE©€èòôŸ˜j×h‚Ù¼]2FEŸ™¸ŒTò |&OÀ-6*¿¶÷„éœEÅNKøZbïÚ©r€ ŸJx^Õ=wëc¸ç{1Y""¤Žv+,C}mÎ8Ký¢ä!Á‹6[BþcB‡0œ@ÉƁÇÞâì 3nê~.:ƒ.Ҋ^‘p›GbT{h,òÊ Ù¬jù"’"D…áÙg}>¢šgf'¢×ʔAï ~â Ù6Ìa”õ=j:B Wå{˜¥õ¬´îÉgÉÉ –2`†@X„×Ñ:¯LgR.‚ ^r'èéƄ¨”Ôô¶ð¶b&Û’rá™J¿Š¿Ç¯Ÿ—ڝIA’åOHð=ƒ04y=ëCfçd)š‚¬q\Á” +Øà SќX‡*æs´ÓX“S1•¦ºPÉä"C!x[#Þí=9û0¸Ô'‚¡O‘| y¼%)ã £šbŸ»Q$“« yÑÄ\SÐ-E@ЬÒ#ÕAU'O V|À‹‰ÿ_ô=œ8yÐî›u+ð Ps0xŒÖ¦cĹgsˆX¢ž¡½VÙ¾²01\] xA[“ýÍSÐA"â#[*5nsèeI^%‹·½pǀOàäT˜çcM†ŒpsoZž„F›jæïãNCê¨æóF „<oÁƊõª ‰†£3jÎÂÜ× ÒMNKƒ~.Œ¸ø^rŽE2£ x5ø”¦ˆœ3RÑË8híÂhxá5f©ÿão\s²pP¹A‘„R–Ê’[Ÿö bʁ¢fæ3>5‘01 ꑇ„⣉Ä`wXÈPM1Ç3HYâ”xÛ~;µ˜Éx‹™7†`©#VNÅ6ýÙ´‰Wþ©9Õм‘ÇãîŒ +ÛÕx¦¸•Ê#ÔCIueFƒ¹ÙÔ!‡^$U}ž¢\fÀ@â¤5°2 Ž2 +&ÅáÔ¶…ªG}:ˆ°ÄK&¿àðù{Hȁʠ6ðgDœ`R4ƒô½:¨cbH±Ažåa6”pd®tÕ®h2ÂNdÊÑP—Ød< )Rl…M º0‰;Œšr¼9ì;d„-g®Fñ¢ž!Әé¹Öæeˆÿ(¤`IÂ,+ +)–=N#bÿº 4h€ÄÛÊùñÔâÔô 0Q!nwî4̺j¹Êt£pcÒ¨€û Ö^*Ž–Ç '³²rpOÄ癅 «0.L¨™V|mŠ²EQ«pm`É#†¯ âÂíPK{’…¯  ß8hS5—`яÌQO¾a,ZÅ$K™«GY_µ˜5±Q† |ã*•Š<Â4Qàœšôê%NÇ_‹HÚԅËj*¡lùì@`nÅlLLEVåÌ_ÓãÑ 0¡/Ö/’›r(q<ÎXêY…­çÕ4N¸RQ 2 8`«T?SòœT‡ôÓUw%ò|YªChxˆT®i°œëÏ®ñ:y*…œFrv¨oYFH]ò€ÊJLjv€*Vx /5ÅFðîàHс'×Ý +€ºÄ¨Eæ’O¼±V{Œ"7¡Ó/ó|U=ÙxÄr¨ÿH&­9ûíIÑ4ÙÍSéì‡ ÏiÔ$¨3Æ ”õee€:@‰¼Ú”Á¯èŒp ¦eý*¯VÐ6J4Ê¢yF¢o¶±ÄšÄ.®H ½q“yÀjçl¦~žÚÕPT²ÇIO}%Òû©Áдœ!mv ¦`]Ú(8 ¯(`7†´9ŽzÑÆ8LzòÑi¯b:F«1ñŽl1;€i¢&%–É͹kt5ƒ/¹>ž£™Y¿ñ—ˆô Iq©”WíU`ú“M²fw +¦GðhÆԁùMvõϔZjØ`Š‘ÙIӁN¼Æ‰ô1ÞȽ^:+Âõ^‘QŦrƒBi¨úT˜vT Ñ>ó5M-9*Ë @OÒ¢¸}]õȶ•s‡ÓçJ™«€•…¬¯ +ÿÓðIZ IYüF{ªoQNêØ`¾¤hN´ AÃYÍ#np›,ëû8Ò ¹XøçˆõnQÜÎÆY½.Ï«ÍMÙä¨P)Ô)E !®.e´<´„ú›± J¦UNI}ÎY-\5 (ÜÍ¥rщ†jl-F>2z!> ÷ÌþËóû‚˜-[n[^™É[0ýÑuYÛ¸eÎnیƒ;`FF ÍXc!Ïj\¯Jmz`â„.õ¦Éì‹Å¼.&kñ¸ÏÉ(lrýâGÜ25}ªe ó:O4}'b·Kf>CTЮbÀŽ† –N(Áj`†©Ž6]šÖš¯p°ð¤€ÕÌwa¾bû¹DÞ¿øƘ@(ƒ˜ÉªQ íÌ¥^ÚUáks[=ðAÀ»$K!2jØÅötZ&u×0µ¬öÉÃÀ´†AÍNX×Tš^Ù¹08—&!BåœíÁÿk¨ã¨Á¾3ÎñÅô6`•Eú„\Ó‘ +S¼iÐ&Y‘Ý´æ¨1Â4¼“0vûŠajLîÑÙ¿'Þޙˆ´.6:-¼ê¦áü@¢¨ô6wLÇÏ°3ê†Sås°¢†dGîù ½Ÿ22®¢uà%M¶Ë¢pþȏÅï§Ð½U¢]AŽ” Ð|“Ck ’3Jù‘ Û«±!^á²£…AW"Š”«z»'Ec} &‘”:2A”¥HÙÛ©xsÁ<í ˆ"!ðØ:Y·ATaŽÍÁªQ}Qö~=qÍO™‰ØàŸx¡Å|Ü€ߖ ˜|Tt„˜¹ô ržŠÉKPgnúä&Pù1Á'ƒÜ[C¦§Œž*‚ÐûE­êí-L3ü¸ÃLE4/ ´Ÿ¡úXTÚ¨X Äð˜Ńò 4èØÏ6‚Auö¤"éE(êÝrîLKx%F»ÃQ…+. +øä¹MãÒü¬ b¸AK渟᥁ãN}bÜ55ô¯!A.L½“=E^“ŠàddÖXôµÎ]pÛ,<‹®5¦†„ #*!>¹¨¢Í1¢–`¦ ÄjM!Ÿ Ÿèu’'+Ð<Ù/ï5‡Ôå±*nªÍ j{ +“"Ë@ Ä‰Qq‰#‰ôäó5ø®˜ +"k´'M` ,Ýk<Öa^×ô9ƒ"˜šM„qÕvNâÇ+œªà"/¼›JýMZÎ8ô\÷þރ³Œ^)ZšL͂DÅ߃¯"ėÔe̤1.Ö0«·›"î5PTÓ¢'¬övýl=²fRíªdäŒ}E‰ª¥µg^đ{(²;t4 Î †ŠÑT~MWº–7«,u¥cÑÒ¤ÖÇIÉRÑäWT©XlL‡vì ú–ùó°Õù3¼ <Ý-¾†©Á3ð)Úʐ¢Žö?ÈÄ8 µçp°f³cû¤ºóÈkèi¦v\;¹»F‰‹©?Q^] +=¬Œ…ÚÙ2¨{{J:CP3RžL‚\Ît,g5 ºVC/˜ZÝð#Á´aÂÑ;ÖxÈÜyN5qÑ¢uQ¨+ 3ë!@ïìù»t n5ER©¶ ¤Qᤖy…'6¤3ðÇ{W2Ý°êÛfz9}ŠSÇ+‚ Äc”¿Ä„Yo˜Ò@G^˜ix2e‹˜)œ£xbrqvÍ0dsÈ Œ®ì¦hØþpÕo%¸¶È{“ã’Ó +Á3éVÑ| •5u0ÛAd–;¶’ÀÓ"èHûkt`ar u4Ç} `ƒ«‰€‚ÿmvÑ ïAL@¨¾ž™5ñˆ2Êf9ÄÖR´ºfþÙ̒Øæ<ñ²É…`ÿŅ¨<é`'6¨ŽC?r0¦íõ$¸G,gJ‘pÓ^E¥ «Sü32ey1è~Ó¾ñ¾tìæ¤üq< +àvŸ-ðŸ~t ìF¿òTˆ$€Úї·ËvF}@âó×PµXòv¦/˜ƒ9å@€ÐM䧋±)++·í!‡iËy°GGLp¿[÷Šâ% ÞP—¨Ð@d;  $1bïpe“æəGƒXƒ°(AQ9sPÔ<ª¬kïµ\#]=¯H#61-«÷ȶXsÃmÎÊDÙä>R-H’É(9«‰&;Te‚í¥zàœÕÒ9z†`‚©œޜ\'5 Mõ?ÎŒ3…)ˆò¬§ô~o|&xç¬ê?~¦zà€O²"³‡vŸØ`Êþ`·æ¢Bxƒ^FûBZÔÐa¢¦92f³`êe†96ˆ±$¼y¢"LŒ‡%e1`.ôàá/´„Å à ¸y<¹¢"„@ Î€zÊàɪØÚÜ®:Dº|±Ñ?Pý +0_U•š,xûÑ}ã˜3%Sä:$Z½úO =ÂÆC ,-»¢.Ÿjeg*à¹Až‘î8 †{'m&uΆ40àt˜K•±ßtf"} ò€š‚Z%±ppß Ì¥Y4¼®YCrô~6X›xù­úüh–^¸dfwàú3׉JÑt). ½Ñ&`u„5ÖGñZ&¨¬ üÌp"&6{ݹp³| €ñ(sÿÃݏ~óîÍý«¯w?Øﯟ?ÿöå¯_¿{†‡·qfõ’ˆÑ,ª4¼¬dÅ)ŒC•µ²e˜  MBïY:xMpÑnc§U‚”ÙÚ ’–”ÁÂ~è`k>H½ô‰YïÇvӄS΁‘ê_¥˜È1+¦=ÍdéXTï2?ج¡_‡úžêœˆœ#¡æ5֋Þ3*RîÀ0¹Æ6 +c8¨À¦`Ž!W3æhñ͛ƒ¬ ìC +c~r5Dr,×÷4‚«(‡À÷SªG”0 û¨yp‰y +•Eàpeí\²É¤;®;ë¥ç ©–‰Îlå Œ6·Äêà½S{þxfUŒúÑÕ0cIBæÏ<­wA$”¤ö/¦œ†%WÛ6˜ø.³†1,*0^FÀ &jãäu  „x¹9†'>T]ä=\/e÷Aý0xÀÏ>*½ØõÉðìY½Œ³å`±»Lé6ãYwpxFôø`²à4)~MÃã³9fæ‚ p³ú{³œŒ;fÝÀ:¦^´Ð®"cP¦3½I&-œ˜ƒñKˆˆIÃcœKú?”§Q¨wm‘8ûx7Aّt=Ötïl'¹½1Ví…86!d€yÅLVR1¬ŽĬwE< e…Œœ +X݄Xjþ£yZh\æöN\xéDšP_2¤–®ÍØI;§ُ&jȨpÏdç.®ˆr(0´Î»ü?”áR÷&d:h†š´^T˜tj—¦!……°†ó€ܲ(ß+Âsádž½½¢X $ê¢ÑƒiF +áÓ +âCºfT„<üC5<Ñã'¬Ò6U|&Ö)´X€x9Lç%ê‚Õæb°æ¢ÂŸA(üª¨¼†81 G4 ¨˜qh’‚'²!ƒaQŒ½gԒÔ?0Ñ'!Õ=€m Ë®Å/1&®y¼FŠ!—*,üÎeCGÈaôýç: \óÈÈ<šìè¿Ë*éµH®ù¢øÌ":%§cҁ {˜³Æ¹°Õa:‡o·n®q„‡d¨†H,Ø íæ‡:ÕÂ?0ªý¤oéÎ!ƒ\ÔÛîÃîŠzæÙ $ÌŒ§Ti˜ñS²_ðšÇ˜OT¤2?€NTü (õd挧ÒzbÛ6k8šSŠÕŸ qe"(F ˜úP4åHS-0׊d¢Â~ ÆQFÅeð³ñzGÜÂ38d ã]@]X£û˜3õ‰#LÊ"¹y I‘`™š‰8ZlL +&†^ò‘ÖbÄ *oµø!ÖXfõwO +F,ºZHa?CQû)ØO½ÇÈ:·è5ÙDÚSÎÁq£w"¦QO{‡–þpBG‰a¸7¾•óˆñš½o¯ÔyרžbÖ甕âMb‘ÆØâ“Ì™‚UÒ=/‹õM5%ÒHJgŽËêp)K,š´vžÔá>ªâ0Uh„…vø9K&Î[9ôšÉYU ¿]Ã֍Ќk +ï·Çp%3sš;H&ãèKé;<[è.–à¨.~]Š'òùçW7Àð)ó’zÖ;‚n!3̬wU˜PÆë‚ô‹*¶©žX#ÐÚ`.}³ð ´UtìNU=üÚ˜¶xo°¨ÐJ.hÌRBÁ‚š""´÷hkï™VU«WýDMfdsŒbP-˜¨Oú51zr¡¼¥&9ípó¼ŸFý÷ð{ÀŽZ`meº6§s.ic \ðIƒç¾¤(p·k%]Ձ:•‡”¤êU°´~ºeMÛhEÃ텥ovñÄóC“y@·i_Yo1ÚµµúθÀüï´µ ¯Xð b{W‚"Aí­¢&àÅÂ$ÁNN œ4@{àD›‡¿fKd®H Ӝ7@ŠF³Ñ.meމ¼ óÐUÝïgúÔ°x4}Â-ÈL螬…‰É"gE¬F³q!7klq0ÆÁ¦ôåpe þÀ¢ëzB%ÛU=À3´×í‚xÒ9›áŽ±š–Wö¶q¹^ÆV-kˆR$Æ5)4ˆ„È«%Õ.ëïéúO͗M}`¬ü‰¦10ÛY×|³¬qVsMç1©¹h´`-æ™ã}Ÿj±5Ceԕ?M:Ý¥ ÷€0ªE}Ð =M½!¯-J-ÉõKj ª3N@Íc *­\“ÆP‘@QқpYý4j’7S^TÑv~ü*v.‹™,VÅxõ¡NžZð0£FˆóÌèJ;´˜0uú2ýû8c@%ƚ0€@NÖcãaÒ^7ƒ#à}aÒ>y|¨Vßl 2pïE·VFµ#{£ç=V9èçi„(Ý£´Øk1¡¦ 5zzPk(“¨€‡ã¶ËaèR«pèC ͟Mh ¦Òñ ø3€õÌí¶ÉQÔ°XDölá* epf›Ap™Ÿ6th¼çô¤½£ÌßÈHyì¤ †YÀ&Ïܘd£&ÃáÎKöÌ#Ö`²ÈUÛå³b˜fœ8+`%uó2YÈÉÂ`ý5"ÏAÕ𣙹’zäø#ŽËdé5ì­¬á*É@ЌF"ð£fð‰–Á"Xò›ºI.£FÝð)[4Þòž;3ö¦Ü›ùáӁãEN „C»@€o7«õ)‹&ƒ§Üš#3CŽÂiöHâ ¡ö±^–>òâ+xÔ…ËM¡¯Af³È<æÜi¨Œ`ö'‡m $Ð²\£aMtø¹kÎnÕìH³/" +g³:µÍõ\\jNP3?ÀaÄ¨‡w¨±½3#€tr‹ …<ÌáÏe=®zƒ¸‘Àõ=ªHãïÑ̀ÈÄha!üˆôQ&( X   8£®Gh%*&Ã(M–ŽiÒð²êsñ9gˆT4^“ì›ÑDÑð½áùýñ˜‹NÌíLv%†²öažjHôhÅ®‡-ÃØ`P§ÉÌ!Þ;½«fÑÏëïSE×0X=*ÇÄÒ7ùmÖeŽf¦)Á *'&¶B\¥óDM6‹9‹yqø"ªè›nY—–^¢‚ý´èWjß-–ÙkQX ôë6ô׈k@\Eh"Ó!ÛÔmEöï@+“Vx< ɖKO–¯cÕ‹Ê+§šl0ølÒ\v Ú˜Éó"¤ë9ª¿“‰/pÀ1ÅVîqjé1hGFí©èÐKz„Ú©%Âï=XX:%x5À¨·+ЈàGÆÐ×9k¾9vš7]‚›Î5Œ +VXsñ‘`Ž¿Á]ÎúؒmX4š¶Ý4ªéÏý…Ë«ßOaQÃò—8PÿA³·‡&,,†F-ŠI·#øX}ŒpÔãð +8ð ºdÓ5y½$F:›‡™‰–ñ›¼ÊF“ % +ïÃIE(!Öt%”¸zͨL›_ìŒ@ƒw‚•¤W%˜œWtßùcË 09„1^Ü C1sj©Y—avÅ,5Þ ¹‚ ~”©÷³ËÜA$¬bWә¯¬åØ`7HäJo(Ž|LÃáÑ^ÁÞˊ”8>½AàÅà³âi‚&÷Ôu‰„OÌÂUsò,BdŽr^Ü7iVŒ¼t@R±1WäV‹ªvÙ~¦†ÈÛ|·.&ª!-ÙGüÌ䐋EÀ¡ž–¦Ê8™x5’¹Q󁽍çâbۗÆGbe*Ö~A £ ™g̓0òó¬Y‹£r¿bç>ߋfªG·@ ÄX,¤ÜßãPƒŠÍÌH:|*b\æ¤ñ˜5…žz‹Di\U~Ä Ì¬_5zúÁ:h)Ú@Våh©Ê(nhP ã§ç쭟ƫbfsŠ!Ɛ“7Yª-R3,Í gë•÷Ôãê?ŒË­¡ŠZMVgµÍ}uß;9ëÊR,-ˆSc•`]͞¢î܏CÒPTwJÍVY)Æ(²)!þ |6Án*Š„/CWUZ‚³E =ÌêAM<×c•aÆ80³ái˜±¤¡Å‹!î‘nDqÞECàÕKq)[¼$Ÿi€ ¹³MµkM£8YXyýyì#&*mÒK ²åI‚s—ý!úšÆ:JãÔÐ2ĉ`QÁa‚!ËôÁÜT5;짹tè#j@j]4å¼eˌêÒeR"òÚXýâñ”uþ¥Œ¬'š´ÓÕð²<`;RSF‹>Œ5¥ÎY@Ü+OëbkjV‘£À ý©â§ñªfT¥¿!7ü Ó#if¢¡ä PJL¯c®†`™PˆQ³7arÆnüµCˆ€Š"³Ó…Î|—Åy˄:B”É'3Ê,4ڊM‡Ï.˜ýíÅ<ÛSÛ_MöðÓÄÇ™ñøä¾ÀYéV ±{?¯ù§Y£èjúc•™Q±Ï~upÖäǸú–5[îcÈ´@­ô©¡——P<ó1T[ÖÄÇÐÁ ÷¬ò‚Ì”‡–ö?ãkkÖcüŒÀ®UÖc¾¤"Íf¨9×ÇYÑÎË&ã1 •/ׄǰåJ ùŽfؾ]ºc`¿Ç<Û1¢EEˆ ·µNvÜS™Æ·¶í©Žc°»«LDZ&b®™Ž‘“Ÿ"IMtÍÿÿ³÷.=·$IZî¼¥ú{ƒá—ðˆ¦Ñ6M«u¸ ¡R“•Ðuԙ…ª Jüû³Þ‹™»¯o'Õ »$=©ÊÏvD¬¸º››½öØN:f¦OÀY‚°ÄI +t|z¦Ý@ǐƒ ++dÎ1Óð½LÎ1Â@VÌ1"!¨üMÊ1›9Ý}BŽ©¨÷ãb¢Lq| +š€cþ=ÞðÆ4>Ϥã0õ>'Üø´àmg£{9FC¶Ù˜F4Ú ;1'V²qhZl<ÌÿN®ñPÉÜN5ÆZ¡“i|Á­w"1Må hÌÙü|&Ϙåj¥ÌµõåÏb_ÁÏÅq×sNœ1 (ÙiÆðˆ•‚5̍Zé“e|uŞ6”1ÜëCŒl9ûçË3iO‚Œ‘ùG¦~㣢ôRÿF“^?¨ß Š1þ.×Î0Æ>,üÂÇEí Æp¶Pg±Œï¡Œhð‹ñQ£æ6ðÅ8w|!½B2\mÀ‹Y"ŒO'àŜÁÉßàŚ'Õ:ÈȤê“ðbIÞL3NxoÅHãKí>z9“]Ì¿©¼¼7ؐ”%ØŸýì»í§ñ^ÑŸì&D,¥ ú°_¹˜“8ªl6r±¬wOÀ0 4$#e‡Æ¼ ]Ì÷f‚‹éâ@fºì4ʨ;·+ ”j¶  ª–,¡EQ´2´øAùw‹¹vzù’,~n˼V^1Œø¶Wüx +Z1ÎYaÅP `V1>ƒCÇeRÒ>êqRñÓô©¨˜ï¾dqŠ1™ÂEÞ0Å Äb-”âóÑ7(ŧñ'¤ø´Z1 ŀ;à‡ƒQ ¶´v¢øtT-Å(yÆ/¡¢‰Nd!2#ÀŸ˜êùv'ž^üü•NLLW¹N<”Ÿ 41"ìHklhb–dbH§P:õKŒ|-DÁ%BîR­uÄ Ž{§#aÐE8æ.ÂÐcf_â]ÏhN ƒHÌÌ +ô•÷.ñÆ#n7GŒ°7T;¦Ãã:ññmò ̬Rí±²'¥@¿»r3êi93&ñ»ŽDŒÊȏ„!aãd RJú%kY)Ääi°¾Qy& °ãíÇNUÿ>«‰Ok[ƒ@Œ_"ñßd᳚7¶ò‡YòLJ1‹š f}És,?Vø0ŠñÛõ${Uíº[,ÊTºsƒ¡Š÷˜á“]ƒ—¿(ð۠ÀLc– +æ0þv¥%# ø›¥ª+qɐ18̯U/ æŸ+nł˜¯‚6üZy‘ú°aôíl*:¬aäÜá$j ãáNfMñh^œÍà cŒaâĘaü;ÆF>xÆ0vpÜ1|vy6Â0ŒüÈz€ÞßèÁ‡8| vi²ƒeSwt°‰vIÆ-ê“|pøÛ¨ÁôÆHh0ԛM½,U“×¹XؐÁÿbÞHb0"}L`ð#NÓÎ ¶ö;pÁ(êÉ +®Ön/rªx¨ +æF­NR0ÝúÝ|iŒJNðA21Áñ÷F c@‚ÅŒÿ•¾Ò‚®vlb¯œ¯|à0N8nҁýÊmpà‡yìžl` àÐøàrZ_ïT^¦*ÐÀW½&ø È­Ý;ß«XÖf‡Ÿ½ÖpàƒÄ¥íp`”ÃRæl`øaíJ40Ó繓”„ß`à×{ñ1¹À\·7,0Z$%©Àæ½&£+·”ŽKPÒ¹¥ °ã`àã +,RY™LàÃÀ¾@#xÓ5bV†¦+ó€1ðµá€1á`4`PX(õACµ¶³€«{x̊o¢ ¤Àßð\70ÔÎ+9ÀHv‹Ëdê© ÑJ†ãâYP€q«¥çVBIw6pÜØ!º$˜w…à’E +Q^›C©€Á1ø¿øwKWþos„-ð¿Í5îAÿEþŸ +ª¥¨ndCÌþ@€¤Y£¦¿·’áŸ` +ð/F<ÔwÓ÷D$;¯à_:ûm™÷^À¿ñ÷þM£Á¿'¦Žþ$÷÷Ý͝~0âÑŸ­Ø_5:¹Jr õCæÒsý½Äs9s‘àßí…FþÅvòø½Ô8ßîà_š‹ï£ì‘ì×ÿ–Gžõ ü ‘Æcʯ÷Äíz&÷—–»ÜoÜ_°ž„÷šû+l«©iJÐPéQÇ÷—(øv?Éýލ¼àþe{•öÆý¥™í¿‚û‹ÿ¸¯1±¿üÑÇöW´ßÖ&ö—xßÏÄþòŸŠÿi2Â*jt[ŸØ_&Áø’ö—ˆ<º û‹L•XÃÆþâ^ìÇØ_½PslØ_fèê˜Ô_bf±ê/ۏ¿‰ ý>Eńý"'¡²’•õ‹XäaUSî7u7“ô‹¿k=ß@¿7֜“ò{ÛeJÈ/³&×óÆøEýú9ÊDü26§pc>RW}CüòªëQ&㗏d6‘kŠ|nˆßG5™ü"Æ|ƒ¿øàœ•ï ªhï‹#Ð 2ݗTD”W¸o¡à ÷U`Þ© µ4¼´NÜé¾ԆÛ8ª©9÷Hº/ïôîË>‚JA÷¥1X/§hÀ +y£û*ÿÓ¯¤û*A0ßîè³Ý§ÍnA÷e• +Iƒî‹K¹¥#šp_v§¨*ÈSª…øìL÷å}aÁàŠ÷¥†ñ¾ÌÚ#Øx_˜ºØð¾°x¨Öý]6ð¾40û°â}©Ü¼Î‘x_vwÁX|_Œ&X_í|_i9Ar0ø•›±$Ô|ßR,Ù¿°rÍ€_I>µÙ¥QMZ6¾/Œô6‚ïKB„Á÷¥ ú ð‹‘\ìb~ՇA@_‚aÐ6cÐø…••Ãø-d·¶–€_0ön„_Yï' ¿<«/Mø…ôýðËX°áWe!¨iᗽa«¤“ð«fjgOÂ/úqJÂo!#STÞIø¥Ðû¹J"~K7tو_þÍ÷{EüÒÚk~¥¯Ê#6ßü¿~%/JwPI¶N +#Iø•öû¸wÂ/ý¿³jè“XMèîãu¤»íŒ_˜K3їŒ_X<}™ñKKä;'ã·dÿ #~y¬Èƒj‘Ô0xâ*g,¿œ¬éAâë/7Ä/µYœE¢­ V8j`kÂ/nÆÅÆ á"}£‹MøÅ;vŽvNÂo9½ÄÚ ¿,¢+„_ö^S¢Ø„_:ïj°~K¤á“ðKËe}<LÝþeI€qßóFøW¢œIøÅÀûšø¯ üê5¸ÇNø¥¯q~qô§ ùKÂ/ œ¸6Â/ø·+"èÆÍáW†ÑwÂ/~¼Ý üò+9Z~1y×Øø¾Ìô×H¾/Ó¤¥$¼#Ô­ìDüb¸sž“F†p? ø|Ž¶ó}a< â½µ 3<¢ûBt 's…û²+¡ÂÈ å!ý…ÑÈÛàOŒÙw\™P Óñ2œ×Ì^tffcáú’{?aƒÐ‘}ñ¼gü½b}Óf¬ïíé9x½`Øby»Q}¯SQêÜȤé`úÆß+Ò7m&ú¾Îÿ‚šÅDßûPÿхç{{Èžï}hè œ/þÆMÝh¾Ø‰ËsÓ|ok]æ{z“7–ïåGò½,’/ È l _R]{KŽ/ÿð,Ä»‘vØ(¾0⽈/þÆK _Å ù]¾×á䨾—[ÓÁ—añZv€/2{8÷à÷âD yð{¯hü°â{åm*$ŒuR ïUÂø•ÝK›(ÇÌfcÒ MîMéTo»”b‚;ÖƙÜ^äW‘¶Ì1`—6j/5¨ç5´cµ9³÷òÒrCö²÷-+pEì^'°çêýÆëåɀif\ïðª1h½D°AµÂzY톗Ӭ^ÖÄA©dTï<ÈBêÍî¥õFGñ#¿nszA÷@€˜Þ+@ïÆïBa‘wƒôBŒÆ…Nlôpá„^Ől[½¢>Á纃µÉâóÞVVlx^Ñx‰ç…ºñû ó7Œauƒó¢nâàՈ͋Õ+w¸z:þ^ɼi3˜´œAPMJâ¹`Ù°¼Y;AåŲNÍi­€ %‚+ý•Ê «Ú (&F!Êy'•—«Nÿ+•—È)6ê ?äu©¼Ü‚tÿ•Ê‹ÉŽ¡â òÂ#­â8²¬«h<üÉ‹e¼â`òòœm¥úhø·)º³`>Æ©;À î…š‡„ ÅWۙ¼ò0êL^8Ü“—6;X™¼tÓxòfòD:˜¼•ÏéÃü1™¼ Ö¡(bcòÒÊ,¢™¼ +áÕ+¼ ̱teò2îÙL0yÉÍàáÅä}ºÞ ɋKçê?¼¹ÂŒZVDØHAِ¼jŒ)O‡H^pÚ=ÇCa;EÍþ$¯âwþVµý&6"/#Xx?ƒÈËÖnAäesÉFäM×ÒD^¾5ˆ,@Ÿ‰³•È»Z«{c0D^R20xmD^ªì»€¯ÂwŠ\®$ò +RŸÈKå#µ e*¿h "/%N‘5*X’eVd]«þ—ý¦v/”UCß#]oø´ÆË(UWéä„ñ2¢2îš4ÞӍ—v´Zk€h$KOEç4|7ĵš7/C‚'ᓮŸÂ:Á6ãxÌ*eçñ"ÚÃêIãxÈzˆ ’h„µ#JãO/J¨úDñ^HÊ\%Q¼€íßmñÂֈž‘®ŸÕfýNïåïbÃðBe‡üƒ)¼ø}  •&êÁ{¹mO x/$Pë™^DrÙ¼—ƒ­Áßp1’üÝáØކß䉘ãw‡ƒ†Aß%êÚÙ»lՋлƒQàîg7ìî0?(Š~Ñ ¡Ÿ îâԛ„Oè.ûW#igæ.kÔ˝ÈÝn©×FÜ¥ ๸‹’=o ѳ¾ñv±Å'¸]¬ А*h»øNüۅ +áý`íB…ÜP v†í;g¢ˆnf÷D}i2v¡ÅÁŠ{CìˆØ]v¡áAÜ&@¹Ðø˜“7 ïÏ®|HàuOõ]öyø½³uQJO™º Ã!Á 뢪†’í¬ h~(¸º§›VAXoT]ñU÷ô¤P]œI3œ/Sȼ#ªg¤.œ— »ðYÀThjŸ38¸^®­ ÔÅ + ïmðtQU ׆Ó}Š>îÌ0]H–É×[aº0bØ –.kŠžž(]h°ì[IºkŸg‚t‡Ðƒ£‹¿ã‡’£ËÄÀaÁÖ¥ ¿¦pctQëØÕFÑEýbo“¢û¦ÝÇq䍡‹¬„^“ˆe1çC‹+zV­;C—Ö[Mì-!Ú´<ÉÐe(îíÑe«tÄ¢‹yŸa¿€èҀ8ß +ѝQЇ1ñåE—E vl]¸:ñr(cÏ +Š èf¾x£èÒCco¥k–rF +ŒîÏnž1F÷q®k§è"ä{̆aß(Þàšè±Òh'袖àp74ÕÅ=ÑâËü\ìÇdΆÏeåf“ÿMzî܀â26ÇûÏUeD¯Ë†èۅW>é¹3Ñ´âséÃSWø\®˜Xhz.#†Ã¥u“Ë¸á¸\8à€àÝTBŠ?îÈy1á¹*ºë§¤çÒ¾=—{°,Èô\^8¦ÓsóËp22ðAÏU=óõ$=—I5–V¬ô\FàÙ:ð + Þ!ÑjÐsé.ã mô\:ZÐ&=IÖa…Àø°°r£çò¬ZKx.‹mÒx.ë0Ênð\ZùµžKGÃs9Ò¡pbƒçÒ?Ĺ<†Š¯4à¹0P`¿Ñs¹;>— ôâ +|®Òð¥$?I7?—´”.ÁŽÆJ`· ~®’ Í&?—¢ T{?—†&^®ÚcŸÂ÷®ø\$øtύÏ%(ŠÆçb Þ¦ Ÿ }›Û>—y@ƜŸý< +‡l]͘IÏÍàl`^ €.ò0|Y6€.¬”QtÁ_¢]¤Œ‚Úº$Àaí]èæA—(\7‚.™H]ájΎ‚$%?—{±ìgåç–Ó¾]ðsQÌEIðsÕ~£ç2›VäSÉÈsîrÔ? !!ßßè¹°êÇLÏ-„µ'é¹4 ³ÑsaíxàAÏåf¼¦çòÈExèIÏEr’c]Ðsñ|)¬ |n6~î´ ‹Ã3¾dÜBum;@I]zj¹Yõ(ºÓ°tÓÝBPÜ$tóÅܺÌÎ>“ Ë‚käу ËôZUé×Ҋ¥]0t™\ú&ºÌ!м1tùÚcMK†.‹¹‘‚2C—ÿŠ•èÑ%^ ®t@t™,T÷ÕXÀ#4„¯pèÕx)J.}*jg]~\Îs¯D:½Ctñç@z1 º0\,ÍReX™)Š. îcK‚ ‡ԗ§*•kŠ.sÀL[EÊ;V î]«®‚šk-ëNͽ15ÍTD{q?©êTÀÊ̅Æù]3s^C´3`´Õ‚¯˜ #|Àæ"x܉ËE=f덖 =ºÒR‚åâoe¤ËÅߨ3ÛX¹¤£ÓžQ¹PÜãõɳs“ò”Ë| .`ƒsïxÜf½DÒq!G7kB`@ˆa‡ãŠ+ظÍÍ ’ÛšTY;·=ÔÉŒ‹$-¢êñÆ Î6+·?֘ŠËPÛÓŠ‹ ×È+q>‰¸¨ºÑü,%Í°`lãáÂHÁ”q¸Ø‰bhÓpKyvîi±V°pO7& îÑB…^†Ñ{ƒp!á@@,8¸ð(ñqn\„]™k3:ƒg2pQ#‹5ó†ÀEž¾öàâO8‚‹}ðnü[ÈtªÛܱhý:Çô[¨Êªð°~‹‹D1J°oqø9Š`eQ_¹ØE„O(K& ˜Nïwro‡‘öv¸eCPo£¶: ·Ã0…yË®­'ò6 dM¼m®êވ·P"V±0%…@㦳ïq_ ºŽò$íötk©€Ýž–`n¬[³Ô-xðւt‹_*&ߦsÞ]Vœ[ø\ðks‹Š°þ¹¥>Ú +3nÁAÁwdÄ-îÞ¯p #»¦p B&ÂöÁ·mN¼l|ÛÖÞ#d¼-þDa£Ûâ–ÀY ¸mÖIÚҌ9Øж¨b=œÊJšUŶE>ōkËâì¯è£@Pm‘4×δ­v‚i‹¿Ü ¤-þFz#ÚÖ®Å_m»_ ñlO@o8[dX\Rf{¡7`¶Ô1Üçβ=шìèYõ†¹^dlyBôa#Ù>,»/dÛrKŽí¥Þ;ÆöTx=)¶Åsª!¶·ôÒÃVu%¶7ßæI°½IÊx؂=Aø½ùµ·JL¯½¥zc×Jö“èÚËb“k«ë£vrío$Áµ–Å&·–"æwl-Ã}Rk5³$³×2ޘµˆy? ²ï-ÛC˜XK½O{Ö6y9Á«­ž½WËZè³ï´Zè@ƕ¬Z¬=ˆ' TíP­Éªöõ zORíÉXb P­Ö=½î Z‰)°Þ3¨Jwð–Òå`i°ÐIªe¶ÿ”ÕðþrˆúoÒ×øÛ{ßS//u“T á^¡Õ·*8µH¦Qºbj±²‡‹”ZTŒÃ HíézčQ‹ê‘^Ô,kƒP‹¿/ýó\}œNÁŸK„üOKNËè;ötg§¨ÂˆÐY`Uœ/›hÚ»dj–F¬½yTà –÷—ÆK€YÎø»(׍ˆ- ž(«Ú¨´ˆ cv (-ê‚>óFHæ!ѵ!iï[+ƒ@ҒÅz_ɚ©óƤEîHÇ-©kðhãï GÆ Ñ^ž‡ƒ2 *–¤‹ +RFVl¼‹"¹A¢Í¿WmƒCK|îý$†ö:%ÚØ(´Ñv¡i)$a¡å`В8§¾e‹yª˜-´—Õ9Á›Å«Þ´ÓŒ4á +)]àgGdO0Óg!Ûêm6ù³â5Å&âàßu$}–1ËãÜá³´á öìíîKÁž½ÝM|CÏ2Hڟ Ï2+^-gEfh˳qgƒ™ØÙûvc  ÎÞþ"wè,8Ãx‚9 ¤-²œÅßU!êIœ¥±´Î>X/‹Õ#ªvà¹m¸Ùgv•céa¾cl–u/åÜY³4U¥ž£¬O…¤Aš½½ÜA³·hZ‰™}bÑ”YV¦¹—ÎÔ"“&ÌW3fqN¬œ Ä,jqNÃi'b1HNj•÷KU˜ÇXù²w$7—½ì ˜l|ò\’N…—½‹î`"c¯n2܆–_…ÔÁ°"åóL®,ÕÒ×ó†•i„a¿ Ê=ârdâ®cVí¦ù:fá® w‡"üI”}Tɺe‡cÌ ”GTšº`9 +RvŔæá$ÒËN.´7¢,Å6Ü̋ ”ÛdŽHw…ØN”…Ò^uÕÊRžï¸!n-Ö0Ñl¦2‘f*ÍãÑï€#]ҝ¢ßY²§‰’EŽ ÄA’¥l‰yç•$‹Ä&V?’åÂÊ[¡¨–°Jç˜Sý‚©æ;ÀÚä^%ÄJŒ,–-ŠÉ­َ%{©óŽÃ ºr3d»å‰B]uæNFæ)²ïîÌçoî0ý=AöïFe·.æ1ê‹ù1Í C8”ë“š–GIê誅`ÎrFóvŽžðdýÄm¹Äx,HGþäȌï0¶ €íëTS«JN|XPVCá)\R‡ ÖV÷”k¡ x̄¢å6ËÍeOsߝnIûiä±jRÍ_Ì+e1$L£œÂ ¼ª;‘3ùäõ©[KÔÃÑ0q ovWìéxÚ%Oçb®Šr«Y”ÔA „‘`ieٕbÓâ: ÜÆk^HöO5ÁD üΦ X°Y*å XAþ¨C2¥¨xÄÐg°[qÊÀVâ*ù) Xí¥ÞÇXUŠ£ax±³=6hkÝ8‚ƒÚÐúšÄXögâò0¥\|©„®Õ%Q„VS– ÞÃã¿)§e‘íÜO,8‰jő ð‚…+%þ$û3Â2¢NN=Ś~’…T|èìÖu¸¹Uõòž™©‹J6ŽgWKhºÒÞÂ"U1"îw ¾ÐqB­ñ¨è,A§Ð‰¿éîhz»¶·‘ÜyŽË½ËqwÕÍìB—U‚ù½†·FKɳ…·È®œ‘‚Ea%üÉ +°Ô[O®$“Ÿ/êxðþ T^ïFc[È»júD[ÈEãr;Ž¦6×øÈ¢ä™-®vîv1|<¬ãS\ ’$"¥£i¹.mÈx3 †W–Ì敇æ'˜éSÔ $Ђ@cei2>DZ²|%<þÃ,É™´Ü£»ð×Än¦!+RD„ê!ö ¸ø…áAg7œ+$υåõÈâ܏ò ¾ÊâŸÄ‚™0-08žâ΀ŒÆñYã5Á²½gŽfv:¼ªVK´p.„æ b žvU©µrWVUÒÌì 4¶Ts\N·Ãr«7DåÆ»V¡ØØ +ˆmé°|b—à‡Ù̍ZŠ²¨˪Èxߔ@dYâÍÁ*5ŒþJŸcaf2‹`vü©sÀ$C Ôs”›ÁÒræF­'€î2ãÅ"HóH\»qzy4aqžÉ›€÷BW.Lô$d‹óv” +ï- žPWAR VÇü˜EzôZ”@#Ìw¡ +àÿòËu›Ì,nÕ鏊óqÜ÷år5ûð9—CÇ0H< ÒUlÈRªËj‰ôPÔ‚‚XØG?˜-DQà¬Aàƒ²1W­ý±–TòÓWÀ&s…ѳ¸R#è%rÜL| ¾2®´¥3I¹éíšñïÓ뻬˧¡…’R±h/»9¬3êjÅ2T$viÑõwDÆfŠQFà° Ä …AÞ.ú«'#t̄@ÀÂJ9Aè¯ÁBÿ¸‰·»Fõ+âEýº„ßy-Õ Xg0õÁ±Å~×é.¹!‚¶’YX•M1…o¸Ò¿<-FYÚáV'jbÆ.qÕÝÌXTٚ$×>áÃ/j3ñ§Giúf) ¸kNódk^:"ƒlaQ,,“ã6TU£ªèºR 6ŒdG³Š‰põ|NóWË-j_úÒ,JàÅÙ´Kªæ{4Ga^lr§ÜmD³t§`UGììÛ Yc‰î`)÷ÔrkÞòhO®Æ`l„Mìo=NʾÔÛ²öW¡@õ–šƒýq5pUK./§|çÀ¥ïùVr›®Ã¯Û à!mV33ÃÕrW]ñ‡~C՟ìt«¬ú„ÁrÎuÍ„F ]o½¢÷ºqÃI¯Ï±äû‡/[WïáÐi‡ã%Û¸zÅÚ +ï +ä,+À!í>5R©çéåPiaÒ¯j¾"•ÊÈüèÇKÞ’±Ì“M%©óÀìNôLÙ]t×¹‰—…ãû¡ w¥J 1ôùÝôރëóJ7Á¿°FëÇ^}ßFåî³¹ƒÙe¸>ï®!”i1(ÅÜØ'ĺ’²sC´SädyÅûxdKÛÕÇMi[9Ÿ¨­èö9¨%À‰"¡qò+Gú«b¼†È2dÈôaFдDp,7¹+ƒè"æ4aùÔ£¯”:‰Ü±îZ+x×ð©¢9\2‹+M‚²EÊýXæn8‰n/µhMQöBàH=}ñ–À”¾ÄåÂ|š~(­0| B݈.¼Þ]Œš ¦MÑvU"x,Q¡¬îò®Ãc&µ R JŽLy>Ï"-MeåÞ3Í.%dœ—Q´f`JZP¹‘¶øÅ?onèý,R&§E‚ïÖӄn² ùøú¹rηhx~¦—”4jÚ¬F/dI‡Ü–dïÚ9i.ä­ŽðÚÑ{¨rÂw@•/,}²zTÕÅÃ=^ÝxPLÀµ žèAa££Nåþ­" ·“{ÌrEHŒßmwÙÝçxT¤iœ>µÛ­m—,á‡:ñŒØà­Å@,‘¯'âiñ®T±sמ €±¸áXÞ/•™ÒBžjG©éî W‘î2?µ¢âCÑÃø¾½…ßF©v½Üôtœ\¶P@-ÐØ÷²X‚ê—Á[ïS'àQ°ªá'†CU0‚«âŽC¨ÇŽwä?L![`˜zyÝì”ï"YªØ5Zý1{ž»ªn. »@7¿Iô7lŽ‚§çñ^Øõƒî½SÁ/b1~; Dg"¤4A•,¥lþrθk÷/qfrŽÑóQxcè£PŠqS¸ÂÌ=µÀaå9±#ů9;OÜÕ¥#Ô/®M ø¾—Kœ¹"”D«<ë/?čhj÷“38 á!—Ìpßjµ7£¸ÀèÔkre}ú¼™º9« Šî· &>#ýÏ°v'ÇØ­¤)O¥×ñÃÒ`®ê0¼©BfˆÓíԐýB4ϋÉj®[Ť!ˆ¿El \ËÿnØ^mÖ­T|g =°"±–×KÄLm÷ŒœÂªÐ<Ü9X˜¥… +L”z5íÈç˜{Ry¿íI8¡øo4“nÖ äŽôƒ*唈Làǽ­Õ U\‡HDa9¿è:Á'Ã;Z±Ni¼*³›jK`Í¥KžEÙ'̒ +ñ*!iv i¹«,|×i™-á côG䑇žz¥ƒ†',©y©gˆZø£ìpÒNMؐ·Îÿb .™Ñ(ïéª?7œÑù (2օ¢hDDDü•@x½I–0\áðèh8 +ÉÆÎdP™| +K ˜U°ŒÚ瞔pÁÊ`!·«ü˜OðË[hɾõpÏûJŽØ¥€ôÉÏEÍeŠg+>é+´‰ˆoÈeËžÖ ŸdŪ4A;«¶A¸Æ±å¢öB0²ý•+³§t˜»÷ÜRf枬+©tՏµ“‹Ó]ÖüÁ2fÏ0B^ðði`B„„bôÛ)œá¼YRc€Ö•âœÚ“e¸|œÕwŠ;õMñ_ÆIf ’/Êa¸¸Z+å4È·9œƒåœ7̳·*Šy,…ÕoNLÅõ[{Ö|‡ØìïÇqz¢ÎÏY.Œ;|Gˆ‡*ÆPé2«!sÌsñŇ ‘ ã’ÿ¤6O@Ö<9þ¡bat×(áʉàßZ"Ò0º;!— wÑ|7m'´ Žu_ڐqíÊFŠwµ¥._áq¼Wµ<Îèt5‹f²ï´0BÇ©²q?Q;ê(¡ã·$…÷㱟ÅŕTNŠN•H2°ZýE‹[}[ʏÐn3û‘€kFOëvÝF¥¬¹jCöŸá6ì*€ 3æ¡^OƒF ‡¡&h]Ü/Ïið(ñ›3wÔÌÀU œ³ ~îÒÞ!„E5m°¤˜f}œ·D<•‚ô¦cåoÒƒänää Q:ZUâUí®í©D +à~#ìÄÁC^1fýû½UOƒý9‚#Ë£0ËhÕ Ý¤{â±ôÅ4ž%3FígùÍ.1† pºzï3Cá*©3` +%‚}½Êøtµù<Øm/ë ®Ö7‚ùf³G¥—0"ÄszØDé¾G)…¹'+Z0ÀózÎ3)”~•Á¼G£Û»Z+ +³[Œ 9—É8 ±ƒì)ÃÈ|Â}¬<5!ÜB +£ Ò'uíª˜†¡ßn¾G³:þV±}9Ï5¼À†e­9¨Ê~3#wš£0 uµF±>‰–ù«§!HZjRêá“D˜ʎeÃ#/Ü^;¦ß`¶ +~ V3•]èakúÇR"qÞ5ôÉ®ÄC(õ(À˜{¯ ýrÀ©|¾>uÀ5Ú&TF~á³r;[ø€…ƒ\îªy¨Vâ 7 «äLÐ/ý辔X–˜ +z®Ì_o¶–¬ø:”b§AX$Ká BÀðÅ5T*é½HtÇÐ#çŒbþ÷åî=°pÎã&×õÌ=j™«M8g(ë:ÔvDöp,K&ìê>TM3jò°%¹ ‚ óEwyŽ= ·ŠS Ÿ¹Þ“‰CêAáˆHÆ9"Ð+õ^=nÐ£ï– =•–Bôgr’Á,)!ŠÒ¨1¦úÁ"8äJéOÀ, þpͅÒp­Ï ™Kcø8ôD½ëi¥4öŒsöë@¿¢l·I!a°Ïe¾çÜîÁà% +‹úÓBPI ^Z ÓÅÄG€%ùD‹8Q¯iðÍmNÌí\÷‚g§ÂÁ´04Ÿø…iîžO—óö…SÙó^ÕʵVYë"äÁW\8cÞ¾û糆™nwfFèzx;I±ÀU"ªû¶U–ŒÒß ç2ødh3ñŒ¹ @ò ŒÀ4L¸¹zR89u.Šø->_–¤Q[À z¢ÄiÁÚ¨*†!…ÊP;4E˜6ÊeÞsa bBZÙ(ZÛ)÷ F +ӟäª5®*¡p¬žÈ*ô&e\ +i1:Ìäž +Ù1t}Ç·N +e\&¤ö¶Uý䡆ZLq0zùàºk~+‡Ã@ šLG¦`Æä‹bu°´uW76hêDÐ4%iÐZ…°Y¥˚`îPԛ£iläÍ(YÉÙG» +ÅÅ·/Õ ˜½¡´P»cE;{Å$ˆ§çP–’xœsü€…µïã™ÔŸ3÷ÑöéZ°4'`ôò®Ç*ËýuSöM¯—Þ¥Ý臔e@ ƒ®”Y®SvÔT©xÞ_ÂW)o1#;-Rºûèä†O nH7»¬â¡þ…x®sŽbâ±@î§Ñ¨¹•R3g㉬NÌü¹g3~W¬†ÇÎ)¹½ŒQ¢Ó·Éq +úyù¹\öbK‰þM«¡ºãCFl~¬ReߙÇagf³€n¡ð‚e¼Q‡iàTƒa®oGQ‹.‰uB%θl¹ ‡ÈˆÂÀ¶Î%Ãò3ƒmú"ÛR ïÎ,¨ÿa(˜A¡R‰ +Œ\ìXRsMÿ|OFæI%£dm2Êë¤Zê±’äÝfx™ŽXq ܳ]âifΛ•ý 3y0´(xZ \`ð>=h¸“T÷4½[4°¡zŠâØáï´@¡Ÿù£‡»Sõ#:F*AP¬þ>øbŸÓOûcr™åTd{Ƚþ1ÍT0ŒaƒŸÇ°ª¨9ÌÉaÉ¥.±SÏÒÇ.®¢Fà:µÄÓ;®NöÜt›&NŽsÉ ì}DŁ8·pss¡s•Š;wWœ…íÖ¢œ{¶[V{FSIüU°(W¦´…b–q,±TM}¬æ.r• ÙҀœ]«A©±b|浆O™õÆV½ÕTžT–àžJ×qՑ¯Ó’Î\´Ð‰„ÊFqáÃ=⨻i×ÜUž`à”(3f·•æ:ZŠÅ +ŒZ—Æ6tÈÎ(ØvJoŒÏ• ÆáXKŒ€kªEh$ŒéðJ™Ð¼Gzve2ŽÓüc<Œp†‚P9°ê¥ÖÖ[H8m:©” **&¦CP·V¦ȕ 3cp„¥ßKøM‰Ãâ^¸‚¤;~’C>,W.<)Ö/Fx‹—aÁèŠ;QÍAšÂCÌ2X;B![¢!9ÅJ­òìÝáH³)*-I²kÁº äp­äÝ°ø¡¨ÿΌkuЍ¥àŒÜÕf ½fÖ2Y ±É…lŽçP×)e –dÂ0霓kÓ­`sÓa-'…£ÝéêV) „È)„Uؑ­‘zñ§ +-ñ©Ü¡Dò—C©øx(ëÊE“ŽÖÕðÎ(ƒµ°h*½¤ädRӛƒ™Siï¾NüßÑÞÃé‰2,3Oy \Â|%õ û°EAÖ ”š—îR=](4zÕC€"uX?QŽvš˜Àÿ ŒÅޙž +Ì,¿¢rœ”3]®Ø‚E]›Ð–¹§ô W´ĺBÝ]«ó—²Æ +sj̱RQ‘|ó´ +Ý"=+"ýq…W¡ŠY;¾Ô[åÞ\œqý3\kÌ:M>U5+xjËÒ fÔYÂ,%>,-RKá„(GDiCÍWpwIóyJUGáý¶«ú+óðS«; €gࣳž§Z t¹N´D’ϱÒ¯BšÉ¢Fh‹©U¹T»¯Ð +C”É'] æë² +wtL¢ÐŠ +ø&5•u¯‚‚áR7*÷Ô±dXa’:ß¡b=Ý®4߈¾[Ðô):p*:ƒU-K•êNwù‰°C»ê¥þ1•Ù^vlRæ§÷ #õ¤{31ùÁ“ø,ÎRuUÿä®, †™ëLf +ø›ØIN/ړ«â¯Uñq¹YfhÊ0ϟÂzvî…m¤R´[//»öÕì‚ I’âÂÃoวŽª›wgšâPÜdj⁞£ÈårÿÌï#»£ñº£q2>ìG»®Mâl’êRX¥¾Lf˜òô« ^Õde edg0BÔl{ê›T`¨8.ÏÇ#…™CÍt¿c¢ž¦²5q±´k–sÀה,zø7àvIÚOuLz÷[g\óc§é½°×7°"ýæ[EMOxz—–Ù´Œî*uíã“Ý~›Ú‰Ã2"¸}º€…ºnV‹³ Èô>{æDø«‡2J¼™ ±2g;6C-ÌçvÖ³æMkÃH4õ¾û;’r¦*>‚\ºh:\Lb&a@ø`…Ž›}΀ðÁpIªÏ“»ÊcK•ÓH­ýû®‡ÓªÅ¢+ZN…â]ZT\ùTÔË:¤®¼œ-Á?c†ãº‘i•°°b2”¾ØS\$å¸ê)–\1Uûø‘^*™2À>)—è,£‚ãp;DZN?d ¸ë=Êܕ<2š)a59krÀb׏6W‹qn÷…61 éêBƒzxGFcÇiŒ.)ë¡x¯ÈJi¶2O…º3Lê¸ C˞}¸â£é­Ü%. 7݄!çO.Ñ9×t|EÌ:†óu[m5æs®Ù9œ ®î4…à‹S §µìàx£<#wEM°”·‘x¾°Á5Qâ1 8Í…hæ؊:†õ®#D:Ýâ·Ë¼\Pª6ó'>8É#.ɞòÍ- `¹æ;ßܦ7I+ªêÆ¥ÔU+«õH£ËRä#¯PªˆÀɹ hÌtòQ}Je·ù·SWW¸±²H,T~¹"ÊèÃ%*öì§7UÉ*¯ª,dhcOv+q?Íå(ì ‘ŠjÉDâ[rŽKØh ;Ûb²e´7w5δ°Ð¹G Jꓰ+Ŗ°wþêma0’¸EçcE1ú½BþWõÝ×PªKw—IÕKòvu#"0§fÑ–í\8Áí¸2‚* ýhWÕ3Tö:¹(K†…Y!ú'9 ö^ƒR€GÏíxGºÒ <8%ÀšÞót1†7¦H!•ÄŒ +X sñ÷mZ¿÷ k”ÀbÝDWì"$Çj/!‚(K•U å†@kó½Í Y,(ÎÎesš“Æ+Y2*û¨žÝo.ÓxíÌlx· |ŠûìÐ +úvi%r‚¾a©^eΕQvò1°ïOQ½è¡Ý$¤ÆßY~Å/#J½®Ãz>#êƒ`á`Õ×Ñe'XÓ-Œ±”[S§"ð†ä 8Óð9^I˜]-Ò}º·ø3#ýÿ±"o–E‘› 0³ÈBîø0Úz¶g^)©h$)ߺCš…¡ x4Jé5üÞç…*çO%9nHäMX÷[ý¥¨±"ʹ֡ +’ ÉêØ W¥º…£õâÞ~TT-4I]¥Ñ)ÏR Æ#2J OâÒۂø{!e(‘Ûd_zºÂÌès¤+ènq¸xÖR¨©tö¥ðsxä2«}(ijß顶øÑ.0‹*¥Æx†Õ)/Z¨¨® 㮔–Õ¾ &hæ#ƒ„c>žÇÐ_!k…§k)%…© +´›ë„UÏ[«–jÉ +ä¼XHçäÍëƑ¥~¹m\&"öL:7•nÍ[Zfàðx3Õ;•÷¦ Ü0-hiÓ3¦;ÍÃE琩/ôZ~X|ûÅ I¸|Dq^t•Ž²+Ñ©Z‘+À d¬™Ù„êœ: lSrÍZ»ƒ5\q’n´#’q®!†•OZ×àüˆî¥:_*óY‘Q=r"ýÓ ڀ(ȱEãÜ5Z ÅoÈâœZœù£ÌHӌ¡]L—Ê2”õô¶®ÙW†(cÁ܈~.#®Já¡z€gµ^w56¯ ªŒ†ÍÍÔ%±)±¦r½è'î]ÏHVgЉ ú‰÷žh â*¯ÄâG™(쎆͘›çz[ƒ¯û˜={Ïÿ0хVÏĐEájVƒ€þ?+ÂPõÁ¸w1A–Ce nØËÆŒu‚|u-Êϕ(Ù@­Ìp"Xô„h³7kÅ»†Hf:„H# vQÜg‡›ð‡B­,ՌRÃá™áª ,‘înìÆTó̃ÿÓÕ)Ռb.e`ý¢±aüyévOŸM "SU!‹*ž¾¢O“ê^ÿ>⚠+É×¢`ô²¡Â‹žpuíDî*J<3! P" ž~¹ M…jµ¤eœñ¨¯ÚT'~QyG¹(5/ysø²ˆíþ:ðy]&=܌"¦¬Âáï538‰²Ör« ‰Z HXÈ'bSFiZDLh[} ÌÔáqëºYrˆJ`‹y¬KÙœ›ìêBÃä”긗&-. +>£¬ÉCýçx¨ªëÂ%0D•H©;¼L¹ƒè½.‹{i™œ5f\b §¾˜"–n„Í<ªb'3–z³?AUYË$<$í25†–åM*Ž~Ö\­7q}ôœèM4ç.t¥Ý½?8HPI„þ&Dq€‰P\9¯ÙÅÌ}£±ëñ#º­t¯6¹ÉÃäû­Óš{^v –¿ N@É@(Âgå2-³×Ëå®Qàݕn© A*ݹ[îÁϪíég{YáÙŽÒ‡:o+ßҁRÁ9° «LP›Emv–±Z‹ùzgӆ»käž*+…Y%lC —á|& j?q)ã=/#c  +¬QÃÉQä òU¦ ª¶°€ð3ÅGÉZVWlqÃá4Iw­6¿øq­)dT™cƒ™1‡ +œ.•YüЩ¼”·È]»·SI‹¾6è`¥Ÿd±yZcΆÍ ²FŽê–(]TZ#DÖ8vcZ´+bZª½¬{*.—áÍ#·¢„@¦;²–»²·E–®J;uÊâRí¦>xñ.?z­7^]¹×CvŒŽxë©5¶O՜ð`÷-v";ì ô%èƒÅ2̉g|‰­T˜0€¹»¹Š¿Žâüb1~‰SÞ1/tDC¯"ú+FꟘ¤/Ñ@»»îÔ>U±t EWWÎ5§47BœU/Fú2½GA›Xåö¨xœ\Êd؍ð1Ò‹¯9­ažfGêé:ÎÜ.ÐfÄW՝–s­:V ?®g¢ Qq'!1ýŽÐ¬y=’×)­E˜njᗰ¢.É ]Ãîõ¢’œü)Άµ‡ph­D=YÆ´þœƒYEÕXQòr3òPìA_–ÑãË.ìtæ=¾Ýî\µ(ŒwUõ«‰=,‡ŠõǨ¥º„…€‡ +ՕŽ¯Á¬û°”ø#,W(3u Æå‚Uæ€ù¶AFÇS Ü Ò&ñ¡±îâ—x:9¦´Z¨Ð7èí³)ZSªMó&,º° &˜ƒӔGînŠ‹R¡}YÁá7$õ@X '…„-e¿h8NUÒ^dÒ¡sfJ—˜4æ>Þ!+GãK‘‚<"7ZÒB\ZÙ|o(±î‹¼{»ã²$s­ğ#J‹¿ó;ÀÂ"z,Ó'AËÒb}»0öÈÛrŒ iáð„çą·Ú¯q¹¤´CÑ 6í-&ï ãDDw_¶c7q¼|(3ݖ=GÔêE¯°Û~„RÂ,æ:‹ýÌ[¹‰¹!S§:g_ÿ>™`šyÁœú V¿xrÍ>àݬ(zêšw¿£›̨¸ …:§*þB 9 ÏîOÄËxúð†âÝ=nÓÂ_½Êbñ®—&0cqŠÌñéjf¨âðL^èµ}\œÂÈ3©VÄT¬BÞx£9ŠkŸ“®Ï=¥@Jƒ5>‡áèÜ°»h²°Ø†ý°Ç’æ­lnºªî!,EҊx²OH3ÏLñØɊæË«·Ç«HÖ žlíQÔᱬÐÙ!Ɏ=ôĈp»ÆÓ¨Tu×hǕ{Ò€™boZÈßDÓ­,°cÝy{˹ð~˜VôT2XÌM_1†”´øJ D,[çvøjq{YnIŸ + 8Z‡ÅCÊevmnˆÙ+W„‰ÇU5ÃPíã¬icÙCﺽ÷tóMZ,CeK$—‚[ ³Y{Þ¬Æ`¯Z茀u6o“«2”|w™¡d\‘ê:«x.% —œ0÷N¼ÌcÙ[VCŒÖ(n;ï)W"‚‡ùpâ­P'¸js©AY —gQƒq1Æ0!1XÙ qۅWèïXíKœ .?¦ü qv«¹Mܤ’tÐ$Í)›sß·I$È3UÏÙþÁâY]R Ÿ%ìÔB4½ºJ÷EB®ªsœ‚#.5GWÓç?Ù»YƒK¥ô3ðé[}ÉÑCxä(Ë8¶ü ÉûÜç‚úˆû¸<ô%h8ݗõ§Tõ½¹`Ÿ¿¹“÷÷Hó¿Ò< +'v¢9¢o¬7 9ç5ñå컨ʆ3os¿A3¾_G7Ì2ù™Ë•©w“#”y´K’9–{)o sb ;jŽyu¯ìĘÃÀÁgØs¿¢Jüpø+‘å·ºâ=ñwû’s„›x €9Z ßMóÈä—Gǡėw'A_Þ­šÛéåÓjxywGÕd—ÿH¦Î†. +þX¢Ë{‹fVŽßtëvt93ž†Gs(AAUÚ&—Ÿ1%¯ärHx×v0 +†®äã¼,wèÒ8%©àŒ,h`ËQ7Î|~PË©­¨÷´œÝøÎ{2ËÑY¯¶ –ó¯±óÊi{ž‰+Ç1ê}NZùi©á+?{ÀiÌ*GXKÍ*Çâñ2ÙaBz™—îe’ʇ)ÿ **ÉÜ1åècÔ̓ÇÜ{Ù7JF9fñC¸ðé†q®?¥`›ÉÇe(¿ü™ì„ò+¨8(GÝåõx +Eî…èçGt”IÏFrѦ“å:áäW7;fc“£%Ðaê=#,¯å‹Ó’L‹…LŽe†üHޔ7²àa#yããel!IÞØPØÌ yãÁsRßHÞ´²¾ xÜzÝkO’wa5îYßHÞxßc»½ã0aZ oþ}›},0|g4ä )g Ž¡bÇÔOUeL7ùb‘äMY¨H,y“ŽÄ• äM3‘@ò擺ÆäxSdÃðÆñ¦°&Ê=˜††¤—“onÂOvãxÃÌæ×Éñ¦èöèOr¼! rãxS³¯©ËïBÎòõLŽ7ÞPU mojµ]‘ ˜ÆHŒ·@SF˜/}"³`90ސK„pƛÂgR~6Œ7Ì +æƛR9rñ–vŽÕj+ƛ{²ª&0Þ%—ñ†…Á»㍠»|@QÚeŒ=0ÞP±N|¥x³ÿr|V + ,&¸¼1Þsœ½ìo„åÚ9!ÞVX嚨`ôV䉮ïÇD³$x?VÓ'ÀÇy§w?w<]ûÌc9øݸNH;¿PÔ'á)\2½›äã¦J¦„w#êJÐÀ»¡È¹½¦é»*z%w£Á»"Ú$ßöµ’ڍ½øÞnÐn©8f7#Ž¬ef7{Ãw´1»yÑõЮʇááÝ.0æԄêߑEÙÁ¶yškáü™³»S-$J>†síÀnXYE¼nGqgáºñk*%Zh݅¢‰C%jî$üÙÀukŽq’fâºEً¶´ìlG"Å­ƒ Å®ü × ³*×M ékÆuÓP-T›¸nšYŽ¸nþDO87¦`&ӞöiÇu#°­zÕÀu³vC‚X7£ÊÛʬIëf½+}׍ + ýzàºy“TjºòºK@’×ÍíŒõ¯›ÅªSXyÝ,¡IÔ·œ„Ë%Á릅Ôč×MA-EÁëf(.؍¹KŸ°[[JÍ ì憪2¾£ ½óH;±›®W4Aì–×öfAk7w{»a•[b`7 Ãâ³üM‚†wb7#|’šØ­~,·4<"!nu»%Á$vsU¥6¤E$z¹¹ÇËÖaáP½!»e¾£`µiCó +Ù ƒè÷²›Ímˆd·Ö †xk-Ý¢ßɆìV÷GÂZŒìfo˜m˜µŠ¸åBg„KYè5L]\1Û° +Ô˜mX(lIÌ6·á!Ì6æZ…ųý˜-•”m,Ôö}…l¿.R•/Ùæ‰ñ.d›„;Ø³zN'¯= Û¤ °/A@¶ù@o·èžm>VÖf²Í÷ƒCh@¶iQŒt…l³Yh\…ìÇíC¶?zOŸÓ³úcB¶d°lƒlÓ¬ì«!ۊLÖk"µqT ò +ÙfHŒê¦€lã1û7 Ù“/ÌÆØÆ=p·Ûs™Œm}ënˆ±‚kô“Æ6-¼‚3#¤C‘۝±]‚n“ŒmX$nÆ6Klom2Û¸R‰ì±×PX¬@lÃ+t©÷ŠØž>p*+𾆬DŒŒUNb{1±Í&ÏÌ<b©Ü6Ä6‰Œb»^T:«nô sàÙÛx…­1b›C5&6bÏY » ±r=Òӂ±º5qî]’ÎîyŸv¾64rJE¯ 7œCJеñºÈ“_éÚ "q8¼6ƒHê„î1„®YWº¶¬T$¯ÍcÓVypõð²áµe‡’àkã¹3æ˜|íçúØF=Q”ë2™s##ðÚ¬/*ÂhOº6Úüô…­ !(#)ÁÖF׎[i}¼¢`0ÈÚ,_ìZÑ2—mÙW®6ÖGBÎ8èBኗ³T‹XHaƒj_n1–LíËÅk‰Ô‘ …¨†@·¨MýÇá` +\Ïá`çÎӍ1ºài! ã´ RSºz´Ùъ‚$³´qœ¤="Q»q´‡ñZYˆNÍ¢óÇ Šâ2”?[)ÚPR0Æm$ ùYC»‡poCh“1÷H‹ÈØ6 – Ý/EUv€6ô^* vàÚ~Ö>»‡b£gC£D0KÀ³!²»}žtý@vîoàl”( tanö)nP@³±°b¡íÆ̆UE`®Á‡ØŠºÀ^CŽ%úË +Ì>]‚’¼ìÓ=˜—݈ÛÜaÙÙp)XÙñÒDeCÿÂI|#eã"øsÊ>£½zp²Qc¦VW+&û @E`²Ï˜Ó‚’3jÆcÎÜ<¦G‚‘éé24›>ÑéB¼‘ §_ᇌpz|Ð ]Õ+õÖ +Á8ŽúœÑ~Ñtìg8½Ò±ad˜)àØOô46v03w4öcAH’±ç!Œ CüÜc3ÑrXuÇÐY¤B’‹ uZ«&û¾¢†±ØO`NƒŠýD~…b#Õ£—hd2 ¸OEˆµ¹x¢û·A±ifà# Ø…lâò|J(6sô¹7*6ÌÊ+›®â×Aš 6·¹]0K+çÅ†Eù­Àb—Uø[릧O,6sàt‰‹- +„ÑîK_ø‹jg,6ÏjÀ>¸š3xø¹Øp9ØàpÃb?*O(6XêDk&öcM؎Ä~<€'Á Ä~Œ^ÜyجncⰟ`ZåšÑK&A76¡$Wç†àp²«kగLÞÊÃæºBDÌÃæªî‡Í¨êp]çdZ3¶J}wà°yv­M6ýóö´¯ì©œeаi?ôŠÚ–ê²›‡ÍB•ž‡ÍK¿ˆ¨7;-{ò`6>T€‡ ¬«dgÅaÃÜÔFõ +¥¨‰Ã¦×ÎGµá°éԑ]8l€.Tù'6·à£ÛpØ<¹Ö& »®”L6«`8*¯4lZ5˜†MËp +Eaŝ†M—´º.¡i)âÊ¥¤aâʌ ‡ÍÅt3÷DãK«4Ë: *”mðè„ŸÅk¥bs)ªŒÎÄaK ú´‰ÃæÙ3ñ8lÄÆTú±á°aöOv¯žÎ(†3›+V6ÌF”‡Íít7ŒÃæÁ5b­8l®È] 6ž¼D‘æaOÃÄ^Ì&bã'´ Ð5ÃP¡s_°5-\ÂÜ°ÆDìŲ±§9ˆØ\JT`"v¾»;›éñgAb@C ±™Ô¬.GœúOšù®›YM¾M‚b31ɨÄŖ(ÿz&›¥! J›Ûpí¼Q±¥¸¾Æ¤bϾdAÅfì¾Ï7*6qªêYa*6SQlÑTl~!>X»)ŸTlx “ŠÍ˜;]lTlFœØ^-°Ø´h¢›‰"V,6ƒ:=ï;£ñµ±Øˆ+¨ÐuÃb'ÖݑQå?H³”>°ØõÕmXljQ¨¡ +.6œM7ÿ0›¢]6.6Ì\À'›>¬àbÓ¢ö‹+›G¤ (¸Ø Ǩ ý‰kumÓÎŦ/Ì´yp±ÉæcÏÀàb3ƒ¡†š+{šƒ‹Í9­ƒ‹ÍÇþ fwÞq +i½‚‹Ím¨áÚ¸Ø4ó™[¨Ã«L06‘ã ‹M'+Ћ Íǚäb37TÝ©er±#'« ¸Ø¬j~VÜ5¼ŽKmW.öcIZ³¹R RÓ°A±§ÕÜ/ô?Š®å|'?¬þëÞ÷ãü´#±ïrù”Dla”Š0ûµ²¬]@—$kŠœ`bv²s¬Gt} Œur‚b=P¸A¬Ù%§i…é,ìöÄÙ\°!¬¡Aå¤k•™ð €õi¾ÐƯ&À±?ã«Ï`‚½ú )•ùÁ®Նñ¿@Wã×J²¬ëü~: +p5|:R7‚[͌úói§V#yÂÈ_@«Á âgÌêf¹ÐŽ¬nÙÈÑÄjÔ¥pj`u‹Õ¬NäSðªaÐÄèä Œ”l¸êý‚V ºGƒ€U'¬}cU£ÂNu˜.Ij–¢›T]‡?ß T]CEœê +ŠÀTÃùפºÚIH5 âŠQ]£oꆨ~yZœ&¡ºÇûe@õÉìO}rœ\ðÔ,RÿryEIÉmQo¦éN”þ}–[b8%ñ8ÐÔZ‘‰¼¡©æe˧$Sw·BK0õåV;—út¢!±ÔÅóvP©-¡Ý¡Ô*E±“šÄ„ç§DRߤʼ©haãŒRß^Ž:bóo0j뷒E}E÷ £¨kTßí(êa`O’¨­±L5“8ԌÌD¹&>nOZ ¡ÆûQ\É7!Ô¨#š"ˆ:x¹½„ÑGÃQË¡I nv¯@]ÃOþ4 û ÞNü4êÿ†JQéQa=Ä×3ÙÓýAßØӖ¯zúdÈ¡Lò´–d½¾‘§¥q¹Ú$O#L{²B§©O=’Z-j.bCÆa`QÿÄ@OtÙ¿ý²Cókò@Owgù’< ¸OŸ5tÂ+w ±9;D§M>£,vƒNƒ BO&˜Ó@ƒ( kä4 —·˜ ¤3ÄN#LqWð¦‘8nESÅsFé±ãõÁrD5EÍ«#ј¬é»DÖ[Fâ|{›¤é§("±ƒ¦aå iÄÚu† Ì]V o˜éÇPœ¤L£â×h˜ôÝ»-˜4{џçK€L¥Ï’†Ì4Ô߆¯ì éĕG:Q˜‘¾ýõîi”ow.ÊBV¢%C†êˆýDH?á ‚4(ZGð¢+#·qãG?këL|„u1éÑÈö0µ±Á£H«n3u¨—êUŒŽ¾½ˆÝÉÑ·øvɍ~¼:Kl4 )϶S£É gÛha„ 8.9V€7LÔْÌSV;Œ·€d/# +0^«†ÝˆEÃɑn³c(½^¿±–nÔkxÛÎ!Œ:Váp÷‹Â_Ûa§q?‡Å>Oxv¹´÷áu„ÿ‚›|¡€v¯u?<;6ñÁôL8ü˺Q5òZp·³„õÀÿÂí-ǧõ‹xœÇ’‚ßcHšŽsµÃ蚶—‘²þöf´¤B×·Ø»Ðûa፽^‡ýlü~¾jÛ¹ý5¯;þi¼Ü~DÒ(ŽßV»Ï„Õ‹Byc”7#äù`;òxu|ÚK:Gû´Ÿƒßÿ̹åiÿýý‡Þè~÷j¤ÝÍPÎk©ÿ`¶½ãe>Ùjµ¼×ÝñR7 "3ªÛ~¿ßa¨°ªØN£xݵðbÜ®nڗ[1»Ü´yûS œïW¡õ÷—Æ·§<íË+‘‡]_ž÷áÿ|ÌøŽ§s‰¿ß^œû8îýgŽ¶³]ŒÛ¥Mûræa—;6Ïa¿½ø8åûÆpjëÛ <oxڗ÷!»¾9îÃ7{O5õ|Ù*…ø«ý; <m#ÛbÜF¶Å>G¶å°sd[ÎaÙð#ˆBì_¼v÷s˜öå„ça—Kûp¾QóL?ʇ[„yæhoÇÁ”ÒùÉ,¿¸·Ó[ìóZ–ÃΫ^Îa»E˜/D>·ASÀ*o;ì4îç0íË ÏÃ.—öá>ä-šwoŸÖçã^¦õùb,ÓúbܦõÅ>§õå°sZ_Îa›Öçã^7Îc=ì4îç0íË ÏÃ.—öá>|å-ÚoÑ|ÜËq拱üâbÜNo±ÏkY;¯z9‡íÍǽnœ/ÆzØiÜÏaڗž‡].íÃ}øþ£»B"Þu~pW¾y dç\o>LeåõÁ]Á ŠŒÃîÝj>µ» +6¾»+ëÆÓ™‡Æýû<áyØåÒ>އo2™Î9z¿½Ó©XÎaºËÙ.ÆíÒfއÅšwlñ¶Û»8ËÆÓýXžZßñ´/ïCv}s>܇o5™Îiz¿ÃÓ¯XNcz Ë /Æíê7fފŠš7mq¶;¼øËÆÓY\ߞò´/¯Dv}y>܇oòÏïßÒÕ>Žaß>ùæ~¹»ñHø>n ½×qíãCµ†|ÿ6m|֍ç'?;û9,öyÂó°Ë¥}¼ß~9³ßáù-/§1¿úå„ãvuËÐ1oÅ2ờ¶|žÛ^¾åeãùÕ/.oOyڗW"»¾<îÃ7^Îì·w~ÈË9ÌO~9ÛŸ]Ú2nÌû° ;óŽ-ßæv{—yÙx~òËSKãÛ#žöå}Èîo·û0}Ô<=ÉfÐæK@øuÅæu,ÆÍEYìӟY;=Ÿå67éã¹ÍHËÇÝÞVP< ­=¦·½7×|±O?~9ìôøÛÇÅÓöË:ÏãPïŸþô«=Ðû· +·oö |/±^¼x?gÝ¿|<â þ?S6¶ät‹õöëŚ3MUÑvO@’z_Î7#Fá~.3ì \ýÓvX†îúi;‡0Ι湮·­‚ß;û9,öyÂó°Ë¥}¼ßr¦Áïw¸E²†€Þç~‹q»ºi_nÅ<ìrÓæ9ìwXîM}Û¸J¥·?¸4¾=åi_^‰<ìúò|¸ßj¦a¡Ëûí=\š´¯²½½À‹q»´i_îÃ<ìrÇæ9ì··°øxÛ،ªý©¥ñíOûò>äa×7çÃ}ø–3h^<ȶg y@f9íßih®Wa¿]oFëZg¶w•Øì‡mҁîçВ>þ~ädcÉuãKáý°Ó¸ŸÃ´/'<»\ڇû°…Ä@õTßb z€ëa§q?‡i_Nxv¹´÷á+Â~‹æ“_Ž3Òò‹‹q;½Å>¯e9ìõ9|ˆê…z‹ö÷[´÷s˜öå„ça—Kûp¾É€@O¹}¼½H'$¶žÏxÏ·³]ŒÛ¥-öy–ÃîÉuŸÃ‡äú~n[rý™WÈiÇ/uµûLÆ}î£îb܆èÅ>Çóå°sä_Îa›&>žÛ·.¦kÎâû#ìÛªN¤ÓÓh'ò}‰!¯7ƒÝ^¹Ø?ÞÝ{ߗëÆsÕ0;û9,öyÂó°Ë¥}¼ß,Ø-¿z¿½s!°œÃ\2,g»·K[Öó>,˖yÇß~»½ËB`Ùx.–§–Æ·G<íËû‡]ߜ÷á»íZïwx®–Ó˜«†å„ãvuËÒcފeå2oÚâÞowxY ,ÏUÃòàÒøö”§}y%ò°ëËóá>|³`÷ˆðß}•ña|ûöÉ3ôVßÆÆéÎûÃøÀÆ+wÛdžÿÞ¾LšÞdž¹áüØç§qÿõÅ>Out¹¨wàÛö{;¿âå4æ÷¾œðbÜ®n4æ­XƜ¸eËg¹ÜÛå Π痾<¬4¾=Ùi_^ƒ<èúÂ|¸ß8ì°ßØùñ.ç0?óålãviËX1ïÃ2ÔÄýZ¾ÆåÆ.nn8?ðåI¥ñí±NûòäA×·åÃøþ3öúo~úé/üáWŸ®÷¸ëß-ôÚö4îõ“þë¨äpמ‹….«ý˛]%€µýòvœŸ³/ÇùÉçùmĹÛÉIñ<ËE F{ÀÆ×/Êx€Z.ãy<§ŒuHŸããèÞ¸·ûãmˆ_ü"õe}ýԃʃÛ¸ãdÐñ¹TÙoì,ãh(oàï¾^7ÏvødúÝòdXwë-ãõ‰Ùˆj0]#*¶d,×ásx 1ËTÚéî#®ýA¯KÝæ"dôAK_oǃÜ÷®6oú:«ËgPmz- |ãR—ýYk¢{ƒg듺ÒØÏ—å`©Ð–{€^Þ¾‚ž÷|)aރ·çð9Ñ +*d¶°9.?"0È^÷ÛöágM2Y<8 :Dì?Ò²4´íãx­5ü{(ºóûéþ¾6b‰Ì/éyîiDGmÇ·öëʍ½iÇd­ƒ2Ôùµ3˜'‡æ°|Ö¯CŒ«·89TÖيvV6µ³„ñõ½Øxð¦Ä¯ÜqjMÐNهnRTÆɈÊׯžÁßæIýöE–âáFöÑâYÕ>üdº_pðçÆý×Å~ MoïëeË1‘íý±ž¨*²1Gv{†‘ý¼%¹_Ÿóød%{ÇÆ(Z²ñŽo}`ç!Œ1αeêW¯bÞUG•xk -ý1íÇ9Â^ž¸«øœ‡åSôÑÁˆâYïq_a<‹ß¶øøü3¿8ÇKíÅûórÔFÜíYë8Ô­WÆZ†%†8ûò™÷êV±´7¾No|Œî±¢Ta€:ñ† WžGˆ‡{èÙÇÆñiã°]ßéÇs˜¾Ë%­çˆ–Ž`N=æ@¾„ýŇz-À8žÃXã“! ü«Gž÷ó§.Ûÿv»o]ÑËxæÈBϖ?¯¼'à@8Âsþ!§òŠ gŸï0;•$>}õ*ÖςΫ¦ÓGÔ!Ùï>Ž5ߗ°Ûe€ýÎWuvàA¾zäüÑv‚‡æ+ºë¯*Hȹ*¾±Pý’ö£_ËòA||ñé«GžWz‚ö•+emxu¬•›Œé°?TIÒXà$Éx¬¯w¹N¿?O=ã¯Ï*6îùÙÕ#^b*>ÿ̹­q›~½s¶y{í5Û|üþÃØx;ò¿å¢uþUÑ{??†½žš[a¿ùå“Ÿæñäelãzâs½ÂC8ÙÛw| 1¯6.WÍ[“G8êíß*#G$ôÉ0‡'*ÏQü^îrµ‘0H{ÞqØ{ÄJnðßl,q¾=6žñ¡>pÜóóK`èžž5›÷sÄU†ý?€+]—³Ç`Ä ‘Œ÷Y¿þ¨òÔ³ëk× ›·¬óçcçr¬äö ¿a,Z*Ò«x}·*ÂCúEë͞ñ7#°uô·­Pa¼çÞ7bÚЗ°;Η“¨1†ßà×lûÑxžµÎ#{eÄøßçÕFóåÒ㒱”¸²zÎý_·)LL>E9 ¢ÃßPY^/†K–3xr?ú¼¶ž=)ß±»åTð„ñµfz–-óÈõˆõO¹42á2z¼£÷ã Fg£ç=1óо¼£‡¯‘Ü;¦Vß´„Ša—˜%=ÊzÜöâ%RG$ëñyµ[·§ÃË-ñí´òÌ#¼ÖM9‘ŸÃ¿¾õx—&ls^Óϧpïë<ÂËӈ)áö2œÛŸ=îeŒÅ`¦ž±q³+°^¼:O‹GhfËA¤÷îMG“ 'ã_:sË!œ­[t'ñzêövvpŠXO¿ÃøúÊÊbÌ#G> ×ÅŵÌÙ}ðÁC>rõâwµå*N¨'|ä±|£j"Eº·‚‘Bo9_‡a?_wëºâ…×›†fwù(4÷žŸ&ü„|}Ѻï¹Ò¯»ï¸¶ RÂþè£ï3|‚‡YºóÓz®{9r¿òӊñs‡=ò.\ã^ŽÐ¯°Ÿ£yã™3à¢Ä[>#&«ÖÆ<ŒÆ2·çª o8d0bæ˹±Ì/Ã3¥Oøuß¿„½•¬™Î“±žq+JyŠ’É’_ rsjùűãUkÊ0·Çé5/_# Ç]ûå#ƒæ;âóÏù2^Âîéq8 Û>y¯yßH±qu#ÑX[I_®ðq¼vGø§ä› \ØÙŽ¢+kŽãŠ[Ó8GŽóµ†šG_cè¨Óù¼JÎҘÓ~¦«ùôÒgõgœØ^ÃEŠ +¿Ä¼ª"gêï!’²ŸãåÊ'ûhÔDԜ-´ñˆÉã¸â ol­o"£_Â>GY­°yGùʵø¹×üÆG2t„øH^óHýsPP‹ÛÅ<ó:³šã +öÏìÙsj\ÁÆg,‡âÛc¯ä¹2Ì¡Ýw­¼¼‹¸;ð¾†_åçVL4sRÆCqßóêPóSÛsÜq„#‡Ø³=w!—¸¯ˆYÍhÏqnV¾„}´x'bD¾÷Œ'ÇáÄGH/´ãšG—Ä TÏvæTãâˆøG½ôçÙ¢6' yóÜZÎo1|«IKDz`TŸ•¸oˆÐÎ#×3ŽüÈ©¨B¯69ˆÈSüæ.ÁÞ´ºƒcýĹ¡Oº½w¸Q³@¾./yŽSO¤†Ÿ€q%ýXk$®¡‰ÿüš9@ˆ®Ðáæž^ËÞ3h>n=$UwýEìr®Uît¿!—,9¹ÙW’<}ò§PÆvÄûׯŒ_㹆‰©-Írã×XG˜é®ûÉ1 m®X=ߧbèd&ÜùÝj¨«è¼¯Ôh¹ ©]ÙCæA5ϑ›Abs¥ŽDÅ<ÂyÇ[µšŒ½Üù!åz»Vÿ'Ð¯¼ig.E áBWh½ã ³ætìäWqœU`Ÿs&Þà/aoõˆ5pÉÙ¦ÁDí_i6®¾ä÷XqF1ϼ>™|"hná¢VÐ{ÒÑ&»ß)‚Ü7_7#ø‡³¯å,·¼Ü»€geM‰œ>an £P×ì0M} {ɛó9Œõ=t„>Ê‘àÈ3Yæ×gPîN¹ãˆŒKùkÉ +Í×õÇÐb°ü R‘ô#PÔϪ~ÑWØ+ÜcFóT ÑgxJ¥¨X® Ð-½Æ^$<ûÂx~É<UZ5&½ÇëÉä;¡c{jL"ìpmK¸Bæ”àiLœÞÆ]!P§$û¶*0v|ĝj`ÌÞU‡*8að"Fˁ9aüqøÎ0tÇ#nƒ† q„ñǙ¢pvŒaq2v¬Ã1”[mÕ­HBF;š”…CB1±ä×å1IªR)ŠÃNY«Â™Ê҄d?™¥Ä¸R¼Æ—Ç.—î—G¬T§=Ò۽¯WØàþŽ‘'tö#±™]\áÄ»¹\ü=ÜñCͦtvdXÁ>T* |2qÎmIƜ݅“¦¶9vHy'K!Y‚`9Ö '6ՙ +±ÎÞ3¬h<%6Êa¦¡C–‚*vérP…â³™å¡P8•ÌŲã$vg3,Ü»tp[ Y› ©; ÷Oñ¾+9Ž çÍ7è·q8|ÛÈèAۄ&s²$×`6¾©˜x!<Cäl=à&W¼àÍu®mq^=ÌnîHš§¸is‡¶/Œ‘äÓ"±d^®Ycƒ©Ñ10ë9±@Ír œ2pS8#f‰î!žï:&¥(ö|y’§WšŠØµA%ad*¹Ì"{}“J1H¨<ÉâV³¢^è Ï™‹¤(áÍmèsp(JòGì%3™PŸ#åHÏá׸±fLr>ýÄÌ*ëÞ±pÐq]Û4Û¥#ëZ²…)+²ÔlI²mFÖ©yBЩŠpä#Œ™<üx[p¤„•iÖìHä⍜žÒc:+‹ 1RíŽô¤šƒ¾"{áªC›Ò¡¼‰Ïo ÍB>³”°CÃküibX–nþX\(éüt‘ *q›Zs—#Rœº¬“CJôÁ+üÜnËgHX`¿ñ ´ñÖ,¬7É +z]Îg{b­ƒtNô(ÔdP– ¶‘í EêZ$ü±eGÎ$ÍEg–3ŽãˆlX²ù2:=Šdb Ÿpùh¥»$¢Âèbs¢oB«ÍY^$öaú@V9ȓ„'«YØÎ锝Ù2é:%n§u ð'ŠV®pVhPœÏ +šaOdƒjàÛ £PZrF‘„ÌÈËY EÑü± =-bb²·Ñ)Jt` COI…sîÑðô#úZ‰ÈRÒ)8: êOÙ:x*xÎkÒ÷<ËKݘf²ÄâƒàC>i¦R*œÛÕ*¥Cwþ45ª¹]Æ Hï ¡1Û ÚTjƒÌ¥d´aø8%ž;%x/Å bÂ̤7W’¹„ÊBÌ1«¢Ò‰£™¤3]8Ù¸mÊùh"8k¥=@ü¹P@+¹a©àÞ1çÍC’ãÎ#ä2¸ •F™¤ÜÊc.HՊÜù1_ÑÚýÒ3F+2?ÊÞÞ¹(<,œû£³Þ„áÎ.Ò9:Æ U®\ tŠv¶1ò*ˆY°;H¢x…:ÃML.Q\Žƒ®µ(Ýx 9rê\0èæ±°gM¨cšä"智´ÇàwY•¨ˆÝ’™¸2 ƒ…§-:òdB„Ÿ&OœLœ§»ÅUͼÊgÃd±° 2„×9»„¹ðZÆ#kþâN¬ <¥côîT¾ŽÛàäÜÃYìƒH ˆù‰ÁÈ»œ=WŸÎw…­Š‚› ›Nž’ É !µÁBn÷sÎՇ9£Ý&5"STŸ\py@’‚‹×'Sž,ÐYÜq„rfÉ'˜÷†1ä )¾«•Ùèp»„ˆ_gt>ÆÒ{ü 4Ì3÷ÈNj¥D2é<~9¼çzV““؃#äR%äÖïlÄ¯s›H×­L?SsH¬å¦C»YÎg9œ…„áäPð¢à†â2rÊdsdAŸC"gÓ $‡¤7@Kòn̪)´ §,V Q·†#›ZÁEã¥$nȈҜå&$ l£QÄa܊CÈ"¸¥± àãªÓÀc]ò®0§7sI§0«9—ôǧ¢,È|“I·4ÒÀË®SA1É …pŠ–¡¤b-ç÷B³” |g×`”Ê Æ]ÙKdÏ1apÓHPä¾Ô´YãkCNÁÇVÊâ¤9©‚JôÉÉ £m’A¡ú)»_£Ìr t 9ˆÏX sà"müY&eM÷.´+ì¥Ô²0À,¡ÑNÆ@áœw:í{‘ÓŠ£co"Ôs$0söS›Þ#ÑaÞÈæä±@Ÿ<‡ASV0ܯ­l€—<° /µ§¿ Ð÷ãP†”0ãFé–xf£ë,GJ$%s»êw|vò`',cG1¥7óSX»¤ éÏùAf3«Ëas5§G#Þç!ÌIPè·ÕeDyp #>H焄@c· ë"Ò1uƒJæ¿~€eDüUA˂eÌ'éÄ&(™RžL<[ã1VïárO Ԃô%Ô-Ð%/@CŸ¹äÝlrÂSÜ»œ•.PÐÎg¤T鎪<¡¼‚YÊtsPÎÄ I “.i-Og +!á,Í`Êìa€)§eÃÓ3¤”¤7Ú°ºCHLEhÝ TÂyZKÿhL­eÏb’Z’»MҀ²8…GW_ SœÜ«18Gx(Õ¹n­l+ÐyèH r˜5ņآÔ6Ϟ30HBë÷Nå÷T©IDxÎGk5O5Ê{"5Åa y›”:X²èÊw½K¬…ÙÎ!ÍÇ~Vúm*O’#ÝTLhÍv@Ö¾˜=4h릃h8 î6Hb‘“á[±T”ˆ€Î2¶#…§KØQ$­ˆ:ÎiQâ´ ¦Ïðš·-,ùüVÄéX!ه¤I(5ûÌ('>¬Rˆ‰¾ÈÈIiŸ(ç¦í§÷ý¬¸"Ž9 ®ÛI1í‘í¹Ë2’ˆ £Z–°ibQ§@À³3œ•´X†§œ“ËD¦sQlÙ ñyê\-<Ä©Së^tÌÏvÉAÁ— ù´ÌxˆŽNÎå »<8`Ii´ðÌÂ)ÁSîcYûX†):ç#ۚpBQ¦´: gÈÈâ„ÐÆ|æŒ]ùNö¦s`©óã†ÁY批åd +óƒÍï¨!ÒA{<øé¸ +vÖ.Q¦^qO +'â" XgÖWo»YÊ}ê2<ÐqBœ-w¼Bº#ù ò–:;]Â6iSPx^špFç%Ö­è¼sNüÄ?WýŽÀý 4ÚÍ9'+‰ÕŒéLqæµví£j‹n$]Nד)ªŒÓ…¦*À x=£MÓ}¾rtkb"´Äé0h2öÛsR瀝‘¸ÕQj-‘2ïxîSçÙɧu˜ãW»áÑAÚTlcð§G3ÉbÎí“:UØ%§tÃl#ŒÁ„Äd$SVÝÔʊßn]±¨U5“»Â‚²1 +—= rÄ'œÛPûtðîR6éSˆ/¤žÿÌL/ZIìõL[Á†z]gÍ*f²˜z?òN1"¥ÉxàQ¨‚%.§w—1p/ƒÂþ°r€v®'”ô5Oš‰x ñšà)ŸöV”XS4R•ÑWéKšyD'¤ÏÄ”MGJÁhäå…#šŒxÌ5ŒÇ*% s½ðLí´°z!ì<‚yN†^òŐí@öˆ³²M“çŸ,b°é‚ðu :a] Sðyå:PË(°Ï(´@Eš8Ù°Hòj"e\ _Ç1ÌZ°Î;GK¢þ nÚ|È*ZY½f8‡/gNþA ›‡]\U)äÈ+þg)Ç×Qä3­P%‹väŸB%š5ã”uÊeJ°L<<•ü:Ö½”ïł"ÏÎIYw5dL|ÂHk–ÏœJVH©8WâÓâ؈y ;JYy|æ’ìç>#0jª×^•š: nDùôt žÓàÁ¹œ|‰`œójw!‰¥œ˜›ß9ï}q,3Â)‚¤ÃnQpù)Ÿ^©Ê+Â× +Î%£àk5 (qÎõî3ªQz1r~€˜RCT¥¹p/[§íÄÂ9[L·–¦¬ú§[™wÂ'iŒ]X=bàä !óKM-·í4¼F«œm¯Ñ¢£Ú×½ëEsŽC—ç‰N“ĝ:„YÎkamP.z—sŒFœ¯o1ãŸkÞBÖ®k‚§ÜS:²— :ý£q*/Ÿ#Ar4«àÃ̐¦ÁNJx'šÁà™Êœ„×¹E(mqpe´$ÃF©0]”²"÷%]"àr +8`=Zr=ReËü€Ë ®„¬0|!mÄ×[ØÙºáôÒtÀw)Eó„’dIwÚ:—(KIW[àÊtœ?Pð}Žc)Vó|Ö¾WAÓmÒlהC©Hø2‹ª7†·9ÏUñá¬Ë¨;úÆp¶ „;`ÊÂeV©j ¿Ô§GǼäk_š²rÎ7€ N"Ɨ.à= ®'K”W—ExI)«h˜öÌ_Rª)e2TBB¬_ÑmÖ ˜ýK•ÍReJøvßTY˅…g|cÆÚ­½À"çqîڕÍöÙ¼èZã4¼žÀÞCUÕ6ßìÄ® »ïF¾Ùš\c´ñs‚†<æ3Àtöè°ñÌå— Š î‘Ò+Äþ° Ýd«9çYäs0-´-ܜB§bé7'.ΎBWز5¥4òai˜‰†·–”£Lm¨r¤YNÛ-´ÁK^©åŠÍŸ× ìáÉ>(išíc%f•C­^Dìߙ۰Z»W&|÷5fÌymÆÁ±ÏŒ3åHºs¦ +gµQ#¡}· U¢Õ£é Õ¢:@át žÓà¾F/ÎbšP¾ÎŸäÓ06etìî‚naÄ£?øê+1ó¾ )Ǔi¾ÁF59’SB@Ùœ8玈mòô’î +{‡¶»Ñò¡V—{± ^VçOe]Üßӌ‡ê8èÅ_‘‹!Õ§KðX²­*oÝû¶õ˾óàivþhØ;Ï&W/:Ói1"TôüÇÑðŸ?œö‡¯Žü¸x݆¿|ýՏ7ø›ˆìg??yÜT_uŸ¿·¾7O¿<;ýqÔ+ðûà +endstream endobj 22 0 obj <>stream +~wÚ ;ãk~ú¡uïýõ`h~<2 ÷/fÓbòmë;SðÁxܙ/Ó½êzãbˆ%dëþÓáÔÿ¦n +üñžPÑ7߶îÿ4ìw üÌà¾.—}ÛÌ\áwýÞôjuéaçÚ6Íqſۅ®]ý×WÓú}£òÛê܃§ç.^—ƒN÷jZü¡3œÏúÓ³îLàṨÝñ~Ï]×[(´­žÉÃø¾þ¾ß‘.}¨ß¥Ü·uí¾mlHÕ&ÇdÚ{X¼íw Yõ)S®µ­q¿ÌƵ;:.&³AŽDå·Õ¹³ÑlÜ- n®:õ™Oƒ!ìkÏîe«:P̓Æ^O:³É¤ß¯Ç á«Ç㖯¶^îÓû°½É× G ¶ˆÞ÷ˆÑå夘®Ÿi;Ì1±ÃcÏqøv™I @À­§;ŒÆß¿»êO‹»ô‡ÁšÒåí‹oMS¨ß¯›¢;tÆ'£ádj„î]\¨¹µÞF»ûèýÍhXlÒ]_s[ÝÕõ{;_vºÅY·Óhî–jm«—@ïç³5tØ+>j¯¸mÚ¨‘æŸÚTùµ>Q~Ý¢n¬›ôiGô}Ñh >‹Æÿ¹£þpzÚÈxöÝçk͙ÛvNð²ËØ:.t|tSŒ;ÓQ}¥4¨±[öل³ËÃ~|[ú·cêÛÉèúf4Y«ñÜnR_­y×(»­YW}³Æ"Tê‘Ú‰­ÎRÄ.(Óo0ó7[äåqzu]Lûݽސ›³ô]ٌýé‹Nùb‡wc+K=wn®LÒ;¾'ï¢Ê¿W`ÇFùY1~]]wYòjÌpî }ÖÆ܂†`ŒWívÜX\¶~øú¶‡‡EûÖ¤k»6ºøkѝfÞiçñhta›²ÓIýî–*m«ÏÖ¤} +~ۻзCà[™ÓÙøb6(†Ýú¾u[¹.iøU[éÞ 1èÕpvý¼;í¼-°°ÎÖ&t;ªïa¾èLŠÇãâßffÀLï¹jÛêêpt6íO»k¶øRÕ4ÔR¥mu–å—°lSˆU“õÜnUkϽd&âîX䫃rzPNÊéÝSNëGª”Ó[Ü¡;¡œ^Ž;F½ü8êOöS=­¿wW=­o ;h§íô ´ÓƒvzÐN—¬¯ƒvÚDâX\ ‹áùšàÊ Eþ](ëSbÜéõg öe*¿-–Ñë: ÎGî"³¿\ñÙh|s5Œ^×€lq3¶˜Ø¢ë_}JØâ-Øâ~²ÅGãQ¯_Œã 3ÚÆx`ŒÆ؀1DÆýŒñÀŒ±c|ҙýíß'Ý«büǢ߽úþ ‹ñgŠ1ØE6ùÅóŠnsÉmšžò°è>Å¢K‹Îõ¯>%‹î°èÖÏ'¡÷7γI×qž;çù»Ñà×ëΤÏÖåÛ¥`Ï#±wឍºt'>iøÍ'‡T0ó\hW†yjÝNÕ·o›$¹»Läp»ÀÖD3Î#4.zÍrpîCüܙ£·8~ûÊ wÿò„ËÁhÔs7'\ :Ý7?´,htÓéö§¾ÚMd­]ºL;½·Ü¤YïvlÝ=†)ºËËnϏ[|Ä®½;‡/îhҐ™ìˆl2¹êôFïNö™QîEzðf7:•¯ƒª?Zóõ¶5+ëƒíõ//g“¢ùO o_-lxãQ©Ò¶úx7®urSjowÀ½TΛÚgÚünÛ~“Ô¿ë ˜§f®… ÊÖØn\Ÿ)u~í_Ϛ8ª¹Â¶z‡yý|Ž;&Ñ=ìãž}k.²zhyÈ>Ücu¸]sMwwùvÍ»¥DÜ ¡“f×>ß_v¸Oô  í£€vÏ¾Œ|v¸htg¼&ûÑè¾o֛ôqǎËí…G¡Áe–kö‡£s¸pt;Úø®\8Ú`ŒŽÞ¦¹±|g6åÅ£‡=ù–ìɇKÀoÿž|¸ü°'ߒ=y3Uë°/ߒ}yß/>Üþ‘QÀ;5ڇ»À÷u>kcvy¶ìý•; â#võΝÍ°K»»»wîÔ½f‡…ÇÍe;µYíÇ­B׃®~6ÚZ‘û·êCj÷¿6à5T~[ýbjO֍í0—Ù€‘î“Á£oÏj¬ÑÛÍeîF2 ;qÐôììû’=稾î°+ésŽö/Îó»sHý.w?á̞Çp~ÄzÛï87 ‹¯¾Ðõ¾;¢àì/ُ¨‘vƒ£N;,ý‡K®þÙÖ][s1–[vû"ÿÃXýrYŒ÷Çûkº5›Àmýiç¢QvÉ°+[õH…ŸZnK•¶ÌŒφݗ»Ì…öw¶ÓVÔº[3ñÉa&Þʙ(îK<¾ !B¨ŸAҌWãÎprÙග[¸:öÜì³é1“]²øØ>¿‘N³cúç^˜}0|òÁ`ð%fâ.ªg®×›Ê»Ñû™²—ë5¹kÇ.ÖS‡‹õ–NãŸvób½?üí?®Åñ¸Ihüí¿WOן§;r­^“¥w'®Õí¾¥N¯?k°8©ü¶F»×td€ÜE-tc{¾P\à-µK…÷l4¾¹ F¯ëóÎ[¨jxâNóÄý PÚ?NØ æãÀ ·!/ï]Ä÷EÓhv‡=|ÖªÛ>X;Æv?¬{ïÓÔ3ÝÕlQA÷  Nàð-È°ÇÁÂM¶ƒ]ÙáööÚ¢ýÈg°&ñdÈ1Þ§²Ý‹TšÌ»‰Y¹¨?ZÖ·}ÖW´6`}ÛñÖw.\u†ÃbpV Šn#ÛbÍmõvMyèܸ·‹5·¼­=ìOnnq] §Ï:7»¼·íq®Ÿ§µðU”¾Öîþ®¥ë¹¨o»Û¹Í°Áα+›aýÑÚ1=`OR5¸*t‡_Ô7zíÓh°Âv…iÔ­;r‘÷å¸(~­oŽ¾ì¯ (Ÿ 6lo°‡£aýŽuºÝÙõl½«?ì^Xg[(\×ïg¯×Ÿöß6é%×ØVýaÑ©Ãk·3è>5ˆxjl«‹õ·Àp,© ?b_jh¹Ú¶º¬×¨¡«¼A[x[ê Þu>Ôï˜Ù⧝q3™ÀVؚžX¿sÅë&r+¾µéX_­5PêGÛëQ}ür<ºn°«cé­*IaÿºÉVýÝçjÈþäª9Êö.r©{ˆ\ÚÕ¬Á`í˜=ç¹Tg£Ün¦úý¿È$:Üd²Â¹«±KÝý]j²!ìÊwˆ]ºÕû\}x·b—šÌ»‰]êîoìÒ>²¾CìÒ!vé»tˆ]ú ][°tb—ºû»ÔdçؕÍð»t»™å݈]êîoìR“¶+Lcë±K;äBÛÅP¬&Ü|Îns€7JByۆ§Iìàax¾øðìí}v‡ ® ÙÇ ®:jéúª%ÁË&JjPe[BÌÍvú¢ÿ¾LnúÅà¼a˜Ã‡ž‹ëѺ@ä =ï{Åe¸6ƒ|Iú):ӇM"]ƒ*Ûêè!ƾªŸ;c?¹(û½Ž±¯¹cîM€½h«}ˆ°,W‡ûÏ3[ⵄ6£–ùÿóÝ|þ`~¨‹ÛGxf¶§Åm¯~Û¤µôN˜Ä/֚ wØ(¾Ï ÜÁ>¾%­¨öíbí}¿à®K·¢=Ÿ­az;Ì#›ñ‘ݲ$ïŵvõígoÖŽ„£e·&ð×ïѯv©Gj'z´f8K=[Ô]ê÷¨;³EnÞ÷§W×Å´ÁVµ»›rS™w·äý=캑àqÇ÷æ]tm6›wl îüŠ†Üùw~íß*w~ÝwþÁ¿\Ì:¸óîüCʼƒ;¿ÚqpçÜù·Èò-8ôeôC3Y÷àÂ?¸ðo‰g×LaþÁ…¿Mò¡ FïjÒ ÿújj +uá\pý›¯·5™«¾ÄÕ¿¼œMŠ“ÑÐÈÃe¡âíï«e‚gÍR •*mMf©¿ÎƗFIlØÉr­mõÒM©½Ý?wŒÆN Ú¹Ÿâ`UKï†u&×áÔ涃%jt°D,QKÔÁu°D,Q‹ÒÂÁu;,QÎîd-QÎ,…©ƒ%j×íƒ%êSY¢¶·nÛ;~WìkgNÇÝ۝È:³¯Üe“>îØ¡ç½È<Ó «É!ó̶d ú=ڑÌ3 Æèyæ6m̍:wfSô§/:ýu¹ޑ7Íäwؓo1¿?ìÉ·¿G;²'²Áí螼™ªµkûòþf‚k,yÜñ=yã,šÏâäC¸Š†ìc¸;ší¬{eÃÃUgL•úYâ™7n©èñ…2olscڗ$õïþî}hAôa{“¯AÖl2¥½ß^F——“b +3m\ôš­ª]ã·!˜ús±Œç8ŒwX[ùˆy¼cC½·„ß ËþAÁ¼# +¦PÑ7µ'ñ»~¯IÀŸ+¾­MSÄ ºvU4 +œãò[~î¸aàó$MßJ·Ž„®?OÈæ[Íu©õagÍ7ÉÁ|³ëJØÁ|³32z¶wæ›=:˜onç8˜oæ›=êƒùf¯Gê`¾Ù=óÍ]5L¢3é®±EÝ¡è€Ëq§;í ~õ°ÕëŽ=¿ì¶ç8ޟb¼mrB>¬³­.FíúÙ¯.:“âñ¸ø·Y1ì6Ð`æªm«§ÃÑÙ´?m°|'XüUÐdLK•¶ÕÕn}Cå®i5ÝÏ^yÛGë<‰TqHYvHYvHYöYúxR–5lö&cÙ!aÙN&,k׿ q:j gvC¹®lõXº¦ôy @$ û\&±W³ñÅl`XÜN›Ri‘*]9éÙDÕÙ-ã÷F' 6禸ý lÒµCÈàNø +~.Æïúã‹b0¾>_“Ác—ÂÌÔÝlС;28­)$î¨G§~DÓî:t¢ƒGgIww×£ËòKøt¶)BôӃ~ºeý´Ñ2;h¨ õ ¡4Ô=ÐPëKŒ õwèNh¨{uX?iÊîê¨õûxPQ*êAE=¨¨õ ¢Þ~õ›OEtþhØcUa@ç?Ž†/ ¼óÈÁážÀ𗯿úñÆâQödz×£iÒqÑëÃËbЃŒƒ~ñ·/†Gœb0½üíu¯ŠçoM›¿ŽZ¾þ*jýòîë¯fôß?π"þþˆV„ÿþòž~o¾ýÕÀÞµTëYëO‰Z½¯E뗗ð›iQҎ¢Hå­£¼umžàóô믎øKÚNt*cx„ÿà1‘¿'­S o%X0oñoTËäP +>NýËðŠÃ£ÿŽH±â)~Ò/Á‹ƒ&›²—ÐÓùÌT½†´-"­RüT¦üaSáÓö‰~9òŏ2ûnói__àG©U‹«Ø_2Û©£Ìv„ ªdŽ@™¥Ïñ Ò½Ÿ†0³z­×ãŒø´‹cu”øّ£¿ÇfxŽ"èl‰Ö‘0¥ly@šKÕJs¥Z¿\—JJQ]2Ñ­ãn]œÇõpÊqâ(›Éø [ÔNƒIˆ„º¶³ª<G8žÌD´#Gµà“Ç)½¹-ør¾²c‡•F:hAÐ0æe#'돜A%£2í4P9ž9‘W—LäÂÈ-Çy\§LË#‡wïÛÖ/„þ>0œ*j'¹Ê`ГØÌó!…Ú|ÑYœøÁÿÿKg‘÷—‘íLf"n©¶T±À5zßesÏýC ßsÓ<üQ ‹ ¯æ§Ø €æѝb¾97;Ø´¼Os~ÏP!ÍtœgaãøøD—¿M}n“o΁¿Ÿ»–Zz͵cUê:[@·ºµ²ëDäªnkZ†JµuKÄôž`Lî¿,:ƒgƒù=jÝ3Qüҍ‡ùÙ ß-ꝁyí“q¿÷‡âƒ{m¶Aé—fóšLÇؤW´ï~sn^q< JE ;ƒâɬßs¢Æ7çrá£÷7£ñ4@åzÈòËtU߆®z9ÃIUÃÃÎtv=AaT!Dvý¢<ÐÖ"Q),R3U®Ã/Qj¸¢€‰<©úb—uÔΖ"b©Â®w³ñ:^Ÿ’$«4åÏÔ-ƒ4Õq¢àe2Qšx‡iŸi`œÂ.§Rë +ޒØÝþ(uûì –÷Ó'±#õ|­áÝ×Acà ²í?WnÓz5³7¿§Õe.›?Èã#`zIݶóJ,Çë°DevŽ=»º +_”ë« +û¾¡h²¢µÑú>«õ}ŽÖö9ÎË}žÙ^ +»ÉÀ—Sû%&ð±ªçIî»®ª»Ž²C-1ÕüɨËfA”~Qõs±Êqu•xn(͏ÒuIºE®ô)×uçH klÜ£PˆË%̂]Ù³U+z¨]µë!}®œªØÃøcû—ÌõOÕï_²¦1ÍJA³RÐdŒƒ/ŸpVªÒ¬LË?(]Ñ5Uš”s5*z$]‡¤ëOäzAŸŸvNª¥«L-[ejé*[Ò#íz¤]h\èóSÎAµv©ekL­]cUý‹Ü”nšI7ï"ÿù §Ÿ( —*ÿ dE¯Di´æj,vFÚ¾HەÈöÀ}|ڙ'–­$±l%‰e+©º+ÚvÅê7-7îãSN9±t ‰eKH,]BU]AVvŸÂIô‰Ý!V÷I¦˜•*ÆÅ U‹½¡ ãbXè N1mg“¶s+¦O:Å溢æºR±Z溢ÖuEÛ®8Y× †ûø„SìsIh£̞Q;—Rˆ ʋȥÐ`‚ÍÁZ;­‘$©zíXf¢‚03ëA‹bh³šÕ-*ûI[Æ©ÅkY;Mez”kS#í]|—m ^T0"{Ÿð/Ÿ.#5ä7­º^»¡q4R)Ԗ¹Ú€¯pä±Ù§¶VqN ÓÃ\d9}ç9džÚZ*%`ŸX|ÒÜ$b»õ Û-—n"i©¬¥ %´°3ƒéN˜âõ‡o:³ËÉ»Îëjÿ˜»0+¬…–,Á9ÖæIžÊ (úÉfæm S#3Líûо@"W±.“ ˜i‘Y]YžYH†Lº-0n÷_oa†·D™uPŠQ‡æ}ZÂcŸ¥y6Ƽ;Æ*Èbk±³-$ÐiJ¬‘Ž`B¦ÈE#•Xö“klÍ[UfØìhM6 õ½%ƒÐH·“ X>bm6Œqç1¢$ŠáÚry‚™V%ÐÆc¶‡Ç¾ŒžÝvcû¢| 8 +=c̾eXqŽ´ˆà‹Y‰y–ÆØWè™@}È?Õô ”wmq×V³"Ul ôã{Mg`ZÀðRm;—J˲ þ’8ƒ)eQä8§Ñ #eÚmöL»¨p Âñʬ番V€›å¢‰ÇqÂEÍ; MÒ b>}mj§*³4嚨S±–% ¯‹¬ÚÌ[öÌ\ŽįÁ[2‡R¶ešÆÈ#´›ªV€›} ˜UÇaWKÏ 纙ü2‹Kk6xÉ6ïS2ªµ]Çækð=Ò½'uâ=¡eV¥¹ÿ¬pÅ¡ºé ½ÆaÀ‚¦û÷ÜE%$5L‹K.I Óñ(¼…@Ô‡ƒÚ9׫ šú©»gjçqĵÌGfŒpÒ#¿•®]TÛµÛa÷ý2åp›wXàK¨6=2v¸·Sm׶rÛm–o¦¦”Tº¥H–ƶU©#ÜVSÉ»±­>°”¶Õú›$:µ¨ +f߁Ïܘ›ïoM°Ó_â4·lÀÕ­‚u/NK'Ê3tAH˜Ü× lSJXf«LÌFZ¢š+¬øÊÙ-TµÝBëR¸é›¦Æc€ÀèÃ3Ì>&"p»&°oé V +šš¦¸ÆRÉ꺩YEf§4usŒH·~[Ãû“ÌjJÊÈ3KÞk—åÌò:mG1œ1¸†£i"r´7jGْº0KŒz{V­×dzŸ¶±´‘Ù}°ÅÉÆãÄÜõÁä÷Ÿu&oæÌ!O‡o‹ñ´èͯ¡“AÿæÆ,ÆyøÃþV•ÿå7ðwðP˜YÅ÷ü„ëãegb“›ö‰Ö/O¬Í­xÛÇ{Å>´~ù âYp„qaøç/ ÛÅÀ?~¹ZQ@¶ ý/ æ•jaÀ¶élÐÃδó½Ym2ûú«_ž~õwýÏÿþÏ¥ÿüoø}ùÏÿùŸ_æ÷% ?ü~øýïnÃü\ýûºõõqÿ_0;;päh¿cöe žyý¸TöñbGÞz<ûõ×-à³eIâ›säÊ^ 8ÿå¿:)È%åýœ9ìˆø|¥eoXêzA"BWBè ˜—CæJ8¦þÏ3Û2ˆË]à¹ýxÐEÉä›ó*Ù$€†’ˆÇP -a¸´h”È#Ë¢â˜òÍ9*ÐÇÆ¢Š‘%7V¾9ÿqå›óX¾9ÿ‘¥nÃ+…–oÎÛd=wÖC¿\`ásûFxxð´õ`6µì’ìÿZxŸÐ¢wíùŤ¿-zçF‘8·¥&ååcÆûÁp4lå2·3~> - +ÜQœ‚ÓÊ|1j™iþ g*°XÍ64ˆšœÄYŠ±aR暴nFp Ó|f‘]™5™)¿àÄÉìQ¬<ðÔ¥P*¬j&”5 ö€mpÈP¶Œèé0N1¤Ð›/ÖÄ­ bü*„9 í”¯Êýfô[qRE3Rf8Œð(…Ó€‰òõ®ç€=xà…›`ToòÃƛ՞'YVn=˜·Àå«æm‘¦i !Üzô­/ݸ:ôÌ÷Ú⟉Š Ô"ßfœ'sD aØMm°èffg*)sIevËH¦%ƦKQ0n' +Žý2ê@ô0O¿]dÌD~}@éhäöja½î!éBvP¿ùÛÅ+Œ`š•7ð3(U¦¼?Ù%40‰څ¢‡yڅ0è"c&ðëÃEKÍ ˆÇ}áŠÜ[‡9x&â-PÉ{j™ù:KK2cnÑÌI(^åm#Yd^d¤çPb$X(0úzNèó˜€^Š‹¨”%iIZ„O«ï9Ôà«IÝ&…ï'@ *(”}="cö|ýI•ñHÌ ‰G0î"ÉPL'h…Ä#,$‰m\;ÆL€x ˆÀl 5ÞÏ53$u…ë1s`âÍSiN ‰G0î"‰ML®Bê‘Rd5®è„9ÆìžCÚ( ÙþZ¦½;¤µ1$u„+r÷ u`ÒÍÓhNø+-ZóKËmÓ~ñ9I*$‰\!éH0ãŠ$º1j„ÄcX@½fûH¨™ +ôþÒªuí,-[׿l‰¼l=À/Û9:•¥½€z’ie{Hr‘€d§€t,c¤cIŒ`,«b¤ó0Oº†ýcÔD~@:jf@9ê ¤'$⠞‰lóô)‹wÕD#ˆzOBS@5’­¢‘üE ’Ï+=c'XÂ~Vê7½8 5/ õ€@Üi‡5x&jÍÓ¥,ÏÔ"õ+ãÂö›ä¤€ZNš +ˆEH #¤ô‹AžX»EX©Ûî½­¨q­2ÏêÄ]vHƒg¢Õ¶ +ºÕ’’KDÞÀýHÈ% +oæ‚ Äà…7sÃyѸDà \q‹ôª%—ˆ»—΋Ä%Únà©ó‚o‰®xë¼,\"ê»E:ՒƒKDÝÀ™Ç2p‰¦8ô¼¤[¢is§ž~K$ÝÀ±·H¥Z‚o‰¤øü¼Ð[¢é~?/ږhºïÏK»%¢nàÿ[¤ÓJ¢.ÏUøeAdkΎnt"úã¢×Ÿ¾éŒ§Euš‘ùsŸ1ã&»°¹ Ü×S›-Iæ¹½&s! àƒ½­ ¿š]×æV°æÉìÂôìÎ`Ã7Fè¾Hi³%I ÎÀ/§˜åˆ~ *YL'6»QðŠr\Ëèa +zâ:xbf †Éäxš_›/Ý'tø{â2÷¸ØqÿóQPëȢ²y©‹|²Üµ¿¦ÇÄ¿uäqÓ|i‚Ÿ–bG‚’¿p°¦CxâZáÇ©üX/džw#]Á‹çgâèՃ³W¶”HA2P%b‘ÛÉ!¼cÕÎcmC ›©痈WÀ$°ÝÄ.oLhªh»$:ʦ‚WKÎce֏éP ˹•-5¦6AÑt‘1ڌTå»ÁŠ‘Írˆ/ÑÏÀÅ·E¶*$g±T¡Œ¤rê!iÐÖÌeNª‚ùš˜ÞZ_…+R6g#ÓM@$›§‡Z”›kle–¶c³l!SH)gT +B›Ò+¹# ¸^Œn~º)][™¿ùÍ·Aސ8q‰„ÍÌi/.°£ߥÿ~:Š³v*ðéHÁMpf6Ê"~t1®ðÝƋâW,„û'V‡ÚˆU`6&úzêÛçž2HׅO%4=ĺ—žÒW*BU¡¥a§O|&@$ÈQœ#®kúꮧ°ß1>ðã ӄµð6Gwé¾ÕDä‰Fß]e¬ x3º××½Ü6Ê·„ e²…•Ñ +Ëý°oÞ ãòW×nçi8ð‘£,b…GßUhá„tú).ò'ãÛìÀŸå@®47 tþ*_½¬l*æ/éX‰wþ:ߥx¥Z¡oHÁë2qC¢cŒP0tõ‰ø4Ô<‚™87:Ḡ:ùWöÊhþÒÜ,--uiŒ@*Æû «K§ùâe*+q×Ç-õüf4×ÁJ;â¥,a?±ü̞_áRuÃwRZÙá‚? +'Á2ú‹FôOê5&ûQý]FÀe¥Ó¤šþKq×Ç=OÿÌ éÅLãpAÙQÇ9ïÒJLó™1œOqG…ÀéºV"V~Z,YžX$øêJ\cL©O©²(OƒÅ±*ZÃdÓq;O K Õ­‚ÝÿüÒ/ÏÎVÞêû¸pU' ކžÇc·0à †‘ÊÓX£Ù)CîPÏÚK- ‹v¢DâËäÎÊX@¯êâ. 3oPʆ}!hB&„ºx”É6‡ QƒË|¯º+«ßÿåÙéOO¶¾oÝëöÇÝAqŸÛÂèJ3t¦‚ù±<ºq;ÊšL“TÅ֎µãL˜µÏ@«r)‰éšS#Ÿéu _Vm³ kL7)pc^åR2fy¥)ŎܐÓ೙] Ý ?EâW éNÌY $€N“Ä©h¦="à Øs0ð·à3M!z%ÁtÛó½9Yì ]âf¬„Av;1 +ŒB'LÚ2É#˜šY‚#w×iظ'ó[šÄè¤Lè´G¢X:¸æ[ L +i3ÒHãlJÉÖos‚›_âSnÔÉb;×0(‰úã–†óÀî胗Œç¹Îî†ö™õ/³™Ùãì­¤ëUÁ×ØìdNÅSž×$‹/’„ÙbýËV¦Ë|VÛ±_NùՂ$Ë¢1Z„B·«33¦dH„ßrȦn+@«‚>Ú°3ÜƉ³V¡•réݵ(¢NÓ7(›JÎô|äÐàMfˆû-X=dG•QêCBÒ{hߦGÎ䒰 -üEiû‰ëÊ'Óz’¬$Gá%'Õ:OUÉjg Î +}§ªä2m§t×O@³ë2-Yú]ò5Ò81ˆÂ¥a^˜vzœ„¥ê M­Z;²¤V¹éó'ôp2]î~*}jNŠS\…4ÉǪJ&Y 9žpΏþœóü'»¥•D ªÆwCT=›™ b!O>ÿ÷VÈmDF؟ è²emçè¼Ì5& +ϬYÎb›‚;UÂú&…ÐN^JEûå2MñFžÔÈDà0¡ |%F>ɳ€µ«Á% +Έk©ˆ­àk¾ #çÁ_„ˆ Ӑu•tÒWG +\Îö­P+ߪÑóŒ€c/ 1Í5ÓUƒ“IfÂ6 ²jëxJ#aóæiœØlÔ AE†0Ó•$UøÉK§ª“ºc“Ï]dJÆؚÅqè#‡‘u cgÃ׏ž©V1~‘´ÁÚ Çù1t9bÕª2?Ù±£õÍy0^5J楇ÛTùðG¸ ’ÛÇ2×þÀD¬!N"msêÛÑ$ ¯’Q-£]¼´LŽûòSè—O99á—ñÊé¶@Œ‚™±Õx´ŽdKÛyŒ×ïᕠx«¬ÌQeû‘¥Â Xðj#…ƒl´Nî8Žð¶¢(׏Á~:³‘i%UæêÈÄèk +\»6ÜfYŠ¾!Œ7³2x>±ù@í#l«8Ïa„œ¨FeJaüLË¥”)‚8”y ¬?rmoÛ1óP +\5VQ„HR —uŸX5KPÞ1YÃÆHgº3I³@¿Ìԍj„ÿ-¶‘¨pVÞ¬¸f„@Gp¿„YàäºKe[% ^èiúmCŒŠá‘&ës7!²«»c2†M¨¯©0ª6,²L©‘g°ž…Q‘â•XψN–Ig<€kÚâÜúlÌÜÒŽ8Äx€yrÕÖBȘ…žQ5zLìA0ÝáÚ‰)H¬ìL¹‹P6;Á›1Œ* Ú ÜMdo]S êµ:¶e ˲ötXB-̉jÀµ +²•à•Fþ›AxÇ· Õ9Ák3IÉh«FK( K,g–$üÈ,ŒÞIňÖð€Â¥vfÔä­w©ÂKÖ÷°%º½6ÌØð•BÜmÚRÌ«íÝYRߑà†W‹ÓÂ4¬82ß*•ûhÅÞêYm+€IºÐWmìT!t=H÷å Éx >[2Þ ÄÏPQgöY*W˜ð2 qØÜ3˜èݍ©Ï͈]xQ~‚, +w»Ê;tÅë«âýô¢ýîÕùãћÙd™Cî%êY’T42ˆ„³Zzƒš¡ð(E&c#'þò`ٖ +k>´¸³¦p-%òIÌÂÈO§ôtDOô0±31 ^ :3ËâÝ×)8—mÞþ锞Žè±â‰&Ÿn +¸ÂÒex•e+‡ #oÄéL½ +^‡Ø6àvpfg~‡Ç67âxx(}žgçû&\Ï.²ø¸y*8€7á}pš¹)÷ƒs­ üdß¾› x ¨ôޒ„½%β‡—gå™M4*X7F”†€ ¨36Ìç*¶¬Op¦¢FUO­`Šê*°€\ÅaÕ +Ò0M\è)6¤Tđ…![­˜ïçéŠ]£‚&RÀl£‹‡/³¹yÚРùA%0 ‡oV%°T½‚NXjS­ÂÙµÎꞀƒ)o)³6’ ­î©Ä×J%¿Aá Ý1'èù£á‹q85í>:rpÔóÂ_¾þêÇü-³¿½ÌÌßç5ê±ÑñÈrëx<›\µžu†×Ÿõ|Ü£ýš[öדÎ`Ð=îÜ\õ»®è+C‰û­—³a¯uԊ[/¦íû …¿m™ß«®b4ÄÊ:s¥[ƒN÷ÊTÒa3Kž ¯Jþ0º“iÿrJåzÇ*íL-ŒZ<|]PY7^x-Ž?Œ‹þ¤¸ÿm«íÈm†¨LìÏ0p½ã¹¦Ãȍ‡GHð û ÜNÍSÜzðôüxl&ô @§ý ³¬ÎOÎLÉäüñ 3=·{12ú²][2îУÇá˜@˜¯6®.ÇÿÜ¿«¼áËK“Ô¾Ü|ÇÿìÿÞrþYû÷Ç­¸ôöZÝÿÔãUµæp6òªƒ'Ã[äzHï·è_ Øý–;jâmG‚¿EàŸø’ÝY¶Ü¿å¥NÝù±xG¥[¢ü/<¿° •Ù‚S»¶`Ajó$!ŽPdF¤•–ÑRZ|†¡ÍíofϦ̀}ýÕý? Gï†øí½ƒ“IçüÉÙ·­û?š„íêþ³¿-¸Ðý“ÑõÍÈLÐÇýé2Ö;¹êô‡-[Ă­§é¾+ólô÷îOúf»D¤H֝î›FHŽ;“~·„aÅî#¾ Ö^Ð'be§LGï‹î cD,µ—]à–Ÿ¤%ó#lwRÇ=Ÿ_^NŠé·8.KQÜ{:ÌP¿ÛÅ{ȱdw7¸5…ÈhDŠát6~[Œ'Ý«~qaÝï[§†°G./‹7æ÷_õ§òð{ÏgӉQق±‡ýÉÍ óÁ>~ûÙ=/}ûƒ¥ÛÓ¡mTmv´»«ëóìnŸe‚oç/³®}ùmoæÙ¾ö°Ñ>ÕZªp³:ë_ß üf儍,‹áAdį\$z¶ñü{aVá´Vóô-nZÀ;ýa§?ìô‡þSjwŸ1òê D€¹M,ýì›XõÖñð¶NFã¡áõŸdëxÔ}S [‹±A\ Ýbõàˆ¶ˆµ´.ÃÖ=ˆŽŸMV,†ƒ­òÎÚ*?†bëYm–”í†\}Xû¸†QĊâ"ýÌ©#´’Ó°³(Hé1ÿy ìçvã oz]½kbIЛºÓv§S½kþΤ­?t†Ó¢þž GuF{æËu{æÝåeù—xÙ^Ê#·Še¬àÀ–r£ãAgfzòc1Ž;W×Ŏ8)o[™±ŒìV"•iîŽßú㘩–pI“w¶/œËfàžËLtřLñ©XÚÖ(¤£$…Ó¼m™Ê,‘xÞZD9ž¯„̝ÆsG©,ƒOBH¸8šƒ±c>akZ:oÒݞ7_dÚ,ÏDýù÷FA>„8ó>¯c§Yå18þ ð^qŒ ‰•LÚpßvKäFNmÇyt÷NAD"ÉQ‘Žrieön.'S$‰"Èõ ý­}\KNo,ŸÃfRâ9r¯7·.ÝEž+ÖjœÈ,9l›lýš_dËدÍU1È`.«2˜GÑêæ6Ÿ÷m>í çòË&їŸDîžCz;§¶ö`üãì“ÿ7u¯ +ÃY† Ëtfû÷bˆ4;h:XÐ×Ø¿n_¸á°Ïgðüd0z·N¥z8ݴή:½Ñ»åjTyý9ŽÓFۈl³Iñâìôx0/5¦7¹ëäcLé“îÀ©Z“´Ý›N·lâ» ¶’¶{1Ú1 )uHpPÜzôþ¦c˜êqq9­ŸNzÄ-؟o Ot^OºW›îÿ{àÃû̇îú©qyñ4eÁ7¾ehlâ{[Œ­‰O³)¤×¿)ºýÖ!B®×Œ»ß–0ï0sæþ‰˜ûŸ ošéÓûËڌ9­’mÇü“øŸ*»,ZK“ê` +ÒGÃ^€t}&ӝAaV íƋ‹úí¾÷§É¤_›%V ÿò-Rà—_tå¾þêE·ŠJp4éoÿN?7XRÀ;ÞuÌ2fÌՙ¼î½|rÜz9šò+¢DÀÝ¢X!ÑBe-ÒP¹ø“bpÁå™&hôJ¬/8þÛ ¹¤ino^k ©c{HÃ÷*œ|èøò«s,ay8`Äåe’Û£³p]¶»¬N”Ë?ë¼6Êw‡«ˆ$7݅®¦Yžb0‡L¥P˜ä2Uî”M’aH¶ ã6ÂÆa[¬¿‹ žü&Î[Ç¿Qړ12µ{!š’ +_ÃÕڝcÍðaҕ.íE†]:ÌÒPëÉodf0ÇI0©)ã 'YjG‘°Ó€‚ñcnl¥=ùM•PBuCj<å% 66Ӊv“ÂÏÀ£„V +ó×àŒBœ–±‚ûŠaXRۃ½ŠñÇÄÌÛ<ÁØS› œš í>þÎ=N¥EìZ‹,S™;£‘ÇðN/$,#“@Æéû±‡;3K¼C§Í¼mÈ}FéLShè"Fc†µ„QÃÑ#aÏ Åv6åQœÙ)¯Ý¹î”¨hèéœg‘Š Ç942ñ(S•kd3¸Rœ#pŸ$Ä鶥 å6…húHKM‡Rã¸dÂ`L•_UI ylak8òƒíMÏí™)JSJڜ?6NÁp$~8L‡pñı‚뇁€˜6׬Ä(Ñv¤Á¥«ð¦›6Äý´_3©Y‹Ú6ÃLë4³c!hT¹›vŽ;L±â^ +àʔÂã`y”a۔N5º›ab¦¶q|’.Yl\ ZèÔ3º† ’ "eg1´MJ¿Ü²TÇH'-Å&ÔÀÝM'i‚戚“ežø¹YM– h…ˆb•+{voîä,ßÜù"tꇗڗÔ +;ª¨yÈëÍš%ˆëRi‰H€ŠhMÄ)­ \ÀXÀ?â篖ØÃP„[m¹ÅRbйò ‚ìá*·&"X¸f€ }~hU®5¶Ä ÇÀXn‘í¹=üð*âƒî„/·”˜¶P~¹^±w©Œpnˆ’ã$ɓ£5Úfø҈ç‹Ð™A]Ïö"Ì ´ÄT¹´7ÁfpaœBtìÁ“Ò¶’Ù‹$ZæQ¸§xËl¹ÓBñ{ˆeÊNsª´…Ä8,Rø­Rf°>Í"W¿Ù•ÝôSš3 ì2@KßOCZ˜Ï®Œ€j†+\˜ml'¶éN–$³™. EÖ¢`&ù¡Ð°ŠXá +NnÛ¡4ÔB1Àß.AÃ÷rdø¼ÙÑ—6;Ã`³ƒAμpŸv0RñšÁȝÙÊâcèÆGjÎÆaðfÐ`\ՉHš¤–fx);žé²BZ$ž›cÖϧq”  ¸¿¡„Npy> c¤©ÊEf9~lö?œSy–c4 %àV–A "¿½$°ÔîX™ô˜ÛՑª1g*2ßqwI€ú+¦=Ûí;¥ ÷­€YÆFbÃÑK”aó¸¹Æf9à%³z…Ÿ°k¹‰&æF¦.Š¨b†ÌB4è-™Íª¸P u´F‰ƒ·X·bÍB Ȝ),‘=UšZ晚Í,±«4¸n#O"“ÔbA‹.rqI1Ò8FFMK͹PŠÿ®E2y æW;~æ+”ý®} ¡-k‘¸‚¥ÊÏÇÝ«~¯(jT碉àÇWˆìld^0®Ê\ŠèÉhг±%kQqQ‹lyðz€ƒÔmIWkUîÿùz®,m÷žŒ;³Étv Ñzñº¡bf7tàÈÁ6)µeI’ ‡7šW.g˜Égƒã@´_ˆÓÃä“0«I#ɕeu±=ox² mT+œÀþAdÑÀÛ´ß.§¸ai£zà®m6j Õ3,Î6/¦VÍqxS\Ì #¤+6üE-€§À—(MŸ4{:n–Šÿ/Ið¸¤çeF¾P¸=›Êuø%Jµ“/¨qó_·DŒ*—ù빃4Ìû«Ò̲W³-i»«Ñ&u;\RÚ.íƦãùíÒ¨–È«¥Q +d™Ñ·ÊLJ ›ÿBHS»£ä’zþe¶®[(@öKñ‹Žºñÿ4Y"…læ¯W°2¥s{шqþA>MœÊE-šÿ²F„zLmj‚›¥½BÕ!Cmþú%øÇââ²3¾W ›â†å+:J*V èç%)0‰Yҗ€iv‘(% .«œ,’°!-Rž:VhC± ¤6ÓÕ·%Cª$v–’¥Ê´ÖÊ´m‰Ö†W:,îóA!µ¤Y,ú‡M1k5µgWb™ÂñN+žÚ[Ýé¬g¹%goꗙ4¼@ãD“©„HÒÄ tl4s‰>YÆòÙèõ¸30SJCh+F&™NˆyšI㎢’t–[ ‡´Ž³¢õç{éwYüéҟ¿uö¶÷¦+ +yúd`SÐd!£ox>î _CuC@U¿£ª˜}ˋcood«b³+“Nû“iÙöºè)X ñuUfž…Ã4_ûó‡_‡·2-ÚPm‹6¼JDá¥ñ€êïlë;ƒéåàoÿËtã|ôÖÞøªsqZ˜őùæ¡ÅûéE1†NçGof¾ÝütS\/½Ñ»!Ž ˆÉ¹,½s c¿j•*?§ºéìz‚E©öãþ‰õò u63Ňîú®^ú¦3žâ^úÃ7ÙåäØ ±‰ÏÏÄÑ«g¯ÁÓ¿ÎZ;oG㾿ÖUøëìòoÿáJ>Ï Ëì· ·4:r­ ½›<Gݙå©i/¸$Xèáqî²Ëû¿<;ýqÔ+–üüCëÞûëÁÐ82nÜ¿˜MùòÉûÆãÎEó‰Þ”3‚¯‘2‹áÜ}šô3ü™ú«4ïýãprþ¶3žüäx˾í¦C…á‡É’‚$æʹÖLʏ;Oª‹þ°gº-êPʐô¬˜þˆ4©A®°øw·¢³ÃÑpYÓKŒÌòîÕê$ý”“âã !V¢ÞX÷áÛZ+£Îèn}ð›3…ïßÖg PövLrèg×(Ä£ë[Àþ>ëý~ÒÏ6졆Ñԟ©_bݜÁM(·«=ûµ”'—ïnÁüÞN>{Î÷fìUÄqRK{ü®ßƒ“œ5†Ü•¼Œ[%ªmþÏÖvÏ葯¯jq.z+:¨“µ]{_o¡Þ’©lýh}¨Õ¥·¤KO¸´?£©-N‹Ëéóqßh²µº·XéÖHÈÏF³q·8†HåOÆ)÷EC|ñ㩏Æםe<§DÏËþ XYº<3Ââ·bD?—:8íŒ_S#OUgòôa­n.VÚ'+Âz®1w†“›ŽÁØ­ÇËnËÌXÓËáèØ{OFƒÑ¸V/Ëv¤——/]Ó>â ߊÞÝû‡ÇøONvÝl,¯wo$ûC36ƒN·æX†ÅoÍþ½~{ú² +w™Óߊ&n¦ýëþ¯˜UãV5Ìèð·¢×Å´ÓëL;Ÿ 1ùG7æzÎTkM¥iÑ[…äxP=¸“ps2Ý<{æ¯Jà˜çV)DøáÄÿbd˜vèÞËÙ —ÄzŸ´ÓÔ<£óL¦sÿŠ7» ¯%sÛþA}yñà%éB¶ŽàoÅËbðjôÒ6À¶èÅh҇ÆãϒÕ¯$曧“ãéŨ3î=,.;³AèÖðs‚Ê !‰ªó”ŒY ¾éôzždöE×x‡N6¹MçaAŸ8mJû@ï¦ß&c Æ~²¬†|¥!×vÔºä‘4<`Э©™s§ªèϝyˆó ÂtPÑ»)À!COú•MÃÔ/%?°ZߧìM;ƒúuŒˆ65È`~>” +ÏÿZÂ(ˆ§y ADåƒÎ°x5º ¥ñer*—Ç|D¸ÎI6Ë5… ê6ܧÃ^ñþqz{àÆW©š77cWnE k™HsÝæ{j拆ì™ílYÁR$xÞN—bìƒÒ˜ ‹„êv¾¦ðtÄn´L¯E=’EºíëËÛØaŠ‡³q÷ªõj\ô/ §5”êû˜BuÕ²a‰/¾°;OÎ奮æ4®eÈF¡»fºùr “‹¡ç{ »é“þëa¨oÊU¼ãÂ<¯Ä‰%Ñ«X§`grџ^wnês¼òÀ,ö}0n_{Gá²"F÷€Tº*±ªCP”7#Ãë»ÄëSYY|Ük%rTVèðó%/ÍnÍ©zѧ\YìÆEš¬œøâ×íՓÑ¢£‡t>_l^6ƶ¶àÛ5=toÝy íb¡îpA‹œ/45O-²¤—o!ðð¦9\ÁU¸y}ý¦] ÁG²’]C± 'ç];—±¼åïÁb©Sɬ‚)$’¦Æ´¥®d‰PÖp<ÞæUuã/ÀÛ³®Pw<ºYW䬾‘!֕=nbøԚµbß îš‹Îx²jH}7  7¥¥§a¿Ö7¥êýŠCvàÉ\Kj”ö-©Q8lIÕʺNÛ½ÁŽh ݌/G‹ö·ùr£»søCÕhMLw},A¥Ð2i_ôAš\5è“ö°xÝ â —”ê. wY(hö¥álÑEÛ%u°šó™‚“«Žç‹UԂRÅŒ |'`¤8Wr®XZµ¼¿i—Íؼªbãñ|ŒÆRU}½PtIA·e–ƒzV´!=kŠú«¸‰)±²Þ»¤ä覻Šã`‰Éªáǽ™×ãûSÃeÇEëÁìrð·ÿg2¾^£Ï kÄ£©Mjl&Xìr6쮚5¶3#ðÌY³ƒ`¥ÎpÈ!¢Õê2[«}t¯CYëÞÉÈ讽ÖãçO^>ˆó֟ï=={Þ2Qé‘ü^F‘‚tK+õÁk#†²c•8j +BX« ‘-¯{ýa•†”M¯ÖjèV\­Z3ëöŒ’bRƒ³—ÊW²ÑúÙ¤x8êbÄFµbÿ€j†ª}hÒÞqñ¢ÿ¾¼(Æp“BÈ@(²ÒÚ¾žÐmhpтÎ\ik‚1éÁØÖÂàхZåwY£Qã—Ùj5ÞÖ<ü34ÂvÞόöÝ¿æ +kí&ÿßÿýþ¿ÿ×ê%ѾLÌ®Û_ŽÿmÅÜtåºAp ÿÓá›dš +ÇÝݕñâá㣟Nй(@¬„“£Rú´ß.ZÏíO¡•3ƒÖаXàn½Ü' +<8;yú4Ó è-þªþÇóüÓýoüÍ?ýÐùå»ßÇÿøüèø·ã'×Wß¿þýïÿýw÷þé¤ßiOþKòÓï%ÿðýozòߟ©ÿñýéŸÿéÙodznúø‘|–}#”ú‡(š<üëÃ×ßEÿå·?üíþíûîfòÛÉä}óšßþpú÷c*õûéñëßýÏÓßþ7Uœôóß»Ûíz½ð®ÓÞ¿˜¦ó}ú¯O¦ÿú—cõ¯Gß=øÿk{¯ítzäQôþ[‹w0“sN&Ódc“ƒÉ`ŒÉiÏöÅ~šó çêÜí;’:©›N„oÍÌo0ÝTI¥R©¢j³+ÀºŸÍQŸæB¤=ÚVòo­o4éGa"Mëþø›_½ïD=ekŠcÅß õã‘я‡N¶9my»†ìì Aô"FÃÊ%ýÓoù“ëøºúIþžS¿þ®“C‘‘.=u–ñHLß"AŸRƒÅ`>ééü,¯NZÚDْͪƒhg€&øg0O3Sï—!õë†#‰7·Îœü°ŒÌñ”¾A¤æS´YÐü†§Óñ +~Zš3?¥_µÓaûKí(´fÉõ[Lo=š¿/‰RMw€0ÆÅ_7@ã 7ûñÄvªß˜ßËa»óý¾ôûí§wâ8Í;Í«“9MNM@9¿~îo¹³Ð2eƒEv–ß VË<¹önÈ9tJoñT>¢ie,A/ì’Î÷|š¨?µ˜#ÍY/äšhúntû¦õ™4pYz¾–ïk IM®Œ>+Å ÍYÉáìkÊiû8¢#Ôæî¢ñÁ½Ð8&¯yúÃ%"Ô§H+S$ßOY2#š«ãÊn;ÌÑhÆâJÇï Ö{$<ûû ÕdF àU’^ x+Y`†Ðg‡à4¼Wá[súΫN¦‡ˆÜéù)æñu}ÓD=ýgNÿ؋‡Ìx¬×&}“ÆWðó­ÝHTRÉÏôOmyˆú¡@“ôtêC’ ]߬›:Íͤ§¨é¿Ö0µüóÙÃ?›·‘ú19 £#¿¿:Û±µÃ¦˜¨”LE"mœIêд&·dóÞöeŽ5ÇrJQ_`×ϯ‰zá|¹ž¸%èÅhÕ4¨ØA•Œ´eº³·…k‰¥Äw܍ø 2ŠiÀ#&‹9¹ øëÅ%.¾¸ôbìû=]àlpRJÙÄ°àD|1ïÃ#ÂðS´%‘z×eÔ"äH¸ñ]ªÁ9aÐ퍩__u•1—l˯`tvHØÔ23Ȩq°»6:091µø͜üái£šðw]-þ:|æÖMð×lÆj™…–%¸šSM¢^ž™°‰ÓÉRg%4^ô*ö^¶ãÿ›'ãr¸²žò5ûœ? ãç:L¤½]—9šÁ«Ù©yMˆLÚëOú¬•&’=6g®iAXÓöÑޔü;Ï6Éõ¶¹KÔÛZ£hfì3–݇‹ÐYý½DõçW~Ö×%}æÒ/%:é}ÎÆ»û%Eb¦ÙÎÑ`(öën"¾xoCy?JO<¿­Dãmz⾧KTë½uàom éƞ  û®àˆ$W†ý’ˆdLÔw«¦1Np¶`¢Ûé˜\2†÷C‹=yxO!CÎþà¼võB`dçO?@~O5Þ¤ó²î%j£BŠzLŒâ‘\Ê^5<(é’Îîe˜¨]êö)zÊ4ðÍ&~œ†tä’áÕR‰Ä*©­ß_k…U#æ(öøg–t³„£Ðy’ŸÈÆX|Óà'ø¢A?B_Îmȹ0 í(ö#òOç8Nÿ Ñ°pògð1øIýãüK¡WH4iúð#j½Zä‹3’^j@ü› =M8 Ô,I¢a§K¿E‚\ÍÒWccGNNMþiLÖ¨ßvµešÂÔS†h…Ñ Á¥©_8W"ä/ «^„€}š@`Ö,aþBWÿÑP€ÆI|ÎÎ}Ÿ]†$ùŽà®9Æ%4Ñ(µã7­êՒvÕ%šñ¸C¤X@éبáà4¿"89:À ¥ÞÏ'û +ZfÍÙÙ<Äú“¦µ$þö éÀ°öÚúA¡q©³444ˆ½ÓÀvß°cCÜÂ@£(Í¥¦+XADϺòÎù–¤0=FV „‚{”•Ü}‹q ó38ÄÒìXc÷-‰FèUœ´º +}Çc|0ØÒ<=¢—tI†=o#k#š@jb/£Ù€ÍË0´Ð(嘗EÃÉVìÒ¢Cƒ(Ms+XÐo®®iJԛÅ-×ÏëÀ¾øqáçR0±§ò¢DŒÊ¡6Ù~óI(@«V-@ô¤ô*ÞÒ4©å`ÏLWyfbº‹÷ü)nFá:Ž¹%aF™Ò «1Fꚟyã7{˜rì<‡&ÞÔ‚©ßKµ›.I|JÉáß áY3ˆÓþƒñ´—û††G1éÓ ÆIò+Þ3%¿Þúg¤‚; +Y§_€T¸ „¸?ê+ÚÒù?ÿ˜G9Šþ‰m2ts]ª'*"`{°Mùƒ³eH’F}>³²ÉµoÑãÙ¬r‹ u^IgWos°Ï¾"Э2Ÿ,çìþu šÃž.ܒˆmÑ#¬‰Ú:n¿]ç´«¸â u2“ë¦9 ×Ê#ãtpuWšÔï·:=Ò,з ۊÉUÙ ¬ŸÏ=HдGɕë]Í>cØÞšmÖ¸TŽ…îK‘Ì·Ùn~bÐ7iˆÌö2r½7’¹,Z{  ø§¥Bòë3þé2v6ÔP/·Ä×G­ M}úAëÏMqÄNçð¯.“OGio[gO•ùQ5@#„ýqÔ4[ñãñ·¡r+†0„±ð–)ÇO0•Ç€WöÉ\ÒsI:œ–ÆIÍY‡Þ  ­Ìƒºç`[&Àӌ%~|-ä“Ñâh€èjÃÊ2ۂãªJC£úN׏LÛxëˬ ýškKp ÿ»c²úʅ’³¦ GӈÇ4”ƒVg¢ä«ÌNæ@Ë}+ÙÆ._BG‰œm éëìfýŸìNÚÆØHà6Vèî'µ<-}ékèb™C +Áã¸Tx0¸_jp˜ÓÛØí̦ŠkôJÈPÆÎç9Qì8gŒ„~/~ÌÒ³MÐBs¡á5ý£9Ò©œ†$©u§ŽÚHGyfµÞ½¡ùH7§H•û´'׶ªÀ­mY]$ôÑô3ÃÁ[t¦,ÔñCr``Ž°_†û€ öiß1‚yx-2{wÉÕlüî!×u„—€«Êû{˜4ì«þˆ;3Ï *“!ÐXÂPöü3S³ã;á1¿€4lHý€ÂïÖÄ#±†.ß,{Io³mK|™>‰jÝLdß²}r圑ö·'©ÀÌ»=ï•LP©¢·€¬ŽÔ„†¨ë´5b¨ÑuÒ?€dÉu@kI F«òPºÅâm÷Íò| ÿhk¿¸ÚDaõ€cµzʘM¾ü¼ƒëµ&ñ¦ö|fP—À2/Ô¾s‰¨&½u›•}@²€^íÈ÷² +sä"qùïç'´Ô•®gIéNÎ$49Î{^s¸¿ë}³¯Ð‡4ç­¦Éÿ1 Wx€Âóq…üy¡Ex™±ìºN &½ÎDÍKô³›³Ißû#… —‘H•CsgKù—ÔIb¾v6õ‘jÆ…â%2¦rT÷€J}¨‚•Ž0µ‘b ‡ P¸µGAžrK­ƒ lÔ¢Ï÷Nr‘ôºäedj-uú§6Ú¥–¯Z/àoO%±æwKj'¯²›îƒå»î›J(SŒ‡“{\-§Æ1ďÖàJèxÂߟ}¤‚#{¦;?ëx$ þõu  :‰ÝoÅÄ㨠ÐnaôÍ7;|0¬Xc£è»Ï-Ä%ÁU"SOøƒU¤OÓ?_§")2¨Áæб–JôD*¾¨æ´ïÎ|"h_%xoQ¯$Lñf=?&"é36 —5¯ñPk¾ˆöÇ!æ"å É¸Œ&´d€—>yӝ+©ÿ±#P"ÙuycŽú³¹ø¡î0K…$ôl“9ÁÐÁà‘?]¼ùS¿`À£¾Â%m«Î¬ñÐÇß +ÓÜÁ?uß+±MQ!!fß®RrCN` Ó¯í¿óÁˆ&7¥ÐSÉU.éÜàtJ[&D&bÔ¾5GvÉM%ê½fš¯Wp¢­ºÉUØiÏ󸺝7õ#°?l+æOýQöPãGÍàœþÙm|çèƒNm"õs_o£¾ú„  T½mûoépyW¿élômôŽ ôO›Ý7Lò³4@¿¡´h§ç‘4$.f¾Àt› ƀ÷nM)û‡ö3éÖxlD÷|SÒÚø4³c0'K×mx2 ¯µøE†“½‚Æ9 \uÈiB‡Ô+QÚf¦Þ-@mµè¥Oøke¬Cç3±Kü\‰ˆ¾@ \Ã0¥Ê±•Íî^¢^שmY)îh8€‰8Î`;×· ‡+F|Ö92ÓÎћŽçöúeËêz>’¡²ø…5‘Êa~/tY«®‡‚^%¢Ÿ\ûãZdiPVŒxøM(:ª!ëOäÈÌ÷U”sFGr½Þøv>÷GqÏÍr’™8"z\ɦ@úȉõxc%Dr$ª»Ò9m©f´µº0#gÏ„F—™¾úúÓjkõ‘Ȫ9Þã?äª%dN‡6:0ðÿ|\‰§”üÎ؄˜†²oE#Üʘ+z3 áÀ*tŽÐïEË`?µ5a“D݊Gք‘dhFAçC«Il@°—©LpD0ÑS7ÈÊJ4¥w×±ÍèU·/5¡¥îÒoõݦo÷·™D {:ý•0¬Í”³±9…ç!Ý̺jÄQGJ½ŒMçW¢ó’Lö ì@â·û5Î%pçÿ\æG¾ ޙÒv쌧qŽïà ր&^#ˆø"¾F,p©ÏäÙ؇ŒcD h%”µ\@I‰”5K¬Í´å1hfzy&VÛ+dh *úxLΧí<éYÍf¾f£ß øc©\ê·7{…VØk<ò夋ÅÈ+Ïæÿ,LŒu™x¸ßê¨ÿË u—å0B¿»ÇðÏ>Q]{[‘¼lÁ{©÷ôÂë{X.ßK(¢S˜I¦!¦S2²ŠS´„¢dډ²9>uæ÷¸ÿ5’ÀHú)m¶‹d÷ځ•5AšÐl6­‡\cÓgrmuÖ³ín{ Öæœdýä+ƒÉ…õ/¿03DŒ'ëÖR÷\­¹ãX:Åd"`ÉÃÑ-y:!®ò¨O/¥úe€Ž•œ&*ÅŒç.:.Θ¾^ÁY1ï…Ç­Ý_ڞùªYp·Ì ÚÈýďµ#ðþÈרôþ(aS"¾EÆsx—™úŒÞdÙh\ú·ù/3χMZ_@(zÀÕÚnÆÚ ,’ž–ÛŠ±Àr`Y$êé“Éw(ŽcïÀ‚6ë+âä"d ˜ÞÓÐê=Ý_v4ˆÝ(Û„ÌpmÄ`¸¿R¿ñ™5_§Z<5ÀáúúÖ†b2øìZvìüyº.&–ÐLõf&õŒ—“Ô]¨OäfÈÓM;SºAä~A9E¬ì§ýi™ñèϒØÆԟÄÈÐwÁMñ.¨Ø)àÃA8_ÉU}¡vcf3'(Ý0%7 +ŽTþŒÃ7éäg²|!M_Q6”784gÊæ ؀f ØKõSfÍh Ý^ldzÚà¢uËA‡¾m¨ÿNÏpˆÿ'Ê&röÒè>c…åžùõú‚ +7vG+ÛÇôöROÁ¬Y˜³ø™&†ÌÄ)°pð]z ’4Øúq¹W KeîÓï~Žó<§Ef¸ué"λI<¿WjÕù°Ыôݟ‰£då gU¬‚Đ^ÎO/§åvö2[ÂÒp’¬óåötžƒEß.æۗÉ|¹y©íÑÕÌÇí x8?¾à,xi/`<¡üÒôn…jm/Íùñ?óí €¨àÁiþ’ÁA[^Àsæé ç´ÿ¿ÿlk»ÜâH^v3ò;ˆ~óRÿww9…ïfóòðëÿm{IÚ^òÛ4*r£†§Q{ÖÍÿýa§Ü- þŒjñÿ¿õy¹˜Ó£:ýïÿ̧+ô9”Ëv2_·°.ýt¶I3<͚ýô¸ÜËÔWÐ+BŒOçÖ|¯VT°ÜäY2èRï2E÷ +FîÆKrŠ­D·^ý8ÞïÙ«„…ßô JPéé +K_.Œ-8¼a95ޓ÷ /™Úá*Ty·ÝMaGäyz÷Ÿ-Ùð*\°Üæ¶ûDD DÞA ƒ=@Ý· Eàçn½”¬‰ä,;öⒹ5G¬ò/êZx²L}wÔ©Ýv†ŸJÍ0:X êQln +b?ÿP\ªOÿ¸JVþ÷Cºú†e/t%¤Mýº•ï’7Ëú$°dãÿb—1c 'µÜYˆH›úïe3َ—k%u™Hýº ŽÔÖmœæˆu¼¨Ö啛x}Ž_ .¹ýØ«~ÐM?JP²»Pµ!~ð \O-·§nª–ž?ڌ<Ü´£®äÖ%"‚„dºù-1Ù1µ‘‚åDŒäG÷@µà?;À󌖢D'¦ÇÝd|'ìœ9<Š®0óKϔ»úW•”Nêjë»HT}Xb恞s^þ,™Š2‘¡+¼åJ¸~S˜jWǛ,G ¯Ô=%<‰¯ÀB× _ëÏý¥²+þ=’”€Ü÷´¢Ðú H«^OüÓOŠa…Tü”œ(O$HÃñ©¬¬+‚œŒ~ÒNKʕ9ÞÔ1@hy(a‹®™¼Z` ƒwHM16**$¯.p?Þ25îL9àÕ}ê¿»ÿä–xé½È{[溱ÖÌf¶`“±³‡}‚ ´îÏêsÀìRNìlæR&ovà <Ÿ®…ƒ€m"HNDö?çÊ»sø¹øáÜðËã|º(֏Òõ´”öøªêN–/¢KÍá=Â"U3çÂ4ü9ïªÕ°€«# }šùà0³Ñë%è[§s˜"z i@?TýƒÿJ¸îÑõŽüæXsbwØÍe«9ö{vÃO.Oä+äf|1ŸÐƒ°;V?'Ó?Áì*§©¾a„3ʱ “S²¹KA˜|ýVét<†Ou€Å’wØ=5r"ìØNâÜt v+c¦s"Ôî±ï8EðÀÅͪuhêäÚ¤W6û)õá?ðgv ~ÞIs±~ûåï/a¬YÿÀÊl‚XÚè]æ!f±ú–Åì›0ֈÚp<9ߎÂX?ßžWWÈÄbhXÄ'½¥lÁêý5ŒõŒ0VñÛq-„çúJ `r›¦±_—„¦ë ’ŸVŸF»=ßE°vâç£ÆbU¡zaqVÑ9 ú ÖlÎU¥°«­VÀ‘“ w]a!ïñû-AÄÆë¥5tܽµÓ°zvW Ur$)¬Ÿz=«×»îY¬C“ˆ‡Çþï¶.‚5>öù ­Së 6ªŠa…™´Z·!ü-<݈ºÒüΫÂX¿RÆèA») a5‡×¡(‹® —¡L±n¼"ŒÕÓé8ˆ ãCë+±ðk«WE+ŠÊôû„Èt}š·Õ¶œÃ:vd-£¦0Ö¬#¡Ÿü„ áù¬±Ä(¬«Gä؇睢pæ{Ep°v#Ž’ßê„XM<¬Íé57ßùªc« öïùl\êuÇ"X}ÿjF Ä°¦eS?ˆ°"NãM7ÅÿŽUA¬µ°Þ-Šµ8¯¹BXÑAàéYµ¡ñUhº§×bnþÑë ‚X›úíBkí÷k4AXšëéö²ŽfqÆZr¿5ˆxä]ë¾ð*„Jhˆ¸9̾žEˆÜ«8Z±bZk9š¾ú}A¬ýÊ*°¢óæzºïŒÁúpôOk«0֏¿ý¦ ¸yX!„x˜·nE‰||«™Õ"X; Gf¹)b |X_Õñ¾VÍt¡ó\†þ!…uâ6ò6±[›V—>jÈqçZrŒL¡Äja±B41€ûw Ï€÷#ëi§{§°žcfÞ\Õß㞑Ěì8ó\¡h9žQ5DÛ®%Tފ¦ °¦ÎWr1÷ê#±ÆœE+O(ZöžòäqkC©"ŠÐPˆµÇãx²…X<¬Çcb¾£Ù¸ æa=yÿBÔÉ }Ùx~ÝÍGuR³í|<ôq‡•k軐èÓΗsÓ{úëȍÞ.ìÓëƒâ´Näç`tæ=°¿¹Ÿ÷ÔpëÔÓÓ*p½=}Ûß׶Р¤„ü̇¾EŸ\¦êHüéïx g‰výBÂ¥ëNEŸ–ÌۘKüé¤òfŸò‰æÓT^§“œÈÏ9].Ò8‘Oô‡ ï· ó’V[œ¯¡k¢5&…ÚVèRâ¥Í«£èÓÖÛÄ®ú½3Dxaô6ðkEŸþ?÷9ѧ«¦+ùÅ>½&ÚfEDb?cú +{EŸ\žh[‚hoÓí¤Vû¹N­Ë›DŸfåÉ\ôiÁ{uJ-¡vi!‘§Þœ#ón¢g2„yOÍõ¯SŒzš²E®¶g®>ʚì ž“ÇRåÚh)ÇLßKQ¢hô¶†O÷”ÉJ ½¤JîNä'®LsµÐ +M©­…`X¡uø ~G¨-éj +þÓB&cߑ҂B8®&i)x|uéß?­”tvWO‹jÜzðËÂíh +a;Ã^lõÀØm_€œ}Õ„?¡Æ¾|Ÿ zÍ/#›•#{0ëŒEŒL!¬> ´ƒzÂX=®(Vp¦ü9ùz>]d +‰b…gàT ë Çê©AKCøHÖ0¬3NÃbE¶ƒÕÍ£0´ ˜¹f׬Æiââˆ9D~w‰bE¶V`2Û`Àb…³áL·/ŠùäÇ +mQ¬ 4~…§QÛ¤°–ô¢X‘¢ÁbER€ƒ*uÎÒ΃4~ô‰Z cª;Û(yopÙl9R@äUŸæ0È´+²ïy)î£äFÌú;A‹Î«M<2l ª˜3'J\Ž”œÑÕâ¼½sd-ì?ѽaV§lz(ž(¿@toŒì#ÌiÿÐ8¢Ál/ „Ø8Q»Y1EáfÞ¨,å…iÇ4Vë#ó{ߓoñœU@&í¿óôóOצ)[…y9 Ñdñ  +1ÚÝøßè ®{1Ñ"µzJ8csøÔqiȸèÀˆïÛú²e‹gF kÌ󆅏ixÑ.[\ú˜ó»ñˆˆêPtö/É¢áá?ÔðI£_`†zµè áÚ0“Dÿˆ.#½†µWù5Ô034ќ&4I¨×6$è¥| wˆK)ÃC!½$ 9MÉ?B”ê%lOÓ+l½‰¿XæâÒ$e¿·S_ô@åéÒ ý0õ]Én° MzD4zq¥ñZ + 2\)ä•BH¦I®Hæ;ÄiÈ šCC)…„É7È Í†"²Èˆ, ùE>çV˜|«ZTˆ‹nOäÀœ\çõöÉqŽ54?w¬Y/ˑ;[ÔQ¡Á‘¤Í¼yqŽ5l^óO›Žb+™šhš»›¦$(l‹¯Ñ—ُ8»Œ:0ºvZd©,{çX«Ï¡AP1‚;iã?¸wæwš}p†F ahN¥Ð„@!Òãa"ÓõJ7 ôçøµ}‘\PÓÒpZà?=3â¸â & ™¢Ð’B¢á« +ÿ«Êz°¯̐‰× RùbƄ ŒœÍ9+8¶hvr›fÜ1?7ìWÚÙõ²`FaÙ|½,³¬œv¦T +­Ð-zR)Ð&ٗŽÓ;‹SÐð¸a‘³,¹Û•*A)0Ër¥¶½Ê;ö,–Ó9V?=+UjDJt=0&qE^>òôT°ŒA­´¶!kp–qû&©mÜ°†ÙÏ Šbè Õ¶ +·§"hÜæց1Áb +ZGÚȹeš¸¶÷8цÇg+Ýn؞ç³ùWÖí9zºSsæÆoÀˆrB£˜®+xf»’í_µœLôoáíyŽ½>o{&Ûímæ4Ù½ZÍŒ¸”Xê ƒývu^uJmVëä(zbNjYƒ°Æ˜ã‰á}#¿Tѓ´È ÍÐ׃‘‘ŠFÂ×:ï#‹ŒÀFBYÒf‘3k‘ƒ>ïÞ ¦;Ûäæ/±YC®þibÃ\áàSò~æ "î "ª¥4AI"²QòÒº¹oKs§(à‰N¸÷úç7é“Z©(ȳ¢@±_@|†zT§¼ê²„ç(òž¾šyÿò04Øzk¥ÏÎLÿ”ee7ÛNÐ21ÝÁøu+åR:è%E/å›]Ô,"Í(@¯7;‡^ÌfG¿pkƒ+;w§Ðl¸›]Ð8—÷Eæ}UèL‘r:øŽ\þp¤¹|gʦÀÕïELgyG.˜¶¡h¸Ù£R€™e¥Ž֌â¦pážÔw8B3\hJdÌՒ)_/Þ)+â$¢ô41¿Þ¦ãĝ‡œD0 +¼ƒ<¡ âہò)chLˆr\{Žš¿ðÕlÀ âþGZB+д!¥‹|5ûòQzћôˆ”:"ܱ†_Ïc ÜZ»éh,ò´ä;÷MèË(=9yv/²§!{ÞÜáÆÞù¡Ø”ÈžÇâƒ÷ˆ‚XãÍË×Óî¤ÍPÆ¿O{ ˜=*¦æñN>¹s Ws©Ù`‡Œwéñ¤8/ðŽÝ}8C§Àˆl·y˯gÝ® ¼ðªâP&€&æ¥rÑR†‡˜—B»a +T`ó4‡8ÐÊIŸl¤P×ؼm8t„ôèV$¡0' …‘зºý dýÐ8ÆێUn”QOªWM¡ŒØ§„'R(͕‰ßHíGÇ„æ²Ý)Ñ,`Ò¨I51Å4tàk|évZ¯¤ÛiÅ*nÂΔ Müð¨tk°Ò1qoÑïùÐä¥ë‰AAh÷K7v{f›»'H7°rBÒív)Ý.Ý®½$ Ç¥„ò„(.$N²$ LȎi6O~*5wRv6V\<–*/¯EW^uøÝ£¡\æ¼ùÑÄE’B-v|å,´«)çýmB@kªo’¸0â!&tïL¨àîê&²¸¹û=j X9^”¨°‘¤Lñ…Búl Ç³*³›ȗčá+tK …"´g8¹ÉÃÌ]É;Á×ÖG´ŒUǯÕÓãFa»¥Ôù…{9DÏÇÖMÚ¿ŒçB{\ûÿ>Ž7kpån÷€ kÐ#Ú?…98Ö í_ +kâŠRz>JŽ¤°ù><|>rÇ!?äL¢_?%Õ Š"Á,/úôä¤f±©¢úÁð(±,85-JBxíö#Nn~Œ@{tŸcØä2ÙÝDS¤ Ó«‰Ðˆ™L`AmŠv¼D6HÚÄÕÁ{2öxce 2kHvŸñOª”ÍzuL¥lve¶§‚“Ê•lÏD3ÅSãÄü`l.eÔT°É&§'¦öh¢±Ö5¤4@skÃÅÒSœ)€hþÛô‘DG¸šC›2Ï- MdÛw$3}I¶PýCûþ K![\m2ú&71{ÀE½å­ áA­ªÛ;-ÔÖí×Pmi2jkÂ=€|¡Z>yÑÌãå|ø±v]˧â-Ý]Î']ËGJè'”ó‰bEµ|*ÑÒÅËù¤kùTxéâ#å|Òµ|\uðr>éZ>§tñr>éZ>•DéâMå|Òµ|*Tºø„r>é÷TTÕ÷Ãå|W;˜SËÇ–óI×ò‘zš|9'Z¢ÒíSOiâ™÷âÅH¼$cv§åsÅMʊ¶¾%}wâmš¯ 8;ˆ{i®pÛòá‘Â4? änR…M¦åU¯2ç¾AIQÚüoޔó·ð"…RФ³¼”͐ôÊñ)ž!ÏÑ%°o”Þ~û˜«"à°¤]Rc*ÞC³¹©~O‘ØÉðòK°¬¡ÛʸÎ7å—Pùi‚)&·»›Å|ÍäÅf»·:VôäkM®ìŽ›py«+‘dh°ðzšÉ²;±°ό’+»7b¥£¸èÌH¦˜pìW9+%ë£Pq +˜•Aã&x9¯#>×A¶S™ü7YÆäö3Ž'nñT͛Š^U¨ +¯¬°RÞè%gõ´k_›œ¯qØó<*à· ÁÝ{‚^YQuL´ W øõh²ê˜âšÂ‹læý 5…Ùú ÇÇ%^#'^„#­f dÞëß5bÊ ՌŠ¯¡|æ½â´„Y–ëõ\C•ÒšÂÀQ®&GŠ#x)ñÚÓjVlÜD´0æhòŒѸnÙG‰&[¸ª|š¬t»h\±+ÙîX¹IT9^:¿J  L™š{å*¾¶Ã˜=_ñuJ—îñ`ˆX½òi#×À ÿIîóœ{5 +eìÁEN±=(à*òr÷¸€µV1×(«Ú»k•†ç ­èoXl'ïPý#éˆåq"vÞ÷KUëñr%("¥Ï€)IßÏB¯2 3tº*!0¤Ï +¨ŽVÄú/›/HÀ–¢(™Z½+$^–u<àïÑÓòJ÷>»ñÅõ´¿üm¾ ñŠ¿«ä¤»Iõ+㒠öAÜè½áŒ‰cßÀa¹nñ”HŒ‰»«k¤ò(“LJ¼|yžÔ˜®n±ñüÆdYÔ3¼7ä½y4 hÉZÞ:R(S ¤ Ùtxop¿@áqï `J¹¡îïêªtñqï ¬‡ãyoxÊ­òZAÏMÞáAAA²ê X-6ž†V–"›”8¸Št‘U¤%rՕ(ÒîXìQÀ*é +É}ñ9¹hmB_úçx€ÀäB¹ b%õpwfÍsÎXÉ&¡Œí*B%Xº(Wâws‚®@2,*ñS˜(Y⇳òTŽÓNŠ’÷kaÛ×:%Ó?¯ïW…ß)<ùèو&==§2¡yFڞtežD÷™•y‚iן›gWæ=RãqCežd2ìó*ó»ûÁ­¨ 2 ¬È'!>P™ÇMµ¢¤vežŠ—*Yœ÷ìÊ<, )˜Ý_™Ç z)H鼯2ïÊZ‹ Ášº'þÃ#ïi©—7õRTëT’zÙÜ)J½”•§•ûQÕ …r.”%\ʲȲ€B@JªXD¡Pzô„‚²«Ü©Ì{yéëüÄh×ùÕ*¬›HŠµþ`ºJ±Ödƒ·Å]Cíæ#û‘­ÂݏîGMòA™&º;{¥ûQJU‡4¿Í¦d·']uŒÝ¶„M\è)u™i»ÂcMø}ÇbW‰%v_ßw,{כ͋⎌–k—¬‚“¾‘JÖìf|6?Î×{ÓN°Y‹Ýš|B*(kUZ$;~(ñ-Ȕ>§Höûð¤"Yè)E²°níñ"Yå)E²²‹®yv³`î Ú(âWÁޜ¿d´Ò,Àݏí‡÷#¯(OD¦=»(¬#ÌzFQžðÚ<½(ï_'—hÒ&þ-¶çEy¸?¬ËûWŠò„ÜÿBQžˆ?M¡בÒq¡ Âª¾úM‹Urû=OOKÙdì&¥yd”W™RãB¿ŸïVÍæê +å[#*¬T¾£0$uó0ìBg †F¾êš_â÷-zÿ¬`\ªÇ»“a+=‹BjP Ðhå7»nŽ‡iÍì’!‚Úø€¨G?3qûY¢ówP»õt7sŒ'r¾z!•´MS©¤½Û.Ôöôùô¶æšòOq+„ªßEJõÄ à_¡OœÉ¸ewái¥Œ;­1¬Þ_Ó[D½S‰ûy:m©²»™]«ƒ¨'%‹ýÞ*ËòX ëHkÖÄ°ò+ÂBæî¶ã—ÝyÚ¿%¦i#¯íÕ Uvç´ñ°ª¸} +ñb?ŸFsð]¾ÅÊîzRÕo™b¿]½.ŠUWšÿÎÄ°Îeú~µÅ±f>zYQ +k·îðP +Tn¯–l]jâèÅî!…ޣܜW=ß%E =ÆOò=ê0-ùTÔƌŠ—5ÿŒ•ò9+Èïå*·æ-5N”éS·{Nq‘‚dX¾ƒE¼§×AÁ˜ðؚİäò`å’G(÷™íõ„Z®¨n€Qà‹’j¯w›Û®—Vœ‰)SœIÞpyCî \g=éÜAå\%ÓYOt†Wñ›´‚F+Jg¨ »‚bÂËõXáß÷@S½öMv.ޏI4µViW>ñ=…}wúln-ì²h·Ý û”Þgó`aŸñjß<^Ø'TÕ§º·S¼°Oȍ/’àÿHa‡0Ôæe#…O+쥒¹ÌäŽÂ¾{é û„â<ìéù´Â>¡ª>Ž_à9…}BU}J³†n(ìòÒÓ&î û„V˜t?µ°OHåád©>§°O¨ªO%rµþ…}×cúÕH(P÷ö ©­ˆhÏ-ìZC¡T« ûø ä;0ßUØ'ªu>·°ï¢=RØÇuaRaß}D»¹°OºÒëi…}"UßÏ.ìÑ<¹°O(ØÂϼBaŸ à™¸Ï(ì“ ¬<©°OÁyóŒÂ>!r`ªú³ +ûd ʞSØ'TÕ'œ2’{ŠhemDŒhùÛîœïivÝÓgF)®¾:Èl{ý=;1•ã.~Wc:£0ѳ»øI¨ÊHu6ëo"K'nÂ%,•Õ6ò§4B%RŽ-6,ޘ” +&%1,nlë®1!¢aÝÔ§ZjL¹âÂF‚T}ªEä':Ö¸&SÌY8ñL&·6¸—é/íÊcŽ5Éþ7ÿSawt)Ô×ïiþ'*l8ýÿîsí›J¬ LYMŸ¢œ ™|h¶ÿßcë•íìUJÚìH:µ5ÿ“wBBÚ<ÜüÖl¤ûÿ=ÜüOEVáÉôÿS~ÚŸqG—;ÖpJ/ä 5ŧ¥?틬:.”ΣxrïF¥\*&‚mûd3å¸ôA[Úy¯¨¦OI5D#Wï(ž¢¸Ø¢‘Hn¼!I HÔYÈcheýÆjž_Ò¯‚µJèV+±€Qössg}7Õ +°–LºâT+J>?Mqª€¦0‰\:“ Âçb>I½%n=§Y@! E=p… à‰cµglEåªÌ^%XÀ,_i )ªöí|Á¯ö­m¯«}kÛ'^o¡=¥ï3Éi`¼J~˜‰R³.DMáµÁM©¬mÓut^§lKìbYÛóÓê9…1ÌÍη«× JEZ§’RðàS<Ú¬\ +4njî-ƒ½èÖ1H(’é£7zÆ5$ G;|“PèÍȞž75#âUÏʖPÜ,6šöcSA …2çýÃ}ÿTt½§Xë¿;ö£@¾†¼L{Jß?qUjý÷ »Q}ÿ_<£ïŸ‚<›gôýS1 ߏ}ÿTÜÚ(%Õ)÷ôýSIõŅ­ÿnïû§øúvX‚õxµï÷U~DM\ÅÕ¾š¼òØQrվ߇;«}¯ +1½z›`±cY°N›Rè!zåå@€žR`Zv(´Öd‰×çò +©J¼– +v¼¥ú^¨Š^…²ÂrµC™ÅPàSѽðÖR))¤Ò¿øÖ*~¬)©¥âNSÆáʂb×F´–*dPT>/iݳÛ3dP²=•Réß·|ÅünÛ³}S!•hrì+)qøÞ¦1¶UTeñ]x£À½í‰æ)u·)›ø¥hȾ¹µOßMÍ05%ô´ÎónÕê!¼'ÕÝvDoÕºC³™œnj†)×@Ð~gÝ-¶Q™Ô•‚rlùº[0&ååØRu·”».FÉ/ŒÖ aí]^9SI{¡•ÖÌ Ð;˜Ž™kõ÷ÝÈ쟲Ÿ¨Ôh3—>úš&"äÆ|ÎÔ'N=àG¬ŠcåTæ4'M³ó‰{¶¸­éB©^G¤2Ï(^x¼ŒBNž„æ•:Lb…ˆ>Ö_5öÅê¿E±ÂÙ¼{·ètYM·!ŠUŸŸØb­éŒ,VSPÆùÓë°rkäNz¿Ží°èæ] ±ÞZ+@‰ÌïÄÇ) ó q +#Ÿ"X}š7ÏGz„ynùÅyC ¬Y­OköKÓªB½ð9N©'kUªÃb±)Ž5“iÜÄ1€X _°0Ÿ¨ªÐ‹éÝÎe‘÷Ü)‡è{*¼ÞÓ12… +@šC»s†=8Á¬;¾:Ê{h×÷>êS(êñ®2VãíJŠˆÁæՏ1ÞVÐvÝÇãNuÒÕTª›*½‚7]ŀ‰_3ËJùœeUuΘ° +:ôíßëWZµ¥*üŽ.‰ºD¹Ð2kˆògYùR!ÅÁk­l³s4¹FBú«’_ h¼SæA¢ÉV)Ÿ&7ú(Ñd[ +ÝF´’ç[ÚU³ÚHíΒD¥õˆrõ7ò…jŠê¥Râ”$*­GðCßR’¨´‘M†½«$Qi="éî¾»$‘Ã/VèUÎím%‰JëÑî/IdI*-ATÜJ¯[K•Ö#²–ô]%‰"cºªGäÄ=É]Ïëñf…*åMêiVˆÏæ_lVxí~øWšªäšÔ=§Y!U±"­¶<Þ¬Põϛ€¾øôf…×n»¥Y¡`Šâó›ªõ÷|¤Y!Çý‡åE%¹Šeñn‡Ò…174<”vIÈgÛ)lx¨ìV«‡b“{Æ­Vb óº·á¡t·C!'ä] ¥]H"ûí …YPúV«;*`èg4<”N7a]6<”-({’X²Û!}Þ<ÜðPzr|/ÇÝ 9#¹êvÈñu>ÒðPzJ‚É°÷4<,Ž”¼¾]9mWïÒþ´‡Jß[ÆFØlx(yò¥Ècí ¥½Éª›.ϒhx(m §]ßÑðP¨j“Ý‚÷s¯á¡4)÷ÃM ¥¡ Á3JÇcX÷à ¥‹yUü"Ù{ +(¡X·CÜZƒRã¼ýèàv;ĕÛ;ªcLÃCùZܧ4<”îvÈ2ôƒ ¥S¼1åö±†‡l™G²Î”ÛJ.®JӐTnŸÐðPbϝVn…¡où†‡ÒPêц‡Êû>Ôð"¸n.%¹jx(Qr!ŸÚ;¿µá¡´šg󔆇bÇzS y_™]Ÿ HÊíG¹†‡Ò±k^ZÂý ¹ç”÷¨ê‚ ¥¡ày65<ƒ¢´ý®Â†‡^1qr[‹Â«"ÙÇr<âWÝÉÀÊ2õZ’½Wnx(­üˆqÚÍ ¥»ª¾nŠjxø¨wPaÃC%µ¸Ohx(ÝíPusŸÂ»Jƒù¢óºááý¥úX·CÍC ¯]Ðx·CFBß»醇ÒÙcücíÒIT|ÔÝ Öëv(J´[>àëäíöÂ+1Û󁆇¬êvxŠ"¯á¡$[àÍOkx(­1R&îã ¥‹téCúᆇÜiò»^ëiŠoáâ6<W(ÍFæ.… •i67<ÄWó:$\±rGÃCé³B<‰üƆ‡Òg¥ ØŽ‹®”îVi§‘ðoÄú%o‡äŸžàkq°t¾?¯ˆ’ÃR §±áŸèû¯Ò']Y.çÌ´íXÚ8앹!éÇZ-Á2ŸãÑuúUƒc¦ 6÷>´{{å'߂U]jm9š·9 [µ}ÚÛ{ÜÇß]÷ƒ_ “Áº1꓇¤#·øHh—¤Oý=ž¹Á§QüÍçtåÊ¡ê=¬:°‡ßkóLe¢m+ڎjo)ë%««FlV+ûZ¿õù‡÷Ð4Ì´­„Ñ“þ{­W‹«Ð:ÒÞÍc†íaè?¼ã[߇ºõÓk݆¬ïí§—Ï/¿šžg÷=ÑRU›FõZSm3âj×âÐ4GÜú¸ƒH“âgZpd}ºêñ8 +Ž§@+Ò |““wÒûd*?ëæw»µes—‚¯tޟýxúÞÁ|A © +ˆNÉk¸[Ó¯=4»™™°Ýæeä|3%⥂½9À„Ï:´6n­Ztº¨ÀÒ0ÖÏ?5Ín=ªÝí„ÎåY\4ë™zk[ t¹ªúbÙ{>`B\y‹*$Õ ¢^shç3Ò/ð¹ã*ô{Þ6“ûLaõ{¬—›qB”ˆúÞR0w0Ý%æmÔb4Õ/hr™c/2DÀÉQ¹•Jf\õt:fÙ÷ˆ ¦v€š.Ù_Ôà4¯ü°°²3ˆ‡Kê#šWb³C (¶ZCs¦ÙÎÁO`Οk,%¶æÔÛ9"ÓÊa?`~ÃðLÊe»×¦§?9 Èç hâ߂?ý&T‹ dO~þ|·ÂF£ÇZï¾IÙè_v"ã*ܜܶ¼]C.ŸwZô¿›Ìtu:ìQ¿ Ž®ï4¥œáÔrlw‚ïfìÁX›zhèg)+û̕ì6bôƒ<ƒ°ˆ#´jó¿4m>Œ@xìVÎléuÌ|gf_†¡ˆìÀ6ežY1@Ù}È¿³Sj“÷Ã+6Μ¯äƒU–fw¬¡Âñ3nb†8Dîðat2}ž¤ÄP$ Ð ‚Vù>+vȨyè³áD?rkƒ›3ø³ç¶—k+7ømÝlŽj"øÔ 0Ø6{§Äf„¡ŠøºÖ´}х[}ƒˆd<¼ +Tx8|áZ/­ú2r9†¸M ÁhîIW¸#ÆBà+Èqý¼žÎÏÞՔÔh]ÉÙÔ]슸Œë¡†â¥ÎØÃÌ~ Мƒ[L*VÄóOvŠç'm‡sRÊÁ§ž“bÚÉÀ…lϼ ,Ùdì¦?Í<µ¾«*iEŠ)ø³m§~¾ê9èO'3œ 8ôJQj8«™ߞ×@íCc¯è•oÔlVÚçîdÀÏƟԯ¨$×M3#™>¤ä”ØÈX +æO[¼mcF4¥Xæámp@‘ +\H®Öu]LÓFß©ß;0û¢z†Úiƒs%FéïRøÄxw€;ßې&. £Æmtì%ƒŽÄPï2n’~Èø°^ Ü-Fê»ñÁD}·z5ƒ¥šxÝbƍI“ NÝÂ6·Lcp4™ ð1Ãçîúr ¤Ò[ lmFí#M”–æðºñ‡ú +Ÿu¸×…صi«wö ©ÿ“­úq¢­~ƒc͓å÷ú†–F´‹"V“õœz:H*5}5JPÃ7”&à蠈w›9Ý×G4h$E†¹¾íõ¯¡€Èä?’—ý•{gŠëâÄé0­”ŘAOށAŽÜµøâ1”(ÜÄՓÅèbL)ϑPiΚ…AJEÁ9↉àùz²6ꁉuteç­»ìö”˜ˆ_‘{Xۀ²†ØÁa(!‚ÁRSh" CÇB«- ÃÄëeo`‰!1)A…ø›&š#—®M˜{r¶ÜWä=Pä­?õ$³ú>oØ÷îç4\ßÍià°Ý ƒä4½+§áĸ—ÓpbÜßû"\‚D'ãŠ[±}{5 h9¢ÝèˆbwJc ³ñálîZ#»"¢{Ÿ„Š¼£‹?ŽG¤1 [R0 D´['Ân2Aƒ ¥CLˆ)„²CZ­OQ0\§†é΍ŠÒ&–=E‰!=Ñs‰':%ˆaÂÏ¥;E§I {JK&iÞT$:M®dǙÇþìŸCöO·6”*’!žùßÚr9 n›¸Np{ª­…`šä]µyjË©-£ك0B4#m¤ÝÈ\“FÙå.3²½qÇ 1Ò®¹Ïm<× —ÃiY,¢ÈAJ¹wV¯6ôsÒwæ0ØìèOh¡¨OsxÁIÎHçú¼ ?g¦þ ¬”eŽþ,!UüåO#t¦<5ÀüfݑŽÜ$ßFŽ§Å±ÑC-šp#:õ6aXð 'IÒ"àZދwa´„!tǚû$E›léFÜØÏÆYGê·ø³„z ˜g¨9øºD»²²éÒԆޠçƒ\çdðÆxN¿Ì¤ÿs²wBR}YÞкôQ,SýBç zkêK¹à7XY{tNsô'wÚí9©•ëfÆÍiAO]F_hFc­ÛH4£6àp­koKÐ8hâaGSkƒžFªpt¦\¥ÒQÉo¤]¤<*X¬¤é´kNs#|ôEž„¿?3 -à2vkjځÙcýn#€Æ­DF¤cÐx™­èÙ·0–q¥sïÐÛÔ²‘TJwóNÒ]•žV¼Ô§uÃE}ºôh·º2ÆñNƒse\ ¸¾-Òàvãd׆ìW×p]r?^ªð‘±Í8Ô»¸;vžý1<Œs`ͨ¥NÁ}†gF5¹¶-L‰ÏéO)]Ì«klÀ„IuO1R:,óŠö%Ýo—üÛ7};é“Ó¹RèÂ=/õ)=^Ò컩÷š›8•T½O¤×¯ÓDµþ­ÏL¬ñò(¡Z`Ö;xÞûHDÊ/bè•ö+ÞäT„D»Ï¯x“S‘Ÿj¥Ü¯x“S훻üŠ79Qüæ.¿"@sú?QÕ?þ Ûû‚þ±W/ëù±r\.–ۋ꟰ê{"ït6¶³qœÏëóÿ9§wÓËf¾=¿„^ì‰Z*ŸxÓóén6±PÁ?#­ÔL($çx&#&Ó?Áì*§©¾Ó?ŽNó[’:̾~€pèׁçê›Ú2œõÔQSr' ü³CúkÈh¹`€Å]Lšôü˜¼dÌåR‹·‘Ÿ&8ªgaü-ÓJΫqûi±ç]›lÖâö³c‡\:TX”“€¹Ú"î@A8ëÔÆȇ‡ñÐäLµ6°«-Æx~]P›¿^?à ?àƒtëÏH?éÌx,D™Ò@®Mmÿ/+ (Ÿè rJ¬º!"ʆCñƒœÅTmx‘ ðvŒ%ƒ †© +êlʂG¬8ölÞå4PÛßf¤}€­öwA[ ý©4"ʆCÉÄ¿)"ʆ/aþ_‹ˆ²ðhOÈ¿eá0”ô¯EDÙp(}~D” ‡ÂÙükQ6Šï›§GDÙp(<Èÿµˆ(…¢ˆ¶ÚjãG×@ ÑKè +X`~cuµq¹Žª­Û¯o(Xƒð˜Ð2puh$Ô¢½wH±6O9ÒȾ_¤BSÛSoV:™Äc`“I=D¯û9@Ñi¦D'Ôa0ÑÙÙÙÈ$}\ÝGKDgÊfAV¬«‰äíËöÙFjKKȌr€LË„êá]ôQä±|ÐhüGVÎR2­Omž”E9.@À’jLÿ4Y%ׯ[ÂiøçŒ ç`Ԍσ RF)m¤1@êÏÎlÃϬEj)*ºð@¢}š<ÐtâvJ#†)I1ùm¸Ðb€ÌXU›0ËfÃÙÎȤÝͯ a4n^ßY2ë-3ð2±Ã/¾Ã…4ó­xr(^Å0φãó:†iÊÚ<¹Ä†•î˜Vœp«µŒ…[ ÁŽ›nõiÔoImZ"^›´cœD;ëD‰‡*²d;I ÀñHW·/£ Ò »E»Óß5ôw£}YٚYë1'E‹ŠQî#™ðÙU ‰32†øî ¤:mlì  á…ÏX‡–R÷ ϵ'HE®=űT瞡Ã'rKQDèâDÃáÝA° +ìÄRÅ©ŒŸU2Ž åP³2t °R …hYáýüh@9ú<+¤rÊüÀ:Yîü@dž¬Ï (dÊ+¨Í²AP™¬×0Pk®G&‚Êè­Eíæ‰4Bö›BÛÛÓ<›amèP4óÐDSJ è{´ÊMdù`¸{kg€S£ƒ¬xÁ‰(¤&LÔt"§×l.ifz˜4¦ÞÑ}À^Í&FêUâÏihwB±ûx¨”Ó€ÚbxŒÓJ @œÓ$a ⎇9MÿkxŒÓ[£§)†Q2[d¹€fÁ㴁ßöȊ@wº]ä4¥0²¥Wù}+ €Nÿ…š bA(<ˆM˜špd†„ìŠÕSvïK ‚ò¹=¶"Pᕦ&yÞHM$g%nÛ#Wƒð•œHU`äbU—Ì ŽQ»?¤sž³­Á`Lo “…ÙÌҒãÄÞ)ÎZ¼AÐR€?Ž©Öo}ˆ-¦ÖwKM\tÊM8 _Jp³‹B@tNcùþg®Çÿüj$-ê%®ÉönCƒ XÕSO:f¶Ó—q¶”êÈâÒáÓ~*è€ä°Ä‹<Tx¨¨;)òPPágÃ)ò`|®E#þ xf‡E3þ dfª.ŠxÕÇضóÐìS æ™/ÕH —ö¼aË^?ðÀ+€LpàÀæ‚2 ˆ$2ô ÜNÊ8UáŸ_8p°ã q¿(s0~ˆ²\,婼 ¹ïËN…CcyÊýEÁl„àº1Gfnx$cÎ.£Õy´nÅëbñ°‚P“ÀDGÓ®ZM1Η1GDnŽÎqº1]ƒü*½³ ïùS;Ïö»E¢vÑ.3ÝÙ'¬ª©;Y6võ/ƒ8åêè ܌¯ÓÃõu¦c~†eZV*ú•‚"©e§7@ Ÿô¡ÛrҎ«ŠGÀ¸EËÍ|ò2áüÙ%Í(¢Õï2e?]óɉG?]&¸ØuãÒ+-íÅüóÒ³éú±|؏9³ÿðcÎ},¨æÖ+®}ðO§e b£NôüäÂ_-/<ð;@ü‹5;©´9`$ˆL¹IÇ:ϯc> ù —Ú÷G—rÞû•zït%"™vƒ7ñNW¢êŸÛ¼‰wºQê ÞÄ;]‰Èý Ð›¸ƒ¡Ð0ôŽæÎaf;Ýàë7ðUm~¾ìÑ+Þar¾XnKãÿÎÁqã|!ÿãÿÿïò€*ü¯ãÅ ¿,MTÿòÓÝÖøR‚µ6C{âxN/§çån;>þ÷%„¾k—K|ú%ôB½~1€Á8†à]ð½X‡Î{r·[ÃG5¢õ’ùŸýîx~Ay©ï^Rµš‚›ËÓr²žs'?TýãxIÀÚÿóJìáç +üÇa 8ÍüÏævy=p††ònqŸ–›—Êq¼]Ì_¾ €–€Ûâø6ÑËíÿªƒiC$Áÿ ÿ*€Oà»ÿ¼8/å—^ßñ2S‡™Ûë³y_¬ž€ü°Û<^/ûw‰ùÛå±üN'ü†ú…Ó°ùœŽö󣉂åK.Ããrñ{NwëËFl))‚*žtñ¸½n ˆ/àõù<ä,m—ßãÅèd ºœ^_#Wr}ÄòCR¹Ü^œæn·ÌÆç´yÉ! \~˜°ÛióùA8ô˜š*|ÿÌü|ñ£`ÞµÍx½¾}æ³–Óí&fèeç?ÂÅõÑ \èo¯ÇæuûœÌn? ¸--ãrm.öO +”’Ù—æ?çáçøü«dÒ¥$%G€XA{Ò +ß·Ïñb^?Ž—k(V§ñÿš¿Œ·ÛÝy|žïÁ£—Åq~:ïŽó—Óïî?ðø#æ@HU€Õøÿƒõè +endstream endobj 6 0 obj [5 0 R] endobj 23 0 obj <> endobj xref +0 24 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000046800 00000 n +0000000000 00000 f +0000048544 00000 n +0000176906 00000 n +0000046851 00000 n +0000047214 00000 n +0000049206 00000 n +0000048840 00000 n +0000049019 00000 n +0000048727 00000 n +0000047479 00000 n +0000047982 00000 n +0000048030 00000 n +0000048611 00000 n +0000048642 00000 n +0000049279 00000 n +0000049475 00000 n +0000050711 00000 n +0000071518 00000 n +0000137107 00000 n +0000176929 00000 n +trailer +<]>> +startxref +177122 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg new file mode 100644 index 00000000..88b7d364 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange-blue.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.ai new file mode 100644 index 00000000..948fe6a9 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.ai @@ -0,0 +1,1448 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 6 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_orange + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T16:34:14+02:00 + 2019-06-22T16:35:26+02:00 + 2019-06-22T16:35:26+02:00 + + + + 220 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7N+WH5gfpWFdG1ST/clC v+jzMd50HY/5aj7xv45oOx+1PFHhzPrHI9/7XqfaDsXwT42MfuzzH80/qP2PQ837yzsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqF1XVLLSrCa/vZBFbQLydu58AB3 J6AZVmzRxQM5GgG/T6eeaYhAXIvFv+Vsa5/in9K1P6O/uv0bX4PRr/yc78vHb7O2cd/LeXx/E/g/ m+X6/P8AQ+gf6G8P5bwv8pz4ut/q8v07sIgmmgmjnhcxzRMHjkU0ZWU1BBHcHNNGRibHMPQzgJAg iwXvf5eeeofMdj9XuWCavbKPXTYeovT1UH/Eh2P0Z3PZXaQ1Eal/eDn5+b5p232OdLPij/dS5eXk f0MvzbOidirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i4gtoJLieRY oYlLySMaKqjcknIzkIgk7AMoQlOQjEWS8C/MDzzceZL/ANKEtHpNu3+jQ9ObdPVcfzHt4D6c4XtT tI6idD+7HL9b6b2L2RHSQs75Zcz3eQ/G/wAmJ5qnduxVE6bqV7pl9DfWUpiuYG5RuPxB8QRsRluH NLHISiaIadRghmgYTFxL6F8meb7LzLpYuIqR3kVFvLau6PTqO/Bv2Tne9n66OohY+ocx+Oj5d2r2 ZPSZOE7xP0nv/b3p/me6x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVxIAJJ oBuScVeJfmb+YDaxO2kabJTSoW/fSKf791PiOqL28Tv4ZxnbHaninw4H0D7f2PofYHYvgR8XIP3h 5f0R+v8As73n+aF6d2KuxV2Kpn5d8w6hoOqRahZNR02kiJPCRD1RqdjmTpNVPBMTj/a4eu0UNTjO Of8AYe99EeXfMGn69pcWoWLVR9pIzTlG46ow8Rnf6XVQzwE4/wBj5ZrtFk02Q458/vHeEyzJcR2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvKPzU/MAky+X9KloN01G4Q9fGFSP+H+ 7xzlu2u1OeLGf6x/R+v5PbezvYvLPlH9Uf779Xz7nlOcu9o7FXYq7FXYq7FWQeTPN955a1QXEdZL OWi3ltXZ08R25L2P0Zn9n6+WnnY+k8x+Orq+1ezIavHwnaQ+k937H0Jpuo2WpWMN9ZSia2nXlG4+ 4g+BB2IzvsOWOSIlE2C+X58E8UzCYqQROWNLsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVeffmf5/wD0TA2j6ZLTU5l/fyr1gRh28HYHbwG/hmg7Y7T8IeHA+s8/L9r1Hs/2L458XIP3Y5D+ cf1D7fm8TJJNTuT1Occ+hOwK7FXYq7FXYq7FXYqzD8vPPUvly++r3TF9IuWHrp19Jjt6qj/iQHUZ t+yu0jp5VL+7PPy83Rdt9jjVQ4o/3seXn5fqe9QzRTwpNC4kilUPHIpqrKwqCD753MZCQsci+aTg YkgiiF+Fi7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWI/mF54h8uaf6NuwfV7lT9Xj6+mvT1 WHgD0B6n6c1XanaQ08KH94eXl5u87E7IOqncv7qPPz8ngc88080k8ztJNKxeSRjVmZjUkk9znCyk ZGzzL6ZCAiAAKAWZFk7FXYq7FXYq7FXYq7FXYq9E/LD8wP0XMujanJ/uNlb/AEaZjtC7Hof8hj9x +nOg7H7U8I+HM+g8vL9jy3tB2L4w8bGP3g5j+cP1j7XtOdi+fOxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KpD5x822XlrSjdTUkupKraW1d3f8A5pX9o5g6/XR08OI/UeQ73Zdl9mz1eXhG0R9R7h+v ufPWp6le6nfzX17KZrqduUjn7gAOwA2Azgc2aWSRlI3IvqWn08MMBCAqIQuVNzsVdirsVdirsVdi rsVdirsVdir1r8rPzB9QReX9Vk+MUTT7hj1A6QsfH+U/R4Z1XYval1iyH+qf0fq+TxHtF2LV58Q2 /iH++/X83qedO8Y7FXYq7FXYq7FXYq7FXYq7FXYq7FXYql3mDXbDQ9Lm1G9akUeyoPtO5+yi+5zH 1WpjhgZy5BytFo56jIMcOZ+wd7538x+YdQ1/VZNQvW+JvhiiH2Y4wfhRfYVzgNXqp55mcv7H1TQ6 GGmxDHD4+Z70rzFcx2KuxV2KuxV2KuxV2KuxV2KuxV2KtglSCDQjcEdQcKkPb/yz8/jWrddK1KSm rQL+7kb/AHei9/8AXH7Xj18c7PsjtTxh4cz6x9v7Xzvt/sX8vLxcY/dH/Yn9Xd8u5nub15l2KuxV 2KuxV2KuxV2KuxV2KuxV2KsE/Of/AJRBP+YuL/iL5o/aD/F/84fpel9lf8aP9Q/eHhucU+iuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxVVtrm4tbiO5t5GiniYPFIhoysNwQcnCZiQQaIYZMcZxMZCwXv vkDzxb+ZdP4TFY9VtwPrUI2DDoJEH8p7+B+jO67M7RGohR+sc/1h8y7a7IlpJ2N8cuR/QfxuyvNo 6V2KuxV2KuxV2KuxV2KuxVpmVVLMQqqKsx2AA7nEmkgWlfl/zFY67Fdz2NWt7W5a1WXtIURGLr/k 1eg+/MXS6uOcSMeUZV7+Tma3Qz0xjGf1SjxV3WTt9jGfzn/5RBP+YuL/AIi+a32g/wAX/wA4fpdx 7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdirsVdirsVdirsVRmkatfaTqEN/YyGO4haqnsR3 Vh3U9CMuwZ5YpicTRDRqdNDPjMJi4l9C+UPNdj5k0pbuCiTpRbu3r8Ub0/4if2TnfaHWx1EOIc+o 7ny3tPs6eky8Evp6HvH6+9PMzXXOxV2KuxV2KuxV2KuxV5J+af5g+q0ugaTL+6Wq6hcoftHvEpHb +b7vHOU7a7Uu8WM7fxH9H63uPZ3sXhrPlG/8I/T+r5p1+SX/ACit3/zHSf8AJmLM32d/uD/XP3Rd f7Wf4zH/AIWP91JW/Of/AJRBP+YuL/iL5L2g/wAX/wA4fpYeyv8AjR/qH7w8Nzin0V2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2Kpt5Y8y6h5e1WO/szUD4Z4CfhkjPVW/gexzL0erngmJx+I73B7 Q0ENViMJ/A9xfQ+g65Ya3pkWo2L8oZR8Sn7SOPtI47MM7/TamGaAnHkXy3WaSenyHHMbj7fMJhl7 iuxV2KuxV2KuxV51+aH5gfo2J9F0uX/cjKKXU6neFGH2VI6Ow+4e+c/2z2p4Y8OB9Z5nu/a9X7Pd i+KRmyj0DkP5x/V97xfOOe/e2fkl/wAord/8x0n/ACZizs/Z3+4P9c/dF899rP8AGY/8LH+6krfn P/yiCf8AMXF/xF8l7Qf4v/nD9LD2V/xo/wBQ/eHhucU+iuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2Ksk8j+crvyzqYkFZNPnIW8tx3HZ1/wApfx6Zsezu0Jaed84HmPx1dT2v2VHV465TH0n9 HuL6Csb60v7OK8tJBNbTqHikXoQc73HkjOIlE2C+X5sMsczCYqQV8m1uxV2KuxVh35iee4vLtl9V tGD6vcr+5XqIkO3qsP8AiI75qO1e0hp48Mf7w/Z5u+7D7HOqnxS/uo8/Py/W8FlllmleWVzJLISz uxJZmJqSSepOcPKRJs830qMREUNgFuRZPbPyS/5RW7/5jpP+TMWdn7O/3B/rn7ovnvtZ/jMf+Fj/ AHUlb85/+UQT/mLi/wCIvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYqzX8uPPknl+8+pXrFtHuG+PqfRc7eovt/MPp+e57J7TOCXDL+7P2ef63n+3e xhqYccP72P2ju/U92jkSSNZI2DxuAyOpqCCKgg524IIsPm0okGjzXYUOxVj3nXzhZ+WtLM70kvZq rZ21ftMOrHwVa7/dmB2hr46eFneR5B2nZXZc9Xk4RtAfUfx1L571HULzUb2a9vJDNczsXkkPcn9Q HYZwOXLLJIykbJfUcGCGKAhAVEIfK212KvbPyS/5RW7/AOY6T/kzFnZ+zv8AcH+ufui+e+1n+Mx/ 4WP91JW/Of8A5RBP+YuL/iL5L2g/xf8Azh+lh7K/40f6h+8PDc4p9FdirsVdirsVdirsVdirsVdi rsVdirLrbyNPqPkmPXtPDSXUEkq3VuNy8anZkH8y9x3Hv120OzTk03iw+oE2PJ0eTtcYtYcGTaJA o9x8/exHNS7x2KuxV2KuxV2KvSfyu/MD6jJHoWqyf6FIeNlOx2idj9hj/IxPXt8unR9jdqcBGKZ9 PQ93l7nkvaHsXxAc2IesfUO/z9/3vZM654J2KvnT8wb67u/N+pm4kMnoTPBCD0WONiFUDPPu1Mkp aidnka+D6r2JhjDSw4RVxBPvLHc17tXYq7FXtn5Jf8ord/8AMdJ/yZizs/Z3+4P9c/dF899rP8Zj /wALH+6krfnP/wAogn/MXF/xF8l7Qf4v/nD9LD2V/wAaP9Q/eHhucU+iuxV2KuxV2KuxV2KuxV2K uxV2KuxV7v8Ak/8A8oZH/wAZ5f1jO47B/wAWHvL5t7T/AONn+qGJfmj+X31KSTXdKi/0NzyvbdR/ dMT/AHigfsHuOx9umq7Z7L4CcuMenqO7z9zu/Z7trxAMOU+sfSe/y9/3+/nzXOceudirsVdirsVd ir2H8q/PzXix6BqblrpFpYztv6iKK+mx/mUDY9x79et7F7T46xT+r+E9/k8J7RdjeHefGPT/ABDu 8/j+PLpmdI8g+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f/ ADHSf8mYs7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf8RfJe0H+L/5w/Sw9lf8AGj/U P3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8AGeX9YzuOwf8AFh7y+be0/wDj Z/qhmskaSI0cih0cFXRhUEHYgg5uCARRefBINjm8J/MfyE/l+7+vWSltHuGoncwud/TY+H8p+j58 R2t2YcEuKP8Adn7PL9T6R2F2yNTHgn/ex/2Q7/1sJzTPQuxV2KuxV2Ksm/LX/lONK/4yP/yafNl2 R/jMPf8AoLqO3v8AE8nuH3h9D5375Y+bfO3/ACl+sf8AMXL/AMSOed9o/wCMT/rF9a7J/wAVx/1B 9ySZhOwdirsVe2fkl/yit3/zHSf8mYs7P2d/uD/XP3RfPfaz/GY/8LH+6krfnP8A8ogn/MXF/wAR fJe0H+L/AOcP0sPZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/k//wAoZH/xnl/W M7jsH/Fh7y+be0/+Nn+qGbZuXnlC+sbW+tJbO7jE1tOpSWNuhByGTHGcTGQsFsw5pY5icTUhyfPv njybd+WtTMe8mnzktZ3B7jujf5S/j1zgu0ez5aedc4HkX1DsjtWOrx3ymPqH6fcWN5rnbOxV2Kux Vk35a/8AKcaV/wAZH/5NPmy7I/xmHv8A0F1Hb3+J5PcPvD6Hzv3yx82+dv8AlL9Y/wCYuX/iRzzv tH/GJ/1i+tdk/wCK4/6g+5JMwnYOxV2KvbPyS/5RW7/5jpP+TMWdn7O/3B/rn7ovnvtZ/jMf+Fj/ AHUlb85/+UQT/mLi/wCIvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FX Yq93/J//AJQyP/jPL+sZ3HYP+LD3l829p/8AGz/VDNs3LzzsVQGu6HYa3pk2nXycoZRsw+0jj7Lq ezLlGp00M0DCXIuVo9XPT5Bkgdx9vkXzv5n8tah5e1WSwuxUfagnAoskddmH8R2OcBrNJPBMxl8D 3h9S7P18NViE4fEdxSnMRznYq7FWTflr/wApxpX/ABkf/k0+bLsj/GYe/wDQXUdvf4nk9w+8PofO /fLHzb52/wCUv1j/AJi5f+JHPO+0f8Yn/WL612T/AIrj/qD7kkzCdg7FXYq9s/JL/lFbv/mOk/5M xZ2fs7/cH+ufui+e+1n+Mx/4WP8AdSVvzn/5RBP+YuL/AIi+S9oP8X/zh+lh7K/40f6h+8PDc4p9 FdirsVdirsVdirsVdirsVdirsVdir3f8n/8AlDI/+M8v6xncdg/4sPeXzb2n/wAbP9UM2zcvPOxV 2KpJ5u8qWPmTSmtLiiTpVrS5Aq0b/wDNJ/aGYWu0UdRDhPPoe52PZnaM9Jl448uo7x+OT551fSb7 SdQmsL6Mx3ELUYdiOzKe6nqDnA58EsUzCQoh9S02phnxicDcSg8pb3Yqyb8tf+U40r/jI/8AyafN l2R/jMPf+guo7e/xPJ7h94fQ+d++WPm3zt/yl+sf8xcv/EjnnfaP+MT/AKxfWuyf8Vx/1B9ySZhO wdirsVe2fkl/yit3/wAx0n/JmLOz9nf7g/1z90Xz32s/xmP/AAsf7qSt+c//ACiCf8xcX/EXyXtB /i/+cP0sPZX/ABo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/wCT/wDyhkf/ABnl/WM7 jsH/ABYe8vm3tP8A42f6oZtm5eedirsVdirFPP8A5Ht/Mmn84Qseq24JtZjsGHX03P8AKe3gfpzV 9p9nDUQ2+scv1O67F7XlpMlHfHLmP0j8bvArm2uLW4ktriNop4mKSxuKMrDYgjOFnAxJBFEPpuPJ GcRKJsFSyDNk35a/8pxpX/GR/wDk0+bLsj/GYe/9BdR29/ieT3D7w+h8798sfNvnb/lL9Y/5i5f+ JHPO+0f8Yn/WL612T/iuP+oPuSTMJ2DsVdir2z8kv+UVu/8AmOk/5MxZ2fs7/cH+ufui+e+1n+Mx /wCFj/dSVvzn/wCUQT/mLi/4i+S9oP8AF/8AOH6WHsr/AI0f6h+8PDc4p9FdirsVdirsVdirsVdi rsVdirsVdir3f8n/APlDI/8AjPL+sZ3HYP8Aiw95fNvaf/Gz/VDNs3LzzsVdirsVdirAvzM8gDWr dtV02OmrQL+8jX/d6L2/1x+z49PDNF2v2X4w8SA9Y+39r03YHbX5eXhZD+6P+xP6u/597w8ggkEU I2IOcY+iMm/LX/lONK/4yP8A8mnzY9kf4zD3/oLqO3v8Tye4feH0Pnfvlj5t87f8pfrH/MXL/wAS Oed9o/4xP+sX1rsn/Fcf9QfckmYTsHYq7FXtn5Jf8ord/wDMdJ/yZizs/Z3+4P8AXP3RfPfaz/GY /wDCx/upK35z/wDKIJ/zFxf8RfJe0H+L/wCcP0sPZX/Gj/UP3h4bnFPorsVdirsVdirsVdirsVdi rsVdirsVe7/k/wD8oZH/AMZ5f1jO47B/xYe8vm3tP/jZ/qhm2bl552KuxV2KuxV2KvLPzT/L/mJf MGlR/GKvqFuo6jvMo8f5h9PjnMdtdl3eXGP6w/T+t7P2d7aqsGU/1T/vf1fJhf5a/wDKcaV/xkf/ AJNPmn7I/wAZh7/0F6Dt7/E8nuH3h9D5375Y+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/U H3JJmE7B2KuxV7Z+SX/KK3f/ADHSf8mYs7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf 8RfJe0H+L/5w/Sw9lf8AGj/UP3h4bnFPorsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8A GeX9YzuOwf8AFh7y+be0/wDjZ/qhm2bl552KuxV2KuxV2KuxV53L5A/RXn3TdZ0yP/cbLK/1iFf9 0u0bbj/IY/cdvDOfl2X4WqhkgPQTv5bfc9VHtrxtFPDkP7wAUf5wsfaPteiZ0Dyr5t87f8pfrH/M XL/xI5532j/jE/6xfWuyf8Vx/wBQfckmYTsHYq7FXtn5Jf8AKK3f/MdJ/wAmYs7P2d/uD/XP3RfP faz/ABmP/Cx/upK35z/8ogn/ADFxf8RfJe0H+L/5w/Sw9lf8aP8AUP3h4bnFPorsVdirsVdirsVd irsVdirsVdirsVe7/k//AMoZH/xnl/WM7jsH/Fh7y+be0/8AjZ/qhm2bl552KuxV2KuxV2KuxV2K uxV82+dv+Uv1j/mLl/4kc877R/xif9YvrXZP+K4/6g+5JMwnYOxV2KvbPyS/5RW7/wCY6T/kzFnZ +zv9wf65+6L577Wf4zH/AIWP91JW/Of/AJRBP+YuL/iL5L2g/wAX/wA4fpYeyv8AjR/qH7w8Nzin 0V2KuxV2KuxV2KuxV2KuxV2KuxV2Kvd/yf8A+UMj/wCM8v6xncdg/wCLD3l829p/8bP9UM2zcvPO xV2KuxV2KuxV2KuxV2Kvm3zt/wApfrH/ADFy/wDEjnnfaP8AjE/6xfWuyf8AFcf9QfckmYTsHYq7 FXtn5Jf8ord/8x0n/JmLOz9nf7g/1z90Xz32s/xmP/Cx/upK35z/APKIJ/zFxf8AEXyXtB/i/wDn D9LD2V/xo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7FXu/5P/8AKGR/8Z5f1jO47B/xYe8v m3tP/jZ/qhm2bl552KuxV2KuxV2KuxV2KuxV82+dv+Uv1j/mLl/4kc877R/xif8AWL612T/iuP8A qD7kkzCdg7FXYq9s/JL/AJRW7/5jpP8AkzFnZ+zv9wf65+6L577Wf4zH/hY/3Ulb85/+UQT/AJi4 v+IvkvaD/F/84fpYeyv+NH+ofvDw3OKfRXYq7FXYq7FXYq7FXYq7FXYq7FXYq93/ACf/AOUMj/4z y/rGdx2D/iw95fNvaf8Axs/1QzbNy887FXYq7FXYq7FXYq7FXYq+bfO3/KX6x/zFy/8AEjnnfaP+ MT/rF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f8AzHSf8mYs7P2d/uD/AFz90Xz32s/xmP8Awsf7 qSt+c/8AyiCf8xcX/EXyXtB/i/8AnD9LD2V/xo/1D94eG5xT6K7FXYq7FXYq7FXYq7FXYq7FXYq7 FXu/5P8A/KGR/wDGeX9YzuOwf8WHvL5t7T/42f6oZtm5eedirsVdirsVdirsVdirsVfNvnb/AJS/ WP8AmLl/4kc877R/xif9YvrXZP8AiuP+oPuSTMJ2DsVdir2z8kv+UVu/+Y6T/kzFnZ+zv9wf65+6 L577Wf4zH/hY/wB1JW/Of/lEE/5i4v8AiL5L2g/xf/OH6WHsr/jR/qH7w8Nzin0V2KuxV2KuxV2K uxV2KuxV2KuxV2Kvd/yf/wCUMj/4zy/rGdx2D/iw95fNvaf/ABs/1QzbNy887FXYq7FXYq7FXYq7 FXYq+bfO3/KX6x/zFy/8SOed9o/4xP8ArF9a7J/xXH/UH3JJmE7B2KuxV7Z+SX/KK3f/ADHSf8mY s7P2d/uD/XP3RfPfaz/GY/8ACx/upK35z/8AKIJ/zFxf8RfJe0H+L/5w/Sw9lf8AGj/UP3h4bnFP orsVdirsVdirsVdirsVdirsVdirsVe7/AJP/APKGR/8AGeX9YzuOwf8AFh7y+be0/wDjZ/qhm2bl 552KuxV2KuxV2KuxV2KuxV82+dv+Uv1j/mLl/wCJHPO+0f8AGJ/1i+tdk/4rj/qD7kkzCdg7FXYq 9s/JL/lFbv8A5jpP+TMWdn7O/wBwf65+6L577Wf4zH/hY/3Ulb85/wDlEE/5i4v+IvkvaD/F/wDO H6WHsr/jR/qH7w8Nzin0V2KuxV2KuxV2KuxVF/ojVf8Alin/AORT/wBMt8DJ/NPyaPzOL+dH5h36 I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/ AJYp/wDkU/8ATHwMn80/JfzOL+dH5h36I1X/AJYp/wDkU/8ATHwMn80/JfzOL+dH5h7h+UsE8Hk+ OOaNon9eU8HBU0JHY52nYcSNOARW5fO/aWYlqyQbHCGZZuHQOxV2KuxV2KuxV2KuxV2Kvnbznpmp SebNXeO0mdGupSrLGxBBY7ggZ5/2hhmc8yAfqPR9U7K1GMaXGDKP0DqEm/RGq/8ALFP/AMin/pmH 4GT+afk5/wCZxfzo/MO/RGq/8sU//Ip/6Y+Bk/mn5L+Zxfzo/MO/RGq/8sU//Ip/6Y+Bk/mn5L+Z xfzo/MPZfyZt7i38r3STxPE5vpCFdSpp6UQrQ52Hs/AxwGxXrP3B4H2qnGWpiYm/QP8AdSXfnKrN 5RQKCT9bi2H+q+Ht8f4P/nD9KPZY/wCFH+ofvDxD0pf5G+45xfCX0TiHe70pf5G+448JXiHe70pf 5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe70pf5G+448JXiHe//9k= + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:76FE812EFA94E911B987F622BD994B0C + uuid:7e67434c-0358-43b8-a083-32c919d418ed + + uuid:79d5c890-59bb-4d9e-9f7a-006ce1db016e + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:76FE812EFA94E911B987F622BD994B0C + 2019-06-22T16:34:12+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + Mograsim Orange (255,83,0) + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + Mograsim + 1 + + + + Mograsim Blue (7,83,235) + SPOT + 100.000000 + RGB + 7 + 82 + 235 + + + Mograsim Orange (255,83,0) + SPOT + 100.000000 + RGB + 255 + 82 + 0 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/ExtGState<>/Properties<>>>/Thumb 40 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 36 0 obj <>stream +H‰¤M …÷œb.P`føëV4®ª1¡‰vaMLïŸ8Pc»7$<Þ0|ó‚¹f0C¶p8fP& ã°Œ/eÎb‹zKÁÊB`´r²³ªµYõ½È³Š ¤õb,°K:¥zžÔ]ÝVt.]òåO¤mד*ޑ8 +Íj‡6VºhµM,ošcòÒD ´3kЍ‡Ì@»T]Œmn՚ ŠC’.&í‚û:¯™}ӏ:úü4È/ã’IÅ +endstream endobj 40 0 obj <>stream +8;Z,f;%eL($q0Q6V0qA?>c.p\KFl@jR6%I"`b"&5enRg,EA4tSL@q4UW+U\jLhRhO +$!?/HJNpuMSaa;s1Mu:O%#RsUT3XVG\S.mgLV[5@nXj_deJ\:_"I?4%4s]&jBDJ\C +fW'sM)t]R&hqS7cr8-,.@%e0[.tO0S1H8uq^,@s-$biG&"I\K@?RI6iLu7[j3lh"P +?:F],:I6?OrHF3DL@U8dhD*7##3=`=kp=/?FS.:9%.i#!!QpbTR?K:N'u'dRs(a\> +^3Cadn.WrG]ghke-bK +endstream endobj 41 0 obj [/Indexed/DeviceRGB 255 42 0 R] endobj 42 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 34 0 obj <> endobj 43 0 obj [/View/Design] endobj 44 0 obj <>>> endobj 39 0 obj <> endobj 38 0 obj [/Separation/Mograsim#20Orange#20#28255,83,0#29/DeviceRGB<>] endobj 37 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_orange.ai) +%%CreationDate: 6/22/2019 4:35 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -488 456 -23 +%%HiResBoundingBox: 56 -488 456 -23.5352 +%%DocumentProcessColors: +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%DocumentCustomColors: (Mograsim Orange \(255,83,0\)) +%%RGBCustomColor: 0.027451 0.32549 0.921569 (Mograsim Blue \(7,83,235\)) +%%+ 1 0.32549 0 (Mograsim Orange \(255,83,0\)) +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -1263 713 0.5 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 47 0 obj <>stream +%%BoundingBox: 56 -488 456 -23 +%%HiResBoundingBox: 56 -488 456 -23.5352 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 20610 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45CFFD6EFFC9B4CFFD6CFFCABABABAFD6BFFCABBB4B4B4BAFD69FFCA +%BBB4BABAB4BABBFD68FFC1B4BABAB4BAB4BAC1FD66FFC2B4BAB4FD04BAB4 +%BAC2FD64FFC2B4BABABAB4B4BAB4BAB4B4C3FD62FFC9B4BAB4BAB4FD04BA +%B4BAB4BAC9FD60FFCAB4BAB4BABABAB4B4BAB4BAB4BAB4BAC9FD5EFFCAB4 +%BAB4BAB4BAB4BABAB4BABABAB4BAB4BBCAFD5CFFCFBABAB4BABABAB4BABA +%B4BAB4BAB4BAB4BAB4BBCAFD5BFFB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 +%BABABAB4C1FD5AFFBBBABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4 +%C2FD58FFBBB4B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4C2FD56 +%FFBBBABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4C3FD54 +%FFC2B4B4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BAB4C9FD +%52FFC3BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4CAFD50FFC3BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABACFFD4EFFCABAB4BABABAB4BABABAB4BABABAB4BABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CFFD4CFFCABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4FD04BAFD4BFFCABB +%B4BAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4B4BBFD49FFCFBBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04 +%BAB4BABABAB4BABABAB4BABABAB4BABABABBFD48FFC2B4BAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%B4BBFD46FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD44FFC2B4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAC3FD42FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC9FD40FFCAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAC9FD3EFFCAB4B4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BAB4BBCAFD3DFFBABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BBCAFD3BFFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BAB4 +%C1FD3AFFBBBAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD +%38FFBBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD +%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4C3FD37 +%FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C9FD +%36FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%C9FD35FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4CAFD34FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABACFFD33FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BABACFFD32FFBBBAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABBFD2CFFC3FD05FFC1B4BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BBFD2AFF +%C2B4FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAC1FD28FFC9B4BBFD05FFC1B4BAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C2FD26FFC9B4BABAFD +%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BAB4BAC2FD24FFCFB4BAB4BBFD05FFBBB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4C3FD22FFCF +%B4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BACAFD21FFFD04BAB4C1FD05FFC1B4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BACAFD1FFFBBB4B4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BBCFFD1D +%FFBBBABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BBCFFD1BFFBBB4B4BA +%B4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BAB4C2FD1AFFC2BAB4BABABAB4BAB4 +%BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD18FFC2BAB4BAB4BAB4BAB4BABA +%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BAB4C3FD16FFC9BAB4BABABAB4BABABAB4 +%BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C3FD14FFC9BAB4BAB4BAB4BAB4 +%BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4CAFD12FFCABBB4BAB4 +%BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4CAFD10 +%FFCABBB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4FD10FFC1B4BAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4B4B4FD0EFFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BA +%BAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABBFD0CFFC2B4BABABAB4 +%BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4C2BBB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BABBFD0AFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAC2FFBBBAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BAC2FD09FFC9BAB4BAB4BABABAB4BA +%BABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%C2FFFFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%B4C2FD08FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAC2FFFFCFB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAC3FD07FFC9BABABAB4BABABAB4 +%BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FFFFFFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAC3FD06FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBB +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD04FFC9B4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BAB4BACAFD05FFC9BAB4BABABA +%B4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4C2FD05FFC3B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD +%05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD +%04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD06FFC2B4BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4FD05FFC9BAB4BABA +%BAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4C2FD07FFC2B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05 +%FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD08FFC1B4BAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABACFFD04FFC9BAB4BAB4BA +%BABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4C2FD08FFCABBB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBA +%B4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD09FFCABBB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABAFD05FFC9BABABAB4BABABAB4BA +%BABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%C2FD0AFFCABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD +%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BAC2FD0BFFC9BAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4FD05FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD +%05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD0CFFC2B4B4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%C2FD0DFFC2BABABAB4BABABAB4BABABAB4BABABAB4FD04BAFD05FFC9BAB4 +%BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4C2FD0EFFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAC2FD0FFFBBBABABAB4BABABAB4BABA +%BAB4BABABAB4BABACFFD04FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BB +%FD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD10FFBAB4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD +%11FFBABAB4BABABAB4BABABAB4BABABAB4BABAFD05FFC9BABABAB4BABABA +%B4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4C2FD11FFCFB4B4B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD04FFCAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABA +%B4BABABAB4BAC2FD12FFCFB4BAB4BABABAB4BABABAB4BABABAB4FD05FFC9 +%BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4C2FD13FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BACAFD +%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BAC2FD14FFC9B4BABABAB4BABABAB4FD04BAFD05 +%FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4C2FD15FFC2B4BAB4BAB4BAB4BAB4BAB4BACAFD +%04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAC2FD16FFC2B4BABABAB4BABABAB4BABACFFD +%04FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4C2FD17FFC1B4BAB4BAB4BAB4BAB4BACAFD04 +%FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4 +%BABABAB4BABABAB4BABABAC2FD18FFC1B4BAB4BABABAB4BABAFD05FFC9BA +%BABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4C2FD18FFCABBB4BAB4BAB4BAB4BACAFD04FFCAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4 +%BABABAB4BAC2FD19FFCABBB4BAB4BABABAB4FD05FFC9BAB4BABABAB4BABA +%BAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FD1AFFC9BAB4BAB4BAB4BACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD1BFF +%C9BAB4FD04BAFD05FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FF +%C1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD1CFFC2B4B4BAB4BACA +%FD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4BABABAC2FD1DFFC2BAB4BABACFFD04FFC9BAB4BA +%B4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4C2FD1EFFBBB4B4BACAFD04FFC9B4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD +%1FFFBBBABAFD05FFC9BABABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1 +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD20FFBABACAFD04FFCAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BAC2FD21FFBACFFD04FFC9BAB4BABABAB4BABABAB4BABABA +%B4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD21FF +%CACAFD04FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BA +%BABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD +%27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BA +%BABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FF +%C9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BABABAB4BABABAB4BABABA +%B4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD +%05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4 +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1 +%B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BA +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFC9B4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%C2FD27FFC9BABABAB4BABABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27 +%FFC9BAB4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BABAFD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4FD04BAB4BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BA +%B4BABABAB4BABABAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA +%FD05FFBABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BA +%B4BABABAB4BABABAB4BABABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4C2FD27FFC9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05 +%FFBAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABA +%B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BA +%BABAB4BABABAB4BABABAB4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBB +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4 +%BABABAB4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABA +%BAB4BABABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABA +%BAB4BABABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4C2FD27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BA +%B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4FD04BAB4BABABA +%B4BABABAB4BABABAB4BABABAB4BAC2FD27FFC9BAB4BABABAB4BABABAB4BA +%BABAB4BAB4BBFD05FFC1B4BAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD +%27FFCAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBABAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABA +%B4BABABAB4BABABAB4BABABAC2FD27FFC9BAB4BAB4BABABAB4BABABAB4BA +%BABAB4BBFD05FFBBB4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BA +%BABAB4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FF +%C9B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4B4BAFD05FFBAB4B4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BABABAB4BABABAB4BA +%BABAB4BABABAB4BABABAC2FD27FFC9BABABAB4BABABAB4BABABAB4BABABA +%B4C1FD05FFC1B4BABABAB4BABABAB4BABABAB4BABABAB4BABABAB4BABABA +%B4BABAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4C2FD27FFCAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAFD05FFBBBAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BABAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BAB4BAB4BAB4BAC2FD27FFC9BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BB +%FD05FFC1B4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%B4BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BBC1BAC9FD27FFCABBBBBB +%C1BBC1BBC1BBC1BBC1BBC1BBC1BBFD05FFBBBAB4BAB4BAB4BAB4BAB4BAB4 +%BAB4BAB4BAB4BAB4BAB4BAB4BAB4BA +%%EndData + +endstream endobj 48 0 obj <>stream +%AI12_CompressedDataxœì½é’$¹‘&ø¿Dò|´ÙÛ43wdEÂÝ#؜á%$ûíIÉÎ +c:’Ì,rȗهÙ[ý>U(`æG±9ӕ +34ÌÃ¥ÐãSÅßü¿ú͗×_½þ·»/ÃÕ°{òÅßüÍáÍݳw¯ßüxGòî§/^|ûöݐ~ðëîÆùjÀS×?-Oíɼ{óöþõ«ówW¿½Åû?8üþÍýÛw÷Ï^ínï^ÊC?Üýà‡øíoïß½¸“ßß?ýêéë7Ï^}}wõìþ‡Þ¸Tv|öNž˜4M?š†qÙŇ´ûÕÏùȳWxööíýŸïÐb(lpÿúÛW_Ý¿úzÿúþx—æݗ±”]Ä?&þþïï}÷ö¡‡®RHž<¾~þíË»Wï~õæõó»·o¯_¼~óöÇò›ëŸ¦§·÷/î¤o/Ÿ½Ûâú§ãôtÿíý‹¯~ñíË»“nÏËHzxÊwÿáí³¯åKùoÒóӟ¾ÒoîÞ½“oyûãÝÐ7{Á~ýÒZÝýà篿~óìíýËÝ/9L»ýÁ”ÒߕðwÿþöëŸì»W¤²«aÊ1ò0¥¸ÈßË4¦yéêÚ¿ø5eÔ3…d5ýŸ»î¥ÇµÜ‘4Íòƒù•ÌΝŒÑ›¿{õßXÇâÍëo@Bw_¦qÚáÿƒýö·w/¿y!SΙ™Ò|•dNøWÿC}X&~Æ«’—e÷凫y¤Ò¯FY1»1-WK±7ڜÞýáþî?Þýâõ«;›Òë7ï~£k)ÆaÐÿÚ¯~ý틻7ÿðêþ|ôLÚ¢súó×_ݽ7Z·/žq*YÆö_{â·ÏÞ|}÷N–àëß¾ã^)ފ¬›Ÿ=ûÓ¦{´F~ùÍÝ«ß¾þG~ê—ã4‡]ƒLN’nMe·¤¸ IÒÎ8{»cû¯ÕŽªPQm"cê~%ëï—oõãúùéOÞÜÕežvEÿÃ~\•îÿKý¿}®tþÝ»»WõûeC~Þ-ïáêç¿D«7¯¾:¼~‰yxË-{'íË +zñúkûmû¿“*¾ýƺAÂS™¶_½¹…ŠŸ|ñ ý]yú«ßÊ/òæõ·ßüôÕï^?ùâʹþñî¹p'™Û¯v¿ü·ÿ!?ÿùųç¿ÿúîÏw÷ÏÿêîÝÝÛÝ^v®ÐýYaDßüð=KßÜíô·ò.”¿‡¿óþñîwÂCZJýû 9¾xq÷êËÿçÛ·ÏÞýùå믾}!¿½yõ‡»¯¿¹Û={õÕ½ùæ1MüêųWÏÞìø‹ÚB_ïÞݽyöïïîÿ°{ùL•‡~vÿyñ™Œï£ZåôŒ_â3ëÖz ûÕ£šzöî÷´î^}õÖk¿~õõ Ìâ·Â›¶#Ǝèó©þ7zùo¯_Ü¿}é•÷ÿ÷#¿T†õÕ/_é'¿ùöíïw¿}ýú…×üsáÕwo¾¹õöîÅ櫅‹è{U ùÃçÁæù_¢‰Ã³/îå<ûæ÷÷Ïϵòßì÷¿»¿;Û؅÷µºžsªÎµú›oîþ|ÿìÅÙO_û«kÌÖàîæ«{᝘ÀƒÏüæÏÞ=ÿýîg÷ÿöæٛû»÷ìVLöïî_}%ú›oïßÝy#è Ε¯ïÞÞ½ûó;aÐÂ^Áfä…Ûî…V}z*ÇMœ|ùåÍœ±ûWý#?yóì«{9ÊDFûÉë_ÉÃ_KÕíßrlæÝþ«'_ü˓/†îcý_ÜýÍÓ½H„ÿEÈÛ?ã¦L] V¢•Äÿ×2ãÿRã¼*ÙK–U¹îÊ^ÊÁʱ+7íÔx[ËêÓú?SWBWâª$-2ø;³”Ì¿KW–U¹÷^^öãQJýé(5ÇҎãm_úáãçÕ?¡+±+išQž|¡O¹+eZ¤è¯»²×òä‹ÿûüœ^šÕ°š×ØÍn›c)RcçØͶÎn?ËE +þÆì–Õæ[Y0c™J,©Ì%—¥\—}9–›r+ Gæt K\¤¢¥,˲_ËÍr+Ëg¼×ñ:]Ï×åz¹¾¾ÞK9\¯o¸¤&éBܧ}ޗý"¿Úïû›ý­,3Mz8ÄC:È'–Ãõa8Ž‡[Yv#'#Óq>ÊçËq9ãÍñöfé 7ñf¾É7åf¹‘Æn7²Jnnnn±4neÐnÓ­töV>ÿöZŠ4z+¯ÞnþpNN«ÓnºrìÊ¡+ûU¹îÊR‹Ô¸Hó­ä®Ì«’º»º"«Qjœ¼ôœ­qå¡ÿø›þÏqUZdÈð÷¾+×]YV¥t%weîŠ0ô›ä%®JèÊԕ±+C_t؟|aÐw ÿsèÊ^Kݪ«ù\Ïâzîꬭgj=;2#Rcìg¤›‰õø¯GÝF{3ÂU¯e3¦6’«1\Ûf´Öã#㵓k+ K±’­Ì,ÉJd VdÝq3ڙª§‚o…Ú9m¬þÙ³\[YXŠÙì²ùóa¶’¬D–`Eyr=„¯vszÃyÜsÞ +ç)q^0GÿÈѾæØfŽfä荭ŽÎž£Q¤w™}GÑˁ½:²×üî̯Œü*ùY672¤ag×Â֊°·Y˜\f7 Ÿ—/•%u#ƒ}fx-l±\gaIeóf”3øV¦þ(ƒ²_®…–% cMÂ`ƒœP£œØ·² Ž2X{aÃK‘o–< kŽ%“ål¿•¥r”¡Üçkaâ%gaçIØzæ>Š,p+‹è(ûֿȐå Hr 9ÆY¾Q–ôLöAk9<Š!sJr˜9TF‘/neáeJörà,rðä8Ëå(šä@d ÜÈò8È!u-‡•|£[sHr€9ÈF‘hne±eqÌâàÅQœäèÃQ óœ²ßN¶'ñl}’ÏÊӣ℅„ +"bÔµq¡UÖÄ:j í}(ӊ_Üv'rŠEÖX’õ5ÊÚ:·²¦îá)…?zRÜ°8­·u=±ì̉%‡’ õp6ú¹8ËÒ+gNÆà'#ÎÅk´Yßw#˜›«œA)ã†rÆh’FrYãz;Èxí×,?SÆá`ø<]S´¹ '+€"æèⓠ+Œ*B©`x x#Œ&ºk7«(ÞDoª,¬­ÖÕjb=(}ÿì ù÷÷“©¹<(tY!YVʞkf#hôÓì©ÌªgWmY5–Õ3-²-ý3ÌlÍÊÞÇÈ|:6[ù³lä½Ë×µ4©¬t©lú•–´ÒÁL/“ƒ1ý£2ÿJ%^k{õ´r]е ŕy „^5ü½lJٔ¦±ê¿fÓeûOJ8)әb¤ÆþωêˆÝÙË~þ÷ñlÖ"«ðàeïåúBY.–R5L©1oÊüÈÒ´×Ô©qõ³[8Ú¿OK¸P¸4¤Æé‘åÜ Ÿ)Rããž|ôŸ³¶‚OúóùjìŽ×ÑV¥ß*Å­¨ÜVm!Õ6RL÷®¶Û÷²«UO¯»½ÚcÚVØîí*ûÖ½ÜïÞ½íêjE8ݻ٭³•ä6‰f— +ýnukÆûTþ嶐fÛìͺ;<šª¥·±íÏîÍýÊ2wº;« g»[ËÊÊ׬BÕ2tn¿úÏ+Ûa:)qem¼¼+ז«­Íòܾ}h7oö*wõ…ß}øŽ~pWÿìÁÏ_ã¡·W¯N,•ZN¬*« TØo(‘,¦`Î&“L®^ÝvRI^I%S§bDÉ¢Šõä Q² f©’5k Š¥JցV'U´Š+ZÁ-¨ZQ³öT´ +mX²©lÜ(·Ô¿hB*(¢j©²ukRu‹ +×Ñ®=®B… *X™¬S»n©KCñRÕ ÊW¡òõ+Rý¹­n©‚¨‚A ƒ–¥Y<*š–¨hÊ˜¨c´ÝP!;ŠB• JÔ2(f9&ªfPÎY×@íÖtø½áà å;Hx™RތþŒ°g‡¬Òä8•Ý +Õ3”HÞóîŽkwRXµçêß=Oîe(ÊKÂoã‰läœuÅKW’ÍŠk®x¤ì˜^fAÙp»³|îùâŒ<ñ8®q‘›|æ]íª¨–ÞBÖÿY;SçÚWÏ\ª£©´­„UYÛüҦ̫"Àʒ˜W6ÆBk]®7e¿-fÑìËñ¤œþ¹=-uµ ƒìOòñL™Î–p¶T+âiIÊ|±¸=Yj̛R,Ë{Šˆ+«öù²d!Ǘ,ÇÇ©ñ”zn*]¤ÆK¿ûÈ?gŽ×®É Dƒk­“9Q´D+jO­öÕl¥Ú_+f•ÕZ[ÿTVѶP–Êo«n]¥þj)V»±¬oš§´Ì^ª­¹xY¬\{ٟáYG˜—N8Ö9^Õüç¹SǗV~ŠOºÀ.q¡žóìiºÌ{à9+c|†¶´Ë<æ gyG‘ä#à NA/—sæÝî¿È'ÉNùÀ»úáòÜÕd¶]nE°;¨-•ŽbÈb!ʁpîÆ{a ê4Ìm Çq¢ë¸ˆàYÝÇG8åÐQr È +'²œ1d«+Î亓ա …Ò©Œ?p,_ST†s›IÌp1Cþ¤›ùÉt5Håt7ï…=Ýé<ˆ”‰Žç(Y:S„_Dœ¿¦ú ìãÆ\Ñõìú' +ÿpJÃ-=_gªK瞦ƒZ +&äő¶Ê@g5ÜՐÝ3ÖET…®ku^Ȝ°ÑoéÆœ Wþ[9o帍ӏ~[¹k㪕›6>Ú¸g㚍[ö<òhjçŠ+nØxàZ&ë¹ÝšÃÉÀ/kœmÍË6ÜëŒdtʟz™ç¼\s‰ël¤’¾Hp‘÷rÇžþ¿««9Яš=î&ù×¼+ÃU”½³Ëèõ ÿæÉóô1Ïîߞ©ó*ɓiؕñJôÇùr…ÛYÛÕ8ç%û?B1ž*à;•2EùGN“ýZãð€Ö2]…!ÅÖÜ'פß3ˆR›fD2ȶŸñ¢h梺³²%¦a!}FœƒücÒx‡VY¸„ÓtŸõ™*´¯›᳨,CÊ|±ÖÊD·,ÚÀ$|•Éô¥eUY†¥ÿºÏSá'Ì唯J ª*)/Ÿ:¡ÛêέYûøe¹>qÁ®ŸB=ûcÃoVæXæßß¿|y÷ Lû—T+$ó¿8ë¼5†9«LææËƯ{Ÿ­±¹hh£Š˜çÂÇFÃSEr@Tíy¸ÝÒü¡‡ÚÌãìšÙ 9ðT8¸ôк¦mëxM¨ÈÁêQۮڈqš †½T—gÅNÒqê´ôFñܟËhÔÞr›:ûcŠH &ÁQ [óX6t‚â ¡@ٍaÉݞc/:äÅ£p[Ç¥Ÿì£¹á{G|sÅôôîÜñÑO륺ä>qÏ Æ©¬Te1ðÊ_» u%HZYƒ¥«d`½cvo²Ž²¡®a…Œ0ãÙànÁÍcjËföŠf@›QøÑؔGáRܓތÁꢞOd8¢£c‡® 1TÃɐAŠxÜߜ8;à¦C7Ւ¨ÞãàÒs¢=SŠÎ”¤ M£×”§÷T§eö(8ÝR²n²µB11*_«„ÝdlJÙÎTx&älHÚ"ñRÚ.”¶«¼}\ÉÜ©Ûdn¬… +á¤Ü]%oÙekÙ«d1X灢㍃;'JÞâÙKÞJÞ7¹dîUòäMêÞSê>RêVøg“·c'oCÖvi[¤ò#%î*oŸJÜÉ$nÊÜ.oï)sSâvfe7ƒ&w`AºÓNÿ}ãÿ^S͐Lgœ™•ÍewӜwõ_ý߀îïj¤®ðçÑÍÖÁaðíï°ú;£®Péäàx5‰ ãDÜA¯ ùlÿUcºþWݞí¿×+ÓûÑ`Ô$O œªºÁ¨ƒ™ögRÏæ¸U@¾ðށ§Ûþkû.P²Ýs\:žùcîô:÷ïõñtòÝz½ñ}tƒ}oº?užº£;¶NËӟú¿·ÿîiɁý-”#^„=\E„Õ¿aõ§¸qhônŽó.Þö{wøÚ7nÇdì°mdÛ(·™X»'VPÑý¨h6hƒ‡V`¨ABõ @ "Þ{Š×TÙ ÙÉlâAõŽ&$¬½‡×î=ÌdaæAÆ5qU?⑟§£õpôãÑÈzDÀÉcRÊ'_ØQÙ–ýqÙ9×PÎ5˜ÓáœO¾Pqɼ‰[@ç%Hç NŠ+ öQh°ÑÙõ)œ»+ït7s°ˆE„¸v³ñĜÝÔ¼2wPf+Yj܂™+0óåõYÌ°>¯W©¬ìdîã¯Ù[³­h紁½¯^]¿ B®bYÙº’g•m=ƒÙ)—W×g]Û76d‡ÎC®ë\Š¬l]íÙVüL­ƒrŒòdòv=Cԑª;à†»€ûÀñçœYÛð…m9ï2›NÌÞ'gÖ û“ Y‡'¡PþùˆÓ ëKçB!òÆÁ9oܟ—"Ñ´çƒ"ÆvÑ¥=t"øìNÚw—úýÔíªCÖÕ"Bi€}dΐû¡õ ÷(Pÿ‡QXX¢m $áRÌU€´y¥ÄËӝµësU¨†2ÏˈWã"¢s1C‚üè¶ +µó4»É|%’Vé¾ç£«Ð/È1K„…&ä…94ðò8fQÐIü ½-Qxi׏4Ë«cgµûäšÌT†8˜),…æ/9ŠKhé2*€‘I‡ØêY®RR¢3}jUhºùå›ç¿¿ÿêîÆÿ·T3õµW³Hƈ>¯ “ž5¾VfŒÆ2>SÞÖ"koîꋚ¬ÃÞÚÙKf€E‚aè-Tñ¶YÀû&Æ.ÎW"8¯¦ác+øÀÁÿ rt¼ÁÐÛ¿hŠkßËéUzî%à>05;±Â÷^|Sõ-ƒ;C ©:Qr½'»vÓBCkˆo¯½´p^*ë0­°Ó +Cmº +YUëe›A¢Õ€º £\ªö¢6ƒ¥Óbö&iÜTËA¸U0–!\Y­º¨æ˲¤úN8—Zª5a_å;1ª EEóÉPæfÎHVm!“ö¢ÓhY*fsÐb2D »J.-¹;¼"¢%K!SK𒼴?ÙKñríeߊÔxèJƒ ¬ÝB=Nu\•Ðߓ/rô’VåôOٔåLa3_Ÿ”Ã…r| ¸s †á Îöრ´(Óç(gƒ›[xsöç}Û³ã:¶¦p‡î[¨6ö¥ì@µ'¬bt¸çn;û@óg/tì¬n±îØÚd¿èþ8Й9xt²@èB[êµ­ìÚÕ°–­ËÉV)¬j{®É#×bõeO\Q͏}M?¶Í#¡ #¸@«gµ£š÷aGƒL¨6´Álh‰4õ[/îµ>šÁ,q¢¸Ý,hÌ·¡Ñ_MÚC>ëæµ^:ûف×°ißFÒýÕ¢¦¬=Ö3U™†ªžkÕO"¨!ˆFÜO\á~zÄÏr‚÷Yy±;|#{L\cyªø¼Eìœ"uNQ‚‡x—³Bä\D笔“UTöeìß%%iÐ‰ð—°–jk×±Ð5 +ºF?׸çó\¿¤)j¦„uj–*Uë¨æ%^U¡¦ö´øeWh:æh(¯u¼rSKN£”›Z¿Qé{UÞ°kUþ¼¡éDß¨ð¦Äþn­Æ¯ùµ*¿Væ‹Y¹³„2K®Ò7µ¾*ö“g<:õþ¶Sòo\—ópkáµñögñR¼´c­ÒÉKlEj ]i1}ãªô¸ë5t£× 9©Â!C8¬Êþ¤\oʹ?¢Ç®ËكF»ËÅ%©1](ñƒ 6¦Ñø å£bᎆg©ìÀuéiDü:”tßÇśwVV÷¼òÐ6íqez]^Õ[ëþÚê±½öyÎ6O:®Ó&ãàÞÉeΚñÕ̯7YÖ"Àž[a1¯e¦[=ØjŠm>ìµ»…ydJÁ²r,ØC½ÙÓ*àㆠlö±PjÉn²M&Ë{ˆÈô# ñ5DCAfÌ]„hHˆJL50DCCT ¡³Iä¨$rkúŠ2Te{{€¯Í\ÃFúÀ‘ÙSj‚¬JjK5fw<.x)`°†™¬C†EÖ3méDÕKaíÄs!ÄH|úç4²ïR,Ùð?°››ró1å}˜1bjÊÚpþjgHC­ð!‘~3$؏ÆfIr»ÑÖÀñ¯ á^½zöòî«Ý×Fڍ°7œ¡öFŸs˜’«(]¦ñrè¿&¸­ h&äv ·]çHXm €ë¼v‚ÑÉÁµË‰[³K≂U¿¾&/h}ØöbϬXG7<6ãÃÐaYÞ«úê½}uK¸ÐûjäÍõ|k暓ô d©8w–±n3±ÎçôÝä‰ùLYb®…s´,1ßyv›ï¿zýÕ+§Fˆ9 Èe®X4øãÊmò´XÇg,ß×xé‰Nª¨òÛì\E¥¶‰’C^e͜G˔Ôxܤ³‚ìUšPÊ%3H}žÌ@ñlÐK trÀe[zx“¨phYÛÖÁM΃°< oRåìÆaáG£ö]“q& uˆ +ŸVOɃžj©f ý#5«©Ãی(Õ´ÒÌ.-Š¦™iÆm!⩕p¦Ä %rG©q¾XÎøW.”f´*†]ùrbAZ©ñ=O|hytþ#5~æ?ÿ{ÔøGNrc±‰Zȵ:§<ñÛl:G; ~bºžp”µ u@iî]hy·ÚO«¼»êjªðíÞÍtž£TžRaÛgB&Ïr•ÊW2ÓB*w¹^qµÁoyKã/“Yt—Ifú”Óºã4õO[®k>³maR•ã¨µâ:—¸Ït¡l8ÐÆ}™#½?y‘øíG”‡¹ÞG•ïküKÕøqQþó`kz8±³ä•uÈ,CÌÉLZê[öQ^´©]¥ÊMÕá>›U‹p•œ6^C”®iÓºuù)Ò8Ý;×o)? XÊd"PäP˜Æ“/èNWX Líꯈ!Бž ‡¶£>9øq•ww¢'åMÂQôÏÁâæàé̑®¥îù:§•U·X@RÛbÂÞÛN³ê5§^Zë/[é¶ûcXôã™rš³F=ÓÃe²|é+ñ1ÅpÊï/óc‹Ôøègÿ3ÕؙɎ'é„÷²|óM’-ˆ\ºG˛63_ÚÀLi{š¼fš»Fˌ¶—õ¦Î5¹`â‚y î4¸Òԍ¦q Gf?Óh…T³žÑUæé¥K®!|"QÔ¸„Ǥ–Þ&—öôÒ-áÉææª.®êÞ +•0ºSëØÅ&\w¹Íš‹.,áQÓ*ÇÙÚuUWÍiÕ\V½Ã*4g•e¶Ïd¶Üº©¶Nª î©'_lT—ÜS+çÔCŽ)©ñ‚cêœSên( {l9<¦Ø=ï/— Z'…ùFè韎G˜.à&àB‡GðŒo7öqľXêiw}<)‡+^Óp?y~N¼T3ß 1ƒäŒ?½Â«œÆuÌþ–ÂÜaäú{>û;>7寶¦>eÓÁ36ûš­Ÿõ¬­fܟ9‡Ý¸®Ø O`ä7.Ù¥F~»S—¢¦¥Y*]‚¥.½ÒgyfÍÃ\”Iåp-¼°­!2ß]‰c`n»!Åe˜Îüã”éóÕi±Ñi˜FV'™Ö Ï> ¦Ã8Gó’5.tôqX럥7Ÿ|>užgœÓGÁfo Àyæ¾,‡Ìl“ãlú°h>‹žƒ¹nÀº&dð +Ø[8ߛóÚU¿ì¨£á¯?:ú^0#øq ¨ø7؊´`aïiá@™ë6ZhÈ)ï)0qÍA¶¿ùË@ÃÙý¶ûÁ€uÓ&ïoŸL–ÏõÛ2ý¦îz>Í +¸gJ#ËìÛÅG¶|¾³çñ½¶¸G_×t²iL÷DÅ3Q ÍYZèrÛ[¼öA |)t‘ØpÉ01k¼5üˆª¾±ê`@ÊDw\ßÚçÔ}àùŽ¶úœG‘ñ5ïQŸù¨ À±ìGgBpüf•€SjÎg„_ؓ‡ŸYùš,d³=>æu=ÍäÅa@ú0Ž9 ôUáos™û¼©}ƒòÖ'ïÂr~–m +VÏXóö»+|ÖĶºN2„WHoƒ®8¬×ß¹q0ðÐbÚÛõ}ùSßYåç<˜Ë;píÍÉl/y;îP½lë/øN/4chúˆÔmz©s ¦Æ3 ¦,¹ ¦òÔèRÌg%õÃoõÔ$¡²8ÒãŠ-]c®ìj§ÛY#§èm·vÒÙÖ¦R^y‹JÛëHÄÉVÖà,Ñç‹æÑIXÉ /¶Zx¡U؏2žG櫝åK&iV-4…©FP?ƒ°K˜<YmIV²r಩½¬Å,¼?È&¾edá5/‘Âêð;LÏKpºö½A7vÃÀö~øŸºín¯u™Sý¾-¨·KpÍ2ÀX–u6ÕÑ$™ÐÃû{¾Ãâ+†XùÌ] ðÚ-·eZ¸DÑPœ¡˜½¿yÕuXg—³6­²m´o¼ÄÕ·|½A¦u.zØb(6 âi¸Gj¶¼Î©Qm2<Ô+”ë/!õzúz›E»£¿,¹¿J~9Yþž +”· œ¿ù½µŸ¿$ùâeë}éú_Í2ÑË ôróD›O‰+–›B3SxVŠ‡o+2W3¾»ukexßwy¯ªá½æ¾êMïc(6 <nÜ´l¦{3Æ_{N¬j–/fœ¯º”¯¼ñ©/ñ¤„ e:_x»Í¹2~lá5ퟵ|xôhîŠÞaQ]ã ü£‚?ŠgCì3!BȜVYÛuÉ¸Î€ÈÜn"¼ôaFkÄÜ&déìE¯7¼aëR9+龧òÙÊ_C[â¼ ýÔø J"5žÿÍùËBN/:è/< :E'öéÕ!óIfÑuvÑñdWÕ=µçíÙ×æ2,~aMtÇaËNt>?Ѹ9ôjœ¾€[ƒF«7 Èq+¾'‡Ÿ…§OÅϜÿxAú“j<¯XÄ ªˆ)*´_¯Ë‰’³ÉµÝ#åšÚ䪔ðóš#¼žlšc\O‹4õðÁæ{*pÙ²?Fʄ2 .D £|x°LÙÀåÌëhÙa;T09,‡°ŒDåTIQ­…*%î™Q%Dʆ&B„üyRÞ5Èkî{û—þÓ׸Ví,ìۀ‘íN²àø¦þ¿M‰¬Ø§àwt­ÕԅêlUTËFQÍ+×J§â|âøœüù Õø°BqéþR+ÔÖO¯}Û^ÛÖ«A® &Õ)©q1k¿Á¶ú%„Ý5‚SkW_¿¿uoÙ«;³wh>äÒ<ÍaÙ2Xêõ‹»«ÖÙ̑4ÑR…‹x©ßqû.HRTŽ Åf3X—S%g­u +Ò¹ (¤F¿pÂÊÞ²À´k%nº|0ƒç„y(+Ì%7nïĝW{ºK=':>Óµ^æym™ëªµ|2[y¡ãñ@ ùH×c’O†EÜ¡0ÿñ‚ôwRãƒ* \’ù¡Ç«¯n³wUª&ß(\½*Ö´šµ¡©q³ù+r»ÜAj\ü‚‡zÅÃaåÃX{1ê% Ê8›Ï¼"Z¤ñä>í¨øøÕ]ڇ›ã4]F؛p3\aäp¸ê_„¥ %ó0år…v9^)÷ÁO«Gji˜Ḃqšyϖ0Ó1iÏ–i$ÌÐóޑ8†]ÌW°»Ïùäªìn³êUÉ»)^åõ—|tŸêÈKgyi‹È=‹ÑÙiN ã Zg‹×»š‘Ìkö¸Þ[o¸ªÿm7®ïŠm2YØþÜÝﺽåu+N@Bél}Ëw…­~8hÕôÎMV\™Îõmé- ÿE ¤qû»@n»kOïYº ×·D¿ D¾ä⍠M£¿îl_*§nƒEgâåÃTr®—å̓쮉á¢-=¾u›´÷Ã߶ûõd¿Ð.«$NÙ^-5ØcQï8îG¼üÉ;ñ<8>}Ž‡Pø=:þ{tü_?/g÷¡ÏEmˆÚº|݁)ŒŸß´>£¹‘¾[ÖíΪ£ÝÒ\ï­j7W¿¹jîîÑj ó–®3gƳßõúü¨×írŽ“›;ÖKñÒŸºêòyA,ŸHbnP™V÷yžÄ×=pÍÆ +y}1~¯ÉCó¹uݵPÍ#i!ø@\`«³lb·WTœ|óåhÀË û2]-ïyöc¹öÛæqgÁ£®b8wô(§YÐÐ@æe±õoÜÙ7Âö‚âí.úäʾ“¨Âº»ÿÿþß¿Ûýæùïÿøì͟±m6”¿Ô¥4§&½¼–æÉ'i‹kôš´¸OX|ô;1× Ðk¢âf7–¤xêúëH‚Ë—0ôW0ì»èO‰8t×*0B‚’ìGÆHXñ¼¡žÜskژq¾ë+NÌ¿}é]^35ñk²›UuÕ´t×UÆn)¯![/ ’¨ÒõÝäûˆ4ú›t×fÔ|Рù¸¸”3—{|ldÊ:1Dw¹Ç65Èñ|š‰G­‰¹Piø\W*õ×@ùŠXE8уٯˆþ®Ýºº$讉÷%B_§A7s7=ɟ ´]Ç.néƒãºµÒ­»¨à|²ÿUZ‘Ï'‘W¹ü/Xã9§Ú¹›àóšãI§ïŒær6•õ:‘µE`=ùâc°²Faµ,Ye…e®½Z=hïG9Õe£¬“ÈܜO#óÝ©õ1Öó·j1mö£í‡Ž_¬èŚâïؒüÉx«1„‰þ<ÍßñQ‰þÖiþ,vKdžOŠÞÒèiCí2zKVÙGÇo± ”ÆlH]`t±·n7É~òù”@߯‰ï×Ä÷kâû5ñàšX§û€ŒY§ù¿>üåïÔ¼%”§¿xýêWoî_½»õõ—_öª{ÿ›'_üâþ.èï~õìÝ»»7¯D«¿~ñ§·oŸA›·í–åj™§nà8Ïa7Åx5Èìì¦q¾’Å5ë_ë_ÿüGüý­þP¨ÿü'ýù¿Ê¿ÿ‡Pÿ(C±ûùî_þû°ûê ßú5¨-Պw/A=io÷³¹~×Ïú*Î×¼Â~týæÝñþù»ûׯž½ùÓîÇjùÑþõë2?µqyzóÕý»×ožîŸ=ÿw½§¿½q÷ô×wÏßýp÷wxãÿ¼ßû­ÖrÔNÿR×ʄk/Õ:N‰«&Êj)–%Ò. .õÞ˸”!,»~¦u­G2ŒãÕæq—ÊU%ÁJú9IE»´\Í"“í„5\¡¶”qEqÜMEf°Kéj”¸{Î×Jº’Mviºš`+ZÄUœæ²‹Ë•è¸4y¾ƒ<ÕìÈ©¾·\ 9L» ¿Í¬>³¹©\¥ n‡2\¥ïç«C°¾–ã•è3»iFè³´6K+"”î¤Bε Ò ‘í5¡Ž¢áìdÚË(«pÎW"²Ž€,ÁJ&7M L¡ÔÎ̓Ô:Å]œ¯pEÕn’ÁYq¼’.á;쉐®¢¿5^‰´;ú—Osº>™4i’ÓÍóU˲“Ìì<×÷æ«E¸Ñmà·ø¨˜—´“úJÄmÐ)È\0X’¿'ÂÈ}9^ ?ȅr5ˆ¾·‹2”Â,… _2Ï +Èu’½'C?cbÆl‰Âz|¸Ì|Lü9f|7f~©3°!ÐáQ˜ïµˆ.ZvÒ(Ft +Qç-¦+akuÞÂx%?Ț›e|G雼/êʼ›£L`’Ž“Ìì²ìfi S¬ïÉê§y—gÆ¥pë¯É&Ù«A4  ^žÞVׄ=!•!¶zéÒ"  D™ðe‡=ÀÅ,‹SΛ9ù°«y‘µ¯˜¬*4'Íy=ÉPYx\ÝyÒ¨ïÉL‹ÆŸåžg¬Fy¾Ì ›gHXåÛ=Ç÷~§{ü¨³_®J +^á¾y¹¢Ê:C–J.¥È~‘E†ŽLˆÁ¶•$_·ÈÄùC²—bW¬ ùRM–ñ2ã«AVœh€Sk§ڒÅ×´Çj/¼¢M·ZÇÃX®„ëÈXa²¼^®©QXå)ÇxAå,ٍ³,ëJ°¹“õ&Êi÷XԖ[E•`íÙ{•:]‰,sçWQVAמì½úYþXýp¯hÓ¿Öõ¿ýü÷>à ùéÛ§?&Çðáõ7zúúw–1ÕW+™¬%Ȃ„Æ.`#'™*ÙÀ!  #æª~°ìÃÀ5-Gê I&ù*DK²89NdvÁ°qlŽ¹¦i¹šø ©y†å<óÁŒÍ.+/ãÅaéÎY.ƒq€&à0Ø4ŒŒiȺ–çY¶xtƺŸä§8Ë'ŠRD³O•‘žº[ý€íb==Ö¡‹pŎh*W©¨‘!fJ—fp·¬‚Ì}~ŽT9âk%LM{p’A˜Ç®.'X›ö¦“e8‚(i]]"ÎβºFb¯ú×ùƒÞ¯lÛÓ6ãÂa +\àCšLêÇ<—„Å]É¢f‹d-,iE1¯L>5NÆ^+i×U&dįZ«F±WÃÕ$¬¾Pd ÍºÊœ²nÕÉþy^™waÛ×ndßpŒDMEZ~¹¦"4!a×îˆÏQbu#`YV‚s)d jÍEgØ+r‚µ÷¼.>¥Y/a{E“õÊÛ3‚íúúYþXýðZѶï‘ô>ÉÀ-t€©ª7hû‰Báö,( ¸ÓjУHo¢Â­ ZlE[Ü ¥ê‡¬¦jЂ˜+ë-® Z¨m‰0˜A ¼”íU‹ÖHK‰ð•E‹ì<±š´¤ûW0­»I „I>heѧ °T‹Øo˜d ªE‹œ3¿²h‘±Â~e-*Ã~œ;qvu6µêÄ'Çcç C–€(¬¾Ñ`cuïsi>>¨x"Iææf(ÍsKÖg`¨‰UKðêÝp_ u036†â>óRnMqê܁ðÀEh÷ŽXê ™?ª;”÷Br•skê‚ÃRņæ”#OûU]‚#Î\™´æ¤E#îL¤WÝW¿Ou Bù_&,÷êÄ0љbõ R[ZÐÏê_øˆ1îÞ*ÒR=·ªsp¢ §ŒÍ;È7(Õ=Ãn[FÕ=ˆúJ–*Ü? )õ÷Ê (^µ#¹‹pš dÊ7¹p»éý3'!Œ\¦k/!LOQÝM5Ê ïN·éeG!á6{¹!9ÆX¨Î9XKØ'wâ9eí.ì¤7°«Ê~¶{—!؂H´KóB7¦uÙÛsÊÚkØ=èï•m{yÆq(s-_0¦çF.B÷ÑM£œÃyl®¼JX»ÛcæìjrŠ5¹vb¦ìVt›qêš4ÂÚ{Øó÷š¶½üO"u Ó3¿]€5².pœ›Tñ{Ñ:qä擃: ™foR„3’â¬Ö8#Öi†º!¶á¤:n“p~'chccöWS©¯Ê©ÅVåÕ!ÀD-„†“®žêS,sièîŽ<ꡄº`‡x± ØB•bzNQ¥·=(Œ©@wlu5Êб¡F–ŽP˜k•EaÓ»V+åyT~]{®vÀë:éé{ä¡Ï⢆w‰Kbí£†=Y§»:©áW"ìÚÕK=ŠðƒÄÆMM›5_­hð]vN ©_dNŽu‘UOõ”b]Ÿæ©vÊÚSݬ艻"ô”»UÖȘÖÔû¦qæ ɦk=L—ÝÕDi\ ñrCÆá=ÍÍaíglõ";aí´nÏUt««Q¬Ñµãšg1M^„lÚój£•°ö]wÏy¼®mO¿3÷58š°²Ñ<\5O·EVÍ˄&œ•æ ö":Ãäš'ô3‘9×TôC9K2½÷BLÓ¨Ns$‹ì/ò(W5”ÉÐ(wL[ÑDÝÐà±Aí“4§ú›Ê\òxEóæ0i8 +´O]XR§V%;¢é¼4•EKѬý4(àA°Z¬8ØޔVŸ Iõ”f@_ä“-ÖÓeÊm°<ÛC—hµ{¹!ËñShv9&B³¾Q¾…ÇGd/+Å6‡ xcmÊY–úªìçÐÛ +1áƵq×UCLw­=£Ø‹þaþ ¼W¶íeç”õKÿV>²—ò¢&TÀo蹃"MX–ó¤ð<§`cTTR÷ lÞ)­*sŠµê¯9«Ü*ƒ{†ÖÖj¥Ø«õóڃÞ¯lÛ×ndz–„sYÔIb1_®É8Àa'å®U³ &–Ã\ˆâp‚s€ø…ö\DšÁÐÕå”Ú¨½êdˆJtÔʁSÛ´ŸsÔO«OµNՊNºÙ†6_ñ +§zÕCܑ#$gÅ%Šð¦æ%Jæ°ÊNd •büvë+™Ðµiž[eÅZµW"%¸!¨Þ"ÒAh7ö˜fæâìœC_™S¬ÕçÕRhä Á]e r@ê[5Š½êŸçz¼²m_ûQýîÊ!«ú’òR¥ÙF†9iE€¿ÇqÜ=Uˆ4à°RL“«iTüAF(¦¹«¬Q¬Ucú•¼P„šw­2¡ä…^ïÚj¥X«õóڃµ ­²m_;n‹É&8 °y^nÈeCÙ-)Yr—–Þ×µ4ŠuŸ2õ@>ö•9ÅZõÃÏÉe&h±V›]éÚԟíµúiõ¡®OVͶ—Ÿkon“¹Q!N#jêå† ÄÍ´˜U&æE“HÝKGilWˆóÌ}eN±VÝÆädª¸­.˜f—¾M%8;°o«u½ÒŠ¶ÝìôS´€-³S• ! +}¹!X4¦<ÐK*sœ';×#…øJ1Ў}®T°×Õ(Ö¨{«œa¸w­.˜y§Ô·i”çUy¶ó½^׶§ßÙ"…%FÔ!Q!—³º¾Œõ<ƒ Jôœye¤¨þENl?[¿DNÌ"¯ûCˆX)¹«¥¬-×ü•*Û;Òu_ëÉžÞZË}|¼“Qý£­žmÏzß鷺õ‚ wy:U†l˜ÕYKkÁê ê¦v\ ÆvUŒý1`)Š*Z‘¬={¯R±LÀ«¼"l(íޞÜY¬ŸåÕ¯mû÷]mHžÈƒé-3®’|¹!C6œ-Àh‚ +*Ï0©ô1˜æ+Å9Ühåõ1K_W%X›ÎߔšãÞÕT,Š¿5Yº\'Ý·ùƒþý^Ù¶£ŸIôØè”ÔNVٗk2,:pcC݋ã¢à +èM8“LV…‡/¦î±A]y]M•R›´7<±;»V­E¡tmVŠ½Z¿­=èÝòʶý®$dðÔْúŒŽtiÔɐð.†=j\ ²^I*ÁT€[Ñrÿ¶Ý¸ôu9ÅÚtmÒÈpÖªÑ*CÛ±tÁÞôóçê÷{U›n~7 ”†žz“ˆ¹8ÛÉ0k%ÒÔ¤ˆ\OH¢Œ36,ÌAcë³+ÇþÁÁŒM­2§X«þª‘'e­2¡ˆv»V+ÅçB?¯=è]ðʶ}ýl‡00KA~¿¹¦–šb6£%ƒ¤¢”qíC£˜0k¶EP„3d‚ê*sŠ5êö%ËÐ1?^«l4dªµZ)Ïë÷êçµ­­®MGÛ~ι÷¾}Fÿf©©ÝVÐn@Ü´ªÈnéöÇҀݠñ¬^ẠbUJCuÃ90‰º3&‡f×Ó-ÛB˜FnndíÎØÝ3ÒbâݺÓedž熱–Nå +ç†w„軚ð¡â· ÚEâ2CÃr' ó©pöPniO#*’{6ŁÜ3p°“ô8î ´ZXŒ;/²©Ch(nJÚ`z+7LɆ3÷¨@˱¸‰‚År âh,/}æ(›W ÷É̟Ø< làÄÃõîF5£:næÒá²ONðÛî Ÿ*5Ë'Kwʊ¡‡R7ªA®[E†ÊníõèíöYõ1ÿp«è¤ïq}BE”ÑÀ†tÛɺ½ ‹Žü\‘Ûðyðç¸ 7¸QÅm ƒ—s35Ø6ó‘5ö(øl¨ÈTÔvZ´1Çbc` WmÙò C£*5 9`ÃF8׫zÒÐÚÙ=4H6ÐÒ\UDöug‹Ç†öްؓ}IX#–I•­‰˜Û_‰HÇ?…Ø@ØÑjYA° ÁAB²ñuì50ß5ô+5Ç¥!¯Ñ祯±âM¼^çbìÀp× Z’*ìš)ŠSÚ ®…ù¤‘™Œ t Ã5«˜ë’°‚\Ì?µªB®Û⬐ëÓåzÂÀ»"¦k…¸nTCI3™T®ÎÕL¶B[cSêóÇO0Ì­žFè¡ÏjéV‘¡¨[{=ÚÚ¿Êˆí³­ž“ÞµþÃЗRÚ­µB£Íªîài5ä-ÆZ„\FÖ4ˆµœÏs_ÖëJ­èZ‘£¦­¹5¸Ú¾©ÛG[5'}kÝŒÇî Î/WÔ +…ÆÄ城–ђe®Pհ͍¥{ +D/¯§VøæF5t­Ç€ÒÞX§öOªyOj%Û®µ^#ý“5® Ôjàg èØæúI=`Zˆd˜þXT¯N«È =œ¹Q öÜ*2dtk¯GP·Ïªù‡×Š¶ýk]‡ +~úxº+ÚYö‹æᬀhǘ_uœƧ¡±þ˜ˆBCê0ØNXA˜Õ Î^‘¡½¹2íUª=©•lzvÉÁÿÄ\â+He#W$}GÊe))çxÉ%n•p±snԂlÝÌ o59a…mtjÅ@zE&éí­à”í»*¹}{­ê´“ߍNóIY?.~Hv?úõݳswàï_>ýÕݛçw¯Þ=ýow²ÚãîG?}õîÌãøëÙ¿½¸Óüìõóî¥té¥_½¹ûÃýÝŸþúõßÖ~¸ÈD+¹ô]¼“çïïî¿þý»ËCSŸ}ýÍSÓÛ7¯_½ÿáŸÝýîÝãŸÆðHWïïÞ~HG¯_xG5¨n~¸£ÿtÿÕ»ß_œÙ›'z·ÓÍ«¯ìå'g/{ú¯÷¸ÃUOü›j£eçU!Ê@§¬ê©ŒÁ´dýkuӓÁÍ?ôƧÚdm á·Víê…MNöüY_Çy꺊¿èO4Ëy20;jÄEjÐrÊ8 zy÷T/ïŽëä9Ic¶‘;2zöyPւ¬ñìAä› ܾF{J‚£µ |”œ@ÕoàžX}©¦áØ rM¨X•„F ¯–£BVôèÞÉ5`z”ã]T3:{D¦ó{'2L•ôî ‹]ÏÁp!LL B¡O(ØøÚ@jLPÉQûˆŒ:%”%„©õNo + €ÈE[3x»ž¿”AàósYû&§ú’sZ,€Y‘’ƒyvƒþ<3ô„H³Ú·žçQ_ qQJâ¬$äÔ&ŒÃîՄš…Êၞ>—,<.«²ã\g)éó8ò¶¤Áîè’‡Pù¢ŽßÊ»‹ÈæµFv¯Y3Ìâ±qÒDR˜ºf‰M+•˜g‹?g 2œ”4g•L4ÎjžmÔÔMLíëÞ&íÆ8؄ͣ d†`’bA]p!µW#5á÷æE3¥ÏÌm Ae±VJHt{ ä­9¨ªEÜaõ¦¡OYmècäu t“~\¤Ñ*#{ìÃlqt0³±ívuõõ™ƒÎp(EIKÄì 0+((70z)ˆFO¹M¤…°å c¡$ý‘[³Øæ!eö¦0 ö`âce,*ԉ"ªà`\óHJ +~D¹Š®P[˜û¸6DIˆïÃ=‘Xü3¬3"Û ï'ÐÔ~QÌp§Fföƒ‘kQg-t—/0Á“8h .€ÛeR÷ë„5¨8Ì©{/LLùœÓ¤µÃ+Gä PŠ7ëÏÑÝòðzÏÄtƌñ„'s‘¯[¢¥@?J" +3-u +™)£„ÖÀÂ̅¤§…éV,̬`îǓÔ!ðN2.˜ú–¡ˆ{ÛFKÞÂP±šWŠ>ƒH1^d¶` ru‘ŠøÀ<èž!`†`áYŠ&º›ÄϳÉ`9@ öš(K÷ZÖfôŠŸ×9à9‚ Ì(¦x† CdNŠÎÈmϋòpëÞ¨íå¬+”f¡eä-^+´!ÿÂÏã *6ß L$“ùف&ž£ü"TBÿڐ#+cÎHi‡2 +Åâ/ÁP¯G¥"ÑŒay¨™1eb}3PYSÄ8ÑƈJ+Wš4{é tÒ¨NZ‚HóE–ƒ€ ´ +ãrcf ê‡pÚ¿Ñz¤{ w Ç6nŸsa&ù\@c³á5œ9zJȲ²´p);5åoÐ„u¢®í‰£:•˜‘|QNjå(˜ç"ÓSp"/êÞ+òbW,ÌHè·`H˜ÔÎêl‹g¤ßžf瘸S”UFY¥HœŒñî-5èÜËøǀUL#R™Ç'ꔍ¹8±[`j$àHBítsÇ¢‰I„À¨#onXÌ¡Bc+f`ñar[ýl½í ©ìEœÒÎÉÀê2Û##ŽámŒê¨‹fŸçvß@ÒNÀ`=¨[†g\6~q"AžX)#àƇ{z»¬/JD—§ÿÄT›¸þ@Ȇàí’1z(úÌÄe¤’_0 àk4y +n±Qùµ½'L¯à,*vZÂ×2{‡ÐN•LøTÂóªè¹[Ã=܋É!u¤Œ°[aiêksÆY²èÇ%ñ^´Ù2ð:äqó + õL8À£»ŸeÅÏ|kô£òsÎZ¨™ñˆ!LSå#Í`+ƒî1ÔôáBH6<ögqS÷sÑt‘VôŠ„Û<£Ú@c‘WNÈfUË‘!* Ï>3èó°ðÕ<Ó0;‘½V¦ 2¨xoðË_8ȶa£¬ïQÓ¹*ßÃ,…¨g¥uO>KNf°”3Â"¼ŽÖye:“rlð’;AO7&D¥¤¦·…· 3Ùΐ” ÏTúUü=~ý¼ÔîLz‚,B‚ï„¡ÉëY×2;'KÑdãŠ¦TÀ‡L˜ŠæÄ:T1Ÿ£ÆšœŠ©4ՅJ& +ÁÛ:ñnïÉهÁ¥> }Šä[Ìã-I¡gÕû܍"™\eȋ&暂Þh)‚f•y¨ªòøkD8áxJ°â“^Lüÿ¢ïáÄɃvÏØܨ[…šƒ)ˆÀc °6Û&ìÈ%8›C Äõ èµÊö•…‰àêJ¸ÀÓښìož‚þ˜ÇÙR©© p›C/Kòº(Y$¸í…;|'? Â<k0d„›û{Óò$¬0ÚT3w‚TG%0Ÿ7¢!äù{ 6V¬W€L4Qs価x”ÆhrZôsaÄÅ÷’s,šˆmÀ«Á§t0E䜑‚Œ^ÆAkFà ‡¨1ÃàHýçx㚓…€ƒÊ Š´Ø0 ”š°T–Üú´S53Ÿñ©‰„‰ HPœ8$M$†»ÃB†jŠ9ž¡@ʧÄÓØöØ©ÅÔHÆ[̼1K±r*¶é϶ M¼ò‡LͩրFà<wgTØ6¨Æ3Å­T¡âHª+3Ìͦ9ô"©êóå2'ͨ•Yp”aP0) ¶-ÔP8ê+ ÐA„%^2ù‡ÏßCBTµ?#â“¢œ èÕACŠ Âð,³¡„#s¥«vE“v"SŽ†ºÄ&ãiH‘b+lbЅIôØa´0ДãÍaß!³ l9s5Šõ ™ÆLϵ6·x(Ã@üG!KfYQHq¿Dµìqû×m @$ÞVΏï¤Р¦O€‰ +q»s§ `ÖUÈU¦Õx„“FÜO°~ðj¬Pyt´<^8™••ƒ{">Ï,\X…qaêDÍ´âkS”-ŠZ…k3è¬K1¼xmdn‡ZÚk”Ì(|MøÆA›ª¹‹~dŽzò cÑ*& YÊ\=zÌú‚¨Å¬‰2ŒX8àW©T䦉çÔ¤W/qê8FøZDÒ¦.\VS eËgs+fc¢ `*²*gþš–… }±~‘Ü”C‰ãqÆRÏ*l=¯¦q•ŠêdÀؐYÀ[¥ú™’ç¤:¤Ÿ®º+‘çËRBÃC¤rM{„å\võˆ×ÉûCP)ä4’³C}Ëú3Bê’TVbR³T±Â}©É(6‚wçGŠ.„8¸îìVDÐ%F-2—|⍵ŠØc„¹ ~™ç«êÉȆÀ›0 –CýG2iÍُhOŠ¦ÉnޘJg?yN£&A1^ ¤0¨/+ÔJäÕ  ~Eg„5-ëWyµ‚¶Q¢QÍ3}›°%ք$vqEZ荛ôÈV;g3õótЮ†¢’=Nzê+‘ÞO †¦å i³ã°h0ëÒFÁaxE»Á°0ì =Èqԋ6Æaғ6H{Ó1Z‰wt`‹ÙL5)±LvhÎ]£Ó¨|ÉõñÍÌú½ˆ¿D¤oHŠK¥¼j¯Ó¿˜l’5»S(0=‚G3¦Ìo²«¦ÔRÃÛPŒÌNštâ5&H¤ñFîÝ@ÐðÒÙXÞ¨÷¢à8ˆŒ*6•JÃ@Õ§ÂÌ°£jˆö¹˜‡¨ijÉQ^Dz’ÅíëªG¶­œ;œ>WÈ\¬,d}UøŸ†OÒMÊâ7ÚS}#ˆrRÇó%E“p¢e† Èj&qƒÛdYßǑfÈÅÂ?G¬w‹â¦p6Îêuy^mnÊ&G…J N)Zqu1(£¥à¡%ÔߌeP2­j|pJêsÎjáªY@án.•‹N4Tck1ò‘¡Ð ña¸ï`Öð_žGجÀ,hÙrÛòÊLæ؂鏮{ȂŒØÆ-svÛfÜA3j4j`ÀàhÆr yVãzUjÓ't©7Mf_,æu1Y‹Ç}NFaëë?Òà–©éS-KޘÕy¢é;»½X2ó¢‚v#v4µ,pBy V3Lu´éÊÐ´Ö x€ƒ…'¬Ž`¾ óÛÏ%òæøÅ7öÀBÄLVZhg.õÒਠ+_›ÛêöØ%Y +‘QóÀ.Æp°§Ó2©»†©eµwH>¦5 jvº¦Ò¼ðÊ΅Á¹4 *çlþXÃ@G öqŽ/¦·‘«,Ò'äš>ˆT˜:àMƒ6Ɋì¦Ý0G¦á„±ÛW ScrçA;ÈÕ²˜S!"Y¶êŒI5Ù`ß"ñ?£R'MãÃÄKÒÈç1. +æî³íë[&BÛ¯B8p֟á;c²Ü]ÉØo¿2 Y‰!9¡2 RÛ©U N³¨I–%ð‰Îþ=ñöÎD¤ t °ÑiáUo40Àç@¥·¹c:~†Q7œ*Ÿƒ5$;²pÏ_èý$‘q ¨/i‚°]…€óG~,~?…î­í +r¤Ôæ›Zc¬˜Qʏd؎ ÐXuñ +—- ºQ¤\ÕÛ=)ëk0‰Ä Ô‘ ¢ì(EÊØN•À› †àiA ÷ ÀÖÉz¸ ¢ +slVê‹²÷ðë‰k~ÊLÄÿÄÀ (æãÞÜø¶}À䣢#„ ÀÌ¥ՐóTL^"€:sÓ'7¹€ +Ȉ >äÞ2=eôT¤€Þ/jUooašáÇå9’ªñsô(eN‹ÞkͅgoBÄ&èaÐxPô'½zAvaÒ7áæ«.<€“²>=€š™"ShÁ4׬ú­kÚâlxøF…i>˜Ò¢>_Ú8•ÔÝ;E_h3/€P·*mÁ¬L­0ƒ*el•Y)@i­Â ÂÏ£Z‡Ý«PA0þ¤Yم’}Òjiâ_Ò5®RéÑ ÎÆlŠr±tQ4ˆA(αá^ç}WcÐtªXcËÀ,Q=Èzg[Ðä¤óRBmn “ÑÐt +©“E„àBJöµ@L¨ÏÑ1G +/g„äßÙ©.Ðé àé±êË5YÓKâHØÁ 0íi2ñ·}ã̞g›5֌¸'aw0é)çu—ðVD{gaí½R +¨£4 1T¯jê`ž²¹Ót˜ª¬>)¨w’K +· 3Õü€ð½^ß]e3óÒ.J&mÁ*ÀŠÜÀ¨• bט WC’ ȆÈ((pHJ–Š&¿¢JÈÀbc:´cÕ/ø³ȝ‡­ÎŸá]à ìnñ%0H žOÑV†u´ÿA&Æi¨-8‡ƒ5›Ø'՝G^CO3µàÚÉݍ0J\ ØHý‰"8ðêzPèae,ÔΖAÝÛSÒ‚’˜‘òdªÈär¦c9«ѵzÁÔê† ®  ŽÞ±ÆCæÎsª‰‹­‹BÍXYxgÌߥKp«)’JµM  +¯ µÌ+Ä8É°!)€?Þ»’é†Uß6ÓËéSœ:^!£´ø%&ÌzÔz8òÂ4HÓ)[ÄLáÅ“‹«°k†!ë˜Cž¡`teçZEûuRÿù¼=ÄÿɨÁÊC ³ú¹Dºã9{.OÆ.3ŒmƒÂs— ̈…ë +s,\4—EÍ + çõ&w,׉b½/ +ˆ Àš#“<ð1µ@Ãö‡«~+ÁµEޛ ' œVžI·Šæ³Xè¬ä!zpi+¨¨2Gf!3m¡k”îoy5{,®1Š‰bÓ̜âp½â»£›(£ÚNãÊBÕŒ´Ñ0Ú°öÉH60CŠP:#c†2€Ú !™§0íhó…dÿdÕL­{&ªB®“-ɉ‹– VQКWöT+ü¢oÆ˖Åb¿°{•ü5J]“Y|@ z c$ŒŸ ãìyµFä´äŸ4:%EŸ2aT…ÑR#ɖ»{[ƽÀ¦g$Š‡ ŸF"O}Ü[];£Lœ‡ÖƄþcÝ Pv39£¦E†R;bXõ.Z:"'c +|€ÖÁAÝÖí5‚â ÝÉø¡DBö,o܆ƒZÔí+‘1¢ìô­Â«Âp_#;ù×U;JÀrââí2̒T±@Ø)‘1°^ñ›õÛèq‡hnŽò¢þ3`Y±d§YÁ”Ld +ÿã:K¨àGb˜žÄ¤á>?: KT„Ò§JH´ô©©ƒÙ"³Ü)°•žAGÚ_£ “K¨3 ™8îÃh\MÜüo³‹^xbBõõtȔ¨ˆG”Q6Ë!¶æ:À Õ5óðÏf–Ä6牗M.û/.DåI8±Auú‘ƒ1h¯'Á=b9SŠ„Ó˜6ð2(*MXâŸ‘)›È‹A÷›ö÷¥c7'xàãQ·ûlÿô£e7ú•¿ B$Ԏ¾D¸íàX&°3ê{ØøxŸ¿F€¨Å’·3}ÁÌ)„n"?]ŒMYqX)(¸h79L[΃=:b‚ûݺW/õ†ºD…"Û±X!ˆ{‡+›4OÎ<Ä„E ŠÊ™ƒ‚¤æQe]{/¨åéêyE±‰iY½G¶ÅšnsV Ê&÷‘j @’L@ÉYM4ÉØØ¡*l/Õû笖ÎyÐ3Låðæä:1¨™Hhªÿø™p`œ)LA”g=¥÷{ã3Á;gUÿñ3Õ|‚™=´ûÄSö»Ý0êhÄô’0ÚÒ¢†5͑1›S/3 ̱AŒ%áÅÈëab<,)‹s¡7x¡}ð ,hÁmÌà¡Èí!uÔSOVÅÖævÕ!Ò刍þêW€ùªªÔ`Áۏîǜ)™"×!ÑêÕí602X`iéÜåuùT+;SÏ òŒt·ÀY0Ü;¹h3©ûs6ô¤§Ã\ªÄˆý¦3ëDé•ÔÔ*‰…ƒû^H8`.Í¢áuÍ’£÷³ÁÚÄËoÕçG³°ô‚À%3»ן¹NTŠ¦K¹pYè6«{$t¨±>ŠwÐ2Aeõåïd†€1±Ùë΅›ýàKŒG™ûî~ô›woî_}½ûÁ~ýüù·/ýúÝ3<¼3«—Ü@œˆfQ¥Éàe%+Naª¬•-ÃÄhmÊzÏÒÐÁ‹h‚‹v;­¤ÌÖ‘´¤ öC[óAê¥OÌz?¶ûó˜&œr ˆTÿ*ÅDŽYñ0í9˜h&KÇ¢z—ùÁf ý:Ô÷TçDä 5¯±^ ¼ð–˜Q‘‚t†É5¶Ñ€PÃA6s ¹š1GˆoÞô`™`Ró“k,Ȩ!* c¹¾§\E9¾ŸR <¢„ÙÏ@̓øHÌS¨,Š‡+“hxä’M&íÜqÝY/=_HµLtf+a´¹%VïŘÚ{ôÇ3«bÔ÷ˆ®†K2æil½ š ¡$µ1å4¬(¹Ú¶Á¼Àwq˜5ŒÉ`Q™€ñ2f0Q‡ ¯s ÄËÍ18ññ ê"·èàz)»ê‡Á~öQéÅ®O†gÏêeœ-‹ÝeJ·ϺƒëÀ3¢Ç“§IñkŸÍ1;0d€›ÕߛådÜ1ëÖ1õ¢…–pƒ2yèMê4iáÄŒ_BDDHã\Òÿ¡<B½kkŒ¬ÀÙÇ»1ʎ” ë± {g;Éí5ð€Dˆ±j/ı !ÌÈ+®`²’Šau„ f½+Šà½(+däPÀê&ÄRóÍÓ@ã2·‡pâÂK'҄ú’!µŒpmÆNڙ8ýÈ~4Q“@F „{&;wq½@”C¡uÞ5àÿ¡ —º7!ÓA3Ô$ õú£Â¬ S»4 )Œ€(„5œ$À0à– À@ù^žƒ 'óìíÅ!QL3RŸVÒ5£"äáªá‰?a¥¶©’à3±N¡ ÀÄˁ`:/Q¬6ƒ5þ BáWEå5$À‰9¢a€@ŌCã!b‰ajjKÔ À”›ÙçR°öÌ؊QîNÝðê3²ŸE~¤\ooÑ,‡è M&¸[DïëÍã>v¡4s¥I#eô±<‘ Ü‹blì=£–¤þ‰> ©žèl]–p},~‰1qýÈã5P ¹TaᇸÈp6(:B{¤ïx8×áú›GFæÑdGÿ]VI¯EÊp͝€ÄgÑ)9“îdØÜ5΅­Ó9|»us#<$C5@bÁþ[h7?Ô©ÖþQÅèç&}Kwä¢ÞvpßPÔ3Ïn a~`<¥J̟’ý‚×<Æ|¢"•ùt¢âg8@á¨'3g<•ÖÛ¶ÁXÃь˜R¬>ø‰+@1jÀԇ¢)Gšj¹V$ãö1Ž2*.󀟍×;â˜Á!Kïê‚ÀÝßÀœ©Oa:ÞPÉÍkHšˆËÔLÄÑ¢`cR01ô’´#^`Py«Å±Æ2«¿{R0bÑÕB +ûŠÚ×HéÀ~ê=FÖ¹E¯É&ҞrŽ½1zÚ;´Äˆð‡:BH ýñ­œGŒ×4è}{  Î›°¸¸FõԐ³>§¬o‹4Æ.ŸdάâîyYä¨oª) >ð@R:s\V‡ëHYbѤµó¤÷Q‡©B#,´ÃÏY2qÞÊ¡×LΪ¢ù­Ðè¶n„f\Sx¿=†+™™ÓØA2§@XJØiäÙBw±GuñëR<‘Ï?¿*À¸†O™—Ô³Þt y˜aþc½«Â„2^D _T±MõāFÐs雅¡­ cwªêàמÀ´½À{ƒE¥€VrÑ@c– +îÔ¡½GãX{Ï´ªZ½è'j2#›cƒjÁD}Ò߸¨iŒÑ“ å-5Éiçý4꿇ßvÔk+Óµ8-˜sIcèà‚O<÷%­@»]ƒ,éªÔ©<¤$UGبڀ¥õ#Ð-kڎ@+n/,}s°‹'žšÌºMûÊ¢x‹Ñ®­Õ×pÆ槭ymĂÛ¸ jo5/&ÈvrbÈàÄ Ú'Ú<ü5³X"sEb˜æ¤@¸R4švi+óN´à½h˜„&¨êx?Ó§†ÅC0¸ én @†`BÏðd-LL9+b5š ¹Yc‹ûƒ16¥/‡+Kð]ׂ(ٮꞡ½nēÎÙ wŒÕ´°¼°°£Èõ +<0¶jYC”"1®I¡A$D^-©vYO×j¾lêcåO4Ùκæ›e³šk:IÍE£k1ÏïûT‹­*£®üiÒé&(½„Q-êƒnèiê yhQjIæ¨X"PcP‘pj«XPiåš4†ŠŠú“Þ„ËŠè§Q“¼™ò¢ŠÖ°óëàW±s±XÌd±*Æ«uòԂ‡15B˜—`FWúۡń©Ó—éßÇ*1քúp²Æ¨“öºï “öÉ£àCµúfK{/ºµ2ª-Ùó=ï±ÊA?O#Dé¥Å^{MŒ 5 ¬±ÐӃZC™D<·]C—Z…CjhþlBc0•ŽOÀŸ¬gn·MŽz †Å"²g W( „3ÃØ ‚Ëü´¡Cã 8§'íE`þFFÊc 1Ì6yæÆ$5w^²°`±“E®Ú.Ÿ〴À4ãÄY+©(¨›—ÁÈBNë¯yª†ÍÌݐÔ#Çq\&K¯aoe WI‚f45ƒO´ Á’§ØÔMp5ê†OáØ¢ñ–÷ܙ±7åÞÌŸGø(rº` Ú|; ¸Y Ô¨Oi\t0<åÖ™rN³G µõ²ôɐß_ÁÆ ,,Xn +} 2›Eæ) h´0‡àæHCe³?ù{âg&‡\,õ´4U&°ÀÉīِ̍šìm<Û¾4Æ8ª+S±ð Z€@XÈ<3`ž„‘§˜gÍZ•û;÷ù^4S=º%Æb!åþ‡TlfFÒásPã2'Ç¬)ôÜÐÃX$JÓàʨò#N`fàøªÑÃÐÖAKѲ*GKUÎ@pCƒ?=w`oý4^3›S 1†œ¼ÉRm‘²˜diN8[¯¼§?Pÿa\n UÔj²:«mî«ûØÉYW–`iAœ›¨ëâhö tç~’†¢ª¸Sj¶ÊJ1F‘M ñá³ vSQ$|©º +@¨Òœ-jèaVj⹫ 3Ɓ™ OÌ% -^ qt#Šó.Ǩ^ŠKÙâ%ùL!Èmœm:¨]kÅÉÂÊëÏc1Qi“^b-Oœ»ìÑ×4ÐQ§†–!N;ˆ + Y¦榪Ù1`?Í¥CQRãè¢)ç-[fT—.“‘'ÐÆꏧ¬óç(ed=Ѥ–¨†åۑš2:XôÁ`¬(uÎâ^yZ[SðŠ(6íO?}ŒWE0£*ý ¹á_˜I3ƒ %…RÂ`zs5˄BŒš½ “Ã0v㏨BÜ|P™.tæ»,Î[&Ô¢L>™Qf1 ÑVl:|vÁìo/æÙþ˜Úþj²‡Ÿ&>þȌÇ'÷ÎH·J€ŒÝ üyÍ<ÍEWÓè̌Š}öã°¨ƒ³&?ÆÕ·¬ÙrC¦j¥O} ½¼„♏¡Ú"˜°&>†½g•÷d¦<´´Çø_[³ãgv­²ó% h6C͹¦8Ίv^6­x¹&<†-PÍwœ0ÃöíÒû=Æàَ-:(B„€”h¸­u²ãžÊ4¾¸µ˜hOuƒ¥Ø]e:Ž5sÍtŒœüIj¢ãh¾øu¦czú4áìÿÏÞ»ôܒ$i¹ó–ê?ì! R„_Â#b›FØ4­Öá&„JMVB×Qgª.(ñïÏz/fî¾¾T7ì’ô¤*?Û±âênnöÚc a)ˆ“èøôL»Ž!VȜc¦á{™œc„4"¬˜cDBPù›”c6sºû„SPï7Æ1ÄD™âø(4Çü{¼ái|žI7Æaê}N¸ñiÁÛÎ6F÷$r<Œ6†l³1h´1vbN¬dãд&Øx˜ÿ\㡒¹jŒµB;'Óø‚[5îDcš>ÊИ³ùùLž1ËÕJ™kë˟Å4¾‚"ž1Šã®çœ8cP2²ÓŒá+k˜1µÒ'ËøêŠ=m(c¸×‡ÙröϗgҞ#óLýÆ1FEé¥þŒ&½þ~P¿cü]®aŒ}Xø-„1Ž‹ÚŒál¡ÎbßCÑàã£FÍmà‹qîøB6z1„d¸Ú€³DŸNÀ‹9#‚“¿Á‹5Oªu‘HÔ'ጼ™fœð*ފ‘Æ—Ú}ôr&»˜Syyo0°!)K°‹qûØ v1ÚO!ã½¢‹qÙMˆXJAõa¿6 +r1'qTÙläbYahHFˍyº˜ïÍÓŁÌtÙi”Qwn1V(Õl1@T-YB‹¢he6hñƒòï$síôò%Xüܖy­¼bñm®øñ,´bœ²ÂŠ¡À¬b|‡ŽË¤8¤}Ôã.¤â§éS P1ß!|Éâc2…‹¼aŠA‰ÅZ,(Åç#¢oPŠOãO6Hñiµb@ŠwÀ£lhí6Dñé¨ZŠQòŒ_ +B1þ>DÈBdF€ >1ÕóíN<1¼ +øù+˜˜®r'œx(?hbDؑÖØÐÄ,15ÈĐN¡þ:têÝ—ùZˆ‚K „Ü¥Zê2ˆ÷N%F ‹pÌ +\„¡ÇÌ$&þ¾Ä»žÑœ‘˜™è+$î]âGÜø&´ç üz{ @xh&N|0ô½¿Ñƒqøì +Òdʦîè`í’Œ[Ô'7øàð·Qƒé!‘Ð`¨7›zYª&¯s±°!ƒþż‘Ä`$Dú˜ÀàGœ¦líwà‚Qԓ\­#Ü&^äTñP̍Z¤`ºõ» (øÒ•œà!‚db‚ãïƀ?Š ÿ þ*}¥\íØÄ&^; 8ÿ^ùÀa <0*œpܤû•ÛàÀóØ=ÙÀ@ À¡ 4ðÁå´¾Þ©¼L%T ®zM4ðA‘[»w40¾W±¬Íþ?+z­áÀ ˆKÛáÀ(‡¥Ì%ØÀðÃڕh`¦Ïs') 1¾ÁÀ¯÷†ccr¹ooX`´H[±¿jtr•äþê‡Ì¥çú z‰çræ"Á¿Ú+ +ü‹íä ð/z©q¾ÝÁ¿43Þ%$FÙ#Ù¯þ-,<ëø"Ç”_ï‰%ÚõLî/-w¹ß¸¿8`= ï5÷WØVSӔ ¡Ò£Ž7î/Qðí~’û‹=yÁý%Êö*íûK3Û÷ÿq_cbù£7ì¯h¿­Mì//𾟉ýå?ÿÓd„UÔè¶>±¿L‚ñ% ì/ytö™*±†ýŽ:؏9°¿z æØ°¿ÌÐÕ1©¿ÄÌbÔ_¶x˜è\©¿ø…ûd›ASqJ‘AýåAûØ©¿¥V0¨¿TiU·ÆV‹º­§¾Q¹+‹*‚†ÉßàëÔ_XÊú¡¤þ’–Ëú‹°¨âÌAýe|qœoÐ_&êô]™úËð‘PÔ¦þ>¯ÿgCœú LE;“ù þd-×Dþ¢;Ot#þÂÊTY¹Ù8'ïz‡ý>nБ¬_½TDbÜ/.„SΎû}Aû}Š Š ûENBe%+ë±Èê0¦Üoên&é×z¾~o¬9'å÷¶Ë”_fM®çñ‹úõs”‰øelNáÆ1|¤®ú†øåU×£LÆ/?Èl"×ùÜ¿j2 øEŒù~ñ7À9+ß6TÑÞG dº/)¨ˆ(¯pßB5À1î«À¼Sjixi¸Ó}9¨ ·qTS)rî‘t_Þ- èݗ1|•‚îKc°^NрòF÷Uþ§_I÷U‚&`¾Ý)Ðg7º/N›Ý ‚îË*#’Ý—rKG4á¾ìNQU§T1 +;ðٙîËû‚ÁïK+< ã}™µG°;ð¾00u±á}a *ðP­û%ºlà}i`öaÅûR¹y#ñ¾ì ø¾M°¾Úù¾Òr‚ä`ð+7cI¨ù¾¥:Y²~aåš#¿’|j³K£4š´l|_émߗ„ƒïKôà#¹ØÅüªƒ€¾àm<Æ  ð ++‡ð[Ènm-¿4`ìÝ¿²ÞO~y V_šð éûá—=,°` ¯ÊBPÓ.Â/{ÃVI'áWÍÔΞ„_ô!┄ßBF¦¨¼“ðK¡÷s•Dü–n貿ü›ï÷Šø¥µ×$üJ/^•Gl¾ø#üJ ^”î ’„mF’ð+í÷qï„_úgÕÐ'±*š(ÐÝ Æ/êHwÛ¿0—f¢/¿°xú2㗖ÈwNÆoÉþFüòX‘Õ" ¨a&ð6Ä/.TÎX ~9YӃÄ/< Ö_nˆ_j³8‹D[¬pÔÀք_܌‹6Â/DúF›ð‹wì휄ßrz‰µ~Y$DW0¿ì½¦D± ¿tÞÕ2`!ü–HÃ'ᗖËúx™>ºý˒ã,¾çð+®D9“ð‹÷5ñ_AøÕkpðK+^ã üâèOò—„_8qm„_&ðo!VDÐ9Œ›¯ £ï„_üy»AøåWr´übò8®±ñ}™é;¯‘|_¦IKIx/F¨[؉øÅpç<' á~ð;0ømçûÂxÄ{kfxD÷…èNæ +÷eWB…‘ÊCú £‘·ÁŸ-6²ï¸2¡@¦ãe8¯™½è,ÌÌÆÂõ%$÷~¡#ûâyÏø{Åú¦ÍXßÛÓsðzÁ°Åòv£ú^§¢Ô¹‘IÓÁô¿W¤oÚLô}ÿ5‹‰¾÷¡þ£ Ï÷ö<ßûÐÐ8_ü›ºÑ|±—ç¦ùÞÖºÌ÷>ô&o,ßË Žå{Y$_ Ø@¾¤ºö–_þ-à!#Xˆw#í°Q|aÄ{_ü—&¾Šò»"|¯ÃÉQ#|/·¦ ‚/Ãâµì_döpîÁïÅ'ˆòà÷^ÑøaÅ÷Ë5ÚTHë¤>Þ;ª„ñ+»—6QŽ™ÍÆ>¤AšÜ šÒ©Þv)Åw¬3¹½È¯"#.l/˜cÀ.mÔ^jQÏkh/2Æjs(fïå¥å†ìeï[VàŠØ;¼N +`/ÎÔû×˓Ó̸ÞáUcÐz‰`ƒj…õ²Ú /§Y½¬‰ƒRɨÞy…Ô›ÝK ꍎâG~Ýæô‚î0½W€Þß…Â#ï配 ØèáÂ+½$Š!Ù¶zE9|‚Ï‹?k“Åç½­¬Øð¼0>¢ñÏ u?â÷AçnÃêçEÝÄÁ«›«W6îpõtü½’yÓf0/h9ƒ š”ÄsÁ²ay³v‚Ê‹ešÓZAJWú+•VµPLŒB”óN*/W+œþW*/‘SlÔ~ÈêSy¹éþ+•“CÅAå…GZÅqdY%VÑxø“Ë.xÅÁäå9ÚJõÑð/nStgÁ|ŒSw€Ý 5 )Š®¶3yåaÔ;™¼0p¸ &/ lv°2yé¦ñäÍä%ˆt0y?8*ŸÓ‡ùc2y¬CQÄÆ䥕YD3y«W"x˜c9èÊäeܲ™`ò’›ÁËÉût½’—ÎÕ ys…µ¬ˆ°‘‚²!yÕSž‘¼4à´{†‡Âš}‹šýH^Åïü­jû98LlD^F°ð~‘—1¬Ý‚ÈË æ’È›®¥‰¼|!-jY€>1g+‘wµV÷Æ`>ˆ¼¤d`ðڈ¼TÙw_…ï ¹\Iä +¤>;‘—ÊGjÊT~3ÐD^gpp½\[¨‹ÞÛà颪® §û .|ܙ)`º,“¯·ÂtaÄ°,]Ö==QºÐ`#Ø·’t)Ö>Ïé>¡GÇ%G—‰Ã‚­KAMáÆè¢Ö °«¢‹úÅÞ&E÷1L1 ºãÈCY ½&Ë.b·Wô¬Zw†.­·šØ ZB´iy’¡ËP:ÜÛ ¢ËVéˆ5Dó>Ã~Ñ¥q¾¢;6¢ câË)Š.‹ìØ(ºpuâåPÆ ž;AÑÍ|ñFÑ¥‡ÆÞJ×,äŒÝžÝ Š}cŒîã\×NÑEÈ÷0˜ Ã""¾Q¼Á5Ñc¥ÑNÐE-Áánhª‹{¢Å—ù¹ØÉœ ŸËÊÍ&ÿ›ôÜ'¸ÅelŽ1ö ž«Êˆ^— Ñ· ¯|Òsg¢iÅç҇§® ð¹\1±Ðô\F ‡Kë&—qÃq¹pÀÁ»©" #„ܑóbÂsUt×OIÏ¥…=|7z.÷`Yé¹¼pL7¦çæß=—áddàƒž«zæëIz.“j,­X鹌À³uà¼C¢Õ çÒ]ÆÚè¹t´ M z.’¬Ã +ñaaåFÏåYµ–ð\Û ¤ð\Ö-`”Ý๴òk7<—Ž6†çr¤CáÄÏ¥ˆsx. _iÀsa À~£çryÚˆà`֓Ïå°q+G5ñ¹\®âÞ>o9kŸ«Ìg}v|.AèÅø\¥áKI~.’n6~.i)]‚•À"nü\%4šM~.E¨ö +~. M¼\µÇ>…ï]ñ¹Hð鞟KP ÏżM>ú 6·|.ó€Œ9?úyÙº š1“ž›ÁÙÀ¼]äaø²l]X;)£肿D"ºH1µtI€ÃÚ5º0ÐÍ ‚. P¸n]2‘ºÂ՜IJ~.÷bÙÏÊÏ-§}»àç¢,˜‹’àçªüFÏe6­È¦’‘çÜå8¨CB¾¿ÑsaՏ™ž[jOÒsi@8f£çÂÚñÀƒžËÍxLÏ呋ðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ…*êÚv€.’ºôÔr³êPt§aè¦5º… 4¸Iè拹!t™}&A—×È£A—鵪ү)¤K»`è2¹†uM0t™!C ycèòµÇš– ]s#e†.ÿ+Ñ ¢K¼\é€è2Y¨î«±€Gh_áÑ%ªñ(R”\úTÔÎ< ºü¸œç^;‰tz†èâρôb@ta¸Xš¥Ê°2S]Üǖ/¨/OU*×]怙¶Š.”w¬Ü)ºxà’E—D„KdIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±ßƪòEƒüu¼Ñ……1±£Kߔ)Zct »N;ªÀèŠÃv¬+º‚HŸvŠ.” +EÊŽ‰Ñ%ü¡º5ûÄè2<ÌÊîÀèÒ¡{>.?^ùŠÑåÊç˜ÆÇ"…„è¦acèN«±FhStù~ðÍÿ«Öh‘ã±tUœ_  gŸ«µàç6;>w(–‘ôÜ!5yÂsoù;;÷e¼DÊôVIt’sïhW¹‚sor‘—}.V]5×Z֝š{;bj.š©ˆöâ~RÕ©€•™ 9ò»fæ"¼†hgÀh«_1Fø€ÌE,𸗋zÌÖ-zt¥¥ËÅßÊH –‹¿Qg¶±rIF§=£r¡¸Çë“gç&å)—ùxÔ¢)AMÎbz½øð#[8¹ÐZ¥Á¶=ü’Û®¯„\øHþ —=ùŽ–|\ÀæÞñ¸Íz‰¤ãBþŽ0nքÀ€ÃDž3V°q››$·5©²v4n{¨“%IZDÕãA:œm0V,n,¬1—¡¶§%A®‘W&.â}qQu£ùYJšaÁØÆő‚)ãp±ÅЦá*–òì0ÜÓb­`ážnL(Ü3&¢…„ ½ £÷áB€XppáQâãÜ0¸»2×f +.tÏdà¢Fkæ ‹<}í Àş qÿûà-Üø·éT·¹cÑ&úuŽ+è·P•Uáa'ü‰b”`ßâ&ð;r4ÁÊ¢¾„s±‹ŸP–L0ÞïäÞ#6ìípˆ ÞFmu@o‡a +ó–]-ZOämȚxÛ\Õ½o¡D¬baJ +ÆMgÞ-â¾t7Ü-åIÚíéÖR»=-ÁÜX·0"f¨[ð:à­é¿TL¾Mç¼»¬ 8·ð¹à×æaý rK}´f܂ƒ‚ïȈ[ܼ_áFvM1à„L„íƒoۜxÙø¶¬ ¼-þFÈx[ü‰ ÃF·Å-³pÛ6¬“0´¥s°¡mQÅz8••4«Šl‹+|ŠזÅØ_ÑF!€ Ú"i:®i[í Ó#¸H[ü,ôF´­]‹¿Úv¿@âٞ€Þp¶È°¸¤Ì4öBnÀl©c¸Ïe{¢Ùѳê s'¼È Ù"ò„èÃF²}Xv_&ȶ+ä–ÛK½vŒí©ðzRl‹çTCloé¥7†­êJ"lo¾Í“`{“”ñ°{‚ð{óko•,˜^{K3ôÆ®•ì'ѵ—Å:&×V×GíäÚ!ÞH‚k-‹Mn-EÌïØZ†3ú¤ÖjfIf-2®e¼1kó~d-Þ[¶‡0±–zŸö¬mòr‚W[={®–µÐgßiµÐŒ+YµX{O¨Ú¡Z“7Tíëôž¤Ú“±Ä Z­{zÝAµS`½gP-•îà-¥ËÁÒ`9 “TËlÿ)«áýåõß4¤®ñ·÷¾1¦^^ê&©Â¼Bª nUpj‘L£tÅÔbe+(µ¨‡;ÚÓõˆ£Ô#½¨Y + Ö¡_úç¹ú8‚>-2–ùž–œ–Ñw:íéÏNP…1 ³Àª8_6Ñ´wÉÔ,X{ó>¨À, ,ï7.-Œ—³œ'ðwQ®[@xUw"gòÉëS·–¨‡£aâ@ßì4®2ØÓñ´Kž:ÏÅ\9*äV=²(©ƒ@ ;#ÁÒʲ+ŦÅu0¸ Ö¼ìŸj‚‰øM° +`³TÊ°"‚üQ‡dJQñˆ¡Ï`·â” €­ÄU*òS$°ÚK½°ªG?Â,ðbg{$lÐÖºqµ¡õ5‰±ìÏÄå+`J¹øR']«K¢­¦,¼‡ÇSNË"Û¹Ÿ 1XpՊ#Aá WJüIög„eDœzŠ5ý$ ©øÐÙ­ëps1.ªêå=3S•0lÏ®–Ðþ +t3¤½…EªbDÜï@|¡ã„ZãQÑY‚N¡ÓÝÑôvmn#¸ó—{—ãم.«ó{ o–’g o‘]9#‹ÂJø’`©·ž\I&>_.Ôñàý¨¼<ߍƶwÕô‰¶‹ÆåvMm®ñ‘EÉ3[\?ìÜíbøxXǧ¸$IDJF/Òr]ڐñf ¯,,™Í+ÍO0Ó§¨AH ÆÊÒd|ˆ´dùÇ: +ÂÌdÁìøSç€I†4¨ç(7ƒ¥å̍ZOÝeƋ=Dæ‘¸vãôòhÂâ<“#66\˜èIÈ=8æí(Þ[<5¡®‚¤¬Žù1Š<ôèµ(F˜ïBÀ3þå—ë6™YܪÓçã¸ïËåjö3ás.‡Žax¤«Ø,¥T—Õ顨< °°~1Zˆ¢À X'‚À…dc®Zûc-¨ä§¯€Mæ +£gq¥(FÐK丙ø|e\iKg’rÓÛ5ãߧ×)vY—OC %¥bÑ^vsXgÔՊe:¨H*ìÒ<¢ë'Ì£ŒÀa!ˆ +ƒ¼]ôWOFè˜ €…•r ƒÐ_ƒ…þqo/vêW.ċúu ¿óZª°Îþ`êƒc‹ý®Ó \rCm%³°0*›b +ßp¥yZ$Œ²´Ã­NÔČ]⪻™±¨²5I®}‡_Ôfâ5NÒôÍR8pלæÉÖ¼tDÙ ¢&XX&Çm¨ªFUÑu¥lɎf áêù +œæ¯.–[Ô¾ô¥Y”ÀŠ³h—TÍ÷h4ŽÂ6¼ÙäN¹Ûˆf5èOÁ«ŽØÙ·²Æ ÜÁ.Rî©å6Ö¼åў\Á"Ø›Øßz6œ”}©·e=ì¯Bê-5ûãjખ\^Nù΁Kßó­ä6-\‡_·ÀCÚ¬ff†«å®º "âý†ª?Ù èV#Xõ ƒåœë†+ ºÞzEï t㆓^ŸcÉ!ö_¶®Þ3¡ÓÇK¶qõŠ‡5ÞÈYV€CÚ}j¤RÏÓË¡Ò¤_Õ|E*•‡øя—¼$c™'›JRçÙè™²»è®s;/ Ç÷CAîJ•bèó»é%¼×ç•n‚a֏½ú¾Ê!Ýfs³Ë:p}Þ]C(ÓbPŠ¹5°-Nˆu%eç†h§ÈÉòŠ÷ñȖ¶«›Ò¶r>Q[ÑísP9J€EBãäWŽôWÅ(x ‘eȐéÌ i‰àX orWÑEÌiÂò©G+^)u¹cܵVð®á1REs¸dW še‹”û±ÌÝpÝ^jњ¢ì…À+zú + â-)}‰9#Ê…ù4ýPZaø„º]x½»5L›¢íª,DðX¢BYÝå]‡ÇLj¤”™ò|žEZšÊʽgš]JÈ8/£ hÍÀ”´ r#mñ‹~ÞÜÐ+4úY¤LN‹1Þ3¬§ Ýdò'ðõsåœo/Ð0ð:üL/)iÔ´Y^È4’¹),ÉÞµsÒ\È[7áµ£÷På„ï€*_Xúdõ¨ª‹‡{Ü=K½ºñ ˜(€…k<Ñ9 +‚ÂFGÊý[En'÷˜åŠ¿Ûî²»Ïñ2¨H Ò8}j·[Û4.=X(Âtâ±Á7Z‹X"_=NÄÓâ]©bç®=cqñ¼_*3¥…<ԎRӇ]®"Ýe~jEŇ¢‡1ð}{ +¿Ríz¹é7è8¹l¡€Z ±îe±& Ô/ƒ·Þ¦"NÀ£`U)$†CO ‡ª`WŇPïȘBþ¶À0õòºÙ)ßE²T±k´úcöȊU?h‚vVmƒpcËEí…`dú+WfOé0 vï¹¥ÌÌ=YWRéª3k' §»¬ùƒe̞a„¼àá!ÓÀ„ Åè·S 8Ãy³¥Æ­+Å 8µ'Ëpù8«ï=&vê=šâ¿Œ“Ì@$_”ÃpqµVÊios8-Ë9?n˜/fnUóX +«ßœ˜Šë·ö¬ù±ÙޏãôDŸ³\wøŽUŒ¡ÒeVCæ˜çâ‹A"3@Ç)$þImž€¬yrüCÄÂè®Q•-Á¿?´D¤atwB.Aï¢ùnÚNhë¾´!ãڕïjK]¾2Âãx¯jyœÑéjÍd)Þia„ŽSeã~¢vÔQBÇoI4 +îÇc?‹‹+#¨œ=&œ*‘d`µú‹·ú¶,”/ Üfö#׌žÖíºJYsՆì?ÃmØU-@gÌBy®°žh±ÁΣÕ·&ž¢GøÊ ÷3}¼žCMÐ:»¸_žÓàQâ7g«@9g@ýÜ¥½C ‹jÚ`I11Ìú8o‰x*éMÇÊߤ3ÉÝÈÉ¢t.´(ªÄ«Ú]ÛS‰ÀýF؉ƒ5†¼c +Ìú÷#z«žûs$F–Ga–ЪAºI÷Äcé‹iø>|}ê€k´M¨ŒüÂgåv¶0ð ¹ÜU òP­ÄnVə _úÑ})±,30ô\™¿Þl-3Xñu((ÅNƒ°H–>ÂA„€á‹k¨TÒz‘莡GÎÅüïËÝ{`áœÇM®ë™{Õ2V›pÎPÖu¨íˆìáX–LØÕ}¨šf4<ÔäaKrAæ‹îò{@n§@>s½'‡ÔƒÂ‘Œ?,rD Vê;6¼zÜ Gß-z*-=„èÏä$ÿ‚YRB¥Qc8LõƒEpȕҟ€Yüᚠ¥áZŸ2—Æ*ðqè‰z×ÓJ?hìç"ìׁ~EÙn“BÂ`ŸË|Ϲ݃ÁKõ§„ ’@¼´¦‹‰.Kò‰p¢^Óà›Ûœ ˜Û¹îÏN…ƒiah>ñ ÓÜ=ž.ç7ì 3¦³ç½$ª•k­²>ÖEȃ¯¸pƼ}÷Ïg 3Ýî̌Ðõðv’b«DT÷m!ª,¥¿AÎeðÉÐfâsAäAi˜psõ¤pr.ê\ñZ|¾,I£¶€6ôD‰Ó‚µQÿT #B +•¡vhŠ0m”˼çÂĄ´²Q´¶S?ÉUk:]UBáX=‘UèMʸÒbt6˜É=²cèúŽoʸLHíl«úÉC µ˜â`õò À;t×üV‡@4?˜Ž>LÁŒÉ Åê`ië®nlÐÔ‰ iJÒ µ. +a³J–5Á:Ü¡¨7GÓØțQ²’³v>Š‹o_ª"0{C/þh¡v'ƊvöŠI OÏ¡,%ñ8çø kßÇ3©?gî9¢íÒ-´`iNÀèå]U–ûë¦ì›^/½ J»Ñ)ˀ])³\§:쨩Rñ¼¿„¯RÞbFvZ<¤t÷ÑÉ Ÿ@ݐnvYÅCý ñ\çÅÄcÜO£Qs+¥fÎÆY˜ùsÏfü®X Sr{£D9§n“ã:Vôóòs¹ìŖý›VCuLJŒØüX¥Ê¾3ÃÎÌfÝBáËx£:ÓÜ)Á©Ã\ߎ¢]ë„JœqÙr-*‘9„mK4†å!fÛôE¶¥Þ5œ+XPÿÃP0ƒB%¤¹Ø±¤æšþ;ùžŒÌ“JFÉÛd88”×I5&´Ô-b%É»Íð2±â.¸g-ºÄÓ̜7+ûf,ò`hQð´¸Àà}zÐp'©îiz·h`5BõűÃßiB?óGw§êGtŒT ‚ Xý}ðÅ>§ŸöÇä23Ê©Èö{ýcš©`Ã"8?aUQs˜“ 2’K]b§(ž¥]\;EÀuj‰§w\í¹é6;Mœç’ØûˆŠqnáææB'æ*wî®083 +Û­E9÷(l·¬öŒ¦’ø ª`Q®L)h Å,ãXb©šúXÍ]ä*²¥8»VƒRbÅøÌk Ÿ::3덭z«©<©,Á=•®ãª#_§'$œ¹h¡ •â‡{ÄQwÓ®¹«<ÁÀ)QfÌn+Í5t´‹µþ>".m萝Q°í”ÞŸ+)ŒÃ±–×T‹ ÐHÓá•2¡yôìÊd§ùÇx3à ¡r`ÕK¬­9¶2p(ÚtR)AT KÁ¹«Ízͬd&²b“; + ØÏ¡ ®SÊ,É„aÒ9'צ[Àæ¦ÃZN +G»ÓÔ­R‘S«°#[#õâOZâS¹C‰ä/‡RññP֕‹&­«áœQkaÑTz9HÉɤ¦73§ÒÞ}ø ¾£½‡Ó dXfžò¸„ùJêA öa‹‚>¬@%(5/Ý¥zºPhôª‡Eê°~¢í41ÿA'‹½3=˜Y$~Eÿ>ä8)gº\±‹:»6¡-sOéA®hˆu…º»Vç/)dæԘc¥¢"ùæiºEzVDúã +¯B³v|©·Ê½¹8ãúg¸Ö˜u š|ªjVðԖ¥̨³„YJ|X[¤– QŽˆÒ†š¯à0î’æ󔪎ÂûmWõWæá§VwÏ*ÀG?f=Oµèrh‰þ$Ÿc¤_…4“EÐS«r©v_¡†"(“OºÌ×e<îè˜D¡ðMj*ë^Ã¥nTî©cÉ°Â$u¾CÅ.Pq\žG +3'.†<6šéÞ3k+ÆD=Mekâbi×,瀯)YôðoÀ풴Ÿê˜ôî·Î¸æ7ÆNÓ{a¯o`E ú1Ì·Ššžðô.-³iÝU(êþ,Ú/Æ'»ý6µ‡eDpût uݬ;gAé3|ö̉ðWe”x3beÎ6,vl†Z˜Ïí¬g͛ֆ‘hê}÷9v$åLU|¹tÑt¸˜ÄL€ðÁ +7ûœáƒ7à’TŸ'w•Ç–*§‘Zû÷]§U‹EW´œ +Å»´¨¸ò©¨—u.H]%x9[‚Æ Çu#Ó*aaÅd(}±§¸*HÊqÕS,¹bªöñ#½T2e€}>R.ÑY4FÇávˆ´œ~Èp×{”¹+yd4S ÃjrÖä€Å®m®ãÜî mbÒ;ԅõðŽŒÆ8ŽÓ]RÖCñ^‘•Òlež< +ug˜Ôq†:–=ûpÅGÓ[ÿ¸K.,\@nº CΟ\¢s®éøŠ˜u çë$0¶(ÚjÌç\³+r8\Ýi +Á§@NkÙÁñFyFî*Šš`)o#ñ|aƒj¢Äc@p&$š; +Ṉ̃u ë]GˆtºÅo—9x¹ TmæO|0p’G\’=å›[ÀrÍw¾¹M+n’VTՍK©«VVë‘F—¥ÈG^¡T“sAјé0ä£ú”Ên!óo§®®pb3d‘X¨ürE”чKTìÙOoª’U^UYÈÐ(ƞì(Vâ4~šËQØ"/Õ"’‰Ä· ä—°Ñ<v¶ÅdËhoî*j>œia¡s”Ô'aWŠ-a9îüÕÛÂ`$#p‹ÎNJbô-„{…ü¯ê»¯¡T—î.“ª—äíêFDaNÍ¢3,Û¹p‚Ûqe<UúÑ®ªg¨ìurQ– ³BôOrì¼¥žÛñŽt¥xpJ€'4½çéb oL‘B*‰°$æâïÛ´~ïÖ(Åº‰®8ØEHŽÕ^BQ–*-ª$Ê Öæ7z›²XPœËæ4?&W6²dTöQ=»ß\¦ñڙÙðn9 ø÷Ø¡ôíÒJä}ÃR½Êœ+£ìä;c`ߟ¢zÑC»IH¿³üŠ_F”þ2z]‡õ|FÔÁÂÁª¯£ÊN°§[c)·¦NE2à Ép¦ás¼ +’0»Z¤ûtnñgFúÿcDÞ ,‹4"7`2g‘…Üña´õlϼRRÑHR¾u‡4 CAñh”(Òkø½Ï UΟJrܐț°î·úKQc)D”s­C$’ Ô±A¯Ju# +GyÔUÏ#ŸÅ£ßã¦\—Ç„Ã%:ð%AÄkÜòÅúôŚ[ÐÁ|êŽý¨¨Zh’ºJ£Sž¥@Gd”þžÄ¥·ð÷BÊP"·É¾ôt…™Ñç$HWÐÝâpñ¬/¤PSéìKáçðÈe.VûPÒÔ,¾ÓCmñ¢]`+TJñ «S^´P'P]Æ])-«}ALÐÌG !Æ|< Ž¡5¾BÖ +O×RJ +Sh7× ÿ>ªž·V-ՒÈy±Îɛ׍#K)ürÛ¸LDì™tn*ݚ%¶´ÌÀáñ,fªw*ïM¸aZÐÒ¦gLwš‡‹Î!*R_èµü°"øö‹’pùˆâ¼è*eW¢Sµ8"W€AÈþ(X2³ Õ9uئ䚵vk¸â$=ÜhG$ã\C4 +)ž8´®'ÀùÝKu¾Tæ³"£zäDú§2´Qb‹Æ¹k´ŠßÅ9µ 8óG™‘*¦C!7º*˜.•e(ë è%¬Î Aôî=ÑÄU^)ˆÅ2=PØ ›1;7Ïõ¶2_÷1{8öž!þa¢ ­ž‰!‹ÂÕ>¬ýV„¡êƒqïb‚,,‡ÊÜ°—9ëùêZ +0”Ÿ+Q²Z™áD°è5Ñ +fo֊w ‘Ìt‘F@좸Ï7á…ZYª¥†9Â3Ã/TX"ÝÝ؍©æ™/ÿ§ª7RªÅ\ÊÀúEcÃøóÒíž>›Dþ¦ªBU<|3*EŸ.&Õ½þ}Ä5’¯&D7ÀèeC…-<áêډÜU”x,fB@ D@=ýrš +ÕjIÊ8ãQ_´©Nü¢òŽrQj^óæðe9ÛýuàóºLz¸'DLY…Ãß?jfpe­åVAµ°OĦŒÒ´ˆ˜Ð¶ú˜©Ã!ãÖu³ä•ÀóX—² 896ÙՅ†É)Õq/MZ\|FY“‡úÏñPUׅ/J`ˆ*‘Rwx™rÑ{]÷ +Ò29k̸ÄN}1E,Ý›yTÅNf,õf‚ª²–IxHÚej -˛Tý¬¹Zoâûè9Ñ šhÎ]èJ»{p ’ýMˆâ¡¸r^³Š™ûF-b×ã'Ft[é^mr“‡É÷[§5÷¼ì@,~A€“P„ÏÊeZf¯—Ë]£À»+ÝR‚Tºs·ÜƒŸU7ÚÓÏ4:÷²Â³ ¥uÞ:W¾¥¥‚s`V™ 6‹Úì>,/bµóõΦ w×È=UV +³J؆@/ÃùLÔ~âR Æ{^FÆ@X£†“£Èä«LTmaágŠ’µ¬®Øâ†Ãi’îZm~ñãZSȨ2Ç3c- 8]*³ø¡S7x)o‘»vo§’þ}mÐÁJ?Éb)ò´Æœ ›1dÕ-Qº¨´Fˆ¬q ìÆ´hWÄ´T zY÷T\.ÛGnE Lwd-weo‹,]•vê”Å¥ÚM}ð ã]~ô2>Zo¼º r®‡<ìñÖSklŸª9áÁî[ìDvØAè-JЋe˜Ïø[©0aswsÅùÅbü§¼c^舆^EôWŒ8Ô?1I_¢vwÝ©}ªb銮®œkNin„8«.^Œôez‚6±ÊíQñ:9¹”É°ác¤ _sZÃ<͎Ô-Òuœ¹] Íˆ¯,ª;-çZu¬~\ÏD¢âNBbú¡Yóz$¯SZ‹0ÝÔÂ/aE]’º†Ý;ê-D%9øSœ k5áÐZ‰"z²:Œiý9³Šª °¢ä-äfä) Øƒ¾,£Ç—]ØéÌ!z|»Ý¹jQ=îªêW{Xë)PKu ª+_ƒY÷a)ñGX®PfêŒË«ÌómƒŒŽ§¸A¤Mâ;BcÝÅ/ñtrLiµP oÐÛgS´¦T›æMX&t`:M0%¦)ÜÝ ¥Bû²‚ÃoHꁰN + [Ê~Ñpœª&¤½È¤Cç̔.1i<Ì}¼=BVŽÆ—")yDn´¤'„¸´²ùÞ PbÝ!y3ö8vÇeIæZ9ˆ?G”=~çw€…EôX¦O‚–¥Åúva쑷åÒÂá ‡O‰ oµ!^ãrIi‡¢AlÚ;ZLÞƉˆî¾lÇnâx' ùPf ,º-{Ž¨Õ‹^a·ý¥„YÌu: û™·rsC¦N%tξþ},2Á4ó‚9õA­~ñäš}À»YQôÔ5ï~G7/˜QqA uOUü…ržÝŸ6ˆ—ñôá Å»{ܦ…¿z•Åâ]/M`Æâ™=âÓÕÌPÅᙼÐkû¸8…‘gR­ˆ©.:Y…¼ñFs#Ö>'y†–Y_缏5áïf©¤60Ì/›xS*ELyG©„å‘Wj§Ûš3GfÂ3zîÈ;\f– s=þÔ+›M¤‚¹¾1èÒeœ¤p³ +«ð)Vé<ÎLúW‹éÇnwíN^”ªcÉ]}\!ž{J;€”k|ÃѹawÑda± ûa%Í[ÙþÝtU ÜBXŠ¤ñdŸfž™â±“͗WoW‘¬<ÙÚ£¨$ÂcY ³C"’{é!ˆáv§Q©ê®ÑŽ+÷¤+3ÅÞ´¿‰¦[Y`Ǻóö–'ráý0­è©d°˜›¾b )iñ•ˆX¶ÎíðÕâö²Ü’>p´‹‡”ËìÚܳV®«j†¡ÚÇYÓƲ‡Þu{/îéæ,š´X†Ê&–H.…·f³ö¼YÁ^5´Ð#ëlÞ&We (ùî2Cɸ"ÕuVñ\J.%8a,îx™1Ʋ=¶¬†ÿ¬QÜvÞS®DóáÄ[¡OpÕæR‚² .Ï¢ãbŒ`Bb°²ⶠ¯ Ðޱڗ8\~LùâìVs›¸I%é IþšS6' æ¾o+’Hgªž³ý- >‚ųº¤>KØ©…hzu•î‹„\Uç8G\jŽ(®¦Ï²w³—JéfàÓ·ú:’£‡ðÈQ–'pmù’÷¹Ïõ9öqyèKÐs'ïï‘æ7¤yNìDsDßXo@sÎkâËÙwQ” gÞç~ƒf|¿Žn˜9dò37–9*Sï&G(óh5–$s,÷(RÞ@æ(ÄvÔóê^ى1‡ƒÏ†1ç~E•8 øáðW"ËouÅ{âïö$;æ71ðs´¾›æ‘É/ŽC‰/ïN‚$¾¼[5·Ó˧ÕðòÉ.þ‘L ]$ü±D—÷ͬ¿éÖ1ìèrf< æP‚0‚ª´M.?cJ^Éåð +®í`: ]É?ÆyYîÐ¥qJRÁYÐÀ–£nœùü –S[Qï7h9»ñ÷d–£³^mA,ç_cç•Óö<WŽcÔûœ´òÓRÃV~ö€Ó˜UŽ°–:+šUŽÅãe²Ã„ô2/ÝË$•SþT>T’¹cÊÑǨ™'¹÷²o”ŒrÌâ‡páÓ ã\KÁ6“Ë„Q~ù3Ù åWPqPŽºËëñŠÜ ÑϏè(“ž":å¢M'ÊuÂɯnvÌÆ&GK ÃÔ{FX^Ë!§%™< ;˜Ë ùyæ’?î XòG­JN±O3oÿƒ?Ídh$[÷ Þ‰ä÷ð€@r`4†}[òÈ/«$wùs«F/i䬴ã”4rv!Vk£‘«IH—c%Šý!Û ‘ÃBÈÌN#/áx'öý 9 ’ÂÞ+/Eþ†‘cÎFÀȱbb}ÑÆ"G}c3ÒYdZ”óq»@‘³Ÿ‰ŠÄW¹Ì,ª70EÌ.sýŽ({]Yä0_ ‰œ^(νUçˆ(uRԂCþdÎFRg¡P~´QÈ1“,òÇˀ$?wèëV9¬Qáݚ4~§Ãmôq4çê;àãO„Îú¹LÁßÐãO …ƒ<~Ÿ± +1xÕË\ÎoÜq0¹Ø ìøù„_fìxV—oÔñÓzRSÇA.áÏtäõåX™ãg„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆ—¿"P;œ¼ Ö8ýLál¬qä¡øújrµc´Y€0ôi–Á#mÅJߍw¡’3ŽrÐÓӉGF¤—Ò¿F9€?†_Ž0\¹ÏÆz#ƙŠúÌ([fc ` C½*æ‹#›©’(ãÅáÚP¾ÑÅë˜uRj˜â©.Ùâ<DZµ*ž%òYE@·Ò´üW€eXÆ\q8B7¬8!2EArÂV˜A­.Ÿc‹ÛHAnLq¬˜ô ¤8~ ƅ³™ãq¾ő}áëV–g=Êcö ‡wš8ò=J/&Þå+%Jé@êX6’8`å| Ž³ZÁâð‘»áà“"~Ÿ–q¢º—¹gD(XâPSœætSˆËåTñiXùáQšøð3âA?O vxø]ɂ<ù0œ„møÎÃd‚,ÜfA q¡‡cE©”‘¹á¤/?zŽ³:넆ƒÁÁúý`†ŸÝ9³ «¾MÃa(¦\0Ċ±I3ø¤…àRÍç¥t#ÿƒ„“ +*ébí&…÷`(¼— Ï¯œðjÀ„#×\̑®ÅT¼AÂ! /8áÝRõD„·€Ço„ð◠„£E­ê6 gÏZë!&¼>nUxðªf ÇnM‡™•sxß5› Ž€Ò`U™Áà-ÄÊ+0ÍÈÈâҀ}µñÞ¡à#Hk6\§VÑ-¼ºÆ›â^ œ+¼sÁG0Š~8k¸ãÀ];iàQǜ0ðÃIènšäDô}'^XyÀÓWzàL-wö_UŸ]¹ä~3ä­Z)!ÀaÆ&üq:g€‡è?øß\þLø7þ¤úb›í«UíÉþæf&Ç(Á€f¢v7ò·Ã þª©ŸÜï4lØï´õûq¨#XތE–ktšáaåfö§“ø= ð;Áû®Yù¸ïx-7Ú÷CQ@ÿ°o¬µ¨‡ Ö÷Á¨§¡ÞS>‹cH,&Ö·X½NÖ÷Áäv¿±¾"1)N1ìû;dý̞6í$MÂínÊp[ IÖFôö reÄ7Ô7VìL‘éû¡+™¾!Ú§7Î7ʍŽ€z$ÜÉ:Ш§¯eÃ|ÃR +10ßáü!¶hlS}I°Q¾‘£’ñi˜Áý*ÖZª BJúñ]MkHÂw«*ÍHÀ73©ŸV¾7D-·Þ»U§Çƒî œºÄž+Ü»F#Â`{W·ŠN´7 Ñfu&q4Ô,ØâZê‹OGÈ6¬7|Ié? ¤aÑü­ëe $‘»ãþ´C½Óå?Ðk°¾:˜Þ¼OöÚfQù0íšDïæ¬zc .16 w‹øb𼡒`ñxà¼q–ÐÌOÂúï2aÞíñà,ïå­(o¨è8€É…!¬ +D7˜L¼ÜäÍõI[¬#X ŠMÃFòžV“¼ÏÇqúypħ«ŽÉ5[+Ç[ý–®2AÞTø±É|¼)odÁÃFòÆÇËØB’¼±¡°™Aòƃ社‘¼ie}Að¸õº×ž$ïÂjܳ¾‘¼ñ¾=Æv{Ça´@Þüû6-úX`øÎh&ÈRÎCŎ©Ÿª*ʘ oò1Ä"1ț²P‘X ò&‰…+țf"äÍ'uÉñ¦È†9àãMaM”{0 I .'9Þ܄ŸìÆñ†™Í¯“ãMÑíџäxC2$@äÆñ¦f_S—9ޅœåë™o¼¡ªÚ8ÞÔj»„#03Œ‘o¦Œ0_úDfÁr`¼!—:á Œ7…Ϥülo˜Ì Œ7¥r äã-í«ÕVŒ7÷dUM`¼K/㠃w;Ævù€¢< ´Ë{`¼) bøJñfÿåø¬.@XLpyc¼æ8{Ù1Þ˵sB¼¬°Ê5QÁè­È]ޏ‰fIð~¬¦O€7ŽóNï~îxº†w3˜Ç sð»qœv~7* "¨O0ÂS¸dz7ÉÇM•L ïFԕ ÿ€wC‘s{#LÓw TôJîFƒwE´I¾ík%µ{ñ½Ý ÝRqÌnFYËÌnö†'îhcvó¢ë¡]•Ãû]`Ì© Õ¿#‹²ƒmó4×Âù3g;v§ZH”| çځݰ²Š*xÝ8ŽâÎÂuã×TJ´Ðº E‡JÔÜI(ø³ëÖã$ÍÄu‹²miÙَDŠ[Š\ ø®fU<®›Ò׌릡Z¨6qÝ4³+pÝü‰žpnLÁL¦=íӎëF`[õªëfí† ±nF•·•Y“ÖÍzVú®úõÀuó&©Ôtåu—€$¯›Úë^7‹7T§°òºYB“¨o9 —K‚×M ©‰¯›‚ZŠ&‚×ÍþP\°s—*>7`·$¶”šØÍ Ue|Gzç‘vb7]®h‚Ø--®7ì͂ÖnîövÃ*·ÄÀn†Ågù› ïÄnFø$4±[ýXnixD>BÜêvK‚IìæªJmHŠHôrs–­Ã¡zCvË|GÁjӆ.æ²Ñï7d7›ÛÈn­ ñÖZºE¿“ ٭µÙÍx˜¡‘Ý\æa{"»©=–ÆÌnêÓõ˜ÙM‹>†•ÙMswæWaÁK°€DvóGY¹!»%ù/*¥uàñVÖ7‘ÝÒòîÁšÈnº ´÷íõÃÐn…E\»œiFt›Ý=ý´[¡’Ó¤“„v—ìGcfwZ’ÙÍà Ÿ³—*g.˜Ýôé€ä‚“/ x7f7'폰rR9,‘ÝDÝñEڐ݊,?c"»ñÆñ“ÈîržAÇYÝ,#:<6„äTÈnºþê ²"»KªÙM SÁìþ¸jXV™ùoÈnd"Sp¥<H!* +gÌEöLߐÝ4³Á™‘Ýø ªÖÙ '¾Ù 3á<‰ì¦EÙI#»eaÒmEvãGIéLd7R¤o±)Eõ.\Ý̈’tÀîǹ´dqcdMÄÆì¾Zä‡mFK÷ÇÄîÑ£HivÃz8òÅÙÒN×=ú²Ï%Áp¾'aÝ#ƦØltµ£º‡;¥'©¼ºÃÑuÆÆІóÐê&éú~¦õ¾‚ffNw6N÷´šÓ}×hfü6ØXjØ»bº¯ÓaøÜ̜ù„t§actO«ÝW4% D7@ ¾®€nÒÊÛèF”[qæsàidÅsc?Îûç¾CftîûðÛ¿Á¹¯h ln0pÔ.Òhn_8Lmdn²˜»Bx¼‹4]§•«_¹b¹a$å2¨Ü0t—)ÐuEL9¸Ý“É}SùÇ4éånW‰ä†:ÃÈ äë#ȍ0+Yää¾âC^xÜ@Ö ÓnÝÑC9hÜ`´²äaƒqÓjˆ9ÕØOV£¸_EÖ6÷ˆõAÜýªw›yI"ß0ÜÔ¦²ÍŸ)ÜÈÃ+`÷åÅîÎàf“ðç™îµÐAàÆ ±ähpó´0n·šBà·a w¿Ò·˜ðm–Uök²·×ãLôvvqòöy¬àl籁·/ëՒ»}¹UDÒ´QTÁQ~£nßÃU¹ÙÃÕb"·!G¤Öc%n‹.úLà6 œc¸}‡ØeãmÃÊá(xÛ¨ë`#pÛ Š«6n¥m£Š† €€mcéÍô›YÛù÷†ÚžV“¶AÇnµÈ +¶;¢Mgû üT`¶±4uGïènL}Þ0Û0k%q=ʅΗ²Ðk˜º¸b¶a¨50Û°Pؒ˜mnÃC,˜m̵ +‹fû1[*)ÛX©íû +Ù~]¤*_²Íã]È6!w ±gõ œN^{@¶IA`_‚€lóÞnÑ=!Û|¬¬Í6d›ï‡Ð€lÓ¢é +Ùf³Ð¸ +؏Û&†lôž>§gõDŽl3É`ÙÙ¦YÙWC¶™¬×Dj3â¨ä²ÍÕMÙÆcöo² &_˜±{à:n3¶ç29ÛúÖÝc ×è'ŒmZxgFH‡"·;c»Ý&Û°HÜŒm–ØÞÚd"¶q¥Ùb¯¡°XØ†WèRï±=}àTVà} Y‰%ªœ6Äöb6b›Mž™yÄ6,R¹mˆm3Äv!ÿ¼¨tVÝè!æÀ³!¶ñ +[9bÄ6%†jLlÄ6ž³@wbåz¤§cukâÜ»$Ýó>í|mh䔊2^n8‡” kãu‘'¿ÒµDâpxm‘Ô Ýc-\³®tmY©H2^›Ç:¦­òàêáeÃk3.Ê%Á×ÆsgÌ1ùÚÏô°z¢(×e2çFFàµY_T„Ñžtm´ùé [BPFR‚­®·Ò3úxEÁ`µY¾Øµ¢e/Û²¯\m¬„œqЅÂ/g©°ÂÕ¾Üb,™Ú—‹×© #A Q 8nP›úÃÁ¸žÃÁΝ§ ,ctÁÓ-BÆi¤¦tõ„i³£Ifiã8 H{D¢vãhãµ²šEçÅe(¶R´¡¤`Œ1 ÚHò³ +†váކÐ&cî‘‘±m8,@»_Šªìmè½TìÀ9´ý¬ÿ|v=ÄFφF‰`–€gCdwû<éúìÜßÀÙ(QèÂÜìSÜ €fcaÅBۍ™ «ŠÀ\ƒ±t½†Kô—˜}º%yÙ§{0/»·¹Ã²³áR°²‡c¥‰Ê†þ…“øFÊÆEðç”}F{õàd£ÆL­®VLö€ŠÀdŸ1§%gԌǜ¹yL5 Ž#ÓÓeh6}¢Ó…x;"N¿Â áôø† º,*ªW>6ê­‚qõ9£ý¢éØÏp:{¥cÃÈ0SÀ±Ÿèilì`fîhìǂ$c?ÎC$†ø¹ Æf¢å°êŽ¡³H…$ê´VM,ö}E; c±ŸÀœû‰ü +ÅFªG/ÑÈd@qŸŠksñD÷oƒbÓÌÀG@± ÙÄåù”Plæ$èsoTl˜•W +*6\ůƒ4lns»8`–VÎ#‹ ‹ò[Å.%ªð7,¶ÖMOŸXlæÀé[£Ý—¾ðÕ<ÎXl&žÕ<.:}p5gððs±ár°Áá†Å~T žPl°ԉÖLìǚ°‰ýxO"6 ‚ˆý½¸ó°Y=ÜÆÄa?Á´Ê5£—L‚n4lB1H®Î ÁádW×Àa/™¼•‡Íu…:ˆ˜‡ÍUÝ5&›QÕáºÎÉ´fl•úîÀaóìZ›4lúçíi_ÙS9Ë aÓ"~èµ-Õe7+›…,*=3›—~QovZ66ö4äÁ8l|¨ '.XWÉΊÆ¹©ê"JP‡M¯jÃaÓ©#»2pØ]¨òO4lnÁG·á°yr­Mv9\)™4lVÁpT^iØ´j 0 ›–á,V<ŠÂŠ; ›.iu]BÓRĕKIÆE•›‹éfî‰Æ –Vi–uT((ÛxØ\^רwW”£yä¶RÎø§‡ÍxL1÷BK ¬¯8„›P:ŽG›  Iª Ä&”N-> ÄVŠ¦KÉ9Ø¿ðß Ä¦¡=Ô!ï4–{åa#—êç1‹e¨ÁÃÆ6ºm›Ëè]¡Ü’®ŠÔ?ÂzÝوØ$˜QGšžÁÇ "6֞z“6"6ÃÚ›ˆ ×T®I ±P mCb‹ u׉ĦŽQ_eLï°PÒ¼!±¥ m"±…›@l³ˆÍØ|àÑ ->‹×JÄæRT‰Ã–ôi‡Í³gâ)p؈©ôcÃaÃìŸì^=Q g6-W¬8l˜(›Ûén‡ÍƒkÄZqØ\‘»8lˆØ‹e%bOs±¹*”¨ÀDì|ww&6ÓãςÄ&8€‡@b3©Y]Ž8õŸ4ó] (6³š|›Åfb’Q‰ Š-QþõL(6KC” +(6·áÚy£bKq}IŞ}ɂŠÍØ}ŸoTlâTÕ³ÂTl¦¢Ø¢!¨ØüC|°v-R>©Ø0ð&›13vºØ¨ØŒ8±½Z`±iÑD',6 E¬Xl>u:{ßwFãkc±WP¡ë†Å&N¬»#£Ê*f)}`±1ê«Û°ØÔ¢PC\l8›nþa.61D»l\l˜¹€O.6-|XÁŦEíW.6HAQp±ŽQAú×êÚ¦‹M_˜ióàb“ÍǞÁÅfC 5W.ö4›s [›7Žý6.6Ìî¼ã,Òz›ÛPõq±iæ3 .¶P‡W™`l*"Ç›:OV š#Ž5ÉÅfn¨ºSËäb3FNVAp±YÕü¬¸kx—Ú ®\ìÇ8’´fs¥@¥¦aƒbO«¹_è]ËùN~X üÖ¼ïÇùiGb7Þåò)‰Øxؤh%{x8ÚyØÃá—Äa‡¦“†}Û×ØaØ·£ ´v‘ÿDaßñn$ì[½–Ý„/N öí⚃}GÂÈl¾/g +6Ô.ʏ¬ì`'4ŽuÁ•®ómlÝ4)¨ãžük&³žö†¿®#’y¦_Ãð¸K®†Ç¡¾;üšXq¬‚ľF¯*ÔòŸXK¯èkÔkÐá òu°¨’|Ý¢Qø¾†ü éÀ^SýÜÛ¤^UõìÈëv†ßiâu‹NμfŠë¸ßx×-.»Fƒ×»nƟl´ké¢캅r1`×H‹±¯÷ƺF-ÐS'éé - ü*¡â†u6ÎuLVÌ5ƒ‡O›”ëÊÔ rÔQ&â’Òõ‚p=¬Ü×˂ä[c?âo3þ·Ñ­Ï+§÷gtc ¶õé9lG[£Ýad3u‚æ溂w‹~ðœ7®5jJV +k‹@C­/£fv¦5֎ŽßӍâZ²+;@_»ñ-݀ÖådÁkŠ»µ‰³†\PSæJ³Æ÷we”‚šS|Â(aökeY»€.IÖ58ÁÄ4ì0dçXèúëäÅz pƒX³KNÓ„ ÓYØ퉳¸`CXCƒÊI1Ö*3áëÓ|¡_M€ bÆWŸÁ zõRÜ ^ + òƒ] ª のƯ•dY×ùý(tàjøt¤n·šõçÓN­Fò„‘¿€VƒÄÏ.˜ÕÍr¡Yݲ‘£‰Õ¨KàÔÀê)ª XÈ§àUà‰ÑÉA)ÙpÕ-ú­t?Ž«NXûƪF…ê0]’Ô,E7©º¾¨º†Š08Õ5©†ó1®7Huµ'’jÄ£ºFßÔ Qýò´8MBu÷ˀê“#Ø;Ÿúä8¹à©Y2¤þåòŠ’’Û¢ÞLӝ(ý;ú,·ÄpJâq ©´"yCS?Ì˖OI¦în…–`êˬv.õéDCb©‹çí R[B»C©UŠb+&5‰ ÏO‰¤¾I•y'RÑÂƤ¾½ uÄæß`ÔÖo%‹úŠîFQר¾ÛQÔÃÀž$Q[c™ j&>p¨™‰rM|ܞ´B÷£¸’oB¨QG4Euðr{ £†#¢–C“@Ýì^€º†Ÿüiö¼øiÔÿ •¢Ò£Âzˆ¯g²§‡{ƒ¾±§-_ôôɐC™äi-Éz}#OKãrµIžF˜öd„ OSŸz„%µZÔ\ƌÃÀ¢þ‰žþè²ûe†æ+Ö䁞îÎò%y:@q ž>kè„Wî4bs; vˆ:N›:}FYìA„žL0§QÖÈi.o1Hgˆ œF +˜â®àM#q݊¦ŠçŒÒcÇë!ƒåˆjŠ4šWG¢1YÓw‰¬·ŒÄùö6IÓOQDbMÃÊ6@Ó0ˆµë ˜»¬@ß0ӏ¡8I™FyšB„Þ ÿÀ ÏƘ¾]Ɍi•ïk¢£Aúà4´¦/“0Ò:\š€é4l|é°&^úò\ŸÐhˆ”¹–ÞàÒ+Ddë]ÜiLhéùçJ–k‚¥¯ÐWú +èꆕ†àºlÕu=ÙPi¢ãâËFϙ@J_¡§ +$Üu:±º¥üb¬ÉíˆOš†:&Nšñòã|£I|įÑ0é»v[0iö¢?Ï7–4™JŸ% ™i0¨"¾ _ÙA҉+ Žt¢0#}ûëÝ)Ò(ß*î\•…¬DK†4 Õû‰~"ÂiP´ŽàEWGnãƏ~Ö֙ø ëcÒ£‘íajcƒGVÝf6êP/Õ«}{»“£oñí’ýxu–ØhRžm§F“ζy†Fã¤XèÌè§I¼3£CYýDeP£×M`ô™âàEßN’%:†‡ %/;a-ô6Rƒ}EŸÊ ¡I¡aEbýY@ÑÔØ_Ï'y,Æ7‰Æ߬˜2%ú:¢Ø|…D#?çâT‚"©6`o„èáðz¢G”Ý": #zZ ‰fI%¡+dF6D4º¨²+z“£bwá⎈¯ëôÍdR §:&+*5.\ñÐX–ÁK<4Voª·rY·ìa‡CŸV‘$T'5-6š’2¦ò'zXí•dh.ó\üÇzpBfµŸrúq¥L.t,“ ÍÅó¸Þ°ÐXh“÷¼×€" +Ý­4ݙÐàvŹ󃉬\"¡ß]£ÏßÜùú¿ ý5ÒóÏÿ<>ý£¿øá/·ÀóÛ_þÓ_ÿøË?ÿá·ßÿðÓï~ù/øŸ>zÿôþùO¿ûÊæø¿¿üÏýƒÎëËo¾_v:n§?ÿíÿã×?üþ—ñ›ßÿM­£zãçÎëÿýõëGþŸ~ý_ÿêw?ÁŽmóß~ùºUÿì·¿ùéoüå‡ÿò»¿ýÖ¸=¯Kýõów¹ÐÏ¿ùëy¡¨’}ËÿË ýw¿þÕïþêgŸìŸ¾þúÇÿ¼ýòOú•w¦á„á—ö›Ÿþüõöýîõ~÷íÿä‡ÿúºÂå_~ñ'ößøo·þíŸüö¿ÿÍ_å±þÁŸýðûOþëSù‡¿8>ýã_üÉñéßÿþòßñ+öûøô/^ÿõÿ½l¿ÿÔ?ý«Oÿñ?Ÿ~õÚãßÿÅ/þä»ëÁЏÿùqþu¸ííš&þ¼ýµÓ—íX¯¿~Âÿë×ÿ¼Ffâ´ ­ú¬vQ¦pÁK˜éµ¼|­ñð¯|ÐÂ! +p\r¬).n˜¨³%™§¬voÉ^F`¼V »‹†“#ÝfÇPz½~c;,ݨ×ð¶Cu¬Âá(î…¿¶ÃNã~‹}žð<ìriïÃëÿ7ùBÿ4í^ë~xvlâƒé™pø—;t£jäµàng#ëÿ…Û[ŽOÿêñ8/ %+¾Ç4çj‡Ñ5m/#eýíÍhI…®o±w¡9öÃÂ{½û9Øøý|Õ¶sûk^wüÓx¹!üˆ*¤Q¿­vŸ «„òÆ(oFÈ òÁ.väñêø´–tŽöi?¿ÿ™sËÓþû7ú½ÑýîÕH»›¡œ×Rÿ9Àl;zÇË|²Õ.jy¯»ã¥nDÌÃ.wlžÃ~{ñ#pÊ÷áÔÖ·xßñ´/ïCv}s>܇oöŸjêù>²U +ñWûwx:ÛF¶Å¸l‹}ŽlËaçȶœÃ6²áG…Ø7¾ y?ì4îç0íË ÏÃ.—öá>|£(æ™~”·óÌÑގƒ)¥ó“Y~q1n§·Øçµ,‡W½œÃv‹01^ˆ|nƒ¦€UÞvØiÜÏaڗž‡].íÃ}È[4ïÞ>­ÏǽLëóÅX¦õŸMë‹}NëËaç´¾œÃ6­Ïǽnœ/ÆzØiÜÏaڗž‡].íÃ}øÊ[´ß¢ù¸—ãÌcùÅŸÞbŸ×²v^õrÛ-š{Ý8_Œõ°Ó¸ŸÃ´/'<»\ڇûðýGw…D¼ëü஄}ó@ÈιÞ|˜Ê:Ë냻‚‡Ý ºÕ|jwl|wW֍§2;û9,öyÂó°Ë¥}¼ßd2sô~{§S±œÃt?–³]ŒÛ¥->̼‹ 4ïØâ'l·wq*–§û±<µ4¾=âi_އ<ìúæ|¸ßj2Óô~‡§_±œÆô@–^ŒÛÕ-n̼‹4oÚâ*lwxñ+–§²<¸4¾=åi_^‰<ìúò|¸ßäžß¾¥«}¾}òÍýrwã‘"ð}Ü@{¯ãÚLJj ùþmÚø>>¬ÏO~v÷sXìó„ça—Kûx¾ýrf¿Ãó[^Nc~õË /Æíꖡcފeä™7mù<·;¼|ËËÆó«_\ߞò´/¯Dv}y>܇o¼œÙoïü—s˜Ÿür¶‹q»´eܘ÷avæ[¾Ííö.ò²ñü䗧–Æ·G<íËû‡]ߜ÷aú¨x>z’Í + Í—€ðêŠÍëXŒ›‹²Ø§?³vz>Ë9lnÒÇs›‘–+(º½­ xZ{Lo{1n®ùbŸ~ürØéñ·‹§í—užÿÆ¡Þ?ýéW{ ÷onß ìø^b½xñ~λùxÄ-ü¦llÈéëí׋5gšª £íž<€$õ2¾œoFŒÂý\fÙ ¸ú§í° %ÜõÓvaœ3Ís]o[¿v÷sXìó„ça—Kûx¾åLƒ Þïp1Šd; ½Ïý„ãvuӾ܊yØå¦ÍsØï°Ü›ú¶q•Jopi|{ÊÓ¾¼yØõåùp¾ÕLÃB—÷Û{¸4i;^e{{ãviӾ܇yØåŽÍsØooaññ¶±UûSKãÛ#žöå}Èîo·ûð-gмxmÏò€ÌrÚ¿ÓÐ\¯Ã~»ÞŒ8ÖµÎlï*±ÙÛ¤ÝÏ¡%}ü;ýÈɃëƗÂûa§q?‡i_Nxv¹´÷a yœr ·[Äù÷|;§ÚQö_\ŒÛé-öy-ËaçU/ç°Ý"8 ÷ý¼mìʺý°Ó¸ŸÃ´/'<»\ڇûðmÖóùžÌ•Ð4ÙMØ^p(¶ÇÆ÷WgÝ8߆õ°Óx~xs_¦ôæÚë‰išœÏoùéyïöóœ7zÝ8ÉzØiyžßr@ˆ_|¾Ý)^ÈÓߌ¾ê÷Û·h?ìõ9|ˆê©¾Å@õ×ÃNã~Ó¾œð<ìriîÃW„ýÍ'¿g>¤åãvz‹}^ËrØ=êsøÕ õíï·h1îç0íË ÏÃ.—öá>|“žrûx{‘N&Hl=$žñžog»·K[ìó>,‡Ý“ë>‡Éõýܶäú52¯ÓŽ_êj÷™ŒûÜGÝŸ ы}ŽçËaçÈ¿œÃ6M|<·o5\L×:œÅ÷%FØ·UH§+¦ÑNäûC^o»½r±¼»÷6¾/1֍çªav÷sXìó„ça—Kûx¾Y°[~õ~{çB`9‡¹dXÎv1n—¶¬;æ}X–-óŽ-¾ýv{—…À²ñ\2,O-oxڗ÷!»¾9îÃ7 vÛµÞïð\ ,§1W Ë /ÆíꖥǼËÊe޴Žßîð²X6ž«†åÁ¥ñí)OûòJäaחçÃ}øfÁîá¿û*ãÃøöí“gè­¾ŒÓ÷‡ñW ÿ½}™4½ sÃù±ÏNãþë‹}žê<èrQïÀ·>ì÷v~ÅËiÌï}9áŸ]Ý2hÌ[±Œ9q˖Ïr¹·ËœÎ/}yXi|{²Ó¾¼yÐõ…ùp¾qØa¿±óã]Îa~æËÙ.ÆíҖ±bއe¨‰ûµ|Ë]>ÜÜp~à˓JãÛcöåȃ®oˇ;ðýÿfìõßüôÓ_þøï>]ïq׿[èµìiÜë'ý×QÉáþ®= ]Vû—7;ºJkûåí8?g_Žó“Ïóۈs·“’ây–‹@.Œö +4€¯_”ñµ\ÆóxN ê>ÇÆѽqo÷ÇÛ¿øEëËúú©•:·qÇÉ ãs©²ßØYÆÑPÞÀß}½n6žíðÉô»åÉ°îÖ?ZÆë³Õ`ºFTlÉX®Ãçðb–#¨´Ó9ÜG\ûƒ^—º!ÌEÈ胖¾ÞŽ/¸ï]mÞôuV—Ï ÚôZøÆ¥.û³ÖD÷ÏÖ'u¥±Ÿ#.Ë7þÀR¡-÷½¼}=ïøR:¼oÏás<¢"TÈlas\~D`½î·íÃϚd²xp tˆØ¤e?hþhÛ%ÇñZkø÷Ptç÷Óý}mÄ™_ÒóÜӈŽÚ4Ž;nìו{ӎÉZe¨ókg0OÍaù¬_‡Woqr¨¬³í¬ljg ãë{±ñàM;‰_¹ãԚ ²ݤ¨Œ“•¯_=ƒ¿Í“:ûí‹,ÅÍì£Å³ª}øÉt¿ààύû<®‹ýšÞÞ×˖c"Û9úc=QUdcŽìö #û xKr¿>çð5È6JöŽQ´dãßú:ÀÏ 8BcœcËÔ¯^ż«(Ž*ñÖ@[úcڏs„½ñz? o\ÑÊÂÆ+~Ž_ÓWÏ!ï‰w lîùcØ__—þš£®O2ځàë׫§>(~’â~Ø~Æ ~𵤱 Ìu™˜¾vë×Ƕ6H1æ×7GÑÓ_SM?è<ì-‚@#9ÇÛ‡kí91”û¹b㜠ÞN`½uoþã×ìo?_îðÈûì1hËþ´èñóAŽ˜_wôþÙû¯3ÓºÆÔÌièÇ´—ËïÃÙôpÕ=ׯÙy-Œ×nÀ1Ⅷ½¶Øøê±ñ}Æa»¾Óç0}—KZ!Ï-+ÀœzÌ€$| û=ŠõZ€q<‡±Æ'CøW<ï æO]¶ÿ1ìv38Þº¢—ñÌ1… 4ž-~^yOÀxÎ<½Ü¸æx{Oc©1b{hõÏaÔô‘[‹sèñuÜð¾zóÑD븖_ü1íǜã^÷DÆñĄ¥†W܊§ÝyC½\m¯#6®éÃꕄ En¶éöõԾ䔂Žy‡ýú#?†½Åkú™6¶æoý:j£†ô™+ùªÂ^Ób‰ŽŒÝ³°oWýôÕs؝ÊøEúì9q½9]Eëµz?7ØÞbAK܋ö}p„çüCNåÎ>ßav*1H|úêU¬ŸWM§¨C²ß}„k¾/a·Ëû¯ê8"ìÀƒ|õÈù£íÍWt×;^UsU|c¡ú%íG¿–äƒøø0ãÓW<¯ôí+W +ÊÚðêX+7Óa¨’¤±ÀI’ñX_ïr~žzÆ^ŸUlÜó³«G¼ ÄT|þ™s[?â6ýzçlóöÚk¶ùø-ü‡?°ñväËEë8ü3ª¢ ö~~ {=5·Â~óË'->/ÌãÉËØÆõÄçz…‡p² ¶ïø@c^m\®š·&pÔÛ¿UFŽHè“98`OT2ž£ø1¼Üåj#a2ö¼ã°÷ˆ•Üà¿ÙXâ|{l<ãC}à¸çæ—6ÀÑ==k,6ï爪% û9~Wº.gÁˆA"ï³~ýQå¨g××®A6oYçÏÇÎåXÈ9ì@~ÃX´T¤Wñún#T„‡ôŠÖ›=ão6F`ëè1nZ¡ÂxϽoÄ4´7> /awœ/'Qb ¿Á¯Ùö£ñpÈ`Ä̗sc™_†gJŸðë¾ {+1X3'c=ãV”82ò%“%¿äæ,Ôò‹9"bǫ֔`nÓk^¾FŽ»öËGÍwÄç!Ÿóe¼„ÝÓãp@¶;|ò^ó¾5bãê$F¢±¶’¾\áã yíŽðOÉ7¸°³…EW2ÖÇ·¦qŽçk 5¾ÆÐQ§óy•œ¥1#¦ýLWóé¥/ÎêÏ8±½†‹A6~‰'xUEÎÔ5&ÞC$e?ÇʕOöѨ‰6¨9[*4hã“ÇqÅÞØZ7Þ:DF¿„}Ž²Zaó Žò•kñs¯ù?Œ:eèñ‘¼æ‘ûç  ·‹yæuf5ÇìŸÙ³çÔ¸‚ÏXÅ·Ç^Ése˜3xòÄó㉍ãN¯RSUcïŒ8,Šp|„C»ïZyyqwà} ¿Ê%ݘhæ8¤Œ‡ +þâ¾çÕ¡æ/¦¶ç¸ãG±g{î8B.q_?³ +šÑž1âܬ| ûhñNĈ|ïOŽÃ‰^hÇ5.‰¨2žíÌ©Æ/ÄñŽzéϳEmN@óæ¹µœßbøV“–ˆô:À¨>+qß¡G®gù‘SQ„(^mr‘1¦øÍ]‚½iuÇú‰sCŸt{ïp£4f|]^ò§žH ?ãJú °ÖH ]C þù5s€„]¡ÃÍ=½–½gÐ|ÜzHªîû‹Øå\«Üé~C.Yrr³¯$yúäN¡Œíˆ÷¯_¿Ær S?ZšåƯ± Ž0Ó]÷“cÚ"\±z¾OÅÐÉL¸ó»ÕPWÑy%^©ÑrR»²‡þ 4̃jž#7ƒÄ6æJ‰Šy„óŽ·„k5{¹óCÊ#ôv­þO¡_yÓÎ\Š@9:…®>ÐzÇfÍéØÉ3®â9«À>çL¼Á_ÂÞêkà’³M-‚‰Ú¿Òl\}:È!ï±âŒbžy}2ùDÐÜ(ÂE1¬ ÷¤£Mv¿S¹o¾nFðg;^ËYny¹wÏÊ?š9}Â*ÜF¡®9Øašúö’73æsë{è} •#Á‘g ²Ì¯#ΠÜ3œrÇ—òגAV4š¯1ꏡÅ*`ù¤"éF ¨ŸUý¢9®°W¸ÇŒæ©:¢;>Îð”JQ;?°\ [z#¼Hxö… ðü’yª´jL:zŽ×“É/þvBÇöԘDØáx–ÅskB„èjƪîôž4íˆq®VGÁ?ò~óï|ɏùó ¯÷LÁÆéB>w‰#Ô3Æn¾dy„£ÅÈ[«è5Ç·«‡q80l¿R瘮%Æn'! ύMc8ìqÄt~<„»Ô Åïm‹Ÿ;ìå±ïYö5´ÄG=r²9Ћ*fôçñ cyó.µßý/B‰ ¿µœ,4œpãòÒÐÛ2Ö}cÆdŽ9 WIº¾SÔö9é>‘K8S±,`ÍÍ0v& ¼ˆ74&&æN2F1§64ŒóÕ-·½åBÕ¾‘g.w®\RèÐ#šàà=zÎæWų‘qøŽU44É#`:Šxb$Ðå4³ +£:§r¨Á î9æoÙù;oÚQã'9GOcÏA¬å¢äX]«MJed<Ý~˜Ä.hv7b9/»´—''¦&ñ:”]GúO§üìî#²ìxN +Ôc‘Rµ=hF’Aâ^2ߌ/+ˆwÞxô‘!‹ŠðeÅZ„ÚåsÙá¾$b­³âšGH'Šu+™œ*¶†¹@Æ#gÆ»ÙèێFÜ4™I§ñ¼òг²eìØÚ4_M]c—Ø‘š¶H՚bK2Þ3Ôß˚Zh‘&ë~u¿ó ŠúÁµï*¸íqúÔi½ìGëú™ÒÁ+¿ñr0žÓ>î¼jȃbqÈXޗ°OÿˆÅRiŸá«z.[?©(=}ïj^ä¡Å‘·l!ÝJ‹öXXÀ +#;ð”Øx„ÑÚ´±ä$l¿VûGãkÌø·±qø¯‡|›Ã_¯ŸC°SFv‘Ó–çyϟco`]2<(k®š%rØ2C‘‹6?2ÚCÆc ”58 2¶ EdäCö2@%QdÌ9©-9¥µÞÚ< ”1òù%ìVvŒâTŒWfB]2€Š¾Œ%õ½ìY1l¬9›å¥áã iVšÝÎ%ú>jt֙ãîS³òŠt¶O™(ì©Ä÷ëxH½éw7uºOÏì¹ú"ɽ- D¤PóéTúR4_â°ËÈÝÊrf·¯mjñ¹q܅rÔ0öô–ëv„ž+éâ)ò>Ô4ŃP¡=ÿ?{oºÝFŽ$ŒÎï:§ÞsºÝíê*щ-‘Yîê)K^ÚÕrÙc¹–^j4•²Ø¦H5—]ñ½Àœ{Îwî#Ü_óëöËÜ7ø~ÎE’L’™ô"‘b/DF ;È؇QíC¢|” +gƒ Œ%]FCîuqÓ[Î}øLnëi[úÀ2‡ׂ8½»B Ò$û¶ÊP8>â²<æàªCœ0„†Ä£õ9qüqùÎ0tÇß bã3IáìÃâ0dÞ±i.8(·ÚªZ‘@CE;Z”…CJ1‚û×å‚$U.%Åak¯UáJõtJ²Ï41.×øú¹Ëy€‡í!¤ŒàtƂCÚeй=øz™ îאFžRîGj+»¸Æips¹ø{¸ã‡ºM tvdØÁ!TJG>‘û>°4óœÝ…“jÛ{ h’i(–À¼ëÐS[êLƊ˜†Ü{σ™W4®‰ú0ÓØ!KÁ¥wéú „3és2ËC¡±æž‹§è'ÂåfXxpéà±@²6(´Ë…€û§ü¹Ë}¹–‘­Ÿ «pÁ}Cŧ¢]hƒÎ2wôb q0 ”Ï|ÚOJak¹ÈiÁÃYôgß؋]Ì)AZØ[Ð܁dO)핂¶m9ä7^8J¹oì9˜ +á{i0¤…pqŸ¼!(ú6w²‘恹+/Ahn"Ž]*Ê5É|®•µe,I@ Ž)0pgÒ5¦ø_ RBkö&Mp–E}0ËÚKü>ß%x$…t¤¼Hb^2JáâöfYwV'”ïŽ.S5‹\yx³“Æ#bvy”•‡¶D· rîä‚ùý6ƒß62zÔ7¦Èœ,ÉuØ_W˜!\³€!q¶p“KœàÍu®o"¯žf·v8­S<4¢µCÇÆHúlÁ=/W^cƒ¥P˜õœX òr d¸%œ³D÷_ïJR$†@žæšâJ5®2#SÉe–Ø뛐“ˆAº@e&‹Û͒F¡¢1g.’¢„7·¡ÏQR´ô 8JÏ|xJcN¤#½¿Æƒ5#`šûì¿(fVZ÷Ž…ƒŽëú¦¼]:±®%ۘB°› f[’m3±NÍ€NU„#ñ˜ÉÏ Ø2‚‡”J*S6¬Ù‘ÈÅÿ9]ÓEÈÎÒ`±!Fª\JV>è+±®:´š’ +ð&¾p¤´ +}ÎRêAãש5bYº…´"¸PÒùéTâ5-üRœº¬Óƒ&úà~î´õ9$^`¿ñ ´ù£™;Yn’eôºÜçö% wNô$ÖdP– ¾‘í EZÂBÂØ¢”3NëGRÎræã8–ìD¾Œ²G‘LCæ3Üp-Zé.M¨1ºØœè›Ò®CsV‰C˜>ÐÇ«äIÂÌj/lç”egŽ Fz„ÒÄ픊þTÒÎeÎ + *ƒóYA7lF6¨¡*‰Õ¡9Š$d&.XÎj(’ÖŒô´ÄÓ{¢D KúxH*œsÆُèk%"sNYp” ²l\3¿æé{åi7§/ña`>ÉGgRSãœØ®’š’îB65ª¹]‘ÞABc†7¦t¨¤ÔžsîÑÆ}ð锘vHp‘/Å bÂì9Ho®¥ç2‹1 ¯Šr'Žfœrºp±ù¾Iç£I ×J $€„¼P@Ë}Ç4ó£óœ?6qwžxA.ƒ Zi–IÊ­LktpFªVâòÇBcDkÏKÌ5”A¯âtrҖÊ"=5qiøYfCjÂÖñ˜³ŒRÓàiËžíé é·ä;I"æ-#c{jü°l‚çdx'9•bÉçðI(€y€óž%Ñ|úø„kѓüIês3ÉÓË(_±÷EùTPJ`J«Ò¦, §'a”ƒŒ‹Ùc0›CÍõ!÷Jp69ðI’—%D[x…/AP óÇò8ÙЙª±d†gNIap¡ÀÈéÂüº¶;|Iyç¶ʏØû0óR[K ­Ê€AQÁ ÜÁñ–¤ŠÚ;·'×]ytéQ.&ú=fg" ªK0¸ÀˆrQp7Ú£‹y(*â¬$ؘû² j„¤’Îûh½¡Ö¢G¥¨¥Ÿ·hŠ$ âØaANV<ìºæ®cÒ[]5A¥álKÉÑël@“È¥½ŽÑ-_ÇÀCR;†žX Sùpg8: Œ»Þ¢t0ä4ËÚ¹`ЇMsasM¨-ž¨Ö4¶a¶PÖÉC‚;ىǬ÷<Æ:¾À¿®¸oÉ#ÌÊW¶À°Ù)Àw‰«p­ºU·¨…R3ª Áͯ‰n”ph=ƒ§…­¬@àuM!ƒf„H”z~âæÁ©Z‰ÖÞº q !i[kß8£jR ¬Rš¸L¼Ð†´2¥t¾Q¸LºQÈr!üJ]:`p€»ªJ”ÄnÉL\Y†ÁÂuF›Ž<™áá³ÉS'ç:b·¸«=† òÙ0Ylì‚ áuÎ.a.~/cʚq+הFï²âðu¾N¾Á3܋} ”x~âDpúSÎ&¤‰êì|×ت(x˜xÓ À5 šž!h,äN?Gá,RáP p˜3:ý`QQ'2Iϓ *pRpQ`ðϓ‹À)Oè,î8C9³„ä¬{ã1ä))¾>V+³Ñáv ¿Î(?æ2xü 4,0÷$ċi"w¿Þà×zV““؃3äJ%äÖïlÄ¯s[H×íÌ°Rs(¬å–CêO³Üçr8 ‰‡“C!HTˆÂŸ0—‘S [› ‹Æ,É’8›9é8$½Z’w…WM¡9U±ÊhŠrŸ4œØÒ +.O“¸Á_à^nŒÛC‚+á÷²‹N²l¢NeÇŸ ‚3‚ÁRîWŠN(o(‰W0ûÄ1ŒÄ0¡Qb'ÀS/ø$Iæç¾ +zÛ÷–—÷H.û!ŠÑa¤¨Ô'oª¬>ÓÅÀ3I}ÓÜg%‚ +wÁ¹M„(τÊ#qŠÑàTó*÷A¥Âz±ÝÕŏ†"Ⱦ˜úÒ#x. ísÌKÂà¥ÈT»¹”b¢\i%‡A’)MQ)5›’ˆ’èœâe•úPšv3…¬cý²ɓ0PìLb¹Çà¸(rÅÌøêÔ÷Áˆ‹öËHlˆp¢ÈŒkÞ¶t‡uêÜûîuŠb¾qQ¥Ó̽GB¦šbš«Ë‡èÈ6š$>Œ[ú²„&NCRš—B\µŽÌ1Ö%ïûòf®èV5÷-CúT’E•o2Ž¼ìJ3Šy—ޚ샡NÑ2TTÌ¢õõ½Ð,åß½k0Ñ<Šq—6ÂÙ³ nùá1ŠÜçŠk¼cÍaÈ)øØJY¾(GN9U°C‰>9t”-2ˆ9<ñÜD†Œ Xu·!z®±/zÂ÷ÔXz š7]#K'zl,P2R·…Î|³›Ý­`W( BLÈôˆR¼º˜9œc_½±Èʘ¸€Á[÷aA;`ê͟Rûðp¨ôʽRØ@{æ"›(æl$žýa؅Çàr,QKôùŸÌ{.•3 +¸Ä&üÞ”g³p„L0v>¥(ã”qr•à‰âˆÌ}hâ“p[Ï# }Ïa§!‘8§3‰È•ŠŒP(ÁýikKl0pÌÑyëK’!<÷UÃr.}eTø/¡Œ›”‘éJ8~b€¹7Ø sù€ž×Þýšd–K +ÈA|Ɲir™¤5Ý;8S®q”´Ë²0À,¥Ùˆ2c qîO:F‘ÓŽ£´7ë‰yHÉ̾ú©-o‰éH”ؚ̛< +a¢€ç0(ª +†çµ• ð’oÂÓ6ûÛÃ(0ÅaЄJ·Å3]g9Rʩؘ;P¿ó¹ÃP;õ2v"¨¼YXÂÊe<dÈóƒÊfV—Ãî*_x_€xN‚B¿}œ'T‘'2ñ‰tNHˆ4v[°.!½K78 ÷ü7L0Oˆ_£*hY0O¢õĝØ-5ÕÉÄܚ€yõ.÷´@ÅH_BMÑ]ñ4øœ(ÞíMN˜…áG—{¥ ddtò)•»t@™§TW0Ӟn.ʙ dÜ­±í)§ +ÎÒ +¦Ê¨}Y6Lœv˜¡¤$½Ñ†% Ð% 1%¡u¨„ûeÍAþ£9µ–iÌÅ$µ$w‡¤eBÄ£{^F K<¨18 {˜”ê\·V¶åè#¿ †YÌ×¾¬¦°rYÀ¤«Ã&“@2O#4T÷®’E^0æjŽIFekp6BÁÅbfeÉ©2î×Ny¾¤9 <:±°ç!ÁƒÁ.Ë]1zÍÖU'ñÝÜo ¨‘ã«ñ&ÊÊtôj1 1so¹Ï¥ßž¦1Y£lü(‚BPÖDz@å=µø&ÿ¼ôË‹hF5ˆ|•eW +€‰÷*AÝÍ´Žµ6‡YRyTïF  ñ:.V‚}À{ˆ¢úJ’ªÊ ­ê+qÒIÑ[F^µHP¸×(Ip—Òæ)[´®=+‰é«([+~"¹;åCª8ä(÷ÚÀ½-3wª˜ôɄH^»å%T_$ր’ƒÇJ‰âáo\û¢ª2#´" ’mõ!ÀI<´‚$å²£¡¥ëxT‹IQ #[\駔jiR‡-P2/œ&^O¸ð¦â,ñõ¶¤N©ÌTê™F(…ç9ù 1…öàáÄ@?˜zîI<Ë]}r0k!½Ø¬©1±Båʯ¥‘ 'ª°UǼ†8ºÔ^rÒºŠØÊ°>ÀúC; }ŒèÕsrÌ"ˆêŽ\û½ª]-4m™ª[ +Œzåî¤P®vºÇÀ½ð˜I߸ìn· AâYÌN¢#‹  A;ƒw+¡%ÅcpE9âÆi$ñSå˜/g<^¹wäSÍ#@뭉¾Ì ¹FãŠeÚg&¶´££cJ*A”ÏìēÑ?N©ÜI¹2‹ÍT™ã‚ŏãY¢‚{Ú'u¥ elÐJ©èؼ|àM¨7å}"—Œç>FŽ,D Q¡Œ;`6NÚ9Ð÷°ò|ACæ7Èê*¡âaÑ)õsbºt¨A¡ÅÔÇóøçY£™h{V«$ªBM\Ta«Ÿr_ÆI%TÚ ™g +Ëѐnª2*ýêc©¼¥ˆÃ3ªIã„«b¡/2rRÙ'ª¹iÇ|?Kî€ÂÁu')–=²#wUFRUTËRoÚÃD,*ãé˜;ã«òëáÚ×äÁÂò‘©Ä\",»$¡N+£…@¾t*óº¥ùÙÆ®8hÊü%H¡,3&ÑQæ\žz—g + –TF s ®ýubíc)¦(y˜Š~BËP|5óšHê¢êÝø%-Ú¨p©«4 萫J̡ǖrÔPJpÀÜWwz3úBÍGokÂE•BÐ~耾BF&RB+|Ιwå;ٛòÀ´óãá«ÌsË})¬o~G ‘í1ñÓqŸì¬\¡Lµäž_ˆ‹$`•Y_½rb5* ¥Ë0¡ã€8[îxw)ùŒê–:;]Á6nKP^šúŒÎK¬[R¾sNüĖ°VɐÂý 4Ê5Í}MV«((§8 Z» +QµÌ‹n +$]_®'“”™/ªe„AúýŒ6M õÈÑ­ ˆ‰Ðb§Ã ÈØOlÏaÐáλ"ñ¨£ÒZL{Þð<”γ‹O©¸Æ¯rÓ£¢²©Ø1!dfÜc¾¶vª°r_Ò «x !‹iX`T8LZuSI+~»}å%@%£ªAX¬Ø5fT‘¹êaP#>õµ U(ï.e㡄ø\éù?cezÖºObo`Úԋ*¸×¬b`Æ+€y¤×„”wŠ)HÆÛ÷b,u5½»ƒeÔ8$+GhgFq@EÿQ󤕈 ×>Û[R`EÑDLIUF_ehiæ eH;ž‰©šçÌ£MÐohœÐbÄT0×1ŸX,¤& 3£ÔvYX½N +?ƒyN†^òÅÐہlŠ³z› Ï?˜Ç`Ëáë/@ªÔëjX‚/(בZF}6¡Ð%iâdÃF É«)碄Ï¿ÎÇ0+æuÞ:Xýî;¸ió¾WÑÊ +셇ûðåÌÉ?ôæaW@Y +9 +Ê_¸CÇYÊñuùDÁLKÔGîE;òO¡í5cíuÊEJ0O\sÿ:¯{É0Š9EÞ_88“’²êjHA>ÃH‚kÖçœr¬NH©È+ eqlÄ,Ð¥RV¦Ïœ‘ý–áT S²[]~ê³WªêŠøkgŠQøk•PDîê Nlj…û +l‚n-Õ^õ%N·´îD(Ò(\X=bðÅb ¯/ÁXœšZîÛa|V¹Úž¿F‹Rµ®(z7ˆæ>\~¾N´NS—u1²¾®…µA¹è]_c4ñõúæ+þ¹îÍUíº ¸ö#¥”½œQö ÌNâKy… ÜG³2ŸÌ e좄—ùB3DZ¤WóBÕ¯‚¢mÒjWTƒE¥HüeUoŒosžy$tÆW]FÝ1tÆW›@¸j/lQe•ªÎø—†òèX—|åKµWÎý `Ìó—Îá=ˆ®'KeP—Y|I©WÑ°ìY¸¤TQÉ.d¨„„X¿¤Û¬ç0‡—J[¥Êþ”úÛ}µ´– ÏüMŒ™×ní͹‘¯]»´Û¡š]k¬ãë ì=TU} ÝNíÞ°çnº­È5F¿/А ŸL¹÷P@ÇÏ\}IÀ ½Á=aQy’é&[åkž%¡Ó\ßâÃ) !tRðp8¹pqï(tƒ![QI£–†•hüÑ¢}”© µ±@i–ÓÅvs}’—¶|@zó煇3ïáÉRŸ(iºb9e³rC½žGޙ۰Z{V¦þîk¬ ˜û½)¢´ÏÌWÊátçLžÀj“(FB…aA©D«Gº;è³alÉhœîŒnaÄT‹|õ•˜ý¹ ÚǓ)ƒ/Œ* +r$§:„€z?pêœ;LØâé%)Ü5mw &¢õI­® ö|‚,#Ïfe]<ÜӌIu>è%\‘‹!Շ ðX²­*oÝþ¬õãsŸoÝ{œ?œî¦ãógÉ¤ ªzüípðlÔLzƒ—{{¾_¼ì â_>ýäÛKü%öÇ£ï=ìõ ªO?¹ã?·¾4ß~|røíð´ÀÏ÷{ÝIo8èŒÞ®øénëö› +endstream endobj 49 0 obj <>stream +‹þÀü¸g:8êL'Åø³Ö¦á½Ñ¨3Û¦{Þ럎Š¶à­;“ð#ü3y{Yà·™Ln}ÖºóÝ ×5ð#ƒ{ð²Üöu§?uîNΗ·t.lcÓ×ü‹MÚyÑ{y>©?6jUƒ»÷øøÞÉËâ¬ßéžOŠ?u“âIorÔ=‡<8fµÞ;5MW]ÕH÷xƒi|SßlȐÞÖÒ[?¶Uý¾nlHÖ&Çxrz¿xÝë@·êS¦üÔUÍûI:ª=ÐQ1žöp$jUƒ;NGÝâ^ÿò¼SŸù4˜ÂÞ öê^4¶lÕ\0êìYñ¨3{ÁþÊyŒ:¾|>®ùn;mÀ}Nß^Ýâk0¢GÄéžó³q1Y½Ò6˜c4b‡Æ*žâôm2“胀 ZOwØŽ¾üù¼7)œÒoû+Z—gl~ešBýq]Ýi¿3:Æ#t7âܓW6Ú¤ñp¼¹Šu†ž¼ªáªú£ŽÎ:Ýâ¨Ûi´vKO]Õ(ÞO§+&hwV¼ÓYqÝ8´Q#ÍjSå—úDùå +ucÕdL¢ï³FõA4þ%è<ö“ÃFƳ/>\oŽÜ±s脗MÀVq±hàÃËbԙ ë+¥Ñ›e/àM8;ߝÇ×e|¦¾ /.‡ã•Ïõf õ՚W¢þì@Û«ZuõÏÐW+,B¥ɍъé,ˆm‚2ýª3u…¼¼3êMÎ/ŠI¯»Õrs–¾)‡q¿7yÖé­2_lðile©G£ÎåyƒEzÃÏäMTù×ð +lØ,?)F/  ë&K^ÎM˜¤ڙkÐŒñªÝ;÷‹³ÖÝO¯{xX²½áaM†¶iáaÓ¿ÝÉþp:85ýÜ®°“Î-cÓv2®?ÜÒCW5f‰kÒ6¿m]èÛ.ð­LÉtt2íƒn}ߺ}¸.iü«®dx+4ÄhTƒéÅÓî¤óºhÀvâg®lA·“úæ“θx8*þ15Þ`yÏPŒÁ&²É^Wô*·Üºå)w›î}l:½Ûtn|õ)±Ût»M·z=1µ½qžM†¶‹ó܈8Ï?û¿\tÆÅhºªþØ&{î±­ ÷l4¤ð¹+Ã?o>ٕ‚™åB›2uÈS몾¸}Ý$ÉÍe"»Û®L4óu„FÅi³œ›Æ?tåè+œ¿m儛yÂY8hg6yµlý•; â#6õΝݍ° ‡»¹wîÔ½fƒ…ÇõeuXmÇ­Bƒ®~5:Z‰ûoÕ'©=vü؀×Pû«ÿ#óôxuÐØs™5é†1L}{Rc^o.s3Š݈DÓp²oKõœ½úºÃ¦”ÏÙÛ¾ú9OoN’úM04n~Á™-á|‡ý¶9Þ)pnÀ_|¤ë}7DÁÙ0^²Q#í©N,ýÇ[®~në¦í¹µˆm»m‘ÿa®~<+F{£íµ]›CàºÍþ¤sҀ(›dØå­úŽ?¤Â÷ -·¥‡®˜=œºÏ7™ mï:lëVÒºY+ñÑn%^˕ÈnKÜ¿!B¨ŸAь£Î`|Öගk¸;¶Üì³nšÉ&Y|ì·ZÜ_K§Ù0ýs+Ì>>y¯ßÿ+qÕ³5÷ë†-å͎èý@Ùʋõš\€µaëÉÝÅz —ñw›y±ÞŸþùßçýbÔ$4þúß«§ê¯Ó ¹V¯ÉÖ»×ê±vßRç´7m°9©ýUÍöi¯ßiPrµÐííùHq×|Ö6¬ޓáèò|ؾ¬Ï;¯¡ª¹ã‰Í·7@iû8aƒ˜'¼ +yyë"¾OšÞ@³9ìáƒP]÷ÉÚ0þ°ùaÝ[_ ~˜é¦VHº»ju‡¯A5€-nrlÊ ·µ×mG=ƒ…'cŽÑð>•«½H¥ÉºÛ˜˜•“ú³µc}WÏúêÏÖ¬ïj<õKçÁ èý¢ÛÈÀ6ÿäUvEyì\{´óO^ñ±v¿7¾ìwºÅE1˜<é\nòٶŵzB=žÖÜGVúX{ø›V®ç¤¾ínãÃ'Ǧ†õgkÃô€-)9ÔàªÐ N:>©oôÚ8¦Ñ`‡m +Ó¨?[7ä"ï³QQüRß}Ö[P>lØ¿ºÉ õÖév§ÓÕ®þxxñ3W5ÈQÂuýqžžö&½×MF韸ª1ö{ƒ¢Sÿ†×n§ß}2lñ=qUC¬ÆsI}øÇR{Bˏ]ÕÕ +Õ v•7(a_Õ :ýŸ;oëÌñ“Ψ™L`¸2=±þàNŠ—Mä×üʖc}µ~Ø@©^݈ê àg£áEƒS[_©’Ôô.šÕ_|¨ŽlO­š½lë"—º»È¥ÍQÍLֆÙsv‘KuÊ«­T¿ý™$»›L– 75v©»½±KM„M9ãv±K×úœ«/oVìR“u·1±KÝí]ÚFÖ·‹]ÚÅ.íb—v±K`h+–nBìRw{c—šœ›rîb—®7³¼±KÝí]j²Ã6…i\yìÒ¹Ð61«É7_³W9Ák¡¼nÓÓ$vp7=}z¶ö>»]׊ŽlcW•´T} Ւày%5z䪄˜ZíôYïMÑ_öŠþqÃ0‡-=ÃUÈzÞœg½ÁÊ +ò% ë²èLî7‰t¹ªîbì«Æ¹1öãKˆ²ßêûš'æÖس±Ú»ûÈrµ‹°ÿ0ë±Åîò¤Å”ù7i™ÿß5ŸÍß»æ‡ú·¸½ƒgæê´¸5âÕ¯›´¦o„Iüd¥ rƒâÛ\!¼ÑÄíìãW¤՞¡M,£½íÜuéV´§ÓLoƒyd3>²Y–ä­¸Ö®¾ýìՊÀ‘xv í• üõG´Â«]‘܈­˜Î҈Øê.õGԀ¿ºBnÞõ&çŤÁQµ¹‡rS™wäíMv]Kð¸ágó&:„Ö[Í6Ñ;w~EGvîü;¿öˆ¯•;¿aFçΝ¿sç/³vîü;W2oçί6AìÜù;wþ5rç£| }žÜm&ëî\ø;þ5ñàlš)lçÂ߹𯒅¼-úýáϵg©ß{y>1 öº\ÆfŸ»2™«¾ÄÕ;;›Ž‹ƒáÀȃeîÁë?Vˏš•@*=te2Kýp::3JbÃA–ŸºªQº%µµ‡à‡ŽÑ؈I»!÷S쬊;«âΪ¸³*~¼!֗X·Ç´¸»‹cgZ¼F¦E«eÞ}9*ŠÁ]#íwÍYÙ{9¼ûº7ì“»£âôîpÔ¬Š]ØÙ¯\~K뛅‹¾ùÖÌâ=re¼3«?ÂÎ/½‹édE]òÒù@\±ùê~‡p8^ƒp!ÓT–Ýa½É¤ÁÕãË¢k¤ÜQs#Óü“W'j4îƒ7—FXg¸áÉ«Ó +V¨éÛd,½Ö5Z\»,¨õ-l;KÔpg‰ÚY¢v–¨%jg‰ÚY¢æ¥…%êzX¢œÝÉZ¢œY + R;KÔ¦)Ú;KÔû²D]ÝqxÕÞñ›b_;r:î6ØnDՙmMp¿ ƖuƸaIÏ[Qy¦AU“]噫’êhC*Ï4˜£]å™ët07èܘC¹ß›<ëôV9ä6øD^·’ßîL¾Æü~w&_ÿmș¼«·¡gòzªÖ¦ËÛ[ ®±äqÃÏäMŒ³h¾Š7l’wà*:²ànhu´£î¹AZ vWyªÔ¯·«¼qMETyã*¦m)RQÿîïÓ· "ˆÞ^Ýâk0¢‡LiDo®nDó³q1•6*N›íªMã×!˜úC±Œ§87X[y‡u¼aS½·„ßËþNÁ¼! +&“É­Ú‹øçÞi“€?×üªM& í¼h8çÛ_™ðsà ¦hú• k©ú봁l~…¢y£!5P Þn¬ù&ݙo6] ۙo6FF϶Î|Ó`D;óÍuã;óÍÎ|³S½3ßlõLíÌ7›g¾¹©f€‰QtÆݶ¨p6êt'þ·Ã^ƒtûxݹ÷/»î5ÎӋ§†¯›dÈÇÏ\Õ“výêW'qñpTücZ º 4˜™Ç®j¤ƒáѤ7i°}ÇØüE¯ßdNK]ÕP»õ •›¦Õt?hxåuŸ­]ñüRÅ®dÙ®dÙ®dÙã (YÖ@°ÙšŠe»‚eY°¬]ÿ2ÄÉ°ž5Ü äl4¼hpÔcëšBЇ1­Q€ìC™Ä^LG'Ó¾aqmJݕEªPt6%Ó³‰ª³YÆïµ2 w6禸í l2´]ÈàFø +¾/F?÷F'E:xy¼¢‚Ç&… 6X©›4Ø`@7"dpRSHÜPNýˆ¦Íuè$;Î‚án®G¶åÇðé\¥½ÓOwúé맍¶ÙNCÝi¨; u§¡n†Z_bÜi¨×x@7BCÝú¨ÃúES6WG­?ƝŠºSQw*êNEÝ©¨;õú«¨·î=fÉñƒÁ©WU¦tüípðÌ`ÁË1÷|î Œùô“o/-itNúÅ£iïԉ·Žù<Âo.‡£I„ʍÐ/ȏ3Tu†ä 'T ÷;“éņa…`Øý‹ò@[±Tjؤf)Ê\Åm¸"ƒ °<­ú`·uÒÎ,ñR…Ýïæàu¼^“$»Tû¿ÚmƒT+‘JxO¥"Þaúg:(4œ"Bs¥*xKjOû=íÎ8,刺ÄŒÔó©‚w_DÈNTø»ô˜V˙½ù8­*sÙ ø1CŸûP š¨¶=˜—bÙ_…%)³sÙE4Tø ÝXe<ö5E“%½MVY®s²rÌ"/yjGÉì!íAðز‘§yº¬:Ê ôÄ,TóOFC6¢ô‹ÌhœóìW?"f¦ÒüÈݐ¸QâÆAùªáì1dG ¢ÜÂlØ¥#[òhÅ•¡r#¤™¢¿K—*ŽP¼ëøҙñÉúãKWŒOЪd´*-F}x«R–V¥.ÿ UÅÐdiQΡčQéGÃËÓáσJ…Þ™ù­^¿¶±?oç9ˆfŽÐ‚~1:  ½´-ñC ËÚL¥Z¶²vª”7k”R  —LõÕ< +(<М+ÐNì’FØõu)Ìc£7殑ïÀšïúŸD4Fï,í–Z÷Ìy §+­{%cëηÃÉó¢;žà**æO*2ÖNE +»MäI:¿Iî=~äøȋ³áèÂþFËÔ¬âÓáIq|ïq~lú|4yÛ/ŽÃÛË«^ûã©eS|slú”¶„e±4YX°•§f–‰m¤Û)þàÝ=,^´â:°¨Í·òüÍÂ:KÃZ÷¨àInW¨tk ' €:›Ý3àe˜ßZ¢¡ZkêWXÙ,êZl–,wn0\ÀSûàï/A¾˜eóÅà ŸJÌ«X’EáYÒô]ûuÞ%ÕÌküá²Û„u6áïžÁ;J•)+7SÑY;»¹/(fAslb†ÌñšÒ©1 jà ƒ/å7E½;°Ëúéu°p‚ka8F8ç"VˆI¤Êè0€¸ngIŽ¦ª¹'-“R¡%Žä"€prmCsü© +@€LX‹í!cPjtc\#MdjÙO®@°5o•™ap" 5Ù<è-‘<ô¢fÀò ¸'”90rĝ DIÕåò3½J¡9Rû2úîŽ;:à`ÀQè;Àœ[†çH‹>˜˜gZàXad õ!G|­è;PÞõÅA\_͎”Â@é«À÷šÁÀô …饧íZ*-,Ë8øKDK"ɒÄqN£&Òôۜ™rQá„ó•YÏ+=ZòØ,M \ˆÔ75ï04ÑÄ|†§¨­efiêŸL@Š—€áYdÕfݶeÖ²¿oÉJÞæZ ä‘õ›­6û00ËDˆx([Ï Ž×ºYü<¥=½d[ð)ÕÚîcó È5øîÞ£ø£@Oh™]iD®4|—¸ãPÝtŒ^ã0àAӃ}‰ûÞE%D¦å[.M Ó (½…@Ô‡ƒú93« šçµŠ‡gžÎEâŸ223a„“¾ú·Àõ‹žvývØøL;<æD0| =M_=v¸·ÓÓ®oå¾Ûñ,>LM+.UK‘L Ç*W «Z%üf«{ý‹ê–Ò±ZÿD§UÁœ;ð7wææ3Æ[ì0‚Á¡sËܳU°èÙ3§ÓÁÖIò ]÷E۔d…9*SsV€èÉ%V|éì²ÚnÁuI²6·âuï{Ûúñ[€üÕ¯‚=Œ Ã~ÝNÿøñ|I#نöY´®d °O·°C÷;“Ηf·ñìÓO~|üÉ¿¼óþÏÿ,üÏÿßÿü?ÿóq~_ÐñÝï»ßÿå:¬Ï忯Ú_ïöà æd®€폞}h`^ß.”}‚Ø‘·Nùåm ølY’¸uŒ\9Ç?~î¤ W”?BthôsÏaï"âãy”–½q`©«‰] ±7`V™iá˜ú禮g—§ÀSûç%Bç%“[ÇU²I%‘€¡ZÂpfÑÌ (4’G –y!%#1åÖ1*0ÆÆ¢Š‘%×Vn¿‹¸rëø]–[Çï ²Ôíx¥Ðrëø¡]AÖsg=ô‹Ÿ·o„‡{[÷¦“aËnÉÞ/Eð Í{מžŒ‹ÑëâôØ(Ƕո¼}Ì|ß ­œçvÅφ¡%‘›#œVæƒQkÌJ  8S‚ÅjöoCƒ¨É©È4Ɔqž+Òº=0„Ló7KìȬáÈ,iü…NfO„ ÀC äLÊøQ³ ¬I€°GìƒC怼Í`Fg€BcH¡7¬%È÷‚ ˆùW!ÌYì Â£~Ü}Á^Tь”F¸§!0•á¹‹ Ex¦â.՛AB~Üy³Ûó4Ëʽó¢Â£y›i­E„>†øÞ`è} èæÕ¡÷Óæ{O9u7žq?(ÿh¸ÃüŒÏÑÌم¤i"SV¦e ´ƒ•†mK%"‚H`R—‰©Ú +í³%bª¶µ©…gUÛ°Àx%DOJ‹(Áp¨µ§†ïALHßט’~HþÙ0l‡>xJÎQŒ,læô«Å”ŒnÑ·YF»Ìm ӑLÎì)؋à",QÒ|̅Ž°hŒ]øcˆ§eFȁ‰Í wè=E|/Jœˆú[âD4¬À‰üЉE€À‰f©vHöݬĠ.Ê0«áE,S9ð•—(iøK|( VYQ"/dðr‘E¼!JFÀ@ɆÐ5B/"JúîF„ôc"XµÅ'*ÎQ‹|›"OgˆÃp˜Ê`Q1ÍÌÉÎdZæ’Òœ– ×% +3¤DD$íTBÚ¯Gˆ€èÃ`ˆ3ÑÀ¿>"žïfDÞ´Ô͈x~,þA?Z‡9úNě£RðÔ 2ó—©L—dÆÜ¢™“$P¼ÊÛF²È‚ÈHßc‰‘`±ÀžsB_ÀìôúX\D¥,Õ%iþZ}Ï¡_v‡¾Ÿ‘¨H XR Ï<æÀ×TPɏĜ˜xóC$ÊÁ Z1ñH ‹‰Gb›Ž;™1ñ<,"^³C$Ԟôþ˜x®›1ñh(þ9OÂ<ñf©4# ÆÄ#˜"‰Mž$\ÅÔ#),¦ÉjþA'ÌyÌî{L;E¤ ;>Bë)@ïŽ)G}ŒIGñúáêàI7K£᯴i,l-wL‡Íç$©˜t$rŤ#ÁÌ?H¢›GM€˜xQ/‚Ù1jOzi׺~–¶­LضD¿m lÛ:•¥½ˆzÜÓʎä""ÉN鼌‘ÎKbó²!ö€ˆtHÃp|5QÀ¿?"u3¢„@<ñF߉l³ô)‹wÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(æA`ÇEXiÜôâˆZÔ½ˆZ4ùA;¬Ñw¢Ö,]Êò\D-Ѹ2PØq“œQËIS±Hà" d„”¾GÄò @¬„Ã"¬4l÷ވVÔ¹ˆVY`õòCvH£ïD«Yª”¸ˆV¢a‘Èã÷£‹"Z‘ô‹$,ÿ”“À¹ŒO®gô昧«ü93àód•Oǀ×õêà£ó~pÏnηƒÐµ¼;U4\:•nŸpǏy´Êõƒàuœ?øàœû§ mà‘ͻ€¼–¨Š‚Ë ^åš7ñ™G«˜Ø*‡ø‚ý,\|[b…â,–*T‘ÔADG}Í\å¤*XxËAï+@ p%ÒÖlôtcPÉÖ類Eíf:[g›é¶0Û*…$PrFj¨’Ú’^é )ÀõlxùÝeéúÛʪøÍo¾ê†ˆÔvb¶2§½¸Àʈ>óðy/n´'²¶fømOÂM3›d‰ÿêb\᳍ŏØÏO|žF¬ «1ÑÇÃÐ?÷-ƒr]ø­„Æ¡‡ØC÷ÒCúHMèQèi<èƒP  ²'rÄuAÝõö3þȰLX oƒqIðtáî3Q%hôÙ=ŒÏތîõu/· +=ñ2ÞÂ‡Ñ +ëÇaß½‹òG×ßÏÃxâGYÄ +_ÃP¡OD„ß¡Ã÷q‘/<™¿Í<ñYäÒ¹a ³WùªEm5›½¤c)ÞÙë|âårõ…¾1/Êč‰ÍE4CÑÔEÔ'âÓTûխęىç-êÐÁû¸²—'³—æf¹°´T¥9©ï'¬n­óùËT–âÞ¯›«Ù Ìh.¢¶ç·Z´…ÃÂÞ +{vCÆ[ÕMßAigÇ~/^‹èÏÑ?MiÔXìŸ%UôwµÖi5ýâÞ¯{–þïX5ʋ™Îᆲ³Žkޕ1äXæ3ópŸÅ8 ÿK×µò± ËbÁöÄ&ÑG×â,šc*}J³ò2˜_ËÊ¡5,6-Ú¹6<,…R·6 +vûëK??:Zz«ïT<àÂU•¦xz.2Jc·0Ã$L†‘ʵPhvÊPG€;Ôs†öR 袀J–†6¹³„z, Wu1¡ËÂ̤´a_ˆº1ÞD€.¦2ÙîøFÔaevTÝ%…Õïüøäð»Ç÷[_¶nw{£n¿8ǟµ0ºÒLyÀüXž]ÑN2†&ÓTKaí(I[dÌì}´*—äX®YùL%¨Éø²l›CXa¹I&Á€+pz¥+ɘå ”¦q"¹¡¦Ág+»º¥ +~J Ä¯bÜeÌY €ÖiêT4Ó–áì9ø[ðWkˆ^I±Üöìhæh·¸™+fPÄÃN#Ñ ä¦mžæ ,Í,řۃë4lܓùM§”©vJ3C×} „EÁmEEb®&M¶~[Üü"t¦Ü©ƒù~®`P +õ‹–d†óÀî 胗Œç¹Ên†öõ/s˜Ùãì­¤™×«¢ÂœdNÅS^Н¸_8 /¼åõ/ûK°\.à³ÚŽýpè_ͨ@2O £E(T ±:3£&C"ü–C5uûô*C¤M;Ãcœ‘8ËaZ)—ޝP4}‚¶šûJÏ{ Þd†¨qÜÌ«g,’ìèa”úô:·©Ç‰3¹¤^†fá¢4‹ýÀ å½i=iV’£ð’“j§ªeµÆ³g…¾SÕr‘¶Sºë'¢ÙE™–^ú]ð1žÒñ¶y3”âB5*“†ù3=çœQ¥âæ-°ÿPDȕ½mǬCÎp×XE"I\Ö}`uÔ,EyÇ,d #éÎ$Íý°R7ªá7a#Q!WÞì¸f„@{p¿„ÙàäºKe[¦)^èeúmGŒŠ`J“õ¹cYŠ»4Ã&dŽ×TU6Ù–ÔÈ3ØÏÌÌ(Óxå>gD'˂¸3À5m"·>³¶”‚÷˜W!§‘mÅ~Rè;j£FË®áX‚”ÁÎΤ»he³¼è ÝÀÝDöÖ5 ¢.\Ë¡„­(kX–µ— ÃžÂš¨6\Ù  û¼2ÁÈ3 ïø¶¡:x cÆ©­sÃl1ia©åŒÀ’X˜™¹Ù;¨˜ÑP¸ÔÎ̃º£õ.µ“xÉúü¶@·W†#5ÄÝꖄ`^eïÎâê†7¼èœ¦cŞùT©Ü'k(öVÏj[ŒÓ…Þ¸k…S…ÐõÀ݇4$ã-<øݚñ^ ÿT™ýÎ¥kLx= uØÜw0Ñ»y¸Z§â Ðrë2S¿ï~‹ûŒÔôxüEZ«zayÐâ×Ó={%O¸7HÍ~¥Þ-Ò¾T囹(7Òàa2r‰¶?b!ây} /¤ÌV=šæx¥Ê¬ŠÖཱི:[½÷VÞx:ë¯,­’‹è»_F¥E¯ÀŠêW/~.¯ëҒWÑd—×_Å*•å%ù>\hD{QAÀÌÓ^VÌ9”á†Ìà另ºrμwNO¯õÞÊ9wÞ0¼N‡¡˜—§o#Ù@Ùéô·*œŸ,É+– MËEå¶ÌÃuÅô@(zè̽JT¼Šž¼˜Ã _³y¼ è¡÷ês3b^T„A…»]ù ºâõEñfrRŒŠ^÷üøáðÕt¼È!÷uŽ,M*DÂY­½ÁF͐˜J‘qaäÄï-:RÁ`̈́áCó'«†k)‘ObFÿ퐾íÑ׊oôelWb½tf¶Åϟjp.K:¼Ã·Cú¶G_+¾Ñ—ñû[€ ®°4B^eÙÊáBÂÓɳä#EÁ]õúûË´õ°óz8êMŠAë¼7øezöÏÿ®¸‘òãØØ  åp©(½ÕÙà¾ÄåE0{уÊíí`"Á$-Õ¶ؼ²Œâ£ ÈÀå˜hœŒ2™¹3ïcLÚ6Ž† ó°!>’Û !Eš[ç/hÕÚZz/·«f+°Ñ¨Át€F͌¦.ÓÄÞÓșÍì³õ ²6*@1-@ 5/F¯ª […†‡ H ÀiQA¶Üàî߅Šüò.jyö–JßH™™Ëxƒ‹-r^"˜R :‘Éü5š¸”„yQïèm…e £‰qá2ÇÉR)SöŠ?a«¨¨Df(Û(×ÜôhçÄî$à =£CZ'3Ü·‰šfƒpäL /^« Š0{¯ Ú<@‰‡x×'þÞC}Ï]­Àmi‡0 O¬ïgÄ,¦`"¨“ + {°\$W˜p¬)Ö´”æ„]¬JhÓ & I˜½­&í´ Ì\§p‘´5C ÝÆ5ƒAæÖwOˆÂ¢Œ^«)5ƒÓ—éÐo¼—UŠÒà`ûk"q$Àð%R¿J{‚‡}‡ëDõ;T“žM9Ü˸Ù%]̃”`â”ј©›° ¦Aᝊ)ûØVl05dú¤f‹HeDleÄ!‰ŽyJìßèßW¹»Î‘@f›²<çx½dÆrëÀt*ðlw†¸ÓÁBãö­ãJ^ÆÇ5¹>+ø€×äh¶3kñ4›Þ¾W‹éó5H—œãlה·™u-îfž[‹¿™£¹‚ÃYhs‡ÏÍq9­àsF|^‹Ó™ç*xb[ƒÛAÎÎ:üÓ6×âx˜”¾ϳë}®g7ÙZ|Ü<œÀëð>ÈfnÊý ¯uŽÿì;ÇÁw³ĄÊà-I½·ÄYöðò¬<³…F™×¥!` +êŒ-ãG 3ù–5`§f•0zôÐ +¦h¡®‚ È¥ˆ­! uêBO±# èAœY˜²yPԋÙq.95*h€1\fë ]4z™õÈÍÒ&‚FÝ*9B·*¥Ç+耥>UÐ*^]«¬î)8˜ò–4{#ÍÐê®9¾–Kþ‘ +ÙèŽ5A¿žzƒ‰é÷ޞƒ£žÿòé'ß^âo™ýíYjþ}zòw£MS–[û£éø¼õ¤3è¼,F­§£S0Ú¯ø±e=èôû½—£Îåy¯ëš¾0”¸Óz>œ¶öZ¢õlÒ¾3×ø³–éñíêGŒ†XùÌLë‡G¿Ó=7©ø³Jž ÏKüixÞ/ƓÞلڝî[بԴ3ù¥0jñàeAmÝ|Uàµ8þ4*zãâÎg­¶#·™¢2±?ÀĝîÏtf&ê<|…Ïà0°ÿÀÝ!àÔ|­{÷GfA÷ DqØ;1ÛêøàÈ´Lö;“c;¸gCÓ©;´ó#zÏ9˜ùhãêrüŸûïò¯ùòÒ"µ/7ŸñöÿÁrþA; ÂûEK”Þ^køï{¾ªö®F¿ëà›á€-r=è;-ú/PìNË¥šÛóŸðO|Ìá,ÚîŸù­NÃù¶ø™Z·Xù«˜û +ÿ…m(ͬíނ ©Ì7q„,3"-·´HÒâLmn3³x4yk&ìÓOîüi0üy€ßà ½}¯ÿv<î?:ú¬uç[3p\ݹgÎâׅotç`xq94 ôa¯o†ŒÏœwzƒ–mbÁÖÓtǵùú;ß÷Æ=s\"Ò +$G“N÷U#$ûq¯[Â0¾*š àøSÿéÈ= +XcáÐa8y^t‡æH<Å_mCGV( …wîg­»­O?iݎp¡dp·…/où uçYg4©åÁpp:íMê p9*{#Š/¥—¾^ƒ§§¶²8’8Pì©_hŸÍ¯úÖ_Y[;O›ý¤Ày§ÐÞ „ÎPIû©uÙÈþ MghïûԀòWE.8ғLbršAäù 4³7ä¦FuGÓ¼QÎñöÜ,—ŒeMmôëÑh9Áöû…9ÈÞÅî ¾5ö^4¦€bé Ì3ÞÝ)tÆþˆ(*X&j/›À-ßKOfg؞¤Ž{>=;“Ïp^¢¸ý¸ßŸ¢~5µ‹7Pcɞnpk +‘шƒÉtôº»ç½âĺ_¶ a÷œ¯Ì;î¼èMÖäᷟN'c£²Eb÷{ãË~ç­ýúÙgô~ëÛ,Ýl§j³£ÍÝ]ætû üÊxþ"ëÚÇ?ö¶amëS-¦¸Œ«£ÞÅe?VNØÈ2 ‰¿r–FêÙÚëï™Ù…“ZÝS׸{hߝô»“~wÒïNú÷©Ý}ÀÈ«°f1ýÁ±ê£ã9àm GÃëßËÑñ ûª´:'#ƒ¸Ä'ÅòÉam&·.ÃÖmˆŽŸŽ—l†­òÆÚ*߅b;ëYm–”m†\½ÛÛ¸‡QÄJ„†H?󁫭äôì,JzÌþ½ös{pÆ7½.?5±%èMÝI»Ó»¬>5€œ”¢õ§Î`RÔ?3!õWetf>_ufÞ\^–ïxَ—m¥#=cdP4(ÆÖòŸ—_b™È£§'n–ï—­™ŒâÖ*Z߉S.áò&ü±Î¢ºóݠמ BLŸ7¨6¹¤â_Â%Ëqß7—þ“YâVO‹'ryjæ'¡úqB^~úšhî2¦­z\¡¡BÁåCFëÔy®4~P { +¦gÐG¹~öòe¨2­·?¢}Ñîw€ éÚç«øiÔt1}vÖ9mùàõ&AˆP¨®óqûhx6ž I$A.ú½‹ÏÜìã^úû`rÙ`ûì“Ïá[}˜¸}é.ò\²WEʳtwd¬sdpôk~”#c»š«bPÁœWU0O’å5Ìm=ïëœíÀgêËïÑÇ_Dî^Cêj²¶¶`þEöÞ§ÿƃŽºç…á,e:ÓþW1ˆDš ´ í,è+ì_ׂ/\ƒpاSøþ¨?üy•Ju4¼lwN‡?/V£ÊûèoBèF‰mD¶é¸xvt¸ßŸŽӛÜuò.¦ôq·ïT-¨IHÚîe§[6ñP_IÛ=é윳””:$¸ (n=xsÙ1Lu¿8ŽŠÖ÷F'=âœÏ׆'÷;/ÇÝs¨M·‹ÿÝñámæÃw}_Œ¸¼yš²àËNÏ24oâ{]Œ¬‰OySÈigôªÜè|8úå3‡¹^w<ê~V¼Á̝í˜û{bî5¼u`–ÏéO++æ´J¶Aœó÷âª2k-,ªƒ%H N£¤«+™>ëô ³í0žÔï÷í¿>ëŒÇÅèÂl±bðÓgHҕøô“gÝ**AjÒ?ÿ‹~n°¥€wüÜ1ÛØc®®äuûù£ýÖóáÄ¿"IÜ-Š¤ŠÉ¬Eªoþ¨èŸøö)×)$ƒŽþùßßR1Û›×ڌ+a“4ÂH၃·Ð~y%l F¾=Os›: ×e»ËêX¹ý“ÎK£|wü#,ÍÍpa¨:Ë5sp͙Ä"—Zº,›4ÐlFé6ÌÆa[¬_ÁE¾ykÿ+©ótj/D“\â+\퀡Ý9ÖÑÌ]IàÒ^ô€aØ¥ÃÌ µ}Å3ƒY¤ÑDjÓZध™¶ ÅIÂì2 `|á;[Fi`¾Ê“Jxܐ³’4ÅÎf*U.1y.üœ!Jè%3ÿœIŒÓRH¸¯¦E3a+ z)ðÇÔ¬Û<ÅØS&ÌN݄~ï¥ò€S*&\¯Ë2鐹\Àpy!a=2dHGæî4Î,ñ†N›u/lÈ}FåL5tt#É1ÓZ¨ õˆÙ$aWSžˆÌ.yåòº5QÑÐ-Q¹_E2çÐÉ4 Ô2eÖÈfpi\#pŸ$Ä鶹 å6hùpKM‡Rá¼dÌ`Ô2ìªT@[XÅ +R~°¿ÂŒÜæL)Í.)nkþ8\Ø9 ӑ†é0ÂÍ#„„뇁€X6×ìÄ$Uv¦Á¥+ñ¦[6ƗýTØ3ÚìEe»a–µÎì\0šU?L»Æ&!ý(‹peRb:XždØ7©´Bw3,Lm;ç3éÒùÎ¥°¡™ÒÑ5,dI»Š¡oœ‡í–i%NŠ§Ò›P#w7eÒDÝaº“eø¹ÙM– (‰H„Ì¥ÍÁ›;}•ïî|aJ‡é¥þ¥µÄJêòz3ƒf ⾔Š#RF P í a‘ÒžÀ-Œü#aý*Ž]1 …¹Ý–ÛUÌ9ËÀP!8À&W¹=‘ÀÆ5ý S+s¥°'†9ÀvKìÈmò_Ä«ˆº 7¿Ý41m&Ãv3¼ +0âè4Opm°Šã"ÉÓ£5Úfútâ× S™ACÏ#öÂÌ +´Ä”9·7Áfpad!:öHi{éÙ 'ZæI|€k¼e6‹Üi£„3Ä2e§€5U:BN gá¨äìO³É%GÆoNci}Mk&…ShÆiH ë9ÝQÍ°s‰Ó va›ábI3[é"µPd-VR˜ +ç'w°Ž¸©°Si¨…b€!¾Ý‚†ïåÈðýaG'€(v†Àa“œExá>3`"â5“‘!:s”KÄçy ›®|5ƒ7ƒã®NUDÒT[n˜á¥ì˜Óe…´„1̛ó¬ßgãHOpC •â& +|V0•c¤©ÌYf9¾0箩<Ë1š† +pKˀ` Q8^RØê O¬ŒÌ)vwh™ æL&æ3ž.)ðÀpp :³Ý¹S:¸ð܊˜¥0Î^* ›ÇÃU˜í€ Jf÷²° +àÔr ÍÌ,]"QÅL™MB4è-™Í®à¸Q u”B‰Ã±nǚ‘9RX"K­-óÔæ0Kí.Õ ÷mjäIäaœzÌhÓ%..É"F dԴ՜û¥ø/Z$“Gb~µãgö²?ö.. ´e%×°ôðÓQ÷¼wZ5÷MÁ÷ÏÙÑм`T•k¸Ñ£aÿÔƖ¬Då›Zd‹ƒ×# ¤n[º§–ÕþŸ}ε¥ãñö£Qg:žLÏÀ"ÃZÏ^6TÌì9:&¹² !MSäðFóÊò ³ølpˆv¬âqzX|Vu$i¤¹´¬NØ(¤–t"‹…øDܳWµÍ]\Cz§Oí­î”ëYî ÇÕ«Ã6ã†(\h\[±T§Nx¤´ÑHÌ%údyXr,šË'×£ÎÂLi* ¡­™f*%æiKE%é,·ŽGÐÚïO‹Ößnë/2ñ…Òß>sö¶7¦Kúd`SPd!£Eox:ê ^Âã†:€ ©~GU3û–gûÁÞ譊ͮL:ì'eÛ뼧`y0ħU•yæ’i> ù‡ŸÆ·2ÍÛPmÖ¼Š%ñ¥ñ€ê_lï;ýÉYÿŸÿÛ ãxøÚÞø¢srX˜Şù Å›ÉI1‚NLJ¯¦c>^~wY\/§ÃŸ°_@LÎYÑ?=:ö + Ö^éá§ôlg2½cSzúa¯Äz~„„:ššæw}×ioòª3šà^zƒWéÙøg°AbŸ±½÷Ž^<€o™¶v^G=3­óÞà—éÙ?ÿÛµ¼?šB•ÙÏænitäZBz·xî»S3ËÓÿ^pI°ÐÃיË.ïüøäðÛái±àç»­Ûo.úÓ`Ï,¸Qïd:ñ—OÞ¹7u>*š÷ô–¨|”Y fîÓ¤ŸáŸI¸JóöoããםÑønTã=nûºc˜5†Æ B˜kçz3.ÝxRô§fج¥ IŠÉ·H“䊛q-;u½4ÐþÐlïÓZƒ¤¦ïsQ¼;!ØrBԛëÜc[kgԙÝ+ŸüæLáË×õÙ´½‹ÆÙ5 +ñðâ°¿ºD¿wÀ³ g¨a4õWêÇØ7GpÊõêÏvmåñÙÏ×`}o'Ã=ç[3÷2ñqR Güsï29kL¹ky-·LeÛü?[9<£G¾<¯Å]|Ók1@•®ڛzõš hOf«gëm­!½½&Còñ„ Çs2œÑâ°8›<õŒ&[kxó])ÙãÑp:êû©|=Äsº]‹~\“Ω‘¯ÞCgòwî̯N‘¤Öš‹Z#ȟûý¢8…µø}„œFÃË{£¢c£á«NüÙ=©Á÷ÿ þgÃÞ`‚ºý|Ú/F¥ҙ1û EúšÁýkžœ} ®½ŸÍúŽ4iFcyvï9qWÆ[{ðOèÅó¢ÿbøÜvÀöèÙp܃ÎãÏÜw*©ÿ›eÇ÷F““agtz¿8ëLû±ÂÖµABUg))üqÙ9= $³/ºÀêòeØør8™…uú=â!š¸Ýée¯MÇ,…P]”²íßãÖ½édØzÞOŠQï—bë½ÇŒµhEµ^ ŒÚ?œNZ/GÃéåò¶½ñ°ß™­ö¥|ýRë¼uÙ¹,F­qïbÚ¹ïaÿB“Ž£`Ët|H=çQƒÉ¨3_v̆ë¾5ýê|~ŠKž-ÄÖâ¦wÓÚm_Ž +¿«W6yëHªl’EMY܇•mã>¬lúÀR‘ ߔŒ®ÁëÎø(‹•¦òÙ¨£×E ,Û­§½Iç¤×ïMh!ߞ߫øœ·éåkzÙzØGg€™hD8iÅ:„ÿÞãs¿qE´žfM£Å!’Ò#O§“K³ W<$ʙïàagðrÚyY´ž /ýªöñúúÓNÿyq9íÂ2W}1¼œaªÑÏA¦åýêÞãg‘-ð0þáÜðÁg£áY¯_ü©x;;!¥¶]dHYîÎ<Ê'ÅiM”Ïî?¬†|¥)Ž÷vÒ:ó3ix@¿7(Z³2*ÖNUÓ1fç¶8ãÇG†Àš}2<õjÊ4ñ¬g¦ƒ—žLÌ?~ØG¢ÀÃ2šmûÇ¡YÃÁc@e ›ÃùøàÍ$ŸbaӃ¢ßöΤ¸JX™Z†õÀdsÇw%èîÙ‹‡má6lÊŸv`F[‡Åk×±]J€§—nXÀfL4~^œÎ,ÂÙV†G„EÂæąÙæGÝN¿êJ£EÕLz-3¬ÎØS?Ïؒ^î‡íÇS_Ü´´°´{©w+f¨DKÁuª—­ê@͕M£!ePù ã¢pAé¼Æ‚‚)Öï +sÆ«j½}{Ì8óÖä¬>R¹â×x.ÒEN‹7{£ñª.Î>sTt‡ZG:Wf« –Ö§ °ô÷ÏRmp‰Wáp²Ã 7>7Ë+¦oý-8°#vžç°Ôšç€¥æD‡ªg Øj2`š£dbt¿$YÁUMÃUTIN¤Ê’\t4=1ìÃá`2~œ³BŽš‘wºýÞ¥‘ÀÁCóÆHà/Íf÷zYÖKŒPxÝ{mzläv#mFÌvÑk.I8‡øK¶ðoѬæê²Æ€wZ\~‘ϯ­»ðpHá}s‰¥A&<4ä Åùñ}bµ}Rœö¦‘lÿSÄwAŽlmv™²Q&@õ)âHA?é`>Ü|>/Íç\Û§NÖ=*ɺɢf/‚ô/ lcš;ßÛ5±?»&JmŸÎ.ÕÄb­ώP Z¯"—ÅY“^¶ñj‚•Û- ˜mT“dã,ÍXl˜ þjõ¸ŸÁä-c+–r õ`á½ó÷áIûÒ(š–7Ó±¹vðêN¿¿¢ÙøUïòÄ ôÕ 7žm7* 0g]­hÚöûMW(ù³Ý¡É°è™Èñèl@ño†'gÃV$±¬¢xDÜû¡8¹ó}ï´Þy24çÎOËGÃ-uÙÐ8×ýñ¤ß>µ¶>…'ä +ÁsîÈR[ç¡ËÓ ósP¿_—§õÑÛ`‰ðHÕz¸¼¹vK:\HˆÏUÛםm;3ÉÚÙ¢†%/^ÞÖ 1ö.̦j÷ÍQD:G;_Ñx2ô†žL­D=Š:’%ª\zÕí­ß‡¦âþtÔ=o½½Ãi ¥zƒ–¿X6C€lPâÆó/ìΒsq«-— Æ…%èfÛÍ- +l†¶Ùìæ´÷^bó/_Æ;Nœ³j)Nl‰v¯: ;ã“Þä¢sYŸã•'f~ìýQû"˜²51Z”Acþ²AS^ß%^¯yeóÑi{8‚â~1Mµ<3§µ/³‚VÏÊf—βtaà‹_¶—/F׈ÂÆ"¹{¶Ùì@Ûʆ¯WŒtܽìwß.ac¶Qw0§Î6š]&ög,¥™²~ç²9\Ãe¸|yñª] @‹_Ê®¡ÙØVY¹–±½åïÑf©óÙ(DϪX"´5„·FUÝù°G¬jÔ /Wµ9«gdˆUí@C>µb¯Ø÷‚ú¤3/›Ò0 Ã#ãC©FëI<®UãC©ú<‚æPÙe<ӓ­COj4Ž{Rµ³Î“öiG´.GgÃÁRvíÆF+÷úªÙ›ákw¥Ð2nŸô@š\6éãö xى<â Zu:dæšsi°[ŸuÑC¬æ|¦áø¼cÄùbµ U1³¯ç¹ÑgZÎ4ÓU§Á›ËvÙ@Ý«j6ÍzáÐÛWÕôå\Ó ݑYv;-ihN+šö{˸‰iކNYï]ÐrxÙ]Æq°ÅxÙôc‹ÓiÐã{ÃeGEëÞô¬ÿÏÿg<¼\¡Ï +Ä£©k&Øìl:è.[5¶‘3#ø•³âÁ‡:ƒb¨V—±ÙJí£{ËZ·†Fw=m=|úèù=‘·þvûñÑÓã©Ô{üKž$Rå–êƒF*ŒeÇ*qÔ4….²V7"+]÷âí2 =j9œœ¯ÔЭ¸ZµgV%Ťg/µ¯d£%ôÓqqØEŸBµbžŒUûØ,¤‚sþYïMÑVŒ  +^Ì@È÷om_¨’5ɳñK#ìS‡`Lº7²OaxÃÜSåwY£Qã—ÙÇj¼­y€Bd$;ê¼.ží»wÙ/îÍVVÚMþ¿ÿûý¿ÿ×ò-ѼêÍ©Ûþ±dmºvÝÈ}MÓÿxðªY‚ñ¼»:‡Ïî?ÜûÞ蝓ÄÊáåĚ ˶Ýo†'­§ö§ØJ‰U"khÜ,rÎßÙïî<~œ©ûŒ•ÿöô7ýü÷?|õÛ»¿øFüæéÞþ×£Gç_¾üë7ÿõ‹Û¿=èuÚã_§ßýñAú«/¿þîÑžÈûòðo¿}òõhÚÕð'Ù-&寒d|ÿï÷_~‘üúë»ÿÑþÝ׿ÿârüõøOüŽyÍ×wÿuD­¾™ì¿üã¿~ý{Yô¾úC÷~»ýۗsï:<ý³y¡¾ÿð֗ú/&÷ÿþÓ¾üËÞ÷.†‡c3ï“óÏÿþjúð¾üõûïÿöóšûgÉ7'•Ø~­ó3ýý¿ÿõo÷^´¿_üָݗ?}ýûWúúËqûâóû_ܚ>¼ýèô̼éõð?ŸNïŸýôƒÞïÝÿñ˳ýóÉÁ¹þ +Qä?s¿Ëÿñõïÿí·?XD¦ÓãƒÿxùCóé7ÿ¸ÿøôñ¿îïeÿõ½£½_ l'~ìœNÍkò¿ßþ¼û «þýöÁ¹<¾ûû{·Äo>ßÿö‹ÿüüëƒß~÷ð ˜þîßó«ó»Ýnç|ê}þàìðܾš%w:zÔûõ~ÙûoN÷û·þí·{£Ïÿ6½wxô›À>ûúî7ç¼&½ûýO_ßt{ñùWOîÞÑûª§õñ™¸7ê>fŸ¿ú’y”Ýûߌ¿7”Ó¿-ô"9ý²wp§c&™=ùêöÞÅ~_?»°cøóá­¯ÿþW?<ø"WPáñþ㿦¿úƒ>þÇç¿ÿþô¯_ò“_ý„xÿ0¸e†ô‡ôw¿‚iùkúCúï Õö_}–î¹úýéaÂ~úՓûw:¿ÿÍÿ_Û{m§Ó#¢÷ßZ¼ƒ1˜šM¦ÉÆ$›`“ Æ69íÙ³/öӜg8WçîÿbGR'uÓøÖÌüÓM•T*•*ªH½½€h‚ðÁAA¯4Äô±äGØdœþÏW¨÷³Žü˜‚æíyK€ƒ»„=‘È;¼¹äâ™ôþÍþ^†h5ÙxõL€AÞʔÙ!|rCðXž›ð­¹}Ðgr#DîÜü˜ôûÁ¿¯t;÷gÏ}»+ûüdb6f‚ÓN#òúÔí¤ëÙÌkî»õ»Oí?£ €&ãïµGAûÁY??òØß2þnºNæþÞGÙß¿ ;ö½~ZÙo›Ð01…š³-‡0ÜÚ¯+ézÕV!sÖY…¢Ckj @8í\ {òm²§¦”†'©Xûô˜n—OçËÉ ˆ‹Q‚YŒîAπjTÏÂZ¾?{ZxÇñdŽ ?R>ÄñqœÌ±9ì™md(\/>qñÅeƒbŸäÏñŒègƒ“ª\-¤Ge⛸}“–ïŠ+MÄÛ}¯Õ8ŒS#áS$xnFæ¤Å´³f‚ÍeÞ^u‘¿‚}ÐÛ"aÓÊÏ £¦ÀîZ›Àä Öìâ' ž:Ít¨ï}®ÃkqõÆþXÈ;ӈزD–óJ I·k3;6‰H.Sí-ÅƋ^ÅÞ+ôBß`ó佄·à¯]²Ï镴¾®bd.Ð÷Ú…1,Sç¦æõõMæsP&謿!ÙãòßkÎ=ÞÙ2§Ù:³Ú¼mÓퟮÀ¨ØY»¼cûâ%MÎÐ Ýüþ1ƒŸ}š2A{õ‡ÖÜ·¹ãÝþP"1ÿÖ-2`¨|¶}djñ܅ò~œ›úÞӝ§¯#ÿ=SºÙ¬Â+gI7î\€h¸¶e"žYZv¿d¼à±`¢¾ß´Mp²€³ÝbzÎ[ž÷ïÜÉ#x +Úr +-À筋Âc{¬tüòûËÈxΫAº5.g駑ô8/f]à•ñUSÆÓ?Ò­sÛÏ=E/C™¾Y§_QµdøFuÔãÉzv +U&¢¼ì$‰ŠeG‚f¢â™¥‰rï9B}¢X“MðiÂ<€Ÿàˆý}]>u ÏÀ°t؏¨?=“ó'DÃÁEh¨ŸÁÖÈ+ýç/‹^¡Ðüå˜Àèq ’·",1(ò±Á_sŒK¢Ñê¦4­êŒöõU†ñøC¤Y@íØèáà4¿ 85:À ÕÁ÷+÷ +Zv͹ÙÜÄú“¡µ,áö èÀ²öÊùB£ñê 44ˆ³ÓÀnßpcCÜÂB£)ͧ¦7RGÄ̺þÌû–¢03VV „¢{”“ü}‹q û38ÄêìÐâö-…FìUœ´<ºŠ}'`|0Øê<7f–tI–=Uo#k#š@jb/£Ù€ÍË2´Ø(•˜—CÃÉNì2¢Cƒ(Íp+Xо®iK·ß*2ež·}ñíÅÏ¥HzNåE•×zQRosýói4̨N#@ô¤Ü2õnè,²¿ÃQ*ÿµÜ›¨3Ó]§Wi3 +×qìï2f”-·pZ“”®ùZ²~p‡)ÏÎ# ©7³%’ý97û¹JeŸÁ§”ÍÓÍM®žj S`Œ­=hìÈd‰¾«QÜ9&·Ü ÔS÷£u à·]þËÑvg‚¯3Y=™é"7·å‹˜*×.Ÿ#aZëû×±éâ °‹¡aY‘Ûo1@×~æܺk͏4˜>gA‹@³Q¤Ý"B +”V£H³EµN8?Ê`çYÞÃ%g…W®C‘^‡ÎӒVǺå Ҝù¤¢Añ­J¼¿A#°f§ý  2â3®ø J&h¬ÓL#5°eOŸ'¤‚å‚'$B*ÜBܟV\¹Ò_h" Mÿô¦úmUm§ë +`{°M…ƒ‘²e(’&‚A» +™Up1Øœr‹ u^Ï–Os°ÏqèVùŸ§Âîq‰Øcþ>ܪ„m7#¬éÖ*e¿]ìÏW3Y÷¦:úm&·ms@¯¥_Áéàí/ ٟ} z4bXàÓ&ìªd–5;°~^¿ýÌl A£Ðf–Þg=÷Œe{":[¯¸Tež…̐ñü‡‹Ýn!røi3ùÍyì}Š¬Ãs9Œî@}U˙ÆkêÕkí­_衞{OéÆKë šú̃÷?Í[Zž§¯DuçZŽõùA5@#†ývÔ [’©Ã᧝ÑÚ{aˆÉØ–Yâ;’-aÀë»L1ã?g£sÔóÖa0LGb'û íß»~Óàiޑ:<–‹¤Íêð4@t½ÃÊ1ۀãªI’#«þNחŠO‡›Ô{ÃnŠþØ[¿à@Œü!vÇdõ… ¥è̕¶±€ih)­Ï'¨Wٝ̃VüP³½Á´‰>yÛҗ;ÙÇù?¹,¶±‘Àm ¬Ðíwö÷øÌ};@Ëï³Ï¥ªÂˀÁmèÁaÎlcŸ§­¬Ð+QOXÿBZ{¯§t¥ç™±ú¹ò2ËÍÖŖÇÜ·9Iä²EERçVŸpQŽêÌzDçcӜ&Uñ՝Y¹š·µát‘èK'ü™ Ÿ”3e¡Oí3C {„ý°ÜdpÐøˆ)Á3h‘Ÿºû¿|ÍÉïrÐGxu¸ª¶kq‡9@ýŠûòóü°>%eÏ·5ÿe'>Ò~K¤¤á{˜Òhü>C*žì˜r¥õï xëºÒ Ûë"ÝlÛÉÂSá3”Yzf¤½ÀíI)0ÔóìΕUÔ@šè- «ã-±á‡Û&c‹L½Ü7 Yf6:re‹Õ©<´n±xZÂ}ó{Œ<ƾ­\m¢±úÁ±Ú<æí¶à7~ÞÁõڍ2ÃԛñtbQWÁ2/ôÁS•lfm—“{@±€YO”…8 ƒ=r‘¿¸ö÷ýý57j@×s¤É\¯h›`=ö¹|p¯0‡4ï­7[èå+VŠÍ‡Ö%òçE_±ß¼cÛ÷1ð¤[ò³°>ÙÌð½?JØð‰R9 Gp¶Ô~($ì²/Ù·$«ðѼDÅTúP©÷M°Ò©=¦6ÒlA¸…ßw((#PnéupZ ŸÉ}1ž[Uœ‚L¯åРÏ}·ÆÛìï£1øÛ_Oo¥­È’º)Æ«o¿v‘Ú·Û÷M=š¯¤b™®–Óc‹[Rgä %t*úœ½ä¾#cw¾??™$üÌm  {éíOÝ&ਠ0naôÍ7|0¬d c£ÄsÐ'Æ%‘e:ßN‡"M¤OŽrߍc…ô`‹èX˦?d6µhÏžR:â^¦oѯ¤m©·viBÆs'l8@.SÑ÷ù"ÞF˜‹”‡&ïµÚВ^zýLWr®”þǍB‰Vµµ=*Sû~¬Ç.’гuþC À#¦ÔÛwûŒOË眫9s¦¢/KLsÿ´ƒä&K‡„Ø}»O{«™58 y€Î¼rÿ̇c†Ü´BOS¤X?çŠÃã1瘒ù¸ÕøÔÙÛgÖõDà’iàD[ö3˘Ç$žÿ (pm7:oÚ`ßkl+–ŽŸã©¯¤†á)÷½=¸Dø6Îхºdö;é»ÜFŸ!è.C4Põ"Ý¿_ÂXþä +‰§9Ð;"AÊ#üõÖ?²pc¤¥4{‡è”ÝÜ<>„†ÄÙ.˜>›Åbï@S*ü¡}ãÉø€5ž\¦â‰ߔŒv>ÍÜ âèè>pVPdx„hÐ+hœCÒۆœ&vH=’ÕMþ+°¨.«½ÌéP«F‚u车·éï ñÑÒWÂdK T‹hÍî¤Ûm“^Ֆ•ã~€†·ØxqÛ¹½IÞ$Ù¬5&ò_½C —*îöÌˎ-Ôõ‚Cz© +k"•Ãþ\îsVݽªägfJ‘¥AZƒ0ⲝ¡èhFßñ;WÜWQ+Z‰Ìjµ í|þ9Žâžëßi~JÄ͸’Mƒ RÒ«ÉÆJ 0ˆD¤›Ûê)ç¨ïgŒµ<³#ç΄Ɣÿz ~BNk­ô2nLh_lV‘9û^›LÀÀÿ òU$VPò;ïcÚ¾aØ{Þ^7Û ‡N±s„y/Qû±b¨I—,ê÷T|EZ)†ft!´–Ì{yŸ}ÉGÆÔ“8ö#œ¬DSz¶4¬=h¾@¯ºû׍Óê.ó9Z¹ƒ@`W©Pw‘O‡ Ç Ð;IKÙù–õtÖÇØçàcÜqþø…R ±·å™dۓqò‹fJVV±bŠ‘P´L;Ò6Ç«Éþœ +=æP’Ég6ԚmㅝqèäL€&:›}µ£Þ‰í5³rzڅn¿»ksÊpþ?ꕗáôLŽ?Ï?03Ȍ'çÆÑö_¬9qš :¼ó,}ÇY`3]YQÇ9ô®Ñ©ˆåƒð྽vx4ì=×8󟾧۝P‘²¤`d™ú«‚ɯßynNHéñ;8³vÄ1MÄ_v˜#Ñ+cŽ·s¶_÷WÜÑ«dÒaG ®ˆéW âꠀúÌѪ_èX™¯t½R„ñÜEÃËSãœóAlò¾ý˹ó@5‹lóÃ.r?ñã쉼?vêƒ?ZØTÉIà¤õÛ濂Ö@¦fµþ†6¥†]àæ,‚Ðj¤pµ±Ÿwö‹ŒÿÝçÄXàwèX¤Û¹£-¸¯L’ÏÀ‚¶ë+îá#d¡ØžcÓèò9÷ùÛ3 v£mO 2ÿÁ´–‚ákdR3g®´Ê¾ ÔÂÛø0–J&œ~í;¶Üüº.&~¡™ÈOÛù'&y¨ûPŸ(ΐ§›q¦ô#Èý‚rŠ8ÙÏøÓò“ñŸ#½Iê_ɱåÓ 7ÅG®¬ÿ&°ÒÀGÃX©^l£ÝÎÌfNÒº#`8Zn”‰Tþ¬Ãåäg³‚Qçªl¨@ddÏ×ì°í°—ÚÇüW¢ uL;c¤“#‹÷X:ô]Ãtûçë‡ø\b ?a/‡nÜSYîYZ­Î¨pc{pâýµ–zŠfÍœÅ×9bï̓I…Ó€ï2ƒIdÀ¶¿kx ž\æ>óîëd1/ñ +Y†Û–/"ὛÁó{åFќ/ðKнÊÜN•>ÈV¾ðÆÑÄ*H,¹ßùñáø»™=Ì~ai8EÖùïæxšƒEß,曇éüwýÐÚ¡Ë›ðp~xÀYðÒ^tDù¥¹í%Ôº`íÿÌ73¢€ÇùCíxÏÙ§œãîþؒäwƒ#y|†¾ƒè×ÕÉ·çÓîÛ¯¬×ÿ¿þ?®‡Œë¡´É¡"G0jØ-µÖXÿÏÿ »œl(ð`T‹ÿùÿV§ßŜ%ÐñÿügþµD/PC9o¦óådƒnØ;¹äžaM€þëð»S¨¯`V„œOïó)¼üGÅrS[䗭@—{—-ºW1 +t!X†Wl%¹õڇÉnÇ]v'þ¦Q‚NOW1Xæú;lÁáx€ÈÙɎº ½¯‚a@Õ¶›íìf3Ïmÿ³¡®o¿H-·ÑvSˆ$¨[òàB›}#¯ÛÕ¯lM$o1¸±W~Ùûp¤*ÿ„¢î/@V¨á:»ÝÌðâS¹yF D_q…ÍM%Bìç/ªKõ™7©JÂÿ¾ÈWßp셮€´Án“ø…ìÝgA,…Ãä¿ØuØÂÉ-w"Ò¦ýs^O7“ß•šƒŠ¾L¤ÝÇ©bëvŽsD‰6^Të (Í ¼>Ç/®”Ý~Ü%>è5(DÙ]¬Ú?øD.PTÚÓ"w)ÊÏmF4í¨ 9À õJˆ 1P‚7¤§[¶6R´œˆ•ü辈@ üg xžÕRÔÈàô×a;œÀ ;g¿*+Îüò3å¯þÅD%†“¾|ñ*5o–˜% çœ~¿ي2‰¡«¼¿J¼~SœjǛ"G‹¯Ô5%‰/·B׉_<Ëÿ¥ºKhý²”€Üw·¢Òú I«^ÂÓOŽaÅTü”¨@$Èà ©¬îÞ^%}§–Q*sÔt§­Øòж´ùʤp}€- Þ¡x4ËÚ¨¨h‚ºÀÝdÃÖ¸³å€7~þlÿSüÅKï%ÞÛ°7 ÄD í·(hâ©Ju÷ƒ¥ÌCÝ?ˆÜøWâÕwöD`²'ߦnÂm¯9íɟ“~òú㍨}Ð`?¡1_²}Êä¾#…eÑÐ|žÀ8[‚}êµ?7ƒ?z«¯ø¬wºÍ0ÝZoO,ãzëK?¢wüü‚gão—Þ~Ž¶ôŽZ7§w5/á~îYþ€>kmøÞc Œ.·ô'ëã„/ö…ƒýຏ²N›†{JGsX©r8$ž§iÇªDŽ‰p1þî"·}ÿ[þðÑ'r}²×&ŸÓÏ_[:´¡ÑøŒ {Öik„Õ Ô„©)¹|ÕÌN½|«z<bÇ6Àâ(n‹š7¶c˜<½y‡Û¥‰˜™<uƒ{ø$Žq<|¶' +zš:µ6¹¥Ë} üá}ìüYXŸ÷r|¬‡ÏÚGCk!4 DKC—(Ö¡ñú8ˆ9¬ÁßJáIk\o9=Oq¬¯žÿ£7jã°Â+ñÑì¨9%°~,s//ŽÕoý°Ç½ ñ¹>’C˜beèìVU±éd¦’’À47ë³Öސ ¿_ZVªZeôq“§Î‰*Dl½\ZKÏ7Xy¬«{ÁPU"Cc}5›XõhÇaÅšB<:|þlÚXS“`ˆ4zD±“ã¦V˜ÏiôYbâӍë?†ŸySk#kMìëªV{lMpXáÚðʖì§êâXý½AFˆQ¬ä"dl®½u1¬(6ðùIJL7hxZnjY)¬¢à¿‰c-ióÜê!¬È'ƒ#Icí9-"'_üÏ4…óK’‡µ'ª!§bµ °4ÇÇâ|lNœ^€8´²quПH` BË9”š#j¶ÏŠ8M0ÝÒ>šú;¼4E±¶bfŸ$Öʼå#Ä°¢ƒÀ?p­‘õQlºÇÇJqþ2è[-¢Xß̛…$ÖÖOc?E±~֗%„7—Óýëf¤֏0ñy\9ű¾üíÖõHØ'À +Ñ Ä£’s#IäÃSË®—ÀÚëùßuYkøÅù¨O}:QyÏÌÝ 7ÏyÑX§>«`óXûՉ aõš–"®Ubl‹¦!V‡¢ˆÜ¿=s<„X[Ó3õ”´ æªÿ˜ ¬ÖLÏSâ EÇáØIè!€Øu)¡JN4]€5{º‹ÅÇ …5é©8Bѱó¿P'ÏÍVV„†Fl<&Ó ÄJ°éù–aã²^€õø‹Ò'O2Úp (ü¸Û”fÚùdä«Ø1 ·Qɧ½†gý&õô‡(ŽŸÎÜÓ˃âœIâç`Lö,3°¿yHð4öŒÚôÓã2|¹=ƒ›ŸÇ®Ø ”„|-E?$Ÿ†½¶æXúéÏdhæˆvùBÚkêI>­Ú7I¯ôÓiý;Æ=-h¨?~M‹?MÅxçH=ý6ï#‚ßv쿌ÚúíyŒ^­3-·6b/P/g_$Ÿ¾?MÝz駹è3K4‘ÆOÐQòéßéuW”|º|ófÜÓK¢­—db(õs0¦F, ù´ìõ'º2D{úÚL[U©Ÿ›ô¦Ò‡Mòi>]›Î%Ÿ–½ÉG ÑÒz¯Ñ•x(ùg3ë¨%&xjo7ŽIúiÖ¿ØžÅö¸`Ks/ø~G“o£e‰™y¥EÑøiŸîh“•()”Ù_¨O|™æ=¡šÕ;ˑ°BÿÚðüŽÔ;rÍ,üç™x¬}GI ᤙa¤àáÑk~~uÒÒØA|=-að™Á/Ëk´G )„í w-¼1c·{röÑ~ÇY„÷ïóÔ +Õcþp»œ<Ù{€¹Obd +I`  4Çêïõ%±‚3åÏ#ÔÓðé"SH+<¿¤°Îp¬þ´¤1Äá—L Ã:3™ Vd°X} +CۀkaÅÃjíQ&.Ž˜Gäg¯$VdH`&#° †V8Þt?%±"ýÒX¡m ‰ æÁøtãz—ÖªY+R48¬H +ðCE£Í[Úy„Á>ыaÍögk5ï Ïë O +H¼4ì‡ùn]ñ½ÀÍ}´ÜȀY¤Ñy±‰Ç–5$Psæ$Èó–3¦VJ°÷a¦¦ƒû'±³ÌÚ´MÅíHì¬ñ ҂`$"EãG"R䀛ä!j'¦hü‰üý£¶¥1 í˜ÁÀi`D`~Ï;ê-³ +ÈÀŒûgž{bÿiâÚ4íc«³/ç š>áq9Éx À ;¯àÔuÏ6†@”VO gl¯&> Y1Q<=¡ [¾ Ì(±a-#%Á°ð1ÎfÀÁ5‡×œ$0¿›Àˆ¨Eçç9SQ"<ü‡>eô‹ÌЬ—œ!\v’èÉedÖ°õ¨¼†v†6†ÓÄ& õڎ ½Ô¯áq)mx¨¤— 4-óGJ‚Òý£†ízŜšø‹c.þ!MñWác¯ú¢¤*OŸa蛩ïÍô#eyÒ#¢IЋ/…¬—Rh˜çK!Ÿ¤B2MvEò¥NCvÐ<š()$N¾ai64‘%FäÈ;¨hòy6âäë9õ’B\r{"žèäzÚ'Ç;ÖÐü|É·vM‰Ü…Š‰EˆŽ$g̋w¬a󚿺L4 \ÈÔ<@ó¶Õ4%Qa8X|]Œ¾ì~ÄÙ}l5ÑusKåØy&Fs ‚Ž\IBúàþÙڟöÁy€Ä¡yÔB…H‡‰l—pBªÝ€ò»žž“ÇîYvA GÇã€ÿ ìXˆã‚7€˜´ä+bK +‰†¯*ü¬*çÁ¾d0CV$^2H½ÁŽ 5›SAtl‰Âô(5Í1?uÜÚÙå²`FaÍ~¹,³‚’v¦V +-ÃÐ-yR©Ð&¹—Ž38ISÐðаÈH–¢v¥JT +Ì +|©-B¯Ú–;‹eÆtJ–¥OÏz“‘]ŒIZÑc–:=U,cÄ(¯m(Z¼eÜ<ÉjÖ°ðºæ@Ñ }´ÖFÅÀàöTÀh,¦¡õä-Óĵ½Û‰6:ܓh|é¦q`;Ïf:\X·§ÄñJ͙¿#*ŠŒRº®è™íÍtôJ2 Ӿŷç)ùx¿í™éîÚÌi*²{±šEq©rÔA»võMjmNë(qdOjEƒ¸ÆXˆñ}£¼T‰£¼( ÃЗƒQªF"Ô:¯#‹‚ÀFB[Òv‰3kQ„>ïӝŠmò󗸬!ïçqêÂ\áàS ò~^ ÷Põrš¨$‘Ø(%y]„Ú7ª‡e¸RD'Ü{Ÿ§'ù“Z­((q¢@µ_@z†fT§½êŠ„ç)ʞ¡šyÿJ04ø~Öʝ<ùÏc“ül;QËHÂt[àǧ–K™ —½ÔovI³ˆ2£½4nv½Ø͎~á3F–nþN/£Ùð7»¨q®ì‹Ìû¨Ò™"çt( ¹ÂáÈ9r…Δu™¯ßK˜Îʎ\09lC1, Ù£R†™5µŽΌ¦|æŸÔW8B3ì½hJTÌŒ©_/Á)+á$¢õ4)¿Þº ãĽ›œD0*¼ƒ¡ áہ +ªchLˆò\;žš: ÕlÀ ÒþGFB«Ð´!¥+B5[ ùh= èI~Dj¾d'd°n­i:+-ùÊ}mXå'§Ìîî4äΛ+ÜØ»Šð ”š“âxÀAücðQì<„zڕ´)ø÷»G¥Ô\@ Áɧt.áj.=ìðƒñ.3žç¾SÃ’»gè,‘K›·ürÖݖØñ'¯ªehR^Z1-mxHyi!4 »PÜ › ¹9āVNþ ä"…Š€øƦ¶á0v +Э[‘‚ÂZœVBk¤ý äü"ÐxFmÇ*?Êh¦T‡…¯ŒfQFì]ÂY”æÊÆoäö£ŠãBóº´G +%4 ˜4jSEML1îùǚPº—Ö év\ +À*¤›¸3% h“Úß*Ý:œtcM\-ú½š²tãü +1(ízéÆmÏÂÛöÒ ¬œ˜tÓ. íÒíÒËAº]ºA(wˆâ"@2á$GÆÂFÜ˜fÃó„á§ÒÛVÎÎÆ#âŠ‹ßÑäu£è«¿»5”Ëž7ßæ½´HR©±eÁŽ¯ŸÄv5í¼×&t´7½&‰ #RB÷ʄ +þ®~C7ß`¿Fm+'H˜’6ʀÔ)þ’P(Ÿ t{V‚"av ùʀø1|•ni±P‚v'7u8‚¢Kç#øÚy‹ö±êä±y¼Ý(쾫u~á^Éóñ]“ö¯à¹…Ðn×þ?öb‡£æc ®œv˜È±Ý¢ýcPØÃñ†c ÑþÅ p&® µç£üáH ›ýÍç#ïp CÎðõ]R (ÍòbNO^j—Ú!©Œ2˂SÓ¡&„×íÞâäÆ´[÷960‘M®Ý-C4Uš0³š”ÉÔ¥jÇ˄a³€¤o¸:xMƞ`L’lAe )î3áI•u9/Ž©¬Ë­ÎöTqRy3ݙd tjœ”_ŒÍ«Žš*6ÙôxÇÔ^M2öù†Ôæñh>c¬R½‹3-¤MïHt„«9r©óÜRÐ$¶}O6ӗb Ý?Œï_Õ°T²ÅÅ&cijs\"Pۈô: º½ãBïÜ4FzÇÛ0¯w¦}CXÁ—«åÓQÍÜ^·k—µ|:AÑÒÕå|òµ|”„¾C9Ÿ$VT˧“,]ÔXÎ'_˧ÃKo)瓯å㫃7”óÉ×òéx¥‹7”óÉ×òédJ5•óÉ×òéPéâÊùäßÓÑUß7—ó]ì`^-gxÜXÎ'_ËGéiÊå|¼h™J·W3)¦‰ËdÞK# ’hTŒIÜAœSη©+Ú"…–ôՉ·9¡b,âDPí äø€¶åÃ#…9aÈÕ¤ŠÙxL+¨^eÏ}‹š¢´ùßüMÉß"ˆÊA“ÏòR7CÊ;¨Tħz†G—ȾQOx·ö1‰VEÀaÉ;ºäÆ$V¼‡f£©~O•ØÉ òK°¬!me\'Mù%t~šhŠ‰vw³”¯™ºØìf÷VÏiŸk­)•Ýñ.µº)† «§™*»“ +ûÌ(¥²;i#V>Z‹Î¼lŠ Ï~U²Rò‚: +¯€Y4~‚—ç2â3õî 1Õɯ ©É2¦¶§”q<õI§jj*zÕ¡*¼šÊHe —X`œÓÓ.}mJ¾Æex'ð¨€ßvDt¯ z$Õ1Éb4\Ö£)ªcªk +ϊ™÷j +§Šõ7žKºFNºG^Íɼ7?ÿ¤†•«•^CåÌ{Õi ³ßë)º†:µ5…áƒRMŽGRâ!´»Õ¬¸¸‰daŒhʌ¯h|·ì­DS,\U?MNº]G4¾¿Ø›éöœü$ª¢ _'RP¦Nͽp_ÚaìžoJø:åK÷0$,‡´Œ±wèÿŒe÷yQ…=È… +öࢨÚ”p‘ y ¥{\ÀZëØë?ÔUí]µJ#BÅyÃ(:âÛÛ){#tÿÈú²ayœ„wÁýrÕz‚ÜAŠÈé3`Jò÷³0k£NÌ/J,¹“ +ªã)†þ+ió‰ØR´¥P«w!€¤Ë²N¢ü5zZIíÞç6¾´žöWÒæ ’®ø»HNºšT? +. zßXTðFï oL<ûË«ÅS"3&þ®Vq¬ÉÊ¯vL +)ñÊåyrcº¸eÄ%ðSeQ÷ðޔ‘÷æÖ48 %Uxo˜H¡B1ê2Ýâ½ÁýåÛ½7€E.eDC=Ü5ÞÝEéâíÞX'ðÞ”[õµ‚~MÞñAYEºê X-6ž +†V—"›”|EºÂ)Ò2¹êji_²c7¨à|…ä®rŸÜ´6цù> 0¹¨E)ƒXM=ܕYó¼óV²Iû¢4”±]$CèDK•Jü4'èŠ$â?•9²%~X1«@åИvR‘½_ ÛƸÖ)›øzy¿*üNåÉÇÌF2éé>•yÍ=Òöä+ód¢¸÷¬ÌM»~]ß»2ï– •y²É°÷«ÌCîî·¢ŠÊ<.°¢œ„xCe?Պù‘ùޕy:á]ªTqÞ½+󰀤òav}e?è¥"¥óºÊ¼ kM*.kêîPø¼»¥^PüÔKI­SMêåÛVUꥢ8.}·ªY”s¡.áRC‘TRSÅ" …ÖÓ ;”]äFÈeÞ+K7Xç'í@»Ì¯ÖaÝ|$R¬Í{ÛEŠµy¯°‚Í(íê¾Ý²¹ú'Üýpë~Ðd¯Á•i’û±·S»åTuHsm6¥(»ÝéªcHÛ67q »ÔeæÜ*5E@Ò÷K]&•Ø}yß±âun|o¶ Š;¶:.]^° +NþF*E³›õÙ|{¯M;Áf-ukò5~hm¤¢¬Um‘ìäqªÆ· PvxŸ"ُýŠd! »ɺµÛ‹d!”»ÉB@ê.ºØÍ¢¹ƒh£H_«9ÉêdX€¿»7ïGAQž„L»wQUG ›+t¢<ñµ¹{QÞ ¾N>ÑäM|-¶ç Ey¸?ªËûWŠòÄÜÿBQž„?M¥דÓq¡ Ã«¾ú‘L‹Usû½@O˺ì&µydT@R…ãB“¾ŸO«fsq…²ÖȄ+•ï©ŒÉÝ< »Øˆ¡Q®º–ø}H^à#<+X—ªÈqÁídØJÏ!†^Ô4Qÿ)¬Þ&£œavΓcjH¶¯ù”ûd†ÙN†z¨Ýz®Ÿ?¤ÒÅ`»œÍ¸¾²ÙŒ»Û.´vÌùô´âšöOñ+ÂĪߐEJ ¤ àè+Îdü²»ØW½†;­1¬ÛS\¿ÕIûù{]¹²»™[+A¶3²Å~OõßÚD +ëXkÁÁ° ++¢ö#Ýù»?U¶i£ íÑ"Wvçq °êø} +ck©b¿ Á°ž?¤ÊîrÕok…b¿m»-‰ÕTÿ̤°Îú6ºÒXó/ƒ‚$…_l$…*·K ¶.=qô‰f÷¨Ê÷bbïÑîÞ«þª*~ë+õ}˜Vƒ"*ê kF%ÈóJxÆÊùœUä÷ò•[û†ž /ÊôjÚÞ§¸HE2¬ÐÁ"ÝÓk¯bLxlMfXJy°JÉ#´‰{Ïözb-Wt"7À¨ðEɵ×Óæ¶äTgb*gR7\jÈTê¬'Ÿ;¨ž«:ëIÎð"~“SÑhEí UtWPMx¥+ÂÛànhª§aßæÒý˜$SkÕvåSp_SØw¥ÏFkaŸ˜•À¸íîXاö>› ûļˆûæöÂ>±ª>ݵ…˜Ò…}bn|‰ÿ[ +ûx„¡7/)¼[aŸ(Âe&Wö]{Hk,ì‹óp§çÝ +ûĪúx~ûö‰Uõ©ÍÒPØ'æ¥gLÜ;ö‰­0å ¾kaŸ˜ÊÃËR½OaŸXUŸNâjý +û.ÇôcQ ®-ìS[Ñî[Ø'¶†b©V7ö A)w`¾ª°ORë¼oaŸ¢ÝRØ'ua¿SaßuDÓ\Ø'_éu·Â>‰ªï{ö‰€hî\Ø'lfÞß¡°OLPLÜ{ö)VîTا⼹GaŸ90Uý^…}Še÷)ì«êO)ÞÅFtr6"F´¿’¶;§¤{š]öð˜Qª«¯ö +۞GÿVJ帡‹ßŘN(Ltï.~2*‡:RìfM¤âèÄO¸„E¢ŠÚ†J>à•Fè$ʱ¥†%“Z¡ÀF£d†Åm]5&D40,M}ªåÆ$ž›!-ldH%Ó§ZB~¢co2%=å£Àdò#;…Žðò®<öX“íÿwsó?vG—J}ýšæ’†×ÿïÚÉ±×¾é¤ +ÊÔÕô©Ê¹Pȇæúÿݶ^…ÞN§¦ÍŽ¬SKUó?e'$¤ÍÍÍÿÍF¾ÿßÍÍÿtTžBÿ?uá§]åwtù’üBj¨ñ¨Ü-ýiWáÔq±tՓ{¶ªåRé0lÛ§˜á¨Ä¥° šØòÎ{U5}j2¨!¥zGéÌÕŎLr£†$5H Ig¡€¡Õõ¨ faI¼ +VrÖ:±[­¤F…×õ•õeüT+ÀZ +9èªS­(åü4Õ©VšÊ$rùLj$ïSˆy{$öZ”¹õœa•€TõÀƒ‚'Žµî±”‹2{h³r¥=‚¦ªÚW²ó…°Ú·µ¹¬ömmîx½!„v—¾Ï§ñªløa&IͶ5Å×76岶m—ÑaXx™²-o°KemϏËûÆ°7;kW/.AUϪ´N5%¤àÁ«t´Y½èhjî-ƒ½ènÖ1((²é£Ýã +Э¾)(ÌfäNOM͈Õ³Š%ڂÅV»È~|SQB¡Îysß?Sï)ÕúïŠý(’¯¡,ÓîÒ÷OZU§[ÿÝÈntß?Å÷èû§"Ïæ}ÿtlÁÛ÷£Lß?¿6JMuÊ5}ÿtr}qaë?í}ÿT_ßK°n¯öýØsʏ¤‰«ºÚ@SV~X3J©Ú÷ceµïE!fàVo,v¬‰Öió¢Q*]!D/¼Ð] +Lk„JkMt}® ŠU ¤k©`A-Õ÷b…T¼ð*”Ž‹ýµ(,† +7˜Žé…§²–JM!•ùy(´VñcMM-š +W·6’µTQ‹ªòyYëžÛžQ‹ší©¦Êü¼*æW۞]M…T’ÉI°¯¤Ìá«McìêèÊâº4F‘{»= +Í]ên³.éKѐ}£µOŸ¦f˜ˆš2zZï~·jõ¨ޝên{’·j]¡ÙLšša*5t_Yw‹mT6µC§¢[¹îŒI}9¶\Ý-í.‚‹Q ‰#dtBX{W|n疞lÆ]~ÏæeèÌ%í­öóvl‚O…WTjHv?șלxÌQòc>gú¯ð%Ùıò*óš£á­÷Š{¶ø­é¢ÙAO¢2Ï*]x8£„”6©BÄ ÁjZ?¥ê?$±ÂÙ<’;Ÿät‰‚¡ß‘Äj.M] ©ÖtV«Ž-(ãˆüðbXù5rGsÈÄuXô Š.­–ä`%† Dvâã•N„…ˆ8…+ñW ¬AÓÿ%7Æ<·Â⼑ ւ1(µÐ0ôÅ°êP/¼p‘Wê)Äڔë°Xy“ÆšÏwH~â@l„/8ØOtUèÙöì泀Ä{¾,!ùž¯÷$ƶhZH{t{Ês'˜uÏ/TGÙ`ã⟧Yÿ2{ò©ÌÎt XQ8 ×lr*4U×ø³°¸Jٙ"]u™¸%9&ÄÐÒÃʪ©¯R.®:êî՘ù•Ó¨õ;åä·$—ÑlxÃjiÉq“+^¤yCyœB&(E'Ý?ê¸J8Ó:CÎÝ k5· ”ÓEØžQMxM9`Ü°¤ýËÚÆE§t=¢‹<\èÊ$lüHx^¤cÌu–^Rq½·’çv˜¿×M”=§^(l®¯ˆ’uK« ó·\±«ã*$/î½»ªìN<þ§(ª*I¼Î#ÍÏRE%‰·Þ®+vߝN²nMɪ¹¼ïNÆ@’ð§ñSQD‚µRS‹aCÞ͒žÂæÚ:Uû'µ¡© —rS?Þ؄1eŸõ)”ôÀø÷ ËðA»’"a°ƒyu¥cŒÚ +Ú.ûxÜЩN¾šJ§©Ò+¢é*lLÂú›YAÎ笨ªóƄU0¡olÿj¬K\UԖêð;ºdê•:@+¬!ȟ”K…Ts„  ´N´ÍŽhJ„Ì%¿2Ч̍DS¬&R?M~ôV¢)¶ÒF´ªÿCÚE³˜ÚÈíʒDµõˆJõ7ʅjªêåRâU”$ª­GñCk)IT[È%Ã^U’¨¶‘rw_]’Èã+ô"çV[I¢ÚzDD´ëK9’ÊK¿ÒKkI¢ÚzDΒ¾ª$QbLõˆ¼¸'5¢ËyÝÞ¬P§¾IÝ-Í +ñÙü‹Í +/ÝÿJ³BR“ºû4+¤+VäՖۛêþyÑïÞ¬ðÒm÷¯4+MQ¼³Bªþž·4+ä¹ం’⩤T±,ÝíP¾0FCÃCy—„r¶Ê†‡ênµº¹á!6¹{Üj%ÕðPcÔµ 廊9!¯jx(ïB’0ص7<gAù[­®hx¨‚¡ïÑðP>݄stÝØðP± ìN~`Ùn‡ÌyssÃCùÉ ½W7<ää¢Û!Ï×yKÃCù)‰&Ã^ÓðP´8Röúvõ´Q]½ËøÓnnx(oa¿±á¡ìɗ¥Žµ;4<”÷&ë4]ž%ÓðPÞO»¾¢á¡XÕ&·¯ç4AÃCy(rîM å¡ Á=ÊÇc8÷Í å‹yuÂ"ÙkŠ(¡X·CÜZƒRãꆇ‚ýHð»âÊíÕ1ÛðP¹÷. å»r }cÃCùoL¹½­á!WF&Ƒœ3E[ÉÅEÃCyRÊíÊì¹ãÒ§2ô­ÜðP +«@ÝÚðP}ŸÂ›²PD·‘æR’‹†‡2%Ê©½s­ åÕ|8›»4<”:ÖßD’ו‘©Ðõـ¤Ò~Tjx(»¤%\ßðOp¡Ayª.ÚðP +žgsSÃC)(jÛïªlxxã— ÚZ^ÉÞÖðç¿èvHVîÐð­×’í½zsÃCyåGŠÓ47<”ïv¨»ùº)ºáá­ÞA• ÕÔâÞ¡á¡|·Cæ>…W• EçeÃÃëKõ±n‡8š›^º ñn‡¬„¾v?2 å³Ç„ÇÚÕ 哨„¨«Š¬ ÖíP’hZÞàëäM{ᕔíyCÃCNˆ‰u;¼>EQÐðP–-ðæ'·5<”×i÷ö†‡òEºÌ!}sÃCþ4…Ý/õ4Õ·pñJ«F´f£p —ʆ‡ê4››â«y¯X¹¢á¡üY!D®±á¡üYAën‘ã¢/§»Õ;âi$±~¨Û!…§'øZÚ#,Ÿï/(¢ä±Ëi\ø'ñ¼Ã«ô)WËÂ;3][Ž6„»>²$}áY«UXæs8x?zp̔õöÁ‹‘pw—!ê-XÕ¥7Ö%aÙèÝ_ƒßwø)“‰Õg¤Ñ±Yœk«9³ÏÅÅKÚ°?g‚úÉÌ>SOp¬hªÕ÷ÍÀ~ك}™ÐÚøŒzÉé¢KËÄ<5¼õÛ ãæà&M^ÿâlXÍô3XÛZfÊUõgÇÎÿâjT!©O“íöaœÏ(¿À떯ÐïÛLî5‹Õïq^Zlr@ĉQ"|ÊÂÜÁ\ŸœwQ‹ÑìgÙPÌñªÎŒkïÙLÞÛÎå’öp…{ŒZ{èmÏÀ¥ú‹Z<öeVö†©XU@óJ¯·ˆ¡Ó•÷÷‘=ÿÖ-ÂO`ί+,%vPæ"Ð; ӊpŸ,0¿at¢ä²;à23Ÿ<äs4 mÀŸ!ªE²§´>;(ac0ƒcmpßd]Ì/I7™÷ÖÂn‘°çOgÒR,•<óÏ:ÿµÜGw"dEC…£ûôزžXöwâö€ÏvìÁĘ}h˜gY'÷̛éw’̃‹°‚#tK? m^¬@xl—žBõqÂ~gç^†¡ˆÂÐõÅ>sb€ +»(¿sÓjSà…€•NkO1X Â*K»/ÙÑáøš²±C!w øŽt@:ـ>Ï0b(ÃPè…Aë€|¯u7äÔÜôÚñ ùŒ‘õ ü9ð¹k­¥ü¶m·' q|j\kÂÝ«r„chƀ"Á¾3çžÄMÑÅÆÜ!ãyÿŸ  \ëeT_V.GÀ7Y1x͕ ™ +wÒZ7"á™2ÏÛ¹ÒìYOKí^׃֕šMÛË­ˆ×ºh^êMüìì'Í)B³Å´îD <4ÓN‡^d{–¼`ɦóiæG0èõ]6H'RLÁŸ]7ýóå€`> =ìp¦àЫ&èá,g>|{N½C½oDŽ¬ƒŠw\Û?ѳY®ƒhŸû2a_86Z¿³?A²žY… ǎdûRSâþ¡b)˜? lñ®‹ÑÍ2§!á)xRðiâa>ͼÜ{@o‚žþüà œÞH›5 ½9aăמ"pi3>Óè"Ê{¬×g@]  Si½¾Å#ì<»ÎÅ¶Oò¬wüüuõŽ·a^ï¨u‹zgØ1қwí-øä¬èiß\o_ù«z§ÛüõªÞ¶7°cŠ@ · ®¦…ÙÕµ #ƒ j‚°¸»e£E' 9Ì(sJ ¾ä{~‚Ö:X $-Zd€*"ô¢m.èòòæœ;#:Y éD*’ŸPëÒºP±Ò¡Q NÅ-Ó@‰`vtp0^ ý˜ïB¾N‹%ʈÉ(šˆÅ“FãÌw)$œ,ôrIJ¦xpU\¸èÞe‰\9¾%À+uŽ¿‡Ó`ƒâ´Â³ÍV6AÉV¸‚ˆ- `uR2•’Á»¨›§¡·bv¼LÏ]gG ‰çd*:—qZžâ,j$lBŒPZ1PÐI8­•Ÿ³§Mîpxþ2áê j¯¼³ÊGћmOýœNŠ¾ƒ k €ñ“Àyú +oƒŠTøLqµ©ï-cš6úNÿ܃ÙÍÔN;¼+1ªGx—Â+ °%…|¥Áš2q)-~£ãµ”p$Gf¯u AÆ·€õZp·Xéï&{ýÝòÑ–j`u‹?&Mm,8qt?×x<õn›€£ÉN‚ˆ^·——c •Þaázl³êè'ÒD)`­:/p¨ðY]ˆ…[›®~ëÎSúß!Ó0ªÐ§Ææ8Öüa¯oh9`D;ë!b=EPÿq`‚¤Ò3W£D ÜppCi +Žš)Ÿ×}}ÌÁïf´NvDK¬±º]‚¢CîØbéðÁiäöØyPg‰ ¸©ÅÁ ‘¤ƒ/Õ°Xh:L’õ˼xH«_–K"ÀÙè@õñ@» c­°t(~ºÿ:*˜Jþ£x9T_rw¦xÏœ_õš3˜©;0¨‘{ CIÀM\3UŒ.ŔÊ •æ‚]l”P5œ#4LÏ0SµQ7L¨£K·`E¸åටÌD,øŠ\ÃÚ”5Ä­C 1 Žšba:]n6A/{ G ™AÈ *Äß Ñˆb®5eïÉÙð_µR÷@Q·þ´3ìê÷> Ľw=§á2øjN‡„ëJ§‰ì}­œ†ãZNÉq |ïKp 8Œ nÅöí5Ô´ å`‰v «*Jˆ$`\)1ìƇ³¹jE¬ÜŠHî}n:êŽ.á8n‘ÆlIÁ,Ñ´N„Ûd*&‚AI†”S=u‡´ÞœûhÐ0¼Ç!†íʍŠÒ6Ž=%‰!?ÉsI :eˆaÃÏ¥+E§M {ʝK6yÞT%:mÞLÏSÂþüc4[¡B<ó¿9´åŠÜ6ñáöÔ;ˑ>4Éûzû—«¨wÔ­dÂьr´Qv#{Mm—{íÈöƃähĸæ^·Œñ܂^c±H )íÞY>ºÐÏ)ßaq¹ÑŸÐB·ÐŸþæð‚“¢•6ÎÍ{x~ÑNÿµ8iËýYEª:õËïNôD{j€ù͹#‰â´ÔEŽƒØŒ™¡Vl¸}š²øƒŽ‡"eð-ïÅ3ƒ0QÅú’o» M›BéVÜØ/¤8Gê·ø ¤z Øg¨9øºÊ¸² +u‚ri£OЏóB-‹g:|b=§ ;åÿœî<T 'ËF¯9aeª tÞ ·¾‚Y/ü†€•µÏW±Žþ¤á~õzåz¤us:ÐS¯51XÛ. + a5† ïªõ”wD¬C€&#ތv,éil¡ (gÊE*ü@ºÅ@ŠÁ£ƒÅ*@HÛpŒÛ;±C0Ññ¿¤CŸ3 Ú^k¿¥g˜Îï6h|Æx|L9­çْ™ý;Æ2Þ\ñz›Þ]•rý’‡rWå¾êúÓªã¥?C´[½yëdĤÁyóÞ\ßwÊàõSd߅ìWïhU%¨ŸÎMøØÚeê}Ü;ŽÍþØ~Ö90åÏfü®ÏÂ}ƒgF3³r-léׯïj®RÒ·¸€ ›êže3¤LXæãÊøžÎ¥9¶o>ݔOÎäíø)`Š ô§Üä—৏~ïm§žm’¹ÕãWºÙþ0ç§ÎÔ;ò(¡Z`Î;xÚ)DÉ/r÷+jr*B¢]çWÔäT¦Z©÷+jr*¢}s•_Q“SÅo®ò+4Çÿ›ÐýŠøèwó¼šê‡ßÅïæÁ¡û'¦ûǝ.y<ÍlKæóöüŸrÛ¯óz¾9=DÜéV¶T +ró¯ílþࠃ/!V&:é™ÐH<<ÎóL"FÌä¾#…eÑÐ|žä¾‰^ó[R:Ì®½‡pèׁçê“Þ1š ô/ÙÒ[ŠGü³Gùk¨h¹h€Å]l†Üü9çíµê»`"?MdÜ.Àø[þ=3o¦ÜÇEÜ]L÷alò­•rŸˆ-réÐaQ^6æj‰¸ádÒ[ã/~ÖC“2õÆ\Ø­wXS)øuYoo<¾À¾ÀIè֟Qþ~ʙ?هñXˆ:¥Z›Öî_VP>;Д”.X¥!"ʅCñƒ\ÅTcl‘fvŒ%ƒ †© +êBցG¬†8öBÉå4P»v¤}€­öwF[ ý©6"ʅC©Ä¿)"ʅ/aþ_‹ˆrðOÈ¿å¡0”ô¯ED¹p(½D” ‡ÂÙükQ.Šï›»GD¹p(<Èÿµˆ(…¢ˆ¾wõ֗¾…¢çè+°Àü²&Ûzëï*¡wnP°Fà1adášÐHèE{îQblž4r¤Q}¿(…¦µ£ßšìL2‰ßÂ%“°zˆ^÷³‡¢ÓN‹N¨Ã`¢³·uQI$æ”þ-=Y—Y±ÞÏs¼äþíž\”øëˆÚQNiù²X=<°‹^*€:MèÀÉYZ¦}Ò[A eQŽ °”óyœ.3«Ç éq Csք#X5c&°Æ ƒÔPJåA Sú³§Ð±À3kQ‡ZŠƒ†.üh/”&4”›Öˆ€!FIRL~:^´à;VUÄ%ÌrÙ°@¶s2ew kCX[Ðw–ÊzËlì°!t¸Pf¾A~…+1̓åÈÂx½ŒaÚ +.1½fB¥[¶…/Üê¬aáVK¤çã…[ƒýSƘ“‰×fÜÙ-xP⡎*ÙÎÐp<ÒÕÝ¿‰Ni ÝˆÝ™ïÞöÌw½ƒû·¾±sÖ b<^Š;£ÝG +᳋"gT ñÙ+Hõ¸¸Ø@#Ÿq-µîAkO,Š\{ªc©žK‡!N䖢‰Ðlj†#¸ƒ`Þ©ˆ¥JRY?«lAΡædé@c¥ +Ѳ¨ Âóéրr2úzRHå”…uªÜù†È·ÛV*¼òԤ鉝¤¶=r1ˆ`ՃTõöH1Ùô* âp{ðCºè?¹:q Ætøtۑ0]Øíì!-;™Aì<Ò¬%#„ãø2†œ7±Å—óÙÅQ +G#˜Ý쒃_ÉRÿ³XOá6:idK z ¤kr½ÛÐ`ÃNý—?—´º¹ó¤PÍ~–©âÊH1~*è€ä°¤‹ö“Ÿ­ƒàÏ>eF¡ˆèZý>[öÓ'ØO<úé²Áž[/æ_€™M?È:ˆ•ÃÎx̙ûGsþĂj>“µéú þé½[èبý?yñWk ?üÎ/oã·^6g[I2_{cb§u€˜O£AÈ¥.Öýѧ÷!µÞÄ+]‰H¦ið&^éJÔý£Í›x¥+¥.hð&^éJDî•ÞÄ- …Æ w´äñŒò›ì_?¯ZóÓy‡^ Œ2óÅï¦:ùï7žê?øüoTቇü²:Õýc)}m7և*¬µ¹Ó‡Sî÷ëô»ÝLÿ}ˆ¢ïºµj§”{ˆ>ЯÆ,`0ļ ¾·¢ëq¤û‡xHúÿØÓ;ø¹ÿ!\aO8ì Ñ€ÿ¹|ހŽÃRÛ.“ãïú¡~˜ló‡ ¦#ìsV+z¹û¿!„æÍ`ºE 0Âÿ¿ÊàÓøî?â¡ö0ø$f:ð ó‚®ÀƒÓÿ֕?àþ®²{ý®pÈãßпðø® ‡c_±?šª ræw1:ü.~N£¯íê¼V 8 2X9Ÿ/=® ­7cóy\Á˜Ñ`hTðmü3ûKðÅ·Š!¶Ö“ÕJó =>…Œ/À~„T D~/ú;àw|Aû…/D¸‚ADCÆ델¼ÜŸ4(5c¯Î¿O£×ÉéG͐«z[]†6•žFO¯“ż}˜ü®à.['ÿkþ0Ùl¶§Éi¾‡ùñ´=ÌŽ?ÛÿÀoàØ€=[FÔÿ> endobj 6 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 50 0 obj <> endobj xref +0 51 +0000000004 65535 f +0000000016 00000 n +0000000176 00000 n +0000046761 00000 n +0000000000 00000 f +0000000000 00000 f +0000175934 00000 n +0000175867 00000 n +0000000000 00000 f +0000046812 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000176141 00000 n +0000176172 00000 n +0000176025 00000 n +0000176056 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000048487 00000 n +0000176257 00000 n +0000047167 00000 n +0000048963 00000 n +0000048784 00000 n +0000048671 00000 n +0000047428 00000 n +0000047925 00000 n +0000047973 00000 n +0000048555 00000 n +0000048586 00000 n +0000049037 00000 n +0000049233 00000 n +0000050430 00000 n +0000071235 00000 n +0000136824 00000 n +0000176282 00000 n +trailer +<<0F2930700671ED40AEE68045EC3FA770>]>> +startxref +176470 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.svg b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.svg new file mode 100644 index 00000000..f6b73f82 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_orange.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_tests.psd b/plugins/net.mograsim.plugin.branding/raw_files/icon_tests.psd new file mode 100644 index 00000000..f81e5905 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/icon_tests.psd differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/icon_white.ai b/plugins/net.mograsim.plugin.branding/raw_files/icon_white.ai new file mode 100644 index 00000000..de2631e8 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/icon_white.ai @@ -0,0 +1,1225 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[7 0 R 6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_white + + + + + Adobe Illustrator CS6 (Windows) + 2019-06-22T03:02:05+02:00 + 2019-06-22T03:02:05+02:00 + 2019-06-22T03:02:05+02:00 + + + + 224 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADgAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FX//2Q== + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:A71F418A7C94E91197BDD9C8DFBF9319 + uuid:aabf7faf-1f61-4e96-a376-801cfa691496 + + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + xmp.did:A61F418A7C94E91197BDD9C8DFBF9319 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:A71F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T03:02:03+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 512.000000 + 512.000000 + Pixels + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 9 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 512.0 512.0]/Type/Page>> endobj 10 0 obj <>stream +H‰|SÛj1}×WèVž‹®` ö6.B)Ý·úВ”?´ýèh$e×n¡]æ\4»û8ÛÝý öôn¶mý~=™ÝûÏ`Ÿ~›Ÿ’‚|h9$KÁ~»˜š_L)2½ÔÉGrHE°ì³ã\ãæÑ|ÚÞç$5ÀyĸV™"Ú)ƒÌrG3¦ ‡HËm’ÛzÈ|ÅgJI ÕYy” IN19}ÏÞ1-O!¹^‹ß݋»f6CN‹ipՓ™¾Öpy4EIÑeáÞe„åböpG?ËHËð²†$#Èþ¬±8Ãay6Á„`§èRNdûÔW%H¢Æ3;âB¦–öYƱAjŒ­l…™+Z v¶æXdp‹}i{!ô<ô¼ÓÕûQâs_ç†b¥< oä£ïRs¯ñ+t‡£õ宏 G9ɽ€+?ÅO½fîùدqYה÷¼±·Û:]ÛKÙ; +, +Þa‘>l2ÕA% øØöÔÎt-UéÆI羞þ–4¤T+4ïõÇ}Z®OZeT»§ê»O3‹ïÒ~¾ŒÿÓsC…î[>ØTàažœ¥¬†Mò¢Å{;‘X’ƒ]¾›/ûëÑA­Ã^¥tõGg©Œ¼vÙxÓ]ÇësoÕX±»´ß°á·n–æniÿùY=ý +endstream endobj 13 0 obj <>stream +8;Z]L!=]#/!5bE.$"(^o%O_;W!8uZ9(]Y: +endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 7 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 5 0 obj <> endobj 20 0 obj [22 0 R] endobj 21 0 obj <>stream +H‰\“Ûjƒ@†ï}Š½l.‚§=$ Bb*xÑMûÆS¡®²š ß¾ëþ!….(|̎ÿÇ0†EuªL7³ðÝ͙fÖvF[š†›mˆ]èڙ N˜îšùNþÝôõ„®ù¼L3õ•i‡ ËXøáŠÓlötÐÅ6Aøf5ÙÎ\ÙÓWqÞ°ð|ÇêÉÌ,byÎ4µîC/õøZ÷ÄB߶­´«wó²u=7>—‘Xâ9†L3hšÆº![›+YäNβҝ< £ÿÕS‰¶KÛ|×Ö_OÝõ(J¢ÜÓ´ ½§8• ô¥è‹9( PR ځh’ž’tZ)N}BZ Æc_Ï äIäqäIäq JAH—HçH—HçH—÷„H0 ‰IpLBb¼ž¬å O O™IÌL`f +3°V°°V°°V°°V°°V°°V°ðTÞ3Ù˜ òJx¿÷ XWÄm2{ì_s³Ö­ž_w¿së¶u†Ä8ŒÌu­Oð+ÀøJÏ +endstream endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <>stream +H‰š a{ Áÿç÷  J `Já«Øå +endstream endobj 26 0 obj <>stream +H‰\U P•×þι÷"ˆâ‚ˆŠ>|î< *QD À`•ˆ¨Ñ +¢êŽ5&ÑZ·£iâh´".5“¦:‰TLB÷b\f´©ÖFF¤1Þ{@§múîüï?÷üg»ßY.@VC!jâäç†uŽÌÙ#œSòxf–-rlŸß ž@› %³‹§íÉmø_Î.ZZP÷hÑ! Ã`dsa~K/Íý…Âð?B5²ÿ@ö} ‹-¹¸í£e²ÿ+*š?3WõɜäG±‹s—”tÎiû°[‹¼s^nqþ¿Bc}²ï+þ›Jä—=2 8Ðð?¥ëi,øY;­áeØÓ·ÊEw²,n£Ú2[¬õ 1§±$I¬¶•iIN$Âišõ}{•œ¥‚g'‚Œ1¢§·´xG°¾ÝCÞ½Tzæö³çë­–ï¶Ï¾ÖbòÙóô—!ë7­ÿ”öôY¸ŠblÆÛÂNçQ!tþU(e![ñsü ™æ[á†c/ÍQ(46:¢6­Ä^b°hÅà +ò±‰ãT„na0E©JZƒH±’íÁ±8ØøËþ8‡qœheàœšáç6Qæ;:­kMöP7è#¨ÃCê£a¿f֛]æ]´Ç÷*ÌwÆ 5Å¢• c…D°²9ž?5oJLYC9>Â9ŠÐÐtÂ+"ýKìÀÇøðîQH«é +]µà«±kÌ8“gæ#/#«åkõ£1œ£rÔauÍ÷ûŽé%¶3P†%XŽ_c*q ×q“ûsgªÃèxä OÐÜ*1U ·É¢)–i-â2­|5RÓÁ‚`j+ú›±K0݇£¨ÁE\›ß +¦ŠB)‚2i­¤×i#m£}tˆŽP£ÎWJ©_èÏt£Ý`üÍNS!~{ §ÔÆ ÉL &H>ëñ@Î7˜Üô]æv+Òí|¶=ܼdÊÍYs . Ùx$˙Ó0U¢^Š×pŸ‰n=Îã¯ø‡ ¤ÈŸ: NrÑ+4™K‡é1ù¸«ä/†‹ø_Uª^OÕG|'ì`û˜ýØ6¦ÒxÍSךßâ'I2ð*J°°5cŠŸ³¸‹oðD|8¨·ÄšJãå¼;Äþmj–ròãU|ˆŠW›T­Õ;ì—íb{‡}ÜD›4©-%ŠhY±RM™ÈÛkͽ8(™9.ÕӀGԍzQ£)”E*¤ùTB¥´œVªt‚NRݤG¬ÙÁÁ‚SÏä5¼•Op 7ð]5Ye©Rµ\mU'ÔEõ7¤Ý:J§i^ª—Y°”£«_]sHs±/Ï·ÓwÆb'Û?³×ÛÕvƒýµ 0Ÿš{p JbÌÆl‰q¥œ-6â}©ƒãŸq’óï Em©»DÜ»5oIwšD>•²©@V!ÍüWS%£Stšª©–ÎÑeºE™$ú!²FKdrœa'W²—¯ËzÂÿTý•[ SÃU‚òÈiÖ©7ä›ÿ òSu\­Tv#•zÀ—9ŽVrýŽÃ¨Z¼…©t•ÎI<L'¥Ê‹Ñ¥Í.G¸#œ» ¨§Å¿Ã‘jªî¯Úa‘ô8‡×²ûéš8U*­LÕónž¡vé-:®¡\|‚éŒÁJÜ]A©d(RÕç[,Z~ªÙ*æ@³Nß·X]–9O¬¾¤zHéÜUÐÍá’}=”÷8éÀëRùÓTÄè;jÿ„o +¯[©ZÎxE|’öH^b¤P:½«†b• +£0—·¡—p©çLüÖP°tn“ä¦/@«@ž‰«œ-Y¿Hx­’:-Æzz nòÑiÔñfŒ |õIs¨o SóCªR©¨¢&]«kY‹¥jA3J¦G¢TÈ^™™Ò™áª¿TM ,vKý¿*p:òZÁE˜C;Ô7´Ç`"òÕBKÛí'zŒ.ˆýA¦I’c”¬8+LGë–;$Aªq¶Ü1…ú¶µ¦…VWÔ÷&ۄÛ3¬öö-,tReº­—^JÅ êJÓi’6<^3•|Tß2!ԎÂqÉH‡ÙRõ5N*54I*|º£Â÷Ž^¯_׋õ +¹›šdj®ÅìÄå6ù@î­‚ãAsšÌž9rGDaž—Ó%àE™Jãä[:¦È<õȔ,À<”Êäý-¡Jn¨ñ‚ÇtÑ+À\á/”j9VIÿ¯Ã™Û±—ø ¿¯Âù >Ëe<7pC}®i +®ê7u9&£/&Qgñ¶©ëŠß{ígûÙ/ö{/þz~Žóž_b'qB$ä£ ~MHF¥ã#e6!•C@@7:R[ÚI„MPú`ÒÖ?¦}HÕ j7UzNYê„QåI¨Cýkü±ibSÖ±ªžV(+8Þ¹ÏNJ¤iÚÍËÉù¸¿{ι'÷š¾”Õ Y˘Ž!Ói-£¡»Aç•|ë¢q¡À£ý¹w@;0µ/cÚ¦²t !ën3C¯,…¿arq(óÚãVÙf ‡(T4Œ×óâÎÌãV•Òl怱¤q$gŒÀÒÀ‰£»XœÉfL|–TèNè®*û;¨ SMîyÅdµAí°ñ|B1L´ë¤:‰èóåÛ(2¬ãM5Ó²–ÚÍû‘±ëä{’®Hë-m­y^¨86ïõU®æqæàšÍâ¬î”ݵæYLiOAB˜Ê´H2쩇’ƒ=ȘînвF™ "GLv(gð}TOǛL#¯)Æ= ?]¯™ªjü=DYš'k©öUÞL¥Ì–š"Î!ˆ)`ÜjÉ]m­/Èí¯ÀpÚ¾ÊöµƒûU•ø|AGûA0gvf*²‚ö˳HoOeM’£–ÅUKàYj™Yµ¬ ÏiÉW}fLWbíóñÁÚáÃ}&þóÁŠ}t·6ºsoF6rUߎŽ¯“*öž5[•3k‡26™T9"Û,+$å¾µÎTÈp¦½>‡•Ô +Nd¥¥ÁʈÉç¶WhÖ­ªÿç Bù_t”õçËaU˜f_j½üÄ:y<ΰ`{‚ŒŽï5 ÷:ÛT Ãє#gLÊ3û5…׌y¸‚$ŒcùՈÊ çesäB6q÷A¶4˜×ð¹yŸÛ½73ÏÃsçÜxf.7C¹Ál¾l™y!ÝÒª¥J*(T@£}®Ž´¿<¯#4cYí–Â’§ Y:ת£é©èøÊB k!.¯Ó{Å¢¯ö¶ƒÎUÑÍTz7U{»ÀÂSËÜ{àJC•F«ÆÐxæñ|°™U0ÀbbÍ|U{YÍà ó[ÚI‹1Lj ô2§£YÃPàGƒù§÷d*Üoâ J­Ïš0¿iQ˜;K‹¼9³&0ö{5jHÌRQ©TôF³Ö ‡Eá0Àfá6`?ÄÀ9ÑHÞá,`î +성SƆܘ9›DX'ÕÍa$¹¾új8õ ¿Ü?Vꆿß?ƗúQº¿ÔO7vlT¡QÔCvôH±->Òô)öE„ÉäÊ#¸»ý^.;ôd3×Â&ä­u‹A‡ƒáCÁÚÀÖZfŒek/zâž½±€ÆÒºâäXi¹Ÿ/òK°\º_{{1%;ð$îÅî-›7Áÿ['\ëý"ýÏëÐâÉIÉþ_$9¯(9_x’èåßÖñݘà]š',¸¹+…K—W +×9· yâøé„qÛÊ#rªŠ¶™%lD"RÄN³¢#ä u»4àõÁu‚ HÝ¥<¶Š÷>Å»€-¸ëÐú qºDWg÷±«“$ô¡ $§þ+ÚÏN¬”Wލs ½Ž·_ºŒ·ß´aO|eТË_³}·ÕûX6ˆ%ÖփzÙü;Á~}¿Ì¾îzý!þ1{¿ÃΡ9ü[|ýþÿƒ½°!‹=ü»_Ù<[Ñ[À³ºO¸®µÛ°í–PÀWó¿§ ¥ârq µa#Ç''á-WÙÞRq¿íviŸ ’›üÜã÷ +ÓðE¦QòqæíWòyÀM+ÿÕv‡¡o¹vüî{"qk å»ÈV^žms5?ÉßT^FÉòç(¿òçsQ/ëuyÉBùâËwgë¼mtDKù®®53Qo½7.uÅ¢"ڀ“LM\óªbë#2LMdȇs¼RǛ ØáiµÒi¬È߇ؤ!£ŠŽÐ[‰ÐÐI}/ÙÀ'ÂRH +JÉ/1Ž¨\'ÇäzÙîH&š͉–„ÝááÜ˹8'Ç8l‰¸Ð #¥6¢ã”£QGmövk>UDz$Áµêh’‚†)Iµ@KF=Ն{oPÙõ€«•Òþ˜J ”c11/”ê:0IT"ó@$7­Q’ôk€bóC?[Lô¤ÛÜ@‚”«óK*äS=ŒÏª§£êÓÄÍ [C”TЭovx+o“ øººxëȅ‚ð9;A“LhqøA7o»lwNüÉÓßÝP7ì 7ú ±m|p|¨EjêýÊ÷.¥ÂM½Û/\$üh峟}û‰.õ='>Â<åãoôï9õÒï4I[¹½8ÿÒ́¸Ô€ÕEÙ¾%ëŽýœÍü¬è’ åºOp +ëòq‡lg} äÄáŸê,Ïq>þÖE¨†ˆ†à\Õë¹S”ý 伪½ÖÅIÄ•œF +‘›º|ñ˜¿FŽ¡(z߬dœïb?_*òËÖ/áx‡z_{ÛØ¿·ü›uÂÆ4iEYP7YÅI[§^˜ÕRÐM¾•X$+}ƒR¬¬üÓÏú$·K²?x¸/T+†ÃbmÈÞ±Ç! ¾ žø%x✥îΓL*£óÍ5B£=î–eÿ@œñ0ðڝ@nÔ^úpsº¸¹bìØ(ÏÃÑú³Þ*7tn÷½â=›<Ût¶ù­¦·š¯rWZØÑìâzZìÍZK,åOƚ4Îï¡ #}"ƒ_ˆ¥ ½ÉÕÔ"†ŸMYtÕ¹z¿ê[æ^B,òਤWXÖÍE +øßW(&tA½ë/Â@ã“5ä›ð 6ý=ä(jÅ?X=¨üýezN€›‹Å4¸|‰/âªgõ,¤+8m´¾A •D@ ë¨Vtª÷ëXlR=t§OW ÇÇSÙnÕª½Á@@íjèÞJº:!‹NGµ@W˚ã?|Wkp×¾ww%­´’vµ»zìZ¯•%Y’eËÆØ ‚DE8!úÙWÏ0HYüwÝì®·¨õ‚ ›¨N§–÷Á›‹#á,>ß/(eÆbû×îøFΚ®ƒýFFÓ#ˆ ”Ø“Ô°Ãá'òRÇk0{  3\ŠŒ>+¬¬j¢Ð©°¥3Ø1=âcn[„ªI5ˆŽás‚Lð3÷wÕo=síýÕ+fêQà^ÛûÒÑë×m`*î'˜d6åځ }'¾®ŽLÑ\¢"þò£·_xïÁã¢Ê°¡'EÈ® +|RŒ*p¯n-ÉáÉ!©_óGò7Ê_ÒíÕL-;ƒidg3-¬1 Þù Žï¡Â^<9œÍŸÖ-p‡o‡Y[¾ù Ã0¬ÌÈl”‰² iºÔ(µJˤ5R—Ô”úÂg¹³âU›Äak +£ +F´¶àBm¶&¶*µ²b_h0ñ™õ’å²UlaA\‡”ä€Óïò¹Ác ¡°Íá¢\‘¢Ê“@SqSiÂà6ÚmáJ葞¾²zš6eñݨ— %õf›çoÆz”ÁDE‚I¢þ„&¡0#+µ£?T_aÇv¥rOÅën[‡t!¤Ñô(XÑ`%RëaReB¯d +í$ƒ# ¼ƒyÚhµq6ʘd:J¡,~Ww¢¨4ø¬ o`–ÒVdMž²×ÆYêk½Èæ9Eõ1Í"†/¦Ä‘ïø‘’ ¥€oˆŸœPÄÂ/¡¿qÇTÞ*h"ý2¹ÞSý¹dåN¹%ÉMqÔEúŸLT|½^µ„ýÛÅÒfÎlâZ$ 2›Ìœ©•BÀ¨à™!¦Œ4/ÀÆXÍ¿Cºq€¦Á>(º3ˆvÓ¸n§_¤iZ•à×xüóÃÂåt))µiÔ3¬B›»§ ÀsöòRxvO! >ãñRܶËÔ"œ”]¹“¹“0¯("“ÏUºí¢GŹŽ"ðýn˜(ÑÆü3‡î@1TƒÕì5mô–ÓQS$P˾qÞPFè̺֧Y8¾Á™Íßԓ|è<ùKÉÅÀEíjäJ‰)ì,q};Øi*™LGZJ–ñ˔¥‘ç+x“¯ôU’iˆ àDm‡-n´ôá)NŽ{eÙçՂ¬GËgZYdƒîüÚodU Až%Pê$½ +£¶àBYØ_ µ£6¯ìï.ˆµ››Ä}¹%³?i|±PüFȽìƒÇ˜ »àéӞŒ º4OcÄLùâ<Ð¥ +y«rÇ?éÓ³¤IFÉìlð(ӆx'¤œ=MÊVh"æû¿øáΝn½sÔouõý„<sR™e薲=ü©çþÏV}Аíä|\⋽ƒcCÀÕ÷`—I·::núÁë'Þ«Kº$·›+]ä+o#rücï«¿8y)ˆø=AXW e–ýzD·/²µÛ^¶ï-é´wÙϼSp³€õÒ.ÆÞÇqSVL”€’h=GZ1¤m=@×ý)wV¾FDZ£¡‚àU©¸ÈG24‹Bâ~­ +ê0¤yDwÄE]Ü,^­¢T¾ýAðú4w4nžÂ–Daa<¡E9Öä½8Z‡ƒe4Î̯Y‘–L~­*Åãpy¼¤¼¼´D«j4²FóóÑqWVŠciF•†|ՉzV5RKz ˜èížÝüÜõ±—8ÃQäãïa÷c?“þOøÕ/IظñŒÿ¦[žU†²ÌÝ.·¿ uyφäü²"#²MR€Ÿ +˜–DžDJá'‹9>rVµ+‚™~ž­Xn£ œÊ¨“Ö5s,õ_óÉhñ¢Ž•m¯´¬R$Iû.«^ÞÞÒß°‹b̐ÆjÃÙ(.knúÞÂô?'ýkY¹«Hݑ~01aF%äÞ_!5xln‚ì=¦I¥’.-–ÖHÛ¤ïHT¶ƒ[. Kڙå6›f÷¤#"ʱ–wa8|.@:ì,.‚Õèï!jCœV«M +@ržÙcB§T.mœRmý—Ï€n:ç=Äpyö ¦…&6|i˜‡?wڇ?%˜÷EPö+6÷G=óðói¤BY3ÿ"údÒ¹hÕËÚÄ­âË"‚…}9f<¢úrLtÞ'q»5@NÕÍq ¹^ÎÂIÒôÕã…?aՏ]ñ¡G×û9^ïD©Ÿvh­"Zk/bh +ÆôZW¥«Ê9ÛUíªuÍqé®FWÃçÚ+ìgä®Bk¨pi j l£¶lTi ‰j +,¥l ºrŽá¾¡jPª«®žS§UŠ.<Ty°ˆ¿Îßå?ã­Ïñ:oáSNžw951¢Æ&4NƒZ*¨iJP‹T$ÌÉ$—„ÉT<™LĵŠ”Ž'× 5‚ÆT}c£^¯ÅÉ`nqQ~N€T¬R¯!Rd,dñ‡ÆBUVTD""ëpª^®”'<íèy˜›Tórñ8·=æ>¬#âj}n<‰ºÞº:KÔ;å›Ö㠇‚ÚÉ: ìt“ÖõµÃîLÇÉÏ&ãî'ŽZ·<Îü$2¿Ç0ÿLd( æG}k·Ú²"Qkžl¤Äzo‹)Àg÷c* ,pµ˜ ˆ ­­r ,ÁŽJXы¿þ×m›µlilA+ ð +üudyÇ+éBwc 5[Ä(ñ©s +(aƒ$S Ï$Ë̞ëÏë74´…ª¶V¯¬hnÆJ}í«Éâ¯5¤ŒÇ…%E…sé?à‹ùKÛÒ­M©TSÍüé³XÍ𘾤i]ú†ñ|¨qYNt­9˜ +HåÊ—!•W}zå-ò /‘—hx‚î"»h˪‚k¨µôZÙòšü ¿¥tƒ3ÐP^P ¬‘_Í$*"S’(ú$ŸYƒÜYf rgŠu:³XÍmÖ Žˆp8£9ÊSf!*­©"Áp—PQ’²R¨&ñ¼›eXÕ?$ —#Î(G¨I¸M!.S‰Lq¦GP¢ø_*ÏÿW‡9`£)š¤!°!ÁÉtŽY‹bF-š[ׯúØ&Î;|ïs¶ïlŸïîõù3¾;;‰“æà $Äé™ø)kÕ]VRHéPéšÐ* ƒM6ÖIãcPV í†(S骕ŒP jÆ`0Æøк…­‰U…‚(C*YaŠ¶J«íýÞ³C-ӒÜÏ÷Þ½Îïóüžçù©¾zñ­0.ЫŒ®nPÜiÅ ø9vÜÉ¢ÏÙÑcó7w=9'µÀâÃe"s³~ðÜ£+û'»Q‘+kºÚ«¢Ê~2áF]«fþ0{ë.‚€m)' á)?zÐLIŠMÁ~…9ƒÎðïÑï—|`g—Ú{Dz ½ÄÖãèázÝϊKä§ýŸÎº“áv—N‘~‚ëÓã·>M·¯i…¼T=õ$˜Õ0½Î H:kÂ6ք=}ìQv„ý½É–°ÃèʁHÐxÎkÍv÷‹…¨AtÇ +…üíP¨@(Äù±ƒ^ìÁþCù+”œ¿rÀ£ùN´µÉ+ØÎ`RÄáü¿LYˆfx ÅÁA±“Ïo˜¥Ÿ±c^‚—P,ú[1)20Ùq”à†ã\^ø&šÔ4ª&ê0ù§ ajbžš<•¦s£ÇOäþ¤ǑÜyy×®ËäBƒÇr7‘xôs7÷³‹—v¾úá%À¦r>éÞrjÍL'´$àjª‹:én÷S0a—º—£U÷-«ãÏã.Ø/8ÿ–¸Ðpýˆs™f•}³`X%bµl0Y FJcJÁ¥xéô–4#–,ºrW%Ã1€©ž¤ÎsU:Úf³SªQÎVè‚9BSk(Jç”.*í+µ•§<±y"ô“M“Ø?M[ÿ‹òþ½»ñ®A`¥«þ ^ ¨W»Ü"¨7ä?x+¿¹…8¦Ðed ÷l©IРûX±ú¯ßÌe\ÞôŽÕRÖ¸Öo\ô‘ü%&ÝԎn™ëq&2ƒ–¡º¨žöm ùç©wä3måóÊùÖ÷Û>–¯6^oûLkü´MâeV)iu¶©²Oñµ†Û6Æ^nüÀ?&?žêIõ+Sß36¤6¯ãý˜Ûl ©ô\GuU¼¢Áœžn Ýçj¡§ÔÇmuӏ‹á(F Ó§ë¢>“FM­Õ £WÌHÅ4]§ {g‹>'º(Úe¢¡Y _‰U>Ý$Šª€vš]}U¨*øÀL;ÃVp:ÿÄ÷ =G&² "ðÎCÕ£ÞìU«ù²ÙQŠ`Ü %+¶$I÷À·#œßÂ\j±Ì-ÕÜ&i‘r¹ÜßêS)#Ü¢¢f ŠÔK%P) uúý¥i𽐑N©ÓT +Ï­ØEL¸PPA-?Gÿ ¹Èáüß)þ՞¿±¿7ƒäˆ)éHj¢»ûad³’X +ôØ ÕÀPRD^¬ ´9nÇ Àí˜2òàdȦ·‰ aR&É18A£E¶q¶%¬|æ£#¿&0K^65¶Â;" M‰Š² +‹…S˜ÕdÐ ÈÀ)65oÝ Ƭúµƒí_[ôçS§Ö8|n"RÐßÞ·{×Üy¹Së9·m/S] +L}1R‚éDª¥º)]ä@|õƒKßXÞPôW@__ZŸYÙޑLjÏ¤Ÿ]C&”­à̆m+UC1ËþFîp(Lï憸ãÜ»ÜU®ä[žµž—=¿ðœäÏó¬ßìDAlh™ésØlvG y±Ó' +^QÂ%AWÕ0zÍ£FY™Ý@ˆb]zÇëmÃè—&®©q8µ +ý$ñF´È7"G#%à¨%Cè*ˆ¤­«TAÁa¶´FÉbÐ]‚ ,ò„Âχœ*Ņ]*EÂp n4Þá¢%ºÍ…£¶N~¼Ý§!€hxÚâԊþΓÍØí ¸µ÷oۻà +Ê f1iîì_Zò(j€týË"&‰&§(MÆX–±,!Š#^ –öcpN6nàaÔkò2m$Ō8(2â!ÔKÉÈiºM ÕK}Ò.é¬d“Ž A`T9ÒÁëŸVŒu÷_ëõŽ)Ò£¤·È_&L®+©«^÷Ýëêä#@9n³àVwH1i}×òî×dMt°¡žÄ£n=ŽŠÐ›1Ž¦Þý„Þ·9÷ÆW ²È u#j,Gu›¬i5T;7AØüK…i"PÄ:•ÏÛ^¬+™s_¥’ð¯eÞT^÷Ó¿Vúí¥×(?V•ß*—”œâØEïû/ãUÅq…ßìÏííýíÞþÜîžíóÞÞÚ·¾ßù8[v𶍥U Ń¹(?NH„µª•4ÅRA•Phƒ#¨”–¶4IEՒ@Š\‰ÔRhPKAj*ᤆ¤ +V‘J¢4ôLß®m~’ +uG;oæíÌìjç½o¾z‹¢ƒLPÕ]u¨&ÆQ³ZÓ¦.g–«k˜5J¯Úkô:[Év¦_ݦm3¶9O2CêÄóڋÔæeõöu’Uj¯¯;gÐÞNœ×þ‘˜ÒòáDM"Oåym—±ËùUâdb‚Pþ–xŸ¼¯}LÝH|¬Åûñ…5ëÇ6?¾°•ýxł"Š²bE5õ\ l¶i»6}Ík²ÏÙô€=lS¢½Â¦lû cÛYÇJ; xšâwò{yZàëùnžþ'O~Ïó—<áùƒ,ÏX+Â2fҏۺº‚QW—4,ÓÐG¨„fŽÞ|À-© m*,ت¢àqæ`XêF¬AŠ&¦®aÕEhSMàˆ5N&QÚ}ãm7G%“n†Bè&”íH';L¹#舤M3vèD?mQò¬ÛÏn±Õp|Ùp²XÕ¥°2’X ñ²Ñánpˆs’¼„ZE#ϸZb5嶴—)o卣\1^¦FÉKn”57¨D=­0Ï)ø›÷j±Õ3ÇÚÚË~7?ÛÅ×øWð-Î÷-.æYWJheÖU[w²{Y +Øn–bO‘w¡éŽœú¨R¹uöOOâT%)V½NU¿bˆÕJRŸž}xýŠ÷ô.Š=–ä³áëâ”רN{9|J|­~»áÙÙ¬Ìçõ{äa¡R© ~Ö÷Yç­ü¼­p_s‚Fo“"òxš£é,=Ës™*ˋdùS>zwÿØhÿ¯›¼t}Ï«¶Û<º÷‘TM²þŠGœBÕV§È9¼•RªW©ݙÇ#¨>`—0d>¯ƒ.éV>šÖZIk¼;êj7ä[a^þ’ü€ÕOúãCòµ[ÞmÅOÉ'¬ 뢳t^øÂêŒ_ƒŸX±YàvßD*Iñ’< á©h´p »k¬ÔpŠ¤Z)”£5V&߂CŽ7}¢¬¹áRssKÉʗdžòӓe–¥ˆÅH*~þhEhYÓÙJÊ¥œíyËf ™lÖÎX¹Œ%—JfÆR2+.I&$H HqÁ+ñÒ×Ô(É$"=å!½Ý‘kéÈçs1H­HQ©ÉÔ5¦—W°X‘5Ùv’½ÆXcQî„’xøÃl×à-ÅuÖû4Jkßlγs¡…æ^õÿâÿ|Wüôh.(v;É­C!=‡ÿ·Cˆ»b*€gÄ]Ú,M=:ó„‘JFÕÄ/ÂÉòUŸ\®OŠJsõêw}êVëFšUy?Ôº©WfÃ,šànüޗi²¬a4ÕT?ýe–…&83&=2ãåXDñ­»0,uñŽálÉÌÔb²¡¨š£6­Ìnmoäb¦^¿ þ±7ßÌ^Ž¥ª¯¥9—‡Å!‹a*é*Ï3`.@“¹°,E¸žl,ÖV–Ý·Nb‘X<ÜõÈÖÝRÝÓ¿ ~Zˆ„¹ø—u‰.­êl‰2υš¿9tcª8ð ?‰™Û‹J×Bíðш7']A·Ë_#«„Íd“0!°¹Qôñ £ì˜ »ÁÞ±Dª,x»G¶Ñ+ˆeۍØå Á-¡‡å!m 9`9‡Éaá89.L á<ÿWá|òOöUaʖ{øžðf~s„ÉÔ¥D°Ä&Èԅ{šÒªÊq™t]Øxފ5¦»1uS/ê+ô ú€¾O?¤ŸÓ'õ®§biš^2ã +kŸ5nÑփß×ó…Ê äE¨[as*º|RÂv¼Ž‰È©;;ñ—Ïã>Tòl#åÇsÉWªÈÆýž¤*€ÿùœÕ*—æ6C¥˜±sk8v몍¤57°räüÌô˜bær=çÞ~ùឥI¸C§†jµùÑo͜é!ã/ìY?ó¯gªdfjéR²ãҋ/\>Š¨ÙLw ¢fés—wsÝ|w¨;̸¢w%Waº¸.¾+ÔfŠb1^”Š +Sà +|!T3‡°®çêùú°)šqS2•Dc5é㐱8³Ö5©BM*U[c™Šµb—Ô-QÒzA’DÁRTÃs¶h…¤¦IKm¨5Óf ÀqH1Bш é&;É8¹DX̚bòP’J.£Uð6÷ǯ`öõ¥Íÿ–/÷P6•{÷(¦/Rñ/Ü긷³F­e(é»zϤ=}j ­m杶¶uÕêÚööT<è¡÷à­.ËáEÍÛ‚:î@àƒ§ŸX÷¹¶‡„΃|¼ëç +7zöBá{ÂMî“}̍`»<Ž÷fàøeõ îüٛÜÍuÌ ß{çE3ga›×@ëMø€„à$Lá=CÞ¡*d!¼ ûHN³p.ã“#p.ÀD‚?Ã{D&gIl‚-°ŸÈpâ°v¡~ðgµØÒ¡#ðÞ½0{aˆÐ+àëðê>ø;éĕüöÁBœñœqž‚Õp +ŽÃ8~ +ÂðÙ0>} ~}¨ÜÚð­#0MF¨N²ÇıìÄõ½7­Â•n—#8o¶œ˜+Þjó¥o®ü‡¬Ä¯ø6ì%;ü¯ö 9Iºð=~ëc¸Ò&؏÷:8 +ÿe½Üƒ«ª®0¾Ö¹ i ¤!DÒ  $\Áˆ”Jkr­`‹TD åph-A‰dìXƒ01 +-CIÐ OK•«Ž¼ ´„‰ Òœ–Øê` /iUŠ·¿µï=—K þèùf}û±öÚk}{í2D~+iPóäfó”œÖ2ÏŲ]Æ2³ +ڙN%Hº,œgþ'õ²æÒÏKh^Œå;I©7NRåër Ké+9˜a½(JÆ:ìÒc†´Àݬ»´Pc½ Œ¹Ë4ÉY/¹,ÏÓû Œ—Ïê¥ê3:^‹c+nëRNŸV»‚yš<iñ³ÚÉjÞ/3z¥“JzöåìfR‚ÕŠhgbý,cELÆbE´pRÁ 'c¯íš-µòžÌ‹´h:Ï©âi¹/v—W±Õ*©örÌA½/ÇîQñ/-ç¯ÕvW[Ïm_ÞtÿtÉ¬wž€§Ãä-fé1¿5Ú½¿Æªð™õÚÍ?OŸÐ'ä |Ãlä[ηRÔRåq)ÅwKå»Øyw‚ì¡Å6Ã"ÿ–þ‘ãò©‹ÔDZÉEé$¬a1úkô˜†ß4 C1#äHˆ¿Å2•U[¢»e¢vûu‚,‘­^W$÷Koð ½o”ùÒWÐj)­OöÀÛdpä+6‡¥Œ\K„’¯èd:ÉÇ«{¡À|Ù¤‡ñíÕÚ]6ÈZ-ÓXݝÉZm“}°ÆBâïòCž?•/å/²^ÈkrXÖ²Ê ù»Wþ#hõ_ˆœœ¥Þaìeòžƒßót-Hèw¡ëÓzŒ÷G«ù÷¥¼æ}O«ôQí«õ \ò*mÖ¤Y7 zRÿ¤Ó`¶ÏØ?Çé·5I;i?Y©çå´7RéMÑ~šÆÊ^‰¿F/à©Ðõ$„a}RÄ·:ªâ{¹®Jg¹ÉÕì†vUcy‹-»’]›`ÊO¤ù„Z«‰€&ÆÓÑï5º@›Ðüm¤~ë0 ^úÏÿ‡ Ýë4YM« ¢­×ϝžŽ,xŽÍOé/âsõ¿ÅæzM¹Zǘ8˜ÜµM¼l}u‰Ù'VjOÖ7¡ôm‹÷žpå6âÝþ'ÉÏ]¹E·¸ï_áÕö~]íb>n.›ä÷>/ë¤&A¼›YmüB~*£°ÇI|#؀%¦È­Ò‘uhM¬ÆþÚ(uR§ÿЋz‘ø.Õíú™žÒ<¯«½IÜ “<ý/§ôœþŽb…ÕŒõ>yûrDgè,4<"õè—ãiro¯åEøc‘Noƒz}QÿzÅÚq+˜§˜sœ?ˆŽErAþ¬Ÿ³^ïòÉøÞD‡UZ« úŽîƒà¹;u‘‘¥?ÖïÊåk¿F÷èot¿î‚‘8°@âûÜGm$¾Þ¨$îדXÉö w¸Qi½s$J±Ë;¢b:Øm´Ñš!¸~΀Gç8)Sio2Ͼ nµýî>t¦/ü¡Jѐ—ïån(sQdžè{c«(ºÑ²Íhk' +¯+5ÈK ږ´ŽÜv"øšˆm¯´ˆö¥#°ËgÍX”_SúlÚNg‡6JŸ-Ú+ãö„UÈ:/¸gJäP|]ے®DiŒMcëe"+'Ga;§‰"v•}º–ž‰¿%ë9/¦Ù§3õ°Î¯Ë Ç +çt_ëUð­“oqÖ °Ó×ÉŸç…þË-ôÒ½ltX*_hŠËEj\®Ò<(Cöѱ,:“¿ùN¬F˜üؾTÊv"õi†­ä<ҝh:岻ݰ`w¾Zf"º2i·Õev äN+`V˗CDÙ=Ô²LyÃI²‘|n…äs¦9#q¢HÉè“D¼vɌEäêÀxèçœ6²Ïë¤ +_‰¶µÉh`Ùfkî‰rÌ®«2PŸüì> ¢9í"9ã4ö{±ˆ^Å?Æ-%œáú» lOvž{Øíð%òKPÂò2udzM—=䒖!ïæT™†åºÇ¬W@‡Ùe–ËL‡0jæ¾åœe8†vv|‹õ°3á0ÞÎr2«’×ñ°mH˜Qç1ªÍ`§üŒÌ®ÒýIŽajüéUN“éàIÍ×þ _þÆn¨äFœÚô²—ê¥rÞêNse®7„¥ž{ˆ}ªÞöW£Ö!„§ê`}H'é]:”÷§?ììv/±S¨!Z7Q#7p³ë+ÚÙ+½Ù\­ ùü.=îÆìm½¹–œm7–Ìý4íBºI{é~O¯=ƒôždíðª&zŒîo3tG,€úñv§ŽÖ<í¡wk€•8† +ÙîŠÎA6+Èrù&{µ­uë° åDPÅ®l+õ•ÙØz''‘ýX;LÆ~†•îüSÂý |'È{q¾’¼ünǟivâ‚oc_±òY"2‡…Ô“Õ5éE~?T~B» fj­+èsVy)^Š(ÒïDyÜEn®|‹­v;Wòþ4LM$¾í· ÞílëW™´Ä÷»>œ'Jc°Yr Y¸E}ì|®…³;Øø&~DIðÝLF{/’g)ž#<;ñìm"¡ù(P»ó¤c´V­òeĞYð" áG +ð&86Ho"¸<6ˆV'ÙïÀŸb;Ié ùYàUàŸì€Jû؟Øß±æ¡oÒÛHÝX“"ºë<?FÍð *r\0Ë|ƒ~=ûT§Oÿì7¯ü>‹ž° 8y¶výŒd§Ù·ŒØÉá$…ïm~Î&Økì5ƒ%{‘îØ×Õ;ö ;C7}ÐÎÅÜÿ¯¹ˆb­' >ó³ ïÎ"ÜHG€*£&¼w¾›mÁyú)b¼"DK‹°w í­éB¼Ðê A·“¾HWa1¹°ògØ)´ÿUVϾ„_‚ñ®r«óºÑy7Ùҙá„} +»÷{DÄ_¿×g^§·P²;ønýOâ´Âc=Œ^Hëp~£?‡w‚|·ÖÁ‡È´˜RwGÝÌÙ´'ŸRþ:õ¥|nÄX©ÎÂËthfzfF•-ÇØdŸo%FY€™ŸN{tËÒa%]·¼9¤gNí]Æ^§=¹Ÿ}kú`aìÞaõ'zx‡–²z:˖Z£ Ý>ä•ÕþMÖq<“Nå|:‰¹G‰æÀ,[ÿ .þï‘÷µw`ÃIZˆ[®ày„XÙEMD‹'‰îl'ZòÑ]÷Ì¢bÌ]\%*yŒ¨´)‰å؉òÏUü‚hUÑêz¢µÙIÔîÑÐxïp÷IÖ;44444Þ/Ô½­¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ñ®Áˆò§ø£ÔBS6ô!ª¢n"þç9]”…<ŠéÛ  c‰¤JΡrLå‰åY2§EüIK΂ü¼%gC>aÉ9TÇ…š,+mgÍ·dF+³+,Ù ü쭖̡÷Zr佖œ ù˜%c<ٗè9TCÕ´–ê y¨ŸLð-¦§aŠ(M#rQȒz¡¨kP⢠’ èvàÿ8ÅTÎ7Q{¨_ÕÌCjF®Z“vCãV­‡ÐoªŸÍh}m¡vÃh3@>È>È”EÓýˆôè«©Ҋt®Ž*Õ¼h!‚ºýzяlÃGVÝVäú¡•¥Cc,='¹5à-ÇÓ§ÖBÐFä{Q"µ^µ7Î1ÙNؚ©P½ ¡Ô§æ+s}h{7þ*ÍjùÕÊ èSûт1ÉÕ ¨ÿBjm7¨ÿMUäAô)WÚ¯¨°F”ª+”>\¿Hzߙ‡,cüÃ*4Zã Xci»a>^5:i ~Õ·ý€šgß»±£çDMõÚ:áé7Ŗp(Ž˜¢1„£Þx Z#\Á èìèÇD‡3£»Lÿ‘—×löFÍÝÂ1CùÏfïpx(.‚áŸð…#ÃQùÍW׊’ÕUŠo0Ò/š½!_Ø7mk¸?$š‡ü1ٓ§?ÁÙíô…£bc 7ðyƒÂêuÂèTÄÂCQŸ Öß퍚b(ä7£".çÑâ›>337ˆ˜i +s°×ôûM¿&µÂoÆ|Ñ@DNPõá7ãÞ@0¶ÆÝÚ±±«sU#š˜Ñ6swûÖ-žÛWZ9і¦WÄ£^¿9荈pß­—øvó´;øqn¬Of×E´*Ã9$]C;mÅȾüq‹ïç{ì6W.òŒ®Îæ6‘Øä®ùžêJOiƧ ±»ŠøF5QM`TÕ5P†VÇ¡‡~úq¥'¦šZVa5e  ÛbKÁ5wóNœd;Ðâ]¼3Qc?áÚη¡é#ŠNr蘢=ŠºQ¥#J+9¬d§’–,iÕ,jWÔ&)ïà[©šóVÅÛùý´܍¼äm¼Eñ-|“⛡¿üc¨WÞÊPùä›À›‘—| Ñd¯vEïA™þ¤¾ ch˜š°HR3L—”¦t8pU“ñ&¤F$wᏴр’â¼ɉTÏëQrêÞÚÀjŽÔr 'Öʁ–ضÇA9Ü*ø:ª€v`;0íTâ¿JŒ«=TòÕTŠ¶–û¨\XÜnì¥bðbco¢ØÞàÊ5ŽR;°ˆ£ÆÑĜ›«õdÝ*À ô#À³À`.9“% ó §áänÃͳ`ÝSGâµë“ü#K“|Á’›+Ê+°Lô,—ñ± ´ +p¦svÀ€é”Ñ à

ö~ +Öø³ão¤\Å]°°ËŸ\Gî²ÎÿY0bœùà +Í°0ϹÈ]´ò|†¹±º}Ï2—xɋ0¾ëÃW¾Œ1Zôb¼-L· ãÌKÎü^ÎÊ^ÎŠä¬ 8©„CwqÔ-D%‡ª[/qŠ¯À9¶/g×ÓlYìî£:ތª]§e8 ÃiAoð;7oäùê²®÷Qo +—ÎSÇË×oÝlÅxÓhÙ¼jØzTï¾ìç]á®v„ºÎ¢u͖½Q7ëŽÑ´ý‡µædoOº¯ž¥‹&›ûkŠ`“"W­·»'Ü5‘«'rõD®šY“¹dÕCYjÈò«A¢*3PÀõ­±ìÇge5ÏÑü­Â£4ÂÐAæóaÃâºpMW¦+Âo™póëWþÖ-<®,˜G åm8Âp0xÅ#­}5¼*µ<Âvº˜(øä Ûî¡2,Wå¬ÏŠ\™ÅŠ,VíTúm$g5ì ¯-ÄNøç£DÆáî2@á‹MÔCI‡paK;ƒÂ 18! ™Øþ`‡Û7 +endstream endobj 12 0 obj <> endobj 11 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon.ai) +%%CreationDate: 6/22/2019 3:02 AM +%%Canvassize: 16383 +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%%DocumentProcessColors: +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: 0 -512 512 0 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: -31.8799 -640.6602 544.1201 159.98 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 2 +%AI9_OpenToView: -497 224 1 1528 954 18 0 0 50 116 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 67 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 29 0 obj <>stream +%%BoundingBox: 56 -487 456 -24 +%%HiResBoundingBox: 56 -487 456 -24.8594 +%AI7_Thumbnail: 112 128 8 +%%BeginData: 1982 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF +%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDDFFFFF +%%EndData + +endstream endobj 30 0 obj <>stream +%AI12_CompressedDataxœì½ms$G’øfýê>¬ÙŒLDgfddDÎÉάªìRš҆íJ{2¦$!u-4zFÜ?s?æþØùó¸‡GdVˆ~áìè–²òʌȌyÜãïþ¯¾þ|ûòîOן‡³nó쳿û»ýýõÕÃÝýo6$o¾xõêÝۇ{~õ‡_oúé¬ÃUÛ/ò·vå¾¾{swû~wðí%îÿÕþ‡û›·7W·›Ëë×rѯ7¿ú5¾ýææáÕµ|óâîöìêæ×ÞªÔr~õ _MχáùÐõó&ü¦6Ûßñ’«Û?_½}{ó/×h*d¶´»{wûòæöûÝÝÿúÍ&N›Ïǜ6#þF|ÿ7¸~ûØEg9μòüîÅ»××·_Ýß½¸~ûv÷êîþíoÚo.ïnÞþf³¿{ws}ÿûë¿|õõï¾i/øýõõË뗧.Û~¿½¼yu-óúêaÓìÉíýðíîÝÍ«—¿÷úO×ÒoÓܓ¾å3üñíÕ÷רNþ&=}ûÅk!}}ýð ï$-q@þð÷»öɅÊò«þJúìZZ¼ÿ×·ÿí×¥æû»7 áîÍç±6ø¿³o¿¹~ýæ• ûkˆÓY”žâ¯öC¹X^‰~ú³œæyóù4vgÓ$Çñ¬—qÜôq>›³ÝQ{úúÏ7×ùÍæ÷w·×ÖAÛû‡¯u„DZëô_ûêï^]ßÿñö;‘6kýîîåõ+¹£VqùêŠÃÒ×íŠo®î¿¿~‰q÷êݧnöVd~{õ£ÌVyskäË7×·ßÜýg>êçãœ6Ã0nðNCÞÌQþÌl!J#ýäöõ_«õ –Rÿ”0p_ÉX~yóýÍíoʦoÿþþæeà4l²þ÷8ËÍÿsùßV^ýááú¶t‡L®ýҝýîK´zqûr÷£ð–ËèZڗùóêî{û¶~àwRÅ»7Ï>ûçgŸ…ùùÿ|w÷pýVj|u½™§çßß_ýùZæs~~ñîþnӇ®¹âOWo¯Ÿ'£ts«Ô—RÚõ«W7oÞÞHóÏ_^}ÿýõ½ý’¸¹—)òÝ«ëÿõüÍõýÃwïÞ^ݾ|þõ‹«û»ÛçßËjaݯ®¿{xþå…Ì’¨uƒ õñoéÒ¼I^Z>èWz'ԇç×·/¯Þþðüú5=ÈB¼~.üîå5ևTövÕ¨Þ|wýü坰1áG˜ÜÏÿËKYëòÆo7Ïß¾¹z!Ý1Ï_¼»¿¿¾}ñ£|˜žÿéþNVàŸ®d÷S~^®þâî͏VçýËï®_ßÜÞÜÊíix.ýóâêÕíÝÃó~|óÃõíó{Š·òj×/Ÿ¿¾zÇ’n•AzþF˜´Üùîíó‡¿Ü½}'vswÿüá‡ûëkÿtõâÝÃõó×ïd¾†ç¤½|!ãÏÚ^\¿¼yõêJj’¥èwȽ¾zûâÝ+>QÎøò¾»º—{ðçW¯¾Ó6ŒøvÓÏÃó-çƒTµÕ·Íhnµ·þö[¼ÀóíÅó½=Âó Þþü‚7K-Íí~ßzÕÚÄÍ5_ø5?<ÿ=”j¾Ô¾Ô¾lnøRŸéK¿ïõ»W7o^ýøüË·¯0'þX^èzó››ÿèwýýò›îîe¶€ãÞÊT{ûüJ¾*ïsÕÜ}¥M_y%W쎫ëç/Jw\ëí×Zûu½Yªºöûnôª½ê¦iâƯ¹–î¸Õïôò»òLwÍ wv‰ß÷òæÏ7 hg¼Ó[ßiKïÏóÎïùQ¿~`güXÈÏ>ûæByaüß~óV6†÷‡oÉh.n_Üa¯þÍæÛåz°¡þóóÕÏW7('þæ¿>cíÂÓJݛoîß]ó㛲é°áoåI¾’îàŠúý~—¿ýêÕ;ùòïïïÞ½ùâö»»gŸýJå¢ÿ|ýBdÙª^n¾üÓ—"ÝüþêÅß_ÿËõ͋n¯…ÿmvҕB÷kEÚyó럨XøýõF¿•{ùQ~‡ßO¹ÿüú;0jJý‡ÿ;¤QøÝíçÿUxéÿ¼¾{ùî•|{qûçëWwo®72[7ÿxuÿæ)M|õêêöê~Ã/J m½›/ÀV®þÇÃ͟7¯¯¤Q¹è·7²G|u%ýû¤„™¼‘^ãM¼fÙÚc4_=©©«‡6;yȗo½ö-¶6Åw·ßô_D¯Jõ_ÿøúOw¯nÞ¾öÊ[ŠÿýÄ'•n½ýòVùþÝÛ6ßÜݽòš÷›Ã››Û·×¯VO-B‘Þ÷7Ր_|¬,žÿ-šØ_‰(#lñÍ7/ŽµòŸìûïn®6vâþ'Í®ªc­~ýæú_n®^mñ𶿹ÆlndËÞy‚ ÿüñF´†Ým{ÉßßC$¸}%ùïï^½„P U׿EH›ÝKÊã]ó__þ7÷íN$Íÿ äõO¿*CS‚•ÑJäÿ¥Lø_jœ%yÉݼ(Û¦ì¤ì­œ7墻”/KY³h_ ýÙ7e§¥,ÕÅx.Gq9veԖ#µ©qlG¤‰eÿ/{Ýz{ÕÃìUé¯yէ֓‹>\öÛª·–ý#ýµì퓭•™%[IV&–hed VdÞq1ڞª»‚/…òrÚXùÙ±l­Ì,ي,vYüi?Y‰VF–`EyrÙ„¯6czÁqÜqÜ2Ç)r\0{ÿœ½½eß&öæÈÞëÙ[ì{#ËÛ%¾;ÞoÙñ­Îù[>wâSŽ|*y™6Ò¥{ag[akYØÛ$Lnf7Ÿ—'•)u!½f¸¶˜·IdFd¿ée¾”¡?—NÙÍ[a§yNÂX£0Ø ;T/;ö¥Lˆs鬝°á9Ë3 +Kž„59“îeo¿”©r.]¹K[aâ9%açQØzæދ,p)“è\ºw'¬–- ÉFeC²-ô“<£Lé ì½l[Ù<²l!SŒ²™ÙTz‘/.eâËìdÙeãIã$[Ð([Ñ R'KàB¦Ç^6©­lVòŒ²mM!Êd#ëE¢¹”Éz.Èm/¶â([¶jx”ý6"°]‰k˕¼V˜ný÷ Ì T £Ì­²&ÖQj¨÷C@üâ²Ù ”SÌ2Ǣ̯^æÖ±™54Ûw)üèNÕsÁb·Š\ÖeDz= ;–lJ"0”GÀÞèûâ$S/ÙƒïŒØ·h³Üï2F0 69ƒRÆåŒÞ$è²Æv=èÈxÝ¥×,Ÿ) ž +”.§võ ¸\Æagø8m)Ú\„ƒ@³wñIF¡T0ÜS¼¿FzÝõ5‹(^Eoª,¬­ÔUkb=ì(½ÿh'ù󷃩¹<(t™!Ifʎsf%h´Ým )̪eWuZU–Õ2-²-ïý#ÌlÉÊ~Š‘ùp¬–ò'YÈ;—¯K©S^èRÉô+-q¡ƒ™^&5cú£2ÿB%^j{e·r]е éŅ¹§„^4üžW%¯JÕXõ¯ÉtÙ¶Œ%”áH±©±ý9P±:[ÙÏŸ-ÂZdî½ì¼lO”ùdÉEÔÓªLO,U{m‘ŸÝÂQÿ>,áDáԐ‡'–c|¤HO»òÉ?Gmõóéjl¶×Þ;V¥ß"ş[Q¹­ØBŠm$›î]l'¶îeU«ž^V{±ÇÔ¥°^ÛEö-k¹]½;[ÕŊp¸v“[&+ÑmÕ.ÚÕê֌GÖ©ü嶐j[­Í²:Ϲ5KkcÛ]›»…eîpuÎzµæ…•¯Z…ŠeèØzõÏ Ûa<(ãÂÚxzU.-Wk›å±uûØj^­U®êß½ÿŠ~tUÿ ¬ÁO_ã ¡·U¯,•Z¬"«tTØ/(‘̦`N&“ ®^]6RIZH%C£bíEÉ¢Šõì3Q² f©’5«£Š¥J֞V'U´²+ZÁ-¨Z{Q³vT´2mX2©lõ\(—Ô¿ÏфTEÕRe êÖ ê®sS¸vT¸2.¨\`e2wLíº¤. ÅKU/(_™ÊÔ¯‘êWÏeuIlO JÔ°$ÍâRÑ´DE TÆD£=è‚ +Ù¹(dPÉ ”A-ƒb–ÆHÕ ÊY ëꨠ]š¿ÓLå;Hx‰Rބ~z +X•³C Ö©rœÊn™êÊHÞòî†k7RX±çêï–'·2å%á·ãläœuÁK’Í‚k.x¤¬˜VfAYq»£|îùâˆ<ñ4®q’›|âUíª¨–ÖBÖþ,‚©si‡+{.UŽÞTÚZ¢,m~qU¦E`aIL c¦Žµ,ÛUÙ­‹Y4Ûr~P.K™m ۝¼?R†£%-ŊxXâ‰2,nO–ÓªäGËüEDŠ…UûxÙ=±ãKû'–ó§©ñzl(Ÿ\¤ÆSß}àϑíõƒkrQçZë`N-£µ§ûj²R쯳³ÎJj­-?…UÔ%T†¥ðÛ¢[©¿XŠÕn,ó›æ)-“—bkÎ^f+[/»#<ë楎uŒWU?ÂqîÔ𥅟bÁ“Np£S\¨å<;ڃNóžGx΂ÇŸ¡-í49ÂY~Š£Hò‘'p§ —˹ÆsŠfõŸäOä +‡|à‘Uýxù+®ê÷2Û. ·"ØíՖJG1d±0ʁpjÆ;a ê4îÌm Çq¤ë8‹àYÜÇçp ˦£ä@‘NdÙc(ÈW2œÉt'«C9@ +¥S?p,o)*ùŒÅ¤f¸˜!ÒÍüì3ºš3¤rº›wžÎÝé܉”‰ŽçQ²t¢?‹8¿¥z/ìãÂ\ÑÝVVŒý…8¥á–ž¶‰jÁܸ§é –‚‰ y±§­2ÐY w5d÷D§uÕc¦ëZ×{2',ôKº±;ç…ÿÎ[8nå´Æc…ßîZ¹jᦕVîY¹få–-<7 µsÅ7¬M…1–C:Ë!̨*Ç4쀮«;6gíáçùLøüÉ »¼ +õìÎ+~³@0OÀ2ÿáæõëëWeÚ_RñX ™ÿÁYç¥1ÌÁXe47_2Ƹ5VxÞúlÍ†6š ˆév.|¬7<ÕÈMˆª7·Kš?tS›¸m¹‘]ÃO…K7­-m[çGЄŠ,žµíª»IgØKuyì$§Ž@‹`ýœF£¶–ÛØØhSD1 ŽJX›Ç’¡Ÿ`È. £°îö|{Ñ /ž„»X;.}gïÍ ß:â«+~¯»wãŽ}·ž‹KþÜò™Áø •åá£,¦¾Lù r¤®(=Ik/s°£t ¬wžÜ›¬½l¨†ŠkX #ÌxÖ¹[pOó˜šÃ’™½F3 ÷Õ(üdlʓp)îI¯Æ`uQŠ'2ѹc‡¶†*ÆáhÈ EuÜî/œÎ pÓ¡›jITïqpé9R‚ž(E'Jҙ¦Ñ-åéÕi= +N—”¬«l­PLŒ£Ê×*aW›R¶3ž 9’¶H¼”¶3¥í"oŸ/dî•Ôm27æBpRî.’·¬²¥ìY2¬sOÑñÂÁ%ïñl%ï=%ï ˆ\2ö*y‡FòN&uï(uŸSêVøg•·ÇFކ¬íÒ¶Hå甸‹¼}(qG“¸)s»¼½£ÌM‰Û™•AÞ šÜ€éN;üûÂÿ^R͐Lgœ™•ÍewQwå¯ö· [໩ ü¹w³up|ý¿GcÔ*¯&qaœˆ;hàñ$Ÿì_5¦ë¿êö¬ÿn¦÷sƒQƒÙ)—W×g™ÛÖeûÆC®ó\ŠÌlíÉfüD­ƒrŒòdòvÝCԑª+à‚«€ëÀñǜYëð…u9î2ÌÞG– ûƒ ™‡¡+PþñˆÃ ëKÇB!ÒÊÁ9­ÜŸ§"Ѵǃ"úGVÑ©5tDðѕ´kÜ-u-µë©YU†¬³Y„ÒûȔ ÷Cëþw½°°HÛ@ˆÂ¥`§ˆóÐÇ´PâåêÆÚõ©*TÃGž¦¹Ç­ã,¢s6C‚|t[…ÚyªÝd:I+7ÏóÁUè¤1K„…&$Ùìæ¾O¢,à%ñÞ6ÂK›÷ˆ“ÜÚ7V»®ÉLA¹ Üiþ’­8‡šŸ&¡™´‹­žù,ÆIr3ÐÇVõž¦›/ï_üpóòúÆÿ[ªڈڳI$cDÈӄA6Ï_+#Fc¯)om‘µ;7åFÍ=dwmì&3À"eP×µª¸Û,`O½}7Ng"8/†áC+xÏÎÿI‡îÑõöMqµã[9½Hϭܦ&#ãÎË/Š¾epg(!E'Š®÷$×njhh ñmµ—ÎKeݦvZ`¨5PW!« +`=m3ˆ´Pwa”KÑ^Ôf07ZÌÎ$‹b9— +Æ2„++¢õBÕ|™–Tß çRKB±&ìŠüb;Fq¡¨h>ÊÜÌѪ"dÒÞ@t-KÙlZL†(aWÑ¥%w‡D”£d)dj ^¢—ú“¼d/[/»Z¤Æ}S*L`éjqªý¢„¦°ûž}–F/qQòªÌGŠ›i{Pö'Êù#ŝ[0 Ÿp¶wï]8¡E¡>E9Ü\ۓ8ïêší—±5™+tWCµ±.eª=a£Ã5wÙت?{¶Ø óÆê6–µ[›¬]{:3;ƒŽiKÝÚ̾ ] s9кm–ª¶ãœ<ç\,¾ì3ªú±·ôcÛ8 +ÚS ´z;Z¦yv4ȄjCë̆iAS¿õì^ës3øƒ%·« ‚ùì64ú«iC{Ìg]½Ösc?Û3à6í ÃHº¿ZԔ¥Çz¢*S‘BÅs­úIEU$PÅqÀˆû¸Ÿñ3à}^ìßãÈS —Xž">¯;‡HC”à¾ÁÃå,9'Ñ9 åd•}ûwJIZ"tÆøÀSØÀGK±µôËXè]¢ŸKÜsy.OR5SÂ5K•ªeTs/ªPU{jü²+4sn(¯e¼rUK£”«Z¿Ré[UÞ°KUþ¸¡é@_©ð¦Äþn©Æ/ù¥*¿Tæ³Y¹“o„2J®ÒWµ¾(öƒg<éõþ²Qò/\—ópká¥ñú3{É^ê¶V7éèe¬Ej M©1}ý¢´¸ë%t£Õ 9¨Â!+CØ/Êî lWå؏hä±Ërtc§ÑîtqAIjŒ'Êøޅ[Óh|‚òA±ðGÃ3„TVà2ˆô0"~JºŒŠoãâÍ;+³{Zxh«ö|az]^Õ[ëþÚâ±Ýú8''í×aȱwïä¼ +çÕøjæ׋$s‘ `Ç¥0›×2QŒ-l5ÅVöҋ]Ã<¥`™9ì¡ÞìaðqA¶ û˜)µ$7ÙF“å=Ddúž†ø¢¡ {3æ.B4$D%¦¢¡!ª…ÐÙ$rT ¹4}Eª²½ À[3—°‘6pd2ÅԚ ³’ÚR‰Ù폄 ž +,a&ːa‘õLc›QõTØp-ã±b$>ü9Œì;Kvüìæª\|Hù)Ì15yi 8~A±3Ä.‹VHøH¿³™ "ìG}µ$¹Ýhmàø€ÛßÓÆðÇÛÛ«××/7ßiÓÃÞp„Ú}Že`Š®¢4Y˜úÓ¡ÿšDà²$ ™Û5Üv™#a ´U€B¶ xí£“ƒkç·f5–Œ +Vyú’¼ ¾Ãú-v̊uî揧f|x:,óÏß꽞zgO].´ý¾èys=_š¹æ }Ã#Y*ŽÃ¥¯ëH,ó9ýQ–˜­pŽš%ægÏnóËS/ŸzáÔcŠ’³I½ ÐïMîgj×:òÇqÆù êÕ¤ô$ÕÊďæµ]wœÛ +Iò×üv0¤!Öûž˜@xÊÌu .™iV½õ«fÌ«ð7Ía'àð·|2Ñ,yÞd­+ð·dPsÖ% -``A6=ûÌ¡MKX“šÁÑL2Ë`‚Ö0s1ÄSÌ3 +rLùÍPS &S¡ŠRUõ”òcÊÕ²¢¤¥mél¬ñ2‹5íå²ÈJ8ZÆ%.‹)£µLO*ét¡ïúxÉV,üiåˆ6yX,Èã–_j‘(J\ÂSRK¯“K{zéðì3ssWqo‹JèÝ©uÞÄ&l›ÜfՍE–ð¨a‘ãléº*Ž«ê´ª.«Öaª³Ê2[öG2[®ÝTk'Õ ÷Ô³ÏVªSsê1ǔÔxÂ1uÌ)õ7”=µìŸR윎Ÿ.§ Z…ùΉPQf!()EuÆ÷Â÷ŽüÁ?§cŽüOZmñé#¬›ØŸuÂížýÕW~‡4+ßLýMlÂx6õMº­G.YՐ¤â8L›¡; ܎հ¾¤ÖÒ10BKÿx<Âp0<‚g|»X°ÏW@쓥ìvÛ󃲿â5­×øyÌósà¥ò˜ù +é îÀøÃ#¼òa¼QcÁlO)L F®=ç³=ãsUþfkjS6í=1cµ¯Ù ñÑYŽÚbÄýšc؍mÁnx#?qÉ5òӝš55ÍRn,5é•>É5K&¦¬L*…Øg²­nd¾»<ö¹íº8ÎÝpäP¦OW§ÅFÇnèYdZ/<û€˜vý4žÕ¬ApΨ y «ÀZÿ$oóéûçãYçqÆ9|löœGÎËrȬÁ6y0.Á¦O‹¦°è1˜ë +¬kB€}´…ãosB»x/;êÜð×ýI0#øq ¨ø7؊´`a?ÑÂ{€2—mÔАCޓ`⒃¬¿ùë@ÃÑõÖëÁ€uÃ*ïo›L7– Ïõ[3ýÆæx>Í +¸cJ#ËìÛÄGÖ|¾“çñÝZÜ£Ïk:Ù4¦{ â©„&ƒ,Ít¹í,^û ¾šHl¸áD˜˜4ÞþDU_Xu0 e¤;®omó +ê:ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£#!8~²J ÀÉ%çBŒO¬É§CŒÌü÷M²Zr»îfrc×!ýGèûÀz«ð·)OmÞÔ¶Á÷¹ë£Wa>¾ ó:«g,ùیÝ>kb[™ ¤·BWÖë÷\8¸k1õîr¿ü”{ù9÷æò\c;sr[KÞΉ3TO$Ûú+ÞÓ +Íèš6"u^êX‚©þH‚)K.E¨ª<%ºãYbI}ó[\õI¨,Žô|Á–¶+;Ú©Äv–ÈÀ¡FzÛµx´µá‘”WÞbe…Òö2q°™Õ9Kôñ¢ytVrÁƒ­fhv½ôç9óÕNò$ƒ´‹«fšBƒÔ#(ŒŸAØ%Lž³Ì¶(³Y9pØÔNæbÞd_2²pËC¤0;ü ÓãܓŽ‡ýÉ ;a`}¾Àøoºíf­5™Sý¼-(·SpÉ2ÀX–e6ÕÞ$™ÐÂû[¾Ãâ+†XùÈY ðÚ5·eZ¸DÑP¡˜ü}Óªë°Î&gm\dÛ¨ÏxŠ«¯ùz…LëX´°Å +P¬@ÄÃpÔlyc ¢Zex&xêÄþv£dd ‰Š„Bí  +„=ìtA€ÓH8 L,‚’fB!ôǟ®=ïûãNûÖ‚ ‰ýà#‚ËéÛ¿<ÝG>ÝBd= ´<ôÝLËÃÔu#DÉ3Y3!2MÄþQ“èeÛ##>q½&²ŽÝÀeqê{&ø“^”¦8šÔ²p”Àpä¯sÎfQçÛgý¤õš±èãŒÿ¥Îþ Ûõ§s*¬êµ~íû¯-̆ïû.Ì¢nÊúþ­àÜÖ÷˜ÎsÂ<–æ”·uâN‹ƒ=÷Í¡žŸq«‡yn-s]±–f+Ït<îi!ïézŒòÈ°ˆ;æ__þYj|T%Ëã}2?´xõÅiö®J•¤ó+…«UŪ‚V²6T5n2Eª‡;H³ðPŽxØ/|K/F9ä¡B'óY˜—BDkƒ4œ§=*>~q–öþâüš. £ìM¸Ž0r8\ñ/ÂR£y˜R>ÉG›4žõ1µÁ«Gj±fBÌ»~˜xΖ0Ó>jÏ1ÌCO˜7 ç­#±›1 Ãn磫²³ÍÞë­rÚ ãYZ>ÉWñ±Ž¼xԑ׈ܣõ–öäÄÀãx€ÖYãuúæ„f$óZ¦=.§Æ–®Ê¿õ¤ÓåY±U& ëÏÍù®ëS^×â$4‘Ζ§|ØêûƒVMï\eŕá\ž–^³ðŸ´@·= ä²9fñð,¹9 qyÈ见ȓœ<¤jôÛÆö¥rê:Pt&Ø 9¥rXÞÔÉêŽ!zÐÜâ[×I{ßÿn;_OÖ ýá2KÆ!Ù­¹{Ì +à=Çý€›?z%ÇÇ_Ðñ +AÇÿ‚Žÿë ã§ùè:ò±¨­þ Q[§;0…ñÓۀ–{Ô'árÀ7ÓºžYun§4—s«êÉUÙO®ššs´êAÃ<¥ëȞñÞìw9??èv;œãàäŽåTXëÌ«˜ÀõÏ|:ðôÄ>Í_ÓûQžýT®ýø¢yÚ^𤣎ÝË®F…F&4´Pºižmþwö…°> x½Š>º²Ÿ%ªð¯oþßÿçßo¾~ñÃ_®îÿËfEùkJshÒûÀciž}v¶¸$A/I‹Û„Åç~&æ2zIT¼'Àì’ RIpú†ö†]=ð1ûæXFHP’ýÀ +ž7ԓ{® A+3ÎÏ}äρù÷ƒýa¢¢Ós¦$~v²ªÎššîºÈØ5å5dë™AEº¾°“|ŸF•îڌš4Ÿ—räpLY&†h÷X§9?žfâIsâCTê>ՑJí1P>#Nô`¶3¢=k·Ì‡& ú£s⧡/Ó ›¹›žä‰Zώó&né½ãš¹ÒÌ;¨àx²ÿEZ‘O'‘¹ü¯Xã1§Ú±“àӒãI‡ïˆær4•õ2‘µE`=ûì#c°’FaÕ,™e…e®Z=hï粫ËBY&‘¹8žFæg;SëC¬‡GOÕbÚì'Û¿XЋ%ÅßyMò'ý­Æ&úó4çOJô·Lóg±["ó|Tô–FOj—Ñ[2Ë>8~‹ˆ] 4&C꣋µu¹Jö“Ž§úeNü2'~™¿Ì‰GçÄ2-Ø{dÌ:Ìÿõþ7ÿ¬æ-¡|ûû»Û¯îonnn¿ÿüóVuo¿yöÙïßð» ß}uõðp}+ZýöՏoß^A›·¿6ó|6Oà 7ð8Ma3ŒãY'£³úéL&פO¼Õ_ÿôü~§ŠõŸ~ÔÏÿQþþïBý‹tÅæw›þoÝæå3Þõ\PZ*o^ƒzÐÞæ· ry®ß¶U%.+¸Å?Ï·÷ç7/nîn¯îÜüF"Ïwww¯¤/¾°~ùöâåÍÃÝý·»«ÿCzïÛon^]û‡ë¿Þü{Üñâï÷Nk9חþRçʀc/ÕÚ‘³f”Ù’-K¤œË¹—㜻0oþéJëZödèû³.Lý&æ³ J‚u”¼ç mâ|6‰L¶Öp†ÚbÂÅãfÈr¹0ƒMŒg½¬ÀÍ Þ–ã™,ò°‰Ãل[Ñ"ÎÆaʛq>ý‡&Og}ëÇp&+r(÷Íg] +Ã&È·‰Õ'67ä³8À퐻³8ãþt`ÖÛÒx&úÌf˜ú,­MҊ¥›0èC„sm‚¼†HÈv›P{Ñp62칗Y8¥3Y{@f„àŠN%ƒ†ËËMÔ:Œ›q:ÃU›A:§ŸefŒý™¼žÃ®ñlô»ú3‘v{òaŠgÂ'£&ÍCrºi:û7eá½p_^\Ë"7jõÂp†Y'¬Þ'ËT+ŠZ½f»Bï+Ô¾›íÆ{J?E8£lî EoÁãÊ„Ö »¬Ïæ”9«\ wªp .ë ~8oúæ€ÈܓnI«é_a:¯—T‘\ÀÒza˜£ˆÑ…¥õؓd|죽òdOõteöå•8ÁÚª=Nj/›ÑV©§ÓUìuͪ®OäW•gözV¯¶^«I‚pcÀ÷:ÙJ轒}­Ÿ,¥vÇ°YáòÇ<ÊoSp½VºWîr4vŠµ=0 ¸l®Â®º c…qcŠaƒïd[’­OÜõ…vÂű!rWSë…Ï‹ò³™Gو³l²ÔgQ#6³ì"~Ø}Ø,‚ôÇ, Döˆ wÁ^faIt!¯é‰ gž‡²{ U´+Ýu²¼Ã¡Hv7t¬‚ ÈõY:TXKÆrŸPÇAZ—MX¶'ÚE®›Ç÷­zåpÂ¢é¤ i;vÒÂë%/Ží[^8Žœl˜Fƒ0CY^>¿ðÎM±^$’°‰¦’B°¶ì¶B•Ñ–nØx= °ÈdIL,–>Ãý-Br!h‡@sè¦z•,%ò÷ÊÆ`Q€ÚmÀ¨"þL‡ò)Ùþh÷‰@•¶a;ôÐCR‘ŸŒˆõS.u!WÊ zô[,¢5Ì/Ü¡fŒØ.|5T?‹pZ)z«ìÈ"²çæByÌǑ$¢†"ÚÇÜÇrk!“µ™ÐÀø +XÈQ†JVpx…cUXÖaàœ–-u‚€$ƒ|FlK29;ÙNdtÁ°±mö©é¦¡“±x¡©y†åŽ4ñ„Å.3/áÆnnöYNƒ¾ƒ&à0Ø4Œ„aH#t-ÙΓ,5ðèÜõe=ɧq’G¥8ˆf!*=)ȦõÂnŒ¦*ý\ZtCú¬:E'¢í¦VeŒCèíŠÝXÌ/¬ïT*;x˟QFrÄeÙðǕ×j9|qûáº0 ^ü~pcœÜgŽ?ÙÛE†ÄÅó×˽úm]`ÿ]¡8žŠïBb`êüÃö"›s_½PCDšò¤î?(ϲ·ÕÿÞLJs ö®Æ¦V<€Øãd{l|€"aÈ…Õl 2ï},ÍÇO$ÉT݀ ¥y.Ér 5cÑ|¥úk¸/:€ÆCvŽy)·Æqh܁ðÀÒÑîì)°”N2 Uw(5î„ä*ûÖÐ8GtKªGP¶<}¯âì±çÊ U§ -±wg"½‚x}õû· ”ÿyÀt/ŽAtc7:S,žAjK3Þ³¸EÁþ#bŒû…·Š´Tö­âèÂÉ}õòÎJq°[§Qq¢¾œ¤ +÷ÂBJ}Ç=„²Š€WìHî"(™òLî#À.{zÿÌI#§éÒKÓETwBc¥Ó7‡Ëô´£—p™½^‘³lã,ç¬%|'wâ9eé.l.¤7°©Ê>[‹­ËlA$Ú¹ú ¡Óºìí9eé5l.ô‡÷ÊÖoyÄq(c-OÐǕçFNB÷Ñ ½ì鯮¼BXºëeæljrŠ5¹tb¤#ìZt›~hš4ÂÒ{X/ó‡÷šÖoùoDê¦g~»kd™àØ7©,â{Ñ:±åv擃: ™foR„3’â¬Ö8!Öi‚º!<„yGxˆš¤1­¬PL ê|¬Â7HuÜ&bÿŽÆÐúÆì·Æ\n•]‹­Ê­]€‰&Z ¯z¨Ohh°ÌŮٸr¯›ê‚avà¹Ç2 p|` Šé9Y•Þz¡0¦ ݱÖU)]Æ*Y^„Â\­lV1ôcÓj¡¼(ƒÊ§«×•ðºÞô'ä¡O⢆w‰Sb飆=Y‡»8©áWèFص‹—ºá ‰•›š6kÞZÐà+:íœb;ɜ<–IV<ÕCËü4OµS–žêzañ@\¡¥„Ô̲JÆ°ÆÖ7=¯‹6\Ën:í® Jã`ˆ×+26ïaªkßc‹Ù K§u½®ø£k]•b.×܋i"ðÊ dӞW-„¥ïº¹Î_ÀëZ¿éÏæ¾G¶‘Wš§“‹æé¶È¢ybšÐ„³Ð<Á^Dg\ó„~&2çìš'l4º-TO7"ÕÓmE§„U<ÁºP=¡Ov‚ +ÛdQ<Ëç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgiÄÓù…Þ}Eë<ìÐ#–«I#K­³’‹ªH;íE™Ätè/µNڙ ßÔ ûÂ/½2§,´À†lêb­¬¨”µÕ…îY¯^èo敭ßõ´3ü£Lóc4Ä ¬àðW¿^‘Á‘èy‹SsR«­ƒØã·ÏÓÎÚ\1~ÄZ™S¬Ug,Fža¦P‹V&»–°¹©iµPܺoÎU¿Ð_Á+[¿ëÏè°€§AÕÃ+XµQFæÔ)c Ì1׺òbÝ§¹…p”ÙÑ*2[è5ƒ蕷Š¸2°«sÕ ^Øþaiž¦A‡l ð™b W³A}¢¤“‰ëAWž·§®Ú·€À™{3ycµ'ˆš4ðÖ4Ã6!܇Fgô°ôX™ç0#´!òB_.r™¸ÑÇHt@?Ño7»ãCE?”½$Ñ{p!4Á8ôê4W@²Èþ"_€’qDPE™L=V¨ö| ìR¹C]WVì„ã‡`”ÜÛ8À–ßA€€å ž¦YÝu´ËÒ7Ìày¢:…àÚ5|û8 +O—uXa’íõÅè–<œ‡ªã›¬%rӘÆý®äb¥À4ê`-‘þIJ ‡ÖNXˆ'®õ›¦¢`º«íÅnôó ýá½²õ[6^A™¿ô¿aæs+{½"ÏjBü†ž;(â€i9 +ÏsŠ6zE%5Êââ¢2§X«~«‘“JÀµ2¸wah­­ŠÝZ¯^è¯à•­ßµéž9b_u’XÌ×K26pØI¹jÕ,ƒ…å0e¢8œà #~¡^7"Í`hêrJiÔnu2D%ºJe„@Š)mÚgãåÑÊUõ¥JE¯Y»6_ñ2‡z +ÅCܐGHΊKáMÍK”Ìa•È +Åøì&0Ö2¡kÃ4ÕÊŠµj·:y€(˜7MepK„ضj”åíñüB«ìð]›~pIŠÖý§¸öœ ›dxpÈn"ae”éoª”Ez‰qšÚ çÈMeN)­º0ad3ŒÔʄ«2†Ë5‚9-ÊÕËêk•š^ôg38ª›I- vÇ~61ïlA»c›š"Yî«GÈî(€w¨ +tI9âØô˜hñ6Èû BÑ@>ļC@…,å˜wô™z^ è׆è$½ÓÜ2NcE½S&bÔ_½ƒé†y {Çûå¸w˜â0®Ã.:²]<P¡[Bß¡ U‚hÎ]ðZÇ£;å…÷?v†æBƒ¶7uJiÔ*#ç3€Êj]Ò֐(–F ÅåÇ8†ö:­RÕú=O«þŸO÷Üàx×JVÔIœcŠÉ\š+2Ý)f1{s¡ÜkUN°&íN'ËÆ?uaÓԕÌ]M­ÙÚίóÇ÷ºÖïÙp;G2—EÍ-'‹Ü%·"Ô%¼lŒ½ù<;øê[&ÂpÆ©o. °–禮B(m:Ë"&=€ÙjM˜[ãÜ6Y(&–gó ýù½²ƒýmµÆÂ"Â|@aŽÆÊ€ÕŸÅ@Yj¢LKpݏàiNÃPÃœb¢‘ÆÔë +ò»ä e‘Ém!S{ŒåNÕk,HL¶ +è%W¿ª"ü Z)Ì~«“Eꆜk”@Kx”€SLr²(zaÿÉ•R,.t¹?#Fº tB…© l4Õç-Ap¨a® Àã’yÏ©èB)iԘ$œ‘ $@í%ÀhRÂP}UcÄáì=´D=F³GØÉëYT:Êíh|¾ù܄ +‚Ï¢ûëeÐÔäkÒîtr_ôéR@aCžà»µ<[½ÐŸß+[¿h£4ôà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q~ÉçD &pD\NÐ"â<žÀq5   â<¢`ˆóˆ‡Ä•ˆGÄyHÁç1W‚ +W +–h¸Wàp¸Xàh¸Z°ÕØÇ•à‡Â•è‚%Îà  +çñ…óƒÎ  +çÕý^b –P¸dàH82p$œ‡,‘pgàH84p$Üáê<â°5<þ א ¾æÐ~¸•€%Îêu%– ÖU)-0­!‚Í+s”[it‰†ó‡k®ó(u¼ér 8‰†kȆa+0ÿ‚ró`€ÎcêeUÐT䔙֐ ÂVë2”[m²ÃùƒùUþè^ÑúOé¬ÕÝ ;Ÿ0b_r2¬I´˜õ‘æbéÉ=3ŠY° ©½PXXS[—S¬Ñj˜P²,²ö¯ÌD„¦ÕVh¨OW®«/Pê:xÓf|”æ¾N½EM1Œ:Áë¹×à$Ø|D6Š:p]P½E¤ƒP)nì1ÍÌ/ÄÞ9…¶2§X«/Š¥ÐÈA#‚›Ê"ä€Ø¶j»ÕÏ/ôWðÊÖïÚöêGè¬pWvI՗˜æ"ÍV2ÌiL+ü=¶sàî©BÄ·…bš\I£â2B1NMe•b­Ó/ä™"Ô´©• %Íôz—V ÅZ-W/,¯P+[¿kíÆl² 6(,ž×+2zÙPvsŒ–Ü¥‡°¥çu͕b/ˆOÚ ïÛʜb­úæçä<´X*ƒÍ.7mêg»­Rˆ/SmÛ÷ër{]•bº·ÚÈ †‹~S낙wˆm›FyQ”g{8¿Ð_ÀëZ¿éÏ6Ia‰uHTäå,®/#ŽºŸÁ%zδ2’Uÿ"'¶Ïö^"'&‘×ý"D¬äÔÔR֖kþJ•å=Òu_êIž^[Km|¼?“Qý¡­žõ›µ¾ßAuë!@îòtªtY7©³–׌ÙÔLí¸ŒíΪûeÀRdU$´"'X{v_¡bš€WyEXPÚ½=#¸³XË/+^*Z¿ßϵ ¹#w¦·L8JòõŠ Ùp²£>*¨<Ý ÒG—aš/çpS •×/D'Ìm]…`m:SjRŒ{SS¶(þÚdnr4Ïæúó{eëýD¢ÇºC‡¨Fp +ì°Ê¾^’aсêÞØÏ +þ¡€>Є38ÁdUxøÆØ\Ö©+¯©©PJ“v§“¾Î¦ÖEkQÈM›…b·–g«úkyeëý¹$dðÔɒúôŽt©ÔÁð.†Ýk\ ²^I +ÁT€SÑR{–]?·u9ÅÚtmÒÈpÖªQ+CÛ>7Áîô‡óëÊó{U«×üy&( =õ&Rv ¶“a֊*¤©I¹žD{l˜™ƒÆ(önÌ®<¶vflª•9ÅZõ[<(³¨• E´ó±iµP|,ôñê…þ +^Ùú]?Ù& ÌRP‡_À÷¯—Ô\RCLf´dÔ¨eûP)&ŒŒ%Û¢_(Â2A5•9Åu{’¥ë˜¯V6t2U[-”åyõñê…öµ®Õ‹Öü”r?øö ý›¹¤v[@»q#Ъ »åµ»Ôç +ì{õם«’+ªȎH ԝ084»¶˜nYÂ4R…t#k'pƎ螐ƒïЙ.{¬xnkéT.pnxGˆ¾[ ¹aï +~ ¢ÝH\f¨Xîd>ÎÊ-íiDCArO¦£8{îv’ǝ€V s…q§YuÅMILoâ†)ÙPcâîhÙW71@°X.AÜ åe£¯Âeó‚á>ù›g† œx¸Á]©fTGÂ͔\6âéÃ~;Á=ãS¡&yÄléNYQ%´PêJ5Èu­ÈPÙµ½½]«\æn¼ßO8€>¡"Êè `úíäݞ‘EG>ä6|üÜ·áá7*¸mað²oÆ +Ûf> ²ÆŸ ™‚ÚŽ³6æXl¬tä²-K~fhT¡$l`ØçZcµCKê*@»[!³» +ÉZ€«‚È î¬ñØÐÞ+{°')käÃ2©²61FÅö"Òña¬ ìÑjY@° ÁAB´þuì50èß%ô35sE^£ŽK^cÆ1šx¼NÙ؁á®ÑA´$Ø5SǸB] ó‰=3è†k^V0×9a¹î™jU\×ÉY ׇÓõ€;€w®âºR %ÍdR ¸:3ÙmL©Ï/CWªA¤kE†¢®íµhk*#ÖǶzÞ®¾? }1ÆкR 4Ú¬êžFPCZc¬EÈedM…XËþ<µÕ8a °.Ô‰.9jښ[‚«í™ +±>´Usðnõµã±ˆóëµ@¡±qø§£¥ÃhÉ2¨jØæúÜ\…¢—×S |s¥ºÔc@io¬…Sû#•‹üMJ%ëW«oô[LÖ¸€RWªŸÑ¡} ›è'¶€i ¢búe£zujENhá̕j°çZ‘!£k{-‚º>V¹Ì¼T´~¿úê°CÁO¿ObA;ËzÑ<œ ãó«.€ÓÂø44Ö/Q¨‹ Û s¥ÔÙ+20´7×B¦ý¡ÊEåMJ%«7;åàƒ‡`.ñ¤²’ ¾=岂””}<§<®•p±÷SªÔŒlÝÌ o59amtjÁ@zE&éí-à”õ¹ +¹>{©êð%æ£²~œ|qóü‹Û‡#'àà×՟^]ëóüöîÅ·ÿéúGk!v›ç¸¾:vpÎùÍëo¿º¾q}ûÐÜ`ñcÓÉÛxÎÎ?Þ¼|ø¡4qê¹¾º¿þóÍõ_ä±^½=Ý3ÍÓÈóß\¿mæä忽þîá[‚Ëû»Û‡Ÿ¼ú›»7¸÷D£zô=ÿáúæûžú¢¸ûËۓ#{ñLÏvº¸}i·?;zØÓ¼ùó5ŽzâoªyŒ–Eœo˜U…È32«‡ÜӒõ×â¤'ƒ›¿ï‰O¥ÉÒ@Åo-ÚÕ›œìøÛ¶ŽãÔeÕ3Ÿh —ý¤cvÔ©AËÉýÐéáÝC9¼{\&ω³Ü‘£gŸa-ȏÀD¾@Àék$ðMIp´”œ"¨à Ü«ÏÅ4<D® k¯’P¯áÕ²UHÇj‚žÝ;!¹L²½‹jFgÈt~îD‚©’ޝn¶ã9Ž#„©a@Èô …àoëH#TrÔÞc#†N 9¤Y a¨o§' @䢭¼]÷_Ê ðyȾ¬ï&»úsZÌì€Y‘’ƒyvƒ~ž˜z@¤Yy·–õ=a‹ìŽ÷@ò*_Ãñ­t± ±ˆåYÐXl¸ {Žî2m…0Ï5\ÊvMù­š°®CTÀ±=c¯N%f¤_”Z9 +Æ9Ëðdìȳº÷2€4Û úÍèf'µ½:Ùäéé·§ÙyŒ\)Ê*G™¥HœŒþî-5èØËøǀU #R™Ç;ꔍ¹81g›`j$`KBítsY“QGÞ\7›C…ÆVÌÀâÃä¶úØzÚRً8¥/'«Ó¤Wl LŒŒ8†·qTGMŸ5Ûø4Õó¢¾ ֝ºe¸Ç%ã䁕‘2¶Qa|8§·Éj0ð T@t¹ûLµ‰ã4A€,ž.9ŽŠ>1q©ä$tøêMžK¬W~m÷ ÓË؋²í–ðµtÄÞ!´Så>•ð¢¨ºï–ËpÎ×b´DDH)#ìV˜ûr۔°—Ìú0DÉC<‚m²„ ücÀ yœÄÔé DB=N:ðèæ³Ìø‰wõ¾õB~NIë¢51^1D€iª|¤l¥Ó=†š>0ì@ÉƆǷÅÞAgÜÐ|Î:‚.Ҋ^qšGdT{hl䑲XÕòE$E†gôzXøˆjžh˜H³+“;éTÜ×ùaˆ/ìdÙ0‡QÒû¨é\•÷a”¨{¥½ž<–ìÌ`)F„Yx­óÊtå"Xà95‚ž.LˆJQMo3OÈf² )gî©ô«ø}|úi.¯3è&B´ü ¾gº*¯'cÈì-ES9Ž#"˜R 2a̚k_Ä|övìKr*¦ÒT*™ÜÈPžÖÁˆw»Oö>t.õ‰`èS$ßB`OI +Ù8C¯¦ØnXHä*]š51×ôDK4«tÏMµS•Ço# ÛS„Ÿðbâÿg½;NêôõŒÍõº¸Q¨9˜‚<ÆkÓ±nŠœƒ³9Ä@̣Vɞ231\]xA[“õÍ]Ð/AbÄ6F¶”K*œæÐʒ<.J& N{ኟÀΨ0÷ǒ á¦öÜ´4+m¨™¿+ Aª½˜ÏQ€òü¾ k,G€L4ì^sfä¾!{”ForZìôqaÄÅó’s̚ˆmÀ«Á§´3E䜐‚Œ^ÆNkFǨ1ÃàHýûx嚃…€ƒÊŠ´X0 䒰T¦Ür·C53Ÿñª„ HPì8$dïM$†»ÃD†jŠ1ž @ʧÄS ØöØ©ÙÔHÆ[L<1S±r*¶ég›Ð&^ùE¦æk@%ðD»3*lTã™âV*¡bK*3s4˜› r荤ªÏS”ËÈ8hF Ì̌­ ‚Aqøµm¡†¢ÀQ_"LñœÈ/Ø}~r 2¨ üŒˆ Šfp‚þ¡G5L )6 óÜM†™+]µ+šŒ°™r4”)6OCŠ›aƒ.L¢Ç +£…¦oë™a˙ŠQ<«gÈ4fz®µ¹ÙC:â?2©X’0ɌBŠûyTˇ±Íê4@âmåüxNjq jú˜¨·;5šF]5€Tdº^G81©WÀýëÆ +…G–Ç ;³²rpOÄ癅 ³pœ™:Q3­øÜe‹¢VæÜ :*À’è^ÜÖ3ˆ §CÍõ6Jf¾‚&|c§ Å\‚Iß3G=ù†±h,e*=f}AÔbÒÄF F,lð•«*òÓD}jУ—8tì#<-"ic.«©„’峁¹“1Q0I•3¿M·GK€Â„¾˜¿HnÊ®Äö8aª'¶ì>Ès0¸¨NŒ ™°EªŸ(yªCúy¾,Õ!4/â/é¢âR)¯Ú­ÀôÏ&›$Íî2Làь©óìèŸ!ÖÔ°Á#³£¦xŒ 飿‘{74<76V„7ê¹(ØFF›Ê +¥a êcffØ^5D{\ŒÃ¨ijÉQ^DÞ$ΊÛ×Yl[)58}Î49 XYHz«ð? Ÿ¤š”ÙO´§úF堎 æKMÂ-CP×EV3ÁˆÜËúÞ÷4CÎþÙc¾[7…³~R¯Ë‹bsS6Ù+T +uJÑBˆ£‹Aé--¡~ç˜;% ‡¨>礮’îæ\¸è@C5–# +=†ó& ÿå~„uÁ +̂–,·-ÌdŽ-˜þ躇,Ȉmœ2g§mŽ;`F0؛±ÆBîÕ8^•ÚtÇÄ MêM“Ùg‹yMÖâvŸ¢QØ:äúÙ·4¸eJúTˆ;&užhúNÄnϖÌ|‚¨ ¯Š;ê‚Z8 Ü‹¦:Út¥hZ«¼ ÀÁ̝VG0ߙùŠísyrüì »c¡b"«F-´3çrh pT™·MuöÀ{ì-…H¯y`gc8XÓqÔ]ÃÔ²úvHÞ¦Õujv¼¦Ò<óÈΙÁ¹4 *çlþXÃ@í{ ö°Ï¦·‘«,Ò'¤’>ˆT˜:àMƒ6Ɋì¤Ý0#LÃ; }³®¦ÆäΝ¾ gËlNA†ˆ$Yª30&Ådƒu‹ÄÿŒJ4ÿ’F>~Qø3WŸ-ß2Úy“~†ïŒÉpv%c¿ýÈ4d%†ä„ÊÐHm§V58ÍFM’0ρW4öwF"m K€3z£)€FØ?h*½Óñ3쌺áPø¬¨!ږ…sþBë'ŒŒ£h@íxH„í<+œù°ø~Í]y´#ȑRšoR¨A²bF)ߒa;‚ @c5æ!Ä+v43èJD‘|VN÷¤h¬·Á$2¥öLe[)RvÀvªž\ÐO;¢H<¶NÖÃe0ª0Çæ`Õ(¾(»_œóCb"6ø':¨@1çàÄ·9è&eí!df.=¨†§lòԉ‹>ºÉT@¾@ŒðÉ ÷V—è)£§Š ¼ý¬Võz†~\î#±?»N·"P¦8ë¹Öœxv'Dl‚:Åû¤ G/ÈêÏLú&ÜÁÜ`ŅpPÖ§R3Sb +-ø&âšUŸ£uM[œÌߨ0ÍÌ cœÕçK§R‚º{‡Ñ'ÚÄ Ô­J[0+S+L§J[eV +Pj«0ƒðñ¨ÖaµE¨ ЬìÂÉ>iµ4ñ/êœÇ«RéÑÎúdŠr¶tQ4ˆAÈαá^çyW}Ðtª˜csÇ,£zõ̶ ÉI§¹l… GÚÜ@&£¡éR'/4ŠÁ™”äs˜„^¯£cŽÎɾ³C] ÑÀÓÇ¢/—d!L/‰-`Kk€À´§ÑÄ;œö={š4nÖX3➄ÝÁ¤§œ¿×UÂSí>îY „)Ôû:H) ö¶ÓÌØÄP½ª©yʦFÓan¨°úÄ ÞIN)œ‚ÌToðÂ÷x|w‘YÌÌK»(}˜´«+rS ‚Š H\c.\½ I6Ð!SGÅÞ6šÿÂ¿sÛ(¨ØbçÉEF™54ÓñTìA­ø\æˆÜ4ƒ¦Â4¨Qή¢gÙÿQk…/ çžìŸÄjæðN½[Qíº@`£³&aÊ5ÌTDÓñ̐@û ­Ðû¢ÐzÅ!€Û´(”g  AÇ>[Õ=êUŠä-BVï–pÆ`œkÇ+q´3Üe‘93ᢀOžËtœ«ŸDt7hÑ÷¼4pÜi¢ï¬]Œ³¦ºö6$ȅ©w°«È«±SœŒÌ³ÞÖ²3N»€…gÖ¹ÆԐСaD%Ä'eUTFsŒ¨%˜)ˆc±¦€Ç„bœõ8É;+Ð<Éï5‡Ük0:´IÇÁÕÉÞ„Tó5Îêÿ̍™fuìq¯êõ1™­·u>ð'v#½AzÒ3ÎDPNSo¶Å + k{_¦ãˆYpSm®SÛSY%NôŠ£0HìI¤'Ÿ·ÁwÅTI£=iannã¶óº¦ÏéÀÔlúÆ!TÛ8 'ˆ3¬pj¨‚‹<ól*õ7±k9âÐsÝûxö2z¥hi25 <žv!>Ç&c&ép±†I½Ý‘p®¢šfu8a¶×3è'Ûè‘5“jP%GṈ­(Rµ´ö̋Øs |:š:ç]Áèt*¿Æ3]‰ +˛ ‡•ç‚ºR‚1‚ÑÒ¤–ËIÉbÖäWT©ØX™íØAõ ~–͹ó°ÔùÞîÀîŸC€ÔàxmeHQGûdbìÚ‚s8X³ùbßIuçžÇÐÓLí¸vRs"Œg6R¢¼ºnºY µ½¥S÷öu„ $&¤< +2¹œéXNj@t­†^0µºá#Á´aÂÑۗxÈÔxN5qѬuQ¨é  3é&@Ïìù;7 n5ER.¶ ¤Qᤖy…'é6¤3ðÇß.'ºaÕ·Íôrz‡ŽGAˆG/Í~ˆ ³Þ0¥nŽ<0 Òð`Ê1SØGqÅàâ*욡KÚç'@Èè]Yy„VÑ~ÕÞoñÒk°òPÂ,~.‘î8EнKDǓ±ËcÙ …ð\Å%3báºÂÜGΚˢdýz•»–ëH1Š^È×ND`͑ŽAîx™Z aûÃQ¿…àÚ"ÏMŽPH+ϨKEóYÌtVrÝ»´TT™Ff!3m¡k”îOë¹U{,Ž1#Ŧ‰9ÅázÅsn¢Õv:.,”£Z€‘6FÖ>F2’ Á"$äÆȘ   vBÈzæ)ŒÚ|!™Ã¿…Y5c}=U!W„Á¦äÀIˍ³ƒ(hÍÎ+[*¶~†¨Æ“ñ’e±˜Á/ì\%¿R×`¨Þ€Ã }Ç+è8{Q¬9-yâ'NQѧLU¡·ÔH²${Ç.Àޖp.°é™‰â"d§‘ÈS·VWàÎ(F硵1¡_T…Ý Ψi‘¡ÔŽV=‹–ŽÈÁ˜/ u°S·u½ 8Cw2~(’<Ë—a§u{ʙpdô(_úVæQa8¯€‘üuV·0¤99Dû„ 3GU,vJd ¬W|æYý6ºÝ!š›½<«ÿ XVLÙaR0%™Âÿ8„Æ’*øú‘&€'1h8ϏNÂ<ª BnS%DZúÔÔÁl#³Ü)°•îA{Úo£ ƒK¨3 ™ØîCoMÜüo“‹^¸bBõuwH”¨ˆG”Q2Ë!–fÀ Õ5qóOf–Ä2玗L.ûÏ.D¥A;8±Nuú‘ƒ1h¯'Á=b)QŠ„Ó˜6ðÜ)*MXâŸ‘)›È‹Nכ¾ÏKÇjŽ*ðÀÇ­n÷ÉÿéGÊ®÷#A…H¨}‰pÛÁ±L`ç¨÷aáãH|~ + fKÞÎôS0§º‰üt16&ÅaÅ à6¢Ý ä0m97öÑ\ïözYñPo¨Kh ²‹€±7¸²AóäL½A¬A˜• ¨œ)(HjêUÖµû‚Z®‘®žG¤›çÅ}d[¬¹â6'å¢lr©–$É`””ÔDí‹2Áöb9pJjéœ:ÝC0ÀTÎoŽ®ƒšˆ„¦úÏ„óãLa +¢<ëɭߏ Þ9©úÏTð BRdvWÏëLÙïìtÔU¨£¯ÓCÂh_ˆ³:LÔ4GÆdL=Ì00Ç1–„#¯Ã¨ãaQY ˜ =x8Á íƒaò€@8ncîEn‡QB Pg@=¹ódUlmªG"]¾Øè(~˜¯ŠJM¼ýx}ã˜%Sä:$Z½øO =ÂÆM,΍»¢NŸbeg*à©Bž‘î8 †{GmuN†4Ðaw˜r‘±Þtd"} rƒ‚Z%1qpÞ L¹Z4¼®ICrô|6X›xø­úüh–· pÉÌîÀõ'Ε¢éRΜz¢MÀìî ª¬â´LPY=@ùÍp &V{ݱp³_}€q/cÿëÍó¯îon¿ßüj·Û¾xñîõî®pñ:άrqb4‹*M¯ Yq +}Wd­d&zhS†Ðs–º^DÜh§±Ó*AÊdmIKJga?t°U¤úĬ÷}=?iÂ)çÀ€Hõ¯PLä˜S¯ƒ‰f°t,ªw™lÒЯ}¹OuNDN‘PóêËÁÀ3O‰é)Hw`\cë …>ìT`S0G—Š³7€øêÎN7V ö!…1?©Ä‚ô¢ +9–ë{Á••Càù)ÕÀ#J}jÆEbîByV8\™DûÀ#m0i§@àŽëÎzèùLªe¢3[9½-±:¸oc½þxfUõ>¢«a ƒ„ÄÏ܍íí‚&HÈQí_L9 +J*¶m0/ð]lfcÒYT&`¼Œ€éLÔÆ&Èã@@ñrs N<<¨:É-z¸^Êîúapï}Tz±ê£áٓz'ËÁbg™Òmƽnï:ð„èñÎdÁaPüš†Ç'sÌvÌàfõû&Ù7̺yL½h¦%\EÆ LgêZ“:MZØ1;ã—’†Ë8–ô(O£PïÚ#+°÷ñl ‚²GJÐõXн“íävx@$ÄXµâ؄fäW0YIÅ°:B³·ËŠà=++däPÀê&ÄTóæi qžêEØqá¥iB}ɐZz¸6ÇFÚ8üÈ~4P“@F „{FÛwq¼À(›CëüՀÿ‡2œËڄLÍP“€–ã2³‚õÐ4¤0¢Öpn ÀS6å}Yx2œL“·— „D]4z0ÍH&|ZA|H׌Š‡¿+†'zü„•BÚ¦J‚ÇÄ<…6 ‚é<:aµ¹1Xs£ÂŸAÈ|ªQy pb@Ž¨ P1âÐxˆXâe腒Ú5°åfò1€T¬=3¶¢×»S7¼úŒì³È”ëí.#šåïB“ ÎÑózzó¸÷M( À\qÐH½,DO$CW¬»Ï¨9ª` OBª'zË@§%\³bL\?òxõC.UXø!.2œ ʆöÃéûÎu@¸þ¦ž‘y4ÙÑ—TÒ«‘2œóY òšYtJÇ +ö0f•sa©ÃtßnY\}IW X°þfÚÍ÷e¨5„¿cT1Þ³ ƒÞ¥+‡ rVo»w¸oÈê™çk a~`<¥J̟’õ‚Û<Æ| "•øt¢â3 pԓ™3žJëë²A_Ãь˜RÌ>ø‰+@1jÀԇ¬)Gªj±V$c7*ìbeTæ?wÄ)<0ƒC–0Þԁ5º¾9SŸ8Âtн!+’›ÇT –©‰ˆ£YÁƤ``è%ïi-F¼@§òVbyR÷ `Ĭ³…¾gÈj_#¥û©÷Yçf=&›H{Ê9ØnôLÄØënïÐ#ÂNè!1 ÷ƳrÑ_C§çíU€:OÂâäêÕSC˜ô:e¥¸“X¤~lñIæHÁ*鞇Eöz§š’é$¥1Ç%u¸ö”%fMZ; êpïUq +4ÂB;|Ÿ%ç©zÌä¤* +ß +.aëF¨Æ5…÷Ûe8’™9́$“q +ôˆ97Fž,tS°W¿NÅùüÓ«Œ`ø”yI=ëA·‡æߗ³*L(ãqAú*¶©žX"ÐÚ`.}³ð ´UtìLUÝüؘ¶gxo0©ÐJ.hÌRBƙ‚š""Ôûh«÷™VUªWýDUfdsŒbP-˜¨Oúg51zr¦¼¥&9};àæy>úïá÷€5ÃÚÊtmN æ\ÒÆ:8ã‘:Ï}I+Pàj× Kºªu*)‰ÅÖ«6`iýtKš¶#Њ†Ó sÛìâ‘û‡&ó€nSŸ2+Þ¢·ckõ6ìqùßik@^±àAÄöÎE‚Ú]YMÀ³…I2‚•280h€öÀ6¿Í,–È\¦9(®ƒfG;´•y'jðÞh˜„&¨êx?Ó§†ÙC08¡é® @†`BÏð`- L9)bu4r³Ž5îÆ8ؔ>ïÎ,ÁXt™O¢d»ªx†ö²\O:%3Ü1VÓÂòJÀ>À6Ž"×#ðÀ؊e QŠÄ¸F…‘0òhIµËú}:ÿcõeSè ¢i ÌvÒ9_-kÕTÒy j.ê-X‹yæxÞ§ZlÍP9êÌn‚Rðö€0ªE½Ó= ­!/-J-ÉõKj ª3N@Íc *­\ƒÆP‘@QГpYý4j’7SÞ¨¢5ìüÚùEìœ-3Z¬Šñê}<µà¡zæ%˜Ñ•þvh1ahôeú÷±Ç€JŒ5a>œ¤1*ÆÆào] Ž€÷…AßÉ£àC±ú&Ks/š¹Ò«-Ùó=ï±ÊAO#Dé¥Å^ßn41&”4°ÆBOj eðpœvÙuMjv}(¡ù“ ÁT:^°ž©ž6Ùë†f‹Èž,\¢,Î c3.óӆ7`Ÿôí(‚ó72Rk)ˆa°Á37&Ù@¯Ép¸ò¢…ýóˆ9-rÕVù¤¤¦gœ°³‚ºyŒLäha°~‘ç jøÑÄÜ Q=rüˆí2Zz »+i¸J44£‘ü(|FË`,yŠ Ý —£FÝð*l[4Þòœ;3öÆԚùáӁãEN „C»@€o7«:êUL©6Gf†…Ãä‘ÄACíÇrXú`Èoˆ¯à }P,7…Þ™Í"óPÔ[˜Cps¤¡2‚ÙŸü>n¶%‚BËR‰† 4ÑásӜŠÙ‘f_DNfuj›ó9+¸Ô$œ f~€ ‰Q7ïPb{'F6éä +y0˜ÃŸË zlœõq#ó»W‘Æ‘‰£……ði ҏú™ €`1€&àô:¡•¨4 £4X:¦AÃˊÎÅ7æœa RÖxM²oF†ïíÏo·À\pb(hg²#1”4À° óTC¢GkÌv<|oÆ:ƒ: fñ·Ó³jf}ܾñ>t ƒÕG嘘ú&¿M:ÍÀÌ4%è´LåÄÄVˆ«tž¨)ÐÆ`6çb6¯#NWD}Ó5ëÒÜJT°Ÿf}ÊNí»Ù2{Í +ë!a]†~q ˆË¢ ÂÈtÈ6tk‘ýgÐ +À¤OC²åғ©†IÅãX'õ¢rÇJ±dë >5—ƒm¾ ̃Œd‚yÒõ4ª¿“‰/°Á1ÅVjqjé1hGFí±èЋz„Ú©%ÂïÝYX:%x4@¯§+ЈàGÆÐ×9i¾9¾4Oº7J¬°æâ#Á»œõ²9Y·h4m=7¨Wӟû )–¿®Â¤†å.q þƒfoUX˜ š-“nGð±r à4¨ÇápàAuI¦kòxIôt23-㛴ÈF“2%¿ +÷ÃIE(!æt!äqq›Q™63>Û€ÏËQ%®B09/ëºóËþ?öÞ­ç–ä8ϼÀÿ°/=4\™••UyiïÑÀžÙ–ÁG¡i¶-ê¦AÑCøß{½‡ˆÌ\ßnS’7_è†ì/vU­:fFF¼ñÄ8$“CyëÅÓp,³´>A]FØ/àõn`Áýxêš!~'xLî ÖãÖð4Àç{v?öt)K®Ô¡¸q3•Ãã÷î2 Þï–RVèøXôO€Á»t AsôÔ{ à)\Áä!’QÎÆ}UTŒ{,BZñ1âYq´ZÚÝ~±ð7Wˆìv_ëp™¬VZòñ7áÃp8ÎÄTÙaA’‰­ÙsãÊñ6΋ß/ƒ1©*ě)­ò‚.c/2ç „'äyœYó/~ç}îתÇeÁ@ñqIyîÇ[ +>fVÒátp ÖeVÕcB/=¬(MŕMþ#f`R'xô°úÁhDÌZXœÁᆊY?ݱ·N­bº“b¨1äëFmÑ2 3 ç÷•}êñ×?¬ËREæV²ÚÏ>Ò·ÐNv½YÀ2‚Xç0_bqsÇìÿüYÎößçhÿÛÐÃ?‚ÿžÄãý» +é62¾^èσ\»ªèŒ 2‰Š+ýøJpü­oyd³áÓBµ²¢±.Î'ÉÇXÚ¢˜0ÀÇXƒaݳq!A&òÐØcü³ ê1þFa×F=æNr 6Ñï@ßR;7â1¤•/ð±\H Ä;¾ 0Ãç»àŽ¡ý.íLÚ1ªE)D(HiÖmí°ãÕJŒ/º¶B¨ãv±»‘Ž[€˜ƒt &?]’7çâwÒ13}Î2„¥ NR ãË3í:†TX!sŽ™†oerŽ҈°bŽ AåoRŽÙÌéirLu@}ÞÇeˆãK Ðóïþ†7¦qŒI7ÆaêsM¸ñeÁÛÎ6F÷$r<Œ6†lódÑhc,ìĜXÉÆ¡iM°q7ÿ;¹Æ]%s;Õk…óšLãnUiŒiú(o@cÎæטZ¹’]Ì¿©¼|6X—”%ØŸýì»í§ñ^ÑŸìSˆXJAõa¿6 +r1'qTÙläbYŸ–€ahHzˍyº˜ïÍÓŁÌtÙ©—^wn1V(Õl1@T-YB‹¢he6hñ@ùw‹¹vzù’,e^+¯F|[+ž…‚VŒóÀAVX1T˜UŒÏàÐq™‡´z܅T‰'†W?¥ÓUž„wå'MŒ;Òš˜%ƽ™Ò)Ô_‡N½¹àcã#_ ‘@p‰»U«@]1ƒýÙ©ÄH4Ž9B‹Ðõ˜™ÄÄß·x×3šÀ 3³}¥€Ä­‰C¼ñˆO›#Fتӈáq]øø6ùfV©öØٓR ˆß]¹õ´œ“øSû"FåäGƒ°q±)%ý’µ¬bò4Xߨ€<“„Øñöc§ªŸÕėµ­A Æ/‘øo²ðUÍ[ùÃ,“RÌ¢f‚ÙDFòˏ>ŒbüóÉFU»î‹2ՀîÚÁÃ`¨âý2gøb×àå/ +ü6è0 Ә¥‚9Œ¿]iÉHþf©êJFòdŒó«EՋ@‚ùçŠF± æ«  ¿V^¤~l};ONÖ0rîp5 qw'³Sñh^œÍà cŒaâĘaü;ÆF¾xÆ0vpÜ1|5y6Â0ŒüÈÄáKx°+H“|(›º£ƒM´Kr0nQ›ÜàƒÃßF ¦‡Ô{Bƒ¡Þ<ÕËR5y‹…  ð/æ$#!Òúqšv^°µß FPKVpµŽp›x‘SÅC T07:ë$#Эß]@Á·Æ¨äw$o”à0$x(6`ü/ø«ô•Dpµc›xí€àü{å‡1ðÀ¨pÂq“ìWnƒæ±[²€ChàƒËi}½Sy™J¨@\ ´šhàƒ"·óÙÑÀø^Ų6ø;ü¬èµ†, .çF9,e.Á†vމf`úºv20’ã üzo86&˜ëñó Œ‰GI*ðA…y«IƨÁÀÊFÆ-¥ãTàƒtn)ì8øxƒ‹TV&ø0°/ÀޜÏNFŒ1«CӃyÀ@øÚpÀ˜p°Œ 0( ,”Šú „¡ÎsgW÷ð2 +˜ßDH€¿á¹n `è¼îä#Ù-.“¨—‚F+ŽˆgAÆ­–ž[At%ÜÙÀa ðÉÑ%À¼+—,Rxˆ¢ðÚJ ŽÁÿÅ¿XºòOGØÿ{ºÆ=è¿ÈÿSAµTàՍlˆÙ¿4kô/Âô÷Vò/üŒ@þň‡úŽ`ú^ˆ$`çüKgÿœFæ½ðoü½Óhð£äþ¾»¹ÓF<Úà³û«F'wIîo¡~È\z®¿ —·3 þ-Ð^Qhà_lG _€ÑKóíþ¥¹˜ñ.!1ÊÉ~ ðoayäUßÀ¿i S~½'–h÷˜Ü_Zžò¼qqÀzÞk­¦¦)AC¥GíoÜ_¢àÏg$÷{ž ä÷—(Û»œoÜ_šÙþ+¸¿øçîûËÿè­¿aEû=ωýå>ϘØ_þSñ?MFXEîÙ&ö—I0¾$ýå"nÃþ"S%Ö°±¿¸Wû1öW¯Ôö—ºÚ'õ—˜Y@,‚úËöƒ‰Î•ú‹_x.¶4õ§tùÔ_¸ú[j`ƒúK•Vukle°¨ÛõúË]YT4Lþ_ÿ þÂRžÐ%õ—´\ÐÐ_„Egê/ã‹ýzƒþ2Q§ïÊÔ_†„¢6õw¼þŸ q6ê/0ç•Ì_ð'k¹'òÝÉx¢ñV¦ÊøËÍú5y¿8Ð;ìw¸AG²~ôR‰q¿¸N9;îw AûEńý"'¡²’•õ‹XäaUSîu7“ô‹¿k½Þ@¿֜“òûØeJÈ/³&÷xcü¢~ýêe"~›S¸±F )»¾!~yÕõ(“ñËÇÇ2›ÈŠ|nˆß¡šL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK +*"Ê+Ü·P pô„û*0ïԆZÞZ'ît_jÝmÕTŠ€§'ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿiwÒ}•  ˜os +ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥<ÒM¸/»STä)UŒÂ|v¦ûò¾°`pÅûÒ +Ãx_fíì¼/ L]lx_Xƒ +ÜUë~‹.x_˜}Xñ¾TnÞWO¼/»»`,¾/F¬¯v¾¯´œ 9üÊÍXj¾o©N–l€_X¹æÀ¯$ŸÚìÖ(&-ßFzÁ÷¥!ÂàûҀýøÅH.v±¿êà  /Á0h1hüÂÊÊáü²[Ï3¿4`ìÝ¿²># ¿<«/Mø…ôýðËX°áWe!¨iᗽa«¤“ð«fjWKÂ/úqJÂo!#STÞIø¥Ð{Ü%¿¥ºlÄ/ÿæû½"~im5 ¿Ò‹Wå›oþß¿ˆ¥;¨$a[§¡ÂH~¥ý>žðKÿïªú$VEº;ÁøEén;ãæršèKÆ/,ž¾Ìø¥%ò“ñ[²ÿ„¿ÖºÌ÷9ô&o,ßÛ Žå{[$_ Ø@¾¤º¶39¾ü[ÀCF°ïFÚa£øˆ÷> ¾ø/M0|'äwEøއ“£FøÞnM_†ÅkÙ¾Èìá܃ߋO%äÁï½£ñÊï–« ´©0ÖI­'¼·W ãWv/m¢3›}Hƒ4¹4¥K½íRŠ îØÙ¯äö"¿ŠŒ¸°½`Ž»´Q{©yD=¯¡½È«Í¡˜½·—–²—½oY+bo÷:)€½8Pï7^/OL3ãz»WAë%‚ "¨ÖËj7¼œfõ²&J%£zçARov/5¨7:Šùu›Ó ºÀôÞz7~ +{Œ¼¤b4.tb£Á…WzIC²môŠr8‚Ï‹?;k“Åç}¬¬Øð¼0Ñx‰ç…ºñû ó7Œauƒó¢nâàՈ͋Õ+w¸z:þ^ɼi3˜´œNPMJâ¹`Ù°¼Ã¬ òbY§æ´V@Á•þJå…Uí£åz’ÊËÕ +§ÿ•ÊKäõ†r„ºÆT^nAºÿJåÅdÇPqPyá‘VqYV‰U4þÆäŲ ^q0yyN‡¶R}4ü‹ÇÝY0ãÒà„F÷BÍCB +†â€ûܙ¼ò0ê“L^8Ü“—6;X™¼tÓxòfòD:˜¼•ÏéÃü1™¼ Ö¡(bcòÒÊ,¢™¼ +áÕ;¼ ̱teò2îÙL0yÉÍàáÅäMïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8í–áî°fÛ¢‡f’Wñ;«Ú~v‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Õ½1€"/)¼6"/UöMÀWá;HE.wy…©c'òRùHíB™ÊoƒÈ‹GɅÓFäE +V§äE™Yתÿe¿©Ç eU×÷H×>-F‡€ñ2JÕT:9a¼Œ¨ô§&7Å´A㥁­Ö ÉғD‘ǹ ß q-‡æÆːàEø¤ë§°ÎD°Í8^³JÙy¼ˆö°zÒ8^ ²‘A°vDiü ãE U›(ÞI™»$Š°ýçÜA¼°DÏH×Ïj³ö$‡÷öw±ax¡²CþÁ^ü‰¾á…J õÆà½Ý¶'¼7¨õJ/"9ˆlÞÛÁÖàïv¸˜GIþnwloÃïòDL‰ñ»ÝAÃ ï’ +uïì]6‰êEèÝΨNpw»3v·›E¿hP‚ÐOPwq꧄Oè.ûW#igæ.kÔ˓ÈÝf©×FÜ¥ `Ü ÜE I„ž‚· èUßx»XâÜ.ÖhH´]ü '~ƒíBƒð~°v¡ÎBn(P»@ö³‹QD·³{¡¾4»Ðâ`Ž!vaDì.»Ðð n \h|Ìɛ…÷WS>$ðº—zŽ.û¼NüÙÙº(¥§Lݐî`uQUCÉö +Ö´?\ÝË́«‹Š ,‰7ª.ŒøŠ‚ª{yÒ ¨.Îä4œ/Sȼ#ªg¤.œ· »ðYÀT8Õ>gpp½\[¨‹ÞÛà颪® §;Šwf +˜.$Ëäë­0]1ìK—5E£%JlûV’.ÅÚו ÝázptñwüPrt™8,غô×nŒ.j»Ú(º¨_lç¤èâ;GÞºÈJè5‰Xvs>´¸¢gÕº3ti}ÔÄ^ТMËH†.Cépo7ˆ.[¥#Ö]Ìû ûD—ÄùVˆîŒ‰/§8(º,Z@°c£èÂՉ—C3xîPPE7óÅE—{+ݳ 3R`t?xv3(ö1ºÃ¹®¢‹ïa0†ED|£xƒk¢a¥ÑNÐE-Áánhª‹ÑâËü\ìÇdΆÏeåæ)ÿ›ôÜ܀â26ÇûÏUeD«Ë†èۅW>é¹3Ñ´âséÃSWø\®˜Xhz.#†Ý¥u“Ë¸a¿]8à€àsª" #„ܑóbÂsUôÔOIÏ¥…=|7z.÷`Yé¹¼pL7¦çæß=—áddàƒž«zæ{$=—I5–V¬ô\FàÙ:ð Þ!ÑjÐsé.ã mô\:ZÐ&=IÖa…Àø°°r£çò¬Î3á¹,¶AH#๬[À(»Ásiå×nx. m ÏåH‡Â‰ žKÿçð\*¾Ò€çÂ@ýFÏåòô ‚ƒTXO>—ÃÆ£ÕÄçr¹Š{ø\¼å¬Y|®2Ÿuìø\‚:Ћ+ð¹Jגü\$ 8Ülü\ÒRš;+=DÜ&ø¹J.h4›ü\Š.Píü\NñrÕû¾wÅç"Á§{n|.A,P4>[ð6mø\è3ØÜ>ð¹Ì2æ<ô3Ùº š1“ž›ÁÙÀ¼]äaø²l]X)£肿D"ºH1µtI€ÃÚ5º0ÐÍ ‚. P¸n]2‘šÂ՜IJ~.÷bÙÏÊÏ-—}»àç¢,˜‹’àçªüFÏe6­È¦’‘çÜä8¨CB¾¿ÑsaՏ™ž[:GÒsi@8f£çÂÚðÀƒžËÍxLÏ呋ðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ…*êzî]$ué©åfÕ  èNà +ÐMkt Aip“ ÐÍsCè2;;&A—×È£A—鵪ү)¤K»`è2¹†uM0t™!C ycèòµÇš– ]s#e†.ÿ+Ñ ¢K¼\é€è2Y¨î«±€Gh_áÑ%ªñ(R”ÜúTÔÎ< ºü¸œç^;‰4z†èâώôb@ta¸Xš¥Ê°2S]Üǖ/¨-OU*×]怙¶Š.”w¬Ü)ºxà’E—D„[dIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±=ƪòEƒüu¼Ñ……1±£Kߔ)Zct »/;*‰Nrîí*WpîC.ò²Ïͪ« æZ˺Ss§CLÍE3Ñ^ÜOª:°2s¡1G~×Ì\„×í mµàk#æÂ0€¹ˆOârQO€Ùz£åB®´”`¹ø[)Árñ7êÌ6V.©Ãè´gT.÷x}òìܤ|#å2Z4%¨ÉYLï¢7Ð?²…“ ý UlÏ¡Á? ¹ggÃõ• ɟä²'ßq&°A„¹w<îi½DÒq!G7kB`@ˆa‡ãŠ+ظ§›$÷<¥ÊÚѸç N–`\$iU7ép¶ÁX±¸mXXc*.CmãL(.‚\#¯L\Ä=Ú$â¢êFó³”4݂±‡ #SÆáb'Š¡MÃU,eì0ÜËb­`á^nL(Ü+&¢…„ ½ £÷áB€XppáQâãÜ0¸»2×f +.tc2pQ#‹5ó†ÀEž¾¶àâO8‚‹}ðnü[ÈtªÛܱhý:ûô[¨Êªð°~‹‹D1J°oqø9Š`eQ_¹ØE„O(K& ˜NoOro»‘ö¶»eCPo£¶: ·Ý0…yË®gKämȚx{ºª{#ÞB‰XÅ”›®¼[Ä}1èn¸[:ÊHÚíåÖR»½,ÁÜX·0"f¨[ð:à­é¿TL¾Mç¼¹¬ 8·ð¹à×æaí rK}´f܂ƒ‚ïȈ[ܼ_áFvM1à„L„íƒo{:ñ²ñmXx[ü8ñ¶øA†n‹[g5à¶g·NÂЖӘƒ m‹(Öé¬ä´ª8À¶¨±Â§¸qmYü€€ý}`ª-’¦ýޙ¶ÕB0mñ7‚›´ÅßÈBoDÛÚ´øK mó $žíÅè g‹ ‹KÊLc/á̖:†çÚY¶‘-«Þ0w‹ ’-"Oˆ>l$ÛÁ²û2A¶M!·äØÞêý°cl/…דb[<§bûH/½1lU7Paûðmžۇ¤Œ7€-Ø„ß›_û¨dÁôÚGš¡7v­d?‰®½-Ö1¹¶º>j'×vñF\kYlrk)b~ÇÖ2œÑ&µV3K2k‘q-ýY‹˜÷XµxoÙÂÄZê}Î7`í)/'xµÕ³wàjY }µV H¿“U‹µñ„ªíª5yCÕ¾žAkIª½K,ªÕº§ÕT+1Ö{Õ"PéÞRº, –:IµÌö_²Þ_QÿMCúà{ïcêí¥n’j!\À+ ÚàV§É4J@WL-Vöp±‚R‹Šq¸³©½\¸1j1@ éEÍR`°6µøûÖ?ÏÕÇå|ði‘±DÈ?ð´ä´ô¶Ói/xFp€*ŒˆVÅù²‰¦}J¦fiÄڛ÷Až`ay¿qia¼˜å<¿‹r݈Ø≲ªJ‹:fǀҢ.ˆá3o„d]’öy´2$-Y¬Ï¬Yz0ol@ZDñàŽ„±?’º6þÞp´a ííy8(³Ð bIº±h¡ edÅƧ(’$Úü{ц18´Äç>#1´÷%ÑÆF¡…Œ¶ MK!!s-ƒ–Ä9õ-[|ÈKÅlA ½­Î Þ,^õS;ÍH3®Ò~qDö3}²½®Þf“?‹ Þ©Ø$Cü»ö¤Ï2fy\;|6|aÁž}Ü})س»‰oèYIÛò,3°âÕrVd†¶Œ;̤ÀÎ>uöñ¹CgÁÆÌY m‘… ä,þ® +QOâ,åLàìÀ¢ÈxY¬QµÏmÃ͎ÙUŽ¥o„ùö°YÖ½”kgÍÐT•zŽ²>’iöñjpÍ>¢i%fvÄ¢'(³¬Ls/©E&M˜®fÌâœX9ˆYÔâ\†ÓNÄ,bœÔ*40;±òeŸHn/û8Ù0Ùøä7¸,$ +;.ûÝÁDÆÞÍd¸ - ¾ +©ƒaEÊgL®,ÕÒ÷xÃʂ4°_Pe‰q92q÷1«vSÈ|³pWлCþ$ʾ ªd݀²Ý1æÊö#*M]°œ†);bÊvópiŠe'ÚQ–bnæÅÊm²GG¤¹Bl'ÊBi¯ºje)ÏwÜ·k˜h6S™H3•Óãџ€#]Ҝ¢ßY²—‰’EŽ ÄA’¥l‰yç•$‹Ä&V?’åÂÊ[¡¨–°Jç˜Sý‚©Ów€µÉ­Jˆ•Y,[“[)² KöRç‡AuåfÈ6Ë7„,º$ê̝ŒÌSdßݙÏßÜaú‚ìߍ Ën]Ìbԅócš)@ †°+×'59,CIê誅`ÎrFóqŽžðdýÄc¹D¤#rdÆ·ÛÀö}©) áU%'>,(«¡ð”.©Ck«{ʝ¡ fBÑò˜ å沧¹ïŠNŸIû9%ÈcÕ¤š8¾˜WÊbHþ˜F% 9…/<>xUw"gòÉëS·–¨‡£aâ@?ì4®2ØËñ´Kž:ÏÅ\9*äV Y”ÔA „‘`9˲+ŦÅu0¸ Ö¼ì_j‚‰ø“M° +`³TÊ°"‚|¨C2¥¨xÄÐg°[qÊÀVâ*ù) Xí¥ÞÇXvUŠ£ax±³=6hk}ríµ¡õ5‰±ìÏÄå+`J¹øR']«K¢­¦,¼‡á¿)§e‘íÜO,8‰jő ð‚…+%þ$û3ÂÒ£NN=ÅNý$ ©øÐÙ­ëps1.ªêí=3S•0lÏ®–Ðþ +tÓ¥½…EªbDܟ@|¡ã„ZãQÑY‚N¡ÓÜÑôqmn#¸ó·{—ãٍ.«ó{ o–’g o‘]9#‹ÂJø’`©ž\I&>_.Ôñàý¨¼UÓ'ÚB.—Çq4µ¹ÆG%Ïlq=Ø¹Û Äðñ°ŽOq-H’ˆ”>Œ^¤å¾µ!ãÍ0 ^YX2›WšŸ`¦OQƒ@ •¥ÉøiÉòy”ð ø³$dÒræÂ{\»™†¬Hª‡ØóÀ½’Ø·“čq‰\‹÷Bò®{½Á4³Ðs¼7|(ZÃ:œ½× ãÛæ`ÛujçoE¼¸¡::à706ÒÂR„½k¤…ŸˆQÒÏ(zFˆÅ£O†Z@1`¨ð¥žjþÈöÙaOmø˜ÑÇÇËNAXe°‰f„  +NŠЙv†LC“¡‚?KÞ¢cˆòUMö~ª0ŽýP%Îp’ü}<pñ ÃÎn 8WHž Ëë‘Åy†ò ¾ÊâŸÄ‚™0-08Fqg@Fãø¬ñš`ÙÞ2G3;ÞU«%Z8Bó±OŒ»«ÔZ¹+«*ifö[ª9n§ÛayÔ¢Šrã]«PllĶtX>±KðÃlæF-EYTeUd¼oJ ²,ñáàG•F%‰¯¾Ž‚03™E0;þÔ9`’!ê9ÊÍ`9sæF­'€î2ãÅî"HóH\»qzš°8ÏäˆMÀ{¡« &z²EŽù8J…÷–OF¨« ©«c~L„"w=z-J æ»P…ðŒûåzLf·êòGÅù¸îûv¹šýŒ!|ÎíÐ1 Ât›²”ê¶Z"=õ€àƒ‡`ö‘ÀO &@ QxëD¸ð €lÌUkÖò€J~ù +Ød®0zWŠb½DŽ›‰/ÁWƕ¶t&)7}\3þ}zb—5ù4´ðQR*íe7‡uF]­X¦ãŠ¤Â.Í=ºþöÈxÂL1J¢¸¡0Èۅ@õd„΁™XX)2ý5XèŸâíÅ®QýʅxQ¿.áw^KuÖÙL}pl±ßu¹Knˆ ­dFeSLáîô//‹„Q–v¸Õ‰š˜±K\u73Už§$×>áÃ/êiâ5NÒôÍR8pלæÉÖ¼uDÙ ¢&XX&Çm¨ªFUÑ}§¬Ɏf áêù +\æ¯.–GÔ¾ô¥Y”ÀŠ³h—TÍ·h4ŽÂ6¼ÙäI¹[f5èOÁ«ŽØÙ÷4d%¸ƒM¤ÜSËm¬yËО\Á"Ø›Ø?z6œ”}©e=ì¯Bê#5ûãjખ\ÞNù΁Kßó£ä6-\‡ßÀCÚ¬ff†«å®º "âý†ª?Ù èQ#Xõ ƒåšë†; õºÞzGï t㺓^ŸcÉ!ö_¶¦Þ3¡ÓÇK¶qõŠ‡5ÞÈYV€CÚ}i¤RÏÓÛ¡Ò¤_Õ|E*•‡øя—¼$c™'›JRçÙhLÙ]t×y‰—…ãû¡ w¥J 1ôùÝ´ރëóJ3Á¿°FëÇV}ßzåîót³Û:p}ÞMC(ÓbPŠ¹5°-Nˆ5%eç†h§ÈÉòŽ÷ñȖ¶«›Ò¶r¨­hö9¨%À‰"¡qò+Gú«b¼†È2dÈôaFдDp,7¹+ƒè"æœÂò©G+^)uybÜ´Vð®á1REs¸dW še‹”û±ÌÝpÝ^jÑNEØ W õôÄGSúsF”? +óeú¡´Âð1u#ºð~w1j6˜6DÛUYˆà±D…²ºË»v™Ô.H%(92åù<‹´œ*+÷živ)!㼌‚ 5SЂʍ´Å/~øysC¯Ðèg‘29-ÄxÏ°^&t“]ȟÀ×ϕs¾½@ÃÀëð3½¥¤QÓf5z!ÓH:äSaI ð®]“&à@޺A•¾ª|ai“Õ£ª.n¸{–zuãA1Q ×.x¢s…Ž:•ûŠ$ÜNn˜åŠ¿Ûæ²»Ïñ2¨H Ò8}j[ۜ\z°P„èÄ3bƒo´±D¾NÄÓâ]©bç®-cqñ¼Ý*3¥…<ԎRӇ]®"Ýe~jEŇ¢‡1ðýx +¿Ríz»é7è8¹l¡€Z ±îe±& Ô/ƒ·Þ¦"NÀ£`U)$†CO ‡ª`WŇPïȘBþsaêåu³S¾‹d©b×hõÇìy ¸€ì}úM¢ïȸáéx ,xzï…ýW?è&Ñ;µü":ãBt&r@J3aTÉRÊæ/犻Æqÿg&ç½q0U€7†> + ‡`1å€+ÌÜS Vž;Rüš³óÄS]:BýâÚŠï{¹õș+BI´Ê#°ñòC܈Sí~rg!<ä҂¹î[­öfzOC®ì¢OŸ7S7g•AÑý¶ÂÄÑÓÿ ksrŒÝJNå©ô:~XÌÕCí†7UÈ ñbº²_ˆæy1YÍu«˜4Äñ·ˆM8kùß Û«§u+ßC¬ˆA¬åõÒ0!SÏgFNaUhž î,̉ÒB&J½NíÈç˜{Ry¿íI8¡øo4“>­ÈéUÊ)™À Ž{[«ª¸‘ˆÂr~Ñu‚O†w´bròªÌnªgkn•Xò,ZÈ>a–TˆWÉi·–§ÊÂw–Ù0FÿpD¹ë©W:hp‚‘š—z…¨…?Ê'ç¥ÉÒùÐùâ_¬Ã%3å=]õ‡GÏ&1µ@ˆJâ?Ȫ(¹®a®]IçuŸfmFS@üˆªóÊôrÑÌ3ß3±†r|FT¢Èy©‡Då°<-$0s]C3"é°¨Ý Úî@`ßz%£Ì=¹Â„™G ò +XèÅòG!/”%4d•ÍY ømE uFíÛð+Gû-|n8£óPd¬ Eшˆ(ˆø+ð z$YÂp‡Ã£¢á(H$8“Neò%<.-`VÁÒk›{RÂ+ƒ…Ü®òc¾LÀ?,o¡%û>ÔÃ=ï+9b·Ò?5—)ž­ø¤ïÐ&"¾Ý#—A8,{Z3| +«~ÐíªÚáǖ‹Ú ÁÈ:ôW®Ì Oé0uvïy¤ÌÌ=YWRéª3k' §»¬ùƒ¥Ïža„¼àá!ÓÀ„ Åè·S 8Ãy³¥Æ­+Å ¸´'Ëpù8«ï=&vê=NÅ'™H¾(‡áâj!¬”S'ßæpZ –k~Ü0ßÌ<ª(æ±V8=0×íYób³¼Çåˆ:?g¹0îð!ªC¥Ë¬†Ì1ÏÅ‚Df€ŽKHü“Ú<Y3rüCÄÂè®Q•-Á¿?´D¤¡7wB.Aï¢ù9µÐ.8ÖskCƵ+)>Ֆº|e„Çñ^Õ2œÑijÍd)Þia„ŽKeã~¢vÔQBÇoI4 +žá±ŸÅŕTNŠ.•H2°ZýE‹[ýXʏÐn3û‘€kFOëqÝF¥¬¹jCöŸá6ì*€ 3æ¡©=hWÅ4 ýfwó=šÕñ·Šíˉ˜x®î6,kÍAUö›i¼Ó<…ÙH¨«5ŠõI´Ì_½ Ñ@ÒR“R Ÿ$ZæTv,ëyáöځ4ý†°Uðk°š©ìzD[Ó?–‰ó®¡OÆp%~B©GÑÆÜ{eè—N¥øàûðõ©®Ñ6¡2ò Ÿ•ÛÙÂÀ,ärW5ÈCµ_¸nX%g‚vëG÷¥Ä²ÌÀTÐreþz³µÌ`Åס ; Â"Yz†/î®RIèE¢;†9gó¿ows7¹ï1÷<ªe¬6ᜡ¬kPÛÙþ,™°«ûPšÑðP“‡-Él˜/šËsì¹UœùÌõ^LR +GD2þ°ÈX©ïØðnqƒ†¾[&ôTZzџÉIþ³¤„(J£Æ°›ê‹à+¥?³0øÝ5JÝmnÈ\«Àû¡'ê]/+ý ±gœ‹°_úe{L + ƒ}.ó=çvƒ—4(,êOA%xi5L]–ä- +àD½§Á7÷t2`nçº<;¦…¡ùÄ/Lsó|x¹œß°/̘ +Ì^ϒ¨V®µÊ:¬‹_qáŒùøî_c 3=î̌Ðu÷v’b«DT÷c!ª,¥@ÎeðÉÐfâsAäAi˜psõ¤pr.ê\ñZ|¾,I£¶€6ôD‰Ó‚õ¤þ©F„*CíÐaÚ(·yυ%ˆ ie£hm§Ü/)L’«vêtU …cµDV¡7)ãRH‹ÑÙ`&÷RȎ¡ë'¾uR(ã2!µw°­ê'5ÔbŠƒ ÔÛ/ïÐSó[9Ñü`:ú03&/X«ƒå\wucƒSý‘š¦$ Zë¢6«ô`Y¬ÝŠÚéhy3JBröÑ®ÂGqñíKuBfoèÅ-ÔnãÄXÑÎ^1 $âé9”¥$ç?`aí{“úsåž=Ú ÝÂA –Ó ½¼ë±ÊrÝÔ}Óë­·Ai7ú!eP +e–ëR‡5ÕA*ž÷—ðUÊ[ÌÈN‹‡”æ>:¹áÔ éf·U<Ô¿ÏuÍQL<Èý4n¥tš³1"«3îy¿+VðsJn/c”(GàôÃmrCNJvÝ~.·½ØR¢Ój¨îø‘›‡Uªì;3vf6 è +/XÆÕy˜æ.é.5æú¶µè’X'TâŒË–{‘PqˆŒÈ! lë\¢!0,ƒ˜lÓٖZx×p®`AýCÁ +•JT`äbǐš{úïä{22O*%kl“áàP^'՘ÐP·ˆ•$ï6ÃËtĊ»hàžÑ%žfæ¼YÙÏ0c‘C‹‚§ÅÀïӃ†;IuÏ©w‹Vc TOQ;ü](´+ôpwªvD'ÀH"ŠÕß_ìsúiL.3£œŠlw¹×?¦™ +†Þ-‚cðóèVs²AFXr©Kìųô±‹k§¨¸/-ñô΀«S£=7ÀÓN'ǹäö>¢â@\[¸ùt¡s•Š;7W\…mÖ¢\{¶YV{ESIüU°(W¦ô Å,ýXb©šúXÍ]ä*²¥¸šVƒRbÅ8浆O™õÆV½ÕTžT–à^J×qՑ¯ÓIg.ZèDBe£¸ðáqÔݜ÷ÜUž`à”(3f·•Ó5t´‹µþ>".'ÛÐ!;£`Û%½1>WR4‡c-1®©A ‘0¦Ã+eBó†ôìÊd—ùÇx3à ¡r`ÕK¬­9¶2p(ÚtQ)ATE.Eg°ªei£RÝé. 9´‹¡^êS™íe÷ÇSÊüô>a¤žt¸7“<‰€Áâ,USõOîʲ`˜¹Îd¦€¿‰ ™ôàô¢=¹*ÎñZ·‘e†¦tóü)¬gç^HÑz*å@{ôò²k_Í.˜$).ÜýögJ਺yw¦)ÅM¦&è9Š\n÷Ïü>²;úï''ãòØu=%Á&©.…UúçÛ$a†)/¿ +êUMVFwQFÆqæ#DÍ6°—¾IöŠãò¼)̜¸èòØh¦{Ϭý£õ4•­‰‹¥]³œ¾¦dÑÝ¿´IÒ~©cÒ»ß:ãšß;M¾A0èÇ0?*jáéÝZfÓқ«PÔ=|,Ú/Æ'›ý6µ‡¥Gpûr uݬ»fAé3|ö̉ðWe”x3beÎ6,vlºZ˜Ïí¬g͛ֆ‘hìê}÷9v$åLU|¹4Ñt¸˜ÄL€ðÁ +7ûœáƒ7à–TŸ'w—aK•ÓH­ýû®‡ÓªÅ¢+Z.…â]ZT\ùTÔË:¤®¼-Á?c†ãº‘i•°°b2”¾ØS\$å¸ê)–\1U;üHo•L`Ÿ”KtQÁq¸"-—2ÜõéeîJÍÈ°šœ59`±ëGOW‹qn÷…žbÒ;ԅõð‰ŒÆ8ŽÓ]RÖCñ^‘•Òlež< +5g˜Ôq†Ú—=[wÅÇ©·~¸K.,\@nº CΟ\¢s®iøŠ˜u çë$0¶(ÚjÌç\³+r8\Ýi +Á§@.kÙÁñFyFî*Šš`)o#ñ|aƒj¢Äc@p&$Nw¢™c+êÖ»é4‹ßnsðrA©Ú̟ø8`à$¸${ʟnIË=ßùÓmZq“´¢ªn\J]µ²ZC]–"Ax…RENÎEc¦ÃCõ)•ÝBæßN]ÝáÄfÈ"±PùåŠ(£—¨Ø³ŸÞT%«¼ª²¡QŒ=ÙQ¬Äiü2—£°'D^(ªE$‰oÈ9.a£y,ìl‹É–ÑÞÜUÔ|8ÓÂBç-(©O®[Âr<ù«…ÁHFà]Êbô-„{…ü¯ê»ï®T—î.“ª·äíêFDaN§EgX¶sá·ãÎxª0ô£MUÏPÙëä¢,f…èŸä4Ø"x J=·ãiJ7ðà”'4½çåb oL‘B*‰°$æâïÇ´~ïÖ(Åº‰®8ØEHŽÕVBQ–*-ª$Ê Öæ7ú˜²XPœËæ4“Æ+Y2*;TÏî7—i¼óÊlx³ |ŠûìÐ +úqi%r‚¾a©^eΕQvò1°ïOQ½è¡Ý$¤ÆßY~Å/#J½®Ýz>#êƒ`á`ÕÖÑe'XÓ-Œ±”GS§"ð†ä 8Óð9^I˜]-Ò}º·ø3#ýX‘7Ë"È§ 0³ÈBîx7Úz¶1¯”T4’”Ý!ÍÂPP Ez ¿÷y¡ÊùSIŽyÖýV)j,…ˆr®u¨‚äCC²:6èU©nDá(zFUÀòY<ú 7åº=&œ1\¢ƒ_D¼ú#_¬M_ìt :˜/½¸U §¤®Ò蔱¨ñˆŒRÂߓ¸ô± þ^H@Jä6ٗž®03úœé +º[.žõ…j*}k ü¹ÌÅjJšN‹ïôPÏøÑ.0‹*¥Æx†Õ)/Z¨¨® 㮔–Õ¶ &hæ#ƒ„c>žÇÐ_!kƒÂÓµ”’ÂTÚÍu¿÷ª€ç£UKµdr^,¤sòæuãÈR +¿Ü6.{&›J·Ó[Zfàð‹™êÊ{s +Ü0-hiÓ2¦;ÍÝE琩/ôZ~X|ûÅ I¸|Dq^t•Ž²+Ñ¥Z‘+À d¬™Ù„êœ: lSrÍZ›ƒ5\q’n´#’q®!ꆕOZ×à]Lªzýûˆk*$_#Lˆn€Ñˆ +/ZxÂÕµ¹«(ñX̄€@‰€zúå14ªÕ’:”~Å£¾hSøEåå¢Ô¼ óæðe9ÛüuàóºMzx'DLY…Ãß?jfpe­åQAµ°OĦŒÒ´ˆ˜pnõ10S‡CÆ­ëfÉ!*-æ±neprl²© “Sªã^š´¸(øŠ²&õŸã¡ª® _”ÀU"¥æð2å ¢·º,î¤er֘q‰1œúbŠXº6󨊝ÌXêÃþUe-“ð´ÛÔZ–7©8ú XsµÞÄ5öÑs¢4q:w¡+mîýÁA‚J"ô7!ŠL„âÊyÍ(fnµˆ]ŒŸèÑm¥yµÉM“ïNkîy؁Xü‚: “P„ÏÊeZf¯—Û]£À»+ÍR‚Tšs·ÜƒŸU3ÚÓÏ4:÷²Âó8Jj¼t®|K;JçÀÒ­2AmµÙ­[^Äj-æëMë{ª¬f•°u^ºó™4¨ýÄ­@Œ÷¼Œ*°F 'G‘+ÈW-˜.¨ÚÂÂÏ%kY]±Å »Ó$͵Úüâû½¦<QeŽ fÆÎP€àt©Ìâ‡NÝà­¼EîÚ¼JúÏèkƒVúIK‘§Õçlx#AÖÈQÝ¥éJk„ÈÇÀfL‹vELK• ·uOÅå2¼yäV”È4GÖrWö¶ÈÒUi§.Y\ª}ªd¼ËÞƇ@ëW—AîÃõ‡£#ÞzjíSNx°û;‘vÚ%èÅ2̉g|‰­T˜0€¹¹¹Š¿Žâüb1~‰SÞ1/´GC¯"ú+FꟘ¤/Ñ@»¹îÔ>U±t EWwÎ5—47BœU/Fú2½GA›Xå6T¼NN.e2ìF8ŒtÁâkNk˜§Ù‘úŒtgnh3â+‹êN˵V«…×3ф¨¸“˜~GhÖ¼É딃‡Ö"L7á—°¢.É MÃîõ¢’\ü)Άµ‡ph­D½XÆ´þœƒYEu +°¢ä-äfä) Øƒ¾,£Ç·]ØéÌ!zü¸Ý¹jQ=nªêW{Xë÷)PKu ª+_ƒY÷a)ñGX®PfêŒÛ«ÌómƒŒŽ§¸A¤Mâ;BcÝÄ/ñtrLiµP oÐÛgS´S©6͛°LèÀ.tš`JÌ©” ‚n˞=jõ¢WØc?B)as]„Å~æ£ÜÄܐ)„K «­‹L0ͼ`N}P«ß<¹Ó>àsZQ4êšw¢›̨¸ …:Q¡…†±ûÓñ2žÞ½¡xwÃmZø«wY,Þõ6Ðf,®Q‘Ù">]Í UžÉ ½¶ÃÅ)Œ<“jELuÑÉ*ä7š£±ö9É3´Ìú:wàjԄ¿OÃH%µa~ÙěR01å¥>–!1®ÔN5gŽÌ„g4žÈ;Üf– s ê•Í&RA„\ßtéˆ2NR¸Y…UøŽ«t†3“þÕbgzØ­à®ÍɋRu,¹«Ã⹧´Hi°Æç06MÛ°v_Ò¼•í/ÐMWÕÀM@ „¥HZOv„43ð̏]¬h¾½z^E²Nðbk¢veu€Î‰HvìÒC#ÂíNžF¥ª»F;®Ü“®Ì{ÓBþ&šnemëÉÛ[FäÂÛaZѨd°˜›¾b )iñ•ˆX¶ÎíðÕâö²Ü’>p´‹‡”ÛìÚܳV®«j†®ÚÇYÓƲ‡Öt{oîéæ,š´X†Ê&–H.…f³öü´ƒ½jh¡3FÖuz›\• ä»Ë %ãˆT×YÅs+Y¸”à„±¸wâmÆËöزbü«FqÛõL¹<̇o…j<ÁUO—ú”Å`p‹Œ‹1€ ‰ÁÊNˆÛ&¼‚@GxÇj[ràdpù1åOˆ³[Ímâ&•¤ƒSòל²91÷ýX‘D‚ÿÅÞÍ\*¥w˜/ßêûHŽÂ#GYžÀuh´åOHÞç>ÔGäØÇå¡/AóÀå¾l¬?¥ªïÍûü͝¼@šÿݐæQ8±Í}c½AÍ8¯‰/gßEP6œù9œû š9ðý:ºaæpÉÏÜXæ¨L}N9r@™G«±$™c¹G‘ò2G!–°£æ˜W÷ÊNŒ9 |6Œ9÷+ªÄaÀ‡¿Yþ¨+ވ¿Øì ˜#ÜÄÀkÌÑZø95L~ytJ|ys$ñåͪ¹^>­†—7wTMv9ðdêlèr ¡à%º¼ÑÌÊñ›fÎ.gÆÓðh%#¨JÛäò+¦ä•\ ¯àÚ¦SÁДücœ—åM§$\‘ l9êƙÏj9µõyƒ–³ßõLf9:ëÕ3ˆåü«ï¼rÚƘ¸r£>פ•_–î°ò«œÆ¬r„µÔYѬr,o“&¤—yéV&©¼›òŸ ò®’ÌSŽ>F§yò˜{oûFÉ(Ç,~>Ý0Îõ—±l39\&ˆò۟ÉN(¿ƒŠ€rÔ]ÞÃS(r/D?ÑQ&=EtÊE›N”ë„“ßÍ옍MŽ–@‡©÷Œ°¼–C,NK2y,v09–òóÌ%î Xò!ŠÖ%§Øç4oÿƒÓdh$[‡{PïDò§{À 90ݾ-yä·U’;Ž|<ªÑK9+í8eœÝ@ˆÕÚhäjÒäX‰bDÈ6hä°2³ÓÈK8ÞI#‡…}FNƒ¤°ÏÆÊK‘¿aäX†3„0r¬˜X_´±ÈQßxé,2-Êù¸] ÈÙÏDEâ+Š\fÕ‹"f·¹~G”½®,r˜ï…DÎN/ç^ªó D”:)jÁ!™³‘ÔE(”mrÌ$ ‚|xòñ„¾nÃÑ­IXàÇq:<ÐFGcp®¾>>¢è$tÖã6C@ yü¹bbð8ª—¹œß¸ã`:s±Øñk„_fìxV—oÔñËzRSÇA.áÏtäõåX™ãW„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆ—¿"P۝¼ Ö8ýLál¬qä¡øújrµ£Ÿ³aèË,ƒ Gڊ•¾oB%g堗5¦3ŽŒH+!¥rt¿`¸rŸ!&õ.FŒ3Ýõ™Q¶Ì" Æ@À8†zUÌG6S%QƋõ# |£‹×>ë¤Ô0ÅS]²Å?xŽ3bkU:<Jä7²8Š€¥iù¯Ë°Œ!¸âp8„nXqBdŠ‚ä„­0ƒZ]>Ç·‘‚ܘâX1èHqüŒ +g3ÇãzŠ#ûÂ×'¬,ÏÊcö ‡wš8ò=J/&Þä+%Jé@êX6’8`å| Ž³ZÁâð‘›áà“"~Ÿ–q¢º—¹gD(XâPS\ætSˆËåTñiXùáQšøð+âA¿. vxø]ɂˆÄ¤8Å°ïïõ3{Ú´o4 o´o¸)Ým5$YëÑÛ3ȕßPßX±3E¤ïAW2)|C ,œŸÞ8ß(7:ê]p'ë@ £ž^¼– ó J)ÄÀ|„ó‡Øâd›ê[B€ò}9*Ÿ†ܯb­¥ +*¤¤ßßÕ´†$|ŸU¥ øÆ`&õÓÊ÷†¨…à–À{ŸÕéñ {§.±ç +÷®Ñˆ0ØÞÕ­¢í C´Y A 5 ö†x ‡Öúâ˲ ë _RúOiX4ÿèzYIän>íPï´Fùô¬¯¦7¶YA>ÌyO¢÷é¬zc .16 ÷ñÅàyC%ÁâñÀyã,¡™5ž„õ?e¼ÏáÁ#XÞ)Ê[QÞPÑq ’7 +CX ˆn0™x¹ɛë“s±ö`-(6 É{ZMò¾†ãôòþàˆOW“k¶VŽ·ú-Ýe‚¼©ðc“ù ySÞȂ‡ä—±…$ycCa3ƒäÏI}#yÓÊú‚àqëu¯-IޅոW}#yã}Æv{Çn´@Þüû1-úX`øÎh&ÈRÎCŎ©Ÿª*ʘ oò1Ä"1ț²P‘X ò&‰…+țf"äÍ'u÷Éñ¦È†9àãMaM”{0 I .'9Þ܄ŸìÆñ†™Í¯“ãMÑíÑFr¼! rãxS³¯©ËïBÎò=&Ço¨*†6Ž7µÚ.áÈÌ c$Æ[ )#̗>‘Y°oÈ¥B8ãMá3)?ÆfsãM©¹ÆxK;ÇjµãÍ=YUï’ÀËÀxÃÂàݎñƅÝ> (í2Æo +¨X'¾R¼Ù9>+… \Þo„9®VvŒ7Ârç5!Þ+¬rOT0z+òDW„÷0Ñ, ÞÃjúxã8ïôîñÄÓ5¼›Á<™ƒßëà„´ó»QA}‚F à’éÝ$ŸªdJx7¢®ý¼ŠœÇaš~Î@E¯än4xWD›dàǾVR»±ßÛ Ú€ ÁìfđµÌÁìfoxâŽ6f7/ºÚUù0<¼ÇƜšPýÛ³(;Ø6ãt-œ?s¶cwª…DÉa8×솕UTÁëÆqw®¿¦R¢…Ö](š8T¢æNBÁŸ \·æ'i&®[”½hKËÎv$R<:˜P,àJpÀßpÝ0«â1pÝ´¾f\7 ÕBµ‰ë¦™åXëæO´„sc +f2mœŸv\7ÛªW \7k7!ˆu3ª¼­Ìš´n֋°Ò'pݨÀЯ®›7I¥¦+¯» yÝìÐÎXðºY¼¡:…•×ÍšD}ËI¸]â¼nZHMÜxÝÔR4¼nö‡â20€Ý˜»Tñ¹»%±¥ÔÌÀnn¨*ã'ÚÐ;´»éúpEÄniq½a;-hmænO`7¬rK 즡[|–¿IÐðNìf„OòA»Õå‘†Gä#Ä­·$˜Än®ªÔ†4 ˆD/ŸîqÀ²uX8ToÈn™Ÿ(X=µ¡‹y…ì†Aôû ÙÍæ6IJ[ëC¼µ–>£ßɆìV÷GÂZŒìf‘ÝxãˆøIdw¹® ã,ÈnH Br*d7]uY‘Ý%U ì¦…©á@v\5,+ +ŒÌüÎ7d72‘)¸Rž¤•G…3æ"{¦oÈnšÙàÌÈnüUk‰ì†…ߎ솙pžDvӢ중ݲ0é¶"»ñ£¤t&²)RŠ·‚؍”¢z®ÀnfDIº`÷p.-YÜY±1»ï3òö£¥ûcbwoQ¤´»a=ùâìi'ëîm +Ù璠;ߓ°îcSlÖ ºÚQÝÝÒ“Ô ^Ýáè:cchÃÎyhu“týŒi}™Ó†Ó=­æt?5Z†¿ 6–ö®˜îûr>73g>!ÝiØÝÓ*D÷M Ñ ƒ¯+ ›´òst#Ê­Š8ó¹aÐ4²â¹±çýÀs?!3 +:÷søíßàÜw4P 678ji47€/¦627YÌM!<ÞEŠ.‡ÓÊ]Œ¯\±Ü0’rTnšËèº"¦ÜîÉ侏©ücšôv·«DrÃ@áFäòŽõ‘äF˜•,òrßñ!/nÑ=!Û|¬¬Í6d›ï‡Ð€lÓ¢é +Ùf³Ð¸ +؏Ç&†lôž>§gõDŽl3É`ÙÙ¦YÙWC¶™¬÷Dj3â¨ä²ÍÕMÙÆcöo² &_˜±{à:n3¶ç29ÛúÖÝc ×è'ŒmZxWFH»"·;c»Ý&Û°HÜŒm–Ø>Úd"¶q¥Ùb¯¡°XØ†WèRï±=}àTVà} Y‰%ªœ6Äöb6b›Mž™yÄ6,R¹mˆm3Äv!ÿ¼¨tVÝè!æÀ³!¶ñ +[9bÄ6%†jLlÄ6ž³@wbåz¤§cukâÜ»$Ýó>í|mh䔊2^n8‡” kãu‘'¿ÒµDâpxm‘Ô Ýc-\³®tmY©H2^›Çº¦­òàêáeÃk3.Ê%Á×ÆsgÌ1ùÚã úØF=Q”ë2™ó##ðÚ¬/*ÂhOº6Úü´…­ !(#)ÁÖF׎Gi}¼£`0ÈÚ,_lZÑ2—mÙW®6ÖGBÎ8èBኗ³T‹XHaƒjßn1–LíÛÅk‰Ô‘ …¨†@·¨MýÇá` +\Ïî`çÎӍ1ºài÷3BÆi¤¦tõ„i³£Ifiã8 H»G¢vãhwãµ²šEçÅe(¶R´¡¤`Œ1 ÚHò³ +†v áކÐ&cnH‹ÈØ6 – ÝnEUv€6ô^* vàÚ~Ö>»…b£gC£D0KÀ³!²{|žtý@vnoàl”( tanö%nP@³±°b¡íÆ̆UE`®Á‡ØŠºÀ^CŽ%úË +̾\‚’¼ìË=˜—݈ÛÜaÙÙp)XÙݱÒDeCÿÂI|#eã"øsʾ¢½zp²Qc¦VW+&û +@E`²¯˜Ó‚’3:Çœ¹yL5 Ž#ÓÓmh6}¢Ë…x;"N¿Â áôø† º,*ªW>6ê­‚qu\Ñ~ÑtìѝÎ^éØ02Ìpì=̓Ì̍=,I2öp"ÁØ0ÄÏM06-‡Uw E*$¹ØP§E°jb±Ÿ;Úa‹=sTìøŠT^¢žÉ€â>!Öæâ‰îßŦ™€b²‰Ëø”Plæ$èsoTl˜•W +*6\ůƒ4lnó¸8`–VÎ#‹ ‹ò[Å.%ªð7,¶ÖM£M,6sàt‰‹- +„ÑîK_ø‹jg,6ÏjÀ>¸š3xø¹Øp9ØàpÃbƒ'¬u¢5{X¶#±‡ð$bà X ØÃèŝ‡Íêá³Oö¦uP®½dt£aŠArun'»º{Éä­q،ªv×uN¦5c«Ôw›gwž“†MÿüçWöTÎ2hØ´ˆzGmKuÙ͊Ãf!‹JόÃæ¥ßDÔ‡– ‡= y0*À‰Ã† ÖT²³â°a>ÕFõ¥¨‰Ã¦×ÎGµá°éԑ]8l€.Tù'6·à£ÛpØ<¹óœ4ìr¸R2iج‚ᨼҰiÕ@`6-Ý 0X¬x…w6]Ò꺄SKW.% Ufl8l.¦OsO4N°4°J³¬ÓÀ BAÙÆÃæòºF½»¢§GŽàa+åŒÚx،Çs/´ÔÀúŠCH± ¥ãx´± +’¤Ú@lBéÔâÃ@l¥hš”œˆMñ ÿÝ@lN㯻:ä]Ær¯f±±öԛ´±ÖØDl¸¦rM‰h„m[©§N$6uŒú*cz‡…’æ ‰-mh?'[X± Ä措8[ØŒÍÐâ«x­@l.E•Ñ™8l‰AÇ9qØ<{&ž‡Ø˜J?66ÌþÉæÕÓÅpÆaÓ"pŊÆوá°¹î†qØ<¸F¬‡Íµ¹+ÃƓ—(Ò<ìi؀؋ÙDlü„‚6ºf*tî ¶æ —07¬1Æ{±¬Dìi"6W…˜ˆïîÎÄfz|,Hl‚(p$6“šÕåˆSÿI3ߕ€b3«É·IPl&&•Ø ØåßcB±Y T@±¹ ×Î[Šë»O*öìKTlFÀžçz£b§ªž¦b3Å AÅæ×⃵k‘âðIņ·0©ØŒ™±ÓÅFÅfĉíÕ‹M‹&:a±i(bÅbó1¨ÓÙ|ߍ¯ÅF\A…®›8±æŽŒ*ÿAª˜¥ôÅÆ ¨¯nÃbS‹B Up±álºù‡¹Ø Äí²q±aæ>¹Ø´ða›µ_\¹Ø<"EÁÅf8Fé#®ÕµM;›¾0ÓæÁÅ&›=ƒ‹Í †j®\ìi.6ç@¶ .6oû/l\l˜ÝyÇ (X¤õ +.6·¡†kãbÓÌg\l¡ï2ÁØTDö7,6už¬@,64Gk’‹ÍÜPu§–ÉÅfŒœ¬‚àb³ªy¬¸kx·Ú ®\ìaIZ³¹R RÓ°A±§ÕÜ/ô?Š®å|'?¬þëÞ÷ãú´#±OÞåò)‰Øxؤh%»{8ÚyØÝá—Äaw‡¦“†ýØ×Øa؏£ ´v‘ÿDa?ñn$ìG½–Ý„/N öã⚃ýDÂÈl¾/W +6Ô.ʏ¬ì`'4ŽuÁ•®ómlÝ4)¨ã™ük&³Æù†¿®=’y¦_Ã0Ü%WÃcW߁~M¬8VAb_£× jyŽ#ÖÒ+úõtø‚|,ª$_ŸÑ(|_Cþ…€t`¯©~nç¤^U5väõy…ßiâõœxÍ×ñ¼ñ®Ï¸îE ^îú4þd£]ÃH5`×g(v´ûzo¬kԍ:I×HohaàW 7쬳q®Û0Y=0× ŽsR®{(S7È5RGmLÄ5$3¤ëáº[¸®»É·Æ~ ÄÞfüo£[_w#Eµ«ù¼j41:9#%®úŒþA«ݏ£AÀªÖ¾±ªQa§:L—$–¢›T]»?ß T]CEœê +ŠÀTÃùè÷¤ºÚIH5 âŠQ]£oꆨ~yZœ&¡ºÅûe@õÅìO}qœ\ðÔ,éRÿryEIÉcQo¦é.”þm–[b8%ñ8ÐÔZ‘‰¼¡©ó²åS’©›[¡%˜úv«K}9ѐXêây;¨Ô–ÐîPj•¢ØŠIMbÂëS"©ReމÔ@´°qF©/G±ù7µõ[É¢¾£û„QÔ5ªïvu7°'IÔÖX&ˆšÉ‡jFf¢\·'­„Pãý(®ä›jÔÆMD¼Ü^Âè£áˆ¨åÐ$PŸv¯@]ÃOþ4 û ÞNü4êÿºJQéQa=Ä×3ÙÓݽAßØӖ¯zúbÈ¡Lò´–d­¾‘§¥q¹ÏIžF˜öb„ OSŸz„%µZÔ\ƌÃÀ¢þ‰žþè²ûe†æ;Ö䁞nÎò%y:@q ž¾jè„Wî4bs; vˆ:N›:}EYìA„žL0§QÖÈino1HWˆ œF +˜â®àM#q݊¦ŠçŠÒcÇë!ƒåˆjŠ4šWG¢1YÓO‰¬·ŒÄù¶s’¦GQDbMÃÊ6@Ó0ˆµë ˜»¬@ß0ÓÃPœ¤L£â×h˜ôÓ»-˜4{Ñ_×K€L¥Ï’†Ì4Ô?†¯ì éĕG:Q˜‘~üõîi”ow.ÊBV¢%C†êˆýDHˆðA­#xѕǑ۸ñ£ÇÚ:_ aݽOz4²=LmlðhÒªÛÌFê­z££/bwrô#¾]r£‡Wg‰f!åuîÔhòÂÙ6ÏÐhœ }ƒ=N ’wfô0”%‘Ñ#*ƒ‚½h£ŸÈ/úq’,áÐ1<ì´h(yÙ 3hÑ ·‘ + è;úTn¬hH + +ëcESc7N4òXŒo¿Y1eJô}D±ù +‰F~,*ÎÅ©<  D4Rm,ÀÞÑÝáõ$D÷(» Dt6Fô´Ý͒JB1VȌ:mˆht;PeV(ô +0&GÅæÂÅ ^×å›É¤NµO>4VTj\¸â¡±,ƒ—xh¬ÞToå³fÙǾ¬"I64¨NjZl44%eLåO4t·Ú+ÉÐ\æ¹øõà„Ì:k?å6ôãJ™\èX'š‹ç~¿a¡±Ð& îy«E0ºYiº3¡ÁíŠsçY¹DB¿»FŸ¿¹óõ¿/úk¤çŸ=~ûôÿùO¿[Ãýæ·ü¿¿üÿþúý̗ß|ÿËÿ÷‡ÿî_¸ŽOÿø/~øË¿þÊnÿׯüåŸÿðÛïøéwË…á¯×öçvûW¿~ýÒ¿ýõ¯~÷Wñ?w^þÛþÿ_ÿðû×iýõßü<{9›×ùÿú‡¿YOæg7ÿòÃúÝ/_wöÿþío~úÝÜú_ýæ¿~Ø8*Oþ§×ùÏ~øõþ«ßým/ô/~óû¿ùÙ'û§¯¿þÉ??ù§?ýÊ»ÓpÁðË?ûÍOþzû~÷z¿ûÎöúÃ~óò/¿ø“?û¯ü·GÿöOûßþæ¯òXÿèÏ~øý'ÿõ©ü¿8>ý“_üÉñéßýþòßð+öûøôÿ¼þ뿼l¿ÿÔ>ý‹Oÿá?Ÿ~õÚãßýÅ/þä»{`èÇÿü8ÿ:Üöö M‡ ÞþÚéËv¬×_?á‡ÿåë^#3qڄVýV»(S¸á¥ÌôZ^¾Öxø×Þia„ 8.9V€7LÔْÌSV;Œ€d/# +0^«†ÝˆEÃőn³c(½_¿±–nÔkxÛÎ!Œ:Váp÷‹Â_Ûa§q?‡Å>Oxv¹´÷áu„ÿ„›|£€v¯u?<;6ñÁôL8üËzP5òZpŸ×Iրÿ…Û[ŽOÿâñ8o %+¾Ç4×j‡Ñ5m/#eýç›Ñ’ +]ßboBs쇅7özös°ñûùªmçö×¼îø§þrCüˆ*¤Qÿ\í>V/„òz/oFÈ òÁ.väñjÿ´–tŽóÓ~6~ÿ3疧ýoôz£ÛÓª‘vC9¯¥þ8Àl;ZÃË|±Õ.jyï§á¥>5ˆx̨nûý~‡¡Àªb;âu×v‹q»ºi_nÅ<ìrÓæ9ìwLr½o\…Öß\ߞò´/¯Dv}y>܇ÿõ1ã;žÎ-nü~{qîýxös8œ9ÚÎv1n—6íË}˜‡]îØ<‡ýöâGà”ïé­o/ð4¾=âi_އ<ìúæ|¸ßì¾ÔÔó}d«â¯öï4ð t¶l‹qÙûٖÃΑm9‡mdÏ +±o|C@ò~ØiÜÏaڗž‡].íÃ}ø>FQÌ3í(næ™ã|;¦”ÆOfùÅŸÞbŸ×²v^õrÛ-ÂÄx#ò¹m šVyÛa§q?‡i_Nxv¹´÷!oѼ{û´>÷2­Ïc™Öã6­/ö9­/‡ÓúrÛ´>÷ºq¾ëa§q?‡i_Nxv¹´÷á+oÑ~‹æã^Ž3_Œåãvz‹}^ËrØyÕË9l·h>îuã|1ÖÃNã~Ó¾œð<ìriîÃ÷Ýñî냻öÍ!;ç~óa*ë,ïî +fPdv/èQó©ÝU°ñÝ]Y7žÈ<ì4îç°Øç ÏÃ.—öñ>|“ÉtÎÑûíNÅrÓýXÎv1n—¶ø0ó>,.мc‹Ÿ°ÝÞÅ©X6žîÇòÔÒøöˆ§}yò°ë›óá>|«ÉtNÓûž~ÅrÓYNx1nW·¸1óV,^мi‹«°ÝáůX6žÈòàÒøö”§}y%ò°ëËóá>|“x~ø–îóãøöí“?Ý/w7)ßÇ ´÷:î}|¨Öïߦïãúñüäça§q?‡Å>Oxv¹´÷áÛ/gö;<¿åå4æW¿œðbÜ®n:æ­XFžyӖÏs»ÃË·¼l<¿úåÁ¥ñí)OûòJäaחçÃ}øÆ˙ýöÎy9‡ùÉ/g»·K[ƍy–agÞ±åÛÜnïò!/ÏO~yji|{ÄÓ¾¼yØõÍùp¦€€ñѓ<­Ú| _ ®Ø¼ŽÅ¸¹(‹}ú3Ëa§ç³œÃæ&}<·iù¸‚â¡Ï·OBkém/ÆÍ5_ìӏ_;=þóãâiûeç¿v¨÷OúÕèý[€Ïoö |/±^¼x?gÝ¿|<â þ_SžlÈéëí׋5gšª £íž<€$õ2¾\oFŒÂíZfÙ ¸Û§í° %<õÓvaœ3͸﷍­‚ß;û9,öyÂó°Ë¥}¼ßr¦Áïw¸E²†€Þ×~‹q»ºi_nÅ<ìrÓæ9ìwXîM}Û¸J¥·?¸4¾=åi_^‰<ìúò|¸ßj¦a¡Ëûí=\š´¯ò|{ãviӾ܇yØåŽÍsØooañþ¶±UûSKãÛ#žöå}Èîo·ûð-gмx=Çò€ÌrÚ¿ÓÐ\ïÃþy¿q¬{ œÙÞTb³ö”t?‡3éãßéG.6–\7¾%Þ;û9LûrÂó°Ë¥}¸[Èã’½Ý"ο×Ûq8Õö²ÿâbÜNo±ÏkY;¯z9‡íÁaxžñ¶±+ëöÃNã~Ó¾œð<ìriî÷YÏç{2WBÓd7a{u¡Ø[ß_uã|ÖÃNãõáÍ}™Ò7šk®'¦ip>¿å§ç½ÛÏsÞèuã|$ëa§ñúðúäy~Ë!~ñ}@ûv§x!£½}Õï·5nÑ~Ø=êsøÕS}‹ê®‡Æý¦}9áyØåÒ>܇¯ û-šO~9Î|HË/.Æíôû¼–å°{ Ôçð!ªê-ÚÞoÑbÜÏaڗž‡].íÃ}ø&=åóãíE:™ ±õxÆ{¾íbÜ.m±Ïû°vO®û>$×÷sےëwϼBN8~©«Ýgҟkuã6D/ö9ž/‡#ÿrÛ4ññܾÕp1]ëpߗaßV t"®˜F;‘ïK y½ìöÊÅþñîÞÛø¾ÄX7ž«†yØiÜÏa±Ïž‡].íã}øfÁnùÕûí åæ’a9ÛŸ]Ú²î˜÷aY¶Ì;¶øöÛí]ËÆsÉ°<µ4¾=âi_އ<ìúæ|¸ß0Øm×z¿Ãs-°œÆ\5,'¼·«[–óV,+—yÓ÷~»ÃËZ`Ùx®–—Æ·§<íË+‘‡]_ž÷á›»{„ÿž»ôãCØ·Ož¡·ú6>0Nw=Æ6^yÎ}|`øïíˤé}l˜Ώ}p÷__ìóTçA—‹úx¾}ða¿·ó+^Nc~ïË /Æíê–Acފẻ[¶|–˽]¾àÜp~éËÃJãۓöå5ȃ®/̇;ðÃûïró3_Îv1n—¶Œó>,CMܯåk\nìòáæ†ó_žTßë´/ï@t}[>܁ïÿž±×ýÓOùã¿út¿Ç]ÿn¡×v°§q«Ÿô_G%‡û»sÜ,tYí_Þìè*¬í—·ãüœ}9ÎO>Ïo#ÎÝNHŠ1–‹@.Œö +4€¯_”ñµ\Æë—ŒuHŸãýhÞ¸ÏÇÛ¿øEëËúú©ÊƒÏþÄÉ ãs©²?ØYÆ~¢¼¿ûzÝl¼ÎÃ'Ӟ3O†u·þÑÒ_Ÿ˜¨Ó5¢bKÆr>‡×³á@¥Îá9âÚz]ê†0!£ZÚz;^pß»zzÓ×YÝ>ƒjÓkIà”ºìÏZÝ<[ŸÔÆvõ¸,ßøK…s¹èåí+hyÀ—Òæ=x{Ÿã= ¡Bæ` ›ãö#ƒìu¿mï~Ö$“ŃÓ` CÄþ=-ûAó÷@Û.ñ8Ž×Zÿ‡¢;¿Ÿîïk#–Èü’Æx¦µiìOÜØï;7ö¦ “µÊPç×Î`žšÃòY¿ÑïvÆÉ¡²ÎV´³²é¼J_ߋoÚEüʧv +Ú){×MŠÊ8QùúÕ3øÛ<©«=¾ÈR<ÜÈÞÏxVµu?™æü¹þüÇu³ß©·÷õ²å˜ÈvŽþX/T٘#»=ÃÈ~ޒܯÏy| ²ƒ‡}bc-ÙøÄ·¾Ž°ÇÀsŽÆçØ2õ«W1ï*Š£J¼5Жþ˜öãêa/#î*>çîG9Š>:QÂä~LûY†íMCŒ(^õSÓ=lXâG†ˆM<ÊÕþ â>ŽP›×<ì~>=Jç…FG‡Ã:¶7 Œ …1Þù×(àïn\' mx&—ŸÎÕ°¤´ñðÓa5ããé™ùk¿˜È`Ÿ?³´x`RÍö[ciWÀû£±^añz„º7®heaã?ǯé«ç÷ +ˆÄ' 6÷ü1쯯ËÍQ÷'í@ðõkÕÆK?Iq?l¿b?øZÒXPæºLL_;‡õëc[ ¤˜Nó뛣è審¦töA ˆ‘œãmŽÃµ¶œ Ž˜ Ê3îØ8'ˆ·XoÝۅÿø5;ÆÛƗ;üïóþCg#{ Ú²3:@ü|#æÇ×}~öþë Á´®15sú1íåöûpz¸êžë×캏3Œ÷nÀÑㅧ½ž±ñÝbãçŠÃ6}§Ïaú.·´Bž#Ît¬sj1w’ð%ìO/>ÔkÆñÆŸ ià_=ò¼'˜ºlÿcØífp |tE/ã•c Ah¼Î<øuç=b\yz¹qÍñö™ÆRcÄöÐêŸÃ¨é#ŸgœC‹¯ã'ðÕ«˜ˆ&Zǽüâi?æ÷º'2ö +—6Þq+Æùävõrµ½öظ¦«W6¹Ù¦ÛÿÕSû’S +:æöwèüör¯eègÚxžþÖ0jhAŸ¹’¯*ì5<)–èÈØ<{ûv×O_=‡Ý©Œ_¤ÏžãכÓU´±Þ«÷÷s‰íg,h‰{±Ñ¾Ž0®?äTÞqáìóÆn§ƒÄ§¯^ÅúYÐyÕt:D’ýi=ìXó} »]؟|Uûaä«GÎ=/ðÐ|EO}âU 9WŪ_Ò~´{y@>ˆãÑ?}õÈóJ/ðѾr¥ ¬u¯Žµr“1öA•$N’ŒÇúz—ûòû3êGx}V±qËÏ®ñ2SñùgÎmý@ˆÛô띳ÍÛk¯Ùæã·ðïÿÀÆۑÿ ­ãðÏx¨Š&Øûù1ìõÒÜ +ûÃ/Ÿ´ø¼0'/ãÙïŸëÂÅ6ؾãyµq¹kޚ<ÂQÿVé9"¡Ofç€Ù=QÉxõâÇðr—«„AÊØòŽÃÞ"Vò€ÿfc‰#ðí±ñŠuÀqÏ#Ì/­ƒ=¢{zÕXl>㈪% û9~wº.W‹ÁˆA"Ÿ«~ýQå¨g××®A6oYçÏÇÎåXÈ9ì@~ÃX´T¤Wñú#T„‡ôŠÖ›-ão6F`ëh1nZ¡Âø̽Ä4´7> /aïOœ/'Q¢w¿Á¯Ùö£ñºjGöʈñ¿çuöӗKKÆRâÊê5÷ݦx01ùAä4ˆvCey½.YÎ`ä2¾·ym-?zR¾cϙSÁãkÍ4–-óÈõˆõO¹52á2Z¼£Ïð£³Q„óFÌ<´/ïèá«C$÷‰©Õ7-¡bØ%fI@²·½x‰ÔÉ>¯óÑíiðrK|;gó¯uSNäW÷Ưo=žÅ­ Àœ×ôó)Üû:ðò4bJx¼ çöW‹{c1˜©Wl|ڕX/^qÆ£4óÌA¤µæM{“ 'ã_ºrË.œ­[t'ñzêö6vpŠXO{ÂøúÊÊbÌ#G> ×ÅŵÌÙ|ðÁC>rõâwµõå*.¨'|ä¾|½j"Eº·‚‘Bo9_‡a¿^wë¾ã…×›†fwù(4·–Ÿ&ü„|}ѺoÜé×=O\[)aúèÛ Ÿàa–fãü´Æý,Gnw~Zq#~î°Gޅ»?ËÚö«ŸÞxæ ¸(ñ–£Çduž}aF +c™ÛrՅ·21óåÜXæ—á™Ò'üºï_Â~–¬™Î“±^q+JyŠ’É’_ rs:ó‹9"bǫ֔`n‹Ó;½|!Œ<2Om· šoÏC>çËx »§Çá0€lOøä­æ};AŠ«“‰Æz–ôå +ÉkO„J¾ÙÀ…]gØQt%cÍq\qkçÈq½ÖPóák` íu:ŸwÉY3bÚ¯t5G+mqVƉm5\¤¢°ñK<Á»*r¦®1ñ")û9ŽPî|²C£&Ú æl©Ð GLÇoøÉÖºñÖ!2ú%ìs”Õ +›qp”¯Ü?÷šÿÃ8Ô)CGˆä5ÔØ?‡µ¸]Ì3¯3«9®`ÿ̞Kã +6¾b9ß{%ϕaÎàÉÏ#ôǓ^¥¦ª“½3â°(Âñm¾kåå]Ä݁÷Õý*—8·b¢™ã2*ø‹ûžW‡š¿˜ÚÆñÄŽb¯sBz¡­÷47ŠpQ +è=éh“‡ÝïAn›¯›üÃَ×r–[Þî]À³²Ç¦DNŸ° +7†Q¨kv˜¦¾„½ä͌ùÆú:BHåHpäˆ,óëˆ3(Ï §²óOÞ´£Æ2Nrõ–Æ–ƒØ™‹’cu­4)•‘ñtûa» Ù]QäºífÐ^FNL§ÄcèPvé{Œ0NùÙÓzd Øñ6œ& ¨Ç#¥jhF’AâV2ߌ/+ˆÏÙ½qo=C"áˊµ´Ëæ²Ã'|KÄ:=Z3fÅ4NëV258Ul'揜ìf£o;ñ”åÜj~ž‘r}YKmDŠý¾·XBæãûˆ!õ5¶Fòþÿƒ½7[rãHEçYfú˜]Ó5in˜±åÒ²~`E6§K"ÉVkNŸ¶2ÅBÔÁBŠú™y™o8Oó¦:sÃ=Â="Ä’àR@1{aŽHϏ߃8²³%¸–‚…{Ziîu»«©Ã ȑ´ª‚<ú†‡–&êCPËxŽR-Li¥¹½Â“EÁ„1˜ØЖܘ-Nh¯phƒŒšA´c@Þ rL%Y&•ò‘ PʟTp Šcðñ +8.L +g+āKfXh4÷î¬Tl;ö±pù*Ç5jìˆ1mä>’’ƒ-±Æ;›Úi¿Ä®Eh¬u‹ßŒ¢~┠µ +uۉ>:ÄiYxÂÆ:m8t0ã=.ò”€&ÀIΣ†ð RіwNð a²ÃùJš¨uÁ¥ÆÓNò §ù–ŠB·XÄB8)$>€€x Æ)}lZù$<<‹á«@Ë3~¦Æ$¿&N–q@åÍ_öu`ìt@¼Eε4&¯Ã»ÝA‚r@ɚƒò!rВM‘Ql ÜüÁÖ±˜D†2ˆ*6E°åÃÁS +tNä3I%Š|¤)­TÀ ehù<'¸ìH…w8`ÆA "%&šòdÀ½,æh¨nï_æe½ÄO\K5 += ýÝÁ™] áÆÀ`µ4îLƒË‚3Èßuàà!ܵÌáµDG bA f0ŸyNÑVȓ|Œ\î¬çŽÚ±ü.çeɋ¤!„s¡ö½yæʟûq¹YÏíù@{*a®˜§§MSæÐÚI¥у Ҝ–ž0 xw@ѝñ +A- Õ¾q8têG–FOì1ŠIɜˆ@©IK’skØ8+/;¸É„Í‘HFŽæÕl0%f w[0cÆ`6‚ѐx­ +|$±”€ÙPcÍlU¦ ¶èlñdät–C ߋwV¤(ù4ã¡Ai…(i–{_¢§£ãnВ}Ü:Äì牓Š\o Ma¢çH|¿½é×.Ç隶Y‘é($7÷”`)tçiˆôÅ yAh#έDԳ܏-Äâcc¢‚H$5K˲‚A³&-ü™'îÒτƒ*È؇QíŒ!1¥"cP”Q`´Ïh(X·½•’Ãg +WOÛÑ®9'x¦ˆÓ»¸+šŒd?ËV¥*ÏG|Vc®:TÁ CH`H-æÄñÇEä;ÃÐL¸Ä ÆçšÂÙ1†ÅcÈÙ±i>8¨pÚª:‘ ƒŠv´(# +†”b,”ä׊$U©5Åag¬UáJe YJ²ŸÌ3b\^ãËsWÈÛCiÁ錇´Ï ±r{ðõ +ܟAyJ¹©«ìâ§ÁÍåãïáŽê6%LÐۑa‡P©,òɨ‚û Ҝ9»'Í\wÜ1ñI–A±Ár¬@O]©3+bäÞ3¬h<#6Êa¦±C–6‚jvérP…æ܀ÜñPhœIæâ)Ùq¢|n†ƒ—+4 k“"ó¹pÿŸ»’ãÈ3Ùú…r +Ü7”S|*څN0è,÷G/"Ã@ùœÓ~R +[+TA ΢çÆ,v ¯eÊ݂æ$wJAh¯V´m«!¿…bá(•Ü˜9˜ á{i0¤…H>$'o(Š¾-¼l”ÉÀÜ K™tNÏ. åšäœkålP‚c + ܹö)þƒ”ÐÚ½IœçQì²f‰Ÿó]‚GRiOȋ$楣.én–õguBù^áè"15‘+ovòÀpDÌ®ˆ²òЖèD!9A.˜oÐoã1pø¶•Ñ£¾ Cæ dI¾Ãl|Ò00 Bx&†ÄÛzÀM®ù8Á›ë|ßTQ?Í~íHZ§xhDk‡Ž/Œ‘äl%™—ÖØ`i'”æ<'hXn,¿„sb–èâõn)E*`äi‘Q\i&”ïƒNãÈTr™%îú&”$b.P›Éâw³¦Q˜h̹¤¨à-\ès””-9áGÉÌG¦4æD{Òsø5¬9ӂ³ÿ¢˜YíÜ;:®ï›a»tâ\K®1…`%.A͵$Ûf✚g„ªG>˜ÉÏ Ø:‚‡”J*3.¬Ù“ÈÇÿZ9=£7ª•Å†©ñ)=™á ¯Ä]¸êÑf”T€7ñ…ã ¥UÈ9K);4‚ÆŸ¥ÎˆåèҊàBIï§K\P‰?Ô2ÅCNHq +è²N# ѯðó§-琰À~%âhâ£YzYn’ôº‚s{”Ñ„Az'zk2(KPßÈö…" + -!al]ʙ¤õ£)g9ç8ŽÄ…%{‘/§ìQ$cÈ9à ע“î҄£‹Í‹¾)í:4g‘8„é}Xå OfV³°]P–=2é&#ngL$ð§šv®ðVhP¼Ï +ºá2²A5}0I¬­ÉQ$!3ñÁrNCÑ´~„¤§%LLö6zE‰–0ôñœT8Ñ×JD–’²à(A4dÙzx&xÍÒ÷ËËüœæ²ÂT„Ap’O–ëŒÄvÎ(é.dS£šÛg ‚ôs¼É0¥C%¥>ÈBJF÷Ó)1ìœà*!^ŠAĄ™9Ho¾%s Ç˜«¢Ò‹£¹¤œ.\lÜ7í}4 äZ™€ +h%w,<:æü±yHrÜy‚\´Ò,“”[›Öèá‚T­Ä珅ƈ֝—˜3Z‘‡YöÞÄGáaã"¤Î†Ï]¤<:Æ uï\ôŠñ¶1ò.P,؃$Õ¼C½áF‘KÓÌ aHCNº0†¬ .‘xíL92ÏhÛJJEËOF–2 sËg.+Œ/(‘›RI’ñæR†€‚ZFf&]“®ªi¶Ú&z04ãÎd¹f5Ü¿×8é¥J=΀ąY²ÙŒ‚«gý`ƒ^¨\ 3Å6ÁpH—ŠläÇô§¼Çœá3†; àk¦»áŠÄU\u`—,X¼Á8J†Òvke˜d²zt0„$·Â+Ř甐xƒ^ÆþÆ$ø<]Û4œ~Éd¤ÞaV²&3¬,ˆIvCîÔŸ|'Èêëc í§&‹}!¼ÎÛ ̅÷2¦¬qø‹ÏXAxFiô>+_Ç}ðò žá,öA$PÂüċàäSÎ%¤©úì|ßØ©(x˜°éà šÌ2,äO?Oáa(.£ @®6AY“1$ñ6=JÒqHz´$ï*VM¡U±ÊiŠ +NN\i—‘¸!.Hp–›0ãöœàFñ^ö1ÀIB–MÔ©\âX "8ó!(,å¼R²„ò†’8p³OÓȈ@ƒ%vLF»™BÖ±~ق­äI(v&q\ˆ1x.Š\1çß,å>Xqñß¹q‰ N ™ƒqÍ»–þ°N½{ß¿ÎPÌ7.ª”bš%{$tšQLs}ù,²& ‡qk!Khâ2HJc ÄUg‘9ƹä}c.oæ‹NaUsnÒ§’<ª|“K¿5²ÈËn2A1É …pŠ–¡¢b-×÷B³”|g×`’É(Æ]»Kdϊ0øå‡$(r_:¬ñŽ5¡ àc'eqQŽ‚rª`‡} +2èWds +dÂÜD‡Œ Xuw!z¾1=ágj¬ÙcƒæMŸÀ È҉ԂÔm•åœ!Üf÷+ØJ‚2=¢ï€>f瘫7Y_"0°u´¦lþÔ‡‡C¥WÉvJåí…OTˆl¢˜³‘0ûð Æàs,QKäüOÁžKã>ñC(ÞŠòLdN‚©ÆÎÀ§ eœ +I®ã€´ CžT6sºv×py4â}œ…~÷¸L¨"Nd‰t^Hˆ4vW°.!½K7x dþ&X&įQt,X&Ñz’^l‚–ÕÉÄܚ€A°z—{: ¤/¡¦è€¾x8çŠw³É ³0xt+]( {  “ÏJ©Ò§ê"¥º‚yÆtóPÞÄ`H “¾hkO9…Pp–V0Uö°ÀŒË²aâ´Ç %%é.,> ‰© ­Ï@%œ—µùæÔY¦1“Ô’Â’”+ þy1D,upNð Æà$œ`RªwÝ:ÙVz ÷Бä1Š Ê'QWgÏ$¡ g§gª4$"¼àÔZÃKêžHCqHG>&¥‰¶,ºòýèRgavkÈpÚoÊJ¿+å‰ÙÄR°* 3—EfKª°#3Ê0wë•3š%W«LBZ+g:C4çxJÐl³bia¤%/”„òÀEP¢4þ$2'¨Äí%‰ÈÔ7㫎)ö*šÂí?ë3¼0Ü8'íÚY)\!¶s`àcÈò‚;ì_§8G3èt>b\?œéêÄ{ƒ -MBƒ¤BÊÕ¨ôÛ@Ðë|øŽŽ‹ï@ ‡0ъ9…Ò‘‚JbAí +˜©¯‘–Fµ81ÇcN#c$ .Poà/sFåhSòŽ88ób }ô}Ë\„º‹rzž‚üwšf_ Ì59/Aލ¶©'‚U’øm{É +åÈB5’P\Û§Ž+ÞɔÄ„cÏwCYä¡´ÿ½D¬@Ž–aò\¡ËæsòÛ`ø‘à ðŒËj*'çАLû:l: „ ó4BCu_å{ Eä¾æ˜T¶g#|Q,†NFђ +)ã>ð=”çKÚ‘Ç £“ {ž<ìò£ k¶¾: t ÞP#‡«ñ&ÆÉtdµ˜ +XŒ[î ÍÛÓ6&k”‹EPªÀúXhØS‹oâç5/S,¢Õ â*˾(öEÝͳ,ÖÚÅ´uS"N¨¿ ŠXdøÖ,¥"¢³Tn¦0»„E҉© tN'ˆ§M±|Fм]cÉù[ —c…b’¡4ì3£š4^øpJ!ú"#'•}¢š›nœÁ÷³á¥¸®?I±ì‘¹¯2’Š¨¢Zž²i±¨ŒS¤?`î Wå-–á×äÁÂò‘©Ä\¢»$¡N/£…@\:U°îEi~®±/š +¾)”eÆ$:ʜ+Rvy¦`Ie´0gáœà1Kœ},Ã%SÑOhŠ¯æ¬‰¤>ªÞ_Ó¢ +—úJÃ`€¹Ê¡Äzl)G ¥,¸¸×›Ñÿj>²­ U +Aû¡r…Œ\¥„Vqλò½ìMy`™÷ãÁU批d +ëƒÍï¨!R¢=&~z®ÂÉÎÆÊ4îIáB\$›Üùêݐ§QY`(]† gÄÙ +Ï+¤OÉG`T·ÔÛ è ¶IW‚"ðҔ 0z/ °nMùÎñs[ÂZ 'B +÷'Ð\ß´àš¬$VPQNq´v¢j‹n$].דkêœË…f: y?£MÓC½rtb"´Äé12öÛó²pç€[‘xÔQi-‘1ïxJç¹ÅgL\ã×øé1QÙTìcÙ£¹d Škûd^¶@É%Ý°Úc‰XLãÂaÚ©›F;ñÛï+–Žªa±bßXP5F᫇Aø”kšPÞ_Ê&C ñ•ÒóÿŽ•éE牽ik8Poêà¬YÅÀ\֋H¯ )ï#R)Œ·žÄ*Xêkz÷2j’•#´K£8£¢ÿ¨yÒJĄÆ‚gœí­© +°¡h"¦¤*£¯2´Œ4ó„2¤=ÏÄÆTMGJÁhÓäíZŒ˜ +æ;ƉÅJg„aia€™[N/„“‚g°(ÈÐK¾²È¥8; Û±xþÙ*W._—°iRÖÕ°_P®#µŒû\B¡jÒÄɆ@’WS)Uƒ\}Ç0Á:ï‰þõ¯pÓæ#VѪ +ì Ã9|9÷òÙ<ìã*¨+!GAù wèxK9¾Ž"Ÿ(˜iƒú(Y´#ÿ*Ѭg¬S®S‚eà™ä×±î¥Ã(Vy¾pp)%eÛՐŠ8ÃHƒk–sN%ëRjòJBY± ô©”µé3Wd?QS½ ðºÒÔitƒ ʧçkðœG—.ÕôàKUÁ»Ý‡$Vjz`m~äº÷*áXf„S1IÉnItù)g¯ÔÕák—ŠQ𵂆Up@½…‡ŠjT^ €\@Qiˆº2þ¥`Kâôq:Nœ+°)ºµ4c՗8Ýƺ¡H£òaõˆ‹3Ä@®/!DœšZíÛy|VµÚ_£E©Ú7½DsŽC—׉ÎÒÔgBŒ,×µp6(½Ë5F®×·ZñÏwo¥j× Á3)¥ì‚²_`v.åj$HŽfœÌ eÜ¢„—q¡ ž©íÁY|í‘ß„ÒEG·QEK2lTÓE)j_Ò%¾¦€¦Qӓ5×#Õö,L¸Œ +èJ¨ +ÃÒ&|½…;‘]Ò ——¦ßµ-R*’%}¶u!#Q–Š®¬ö l"”é¸~ àû<ÇÒ +endstream endobj 31 0 obj <>stream +¬æ…ª|¯‚¡mÒj7TCD¥Hø2‹º7Æ·9/=:ÃU—Qw áj÷ÀŒ…-ª¬R×~i(ŽuÉ·¾4cåœo\DŒ/3\Á{]O–ê .‹ø’RVÑ°ìY¸¤ÔPÉ.d¨„„X¿¦Û¬W0‡—jW¥Êý”òí¾™v– Ïù&Ɯµ[w3€CÎ#âÚµ»ªyѵÆY|=»‡ª®o¡Û©ÛîÜMB· ¹Æèàç …â`ʽ‡:l<óõ%ƒfƒ{"¢ò +*$ ÒM¶†kž%¡ÓJßâÃ) !tZÉp8ùpqvúÆÁm¨¤QKÃJ4|´deêBm#Í +ºØn¥AòÊÐlþ¼a¸`Ožr¢¤ívˆy””Í*9†z½Š8¼³paµî¬Lùîk¬ XðÞTQÚgΕr$Ý9S‡'°Ú$Š‘0aXP*ÑéÑOLTj1 Îp¾Ïyt_cg±L(ßGr9ƕŒVÁé.èFLpøÁW_‹™Ï=Í8žÌð ¾0j(ȑœêÊ~àÔ;w„rÅÓ+R¸oÚþLDËI­¾ öj‚¬#ÏfeÝ<ÜӌIuô®ÈŐêó5xÙ­VUt¾ý®óËßV>óði~ñÃxp:]Ì®Ÿ÷æór:F¨èÅO“ñóép<Ž_Ÿœxøiùz8Žùú«Ÿnñ7‘¸_þüäñpdQ}ýÕþÜù£ýöˏç?M%~~4ìχ“qoú~ËOßw¾ýõf4¶?žØN‡—‹y9û®óÛðátÚ[nÓ¿ŽÓrŒ-dçÁÓñ<üÿÌßߖøã·B'ß|×yð×ñ°oá/-îñëjÛ·½ÑÂ7~7̯7·÷n\cÛßüÇ0´ërøúz¾ûبý] îD6ÜûÝÇõþH†ôëîCúõî†ôðéÅÃË×åը׿ž—éçåÃùËþ5°™ñ…Øy¸Ãmºm Ðè» çÐØÐËÉbÚ/Žn¯{»Ód¼ûŽïn\Žӝ5-g‹Q>Díïjpzç‘ÍæƒGåÛaºµûøªOí¸º× ElJýþŠpU>é-f³ao|ºuF£!lž™Ÿ´A>;¸CFÛ`D ÃÁž†¸Æ±°ÂÉÕÕ¬œoß>‡!Þ%«x†#=f&1´žþd4™þñÝõp^6`öïG[ZW¹<6¿3M!Ù}`·e1êMøõv2.Ç æê“w6ÜÆ£=›ŒgóÞ>£ OÞÕhÍî£]L¯zýòe¿×híVžj‹8(XDÏ[VÝç;+CŸˆÄþç¾YL“1‡àD6š¨ßvÔow.è<Ÿ ÇóóFƳ?|ºÞ¼ôÇι^ŽYÛÏ&"›°vyw{bÛ jr[N{óÉî*wôı]í‘|PêÛÙäæv2Ûªñ6Ù]ÎӀk¼¹C¦±ûúfËà+#G1¢-6®Êˆô1h—oTƒ©ãáyÇs÷¦ÃùõM9öïõaì$©'ÓÞíuƒ‘ˑ<Ο÷†ÛŒ3홼όڑ¾‡}e|—³üc9}]]Yòj¼%¿„Iú¤9€Ž`Œ×Îýxð¨¼ê|ÿõ¡‡‡%÷7<¬ÉЎ-<ìÞ‡ÝËÐ00í}¢ °»‘N.ÿYö秓Åx`ûx:Ù2+ÌÓ¶ÏvŸ½ÊC;žˆ‡Æ`ç‹éåbTŽû»ûÖÝû‰_u'ÃO^·óþ–S¡8Í_ Geƒ…PyèÎ8T7ÙÝÕ|ٛ•§åÿ^ؙoÀ€—»«¡n1oDã/nžõç½·Mf3~æ®FÛò¾ëÓ¯vd=‡­j5š©ã±ÌÝs÷Øg³ÈÁªUN[å´UN[åô0”ÓÝãê[åôþ)§WӞÄG?M†³V==zõtwCÓqk§»ó¬V;mµÓš©V;mµÓV;ÝޏãÐN­ ý¨¼—ã‹-an_PšÿöÃEƒc™ÚßË G½ù‘-W×õ>|6«":h Þá:¸ßÕ_ÚÛ¾tIòИÈd‡ÒçGÈFÚKvQ{i§ªù4-ÍÊÁiì÷ñ_žp5šLþæ„ËQ¯ÿæûŽMn{ýáüý“n“³í˜.SÀAß;îßlTGºïÃ=æm7»î &ïÎîå +ü€c M,9ÏoCÞØ +(Ê(ïEyðÁðêjÑ ±÷Xåîy®žÍo7ZyððÇêvNû*ÝÕ›ÝèUw$gò~zV{.Ô¹ü9îå=ŽµGòÎ3rh'ú7^Îw9Ûí]à÷u’>igŽyµ´Wî,îx¯Üùr.„mâs¬wîìç$;éq×»vŽ_~¼· +Ýô,ºÝ˙Óñ :‰ÿoÝ'†ì~¹*§‡Óƒ1ÚìÏ{— fþ˜ »²³»©ðsCËmå¡;fFãþ‹cæB÷wv³NÒù²Vâ“v%äJ_K<=„!ÔÏ DÈ«io<»jp[ÎîŽ}MZ‹ÏAX|ö‰IÞwëó$þÖì³aÊ0|òáht(“uhôÙsI·½ؙèȽ¼X¯ÉmfGv±ž¾Ïë5ܑ\¬gvÑÑÜ«÷—ßÿëzTžN›Äò·×êU‡z®Õkà‹?–¢jÝŽ³Þ`¸h0ãÔþ®Æ6Žz jZ£ÞyŸC;ï}°Ò“éíõd4y½ûÉ~€ªfƒ°‚–'¶<ñøƱpÂ{juO8áîÙLÇ +›±IÄ÷ý ƒk°îŽ”?X÷½/Ð óX˜ßTá i òw…ƒÝciµÀA1äXN¸ÏÝ}—'Üý¨gp¹¥à[¢?coÆÙuo<.G/ËQÙo¤3¯>yW£}¸»7jïÑ®>yW£Ý}µîÈ_9Óïøޟ²ØÑDÝÇcm÷x¤ÇÚ£áìvÔë—7åxþcïö˜Ï¶{\«çrw+ϱÛ¡ÄPg壨|ÜyèÇV¨‰0v, s÷…z¤ 󞔺Ü]Í>ŽÒ„IËvÚ}–Ž.iºÑî³¥LÚ.½š–åo»›£¯†Ûʗâ½FÇ0ÿWÓÉMƒQaë»Õîûu>i |NîPNÛ"PÅvçòuÆê›ßÕÀz£w½÷»ÎòËyoڌÁºîl-î>¸AƒJ®ñ] j÷à ÷á'Æ®]z쮆<ŽËÞî×D÷{£þ“)%Ñw5Äi‰FˆÝ't0·o›Ì%?qWcOÆ Øï/nÛ#Á*CŒž¹S%©7Þ4éù>UGîO­šþ=Œ\ÊÛÈ¥ƒW@¬»#µç´‘K;ÌÕÝZ¿ûmäÒQG.µ—³¬ôXc—š"ÇrƵ±KGqÎõÛØ¥6véxb—vWoŽ+v©‰4v4±K÷ñXkc—Žçl»Ç±Ký/ vI|q±KM„±ca˜mìÒq0Ëþý‹]jÂ$e;µ±KíuûÏÌ13æ;ô.'x¯"”‡6=MâYÛéùìÓóIK¾Ýì|ÒÎ@GîcׇO/ž-G³Ûa9ºhŽqÈ¢§I:fw=ÕÍí‹&ªjôÈ]±­¤Ù˜dÓòf²-ÀîHCχãAy5o­ _ÑPnËÞüQ“0Ù葻h»Íúå‘Ån‹Sw<ÁÛ;÷&r{v ±Ûmäv¹Ý(rûn8NG|/“Ž0öߤcÿÿ½ýlÿ~oØý·pcܝ·G¼ú¡Ik—[sGh¿Ïµ³MرÙdzÖ>~|,¤½àj7;Ž„Kö骷g‹-ìï>8çïÁµv»ÛEß4àoîmìn}³e𕉣і¨„ʈôê.»hKØReDêØDßc9Š{Óáüú¦œ73ŽñHÞëô:Æ£ùÞ'‰~ì³ùBûMxëÎÿÀÎ@Gî¿;¿a‚ñ!ÍZw~ëί!YëÎoÝùë׺ó[w~óQ}iîü¶[ëÎ?w>ŠàЗÉ÷ÍDÂօ œÖ…ç°Ö…-[þÁ°ÁðêjÑ ܱp‘Ý͍žg“±•øÇ öÛʃ‡?VÇ"^6+Syè®Æø¾&ïvèhøúznœô!}÷±.?wg²Øî¼t1½²âwÃ9­>uÇᱜñM9ê'öoځÓZ[«bkU¼3Qá^ÞðÐä´oM‹­i±5-މôþýëiYŽ¿·R_ù½=+‡¯'ß¿NFåüûi9ø~2퍷Å.´6Ç;—ßD¾»]¸÷Ûðf1ßR±¼²V遻Z¨éîƒ+Gö[3 VôÈ›¯ Ñfqç„ Ùþ Òtîò£Þ t÷Û²o9óô‡_oí)ÐÄö´úäI”»ïêtsSÛê“w'’l1€Þ##T“•ÜZ¡Ë +E;怲 Q·–¨ÖÕZ¢ZKTk‰j-Q­%ê ±Dy»“³Dy³¤ZKÔ±)Ú£íƋc \iík®ik_ûˆýyéÕÁû``»ß‰î÷¼æÌ>v‰Öærï³Û½ªÉ‘TžiPÕ¤­¨s¹ñÉulGr[®á™|ŒqÍ'»­÷9€ŽÜÓ +p/û×i9¾O×¹µµÑöԘÛ"GW¤b÷²m‘ŠƒÙm»ßt>Øý–zl{WË°ÁˆÞ7Ñû#áÇ +'WW³rÛgZšqû#UXžáˆ¿`må¦üKP[mº>›ëâèfªU0OÁ:ùfçEün8hûç›ßÕQ*Tƒ¡]—ç¸ý] îD˜Ý×@ »Cy®ÑHÝw(tÇæ›{T¾¿5ß´æ›/Å|“¶æ›ã“Ñó{g¾i0¢Ö|ӚoZóÍ1Lù—`8´éjÍ7­ùæþ˜o@Áœ[ÙqÖßb—iÕË{­^^M{ýyoôÓdØ +Â=¾+™øew2À~CóÉ®¼ú—ùxòr>œ7ظ3lþj8j’û_y讆štw/ìuٛ•§åÿ^”ã~Ufé±»iƒâtãÅÍ3»iß6™Íø™;ۊŸ4¬òйK[²lËܖ,;¸’e ¸ïÕtrÓ`±õݍk÷  æ“’ÎäîÆtï«°ÝË"l d–¶Û®ãlk°ÝÇlwgÛ£Ù§2‰½ZL/#Ë,î)µ-‹t”™žM *ÇeüÞ+²µ970qÜߐÁ&C;¶ÁC;Ž€Á:špÁŸËé»áô²-Ư/¶T~h}:›,KGïәï($©Gç‹r$_Šÿc÷8µcuÀ¶<oA«Ÿ¶úé=ÕOm³VCm5ÔVCm5ÔÚQµê§ÓPwk[ õþi¨÷>êð‹ÒQw¯sÜ*êîãlUÔVEmUÔVEmUÔ#TQ¿yøT$?Œ¬ª"Ìèâ§Éø¹Å‚gžxø)Ü¿ÿòõW?Ý:<ÚýøòýÍådd»tZ†åøª  ¾ÃhXþþåøJ=ŒæW£ßÿ³]>{kûüuÒyøõWIç—w_µ ÿýë(òàÏàÑIð¿¿¼‡oÿf?ýÓÂÞutçÇÎßÿ‘t_‹Î//à7Û£´›$‰.:'EçÆ~ƒ¿ç_u²nj2©à+ü¾¦Òàç´sfþžÁ6´‚?çáeø…šÃ×ð‘âƒçø—~‰^uÙ¶½‚ØÁçöÑø“uEbt†µm?äØUøëÆD¿œ„æ'¹{·ýë^àGit‡q¿žänP'¹ÿ=’{åŽ>§—0Ißþu +kÐy=íÁŒÏ;ê;œ«“æÍÍý{j§ç$Á&‰èœ‹QÊNd…ԝ¬ÐºóËM¥¥õ-SÓ9íïŠót7œ2Eœ8 §§v1þ¦-éfÑ"DBݸUUœ‚@f"ډ§Zô—ç)š½¥‰­þ íÂÃ~Ž=Všé¨QÇhš×͜Ü}æ,*™Tig€ÊjyæDQß2•+3·çén8eV9œ¸o¿ëüò7ïCË©’nZè&=Uv¥Ø?Raì“«TÀáÿ¿ôVypÙÍe.TGw¥V÷è |–)¬=ÿ#L1|.l÷ðG,‚>ڟ”@-£;Ç|saO°yõœþæâ[K…,7ªÈ#SÁééC |1™‡ß\¿ð=´ôš›ðƺŽÕ j¶‚nsoeW™Tz×Þþu*3ìI£žCµ éø‡_o'Óù+:$¿¹H:N'“QµÑ¸w9*Ÿ,†/|s!VQ½°G×l>ÅEu×t„¢à,„/ÊÞèǞίШ‚¨x9ö˗ýÞȎõÉt8øKù¾:B^Ÿc¨æ0†ä /Ô zóÅÍ †I`¸ý‹ò@׈Tg°IíRԅ‰?$™åŠ6t"Š´îƒÛÖI7_#Tˆ„¥ +·ßíÁëy}F’îҌÿf~X¤™Q©†—ÉTⶶƒ*ƒSDeҘޒºÓþ$óçœ Ž÷Ó_b VêùÚÀ»o¢ÎÀd'&üÝxL›ÍÌÞþœÖT¹lüX O€}˜5ML×̱œnÒTÙ9Žì&*|Ð~¬:ûž¢É†Þ&ÛǬ·9Ù:fUTǼp£çîƒ"ð±iäi†®ë‡Ž²C=± Õþ“Ӑ톨ü¢sçê#§õ¨¥©´?J?$éG”øqÐ_¹m8'¹Tãł„ª¶°vãÈ6|ÄU©+«2«þ MÍÐteQ.=Q3"é$ýx? +úûqפ^»Ëôº]¦×î²5#2~DƏˆæ…þ~Ì5¨·î1½né­{¬n|‰_‚Ò/3é×]þ~Äå'*Ó¥«?hY3*Q™­¥'V#ÝX¤JâFàÿ|ܕ'Öí$±n'‰u;©~(Æ Åé7?þÏÇ\rbí붐X»…ꆂ¬ìÿ +/aÐ_±º²ÄœP3/^¨Z =±2/Áà3n5·¶ýù¨Kli(zi(5»ei(zÛPŒŠ—uýdø?q‰}ê9‰m‘Ù3éR +‘cÇ@y…LP 98k§“o‚lÁ[,ˆ‰‚4@‹'ÛM8ÉødüWúö`ôò&Ð^:AOõÈ+F¨«ÜÔè*¤Ä¬›‚l‹ò±tˆ¬*(gn ­;(T×´5ywÕN¸ïŠ$´¯,Væò€TzÔæúG݅J?Ü&ïƵ +½7ó;½~ocÑ- +)ì¡ýft@'iW㇖w…I3ÝÉ»©1¸ |£”Zà í¼dª¨NàQ@Á@{®@;°Ha#`Ô׍0ÆFo,|#îÀšïû_D4Fï2íÎ6Z÷ìy%Y‘nµîUü?Mæ/Êþd:°<Á¯}T"ìŸT墛ªv›*’tu½ž=|úÄó‘WW“éû–©]σÉeyñðiqaûürþ~T^„·WW3¼ö—cSrslú”¶„c±4yX°S¤ ³ËÄ5ʺ)þÀ€ˆî ‹m£¸jûÁ¯<^ yXgiXëŒ +ž”n…j¿ +¨óå=^†Õ­E  +¡¥±¦¼ÂÂȖi´«ÅfÃ2ñç†À85x ºðÅ~P8(w„Ø/‡ZûTb_%’üµ=/§Weî§\½ag%M||¿kžeÁðú?Ÿ_][ôߔãeEm)Ë.$t½ +kÓi’åàõL³Ää°¼ò<•Y›s£§U·›“¢]¾Ëo„RYtU"0®%K”ÕÞe>[¦iùDšft@Bv•ÌEa vՃ8–({ÚÝ-*ûiWªÌáu€¼›e©v =)Œ}B‰n‘f.øÇ5Z…žs/ùU^u²Ü™“åÃ)S3®“xèø}™6'1åNbª³†ïÒöcìÛ!eu¿w?Ù¡¦™HØ4¨œ2¥g4@ÿQ ö{hÁ—ꛢN„ޝ¹å@ýŽÇô6X¸,Á3a8V8—*UNˆI´)è<€dÖ͓MU+O:&eBKÉMá了öø35€xŽÖAñùê»\°Yôú“ +€ 8ûDxùò÷*RK~Û[ ëŸÿ•f*ƒ§e¦v8 ØÜ·®Ñª Ìa!ò‚>ó²ßºFj-àœXýf¸KÅöðê3¶[–N¤w´%¿n¹íþçæí? Çoz‹«Ù»Þëzÿ˜»°;¬ƒ–,Á 9Îæ”H^Ê (†Åf×m¦„†¥‘[&ö}è_ Qh¥ËäVZbwW^ä’#“î +ŒÛ=Ã×;˜å-Iî”aÔ¡}Ÿ‘pƸïÒ~·ƾ[á#ȕ³Ø¹è<¥ÎHG0!3䢉Nû) ¶ö­:·lN´&[€ç½#ƒÐH¯ºi,Ÿ€'ÊØ£@܅B”@1Ü8.O0Û«:Àxì‘âñ¸—Ñwܸ±èÐŽBßqöܲ¬¸@Z$ðÁîÄ"ÏŽF&PòÄÏ }Êû¾xˆï«ÝZY(}Uø^;ؤ0½ô´[K•…å؀‰ÊaI$y’xÎiuÃDÛ~Ûs#7>*܁p¾rçy¥Gk@ŒÍqÑÔ•J¹©}‡¥I–CÌgx:€º™ÎMùÉÔ)edžEVm×­å v-+ ñkð–Ü£”]™e +y$â~Ó£5 Âæ^f(…a°õ,êx­ÛÅ/sUÙ³ÑKV°Ÿ’U­Ý>¶¿€\ƒï‘þ=™ è »+­È•†ïwª›’Ók<Ü!hzp/ñßû¨„d–iq «Ó¥©e:¢·ˆ:âqP?—†âTû|fâáÙ§ •ðSöOn'ŒpÒW~+|¿èißo=ŒË¶ÃcÞC”À—ÐÓô•±À¿žö}«öݍçÀSÛ5©MÇX90SŽUiŽnêSX*Çêî‡$:µ¨ +ö܁¿…0·Ÿ1ޚ`ç >¨¬plÀ?[‹ž½ò:l¤ÈÑ!aqßD0°MiáPØ£2µi ˆžÜ`Å×Þn¡ëíX—ÆCG<4­0®'tjR Ï°ç˜HÀíšÂ¹i¥0Xièj–ᨤ–õÏfvٓÒ>[`DºóÛZޟæNSÒVžYó^Û¹¼0`–7Y7Qcp©Y* +´7¡’|ͳ0KŒz{>º[—è}ÆÅÒ&öôÁ?&s·“?ø±7{³dy:~[Nçå`y“ž†··v_,à g°e©ý/‚ð&…Ù=Pþ‘¿áþxћ¹d² Û?Ñù剳¹•o‡x¯ØûÎ/?äï¼ +N0. ÿùèv +¶ò/×È5tÿË£u¥;°€}ú;ô¨7ïýÑî6™ýÕ/O¿ú—þÏÿýïµÿù¿ðûúŸÿû¿?Ïïk:ÞþÞþþ/‡°>7ÿ¾m}Ø€/ؓ¸r´?3û²ÐÀ¼~ZÇU#3pÑy¼øí·÷à³UI⛠äÊA ¸øåÿó‰¿]"Btnõsæ°ß#â‹U”Ž½I`©Û‰] ±7`YYjá™ú¿.\Ï .NgîÏk„®J&ß\ÔÉ&4–D†zhÕC³* DÐH±XV…”ŒÄ”o.@P16U¬Ü»¿°òÍ҈+ß\|ˆÀòÍň,»v¼Vhùæâ±[AÎsç<ôëÎÛ·ÂÃ睇‹ù¤ã¶äð·2ø„V½kÏ.gåôm9¸°2ý…k5«n;ßǓq§…[ñËahIäæHTN+ûÁjv¥…œ©Ábµü·¡A ÔäTåƆIYÒº˜@B¦ý›'näÎpd—4þB€3/³'Jà¹J¡uü¨]PÎ$@Ø#öÁ#ó@Ù0£çK@•aH¡·œ%ˆ{AÄ&øUó7¨ð(›ÑGìÅYÍH™á0“ ²Sž»Y:ôà&î‚U½$äǝ·»½Hó¼Ú{0o!*FÓnnRmæ@´ °@»#dÌDz{D:îdD: ÁÂXâø;‘n…Fþ¬Îë“.†á…‡¿Û¼Â +¦yõ@?ƒÖUÚÁûUÌ.¡ƒ©ŠhˆvhÃ`ˆŒ™hÀ¯7-u3"…äÑzÌÑw"Þ +•‚§‘Ù¿ÂäYEf,¬ š{IÅ«¢k%‹<ˆŒô=–  Œá9/ôÌ@¯ÅETÊÒ¬"-Â_§ïyÔà«Éü!…ï'@$*(–ÃsDÆøú³*y⑘`BË wǔ£>Ƥ£ðƒ<|B˜tË4Zþ*›ÖÃÂÖòÇtØ|^’ŠIG"WL:ÌøAÝ5bâ1,¢^sc$ÔLze×ú~V¶­LضDÞ¶¶íªÒ^D=É´r#$¹ˆH@²SD:–±"Ò±$F0–Õ1"ÒX ] Ãñ1j¢¿?"u3¢„@2ñF߉lËô©ŠwÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(Æ @°„ã"¬4nzqD-ê^D-xÐkô¨µL—ª<Q‹@4®œ +7n’“"jyi*" \"ŒÒ÷ˆX +Ċ@8,ÂJÃöïhE‹h•V ²G}'Z-S¥*ÀE´" ‹Dޏ^,ŠhEÒSD,’°ø)/1Vÿ="ƒ±"3*{¬4nzq¼}÷"jÑø)4a ߉ZËt9ß’øiý³‰7âT?mÒÁþёVKÖøi¹€\C÷ï.~Ú<Óì¦õ®$ú߇ïúã¿TÿGŸÚÿ´ÿáÿÔ¬¡ù8«oýûþ§u†Ö;C´ÖI³ÞÝMã=—ËŽÞÇUãž\qÖ,›¸kàÑU‡ñ^.›:"Ʊ;¢È'—áÉõŒÞût?g ÜÀ£cŸ¬óéXð¾^|tÕ¯³nàÙÁÁ­øvº—w§Ž†g Öí³nâø±Ö¹~¼ó\qÿT¡ @8²U‚÷rÕQp3Áë¼CKà&þ!ûh‡ÁûùˆðÑU/ѸŸG·ê)Bð^¾¢:*n$z© +Ýݍd_PçHðž®$x´Æ™´nàN² µÆ¡ÞÃ¥TC½´®ó5U¡»{› kvÕߏöñ8Ás«>§*tg¯ iÕïÐ=Ð¥ªY¨R¾ˆŽve„àՒëXÙýcÔÁv~gKƒ¥MPt]¤DŒ®"@`û®@ðÁÄU9ÄÄè— àãÛ÷(gqT¡Š¤r YÔ×ÜWNªƒ…'±¼ô¾ +W¢]ÍF¦›€2H®Nõ,j·ÔكÝfYWY^•B¨s£3¨’º:béç/Àõ|rû×ÛÊõ·µUñ›ß|Õ Q©/ì$\eNwq›5}–áóIÜèDåÝLà· —@Îl’'üÕǸÂg/Š±žŸø8<XVc¢ç¡þ[åºð[G±‡þ¥çô‘šÐ£ÐÓxÐg¡ äDˆë†>úë)Üg,†|•c™°Þ㠒àé"ýg¢šHÑ賟¼9Ýëë_î:zrÙÁ‡Ñ +ËãpoŽÞ Uõ£ï÷ó<žøÄS±Â×0TèáŒ;tþ1.ò'çÛìÀŸ@®¬° tù*_³®m&–/é؈wù:ßµx¥Þ~¡oLÁ›*qc¢GsÍP4uõ‰ø4Õ¼¢•¸4;ñ¼E:ûWöÊdùÒܼPŽ–¦2G ãý„õ­³bõ2•¸OwÇ-Íòf47ÑN;á­má°°OÂÊ^ސñVõÓwVÙÙñ†?‰Á:ú‹FôOS5ûIý}EÀu­³´žþkqŸîŽ{™þX5ʋÙÎá†r³Žkޗ1”Xæ3g8gq'…ÀÿÒu­2F¬Ã²X³=±IôÑ·¸Šæ˜JŸÒ⺠VWĦrhÇPlZu‹Ì2ÎêëºÐÛÏ*½xùrã­¾ŸPñ€ WMšâmè…Ê)ÝÁ,Ð@+•gÊ Ù)GîP/ÚK vªEÚÞÊX@¯êcB—ƒÙ7hí¾ t!"¼‰}LerÝáFÔaƲ<ªþ†Âê~ùñü¯OuþØù¶?œöG兺ø®ƒÑ•vêìöÇêìªn’ 4™¦™VΎ’tU.ìÞg S¹´Är͙•ÏL‚:N€/ë®=„ –› ¸ +§Wû’Œy‘ÀAi'ʓ +`Z|®²«¥[jà§Jü!}ƜBè,M½Šfû#r¼€½þfD¯¤Xn{y4g«t[ÜΕ°(âa§V—Ðèâ†iW¦EK3OqæNà: ÷dËR…NÊTƒN{%Š…¥ƒï¾¢®"€"± +WSF¶~WÜþ¢t¦Ú©³Õ~naPw£…Áíª£…åñhð&3Dã¬ž‰H²£‡QêCBÒ{èܦ'Þ䒲 -ÂEiû™ÊGÓzÒ¼"Gá%'õ:O]Ëzg Î}§®å:m§r×OD³›*-Yú]ó1žÊ<1OˆÂ•i^YnyœÅ ¥î-­Q˜Z7³¤Vùåë'žôx1DCî,}jIŠS\4ÅÇêZ¦ùr<á\žý58—%ø£–Wu'M@TUŸÿ XØb¥N>ÿï3¬PڊŒpTZAÑW Ê»Rè¼,  +ϝYΔ+Áiá|“B/¯ +­ˆ}M +™ex#Ofe"pƒÐ¾+Ÿ©= ,ÀÙÕà’¨gŵL('øÚÏÂÊypÁ!"‹Àöd]-½ô•©DƒËÙ½ž*À·jõ<+ภHlwír5àd’¹p]‚jÆ9ž²D¸ú€E¦RW#€!¨H"ÀÆcZ¢Òˆd ºŒŸ¢’ýS_üЧM>ó‘) 'bkVç  {ÌF̝֭ _k<{ö±šùȤ=fÐ=.Ï¡¯ùØxk¨†ØP•ù«›7[ß\DóõA³”c]z±Ít„ z ¸½’… Ê@œDÖåÒÿn © ¯’Ñ­¢]¼rü’Çò×Ø/ŸqqÂÏã•3]þ˜»”ÓxŒId˺…Âë÷ðʼUV¨²ÀýÈRã,xµ‘ÆI¶ZŒ'·R ÞV”à…±ØÀOg2£¥Îý32µúš×® w†U–¡›ãíªŒ¾Ÿ¹ú öHvµ* +˜¡ªU™2˜?Ûs)U + mßûE„¸Ûvì:”wS!’ÔÀeÝgNGÍS”wìB6°€1ҙîŒ@Ò¬Ðï +u£~S.rå펁kFt÷KØ N®k°Tvušâ…NP¦ßuÄªØ ¦49Ÿ»…‘§ø¸O“±lBxM…Uµa“aI"‡ý,쌊 ¯œÀç¬èäXôƸ¦MÎgcז1â ðû*ä4ºk„Š'…¾£6jõ@°ÜáÚ‰%Hìì\û‹P6;Û1¬* Ú ÜMä.@Ó êµF¹Š²–e9{ :,á)¬‰êÀ +rÁ+Œü·“ ðŽoªs†×0撊ÑzW1̖Ж:Î,I„™Y™½³šÝÁ +—ÚÙYPwt·Kí4^²¾z†’noì `›Î Ø7ëhˆ 6îÂ.i>pëÞåyi;ZžØOµÊ}²‡bïô¬®À$]荻VyU]Ò8CC2Þƒߝ ïâïð ÉÝw©}cÂˀÔcóßÁDïoä‘f-ŸŠ¿çîN$@+ËLýÜ%ü÷¨éÉø‹vV ôÂÊ4 Å/¾§'îJžpoYþJ½[§}™Ê·ð#0~¤ÁÃdå’Ìýˆ…ˆWõ1¼2ßöhZà•*Ë*Zƒ÷.ël»½·öÆÓeee•ÜDßyUY¼kV(¯^ü\]ו%o¢É®®¿šUª«Kòc¸Ðˆöª†€9Ó^×Ì9”á†Ìà͏¦Yíœ7x¾Ó{kçÜ{Ãðfb^‘b|¼¬de§Ðüªð~²¤¨Y&4-7µÛ²×Ó5 è¡+ÿ*Uó*zòf7|ÍWñր¢‡Žßçfe=¼¨ÿ‚ w»Ê»¹âõUùëü²œ–ÃþõÅãɛÅlCîêyš +T4rˆ„sZzƒ­š¡1•"—Êʉ¿<\w¤‚ÁZ(ˇVOÖ ®¥D>‰UùÛ9};¡¯5ßèËÌ­Ä4z50èÜn‹w_gà\Ötx‡oçô턾Ö|£/³#_€îÍ´BޟÙ)àÄsØóäóGÁýÏEçqïíd:œ—ãÎõpüÛâê÷ÿª¹‘òóØØ  •p©¨½ÕÙà¾ÄçEwу)Üí`"Á$-ÓuØ¢›Šœâ£ (Àå˜d$8Ye2÷gÞǘt]*8 9æaC¨¢tBª´pÎ_Ъ3ôh è½ÒAœšmÀFcLÐ5³šºNwO£.³ÏÕ/È»¨Å´%Ô¾½ª4lžƒ"¥§CÙpƒ;¿ ÿøå}ÔòÜ-•ÜÈؙËeš€‹- +Y!˜R :‘Éþµšx( ób0ÞÓÛ ËFãÃ?t“eRaÜÊUQ1‰ÎQ6vQ®…íÐ΋ÝIŽzV‡tNf¸o5ÍáȹB_|fr(: ܽ&hó%â]|Ÿú{Ï\ õ½ða´ +´£€<2q¾œ»P„‰T N4ìÁr\maZÁ c@ZË 2'ècUB—N0eI"Üm½0Áhç aç:…‹¤í6¾ ²p¾{Beô:XÍH騄" ýÆ{Yµª ¶r&O _"õ ©t¢dØwqNTÞ¡Šœìðl*áÞX™ÀÍ&(éb¤§ŽÆL݄…1 ïTL%Ø7À¶â‚©!Ó'µ[D+b+itÌ3(q7~£ßþ:GÙm*ŠBâõ’¹(@®Ó©Â[°UÜâNgkÛß\Ôò20>îÉÍÀðYÃϼ'GsÙ‹§¹ôö=¸ZL—˜¯Aºä +gƒ”¸¦¼Í¯{q7ûÜ^üÍÊ5ÎA›ó8|n…ËYh Ÿ³’ì^œÎ>WÃëÛÜÒgöáw˜¶¹Çäô}xž[ïûp=·Éöâ{àæ©á|އ÷A6sSîy­+üÄо›=x &ToIÊÞoÙÃ˳ŠÜ¬#JKÀÔWƏ@v† ­kÀ ÎLÔÂèÑs'˜¢…º, Ð*~´„4ÌRzŠ©EâÌ”­‚¢^,ó|éQC“Œ)à3[—è Ñ˜Gn™64ê~@P ŒÈºU ¬<^C§¬ô©†Vñê:H«{ +^­¢£í†Ls´ºgÇ*µüä¬ zñÓdü|:Ï-Š“G=/þåë¯~ºÅßr÷ÛóÑÂþûìòŸV=¶š ¦,wN§‹ÙuçÇÞ¸÷ºœvžM`´ßòcÇýz֍†¯§½Ûëaß7}e)ý ób1tN:ªó|Þ}°Òø»Žíñ·õX ±ö™¥ÖŽQ¯m2ñ3v•<_WøËäzTÎæë9µœ:بҴ7ÿ­´jñøuImýÌÕàu8þ2-‡³òÁw®'·¢*±?ÁÄ N—º3u¾Bgp¸ÿ+àîûi¿©Îç§S»¾G%¢8^ÚmuqöÒ¶L/zó 7¸çÛ©Ï;´5ó#zÏ9„ýèâê +üŸÿïæïùòÊ"u/·ŸñîÿÁrþI; ÂûUGUÞ¾Óð?ö|Õí9\¼ëà›eÖr=d:ô_ ØƒŽO5 ¶#ÁŸðO|Îá¬ÛîßñV§áüT¾£ÖQýªV¾Âaj{gnoÁ†4ö›„8B‘[‘V:Z$kiñ ¦¶p¿ÙY|9o'ìë¯üe¨mM¦ÝòW(±ä7¸4…Èh%Šñ|1}[NgýëayiåÜ?vÎ-aO~¸º*ßØw`Ý@ (‰u/)”gJ僓"£²–`>&ÈnDiÌÊèI–Ob$¼»í©R£0jÚ(¼ÐªH8ŽßUnÅYºg©ÎßCì¦Ü@éOº?±àbüéD—{»€Lªò‰J”@õ[ӝwp)¦ÈRw¦‚‚}ë—NzÔKGšví4^;Zç9œ|"ÂÝÂ1$¤P‡Ë ;;ÕÚu“÷ºù,˦µ´ž‰&úó¿Y¹ÍƒhyÇ1Ë©6 ²4^Ž1!JË´ ×jwDaåÑ®*’// "i +sRH'›Ej¤íæV¡NXì¹ù8äù° C9»žNnŽ“OZÚæ¼Ð-æö5­7½ÿÅ?p5,o‡ãY9ú°XËjÆnçÁ_ÇÃþdP6¼|Ñ ã†2x‰Ô¢ÀÝÐ\&~ðäÙå?_؟ÿØYжÙyçhÂmOø#b-rU<¿ÌÆ{/`Ë™s`?ÚyÂ5仢ðø£òÖîäÙ³qþöso: 5Ž+½(G=ؘ¯&•ßè=k°rïê1óÏk'ìÕ§Dóð×"}nÕã î²ZgV&Ã& +cRÁô ú¨7×/Ø´áLžåûm·Ïh_t»×`C¶öõG A|~Õt8x½I"•4ùçx~‹´Ð´gnFÄ@)s¸ðÇÃ'W³yƒíÓ&$dûÛ-7¬`•Ê<=Ö#C¶GÆg92$ú5?ˑqœ ÍU1(T.ë +•'ÉæRå®l÷1f;È¥òòí"út‹È_1w/א¹›¬­#š•¶éÿâA/û×¥å,cz‹ßÿ£GÂÛZ†Z úûWëó +å¾?MÞ}}²ºþ—RÙ>:ååh<¨Z“.G ¯@a@R(o{ýïÖ°áFW¡|ˆ ~Ö¹žñu ‹Yùüåù)õX¤¤’ Á]@qç‡_o{–©ž–W“iÙùÙjà¤) Oõ^Ïú×Pš®ÿmùð}æϦ“ÛÎËëÞàã1âêæÙ5·Ø3«þlêx+›ï®'ÓßSfSÇ 7}Smô¶œÎ«Üð¶7dþØ2÷–¹{æþwË[Çvý þ±µbN§bÅ9ý(ž¶Ú!‹ÎÚ¢:Xô‡ñ ª?º½éóÞ¨´;Ð ãùåîýþöïÏ{³Y9½±{¬ÿã;¤À/¿éª?|ýÕó~• 5é÷ÿ Ÿlàïzv³3æú +_ß¾xrÚy1™ó+’TÀ-Ÿø@j„Î;¤¹ró'åè’Û§2KÑ ”ÛÐpúû¹¥Yáî@ë +i”KÒ#…ÎÞ÷BûÍ5–°=$q{™.¥nËöwՉjû{¯­RÞãGDZØáÂP³¼È0ÈCfRh,~™iŸe“æ’-(ÝF¸8l‡õOpÁ“?©¢sú'mûtêîCÓRã+Ü쀡ÝÖ×,cIàÎ^ô€aØ¥Ç,-µžüIæ³J£‰Ìlk…“žæ™K4Ná–ã+îl¥…=ùS‘TPÂã–Ԙ吤)v67©ñ Ë+áç PB/…ý×âLbœŽJÃuÅ0-™P.±Â¢× +Líº-RŒ=ÊNá4ÐMè÷éŸLpj#”ï•y®=2Ÿ£Q(ø./$,#“@F…tTaîáJãÜOaè´]÷ʅÜçTæ4ƒŽ®b81vZ+ ¤ —ƒ¤Üj*•»%o|¾wFT´tKLÁ«H'0â:™”™N…3²Y\®¸Nât»Ò…rÛF´|¤£¦Gip^ra1f:ìªTÁµ9°Š ¤ü`•¹Ë™2™4¸¤¤«äqaç4LG¦Ã7R.b5]»“Ô¸™—®Æ‹>\ÅØ_ô3aÏdv/× »¬³Üͅ Yåaº5î1)Í£"•ké`E’cß´É º›aaf®sœI—®v.… -L]ÃÂI‘v«ú&eØnyfÒÉÈT³ 5rwS&MÔ¡ ;yˆ_ØÝ䘀Ñ؉DéB»Ü¼¸“‹|'på‹0Y˜^ê_jQk¨¦î!¯·3h· îKm$"”•ÐžP)í ÜÀXÀoÖ¯‘ØËP„ßm…[ÅRbй ‚\r•ß l\;Aп0µº0{bIP`àl·ÄÜ%ÿE¼Šø Ïpãí–Ó:l7Ë«#Ž.“ ® ‘@±c\$Eš`´F×N_–ðz&·È`èEÄ^„]Ž˜ºî"Ø®î€,DÏ)]/™½H¢e‘Äx†—Ì&p;m”p†8¦ á°¦*GˆÂi‘"•2‡ýi7¹–Èøíi¬Ý¡ŸÑšIá”Z†qZÒÂzÎqgDT³ì\ãÆ´h•[Øv@¸XÒÜUÀHY‹†•¦ÂÀù)”ÆœEÜT¹©´ÔB1ÀßmAË÷ +dø|ØÑ  *‡åpØÁ$ç^¸Î ˜hxídäˆÎåñ1ôó# Wé°xsè0îêÔD$M3Ç s¼sºœ–ysÌú9GËx²€û[J˜7Qà³J˜#Pu!rÇñ•=ÿpMyÑ4T˜[;c°ˆÂñ’ÂVxbå2`N¥r»#Ó bÎub?ãé’ —¢3۟;•ƒ Ï­ˆY*+±áì¥Ú²y<\•Ý˜ dw¯«N-¿ÐÄÒìÁÒE U씹$D‹Þ‘Ùî +‰ÕRÇ”8øˆõ;Ön´ˆÌÂ9ÐXg™cž™=ÌR·K3û6µò$ò0I=´é—ä#2jÚjÞ-„Rü:$“Gb~½Chù +²?on ´e+ß°òð³iÿz8(Ë禉à§×ˆìåľ`º*ßp-¢'“ÑÀEÑlEÅM²õAí ^w-ýS›®X~η¥ãñÛ'ÓÞb6_\EFtž¿n¨˜¹8rtLJãBš¦Èá­æUävñ¹à8íDÍâô°ø$¬êHÒH íXryð–' Û0VµÂþOB#ˆ,x› ÇEjT†–±ªžÚö ÆP=Ëâ\÷õjùƒÇ›áf!‹X±åç(º<>$Y†ø¤=Óñ°ÔüÿŠTÿ— ¼Ìʏ`S…‰?$™ñòunùá–ȁQå²ÿî -3Çñê,wìÕKƝêV´Éü —VŽKw°µ|\ZÕyµ´Šaê„,;ûN™É¨cËiæÎ`”\²À¿ìѕbÈ~~0Ê«Û9ÿŸK¢Q€ãÀþ¬\›Â]ý ®?+Èg©W¹¨GËXÖHPς¥-cMp¿rX¨Z¢ ¤aªí¿a þ­¼¼êM/ã藸eùš’@IŊý¢"¦Š%} ˜öI2²€à†A±ÊË Ò!å¥ã„6 ²Hj³CUx,YR¥Ê[JÖ*ÓÆÔ(Ó®'nZ ˜^鱸΅ԊNä°H—Š»b÷jærZ”Ì ½Ó‰§îRwÊõ¬öDâêÍÂ6“–\h2s‚i–zá‘ÒF#1—è“aÉ Â÷ü4ØßØÊÖì¡óál^µE®ZÎ7|]W©f%¹ä됏÷u|IѪMÑõhÏû‘Dß¡¨þÅõ¾7š_~ÿO;Œ‹É[w5Þ«Þåyi[”'öS€–¿Î/Ë)Ô4ºxøåÇóŸ&ƒrÍÏßw¾ýõf4¶ N삛/s¾ëñÁÃé´÷YÑ|¤·Dí¬ h¥®rì[‘‹Ÿ~†æáÎÊoÿßñìâmo:û>ªy·}Û-¸1ü0[Ó‚©|;ߛYõëѓj<—»Pi4±+~°™¨éb€—ÃñÀvXì2H»f^–óŸp4; 4nþ1ŇEl&Ên¤µ±;íŒ]fúÎBs¦ðÇ·»³h{ ÆÙ· +âäæØß']¢œõÀÓ g¨Ý‡»¯Ôϱo^ÂÍ ‡ÕŸûµ•gWï`}'ŸÁ Ü÷fîµÝ<Ï8Vhí°ß Þ¸Ã¼û–Á½[GfõÈ××;qnzc;1Iºupïw×û’ëƒT[Gõën è@FÅqjkÇs9™[ùâ¼¼š?›­:»ÓðV:QyäËÉbÚ/O!|÷0d {ÄD?nÊyo`…¬Ð™âƒ;óÿ ¼¥d§5µFGžŽÊrkñç9eçžM'·§eυˆ×ûË{2‡0þƒøŸO†ã9èÛ‹Q9­,øAŒùÛ?Rü«ÜÿÄBàcoä‚«à—“¾#m“OŠç_ðñ!;'ðOèŋrôjòÂuÀõèùd6„Îãϒ;•ìþXfOg§óËIo:xT^õ£ªRL“AmDÕeJ*>#n{ƒA ™{Ñ –\¯Âf·“ù2¬7ÉˆÛ n‡]âÛ <ñ¡¹®O;óIçEo6/§ÃßÊe¬ŸÚã™VTçÍxÒ3YÌ;¯§“Åíæ¶ÃÙdԛ—Kˆ€¥týJë¢sÛ»-§Ùðf1 +)ßaÿB“ž§`Çv|B=—Qƒù´7žÝöì†ë¿·ý,>‡‘Zæk±u¤íÝb綯§%ïꭍ§lJM²®©ˆû°µm܇­CDªrÅMÉòzÖ¿íÍ^r‰ÊT>Ÿ–³rú¶ì€y»óÃ`8ï]GÃ9-äoW÷*>dž]«-n;G谍çxC‡ xÁåìš×"®ˆÎ‹Ò®£E´8TRyäÙb~k䖇tX1«<ï_/z¯ËÎóÉm´ª­ð–¬ð¶çåtv["“|b×Ú•Jx<šL¦?÷ÆÃÙµ%>à¡+W"ݎ $×ç£Þ¸<+G£~W˜8vý#Վ³órޛ}s¨ˆ”A Óî/5¹­ôP``Õî(NQî©`I3‹P턥–’Yav¤$œr ά§ãAùë˲?>ôx8m{.” 3¶î9҇N4#Ú{žÃê4g™Øqš R3Ë1J:W̪´¶.x5qe¡»I7‰dÅ7Ÿ>^ŒFÄõ|^ý•8ªÌÒlƒy:9ÑiýIVÛöNá ¨møì¶×‡Ž6?îõËP9gSsX€+­óµ]ùyX¾³Ô´ììXa¶7ã­ºuíŽÚÆA­¨2ç†^îBKTê«+3żÌÛï,zÀ¬;çå[!¬²’úò·l{ i][8Ûάê>gÚoÞG•sP­m h#‘pV A©\O®?O¬p6ÿ9¶Îi“gë"^YA'òâ¥ÕÎ@Èýq2ØÆÑ­º2ŽËÎ Stg5«¯®õ܊¼µ|ߋ'•uýlÕøGž¼'£‰=€^”·‹Ñ¬¢è¸^Xý¼7u°fÏ=†¤jË/*â6­ëJÛn.ËÁóéäj8*ÿR¾ßˆÚCt¶ªhUšýíÚjä«(ƒØ]iýrqiëã‰=Ž_‡ O|íC6åÒ¹’mzsnÏmRœŸ>¢cíï?–ƒáâ&’íÿq°,:V›Ý¤lT9¨¾Àj« úi¼ŒãHg^"xQ‘VÚ>ó«çåÚµViö*,²X†Á6N¡yð³^N—…—JÛgËÑvb‰ÎÏ_6 ´ÞF.‡sGz¹ÆÛ Vm·†b®ÑŽ$ó—i&bÃÄxÄÌÎpŒ!˜ƒje½š¥hý XxüsrÙ½µŠæÔ*œË[i¯îF[šÍÞ o/í@ß,1‰åvÓªU–ÐÅ閦ýÉh‹%ù²;4=y½Í(þo“˧ã«I'k·Qc1lO¬¦6Ûá0ÁfW‹qÓªq¼WΖêÇÄP¯.c³­ÚGÿ&–µ¾=›XÝuÐyüìɋ‡ªèü¯oŸ¾|Ö2Õىü£Lý¿¾Û¢ÞX©0–ëÄQÛºŠ×ª®9­ú7ï7ièQËÉüz«†îÄÕº=³į́(&;pöJûZ6ZA¿˜•&}4„Ö+öéÉXµÍB&8çŸ-GÏË)”†‹ùþíë •}†Êq.~`cĀ{êŒI§î) oXyªú.g4jü2÷ØoÛ'@ÁSmÅ2îmos=y÷çá`Õ:V,¿û¶7æst» &ª±xWªûöKýüÑã Za6 L34}5íÝÞnk) %zNƒh·¦ؖM‡;´uAwÍö9jû¸7›ÿ­¼O#›†å¬cAÇ®»QÔòÙ¼´¤¿.ǝËrxÓyy‹qtÓqÇþXN;ñD<²\j³Ž}Ëɣɜß.X|WŽÅK‹Ü¾`Vv~ˆQÿ¡cç_;Ïìö÷ÿ„Ýá8~IÇÎ.Âàõ7vžŸ,斏¾žönn:ïìÓ¿u;§ÝÎÓñ#Ô÷m¯!›SMo~ÿ?õ;v8àÿ¶W¯ÿ¯Ñ|øº¤^ÚÍ~{Wöß`וÅø²|cÏ6«».¦nIØ×÷§ÃÛml³2/¶È·a91ðát“ +I­_”¯!r£2QéÆǐ·7µQI¢¦Ï-_ùÿ»û®ìÖufÍ÷³–æ°%Ëʁ¤rŽT–eåd+˒­|ÿû¿ô zýÒéÑô03ERTØ}{õÚgùH"ˆ +…BU¡> ¯ì'1E‡Õ¿Å2¬@lfDUukKœ{"iwޖÛ!Û.*] æTüžè=.¨vÞ·›¶h™Ö–·¿Û)„§ƒ¥î_¿ërñPâ8½ÒófÌ­›ï¨ »Õ\ éö秠"”[Àë„Ì‹×wF%­Võ¡°_ôÈø¿¶‡uòšÀ¼ –Îó6 é]qeG}~Ÿ´g!PîwŽ–ÔpWlj˜Òø ²)äˆ\ Ïm\æM·bOak¹væa0:1Ù²î+ϦóYMêå=±ÔV#o±÷^:žÜðY¯È (o·¹ÊT°+þPÙÀS¾Qð4–ÚÓj±bíûۄ@ý*$d™pª„Œv•àڅü¸UM™áR¡ÓÃv2>ëa~¸Oq‹žrGE*ᢧ7ðÅrÂ4ÁsU´àº ï^­ÖæÅ@¤B`|›DœIrMOKk:ÅU‘KAY ªI©ë?âuó8GNdC~—·§)ž5x5 €\æeãëü3ù¯6GjJ´ºñØ&Ó@Ō7E{ÚI†v/GO¥¸Ö¨`÷¿ßTïCóÌf`¡ŒÕ¹iâ7+ß}ºóÊ>ƒØDmÏoQ–’ò^s:C-V)ÖGe<áäŠñ‚õT>ï÷¤ç°Gè©;V1ô­ávÄwl—¡bOÆٟ¯àòW[Èhm&cj5võÞfŽô¾ãÍl´ìŽKÆrüpžú2$Qö¿ân÷ †Óßé¥ ÓÇC‡%¶íŽñc‘p2ñPI{`JNÉe®ZŠ‡Ýózj‰NÓ‡qyA«4낾tæ5èëeOéïϤ»g·%~¶¥c"_?}Y£Þ—s&íÖ·“ßcI/°ÂD²6½/°ðµªýD#åhÉSå— ~ÆÃëÌgÁÞðYU(eÃŽä&l݅FÓ¢èH`áF0ëaª%BŽxϵÀ_qü‚ÖÍV4í2àÏ,‰ñY+t#êõÀ«Ocæü@2è%ôsáÔáKP‡©å½D}ÅÇqæ+$ÃՋÈP¯ÁæÀ;ýÿN¡"™ï4S¼D·£Ô® +ZҏòŸšþÉt6‡WÕ,I‘áºË”¢ª\ÏÒmãZNuu~5'ëô»=}™á0ý”e¢ESGüBõ2Ü/œ*aêͺŸàW„*7{+ ƒ@¯9Æ ú…žñ ’¡+'ù}Æw$¿<7",3(ö±!sž”0L£ԉß4ªCÚӖÁ6‘µm£›ÃçùéÖ)õï\46ì˜s½yHPUè+ÃkE2âéAñíý&Ch³ ÔԈ>3ÓÀnÞpmCÒÂÖFsZÈM"PAÄôº|EL€¥8Ìô†Õˆ ä崀pÞò¤„} 6±4;Ô¹yK‘‘*Êg­€¯R¿‰4¶4O˜!]ò´+žª§‘H´O 7y…QoÀäeZª•×„—#Ã2éNí2ª€Gqš‘V0 B[Ӓh´Š¿™¸qÞþłà¯KÄ/X•—¥Ì¨Ü f´Ç6ŸýŒYa×2ÀNJ¯ãí—æ2µ ãät½7Pk&ÏvñœÞåÝ(¾cm+¸Q–ôÒnŽQ¶æ{ÞüÁ-¦?{‰·Œ¦@êë\륋Å}’ߥäpž¨ý¦+ñúà0ÎØ~AƊ\–ආí£Ì–+@=uêÌ}à·väÔÖp&½6ÂÎsYñäd™ž[ÈϔkÎŽ1€ mõ}ø+¼îò-àCÇ:°ÉlRu€ +:nðš}ë,×>°avà xzœG=‚›¢Û="d@ÝêÝìA«örØž÷`ÍyFþã£Ç¡ùº¦Í±N!‰,g!«èª„Þ e>ß¡y3HÒþ‚CƒœxƍË}@Ç£˜ôó$Y÷-Éêëç ™àX!‹û$XÅwôG½EG:ÿí‹8Gó?ñ›ƒÝڔ‰J³ÄLSqcä|Š¥Q¯×Â΃lrã]öE>gÜòš:¯¤³ë×9˜gÕ0 «LÁ'Û)»ÓMkÈý&¬·$ㅍˆj¢¾‰[Á»Ë= ƒOk± +oj´›Ü°Ì¿Öî+A¢·~I}}hƒ ÑÃ!#ŸÐaG1¹.[÷ó¾p3½ Bd\-÷Œ{,8ûÙ`p¨ +ݛ̄É;Ý|™Á§å%CþžGÄkàÇO —Mïì2~ß´THVßãûóF7õÜ}MTßê-èê3Úß.Z"¶Ì·>OÞ±ÒαÉ+óƒ2i@FŠú㤱Ìć¯& BËí¢Âb¡t,SØ"Êó*¯ì’¹¤ûœÄp[ó¨ŒC„ŠvöAýw¬à)i‹t…\Æb¶¹ ºÚÀ±²Í~ÁrUËd†fíì®+ž ~ãíªÕü²ÖW`A |#qçéê‹JΞ.,#‘ÐÐZ4ZKF©¢ìLԖûP3 oÂ@/‰‚i é˙ìââŸÜL–šÆ¼–Ài ¼Ðí"µ:®¼é…½l1rŸBõ Bª*¢ ¼z«Z°˜3Ó؅gSÅ *ÄýÚ·Œ¹û~J»øŒÕБâÛ,=û Ø)4éÒ c K§r/Kí[mÔA"¨5«ñç#ÜfUîݙÜ8j8¨·þËÙ"Á·¦ÿ“^ûT0e©ï“»„}±Òt°Wÿ +˜ÈÃ5hINœ½•Ð²Aú»Bô^Z©*ïêÜbÈpE}a9'•ÉX,!¨{frjÅ>nS  +´aÛOÙ4}×K<kÒùŸU?éiu‰ªå}™¨5¬™ìköӗ\ã³²^àô¤ j‰8Óù~É-*tu¸.Õ|à¯g†/†nzX–Üøõ¶tÁd6q&m[,_×pÞ¬Ž]h¡¯ñÍ&šª,«µ#iµxüõŽ×n˜Ä[úӉ%]üÔzO¥L-éi8ìÜJŒZ,ßφé:Ø%ŋËߋEpe¬–­gKdÒݜEªs‚rkèsÛÿàŠ0‹´ TËâ{›†*¢ŠBóyâyÁ·ehEÚ¶=¨Iž¨{2ŸÙŸ“ÅË}SÊF(H”ÉñrkKù‹²IbÞN6õ–jÅXƒ–%jOå í“z_#ßóÌFZ,0àp{‡6eDÆ-=0Q‹^o$³Ï…Ó›’‡3é±¼hӋúh›Zéô ßîJâ7šßJ ©“¼Êvº ”NΛJ,ÆCÉß,§Û6ÅöÀjèxÂ÷9{K/#'ٛŸ "–¾Æ°ÝÄö«bÉ ´˜°0úåƒk>hV,Ï£hÄ뒒’À:A6¾@ ٓÃô¢z,R*ƒnl-k©Äç2“Š/k9}Ï'ÎuBTŠ.’°|Ç[ü8NŸxÍzùE¶ç˸wòB¤2$a¶ !²ôþ%ê®l_)ûk ¬%œÝ”¬Q_6ß÷B]v¨†žýG¸uP2òmˆ·3¯ò¨·pN;j3{<øö½æYîàOëËü¦è-!vÞîD)ùCÁÆ + gÜ8¿æƒÃnÚ §9’«œÓ¹Áñ˜¶M2dجm‰ìî“?•¨çRhª:°¢­{Éu7ç~\É֛ÆøƒØâ‡7óÇÏQö5£-Æ/ƒSz±=8$ä6ÖÑ¥n:u2©EÌu9>}0&\€d é•Ñw¾WáY¥³Ñ×9°;^*"³-çÖDÆ@NuÞO(iõö!ýµœhñísµr§C‹ƒ8øß^¡‰$² +Ê@“)¡¡ýÖеIkÅh<Ø¥Ö¦\´ æcQHgŠ¤Ûñð&c¦š5ÐŵÕ& ˜ËûÔQ LôØ pºu)bªš»Ð}Quçê%¦Í]¦Tf¸qzÂônâ¾Î’Lø³ÇÜ ·gL{+…7Ž¡yÐðz]3óIG÷?´y›Î/Tç9áŸì–¼E©ß^uœFà -ÎóƒXo-i'ï 6Rƒ$Ç»Çu`‰×3™ø2¾A"pnÌ®‹±9LjÐK(1jÀH —u[ŒÍÒò+PrzÖ ~»C˜Š^‘õéwžt¯g3o«ùÙòûb©\ê«?ÓA/LW]ƒt±Ö±ûÙâ×B™±Œ‡>›ÀõU­Ð lû)Pú½5X†»Dmãi Tò¸?š;ºt±àúLÔ_’;)íÊ$¼÷|áù”KEÒKW¶?VP D÷¸I–}&œ™ÒBÉê*VM1ŠÖiGÚçx7X#qŸ.’@K>S¾úlÎîô;ç‚2ÁÙlÚcË{rcÇÙN¯ó Ææ”äâT‘·Áäœ}ž¿`fˆ9Oö_[Ã}1æØiŒFØðö6ú¦ ŠÀïdydU ÊñƒVE^>ˆ Þ°kgÀÃî+PqÕ³ði;Ñhúˆ}P ëøw tþ§-sBNÚ`ÍÚaÇ~Ûñ©ˆ_Ic¸‘¶¬œÓ°­[L&ü¶<ÃJdòÍA÷™¢M?ØXÉi¢RÌÁýÜe2ƒ´©ªkż··ßi'ù L³ÀvE:(üԏ½+Q~ämVúß´²)e>d+ϘO¡-9õš=ɲټòýæ«VQ ›òªÀ(gŒ@ªõ=ÒÞõ/“î¶Ë΁ÕÀ¶L4ÒG‹w_Ç"Àƒ6ï+Œ ²µX"¡IpI®º/HÜhߓWrÿÁô#W‡«šúŠÏìéü&Õ™QýxɘŠIâ½gÛrýÙ|5±‚nª‡œ4H§&¤{ОÈÍP¤› ¦ô(ü‚rŠ8ÝÏÄÓÈñèۖøiß3#Ó''ÅGº ]`¼ҕ¡|%Wó;Í èÍUeCyC+Y¶À´ÚÀ\jÉi4jkvú@“ìëËö4,úŽA¢ñ5=Á&þ·¨†Åðè ?ï9B”ИÁ”øÝÜùÇ¢b¼üSSb¶ÌNªµ=,Ǔ9<é`K7Ưƒ—y %'•Ý¹ú]oŽ'ǔwœŸéÿÏÿþ¿þ‡r²$ýÚqzXö"Àeþwý^ÎÇGZòÖªÿc^>oN«Ýfž¸8Œé²Õ! {é¢è&?HºâB™‡šPŽ%ÿ'élIkÔ3òYc­‰sZËvkìë䂟w¸t±ªì'ô äŠ5NI`Ue×¹—Zd ý¢(û”°FjÞ/­É>6kí…ÀÑڈ ©µ;>­uê¨kÍoÝ­ÖìÊþ8\¥€ÖÍj î£K_EôݱÊ(ŠåF…lŸ2™ç‡ä™´–Kít1¯­3OÓk‡óèÉF,Ôâd;9¯ÅÇe8øù^¤{éØW(†ûI󏡞úÌoÒddãÀêúõhSæ*Mõ†Î¡¸ìŸq×Økm_ß9Ø%ÐÃᬻYךrGüÚ¥;Ù½r‹îÌáhyá‡î渖t˜êҞ›úî¢Ôpž:ú3¿ Âè걙G©pŒ?|—~@Ú¦ùJËL½þ¬«zY€¯Ù x·›†dèޗŽ‡CèØ;|†Þ+˜Ó]7ñQÍâîÎWÉ&Iõs™ÌÉR…f ñíÔr„…T'‡Óږ¦ú–4¿4w›’ÕãËÀ›ä¨ÂÈ»€p.Zõý¶¤©ºÍkhZ)KQ=œGA“å5¬IQE 9 Ët×û¢÷‡ªÝ,ÓHV%ûªË삯•U¹†¨2"ÂXöe[’¥j,”Üe97S¢©šET0Bº¶ëÕs2‚7Ýۋ¡ ê£4Õw£Q4´î†/»ATÁ¬šBªŸ‡ÏÖ¤†¨"I TpèiΖNIª{ãM–ªÏ¹¨¥¨2‡CXk>ƒÖ£Twþw߀ã ªGc´‹ËPõ|™ÉyQ…ûoâîºÍŸÖpè§&IU—{^öÞsYŠ*–)V“RT4´¯¿'&Ídwwˆe¶†4Õ¬>b(Í¿š’T³U QEÊæ‚É9ƒ]ëø¢¨’ë ŸjXg>ã6ÄaËÕÜðdz·ì0@Õ·ã¨2ª+åß>éîví&‘û<GOšª»—ÄJ?UŸ4Õ¼îì/u§~8=…„)ª•Í<'KµèØïl2TûV¬^ڟET!ŠpÑ5(e21­$ÕF~•—¥Z/{#9ªi¬… ŒdwKö—Ælh IRm "GYª-Ó|¸QEdhÂe¬m%e¨’ÖvÜHIRíÙYªßºF)I-kRÝýðbŸã‘Ušê[sµ¾¾Ù$©¡ˆ*E†&¼ÇLK9ªelD–ÒÒT3M\×9UóRT‡7; ‰Ó„'.³hòXÒEQëNYÁäÑgW +ƒTmT+Ó~@vâ€j䀨Âe%l n»6šê:`Q}]ôuÔòN$»x^¨(jùÖÏBªöËUö f¯è]¡w@8u3™$¿՘‰´‰ô¢qf¥Õ“KL…JqnøßúªQÕ ŒGØûª‹ts9@µ QÕÉÊM5Xuˆúú½kŠj¬Y* 9üŠ‚ï¯-Zhqõžâ N?Z"ø;‘yz6h]³ŸôS·Lž¨gŽž"-pQà$¢¼’y½ûŽ‘á +I=½°z¬wè)§ìyÓ³ÃJµ˜[T€}šÀJ³¢Wîi ++kÛ~¹§(±2Í×ä + ±zj}’yÚ·aõ֋Vî©kÄË&†i¿6¹§lÐ ¹X¦]ˆcCï0 óúð€;,EÌÓ± Œˆ²<Ó&/xÒ0Èȼ>©ãŪ® ótºÅßÖÄJæé šƒx÷»h.àü6BáSOú)q|×ͅ7ô”0FM9áӄ֑‹G¦](Bâ´Ñ†Ý…oêuô4e·Ôø>šiÖ°&·Ç7JQœÛVƒê) ¤ožDZ(Èé¿;ç<bøkÜy2¦2˜¯›îeºt ;ÀoX&•tLS©¤³håûw£× lŽ‹"È#ýâ2"oi<@ºB}N:Ëþ_#æŒtÎpŽô®\„YwöŹŠLÌ`.éÈ£¿|(ýƒŽ0FÞíԚý ¡Æ'ìù‚®ÐVšª»Û‘§ªË̜²T‘\!žÒçSV/p…ÆrTG +T³ö€ÐN› /aä°T]"&Cß ÄPÍn֙øTÝu=G®7çîàuWHù2T½/Ð7ø¦êîòƕ6õ&ÿ²T‘o Kú3)ªhõtwç²Ý wµ#O²†VƐg§‰»[½ڗ ¦>ÑâTY.DÙi׋º?Jêʙߩr”Þ J^žêd‚`¼Iœ9—ÜØOqÁdÜQz†a.7÷㸭‰ÛØ?}¾OOPµ;A°Ìú ë¨ñ"vÑwÃ6šêõ8šA<úÏë+ú‡´Í·ŽA¥B«´( Ýà *% +VEÙæ;øjx¥ÿŒ;PÕBluÞŖ+ +€i ϓî¥×¬SôˆV@õÎ#ÚÛä/ñc6vÔ,.Zôú`Lª§ þ€:íóø+‘Ó$rå;/k‹hþy½©Y M§—ÛU_Ò¸¹—š*øÎ#UpS\@¶‡'«Q™ëвQÉx΀Pùà›ùÂè`̔>á–äwæ =<~œŽ`֛+ž‘Œë<¢ìÇ^…”¢Eú:¿TNvY·ˆu£ ¿nœì~Ñ ý†C4Ó©Õó§ œì2ÎùÕX”KÔéTSƒ?WP)+L‰áTDáZ0åz t§&'ÐwDT~ +®X«QV¡ÉUÉ¥ì±GƒD@¦ ”‹^¨î’x••QI +q=0T…³PÁß$d o<·…Kdb;ÙØ΅@sJT’šÙ±àûIdf»bÍWÉø#ªžÖÐW,m†Ó»â16ÎN£Z„+K„¼•,d_Q´. + ¨[—Æ]‘³’˜7±fÄü ¸ïŠh5dö=ï cC{]+\%»„È(I<” ÷£ª H‘®€÷ñF´ò CiÑâ'cæB W¾«ëcæ2všpñ3Ò/FÞ¦.ø”¿™~®÷Zrö‰Ãúû(n/Zþ¤¶WՆ·`mQZ©-Ïñ‹Ò‚ÚÔÎB% çþ¨È‘3›dkì^¯Èrgsø;ì¨"ëSúeÕ"ÐзTd¿i!äòÓ¤ks<°¬òvi[À|évvO۞èPvšÐ3»{ù “Ù5RÜ)”åæÌ@8o2L‘†¾ôã9í\Y¤ÝÀoÁíMÚM>˜Òi>C»µ.·¾UÛ÷’µ)j7a\àšvkmïÔnÂé9?®]k¸¯/VJwiË„Šk͑Žr ŠÔ¨“ëÍq*/Žœ²ÁuöGÖNjÅ1h²q‹#G&hºÑɐI4L–ôO¢©Í_=©Y\j‡œ}&ï² +¸IMÏ+[xÀ—¸3È-±G€j{`ž‹&šä*²»˜æU;šŒê”u™À€¶Ô»³2jºCºZ²N‘ŠŒ=Q›$łhóL´RÉN×.Z¦.’1TÄ¡eWª®’'§mû’`ß6É Ó)ÇçIm6¬Jr€U6·lÿÀÚT˲ +¦uu†[ì¹DÇN—èwÕ1L™i?9*eúV -ÀI†Šf)F“å'‘Þñ§Ç<Ô&3””jzn/ZùÊnZãaúev&3}|iDßI–yœO˧‘-ÝçSÆòÁm¢§Àù”±|€Ìsà|ÊX>ºx7œOËÉ<׌åÓ\@ï„ó)cù4ð˜gÀù$¨VEÐÅgÀù”Ë!2πó)cù„ŽÇp¾K ËÇÙiWá|ÂhžD͕Ì{y0Òþ¦6ɈA³®åŠ—·ª@[ë@^èIߝxÛO cq›n +¿oÊ_WØ)짅©ûYu ó¹Le8e + 4U)B…Ú®ey]í!mܪñ©î¡”€ŠæjÆ•«â6É¢" ðJ K¡MbðR½ ¿§Ní H.ÚH{Ò÷Á¸*b¿\6¿„Ñr)&äs6ø¨4¸ùpx tîãE¶sütž«°;aÂå-¡DN !ìîH3 »“ ÉH¸Q×`w÷䗈U'àBŠ ß½ê¥Àªk ÜV›G1!¶¢Q„Y˜Ú{›þšgµž1›Ô'‹{높©š7^5,¦P¢RE †- Q7vš(Ö¦"֍`›0¢’…Œ!Eƽ›^³¬ÂRw F£<Y<šÿtÍƸS88ß xNÞ¬x“PSháǸä1rsYŽ¼™-¼Ï*eÞWj"̨òªÈ¼W)¼r‚æ&L¡(ê©^"¦ k»‚ð¹¥a;Õvýƒ[j“ßû¸‡iÄó˜æziÂx1uॠ‰j™ã y L•™›“…‹æˆ‘ºŸÇåI™ë”-ÀY˜2 ӛb_Šg@)`õ$<,ëÒî¸×NûۘûÜħ4´<«TÏ[e¨ØErÒý¬í ä@ÂýÔÈÁuŒžL›4bœtþÖèR›X‘R¹¬)°JUôæzJ¼xžB›.N‰œÄÑ‹zFôæ˜ñpº˜K4镣7üBe¯¢ðHôFø)<½s›RFÔãánŽÞh¤ ‹…óÃцãí§‹¢ê·aÕGoä÷ VP ¤¸—µûB†´óҐÞ‘!}%W]!]T‘:¯¹Ž V_¯©‚«~¶sŚ>ãà çw™¥+Z¤UááÌ·§á]¬7E•ÉW!~‚d·vÄï+“ !~j­Ê?nÑã2ºîM;8?ùóµø-7“Eé€@aŹòà·+V> ‘/›ôô82É³y8mO™we÷YÈ<¹´ë'#óL†U‹Ì»š ûd­¡oK;–kŽ|*#ãªD©ß‹Ì»LµbŒÐ§"ó4Rg©‚ÚžŒÌÓ¨9Æàqdž`løiƒÏEæIzkrûBÙÖöÀ¸ä]$ªN½Uá*­N©— 6ñ–Ð})ñ–D]Ŧ—2^ª©>áòJEŠyÈê7‹QEBû†æðì4TÑÃG Z.ve3ï¯j7åŽEùÕܾ§â|$?¢ñ|$?RÊ<äMF ïz*IÄÙS`Y/üðh*´q/?ƒdušl*´qÀõÂTO)gK¨Ç/>å¨cT‘Â|Tí⢊‚Z>öª–µëÉïÎË&›Øݺ8çÚqn¼ª4GO‚N^$,Áß®œH¥ävk Ù±®&{>³Z¶Ÿ +’m?$Û~HIÚ@²¸Îþ,¨è9 YXÑãÚÖò,„Ñ©;蚣“Í„Eá(Øó—(Ëfx¸œÃÃ#󑛌”§ Óž ÊC:íz®°›·{÷òcóTPœžjüAy·úžw‚òÄÁûN節òdÂÏå)ÄÓTzp“£‚Žb”‚F|>´úJ˜sqËé÷—vÚÅÁÉw «ÚëU!Užam§+ö‘z˦+>Bù– ®7œNŐÒÉÃP±;Ek ˆÌuÔµ¨M¢ läĂR•Z.8ï:‰Î ‘ (¸F¾¦÷ÁkÖëZ`F•´v¿}¨µC¸Þ*Ÿ®µµ¶Ö ¯[oh-„~z‡ESZ{qèÁœµ6#Û5¿ÑL|J»3‰CtÊ»{wb|N pG£~Ë¿&V»3Môµµ úÍü¡Qûé2»,U,“ôVd¨z_Ø, °ß@ v§õÈSÍf]–ªÈ(àÂÚO…kåªñªè +½Ð¦ùÆQÕ\ÞSo[vrP´®ìn‰ÉR… Aæ3'ö{];[9ªcªY,(´:ÅØÆeáE–ªöãÅ۔ã°Mì§Ëä ¢¡…S׎è£OÌ癪r•—¹¨½‘QTW‰hUTy8×üca¯/LT0ƒ7 +¼n3‰ÖX¥˜óõüÞKãöÝð#ÎÏÇaïí®æu^XäïôŠ+ŸE}‘Ñ%߬«WÔ(%ð\Üg]¯'u·žFæ˜ë±(ÙëõnÛ½uÏgj¨.•ÎKå*ݬw5wð©R¸YO¶‡’û7ð.¼k­¨íáÅipw3^EÆ&“ {½YW²Ño˜7Ø¢äþPÅ*þ¾…š[ùTˆoöݳ¹ Ø'å%ðÃvOöI¡úD6ô3€}RQDÉyó°O +Õ§yˆ) ì“ +ã+$øß ì“Bõ w +Ÿ쓪Jsý0“[}2™ÏöIíóVÏçû¤P}+û¤B2ÑÙvOöIEéù.}R& ~°O +Õw‘¥ú8°Oj§ÄOöIµIsypó£À>©1䖵§û¤ÆP&Õê`ŸDU±-ð`Ÿ2båiÀ¾™v/°O¢*â©Ls=È´›€}R.cÜ>Ø'µèk(Ô÷3}RÐé£ÏöIm¶HdÞ? +ì“Bõ]º¸û¤`l⍕'û¤P}—ëÍÃÀ>)vˆLõgû¤|ċüǁ}R¨>ù”جÇ}ÄàùˆB¦A€Òs€j¢;<¥Ü(µè+µzƒ19ž{‹ŸT›®˜÷ÜâwÅäPǪ«w D•á#iV}É/ê7ɍÐÈñ%›%Ѧ«¸zQ‚¿Ò•{½­›ÛĤŒÀfÝ4±•Út™›¡¬lXå½I²ËšÐerék§Ðe*ˆ]¦ËÄnùPž`Y“½ÿï&ðœT +†(ÏF¥½~óåJʆ»ÿï‘Ρ+¾'}'¦ïG„nJx”í$sýþ¿‡/ÿS„|øò?¾e#ÿŸ*¼”Ò匲Q¾ÿOõöX&^¤zͦÁ©Æˆ=ã±+>)ý tîh¢¢ªü ¥Ó0}ÊŽj¤Œºëjð^¦ïZ¦1sõÚ>ùÌÕð8tcߕ:uIjA>u­â¾1 +v iªË®|¹S­d6Œ`Tÿ|ÙeªhªûJTYmªòž–j…Î&x\ÒÏUΫ@Ì'줠ZdN=çD@eE÷­âÄ1XуS‘®Eàç +¶WoCÚSµ]Eû*^^/Fû~ÏMhßïù•Ý(.z¦¹v¼!¬MÕýȊ¬²µYT)6Þb&ËÍú¯ˆ›²cÃw6•6§€w™²Ýç+}¨ª¬í‹|”;1Íç]îؔpØ6e!·iÖöN…F Ä´>lc Z”ÓGo©è ÇP=zÃ7uSŸøÉ/#MEÅí›ÅÀ&»œà7E…úàýC÷þñÂÒWÿÝ7Å÷þ©Òißû§hªCž?çÞ?†ÌÃ)CšÔ¹¸ßûÇ.krWÿÝÞ/©Ô@QÌF-:åÖ{ÿ4WïŽëÞ?ÕÇ·g?öOÁ—)"VnDûâº+ø\Aîà5´/®»÷~yˆ9W>:Lóz±¥²¢ƒ_’QTÑãhß6—DuÍ[»^‘üÙv¼”q }‘µsã-‚\â‹¥ºÌځ­¦òŠv% Æ)Ð{X*•@ªŽh¯J¼¬]ÃR]"Ó&W¢} þF –ÊùR‘“(ïÝ ¦'¨m­bzªRuD.þC¾çð H¥ao`–=:ß,F ’U‰¥Rg1NŽ"‹‘"~~î6ٙ¥—Îå¸w›r¨IåŸy¯€L{ΩZ Ӟ†»¥@·wZ6)‡dHS6ž©Q¾uq¨þÌ'™‰ÚEk F%û:î´Iñ”Õ¸[nG=å_I‚ô(•Ž‡qÒÓhÁB^‡¡† ø'®µN1L!œ¡ÃU +èÙñ5ˆH`äGüõÀŸ¨ | ¡®¦ÓÁ€Ìý:ƒ,2ïp9äñ€Ö0±¬ +5´èj:ù[Ýݞ +ñ—¢ +ç D\¼Õ¥ºK]M‡†S9ª3<à[².Œr1rǗ¯¹2ϟ‹îõ?l_EÈ<³$ΚÉÞM|˜ø¾ö&CÕû¢¯ý9< …}äÛiB âÑ-O5kµd©ç&ߗˆª†½ /¬u(ÁKFYª‡c3ª•¥ªÚ‚Ä1@x`š€>уaNõf?jÊ Î?¿Rå4½Êõ¾ìd§rµJÏ-}ô !: ‘9ÊDoL?‰[°2çƒüšÅ®|*³3MLo;Jýôµ+ÔÔÞ.ön̈6½®e#)\(Lܒm¾PhÖ ‰[²{eÔôÌ(Ÿ!¤v—+-›µ%ŽÜªˆ;õÓ²‰[²ÃÇw šuSâ–ÍòíúÆ åP›×Ó®oºðð1D¾ê UÝSøø…‡Ê· +’ȹðPÌ«‘ÉÞsᡌJßv(Îå¸ûÂC‰D;Þm‡¼¨{Ñ1 õ:=~á¡òm‡Œõð…‡Ê)Þ"ãöþ …02q¯5gtÝuá¡2لËG/<¼ªžsá¡òF³æ¦{ +ï>o„·'ý؅‡‚Z.,ü{ $—Ê@.Ô¥öÞtᡲ™OGn¿ðP +rÁì.6$ï½ðð*hI=JéÂCå½ëË´„;/<«ðé{Mõ‹ •káº$*zøüú¶C…$òÛ.<|—ÞpE¡Höþ •o;ä6V¼ð'd·Þ£Ó$/il˜‡7»Uª»t_ÝæŽ5ì2ƱL²˜Ä2‹iËVÞ~Ž/ï‚iµ4Á螴Füo}̙j!B²Š‘-ߐA÷bÎÊÜ&šXÂi$¸Êpdúᢴ¼Îq«Ÿ'¸‹«5‡ßÜZ»Ó؂Hà4ÄýV´ú´??‘ZkU—¤°À֍»Ä–+i-ûÐ×ñÞO‹væ 59a…JT[Rx(µ;qØ/؛x¨¤= ʐDÙ>Õw¸m¹Œ‚O­=rÿ1çZç@¯»ôŸ†™NôjHýé{noäÌԅ¦ ãÞ +¿ZÑW86Àb±Ã_ìt’›®èƒ9]ï˜Ó“Ç?ÛÒ1Ql·?±Ü$ßÉ Íý"nÃ~GL;‹kÚözΘrùÙáOU;?@¬*Æmªƒ*5õ¦øC iø4WA_éz§½>N\7cu–ëkxÚ°¡§„ÙdÓp°d0³Þ›ú+i ˜ñÖÒóãt@‚)ùFîÑ¥éËêå†Sª>$iwW‰ñªÄ/Ç°µ:x£M÷[Â÷93!­M˜{u- Cm·O°#2réÃá’%Â|ž­™Þ·mœXé\ÄsP\J÷ò8P"=­xèO›&>ÁíÕô¹?@ëAšÇCú±„ãÛöPu {qXeρ.Û"†`ü£Š†ç]ùÈÜùbšÓ#xÍ…fß¼éÙs[ÉV'{3áõfÔÖ¦à<¹bS-¹q,-‰÷颔.æµu΍Ę{HSl˜ÄÀí¥ð£I×ë9?g¨~:QG\¢é¦€!Ô÷ПÒã[ÎE—ký$ÄÍ©¤Ÿ™ôF7…ó¦Öø0’{¼ ì„RàOϑÓÎK) ë:•¹{µµç ÎofÌA´G½¯©sº—™wÒ/³3™ú,¼äÈC?<ôl&±-yøl3}sž˜VG%²Ü·À²ž,A€~‰[Ö¡*0Ò²é)ü°ûž@…š)µ:֐°2¥€êŽRb$2L] Yu®¢ù(VøþuáSý1NíIG1WÒÙ.Â͘5F^|RʛÁÌÜtáP¨((ò¹’þÏÒíEèä$Ÿ|iŠÑæj0ó'Îu»W ÃÓ¯Êë…E]‚;ü—‚a¿äß¼é5ÔeyxyÇ2\0"Ý:ü*F–¤×YöŸ¢ød¹Äœ«÷ }# ‘þIV¨B§ÏùÂY—á°íÀà‚`yíÇ sÞU¡6P@>ƲÙûá'ׅ§$ (_àjG46ÂRC„cóׄ®žRoÞ+ "ëÒn‚ž78ƒè€rœE)mŒ>I„².}êŸè –ªM®9.ƒÖ[t®²M] u%žçrE„L{†ýÂ.ñހ½a»FõK囷¼Æ +´ø%ª÷ôï@¸˜šYF´;¯Ã­ë|Šêð07Cg°8fWJC¿8Ð: å€òCNÜÖÒ§ ÒÕ®R”ÅûÐN—ÛepÅÞ@cû¨KüxvÐIQýD¨˜9Ì°é¢$Y€m³¹’ó;>í¿•è—–ƒð…áØ$Â.”•Ó°Bg‚1/UËðæpXè¿IÀi/É#sËk¨7„ÍëzYÀ›£F@ø&Î0賆ZÉ'xÃkȲ¹|“ƒƒ] 4ÐP…E½„ùǕsFŸ!Ȫ¼s5ÙU°ÂñÔ¥ÝéH×Í9»¸%9KSñjèø ˆÓ/1aZöãx¶¹Ä±Eê;ō'7· Jƒ;õc`ñÁH(ñazð3A óZÀ‚ÉÀÅéĪ˜"̯Ú"¿°9-wA_W1©ÂPT—×ï +Àœø„A½Æá- –ö5*—Cõ›8Ýõù&jÖM¿fi7Øþg€Dä<ìk9WÒ`ŒqL»õÍ[xÍú7R‚ª¬e gæ F.2z00ŸÒNÂÜO­±3´@)å2¼å€É±ðE€òšsà*l1teA¢#†³ €É`Ì`…lÄ*R0F¤0—¨”Ú"|†óÊÅÊhõ¤ÙUQž76t—ô ¾b¡‡”î×|·\¹íÍË×xˆ–5FTh Ê m`ôã~¬ˆÏ Ê˜å€©ñi-© JوGŸKI^¤?1º8½!µzràaB´Ç*wPµõMMíàgÿ™*o˜ú‹"[‹h#…»ÃvjOùԄ)Ðuqî}MêÓLSAèUtò*À3,΅۩²æL(‚ lÂ&‰b’Ε-E1Iæ·Öžù­{p®*¿V.⊵ފ __7lÀ÷Åu5ô€Öpè§ÆDuÍøì… 27ßø›(r +»„ÝcOm³Äۖ1ðQ­ðw v¢fS¬¿¤ÄS£ŠÆÁ嫬éCïˆ3©êhªÓJF“u‡ÿ1ç!¦u´['I…ÛÉ./€‚íž/ÓD_û²ïÎR-â;/èhŠ^|ÇÈ2¡ÇghÇD#Bñ!îâñá5¬1|p;9>Àæ¬yWš£}WE&PÀ˜õ/ÃË«v–4Uî,DUL@ ¼Ú ïa-Ç­ûØ7¨êª3$ßIs‘eBîÓ¡ûn2LpØ4è MZøøˆãÚÌ02ˆË]‡d ãÞÂI$%ª„’_®³ÞÔ@梎 ÉöXGR»hj1LSߑfЩvD䦧-p²<"ÚpÂ*U £–p£Â~­#ãðW«¿Áý‚­oܶKa’QÉM§ÃQG]6—´²GYZú×^È´lro¦‹Â³WÙ¢¯î·ôèô˜¤Q·*="i%·CT¤¤)Ö1ˆcKšñËô˜¤a¿f9IS]GÉj»*%ü +8Np’6ð‰z7QÐX¶”v}½ŽlIw}Þ*TÉd›¦ÛáE#in²€ëòˆd—î«s_¹» r<éHNwªMf#_²#9{æŽ9¯À[¢Å´»æH.V#®4âuâüE:ç>9ša^“ÁëcKÂdiµrà/ҒínÄ¿"Z¢F2âvLõ>ûCb1µG"n2LS±4ÑuxSò“]¥êœÆò1þ×\%ÎÿZm&è-nB¶¦(Ço×NÝé˜uØIŸÇÙRê³l<:kí¨ÑWìÅ*Ìâ{0ÀÔÚ?ȶÖÚ3U´6slª5D*=fÖGmW„Ë_•#ÍÕ¢¹¸R6ko…^ z5 dÁÜzÞÁ®—‚ô'jÿ;»¦_€s™ˆd×JÞ@:§6Þö¬¸îZæìVè5õ{›‘`*Ñ4„~™Íúúñг™Ì é^¦‹ ¸­WyˆTcÂ;F¸Í,‹¡¢¶êéÍI>½Û+Ɨ<”'ÝÝñ³f<#ß«‰t7¨î%>l›þd¢·úL³&ë]£Ý銷:×G¸UŸì¹r|oãX%‰ ¡ù‹@ hÓyo€¾ cÑJ sËU†w)Fz¥vžŒ‘Φé´ùÙ£m¥Ëq9·iñ¦(2Ñì§T°ŒÓ©y—ï2Ùvª^ﬡ̵öŒüÖ¨7M 6¦å8Zþæ_ƒVç›' †}—|ØPöƒ}!†³°_;b¾z<áJ”CzäP’Ly3cE¼Ÿ±FÏNø»²+Öt»±ùº™ Ñ L¿`o¨®­Îè@©“±ØÝ1±‚úN0yE½ñØeHœ.ƒÅB‚A˜c(ÉQï¬[èBKW"TóÁLW UDÈÃÒn—>p¢ï¦އ ÔfÅà‚Aw]úYàï¸,IPs> +¯Y÷!¦Íôà—I>‰6à¦}ÔqôBñü¸¯æ,†-L57xÀlõf€ õ0Ž•u®l¸Ÿ•wSÐל‰Ë+ ÷=íί…; ÷á@ËÖt'…F¸YÅÏ«¤µËå~*w¤òŸ6Œk­ç`оš-º1WÏG›Ÿ½ÖÖÔÁSã»Ö0^0q­Óû:ðÓüԃJ´¡µûí-øµE%¸éR —§¡N²¦È1âéó¯¿È¦l\¾­&;ýO=D»“=_¡0Ir*ÉPŠ‚ѼTRH,d€^UÃ!•¡\þ›™0éÞ2Q­q×4P—yèÓ¾ƒÖhÒ{´†Qà¤âNp£Ô9(PÝœÉÙkc@,«w¤ó•ì· ÒrF¶‡´ Ón’üÍOfm¡ËQ¶Œ“2ÑA¤+ƒ³^¬KçhUž7† hã/¦ðÀ´Q{T:"‡ID!v§0¥éF0jLà òe=< ½ŸFÐt%ö9Ò0Ðæ*ø*½˜óáSN¨’xv¯wÓúx¨cÒ®Ek@(YkåEø2bDÆÒøôU›cÕižu¨S§”ÉÁjԙ±G0è´²_u™±ŠRâìë̲ý¬ÌLßû¸Î 44Ô.]!ojU6ÌÙg¡äÛ+EQR#=ƒ„ëâ·1ey¢ƒd†¹Y ++q˜áÍïž Ìö†Zêb–,1œf¼€Lٍ´+Üqñ‚üp &`ëàÖ?n™u' ²²8ÜÃ׃ÎÝô†¤Öe(/}@{{ 0!-@|ž^ƒèM¨¦#t‘P?7|ÌY!GxÄۄ0ë;1¬húÉSÛÖ¯ÓÔ®MXì9çj2@Ø(аœ¿#¸ý5V§Ô:Œ*_ˆ,¥ÛSÐÀ® ·¥*@–¾,eF±»Œlò•3ÒÌñW•3«l î¼Mk茵B˵AåYE<ÔÚö»Ì%ŽÁ¯M­m8íi­Ù}TkO¸&P%'èߦŽ}õP¹óÁ©i ˆù<5}ЊÔô-dPÓì²öwÕ4µSÈÛ!BjšxXMS)ö¬šf<•jÚ|©¦%’G€‘$«¡‡ÞVXçCðlt ih¬PùhÞ¢¡qè–$ўÈbV§¡aL–JºÏàihÆæ}‚Á›ÝÁÄ·`²Ž´ÀÖ…ÁÅÁe³ºD•qwœ”ëLe˜2é˜ÊQ°4#ZxÊfÀ'¥fæ<ÂÅ¡ƒ®wÜâù>9@T¿ (bBµ¶Ó³P»{í<¯0ÉÙCYñ=ÌZ#ŒA†~"P‘ YÏPßûàW„µÑÂOA@áõì2˜+>àDB"…ÍKg‚ºÏ6wn´‹k!KP]'a^v€ÒÕÙT)A-ØÉÑnL— ›ƒ0@@ +$bƒZۋgK¥0´L†JÏCI‰€Û,Ÿ…/Q·‰šÁW”³à(€·‹{Š½OC< ì`{‚i •¾“Òß6"Sgv~mð6ÒÕ¶¯U^7„O߀M¨ë\¦0ŒÜ +/‰»X.øÛÁék}{˜<Ü<½Ÿ²šY½…Në²,ðŽòx«•—ÄMíØÖé ys,b¥:é9½ëçÙÏÞ¦Ä'7þ?|ýni f Š`½ój ÖÜYôŸxÀ/zRtª|X¾MO”D²o ­dd@M+Rl<ˆB2æ왋ª“I$˜[ܒê÷`=îËübz•g¢ƒ‚¹ÿÞåÅl³›¤Ö áCij…MÈãŒEø*y-«6.!¥ìÑB@é{‘:kùù*‘ÊÒäiCÐL50ÅS+¥ ÆE¤ì¹îž’偞f‡¶D%Ώu 'gO!žµ§œ`íõԉ-Òú¼DÌFǙ²hA)ŠhZ³¢5èógXà¢~(æû…Jƒ{+F°èÖìaÄRfõä)›ÅИ‚ŠûpŠƒL4"ˆ4.´‰C”Á @ËÙ ˜ûu†›=Râ•á§lhÿ+2a¾h„)߂ošÎP%®Fhð[Ôß CUïÙt HÁìõ_t%F_*`]TÌ s¦ÐEQßÄeÌbx’ÕòPÅ× @E°Âø‹«xæd“ +"θ5֓³|)¾@Tuš3Û.O»FqЬçi'l»ÏJ’ÄúÓ$I4ÒÉQyšM’.[Ýp¿›­ϱŠYç•lDøò”ø{"ƒxL9"¬Dæ‰a^8ØèêL{bDùƒÜPQ‹ôa«rDXf¢LDؽ¿†éj2aÆ:]ö£Œu +m‘Ï#ŠÜJ¨òª3S/-”ê´™J6 ?_laScè˜JG«ÿf'¦ þ-Å\å쬙‹Ã43¥0秱Kd"S–ÍCV2êœSÙD¦D€³’Í÷ZÉôútǜ«G*@GšZ¤ë;xdjÿÂ,ª–ÑÆeJM¢ f¤&á³™¹0^ì…ÈK\6TLÅ¡éh±+q(±Ep—å…Še­çj¨ØŒáÖ5XIHó8̨ÎJ’>eù¿RuƋÁp.Ч†@k´€®ôGé^ê§_4É<ÙNžÚ‰œwôf ¸Êcw#ךÔëê€Â§Oúç§BaùbVOlÇ]pl@•î][fغ(«œ8Åz òâïòµŸÆ4£°ß(¸,ÜawrÄã½Màƒ‡Ü* ‰ÒdhWœÁiÓ8陡àD VÛy’vsÁ_ ø³™D5ÕGØNðz$w8D#ÐÍz#3Ízب¬2|ì ÔÿÊV#sTÔÓÀÙ`ÕÚu6" +'4UäT/‡u¬ËÚè +:Ø Ç4~Æó›èÄ +ÃÃS6ïº.çfÅ'´[8¥†14õ:- 'SWBJQp‰Ôaðé§È€/`|"A0 ‘Òçƒv æ«FŒÐسDºowÑ÷K&ÏÍ"µÂÝÏÕü”Q%t»)ŒG܏–fx¬ÿù ÐìÆH—FÚ';C%¶ÓZ‹PÓðê ÇΙP$‘9®-toиÎFï® ¯) çì›<86ÿ쇨›e• óÓØ3%DÀè)ûÀÎ0ð±hú"Gð Ë2Á¬àcPp͛lÄÂýÌ?¸#›²ñŒõ©ó °ïÃJÙ?ßg𠆣œ"˜!ӉªÔ!põD­œ,­7UzÉ*1H«i[yKAñ¦ö4¯ªNúŠX2¨ŠÓoT›¨^x{ø­_вzeOK0ÛÝиmðx#Œñ¨=¼àUø‡çC 2¹Lø‰Uæj)" +C2ÙϞ™¨Ÿõ+²7{DŽ çˆø<âôˆt.F–nþa1+/m;}âD53ºÚN$ó”Õ 7 &Ÿ02ßƹm£ut ?¹ØOnª2ôô—§GW ìT8,=vÞô0ö.h´²Ç9ô\üƒ(Òk=홭¿=LozޛN Ñ°(<îø”OÞ!-PéB¾~‚?Ý6ÌôøÄÙO¿\y醿¹E)#t‹ª™Q«›J[ýæL†,·üôtúñï'èE @ÒC§ˆœbúxŠH—:èèù„‰2n_, /;M•wá¡ nTúê`5¯^°¶‡‘f+­ˆÁ\â–ÓÝ" ‘‘0ƵŸpl ^„ª žön¢Î;W“ƒr¢Å€"f äPHŒv/™3"è?HMÓPD}p!àŽn cWш•÷ÛX—Þu4…Îc02YS§;´*_+—­3ÑQ:èh:@ìƒ[]Ôá'Ð=‚Öï²Â7·—nùØR¹©ôÙ +†t_uf› ö@¯ª{û߀óá ¸<Ðgí¼™*‡ÕrõûǦù'¤ùǙÈãxów¶ÍæóÆü?Oéíôü3ÿ=ý þq&ê©|ÞïIϧÛÙüu¾ gÄI…!Ú½uÉÅ»)‘^²ëÜK-2N/°nT´_©5î{¸Í/ՂqÿWÌîSÑ~Sîhƒ_»Z…‹þ\M€ŒcËKz~HžIk¹Ôi;ä~F,4”€£5¯ÅÇeؙKôŠÈ‹;Oؖñ/€k*Ž«U{£OûpS#.À-æ7ØÃ7ø w,fp'9wÓqU¢³ªÇüÙÇU‰ÎªB¶²ŠãªÆ§³ ûÌüÅõA4­¸•Ì-Á4v3Æ<Ë;ùG«(Ù *Œ sz•J»šr±¦|}s•ÑQ§à· 2Ô,Œ»š^ІŸží~ ;*`|ß+NèÌØÐёàkÕk¡ÈùÞw±‡TYy… +언³µF¯¸™–vŽÃv ÿûê®}"3·ëÃ÷GW)UÐR]%ã |÷¸qÞHçgíe^@ƒ.ÆæÍð…9Çjìf{?æ Ù¤‚Ô±Öؓ¦“–þICg+€O}œ^˜&"È`¼&cÚ¢¾Ìܨz|×5T¥@ ¾v˜Ã™Ö}Œù4àdnÂ% 3ïÁ@ë2Ë1*ï™S¹Ö?^žÛ8˜©/o¦BoéÉåVp¨uË­8uüy3¥Eæ4À d.Ácœù4ã›Òїӷû¢9žS+c1GC¾–]WΌʯƺt†GVÈZá_Ÿ^.ÒÁS˜RP2>¶ÂÞ(Z ,Ÿ(Tš¤­5 †lw´æ·ž‰V¢çà;T°9*‹Ç¼ÚDµößêT¬á&¯¼ñ‚&ú[Æ ³ú—¾Nû‹Æ ²\¨ðÜ_5^˜Ç©óQ¹ƒSiaÊHr*áé:’\Ý/ø7‘ä,á¯"É5Ô °É¿Œ$§“)´I®¹@Bþ$¹⡓ݾõï"ÉÙ使‹$g’÷þ2’\Ûû7‘ä>Úîï!É5m§þxƒ;‘äHü“‘äšû ñ·"É%¦çß@’kn*߉$×Ê IÈ 0ù_F’ËIړ‘äò’öT$¹”¤ý$9+iI.’´¿…$×ÜpøÂHr ‰ÿ»Hr ‰ÿ›HrH‚Éÿ2’\sÿ$¹†ƒÄÿM$9‘þ‹HrÊN»†hIÎh¿Œ$×È@⟌$—PIÎe9ˆ‘ä“JÝun]ûŒÐ70ngù—‹§qHÀ±Þ8¨=z÷³‹.k Â;Œ_N{퇑ù„›Ð¾íóΒ†°'b£œs¶_S浌“uñ!–¿yiübc®[¡ìƒŠÈìRKöÎ{ì¥}ãù”-{äÿ›ÿ`éfµ‡8µ) U•R œoô–¥p+ô‘}PJ Um…>²J…Tî[Þ¿ªùGõVè#û l¬óúV¨õ}P ð¿¾úÈ>èÅÆãÕ îÚ¥$MÕVè#û ÌVÚh❡D¤Ónˆ&ÞJÔüs[4ñÎP"?5DM4ñÎP"•rÃVhFGó8>$güÍNðó+ø©>?w¨ˆg˜œ/W¿¥ñ¿ç`¹ÁÿPÿ0ðþŸðÀ UøöÇ,M4ÿ˜òÓí¯ùO &z ‰Ã)½šžVÛßñáß‚è·N¹Ô̧ÿÿÐECL 1Ø”¿›Ñë6q¨ùû“€:ÿ‚Ôá_Œ¦~û7üVŸ¾ÁoÿúƒcÊúŸØŸ™<¬iþ!ܘ#àýc'|¸#@ø|€Oãö<J ™oæ?M¬o¶»ùð°Z~dZjÂ~Ûåó˜ÿ8ë§ÃêwùǔL&¦€¥µíi +ö ÿ“Ìñ¸„ÛE€æ¿÷ÃÖ^ÜáóxýàGð ÷x]·7u3_ȶÔ~_Sþ'vðsþÁX!Ã2ÖüãòøþØÝ~ŠÇ/õ¹D&Ü¿ÇáwTwù^ó³?Ѕ*:™\-©ÑN·›óÏñ¡ÚïrA¢€£¿ßø샭rᯠ@Ê躨4ÿ3û¦Ê&ÖƛÍ͍Ä].–ƒ<2üó}}²ãqyqö—sx½H®Q5pÜ×Ø[Ò3|Ÿ¾Ô4¹”¤•ÐHEØíZãi LVk$~i <þù0¥*oõF­™jä+of•Ú„WÅpøŸ„ȯüªÐ5Œ–QRԏöÇ sC`Ž| }ÿÌó¿³ùÒ?ÔOÛÿÙ`kዝÈMZ 'ìÌ åž üZ⾺@r½hLQiñwºø/3N+Pùœ©íïbõ &=_ØBâö.ñ{Z7«ñê*FŽÛ,§@[g ALæ?ð®â›8…+qŠ <¯Çõ"îwàn1Çá“ÑDßÔ&ê+æò ´¥Ï>Џ„Ëëp{=P…b~‡ i Q+Å én2ŠÒ¸MQ>Ñ··à±1!”ÆÄíñ807+•HåÐ2†>óä)*ñÓÿãRéR亃{€üx] N©Õ:ì Œ€úw9<­Ö„s`@·÷Ñë ÆóBƹ˜Ïƒdõ²VE¡ü/—Éÿ»"éV Sà1îÁ©éN¯š.æð`žÅs ‚ìonÁoÔ{nÄñ‹ºGØ>Ìðþ—Â­ xl<ŠÊÚçBv‡êW?Žá”qåBS˜”îõÝM™!nÀè€à7ô"æ§tÉEmÿŸ„´ýôú>^·ñj­§åqüó?cÊ´™ïÀ£?ËÃü†dþçøµýü¾Ä¾<¸JFóÏÿëHM +endstream endobj 8 0 obj [6 0 R 7 0 R] endobj 32 0 obj <> endobj xref +0 33 +0000000000 65535 f +0000000016 00000 n +0000000161 00000 n +0000036442 00000 n +0000000000 00000 f +0000038583 00000 n +0000038260 00000 n +0000038193 00000 n +0000172001 00000 n +0000036493 00000 n +0000036872 00000 n +0000059600 00000 n +0000059487 00000 n +0000037450 00000 n +0000037631 00000 n +0000037679 00000 n +0000038467 00000 n +0000038498 00000 n +0000038351 00000 n +0000038382 00000 n +0000038718 00000 n +0000038743 00000 n +0000039206 00000 n +0000039476 00000 n +0000039545 00000 n +0000039817 00000 n +0000039920 00000 n +0000059674 00000 n +0000059870 00000 n +0000060879 00000 n +0000063054 00000 n +0000128643 00000 n +0000172030 00000 n +trailer +<<79573FB5A12BB140AA20EB4EA35A55DA>]>> +startxref +172217 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai new file mode 100644 index 00000000..8ea0a6ef --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.ai @@ -0,0 +1,1213 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + logo_blue-orange + + + + + Adobe Illustrator CS6 (Windows) + 2019-07-16T17:01:17+02:00 + 2019-07-16T17:01:17+02:00 + 2019-07-16T17:01:17+02:00 + + + + 256 + 68 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4ql2ia/petQTTafN6g tp5LW4Q7NHLCxVlYdulR4jL9Rpp4iBIcwCPcWvHljMWOmyY5Q2OxV2KpfJr2lx65BoZmDanPC9yI F3KxRkKWf+Wpai+O/hl400zjOSvQDV+bWcseLh/i5phlDY7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+UtK8+6l5N/MjWL23rLYzX9wmoWdaCWMTP08HWtVP 8Cc9Kzdmw1WkhE7SEBwnuND7O95WGqlhzSI5WbHxfT+ia1put6Xb6ppswns7lQ8bj8VYdmU7Edjn neowTwzMJipB6fHkjOIlHkUdlLNiv5i+ftP8maE17NSW+n5R6daV3kkA6ncHglRyP8SM2XZfZs9X k4RtEfUe4fr7nF1eqGGNnn0eN/kZrGo6z+ad5qepTNPeXNnO8sjf68YAA7Ko2A7DOr9ocEMWijCA qIkP0um7MySnnMpcyC+js4J6N2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvDPzgvNWf zVJbXLOLGJI2so9+BUoOTgdCefIE/RnE9vZMhzmMvpFV+Pe+j+zGLENMJR+sk8Xfz5fKnoX5UXuq 3flKOTUWeQpM6WsslSzQqFoanrRuSj5Zv+xMmSenufft7nlvaPFihqiMdDYXXf8A2UWY5t3QuxV2 KuxV2KuxV2Kvinzd/wApXrX/ADH3X/J5s9c0X9xD+pH7ni8/95L3llH5TfmdceTtU+r3bNLoF4w+ twjcxuaATxjxFPiHce4Ga7tnskaqFx/vY8vPyLlaHWnDKj9B/FvpfWPNWjaZof6aknWWzkQNamJg 3rFxVBGeh5fq3zy3W5xpok5NiOnW+57TQaSeqyCGPe+vQDvfPf5w67e67oPlvUryglluNTCov2UQ G2CqPkM6n/ge6mWfFlnLmSP986/200cNNmhjhyEfnyd/zjn/AOTAk/5gJv8AicedD7Uf4qP64/S8 /wBkf33wfSeoahZadZTX19MlvaW6l5ppDRVUdznn+PFKchGIuReknMRFnYPE/M3/ADkqI7h4fLem LLEuy3l6WAY16iFCp4+FXr7DOv0nspYvNKj3R/Wf1Olzdsb1AfE/qS3S/wDnJnzAk4/Suk2k9uSK i1MkDgb1/vGnB/DMjN7J4iPROQPnR+6mqHbM79UR8PwXsvkzz35e836ebvSZiZI6C5tJBxmiJ6B1 3FD2YEjOT1/Z2XSy4Zj3HoXc6fVQzC4shZgoLMaKNyT0AzBch415z/5yL0/T7uSy8t2iak0dVe/m YrByG37tV+KRa/tcl9vHOs0HsvKceLMeDyHP4932um1HawiagL8+jHNL/wCcmPMaXIOq6VZz2xI5 La+rDIB3IMjzA/KmZ2b2TxEeicgfOj9wDjw7ZnfqiK8vwUw82f8AORt9De2x8sQWs9hNbJJML2KX 1o5y7h424SouwC9K/PKdF7LxMT4xkJCX8JFEbb7hsz9rkEcFVXX+16d5C81ah5h8hWnmG9jhjvZ0 uGeOEMsQMM0ka0DM7dIxX4s53tHRwwak4ok8Irnz3AP6XZ6XOcmITPPd5T5Z/wCci9futbt4dct9 PttKpI93NDHMJAqRs4CcpmHIlQAKb50ur9l8UcZOMzM9qsiuf9V1WHtaZkBIREfj+tMfLf58+ZPM Xnaw0ix0q1j068n9Pi5ka4WIVZ35qwSqoOVOH05RqvZzFg08skpy44jyq+75+bZh7UnkyiIAo/N6 X548/wCgeTtPW61Ny881RaWcVDLKy9aA9FFRVj0zn+z+zcuqnww5DmegdlqdVDCLl8njF9/zkx5q ectYaVYwQdo5/Wnfr/Ojwjp/k51mP2UwgeqcifKh+guml2zkvYD8fJPdN/5yRgudIvlvLFLLWYoJ JLFqtLayyqKqjAFXSvz+kZhZfZYxyR4ZcWMkX0kB9x/GzfDtcGJsVKtu5Z+Xn55ebPMnnHTtFvrS wjtbxpBK8EcyyDhE8g4lpnXqnhku0/Z7Bg08skTPijXMjvA7kaTtLJkyCJAo+/8AW9V82+btO8s6 eLq7BlllJW2tkIDSMNzueijuc4HXa6GmhxS3J5Dvet7N7MyavJwx2A5nueaSfnf5hM/KOxtFt6j9 2wlZ6dxzDqP+FznD7RZb2jGvj+v9D10fZLBw7znxfCvlX6Wc+SvzF03zKTaun1PU1HI25PJXUdWj agrTuDv883fZ/asNR6fpn3fqec7W7DyaT1A8WPv7vex38zvOl1putx6YdN0+/tlhSZPrsBmKu5YG nxqBsvhmu7Y7QljyCHDCQq/UL/S7X2f7KjlwnJx5ISsj0yru8mZeRtauda8sWmo3McUMsnqKY4FK xgRyMihQSxGy+Objs3UHNhjMgAm+XLY06DtfSR0+oljiSQK589xbzu+/OTzNb6ncWq21l6UMzxBm SWvFXK1J9WnTOfydv5ozMahQPn+t6rD7LaeWMS4p2Yg8x3f1Ux8xfnVHBcPBodqlwqGn1u45BGP+ TGvFqe5IzI1ftCImsQvzP6nF0PsoZREs0uH+iOfzUNB/Oyd7pItbs4kgdqG4teY4A9yjFyw8aH6M hpvaImVZYiu8fq3bNZ7JgRvDI8XdKt/iKZF5w/NHStDdbWzQahfMquQrUiRXAZSzCtSQagDNhr+2 YYfTH1S+x1XZfs9l1A4pngh9p+DD7b879fWcG5sLWSCu6R+pG9K/zM0g6f5OaiHtFlv1RjXx/WXf ZPZLAY+mcxLzo/ZQ+96j5a8yad5h0xL+xY8a8ZYm+3G46q1M6bSauGeHHH+x43X6DJpcnBP4HvCa 5lOE+KfN3/KV61/zH3X/ACebPXNF/cQ/qR+54vP/AHkveXp/53/lP+jJZfM+hw006VuWo2iDaB2P 96gH+62J3H7J9unO+z/bPiAYch9Y+k9/l7/vdn2loeH1w5dfJJvLt5dz/lcsE0rSRWusFLdGNQit b8yq+A5MTTOL/wCCZjiJYyBuef2vbf8AA6kTPID0H6Qg/wAwf+UM8q/8Z9T/AF22bT/gZ/4tk94/ 3zrv+CD/AI3H+r+pMf8AnHP/AMmBJ/zATf8AE486n2o/xUf1x+l5Xsj+++Cb/wDOR/m26l1e18sw OUs7aNbm7UHaSaSvAN7IgqPc/LMX2W0URjOY/UTQ937f0N3a+cmQgOQa/KL8ldN13SY/MHmIu9pO x+p2EbGPmiMVLyuKNRiCAFI8a49t9vTwzOLF9Q5n9S6Ds6M48c+XQMy8zf8AOPfku90+QaHG+lag qkwP6ss0TMAaLIsrSNQ+Knb36ZqtJ7TaiE/3h44+4A/CqczN2VjkPT6S8L8n+YdS8l+cYbw8ontJ jb6jB15RBuM0ZA60pt7gHOy12mhq9OY8+IXE+fQui0+WWHJfdze9/n75nn0nyOLazk4zavKLYyKd /Q4l5KEfzABfkTnFezekGXU3LlAX8en63fdqZjDFQ/ieMflR+WzeddXmW4la30qxCteSx05sXJ4R oSCAW4nc9M6ztntX8pjFC5y5frdNodH40t/pHN7hP+Qf5aSWZgSwmglK0F3HcTGUGn2qOzx1/wBh TOPj7R6wSviBHdQr9f2u8PZeAiq+188+f/Jt15Q8yz6PPJ60YVZrW4px9SF68Wp2IIKn3Gd12bro 6rCMg26Edxee1WnOGfCX0N+T3/kntO/4xXv/AFEzZwvbn+Py98f9zF6Hs/8AxcfH7y+XLO1lu7yC 0h3luJEijB/mdgo/E56NkmIxMjyAeXjGzT608oflP5Q8r3FrfWNu7apbwtFJevI5MhcAMxQsUX24 gZ5lre2c+oBjI+gm6obfpes0+hx4iCB6u983/mZ5ku/MfnXUbp2Z4o5mtbKPrxhiYqgUD+b7R9zn e9k6WODTxiOdWfeXnNZmOTKT8A9m8mf84+eWLbS4pfMsb6hqUyBpoRK8UMRO/FfSKMxXoSWp7Zym v9pc0pkYTwwHkCT83c6fsqAj695JH+af5GaNp2h3Ou+WvUg+ooZbrT3ZpUaJd2eNnJcFBuak1A8e uZ2P7Q5MmQYs2/Fyly38/e0a3syMYmcOnRgX5Kf+TP0P/Xn/AOoaTN12/wD4nP4f7oOB2d/fx+P3 F69+d+m3rNp2oope0jV4ZGG4R2IK1/1v4Z4T7R4ZHhn/AA8n2H2S1EAJ4z9Ro+/+xI/JVp+W+oaY bHW2e11d2YLdPIyJQn4eBr6YoP5xmD2fj0eSHDl2yd9/d0+bsu1svaGLJx4aliHSr+fX5PQPI35d af5emlvnmW+u5CRbT0oqQnpx6/Ew6n6B777s3smGAmRPFLofJ5ftftyeqAgBwRHMd5/UGAfnN/yl 6f8AMJF/xJ80XtB/jH+aP0vT+yv+K/55/Q9E/Kj/AJQWw/1p/wDk8+dB2J/isfj95eV9o/8AHZ/5 v+5Dw3W/+Ozf/wDMTN/ycOcTqP7yX9Y/e+jaT+5h/VH3PXvLP5R+Xo9JhfWYWur+ZA8v7x0WMsK8 VEZWtO9a51mj7DwjGPEHFI+Z2+Tw2v8AaXOcpGI8MAe4G/m8089eW4/L3mKawhZntiqy27P9rg/Y /JgRnOdpaQYMxgOXMPW9j686rAJn6uR94ZN+Wf5eafrlpJqurcpLUSGKC2VigcqByZmWjU3oKEZs uyOyoZonJk+m6AdR2/23k08hixbSqyW/zR8g6Rodlb6npKNBC8ogmtyzOoLKWVlLlm/YNanHtnsz HhiJ49hdUvs92zl1Ezjy7mrB5fd70V+Rk8gvNVt6/u2jikp/lKzD/jbLfZuR4pjpQafa+A4Mcutk fc9czq3hnxT5u/5SvWv+Y+6/5PNnrmi/uIf1I/c8Xn/vJe8vtSWKKaJ4pUEkUilJEYVVlYUIIPUE Z5JEkGxzezIt4r558j2PlLy7Lb6e5Njfar9at4DWsINuVMfIk8gCux8M1vtl2hLU4sZl9Udj5893 o/YnTDFnyAcjG/tDz/8AMH/lDPKv/GfU/wBdtnV/8DP/ABbJ7x/vnQ/8EH/G4/1f1Jj/AM45/wDk wJP+YCb/AInHnU+1H+Kj+uP0vK9kf33wU/8AnIXTri2/MF7p1Po31tDJC/Y+mPSYV8QU/HD7M5RL S8I5xkf1o7WgRmvvD1z8jvM+m6r5HstPilUX+loYLq2r8YAY8Hp14spG/jUZzHtBpJ49TKRHpnuC 7fs3NGeIDrFnOq6rp+lafPqGoTrb2dupeWVzQADsPEnoANyc0+HDLJIQgLkXNnMQFnYB8aanNL5j 83Xc1pGRLrF/I9vEevK6mJVdq/z56tiiMGACR2hAX/mh46Z8TISP4pfeXuP/ADkfpcw8o6PPGC8V jc+jKwHQSREBj4bpT6c4/wBlsw8eYPOUb+39ru+14Hw4nuLH/wDnG/zRp1jqGpaHdyLDNqPpS2TO ac5I+StHU/tEMCo+eZ3tTpJzjHJEWI3f62jsjMIkwPXk+hM4Z6B8sfnv5m07XfO/+4+RZ7fTrdLQ zoeSPIru78SOoUycfoz0j2d0k8Om9YoyN18h+h5btPMJ5dugp7J+T3/kntO/4xXv/UTNnKduf4/L 3x/3MXc9n/4uPj95fN/ksA+cdBBFQdRtAQf+M6Z32v8A8Xyf1JfcXnNP/eR/rD732nnkj2b4r123 uNF83X0Mqfv7C+kqrV+L05SQfk1K563p5DLgiRylH9DxeUGGQg9C+w/L3mDS/MGkW+q6ZMJrW4UE UPxI1PiRx2ZehGeWarTTwZDCYoh7DFljkiJR5Me/NrzPpuh+SNTW6kX6zqFvLZ2duSOcjzIYyQvg gbk39uZ3Yuknm1MaG0SCT7t/tcfX5owxG+ZFB8+fkp/5M/Q/9ef/AKhpM7jt/wDxOfw/3Qef7O/v 4/H7i+qNaudIt9OlbV3iWwekcvr0KHkaAEHrnleonjjA+JXD5vaaXHllkAxXx8xXN555l/J7T54H vvL0/pEr6iWsjc4nFK/BJWq17VqPlmg1nYMJDiwmvLp8C9ToPajJGQhnF9L6j3hj35W+b9Rsdbtt HllaXTbxvSWJjX05G+yyV6VOxHTNf2Lr5wyjGTcJfZ7nae0XZmPJhllArJDe+8ebX5zf8pen/MJF /wASfH2g/wAY/wA0fpT7K/4r/nn9D0T8qP8AlBbD/Wn/AOTz50HYn+Kx+P3l5X2j/wAdn/m/7kPD 9WAOvXgO4N1JUf8APQ5xef8AvZf1j976Lpv7iP8AUH3Pp7PSXx54l+dgA812tO9jGT/yOlzjPaL+ /H9QfeX0P2T/AMWl/XP+5iz78p1A8jWJHVnnJ/5HMP4ZvexB/g0fj95eZ9pD/hkv83/chB/nN/yi Cf8AMXF/xF8p9oP8X/zh+lv9lf8AGv8AMP6GNfkb/wAdTVP+MEf/ABM5rvZz65+4O39rv7vH/WP3 PYM614R8e+avKvmeXzPrEsWj3rxve3LI620pVlMrEEELuDnqej1mEYYAzj9Mf4h3PIZ8EzOXpPM9 H2Fnlj17z/8AOWxvbzQrJLS3kuHW65MsSM5A9NhUhQc0Pb+OU8UREE+rp7np/ZbNCGaRkRH09TXU PI/Pfl3zBP5R8sxQ6ZdyyxT6iZY0gkZkDm34lgFqOVDSudr/AMDqccOnyDIeA2Pq2/nd7znt2fF1 UTD1Dh6b93cmH5AaDrth56knvtOurWE2UyiWeGSNeReOg5MoFds6X2k1OOemqMok8Q5EHveZ7KxS jlsgjZ6/+ZP5e2PnTRBaSOLfULYmSwu6V4OaclYDqj0FfoPbOX7K7TlpMnEN4n6h+OodvrNIM0a6 jk+ZdY8peePJ2oGS5tbqwlgNYtQty4joDQMk8e3h3qO4GehYNbptVGgYyB/hPP5F5nJgy4TuCPP9 qFE/nXzVMluZdR1yVCAkbPNdcSa06l+Pf8cs4dPphdQxj4RY3lymvVL5l7f+T35M3GhXSeYfMSr+ klH+hWIIYQFhQySEVBenQD7Pz6cf2526M0fCxfR1Pf5Dy+/7932f2cYHjn9XQdz1LzDoOn6/o13p GoJztLtCj06qequv+UrAMPfOc02onhyDJD6ou0y4hkiYnkXyr51/KrzZ5WvJA9rJeaaCTBqNujPG UG45hamNvEN9BOek6DtjBqYiiIz/AJp/R3vLanQ5MR5WO9LLXWPPmsoNJtb/AFTUI3HH6jHNcTKV O1PTBYU38MyJ4NNi9cowj50B9rVHJln6QZHy3UfNPlXU/LN7b2Gp8UvZbdLmWBSGMXqMwCMRtyoo Jp45PR6yGoiZQ+kGr72OfBLGQJc6fSX5Qoyfk/poYUJhvG+hriYj8DnAdtm9fL3x/wBzF6TQD/Bx 8fvL5t8lf8ploP8A20bT/k+md9r/APF8n9SX3F5zTf3kf6w+99p55K9m8h/OX8n7jzBMfMGgIp1U IFvLOoX6wEFFdSdvUA2oeo9xv1HYXbYwDwsv0dD3fsdR2hoDkPHD6uvm8IS482eWLp4o5b/Rbp9p EVprV2APehQnO0McGojZEMg+EnRXkxHrE/JNY/J3nrXrG+8wX8dy1pZW73E2o37SVdYwWCxtJVnJ 9th3zGOu02GUcUTHika4Y19tcm0afLkBmboDmUX+Sn/kz9D/ANef/qGkyrt//E5/D/dBn2d/fx+P 3F7b+bfljzLqq291p5a7srZTz0+MfGrn/diqN5KjanUdupzxDtzR5stSh6oj+H9Pm+sezXaGnw3H J6Zy/iPKu7y/S8pTUNetom0xLm6gif4Xsg8iKS29DHUDevhnLDLliOC5Ad2/3PanDgmfEMYk/wA6 h97Ofyx8has+r2+tahA9rZ2p9SBZQVeWSnw0U78RWte/bN32P2ZkOQZJjhjHl5vOe0HbOIYjhxkS nLY1yA/Wgvzm/wCUvT/mEi/4k+U+0H+Mf5o/S5Hsr/iv+ef0PRPyo/5QWw/1p/8Ak8+dB2J/isfj 95eV9o/8dn/m/wC5DxDVf+O/ef8AMXJ/ycOcXn/vZf1j976Jpv7iP9Qfc+nc9JfH3if52/8AKVWn /MDH/wAnpc432i/vx/UH3yfQvZP/ABaX/DD/ALmLPvyo/wCUFsP9af8A5PPm97E/xWPx+8vM+0f+ Oz/zf9yEF+c3/KIJ/wAxcX/EXyj2g/xf/OH6XI9lf8a/zD+hjX5G/wDHU1T/AIwR/wDEzmu9nPrn 7g7f2u/u8f8AWP3PYM614R2KuxV2KuxV2KuxV2KuxV2KsS/M4+dIfLT3vlG5aHUbRvVlgWKKZpoa EOqrKj/Ev2hTr0zadk/lzm4c4uMvMij8HE1viiF4zuHhWj/85AfmHZXnqX9xFqkFOLW00MUVPdWg WNgfnUe2dln9mtLONRBge8En77dFj7VzRO54vx5Mnuv+cn7poGW18upFOfsSS3RlQH3RYoif+CGa 6HslG/Vksf1a/SXKl20a2j9v7HllxP5l88+aubBr3V9SkCqiCiqOgAH7MaL9w3OdJGOHR4a+mEB+ PiXVkzz5O+RfXnlrRYtD8v6fpEbclsbeOEv05MqgM3+yapzy7V5zmyyyH+IkvXYcfBAR7gmWY7Y7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWHeZvyj8ie Yrh7u9sPRvZCTJdWrGF2JB3YD4GPepWubXSdtanAOGMrj3Hf9rh5tBiyGyN/JjUX/ON3kNJFdrvU pVU1MbzQhW9jxhVvuObCXtVqSOUB8D/xTjDsfF3y+z9TOfK/kfyt5XhaPRbBLZ3AWW4NXmcD+aRy WpXenT2zT6ztDNqDeSV+XT5Odg02PEPSKT3MJvdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdir//Z + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:541D098FDAA7E911B425F35AB770E4C7 + uuid:486615b2-1b6e-4323-a473-deb008ef2504 + + uuid:004ce5b9-fc7c-4b0d-93ee-bf4717f6614d + xmp.did:73FE812EFA94E911B987F622BD994B0C + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:541D098FDAA7E911B425F35AB770E4C7 + 2019-07-16T17:01:15+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 2883.999023 + 736.000000 + Pixels + + + + + CenturyGothic-Bold + Century Gothic + Bold + Open Type + Version 2.35 + False + GOTHICB.TTF + + + + + + Cyan + Magenta + Yellow + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 2884.0 736.0]/Type/Page>> endobj 9 0 obj <>stream +H‰„’MKA †ïó+rÜ=Ìì$™Ïkk„"Åâ¡Ô¶ +®ÒöпofZµ¢ ›¼CòäÍ2Ãí†ùÔÂäj +j§,D@)±É9ƒ®j¿V÷ð¦&EYc)‚5L^¾™ö[5\ßYØÔPŠ„²QZ꘠¬àœ!X õœ"†eTݼׄÆuï½F2¡ÛöšƒÄ}oMì–ýc¹Qø9°«hÏ蚁 ¢Ô@yàáE†»±µÎŠZH=F=û¶\  =#„ºÇZmþ^o؜#pέc‚Õ¨êå¨D[x­Á2HY„vÉpªù³p?w¸ ÆÑ[61|cu@ùùb(±@š’~)¢Æ¿§ÿXÇè[×16ï56óE!1“qÁ•3̾ &Mô_cgsy5 ƒ¤uù +endstream endobj 12 0 obj <>stream +8;Z\t8Wpt6$q9pW3/fMoQ#<;]1kUN9.WJ^e=`dXojY-s54H#9A^MR+*mmk-_WT'j] +#;[)cme0 +ikIVjo,=N%.V<]^S'sc,N,q(P*kMSl:N&aJ(itp:R0j0tZ+13jBBUqkNNYX="IScK +4d/o^m'k=:3]imh[j,Uk?rG;/,@H\QKP(l2#/8HW1!N["X\"E5d<=2d:jpA"k*##= +#5DeQPgh0-VC/3:da4A$CbSR5HH%479J[eU@N%num.l*9@u7ZGXgj7+R/D\0B.pVi +=$8!LdZ]i%[4K:;p+hhbIK\1)2-fhHUeWS1A@^6gVNApWK0)E\"4IK*8Fc&3D_5&O +CoUIBUS^`J'E'fc)#sp`Y0?~> +endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 6 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 5 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream +H‰|VXWþÏ̼G…ˆ ˆóγ¡ ¸¢Y-ŠÝØEªRD ¢‚"E±aÛ{H4j4QWEÅ^bb,ë{ŶîFŒ®1 +ÌЏ/»‰¹÷»ß-çÜ;ÿ¹óÿg 1R!bhàOïø–ÓšñŠ‰Ûèàè Øk.Û§ä hý‚ä#%™½‹X@:=¬Ò¦1`ÃvétxTrXèì%=»—ì“r¢iôYÀ9…ÏëÁ ºîÖx~€ç­#¢’Öè_Øóü`œì¸ûš®ÑAI±ÚVÕ@ÛDö—gE‡¢5<ÏÄ'±13Ô~Z~–ÇÂ:{l|hìãÁcy^Xn‰w…£`ÍF{¤¿í{„ ö‚$4²ê‹ÄkKñ›28pH dÈo-jGã¾E’ÏÊn֛P}ïÈ·Æ#jÎM‹w‹Ü õ>ÿ[Ø(J­…¥•u#›ÆMlítöŽMš9»4oáÚÒ­•¬7¸·VŒmÚ¶kßÁ£c'O¯ÎÞ>]þÒµ[÷¾ôìå×Û?àÿöéûQ¿þúxðÀ¡Ã†9jô˜OƎ?aâ¤ÉS‚058$4,³|#¨jŸÏø_ gÿ-ƟÆø—‹…IM¤aÒ$)×-ÕígÙAn&Ëõø½å ø ‡¼>·¿Žñ»ÜÞáŸb©Ç/¿ÿÐü¹J¾²»ÿÆ‹ñû6à5FVáސªª÷ÕQ]Ôê€êüZÇZ‡ZûZ]MYMi¹ÆTStïؽáo©Yž^žWaUž^Aw­Ë“ʏóÊúr]ùå*º”E–%W´,V¶¯,¿4¯tKiPº£nW™¾4®t2ϼʆ””y›GšG˜šû™û˜Ì~ænf/s;³Álkª6ýjziznªªÛeºnºlºd*ö߉40 5š¼M^&O+ß®³æx½ŽÖ -ñmûã"DQœ߭ÎxŸ½ud]F¿› ÿ3ßÿÛÙ^ðh·ýC§wƒ"" éÂäá–`9²ð)va+ìÉÙa1Vãg_#¸ +qâI§yKX±b[ðS|áÏŒeÅd!›µ¼™UZˆí¬Ò ¬»̸—Ì»Zæt+êIýië%‘Šoa¬°FØ.ΏZ„¨›øùm/b$ë2†O\Ã'íD1óí>+§+u£€zýeP.¢úžîSµ&¬¶ %âXI«iYó¸öµ½úH}‰ïĆYÄÿ*s_ ÂxÆÆ7Ï:ŸÍ*_̙(‹3Ðf¾³­œSö0›2îsœAnã9ߏÀUÃՒÑëX‰N\}GwŽ$€‘Œg…Oe¥&³†rh'í%3= Gôšqµú Ó¹óWþž(‰n¢;×þâzq“¸KÜ#>‘œ¥Ž’·ä#­Ð,Óúks´§´O-jª—Ô&×^Ruj:GÐNpC+®mÑýÈ| áÂë³ØLÎYs97-æ{_Ëïë¿|W}pÇßÝûÐ×Ù:ù˒±ï|X$Ù`óaŸ±d,ƒí–dã/(-6e2 3IÌ&!™†I'M +-MR’ÒP*&mâ™Òvš ӆþ¦Ó¤ã¶Ó ‚6Ånl©ïN6i§º»ÕÛ}ïî~ooß¾ûÄTv‡ŸÃ껳vÓX¥£¿A¦½ ¹ð ØþtŠ +Tàu¸²T 2ÑA@ÿ<>…ãøb%%p,"‹Iˆ ’“„’áø+¹ËXà(eÖ1f'svû b¹ÈüŠ™O +À6Øù;Øö[ì{œ¥ì öâ6rm\w”û%w“›á-|?ʟ4 ¦«f§Y±|bàq|iuý™¼±ó*þòO Äð·!ƒ¼€‹H=ªAMlŠ[ˆï0 +oG¥Ì{hpq?6[Ø?`D['¬¬ZÈIã‚e += ‘W1? {Çä±\:ðgÀ–²W¬sÌÁ¾‚/›^Ä#hš8 BNH6ÂÜVÃʺ;Ô),¥¿Î~âå×i½ËæBþ ˜7¤oð ô#rC¯mÕG¬©­Y½¢ºjù²Ê +¿Ï»tIùbOÙ"¥T–JŠ¹]…΂ùy¹9ў%ج³‰çX†`ä )1‰zb”õ(MM~½¯ôÀ@Ï1*ÁPãÃ6TŠfÒÖ*X|ÉRÍXª÷-±(PÀï“BŠDß *Rok€|"¨D%š4äVCf=F' :² wH!çPP¢8&…hã£CZ(„çÅmÖ¥¡ßê÷¡¸Õ¢ $Ú¨ ÇqãZl¤1´&N9 PÑf%¢a%¨C LY¨§¶µGBA·,Gý>Šv*½)ë¨Ýk˜ ã5”o &ã5Ò.Ýt\Šû&´ñ„ˆzc^¡OéëéŠP¦'ª¿Ãá¥ë• ]`Òé÷%ð+›#ÔҐÀhsä +jNÆãÁ`T[NCdìAs7£…œ»$½«ic=ÝyP+ëm4 +õûZ:"2 VBã’îFGÄðŠ•RÓÝÌ8ܯ„ô‘Øn‰Z”uʐ¶;d¹4Š:“/¸šÕ+éPsHÒ6G™Ö¹•hO°(ž‡´ŽÇ.†U)ü°ÆŽÌLdzís‚õ Ð_gH†¹.êù©Æ:"% !B¥ ‰(””ÕèM Òvրü¢ftÌ_L×èDpePŸkSAIÞzx¤gn„/§.êár?ä@?/S¯—.]ªGŠ©¨dkþJ¿ïQÚ¢ ‹m)Cm¸)º¦¦\–u–'TÔ :ÚÉô%Ô뾀ÔJo”’˜®™˜×äoÑ5£óšû·ÇçKFiO͞û§]\ZCñ‚ÿ£îÏèaù„¤8˕imOvÜí‰iãQ ¦–¢¦5*R£ÓzéÑ^E-ÞÒ¢ ‡bó.%Ò±ãnzz<:„aRiuf6hnC„q“hF"n¤–¯*-íÛ"5s¤Q¶ ÎpŸêÛ!4Ú»ø‚³g\6YixZÖíH™x]yr^.Ey"Å6¦(—b >L™‚PúÑ…̍;h[œcØwñ¦7±„ñßÊ0ÈÊs ì½Ì0¤Ùb ï%ŒÂæĬ §w£x7Ð:Ø(NZÅ©ª ˆ³©ˆË—ÉÙQ †ímFb&fT +S‰€ +ùñ÷ þÐ-Õz͊°tÍÄ°R"=¤Ž‹YÂV‹å‚óÁ¬‰ç#›ÇAö4™ÍÏF—ÍPž «‰À®Ë`Œˆ`³Y,f3Ïsfd°Åʘ T ӒišL«Öi‰«6 ßÞþ$pv¡D¨vìá'ÂûÂY]šáU÷Ⱦ†È…÷Œ»£®ÂÖY—svÖU˜¬­Í©­u-r‚³sGF*¨ã*¼c¯ŽU8ÿûÏëõ._†e –se*uF†B'>+¢8û³Ô§/§~óïÔµ3©;ÜÛ÷R,ù¢ž93³C¿ E‘ô$ûÛuXjS+ØFDŽÎ,âkA§Éæ:Œ˜(!b1ÆÍÅ׋qÞà¨õº•Xà ·í7ÜiMŽIû€¥ÙÀ$ªKÖÕÕ%µŽœZ“C^™•R´rª®ZPÀ•òùy ª«V­\áaÎc1õ¶3ÛŸú-^z£÷pêãC¯½~ðð¹s¬zoâ›ðúÍàuÍÍCÇO\¾øìÓðnKm5ð– /Ú£–,ZµˆäxòKduú¤Î"îéÌ·r¶lĖÀW~–ÝÉÛsJ/Ià°jÃÍ~eÐö́oMôÖÙ»^Éd7ТfcÔ՝HbpÁexµ¸ìM¼\ZËŸºj-žóL\½ê¹¶÷ùÔ§?<µûËßú§V7½Üw3õ»ÓϾ³ýÕÍ©¿~í#‡~ø +«Ît¥n¡m/î­¨ îy¢©>ÅÌKO‡6}íÇG?§;§³´û, –³£5ûsîsáÕ¢âÚ4ùqª¢†ÐÇo·nrìpæMRˆ²…ªŠ•µÛG…“Q…6!ÂiIX&0BXüþþù¸48'ÅÉn,v‹·G¼ºë¹UPnðJ©gåŠU P:Õ48°><8PsR·y4ÔÜÕÒ4ÖÄ1„L6`ȃžT—3ʗ:¹üN›jÊÜn—ËaEåxGù¡rRR.•»˜ãˆŠ âºì.t¹£.Õ".‹z<"ÔÝ*|Ɍ"î$|(^<<6vvV_ FÛÝ=‚2Ë¥þ’b˜êråüµXgHo‹q>䎥4;#Uà9ñÎi|½àlUý/†÷ÓÖT²««qïªTÒ»õ+Á½«S·Yõ`놾X¬oÏù«³GHù•£m'¾›Ê'ö玪íϽ”*ÒyÚ«é]ð=¹P•ê^-b{'úûÕTÕu…×ÙçÜs®€.pÅ@à(¢AD. +Q|Dʼn†«ÜÊSyƒv,ÑH `T«F‘IӈAœN43Ó45c;­?j;m£3&?ÂhRk3v¦rú­}ÏeÎô‘N§¼{¾»ÖُuÖþöZkßkD–8ƒ£ª´¼WÕ®`%87zýŽ@êpøÝ⤹…lñ*³5Wd„ÐdÂÌ}"|TH‰Îne‘£Ã÷~øùð¹ó½×žëïÛµëTŸVÚ=|ïh÷ðÝW”üÛÖ©ƒÃÖ[{öŸ9»wïiœD\: s{GÎ4§ÇõXF±ÃØg¨ª'$,ãœz.Xôª½ÁÂ*” §1ô Aëíœ ðˆŒ ý#4È´Þω’aä¹V¹¥oºÐÐÕ°œ¶þgþcàS¸é]úYB&ÿVRv müYãU’¼Iásä L4@»91lrÞçÓv.OÿV±'.»Dþ³–Ó¹¦(f(ªçfúð2XO³nªóàw<ý)'mMxÌs N[èZ“¿A)p=aÜåq—ƒ¯EßtE‡ ¥,¡1á¨8¢¥(Ùø»5(¢sRV©Õõ9µKu¬”ª:SÍTÅx5F¿U?Q¿P-Ôö’Ɇî á¼f~Ž{µ»ÌÝèÞåv,p+ñî9n!Üánñ¾û²ûºûK·æ. ¦öIUãóº½*¶¯Ë¥¬rmt WîÔA%ù-ÿÉz½ùwoyåá¢$Þ÷6555ßôŽ(|ÖMLŽŸ‘wœ‚Àä›>—k ÍU†¬Ý€èñm ¤_£ÑF«shd +lÑ.)s0vœÇCÖ=â®<} •Ó|ðš?}Ž:ÌÏ#àsջ”Œ±ïê‡èuô“Hn€ÿ”¬'Ð\g/­Ã^6óùsìÉX(§5x^™¢}J‚¯I ¼{ct„+ðãl£ °QÀççä3¼Jǁ×0cåûR˜w>{e™ ÛAà)š¡=NšDM·ãò¯Ê¢D‹‰ôš-e,b¼LdYßΗekðk5p^6`¿V+ ïÃÞrpö2d1Öwaï‡pþEŽn%òGöœDÄMŒÛä b”ã12Éñ%Í法±Û+㨏cÍΝƒâ á@,|xÆÆ4Ø$™7ˆ]~¯m;Mæb 9–˜?qJ$†KòËñÝààCHø!c“}±¥AáëRÎEì7œ¥è :)/RDZŒÁ€L°.Ù<sžr®@þTtY§þqÞrîHù Å1—2m9ÂM@æ#ï7Q™Q »Ë°ŸE°½òSȵ4EoƒÄþPÃvƒû§´vªïQþ¸ê3ÆÓ õ‰ØZ{GÇÈ# ㊲Y{›Ú%ßWè€øvèg!Å|Zàj,·£øêýoö¹Œ•\ãä^›h +$ê±µyÌq# ¯áùEÈ x®ßY\ Qš¹rMbøϺà\_ë·àýþý¼ÇÚ¼cù+¹–ÊzfÇ#×ÁÀþ¹pN˚€¼VKvçüÒ>²zô«G\·z Åêq‡4­ø›¨ýêâ{ˆVȜÃ3'ì3×~Þ§c‰@Ýמ¤z¹æ y¡©¨Øû¦_§|®ùúz^¿J圳ÜÏ~ªí´–¹ïՐõ2þÿP«µ¨˜ÇÕßÀŽÙ,*–¹ìç7 }/ð<—ùSI™ŽyT¯†þÖQ&ÛÔËÀ1j¾ýT`×ãz»þÊ>Á{F̔ñYð>ÙW>[ãöz|´Q„vr2Mâ½J®öa¿6_z…°-£bµ%åxs€¯ñeóàŠcTޑ°©;É#¹"ŒÝ¦™D‘2—.Y·ùÝè/æºÁw3s,"­~}>ÞùsöÁº-}ðŸ['8íS›hO †ÇÊ@Lë\³è ­Íú˜ïCç ™C뵈òÐwÔ_‡E,îKÅ1€÷}¥\p ˆÝ¬?(ÇBùÐ?ƒ1zì?íÿ&¿Çý¼Eê¸/¸¾ñoKcHñf@boÏӜIÊçeÐX‹Ú»÷÷ZªÔ#ò÷ïP&âñQ')qŠj°f#LfýÛïþ½¦ÌÕúÐîû›hCû€›«^xض‡íaûÿ6R𠰛îP&e“ƒ…R<Í'Rëœ'HåQ +¡ÃRòg'à×Uš„'¿®AÅÖuègl݀¥_±mžþ®¶®Ðl¡Úº GDº­«è_dëô­¶®Cï³uƒž׊¶7VTú6U˜ýfQu…™ßPßЊ.sQCscC³¯µ¦¡Þl¬Ý4Ë\ìkõý‹IfŠÉæ̆ڭÜ×bæÖcejF†'9#Õ\P[kÔTU·¶˜-ÍÛ*ʋ—®.\Ÿ´¨¢¾ukóö¥ ­Õ5›’6Ô~ƒ»Çôw™5-¦Ïlmö•WÔùš·˜ •ÿ|{TDÛ©‘*¨’|´ Ò¤~ ˆª¥žO T´Ú³LZ„§fèüíCœa¢§ëgA[,û}ÿ¥%“RäêÀìBŒÖÒ֑y-è˅ô¿3•2Ð<”ŒïTô– ·D2îb:Ð)_ï£þ“|‘|™-§/*øªÙ˜b(Ä>ô)'Þ Îp7` ™5Âö§ôÊþٛɛ võE€³ÏP+­}¨Ië%Ô¯KËF½AZ¦÷$²çΞà7±gÎêy3 œêm2ºŒ·€Fý;ÀÙ*ÞbtÒR¢4E| m'®S7aÈ9âK`SŒ¯aÛ×Y7øìãÇÃ*Ÿ•=¨]€c=µxµ°Ž£>)­S\¼v{x•1‡ªY5q% 4ñÝ… +Š¶»D¡©ÏŒE}ás®½ðù ®^ðµ ^®Qeñ8ž~C½b|L—`UÓ¡‚£káF*R/¾;4*àúb´ylDL¥̦k…õvÑÞP=ê/8s5¬r³ºà܂feÁi×Â5´¢"ô³} Y +âE{W£ú ́Ðì^xfí) BµF½¥^=çÓÎZŸ,h?ۿèíRO:ªvÂY¨}}˜zÕ|Ҙ¥~)¸%ø R±K}Çöª¾/îTw¡]Wܬ¾j{3»êcêN{GƒºÝö| ‹)õEʇ´u"åFö—©)Û£t±]MÚ+ßP-¦T*d´p¹xìbúñcیÈûÌô=Šë¥Ò{̤.—Jû`=ˆ×€J{‹æ¯:–b2ÍÚz„eäð®¢ùE3ÜõF5ü¿eµ_L.hgÌRM õ'SDg߬þ(˜_™;µý¦ÇCF`™º7£kof,m2³Y{΁b·º%#÷祌Wõ–ü¼éUÕaÉÏ Äƒº{±/äQ͊~wF(BnC‚%VF‚î=í Oa½îÝí ·ºçÑdžèËå[(Ù,þ²ë˕“•YdO’„SÜ'‹/·Ø°Çc±a×ؚrõPԝ)ñŠ£-]OÎ w¼æ +endstream endobj 11 0 obj <> endobj 10 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (icon_blue-orange.ai) +%%CreationDate: 7/16/2019 5:01 PM +%%Canvassize: 16383 +%%BoundingBox: -43 -681 2789 33 +%%HiResBoundingBox: -42.999 -680.9844 2788.8838 33 +%%DocumentProcessColors: Cyan Magenta Yellow +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: -42.999 -665 2841 71 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: 983.0205 -584.8799 1783.6602 -8.87988 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -2911 1691 0.25 1586 946 26 0 0 51 123 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 21 0 obj <>stream +%%BoundingBox: -43 -681 2789 33 +%%HiResBoundingBox: -42.999 -680.9844 2788.8838 33 +%AI7_Thumbnail: 128 32 8 +%%BeginData: 5449 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDFCFFFD08FFA9FD11FFAFFD6DFF305BFD0FFF5B30FD4BFFCACAFD +%20FF5B0885FD0DFF85085BFD4AFFC3BAB4C1FD1FFF5A090885FD0BFF8508 +%095AFD49FFCABAB4BAB4C3FD1EFF5B080F08A9FD09FFA9080F085BFD4AFF +%BABAB4B4C3FD1EFF5409080F08A9FD08FF080908095AFD4AFFCABABAC2FD +%1FFF5B090F080F0FAFFD05FFCFCA310831095BFD20FFAFFD13FFAFFD17FF +%CAFD20FF5A0F080F080F08AFFFFFFFCFB4CA0F0F080F5AFD06FF85300F08 +%0F307FA9FD08FFAF3031080F307FFF85080F08FFFFAF080F08AF5A310885 +%FFFFFFA93031080F0E7FFF5B080F08FD04FFC9BBBAB4BABBFD04FFC2B4BA +%B4FFFFFFBBBAB4BBFFCABBBAB4BBC2FFFFFFC9C1B4BABAC2CAFD07FF5B08 +%31090F080F0FFFFFFFBABAC931090F085BFD04FFA931080F090F080F080F +%7FFD06FF85080F090F080F0831300F0931FFFFA90F08315B0F080FA9FFFF +%85090F08310F0F0831310F0831AFFFFFC9B4BAB4BAB4BAB4CAFFFFC2BAB4 +%BACAFFFFC2B4BABAC2B4BAB4BAB4BABBFFC2BAB4BAB4BAB4BACAFD06FF5A +%0908313009080F0EFFC1B4B4CA0F0F080954FFFFFF840F080F0809080908 +%0F08095AFD04FF85080F080F0809080F080F080F08FFFFAF080F080F0809 +%0EFFFF85080F080908090809080F080F08FFFFCAB4BAB4B4B4BAB4B4BAFF +%FFC2B4BAB4CFFFFFBBB4B4BAFD05B4BAB4BABABAFD05B4BAB4BBFD06FF5B +%080F31FF310F0F0F5BC8B4BAC937090F085BFFFFFF31090F085B85FFA95B +%090F080FA9FFFFFF0F0F080F31A9A9AF5B0F08310931FFFFA9310831095B +%A9AFFFFF080F0F0F31A9A9AF5B0F09310831AFFFC9BAB4BAC3FFC2BABAFF +%FFFFC2BAB4BACAFFFFC2B4BABABAC2CFCAC2B4BABABAB4C2CAFFC2BABABA +%B4FD06FF5A090831FFFF0E0F085BC2BAB4CA0F0F08095AFFFF7F080F085B +%FD05FFA9080F085BFFFF5A09080930FD05FF850F080F0EFFFFAF080F0831 +%FD04FF5B09080F5AFD05FF840F080F08FFFFCAB4BAB4C9FFFFC9CFFFFFFF +%C2B4BAB4FFFFFFBBB4B4BAC2FD04FFBBB4BAB4C1FD04FFBBBAB4BAC9FD05 +%FF5B080F0EFFFFFF0E0F5BC2B4BACA310831085BFFFF310F0831FD07FF5B +%080F08FFFF5B080F0FFD07FF5B0F0831FFFFA931090F30FD04FF5B090F0E +%FD07FF5B0F0931A9FFFFC9B4BAB4BBC3FD05FFC2BAB4BBCFFFFFC2B4BAB4 +%FD05FFC2BAB4BAC9FD04FFC9B4BAB4CAFD05FF5409080FA9FFFFA9085BC2 +%B4B4CA0F0F08095AFFFF31080930FD07FF5A09080FA8FF30090837FD07FF +%85080F08FFFFA9080F085BFD04FF300F0837FD07FF85080F08FD04FFC9FD +%05B4C9FFFFFFC2B4BAB4FFFFFFBBB4B4BACAFD04FFC2B4BAB4CFFD04FFC3 +%B4B4BAC9FD05FF5B090F0EFD04FFA95BC2B4BACA310831095BFFFF310F08 +%5BFD07FF85090F08FFFF5B080F31FD07FF7F0F0831FFFFA931090F5BFD04 +%FF5B090F31FD07FF5B0F0931A9FD05FFC2BBB4BAB4C3FFFFC2BAB4BBCFFF +%FFC2B4BABAFD05FFC2BAB4BBCFFD04FFC9B4BAB4CAFD05FF5A0F080FA9FD +%05FFC2B4B4CA0F0F080F5AFFFF5B080F08AFFD06FF0E0F0831FFFF5A0908 +%0F85FD06FF31080F08FFFFAF080F085BFD04FF300F080F85FD06FF31080F +%08FD08FFC2B4BAB4CAFFC2B4BAB4FFFFFFBBBAB4BBCFFD04FFC9B4BAB4FD +%05FFC3B4B4BAC9FD05FF5B080F0FFD06FFC2B4BAC931090F085BFFFF850F +%0F0F0EAFFD04FF310F080F5BFFFFA9080F083185FD04FF5B08310931FFFF +%A90F080F5BFD04FFA90831093185FFFFFFA95B090F0831AFFFFFCFBBCAFF +%FFCFBAB4BAC9FFC2BAB4BACAFFFFC2B4BABAFD05FFC2BAB4BACAFD04FFC9 +%B4BAB4CFFD05FF5A090831A9FD05FFBBB4B4CA0F0F080954FFFFFF300908 +%0F08313031080F08090EFD04FF37080F080F305B300F080F080F08FFFFAF +%080F085BFD05FF37080F0809305B300F080F080F08FFFFCAB4B4B4BBBBBB +%B4BAB4CAFFC2B4BAB4CFFFFFBBB4B4BBFD05FFC3B4BAB4CFFD04FFC3BAB4 +%BAC9FD05FF5B080F0FFD06FFC2B4BAC937090F085BFD04FF310F0831090F +%08310F0F0EFD06FF3108310F0F080F090F0E310931FFFFA931080F5BFD06 +%FF37090F080F090F080F0F0F0831AFFFC2BAB4BAB4BAB4BAB4C1FFFFC2BA +%B4BACAFFFFC2B4BABBFD05FFC2BAB4BACAFD04FFCAB4BAB4CFFD05FF5A09 +%080FAFFD05FFBBB4B4CA090F080930FD05FF5B0F080F0809080F5AFD08FF +%5B080F0809080F5B5B080F0EFFFFAF0809085BFD07FF5B0809080F080F5A +%5B080908FFFFFFC3BAB4B4B4BAB4BBCAFFFFC2B4B4B4CFFFFFBBB4B4BAFD +%05FFC2B4B4B4CFFD04FFC3B4B4B4C9FD06FFA9A9A9FD07FFC9CFFFAFA9AF +%A9FD08FFA95B5B5BA9A9FD0BFF7F5B5B85A9FF370F0837FFFFA97F5B5B85 +%FD09FF7F5B5B85AFFF855B5B5BAFFD04FFCAC2C2C2CFFD04FFC9C2C2C3FF +%FFFFC9C2C2C2FD05FFC9C2C2C3FD05FFCFC2C2C2FD2CFF7F7F5A7FA9FD05 +%FF7E0F080954FD07FFA9FD1FFFCFFD0FFFCAFD39FF85080F090F31855B7F +%310F0F0F08AFFD72FF5B080F080F0809080F080F085BFD74FF85080F080F +%080F080F0885FD77FF7E5B3031305B7EFDFCFFFDFCFFFD52FFFF +%%EndData + +endstream endobj 22 0 obj <>stream +%AI12_CompressedDataxœì½ms%¹‘ú}"ú?ØÉáaW +”®ãFð’Ú±%̈́4ò®½×ÑA±93ôv“m6[ò쟹?æþ±›Ï“‰ªÎ9löËheï4¤éfTá%‘/O&þîß}ó‡/O_ÞýéúËpÒmž}ñw·»¿¾|¸»ÿՆäÍW¯^½{ûpÒ/~ÿËM?t¨uúU~a5ÿËõýۛ»Û_ñw'¿½Àó¿ØýpóöáæòvsqýZ*ýró‹_â·ßÞ<¼º–ßß\ÝݾøÓ«w×_ÞÝ_Þ~}ryóKiñìòAª¥çýô|èúyÕõ›o~Ë*—·¾|ûöæ_®ÑmÈìu{÷îöåÍí÷Û»ÿõ«Í—cØ|9å~3¤ÿÃÕåýÝíóïeó°íW×ß=<ÿú\VJÔ¶AöøoÒ¼KV-?è¯þôN¨ϯo_^¾ýáùõkþõ ûòú¹p̗×Ø.ÒØÛU§úðÝõó—wÂ…‹É:˜Ÿÿח7×÷òÅo7Ïß¾¹¼’á˜ÆçWïîï¯o¯~”¦çº¿“ ù§KÙÓý”Ÿ—úϯîÞühmÞ¿üîúõÍíÍ­<ž†ç2þ7W—¯nïžÿðã›®oŸßËT¼•O»~ùüõå^K†U&éùaóòä»·Ïþr÷ö ÚÍÝýó‡ý§Ë«w×Ï_¿Ûô9<'íå•Ì?[»º~yóêÕ¥´$Ûџz}ùöêÝ+¾QÎøåÿ|wy/ÏàŸ?\¾úNû0âÛM?ÏO¹¤©Síñ´™ÍSßSÿúS|ÀóÓóç;{…çç|üù9–VΛÇÏý¹¯´ÖWÚÅWM¯¼ÎùÃÏÇ¥™¯õ¯õ¯›¾Öwúڟ{ýîÕÃ͛W?>ÿúí+¬‰?–ú£>üÇæá?úSÿUùíw÷²ZÀ€oe©½}~©_–ï¹lž¾Ô®/½‘KÇåõó«2×úøµ¶~]–¦®ý¹­u£µnš.n¼Îµ Ç­vx§ÕïÊ;Ý5ÜYîå͟o@ÐÁx§¾ÓžÞ-Þç?ó£þúƒñc!?ûâÛse…ñ?½øö­ ÿ/ÈhÎo¯îpÀÿjóbÿP=xÎþÓó5ŸxXó·ÿí{WúÚ|{ÿîúÛߔƒˆ/òBÞ왎î°ß½áïò‹o^½“_þúþîݛ¯n¿»{öÅ/TÒú/×W"MÉñõróõŸþ‡ü òÒï.¯~øþú_®o®~¸½~¸ÙÊÐ +ÝëŠÌôæ—ïiXúýõF+ÏòGùû;üý”çÏ®¿ù£6 Ô¿ÿB…ÿÝ~ù߄·>üË뻗ï^ÉoÏoÿ|ýêîÍõFVïæ.ïß<¥‹o^]Þ^Þoø‹ÒCÛîæ+°™Ë~¸ùóæõ¥t*•~s#gÆ7—2¾OêA˜Ë5>Ä:ËÞ«ÐüêI]]>ü°ÙÊK¾|뭟⨓Y|'rîzÄø!Zÿ)ÍÿáÇ׺{uóöµ7ÞRüßO|SÖÛ¯oõ•ïß½ýaóíÝÝ+où·ïpX¼¹¹}{ýjõÖ"(ésSyåC`óüoÑÅîRDa“o„óêå?Ûï¿»¹>Øّ矴º®8U‡zýÛë¹¹|u°ÇýÇþæ:³5¸@xç&ðh?üåòáê‡Íonþt/Çìõ{v+&û»›Û—ò¢xwópíàc 8ýöúá_„A {›‘.šjógM{œ|ùåãM?m¶·m•_ßCD¸}µû×r’AH¦ë¿E/H›íKÊç]ó¿¾üoÜü݋­HžÿQÈë?ýª M VF+‘ÿ/eÂÿ¥ÅiQ’—Ü͋rڔ­”•³¦œwÒâE)‹Wkÿ M M%j‘1Àß©Ÿ¤$þ›2/Êi¿õ²ó²íϤ”ŸÎ¤Å³þœ´³þ¢-íðñõʟД±)q˜Pž}¡©)y˜¥èO›²Õòì‹ÿûðœ›Õ°˜×±™Ý:ÇR¤Å2Ïc3Û:»í,g)ø³›ó<73-ÿ•uÎˬo}¾õoÌöy;ëò_ýÓœóAf ñ ó‹¿1Øë‰%s¶Ój¦O­,çsŠ¿ÏYÎV³Yº œË:w(:Weæf›3™'™S+ÌÙÎÊ˹• ”²Íð9«9í9[£æ¸n¹g.8BG`â7Îüž3¾uoo9qõœb­°oô5„Æ0…r˜ÃVÊY¸iïÇ0ŽcӘÇy<·ãÙx>^Èp1Ä1N1Å9žÆmÜÅó(ûT^©—%;Nqš¦<ÍÓ鴝vÓÙt!‹BTØ4¦˜¦”Óœ¶i—Î҅,˜>yÌ1O9å9Ÿæm>ËçùBŽÌéæq–†æ<ÏóvÞÍçó…,Ÿþ4œŽ§ñt:ͧóéééVÊîôìôœKjO·q›¶y;˯¶ÛÝö|{!ËLF“ƒvã.îävóît·Ýívg» Yv='c<‹gә¼ÞY>›Ï¶g»³ó³‹óN¦'œçÓy:Ïçó¹tv¾;—Ur~~~¥q!ƒv/äc/äõ/N¥H§òèÅêç´ã´:í¼)gMÙ5e»(§M™K‘g龖ԔiQbSƦ„¦Èj”/-g«\¹k_þ¼ýs¶(;-2dø{۔Ӧ̋’›’š25Eúyô2.JhÊД¾)][t؟}aÐ~@ûgה­–²Uó¹œÅåܕY[ÎÔrvdF¤Å±‘f&–ã¿uíÕsTe¼æ՘ÚH.Æp9n«ÑZŽŒ×r\tLN­Ì,ÙJ²2±D+#K°"뎛ÑÎT=|+”ÓÎʟ-Ë©•™%[‘Í.›?í&+ÑÊȬ(O.g€ðÕfNÏ9[Î[æFæÓ±Úʟe#o]¾.¥jLy¡K%Ó¯´Ä…fz™´Œè•ù*ñRÛ+§•ë‚®M°È(.´È%ô¢yàïyUòªTUÿ5™.ۖq¯„½2(öGZlÿ쩎؝­ìçŸ,ÂZdî¼l½œ)óђ‹†)-¦U™žXªöÛ"-.~v Gý÷~ G +—†´8<±äEZ|ZÍ'ÿ9h+ø¤?Ÿ¯Åæxí}`Uú-Rü™•ÛŠ-¤ØF²éÞÅvbû^vµêée·{LÝ +ë½]dß²—ÛÝ»µ]]¬û{7¹Õa²Ý&QíR¡Ý­nÍxdŸÊ¿ÜRmc«½Yv珦bcimlۃ{s»°ÌíïÎbÃYïÖ¼°òU«P± Ú¯þóÂv÷ʸ°6ߕKËÕÚfyhß>¶›W{•»úÈï>|G?º«ÿöàçoñˆÐÛªWû +–J-û +V‘U:*ìç”HfS0'“IW¯.©$-¤’¡Q±v¢dQÅzö…(YP³TɂšÕQÅR%kG«“*ZÙ­`ŠT­¨Y[*Z™6,YT¶zn” êßgèBÈ¢j©²ukPu‹ +י)\[*\™ +T.°2Y;¦v]P—†â¥ª”¯Lå ê×Hõ«ç¶º  +¶£ +% jX’nQU4-QÑ•1QÇh:§Bv& +T2(ePË ˜¥1R5ƒrȺ:*h¦Ãoµ#Dù^¢”7၀?=¬ÊÙ!ë„T9Ne·Lõ e$oywõ)¬Øsõï–'·2å%á·ãžläœuÁK’Í‚k.x¤ì˜VfAYq»ƒ|îùâ€<ñ4®q”›|æ]íª¨–ÖBÖþYSçÒWÎ\ª½©´µ„EYÚüâªL‹"À’˜6ÆLkYNWe».fÑlËÙ^Ùÿs±_Êjٞäý2,á`)VÄý”éhq{²´˜V%?Zæ÷)VíÃeûÄBŽ/-îžXΞV¤Å}ê¡©|r‘ýî#ÿ8^?º%7u®µæDÑ2ZQ{j±¯&+Åþ:[1무¨ÖÚò§°Šº…Ê´~[të"õK±Úe}Ó<¥eòRlÍÙËlåÔËöÏ:ƒyicâUՏp˜;5|iá§Xð¤#Üèj9ϖö ã¼çž³à1ÆghK;Îcp–÷qiñQ>ò²âôr9×øhNÑìþ£|â‰\aŸ<²«/Å]ýAfۅáV»ÚRé(†,Fك"NÃx+ŒAÆ¹á8Žtg<‹ûø d9tԁ(²Â‰,g ÙâJ†3ùœîdu(H¡t*ã˧•á\ÆfR3\̐?éf~ö]ÍR9ÝÍ[aOgîtîDJ„Ä Çó(/Y:Q„ŸEœ?¥z'ìãÜ\ÑÝ©ìú +ÿpJÃ-=&ªs㞦ƒZ +&䪶Ê@g5ÜՐݝÖYT™®ku^ïȜ°Ñ/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïåO=ý?~Ws8 _MìI¿ä_Ó&w'£ìM +ˆÃPùϾø»O©»}{ Í“(5c·Éý‰èÓñ×ÙÚI?¥yDMÅx(-1ça”¤8د‡>Nó´•á$tq¬Ý}rKú>(µq’jlû Šf.ª;›ÇØ͌´N9F„ýàï¾i,œtÂiš×úL ÚÛMðY4û.&>˜…?kc¢[fí`>‹Ædúâ¼h,vÝܾÝçiðærH'9„Må˜æOÐus‡Ö¬½ü<ŸŸ?º`—µÐÎö¬â7 ó,óïo^¿¾~P¦ýK $ó?:ë¼0†9«ŒææKÆOžµ>[cs£¡&(bzœ ë O5ò¢jËÃí‚æ=Ô&g§<ÈÎÉဧÂÁ¥‡Ö)m[gЄŠ,žµíª§IgØKuyì$§Ž@‹`ý9ŽFm-·±±?Ð8¦ˆb•°6%C'(>Á +4FaÝíù8ö¢A^< w±v\úÉޛ¾uÄWWüNOïÆ?úi=—ü™Oä3ƒñA*ËÂGYL|™òä.H]QF’ÖNÖ`Gé*Xï,¹7YGÙP ×°@F˜ñ¬s·àŽæ15‡%3{f@ï«QøÉؔ'áRܓ^Áê¢Od8¢3ǝb¨‡£!ƒÔñ¸?ßs:7ÀM‡nª%Q½ÇÁ¥çH z¢(IgšFO)Oo©NËìQpº d]ek…bbU¾V »Êؔ² œ©ðLÈِ´E⥴)myûl!s¯¤n“¹± +„“rw‘¼e—-eo¬’Ù`;ŠŽçî(yˆg+yï(yŸC䒹WÉ;4’w2©{K©ûŒR·Â?«¼=6ò6dm—¶E*?£Ä]äí}‰;šÄM™Ûåí-enJÜά òfÐä,HwÚþ¿ÏýßKª’éŒ3³²¹ìΫó®ü«ýÛÐ-ð]ÔþÜ»Ù:8 ¾þÆ¨ T::8^MâÂ8wÐÀã H>Ù՘®ÿU·gýïéÂô~f0ê’'ŽNÕH]aÔÁLû“©'sܪ  ßw +xoÀÓuÿÕ}(Yï9.OΡcnÿ:ôïåñ´÷ Ýz­ñ½wƒ}kºßwî»Gw¬–û?µ¯ÿÝÒ¢ûk(Çxöpÿ„Q”ŸÆ•C£usvñÖß»Ã×Þq=&}〭#[G¹ÎÄÒ=±€Šn@E“D+<´C ªÇ äðÞR,8¥ÊžÉN&Šß°7!aé=ꤸR°`…ë]ïù›ò~@w5›XDˆS7¯AÌÉMÍK se¶Ò™¥Å5˜ùlf>¾>³Ö§å*••]Ì-Œ¹ó5{a¶ý8í`ë«W×ïÌ£«XV¶®ä‰Ge]ÏÁ`vÊåÕõYÖö¹ Ù®ñë:—"+[W{²?Që £<™¼]Ïu¤ê8ç.à>püÀ!gÖ:|a]»Ì†=³÷^€ÃÁ@‡%è~/èAÖá^èà +”8b?ÂÀúÒâ¡Pˆ´rpN+÷çñ€ˆ@4í᠈þ‘]tl|p'mwKÝKí~jv՞!ëd¡4À>2%ÈýÐú…{d¨ÿ]/,,Ò6¢p)Ø)â<ô1-”x©ÝX»>WƒjøÈӄT0ÝÉ8‹èœÍ ?º­Bí<Õn2ˆ¤•›÷ùè&ô Ò„%ÂB’œ +öpß'Qð‘ø¾6ÂK›ïˆ“<Ú7V»OnÉLA¹ ƒÜiþ’£8‡š¯&¡™tˆ­ù$Æés3Ч6õ¦›¯ï¯~¸yy} ãÿ[šڈړI$cDÈۄAÏ_+3FcëÀ”·¶Èړ›ò æ#²§6ö`eXE|i-Tñ´YÀžú$ÆnœNDp^LÃÇ6ðƒÿ$!ºÇÐÛ¿hŠ«ßÊéEzn%à6059±À·^|^ô-ƒ;C ):Qt½'¹vSCCKˆo«½Ôp^*ë0-°ÓC­º +YUëq›A¤Õ€º £\Šö¢6ƒ¹Ñb¶&iœËA¸P0–!\Ù­º¨æ˲¤úN8—ZŠ5a[ä;1Š EEóÁPæfΈÖl!“ö¢ÓhYÊfsÐb2D »Š.-¹;¼ ¢%K!SKð½Ô?ÉKörêe[‹´¸kJ… ,ÝB-Nµ_”Ðß³/Òè%.ÊþŸ¼*ó"Âf:Ý+»#åì‘âÎ-†8Û».\ТP Ÿ£ n®áÍÉœ·uÏöËؚ̺­¡Úؗ²՞°ˆÑុhì՟=[lÐYcuË^­Mö‹î™‡AG „δ¥žÚÊ>§] k9кm•Âª¶åš<ãZ,¾ì+ªú±OéǶy$´§hõ,v´Ló>ìh Ն֙ -҂¦~ëÙ½ÖgfðK(nW óÙmhôWӆö˜Ïºz­çÆ~¶cÀ5lÚ熑tµ¨)KõDU¦"…ŠçZõ“ŠªH Šâ„÷3.p?-âgÞÃû,¼Ø ¾Ç‘=¦@.±ÎÉÀ–a3¥–ä&Ûh²¼€ˆLßÓ_A4dgÆÜe@ˆ†„¨ÄTC44Dµ:›DŽ*A"¦¯(CU¶·¥øԌÀ%l¤ ™Lñ0¥y©-•˜Ýþ@¸à±€Áf² YÏ4¶¹U… ×2 +!ö@âý?û‘}ÇbÉ€ÿÝ\•ó)ïÌS“—–€ÃŠ!vY´B‡DúÍLa?ê«%ÉíFkÇG<þ6†?ÞÞ^¾¾~¹ùÞH›ö†ÔÖès(St¥ÉÂÔý×$%̀ܮá¶Ë K ­Âpº€×0:9¸vÞskVcɸ§`•·/É ê7¬¿bˬXgnþxjƇG Ã²þü«>è­·öÖ5áB;7×ó…™köÒ7<’¥â0ÜYƺÎÄ2ŸÓO“'æ3e‰9ÎQ³ÄüäÙm~~ëå[/œaL±C²ö!©—ú}¢ÉýDíZþq˜q~†¶ÀE5G=Iµññ“ym×æ¶BGÎü5¿ iˆý¾#&ž2s_ƒ ‚EfšUÏeÿªY'sÇ*üMsØÉ8üm ŸL4Kž5Yë +ü­ԜuÉB XP€MϾphÓÖd ¦E0A4“Ì2˜ 5̜Ï0á󌂜S~F3Ԕð‚ÉT¨¢TU=¥ü1eŒjYQҊҶt6Öx™E€šörYd {%,ã‘—Å”ÑZ¦'•t¼Ðw}¸ä+ þ´r@›Ü/äñËÏ-«ÑHE~›œ«¨Ô6PrH‹¬™áh‰2‚«t–‘½JJ¹di Í“h ž ziN¸¬`Ko®-KxÓ2¸Éy–{áM +²œÜ8,üHxÔ¶ r2Îd¡NQáÃ"à)zÐS)Ŭ¡¤Ec5ex«¥˜VªÙ¥FÑT3M¿.D<Õ”ñH‰{…ÜQZœŽ–þ•#¥­²aW>¤ìY–EZ|O-OnñɤÅÏüçÿŒá(ÐIÎ-"R 9Uç”'~›Lç(ÙwÁOL׎²£–¡(ͽ -ïÂAûq‘wW]M¾Ýº™s”ÂS +lû@ÈäA®RøJbZHå.§ ΢6ø5o©üe0‹Nå2ÑLŸrZ7œ¦ü©ËuÉgà¡5Lªp•£\ç÷Ž”Z£s¤÷ñ'/Òâ#¿ýˆò8×û¨òs‹­?0.êÉmq B{v–´°™eˆ99ƒIKMbË6Ê‹Ö µ«¹©8Ü'³j®¢’ÃÆKˆÒ)mZ.?4N·Îõ ÊOÁ–™9¦ñì ºÓ„ÖS»úkbt¤GÃa€í¨O~\å]ÁèQy“pý³³¸9xz;s¤k){¾Ìia`Å-VÔ¶˜°÷¢Ñ¬ZͩՆ–úËZºmþýì@ÙÏY£žéîÑ2X¾ô§•ñ)ÅpÊï/ÓS‹´øäºÿ–ZlÌdg{鄷²|Óy”-ˆ\ºg–7mb¾´Ž™Ò¶4yM4wõ–m+ëMk0rÁÄóÜip¥©MãΘýL£bÉzFW™§—Ω„ð‰DQâž’Zz\ÚÓK×h„g_˜›«¸¸Š{+XTBïN­³&6á´ÉmVÝXta 9Ζ®«â¸ªN«ê²jV¡:«,³e ³åÚMµvRqO=ûbå :æžZ8§sLI‹GS‡œROpCiØSËî)Åîéx9fÐÚ+ÌçùYËÿ-þÌQ~æ(?s”Ÿ9ÊçkñgŽò3Gù™£üÌQ>_‹ 7û£—~ü/é½OØû™ÎôqNŒ€Š² +AI)ª3¾ï¾wàüçtȑÿY›->}„ƒõaû“N¸Ý³¿ú•?!ÝÊo¦þ‰&6a<™ú&ÝÖ#UV-$i8ÓfèNÂ0§C-¬«ÔR:Fh韎GŽààBƒGðŒoç+öÙ +ˆ}´”Óîôl¯ì>¬xKkÀ5þ<æùÙóRyÌ|…Æt?s`üþ^y?Þ¨±`¶·¦#×ÞóÙÞñ¹*³-µ)›vž˜±Ú×l…øì,gm1ã^çvã´`7<‘߸d—ùíNMŠššf)7 –šôJŸ¥Î’ †)+“J!ö™l«™ï.}`n».Žs7øÇ(ÓçkÓb£c7ôlN2mž}@L»~ ÏjHÖ 8g4мÐÇ5`½–¯ùüãóé¬ó0ã> +6{nÎ÷e9dÖ`›¼—`Ó'€EÓXôÌuÖ5!ƒWÀ>ÚÃá¯9 ¡]|—]ufø돀Ž¾Ì~\*~‚À ö"=XØÆ{zøP沏²Ï{rL\rõoþ:ÐÆpp?„õ~0`Ý°ÊûÛf ӃåÜsýÖL¿±¹žO³n™ÒÈ2û6ñ‘5Ÿïäy|O-îÑ×5lÓ=PñŒTB“A–fºÜ¶¯}nPƒ +_ +M$6Üp"LLo ÿ¢ªÏ-‚:2Ò×Æ·¶yux¾£uÆ£6çÑ@dAG¼AÉ{Ôf>jp,ûс¿Y¥àä€ó!ÆGöäÓ!ÆVþ‡& Ymy\O3y°ëþ#ô}`}Tø۔§6ojÛá‡<õÉ»0ކy‚Õ³–ümÆîŸ5±­,‡½ áÒ[¡+ëõgÎ Ü5€˜úty^þ”gù9wæòÜc[srÛKÞϑ;T$Ûú+>Ó +Íš6"u^êP‚©þ@‚)K.E¨ª<%ºóYbIýð[Ôú€$TGz¶`K§˜+»Ú©Äv–ÈÀ¡FzßµŸx°·á‘”WÞce…Ò÷2q°•Õ9Kôù¢ytVr΋­f^h¶½ŒçóÕNò&ƒô‹ «fšBƒ´#(ŒŸAØ%Lž³¬¶(«Y9pÙÔVÖbÞd_0²ð”—Hauø¦‡%¸']ûÞ »a`}¿Àøoºïf¯5™Sý¾-(·cpÉ2ÀX–e6ÕÞ$™ÐÂû[¾Ãâ+†XùÀ] ðÚ5·eZ¸DÑP¡˜ü{Óªë°Î&gm\dÛ¨ïxŒ«¯ùz…Lë\´°Å +P¬@ÄýpÔlyc ¢Zex&xêÈù÷N£df ‰Š„Bí +„=ìtN€ÓH8 L,‚’fB!ôÇß®½ïûÓnûÖ ‚ ‰ýè+‚ËíÛ?¿Ý'¾ÝBd? ´<ôÝLËÃÔu#DÉÙ3!2MÄíÿ£&ÑË"¶WF|ævMd» ÊâÔ÷Lð'£(#Lq4©e'à*áÀ?¼Íi8™Eoßõ³¶kÆ¢O3þ—6ûןϩ°j×ƵCî_|¶0~[ì»0sŠº)ë÷ó +‰ÿ8¬&|¦?U…jãÚÀdXHƔ햅 Þ°PX'îW¸°4K`àšž\Ós;>ƒp@"Žé´¦_\0Úuí…~µO{±OsQšìmÑ6W¤­.G[^ŒÖÂꗗ¢5×£-²{>~±ãÓ +îmýÀ;¶ÞWþZtá¦Ç^FšÁ(S …D‹h¸õeÉÿӕïì ×Xy=ê!Z:2Oû?Z +¾bºÙñ¹0Äô@£Íè)󈛖C§l4¯Ug Éšl(Ùõ²¥±«¡a–Ü8‚ÖéæÖWØ3•Ùá–‘œCeúØÂKÀ>kùð}Ôìz%ë`¹$CoŠ-©,“ýnè%:LÑÁS°ôØ´ ÓÛÿâï6 }פ£ocžCðQ~nñ©OÔ{m:ٞ;Qp­3.tîxó–×7C.(B"„<ipäµÌ/d†ØJ +í9&6r K‚gO9µ[ÊÊåΗÀÀr=}¹Í¢Þ‚Ñ^–Ü^%?ï-OÊÛ_ŽüދÚ_’|ô²õ¾týof™èåz¹y¤Í§…ÄeËM¡™)<+Åã·™«ßݺµ0¼o›¼WÅð^r_µ¦÷>w›: çn„?³l¦[3ƟzN¬b–Ïfœ/š”¯¼ñ©-ã^ GÊp¸ðv›C¥ÿØÂkÚ?kùðèQݭâ¸,ú=øGdφØfB„9,² Öë ž’ÿp™‘¹Ýd?sþõéOjñ°b1QELQ¡ýzYö”œU®í)WÕ&W¥„Ÿ—áådÓãzò¨X¤©‡w0ßRK–ýq¤L8P âBÔ0ʇ;Ëô˜ \μŽ–Í¶C“Ãr»aGÀøNTN•ÕZ¨Râ–yUB¤lh!$AȐ÷ åRA¼æ¾·} éß|‹KÕξ Yï$ Žojÿ[•È‚} +~G×RM©ÎE5¯Õ´Pq­4*Î'ŽÏޟ¿R‹+Çî/µBm}ÿÚ·õµm­äêÑÞ`R’gS°¶+l«_BØ\#84¸zõEöû[·–=±¸3[‡æc.Íý–5ƒ¥^?1»»j™‘mÇI-U¸È×‘ú·ÿê‚ô'µxDå8RLQa6ƒeÙWr–JP£ º€BZô '¬l- L½Vâ¼ÉÓyN˜Ç²Âsã¶NÜiq±ç®¹Ôs ã3žêež§–¹®X˳•g:w´÷t=FyeXÄ +ó¯/Hÿ$->ª’Àåñ!™Z¼úâ6{W¥JÒù•ÂÕªbUA+Yª7™¿"ÕˤÅÙ/x(W<ì>Œ¥£\òP¡Œ“ù,ÌK!¢µA÷îÓ¿¸K{w~vM—„Qö&Ü W9®øa)ˆÑ¿Wå¡éкnz(摸Œ|$.°¶™W1ë+*öÞùx4àñ…}œ¿.–÷£<û©\ûñMó´³àIW1ºº—S +,hh tÓ<Ûú7îìa}Añz}rc?ITá?\ßüÿïØüáꇿ\Þÿ ¶ÍŠò׺”fߤ÷‘×Ò<ûb/mqI‚^’· ‹ÏüNÌeô’¨xG€Ù¹%)¤þ2’àø% í Û&zàS"$v͵ +Œ $û‘1V!þ*ݵ55h>-.åÀ噲L Ñ\î±N rv8ÍēÖÄÇ\¨Ô}®+•Úk |E,"œèÁlWD{×nYMôG×Äû¡/Ó ›¹›žäO‰Z¯Ž³&néƒãšµÒ¬»¨àp²ÿEZ‘Ï'‘¹ü¯Øâ!§Ú¡›àӒãI‹ûï€ær0•õ2‘µE`=ûâc°’FaÕ,Ye…e®­Z=hïgrªËFY&‘9?œFæ'»Sëc¬‡oÕbÚì'Û¿XЋ%ÅßYMò'ã­Æ&úó4gOJô·Lóg±["ó|Rô–FOj—Ñ[²Ê>:~‹ˆ] 4&C꣋½u±Jö“§úyMü¼&~^?¯‰G×Ä2-ØdÌÚÏÿõáÿ¤æ-¡¼øÝÝí7÷7·7·ßùe«º·¿yöÅïÞðwA÷ÍåÃÃõý­hõ§¯~|ûöÚ¼ýk3Ï'ó4ÌpÓ6Ã8žt2;›¡ŸNdqMúƧú×?þ¿ÓŠõԟÿ“üûõ/2›ßnþé¿w›—ÏøÔïQ¡ôTÞ¼u¯¿Íoäò^¿i›8H\6p‹ÿ ¢$Ø@ÉwÒÐ&Î'“Èda 'h-&\Qð[¼Ô˜æ¸‘öòˆÛ c¹`4°0$N> +#÷e"ü #òI'úÞf”¡f)y“iV@®í9ú Ó'û˜QXό—™#Þ3?—™ Øøà^˜ï­ˆ.š7Ò)Ft£ÎÛO„­•y ý‰ü kn’ñíåÛäyQW¦Í4ÊFyéq™çÍ$aŠõ9Y}ý0m҄ÀøÌ¡n=ã19Ä {5ˆ´‘ÁKÂÓëê°'¤1ÄVoB'Ÿ4ËÈ£Lø¼Áàb–Å)çƒÍœ¼ØÉÔÉHÈZ„WLVº“n²<e¨‚,<®î4èÔçd¦EãOŒrOV£ÔÏSÄæé"VùzÏñ¹ïtŸéì瓟ב± Âdy½^RG]`A–§ã#r('!ÈnœdY‚͝¬7QN›j£ö\*ëϞ+ÔáDô`™;o¨?e4ýÁž+¯åÕʋ{C«ï«Ÿþïÿˆÿþñΐ¯Þ¾øí¥û»7?¾¸ûŽgʯïïÞ½±Cäð#¿¿~s}ùpýò…t²>mæÍ/~¹ùÇ8rðÈJ‰SGX•H'3ݶ0µÀGØTb{â$½¯ÞNœ1Ÿߒ±Á>m-W*ÒCÀã+«&ä6Âç¦,\¸îËȵ,r£ŽX/ g˜uÁês²Mµ¡¨Í;a¶ú\¡öÝl8؃PúÉ(Âåpo(úè·¨( Z+vYßÍ)sV¹@Ÿ,Tá@ÜþÕüpÞìÍ'µ'҄W 2¾Ât^/©"¹€¥õÂ0G£ Këq&Éü؏öȓ=Õ:Ê ìËq‚õUGœÔ^&6£¯ÒN§»Ø;ëš]]ßÈk•wövVŸ¶Þ«E‚pcÀ÷:9J轒s­Ÿ,¥vÇ°Yáòy”3ޖà g­ ¯0Üähì{{`p9\…]u#Æ +ãÆÃßɱ$GÞ¸ë ;턋ã@ä©¦Ö Ÿåg3rg9 e«Ï¢Flf9/Dü°çpXYˆœž‚½¼Ì,’è.B^!ËÎ<åôªhWzêdù†B‘œnXAúYTXKÆòœPÇAz—CXö'ÚE©›ÇÏ­FeÿÂ¦é¤ é;vÒÃë%Žã[>8Ž\lXFƒ0C\Y^~¾òÁM±VÉ@ØDÓH!X_öX¡ÊlË0l¼„A§Ú[!ØsúJµVygogõiëÅ×oNß|æ×Ca=Q0²¬Ô(3&3-Kõ¤Ï<2–48èÄÁ ÆâÊ'µš æ‰ÈÛ)ëΞ+Ôt}S¹;ÊR¨ýÁž³·òZåµ½Õ×5ƒhz›âgØý,œ˜r+ÈÃ:P80÷“Ì’ˆj½ð|9†ù†}°…… %Ù¥²§gl[²èf`Q&_V¾Ð'6™l‰©“ÍÒg¸¿EH.hÝTkÉV"¡ F¨=Œ*âτyè!Ÿ’íöœT9áøÖìç@=$ùɈØ>åâQg‚q¥ ² GÔÉ"ZÃüÂjƁíÂW³A󳧕¢Ê‰,"{n*Êk¦8Ž< ©5Ñ>æ>–G ™¬%Ȃ„ÆOÀFŽ2U²;€CÀ'ô˜«ò²×´©$™ä“0âX’ÅÙÉq"³ †c³OÍ0 ÌÕÀŠ¦æ –'ÒĊ ›]V^ƒÝܜ³\}MÀ3`°;h ӐFèZrœ'ÙjàѹëË~’ŸÆI^Q”â š…¼ªŒ¤ðÔÍÜé ¬ëþ±]„+¶GW©HE• 1S>iwKÊ!ÈÜ{áçH•S)¾Vƌ©©„©oÚr‚õiO:Y†#ˆ’Ö´%âì$Û¨éÔ(ö¨¿WôðÆÖ_Z£Ÿ9L ¼‹ƒIý˜ç±¸ YÔl‘ã1°¬…9.("æåÁ§ÆÉØk9nšÆdƒôøUíÕ(öh8„Õ·å@Ú¬iÌ)Ë^ì¯çù'¬¿µÙ7#Q“C–ž_/©MˆØuA‡{Äëˆ(ыº°, Á¹²ÕjSÖö†œ`ý]•Å§Ô ë loh°¯òþŒ`»¾¼–W+/^Zß{$½O2pA í`ªj Zà~¢P¸= ÊEî´´úQ¤7Qá–-H¶"€ÍnÐRõCVS1hA̕õ6. Zhma"0ƒx)û+­ž–á! ‹Ù)xb1iÉçŸÀ´î&-y¡…E«FH€¹X´À~à cP,Z䌘ù…E‹Œö+3háPé¦ivƒV©ÐسÀQÇ'¥½·º0ñônÏêÙ yž–ö,PS–¡Ø³\v(ö,l;€–ö,°fœ´dgÁ ïö,ì4¨' s–lȈY)Ö,a yâI@c–üF¼skË£]5fI!¾œ;qv56µâÄ'Çcã C–€(¬¾Ñ`cuïsi>>¨x"I¦êf(ÝsK–:0ԌEKðêŸá¾@ê`g l Ù}8æ ¤ÜÇ¡qÂ7Ê@»?°§ÀRÉüTÝ¡Ô¸?’«œ[Cã1,El¨A9òô»ŠK°Ç™+“V‚´hÄޝ‰ô +âóÕïS܂Pþç˽81ŒÝèL±x©-ÍøÎâ_øˆ1îÞ*ÒR9·Šsp  '÷Õ;È'#(Å=Ãn]FÅ=ˆör’&Ü? )õ÷Ê (^±#¹‹p dÊ;¹p»ìéý3'!Œ\¦K/!LOQÝMu”AßìoÓãŽBTá6{½"g9ÆX(Î9XKøMîÄsÊÒ]ØT¤7°iÊ~¶[—!؂H´sõB7¦uÙûsÊÒkØTô—÷ÆÖ_yÀq(s-oÐǕçF.B÷Ñ ½œÃ©¯®¼BXºk5ó 6-9ź\:1Óvm ºM?4]aé=¬Õüå½¥õWþ‘º„é™ß.ÀY8ÎM*‹ø½h8r;óÉA…ŠL³7)ÂIq V[œë4AÝž?¼#֊ð R·‰8¿£1´>‚1û£1—GåÔb¯òh`"‚‰BÃÞ§îëS,s±kî†Ü롄¶`‡xî± ØB…bzNV¥·VƔ¡;Ö¶*¥kØP%ˇP˜«Â*†~lz-”«2©|»Z¯|€·µ÷¥ï‘‡>‹‹Þ%.‰¥ödî⤆_¡a×.^ê^„'$VnjÚ¬ùhq@ƒ¯è²sJˆí"sòXYñTq,ëÓ<ÕNYzªkÅ⁸+BK ©Ye•Œi­og^mº–ÃtÜ]=@”ÆůWdÞÃTÖ~Æ/²–NëZ¯ø£k[•b.×<‹i"ðÆ dӞW:-„¥ïº©çàm­¿ô's_ƒ£ ÛÈ+ÍÓÉEót[dÑ<±LhÂYhž`/¢3 ®yB?™svͶ ݪ§‹êé¶À¢SÂ*ž`]¨žÐ'»FA…m ²(žåç…ÞYˆ®vÂlS—+“ôN8ŠZ'LgiÄÛyE¾¢uîèËդƑ¥ÖYÉEU¤ˆöÇ¢Lâtè/µNڙ ßԊ}á—Þ˜SZ`C6u±6VTÊÚëB÷¬¯W+ú—ycëo=î ÿ$Óü q+8üÕ¯Wdp$zÇâԜT#Ánë ö8Åíó´³6!ÀXsŠõêŒÅÈ3Ì +cÑÆäÔ675½Š[÷͹êý¼±õ·þ„¾ñxT=찃U edN2ÊC q} û! /Ø}J[G™­"«…^3Øù‡^y«ˆ+‡:wPÍà…à–îitÈƟ)Žp5ûÄÑ'J:™¸^tå}{ꪍq œ¹×9“/V{‚¨IM3lÂ}htÆˈ•u3B@"/ôðåÒ)—I}ŒDôýöp³;>TôC9K½÷¡ Æ¡W§¹’Eöù”Œ+‚*Êd걃Dµçgà”Êښ°¹²B`'\?£ÄàÞƶų̈Ð(yñ4Íꮣ]–¼aÏÕ)×®áÛǵPx»¬Ó +“l¯F·äþŠØWØ`-‘‡Æ4èw%+–Qk‰ŒOBPµàiª[3AGM½֌¶©B°.íÁB †®- z¶Ö‡æ°mÞÌëùÛ{[ëÏü É!Ü@ AjI'@8ýØ+’!—‰ù"!žtCqÁ`}å Æ^o¨ºÂ:¿`W„R:Q¾ìq+­¶&átÇ"WìTŠ†ØEÝhdHx‡°pkÅ4 ä¬]p…*†c^ȐiE§TLV¨ +½N‘TeÈJN¡È©æ瓆NèÔM 0̼´“k`hÔ÷ÊûÊ?´ÓÜÙ§ŠóŒ´ «±ÇŒ•ò=ìL›[¥ |‰ï E@?u¶©†D§¦ƒo¹SCUð^¹Ú;à΃i‹ šQ§D74xlPû$Í©þ¤2—ԟм٠ŽíS–´©MɎ¨:/Me#¥Ñ¬ý4( "X-VloJ ‹× Iõ”f@_äƒ-Öýe¿Ïm°<ÛÃ'Ñj÷zE–ã'Óì"rÌÍøFy#¿²PlsȀ'0ÖZQβØ6e?‡ÖNXˆ7®õ›¦¢`º«ýÅôóŠþòÞØú+¯ ¬_úß°òy”½^‘g5¡~CÏ qÀ²œ…ç9Ž¢’šŠ²y‡¸hÌ)Ö«?jä¤pm î]Zk¯…b–׫ý¼±õ·6ã Ó3GœË¢N‹ùzIÆ;)w­še0¡°¦L‡œtÄ/Ôz#Ò †¦-§”NíQ'CT¢ë 4@¤˜Ò§ýlœ£¼Z©U?ª4´÷™u`ó/sª§P<Ä y„䬸DÞÔ¼DÉVف¬¡PŒÁnc}!º6LSm¬¡X¯ö¨“ˆ‚yÓ4·Dˆm¯F¹*/l¯çý¬±ýomÆ!À%=(ZKôŸâÚs2lzáÁ!»iˆ„•Qº +Z¤¿©R®Šôã4µ çÈMcN)½º0ad3ŒÔƄ«2†Ë;5‚9-Ê˕jõ³JK{ú“ ՍÃ$ȑ¿»ã<›˜w¶ ÝqLMŽ¬w‡Õ#dwÀ;Tº¤ñlzL´xä}¡h Ÿ bÞ! B–rÌ;ÆL=¯ôŽº!ºÉ@ï4·ŒÓXQõW`ï`ºa^ÃÞñ}d9ŒkˆWÇ?¨Ð-¡ïІ‚*A +4ç©x­ãѝrå㏓¡©hÐö¦­B)ºBeä|PYmKú¥ÀÒi¡¸üÇÐÖóÏ*M­¿ó¸êÿYpðtÏ Žw­dEÈ9–˜¬¥¹"ӝbC°7 ä^›r‚uiO:Yþ© ›¦­dæèÚijÍÖþr^Ï_ßÛZgÃí`<!ÈZ5·Hœ,r—<ŠPK@”ð °1öæóìpá«Sl›Ã§¾©`-ÏM[…Pút–E*Lz³Õ–°¶Æ¹í²PL,ïæýý½±½ý mµÆÆ"Â|@aŽÆʀݟÅ@Yj¢LKpݏàiNÃPÃœb¢‘ÆÔzù‰Ý ò…2÷ ÕÉÈ䶐©=F€r§ê5$&[t€«_U‘þÇDP +­” æ ÔÉ"uCÎ5J % 7¡…àë…èþZÍš–œb]ړNî‹>]Ú(lhÃœb–w«ýý½±õ‡6JCAÏÇ6öEZÀýNöìúpJl#d*2‚ ¼1Hì°Ô^b¸¿©hMcNYöêd=oÌ?aý­Í8$=–R݄^ÉÂ܀uqP¾ÈÀ'ç¼ïçYù׊% 6V)ÖëUY‚FîÍVSëìój¯F1à¯çýJc{ßú¡ù³„ ,!q%nÀq8à8XBâ•àìÀÞ­Tk¾JZf; Ÿ¢¬™ª„ YPèëÀº 1å^R™ã4ع>Rˆ/SíØ÷z¹À€½­J±NÝ[mäÃE¿©mÁÌ;ĶO£\åÙ^Î+úx[ë/ýÉ),1¢‰ +¼œÅõeÄQÏ3¸ Dϙ6PF²ê_äÄö³}—ȉIäu¯„ˆ•œšV +ÁúrÍ_©²½GºîK;IÃÓko©÷w2ª¿´µ³þ²Ö÷;¨n=#È]žN•!ë&uÖR㚱zƒz€©‚±ÝYc¯,EVEBr‚õgÏ*– x•7„ ¡Ýû3‚;‹õµ¼ZyñÒÐúû~ª ɹ3½eÂU’¯WdȆ“ ðQAåé•>º Ó|¡8‡›­¼^ƒ0·m‚õéüM©I1îMKÙ¢øk—¹ÉuÒ¼›Wô÷÷ÆÖú™Dõ€QàØa•}½$â76Ô½±ŸüC}  gp‚ɪðð±©Ö©+¯i©PJ—ö¤“~Φ¶EkQÈMŸ…b–w«ý³¼±õ‡þT2xêdI}zGºTê`È x—Ãî5.PY/$…`*aÀ­h©­‡m×Ïm[N±>]›42œ5€jÔƐÀ¶ÏM§F°'ýå¼^yojõ™?Í¥¡§£Þ$âCÊÄv2ÌZQ…45)"×’(㌠3sОÙ•Ç¶bgƦژS¬WÔȃ2‹Ú˜PD;›^ ÅçB_¯VôOðÆÖßúÙa`–‚:ü~ÿzIÍ%5ÄdFKIjPƵ•bÂÈX²-zEΐ ªiÌ)Ö©Û{”,CÇüxµ±¡Ó©Úk¡\•÷Õ׫í j[«­#ø9#äÞøöý›¹¤v[@»q#Ъ »å³»Ôç +ìgõם«’+ªȎH ԝ094»¶˜nÙÂ4R…t#k'pƎ螐ƒïЙ.{¬xnkéT.pnxGˆ¾[ ¹aï +~ ¢ÝH\f¨Xîd>ÎÊ-ýiDCArO¦£8{îv’ǝ€V s…q§Y6uÅMILoâ†)ÙPcâîhÙW71@°X.AÜ åe£¯Âeó‚áޛù=›g† œx¸Á]©fTGÂ͔\6âéÃ~;Á=ãS¡&yÅléNÙP%´PêJ5ÈumÈPÙµ¿½]_«Tó·†ö¾ï= OC¨ˆ2:Ø°€n;¹@·gdёŸ r>þÜ·áá7*¸maðrnÆ +Ûf> ²ÆŸ ™‚ÚŽ³væXlì ä²-[~fhT¡$l`ØçZcµCKê*@»[!³» +ÉZ€«‚È î¬ñØÐÞ+{°7)käÃ2©²v1FÅö"Òña¬ ìÑZY@° ÁAB´ñuì50ß%ô+5sE^£ÎK^cÅ1šx¼NÙ؁á®1@´$Ø5SǸB] ó‰=3è†kV+˜ëœŒ°€\÷Ì?µª@®ëâ,ëýåºÇÀ»FL×q]©†’f2©\Š™l¶Æ +¦ÔçÕOÐMµJh¡Ï•jéڐ¡¨k-ÚÚßʈõµ­½¯«ßC_Œq´®Ô6«ºƒ§ԐÖkrYS!Ör>Om3NX¬ µ@¢KCŽš¶î–àj{§B¬/mÍì}[ýìÀxìâüzA-PhlA\þéhé0Z²Ìª¶¹>7µpðAôòv +ao®TÃA—v (흵pj¥RÉ¿¤4²þ´úÕH¿Åd (u¥øÚ·°i€~b ˜V"Z ¦WÕ«SrB g®Tƒ=׆ ]ûkÔõµJ5ñÒÐúûê§Ã?ý<]ˆí,ûEóp@4Œc̯ºN ãÓÐX¯&¢P ¶æJ5¨³7d`hﮅLûK•JåKJ#«/;æàƒ‡`.ñ¤²’ ¾=岂””s<§<®•p±÷SªÔŒlÝÌ o-9amtjÁ@zC&éý-à”õ½ +¹¾{ijÿ#æ“²~}‘qóü«Û‡7àà¯Ë?½ºÖ÷ùÍÝՋÿ|ý£õ»Íóß__º8çìæõ‹o®ï¯®oš,~l:úïÙù‡›—?”.Ž½×7÷×¾¹þ‹¼Ö«·ÇG¦yyÿ›ë·íË­þ›ëï^È\ÜßÝ>¼·ö·woö*¸÷D£zô;ÿþúæûžú¡¿¿ûËÛ£3{þLïv:¿}i?;xÙÓºùó5®zâßTó-‹8ß0« +‘g:eU¹¦%ë_‹›ž nþ¡7>•.K¿µèW/lr²¿àoÚ6S—MüUï|¢\ÎÙQG\¤-'÷C§—wåòîq™<'jÌ6rGŽž}T„µ k<;@ùf·¯‘À/%ÁÑZP>rŠ j€7pOl>Óð l¹&T¬JB½†WËQ!« ztï„ä0=Êñ.ª="Óù½ ¦JzwºÙ®ç`8Ž¦†!Ó'‚ l|¬#uŒPÉÑzŒ:%äf%„¡~Þ4@‘‹¶fðv=)ƒÀç!ç²~›œês Ìi1sfEJæÙ úóÄ<Ð"ÍÊ·µäqêõÁ0ÎJ‰œ•ˆœÚ„±Ñ`Ø<ѲP9< ÐSÀzÑÂã’*›ã8•ÙCJúÔ÷¼„-j°;¾ÉC¨|Q Çoeˆ]ˆEä óZ#»×¤fQ­ï‚t¦®YâDÓJÁC%¦Éâψ '%ÍÄI%³š€gë5uSûº·I?£ïl¦Þ ²C0I± .¸ê£#5á÷æfJŸ˜Û‚Êl½Î”éöÈ[SPU‹¸ÂêMC’ÚÐ;FÏë@è„ $}¹‘F«„ì°t“ÅÑÁÌÆèh·+«¨Ït†CÎHšGÌN³‚‚r£ç‚¨÷”ÛtAZ[`1JÔ¹5³mR&Y` +Cg#«å>«P'Š¨‚ƒqÍ#)1øUæ*¸BéaBìWàÚ%u ¾÷DbñO°vîüÉÙfx?¦ö ˆb†;udf?ù°öuòØÂNwù 1‰ê¸u¿XƒŠÃšçÂÀ”Ï)Ú:¼rDj¥Èq“þ<º[^Î1a<áɜåíæÑR à;r$ +3Îe +™)£„ÞÀÂ̅¤§™éV,̬`jǓÔ.ðN2.˜ú–¡÷¶õ–¼„©oÂÈ8h &Å4%i–í§ÙGf‚é=£‘&rêÐ ~)3ü .p9A¨.€ØǍõŠÝѼ’µ "Ù@z#³c‹óˆTĦN÷3 Ϝ5ÑØ$~ž|L:ˁj°ÇD¹˜›Ç2°6½7|Uæ€ç‚F0£˜â j4 ‘)*:#!´=ÍÊÃíózí/%]¡4 Í=oñ€\¡õùæÐyOP±ù&`"™ÌÏ4!ðå¡!ÚǺ4²1挔Þx(£RÈ .€v=*‰Æ` K]Ɍ)뛁ʚ"`ÚqCiáJƒf/€NêÕI‹Ci¾Èr^a\®Ì T½âNû7zéHÄíHÀű•Û§”™I>åYÐØlx gŽž²l…0Ï5\ÊNMù[#4a]‡¨€k{Æ^JÌH ¾('µrÌs–éÉ8‘guïei¶+&$ô›1$ÌNjgu²ÅÓÓoO³ó¹S”UŽ²J‘8ãÜ[jй –ñ«˜F¤2NÔ)(sqbζ&ÀÔHÀ‘„Öéæ³&&£Ž¼»n6‡ +­˜Å‡Émõµõ¶'¤²qJ?NV—I¯Ø˜q o㨎š>k¶ñiª÷ Dý¬;uËðŒKÆ/ö$È=+#e£ÂøpOo“Õ`àE©€èòô˜j×h‚Ù¼]r=}bâ2RÉ/Hèð՛<·X¯üڞ¦—qe;-ák鈽Ch§Ê&|*᪨zî–j¸ç{1Z""¤Žv+,]ylJ8Kf}¢ä!Á‹6YBþcÀyœÄÔé +DB=N:ðèægYñŸêýè…üœ’¶Ejb¼0bˆÓTùH3ØÊ { 5}`8’_‹³ƒÎ¸¡ù9ë ºH+zEÄm‘Qí ±‘WNÈfUË‘aTž½fÐú°ðÕ<Ñ0;f½V&w2¨x®óË_Øɶa£¤ÏQÓ¹*ŸÃ,…QÏJûgÐC„hù"|Ï tU^OºÆÙ9ZŠ¦ kWD0¥68d˜5'Ö®ˆùíؗäTL¥©.T2¹‘¡¼­ƒïöœœ}\êÁЧH¾…À<ޒ²q†^M±WnXHä*]š51×ôFK4«tÏCµS•Ç# ÇS„Ÿðbâÿg}'NêôóŒÍõºxP¨9˜‚<ÆkÓ±aŽœƒ³9Ä@Ì£ž¡½VÉÞ231\]xA{“ýÍSЫ‰ 1â#[Ê%nsheI^%‹·½pǀOàäT˜çcI†ŒpS{oZ„Ž6ÕÌßǝ† Õ^ Ìç(@yþ܌5–«‚@@&ŽN¯93r_ƒ=J£79-vúº0ââ}É9fMDȌ6àÕàS:˜"rNHAF/c§­ £á…CԘap¤þs¼rÍÁBÀAåEZ lrIX*Knyڃˆ)Šš™ÏXk a`´#' ÙG‰!À¡šbŽ'(²Ä)ñT¶ývj65’ño ÁRG¬œŠmú³-h¯¼’©9ÅP ¼‘ÇãîŒ +ÛÕx¦¸•ÆG¨‡8’ÊÊ æfS‡z#©êóå22šQ+3ã(à`R>@m[¨¡(pÔW@ ƒK<'ò Ÿ?‡„h jFÄ &E38AÿЫƒ&†„áYî&C Ì•®ÚMF؉L9ÊŒ§!EŠ­°A&Ñc‡ÑÂ@SŽw‡}‡Ì‚°åLÅ(žÕ3d3=×ÚÝì¡ ñ™T,I˜dE!Åý<ªeÓˆØ¿fõ ñ¶r~¼'µ8€5}LTˆÛM³®@*2]¯Æ#ܘÔ+à~€õƒWc…£GËㅓYY9¸'âóÌ…U8ÎL¨™V|mŠ²EQ+sm`ÉG /ëąۡæú%3 +_A¾qІb.Á¢ï™£ž|ÃX´Š H–2³¾ j1ib£#øÊU +y„i¢À95èÕKœ:ŽÞ‘´± —ÕTBÉòفÀ܊ɘ(˜Š¤Ê™?¦Ç£%@aB_¬_$7åPâxœ°Ô“ +[öä9\T'ƆÌØ"ÕO”<Õ!ýtÕ]‰<_–ê"•KÚ#,çò³«G¼NÞ+A¥ÓHÎõ-ëÏ©‹PYˆQÍPÅ2ô¹$£X ލ)º âdຳ[AµÈ\ò‘7Ö*bRä&tú%ž¯ª'#o€Xõɤ5g?¢=)šF»ycȍýä)öšuÂxC§¾¬P(#¯¶¥ó+:G8Pã¼|”W+hy4ʬyFFß&ìcKB»¸"ÎôÆ z䫝’™úy:视¬’=Nzê+#½Ÿ MËÒfÝ¬ÁlK;‡áü †Å€aý‚4özÑFß zòÑib:zk1òŽl1;€i¢&ẽšSÓéÐk_r}Ô£™Yßñ—ˆô Qq©”WíQ`úg“M’fw +¦GðhÆԁù võÏkjØ`Š‘ÙQӁ¼Æ‰ô1ÞȽž+Âõ^#£ŠMå…Ò0Põ133l¯¢½.æaÔ4µä¨ /"€_gÅíëªG¶­”œ>WÈ\l,$}TøŸ†OÒMÊì7ÚS}#ˆrPÇó%&጖!¨ë‚"«™`Ä nƒe}ï{š!g ÿì±Þ-Š›ÂY?©×åªØܔMö +•AR´âêbPzKÁCK¨?9æNÉ´ª±âÕçœÔÂU²€Âݜ h¨ÆÖbä#C¡gâÃpßÁ¤á¿<°/؀YВå¶å•™Ì±Ó]÷±[æì¶Í±s̨£Q{3–ÃXȳ׫R›î˜8¡I½i2ûl1¯³ÉZ<îS4 +{‡\?û‘·LIŸjYÂðĤÎM߉Øíْ™OôS1`G]PË'”Ç`10ÃTG›®ŒMkՀ—8˜yRÀêæ;3_±ýœGÞ?ûÆî˜@(˜ÈªÑ +í̹\ÚUæcS]=ðAÀ;GK!ÒkØÙötœu×0µ¬~’‡w€iuš°®©4ϼ²sfp.MB„Ê9ۃÿÖ0Pû^ƒ}'œã³ém$À*‹ô ©¤"¦xÓ M²!»i7L£ÆÓðNBßì+†©1¹s§ÈÕ2›S!"I¶ê ŒI1Ù`ß"ñ?£RMã?†—¤‘Ïc\þÌÝgÛ×· „¶E^„pà¤?ÃwÆd¸»’±ß~e²CrBc +¤¶S«œf£&I˜çÀý{à흑Hè`£ÃÌ«Þh +`€Î$JosÇtü ;£n8>+jˆvdឿÐúI #ã*P;^Òa;Ï +ç|Yü~ÍSy´+ȑRšoR¨A²bF)?’a;‚ @c5Ö!Ä+\v43èJD‘|Rn÷¤h¬Á$2¥öLeG)RvÀvªÞ\ÐO;¢H¼¶N¶Ãm0ª0Çî`Õ(¾({¿¸æ‡ÄDlðOt¼Pb>î ÀosÐ +&e!df.=¨†œ§lòԉ›>ºÉT@¾@ŒðÉ ÷V—è)£§Š |ý¬Võú¦~\ž#±?»N"P¦8ë½Ö\xö$Dl‚:Å÷¤ W/ÈîÏLú&ÜÁÜ`ŅpPÖ§R3Sb +-ø&âšUŸ£uM{œÌߨ0Í̊1Îêó¥S)AݽÃè mâêV¥-˜©¦S¥Œ½2+(µW˜AøzTë°ÛÇ"TŒ?hVvadŸ´ZšøuÍãS©ôèg}2E9[º(Ä dçØp¯ó¾«>h:U¬±¹c–ÀQ=Èzg[Ðä¤Ó\ŽB#mn “ÑÐt +©“"Bp&%ùZ &¡×zt̑ÂË!ùÃw¶¯ 4zxúXôå’,„é%q¤l‰` ˜ö4šx‡Û¾qfO“ÆÍkFܓ°;˜ô”ó÷ºKx+¢=Ç3 „0…ú\)ÔÞNš‡šW5µ3OÙÔh:Ì UVŸÔ;É%…[™ê ~@ø^¯ï.2‹™yi¥“¶``En` +ÔBP±‰k̅«Õd2uTìàm£ù)ü;·‚ŠÓ!vž\d”UC3oÅÔJŸË:‘‡r0ÐT˜5ÊY-zöý­VørîÉùIÜ©fïÔ»Õ® d:ûÑÄ¡ "L©ÃLE4Ï ´Ÿ¡úXZ¯X Äð˜Ńò 4èØÏ6‚AuZ R‘|EÈêÝrîŒsx%Žv‡;¢,2W&\ðÉs›Žsõ³‚ˆá-šã~‚—Ž;Môuˆq×T×>†¹0õV‹¼'ÁÉȬ1ëc!;㶠Xxf]kL FTB|RVEe4LjZ€™‚0k + xM(ÆY¯“q²͓üòPpȽ£ƒ@›t Yì;AH5_ã¬þßÁܘiVÇϪ^_“ÙêñXç3b7Ò¤7]0ãLäå4õfÛ¬°°·we9ŽX7Õî:µ=…A‘e PâĨ8 +ƒÄžDzòù|WL‘4ړ&0ææ1ë0¯kúœNLͦ?Â8„f§áÑc†N Up‘gÞM¥þ&-gz®{ÿïÁYF¯-M¦fA¢â‚÷Áێ"ÄçØd̤1.Ö0©·›"î5PTÓ¬'¬özýd=²fRíªäȅ9¶ Eª–ÖŸy{ŸCGSçÜ +Nå×x¢;Qay“á°ò\PWJ0F0ZšÔR ‘QPà”,fM~E•*•éЎT¿àÏr8 w¶:†w'°»ÅçÀ 5xÖ¢­ )êhÿƒLŒÓ P[pk6?¬ã7©îÜózš©×Njn„QâlÀFêOÁW׃B+c¡v¶têޢΔĄ”'CA† —3ËI ˆ®ÕÐ ¦V7üHpm˜pôö%25žSM\4k[júèLzÀ;{`þÎM‚[M‘”‹miTx©e^!ÆI† éLüñ¯Ë‰nXõm3½œÖâÔñŠ ñ¥Ù/1aÖ¦4ÐѦALÙ"f +ç(j .®Â®º¤cy„ŒÑ•Ghí×Qýç]ðþÿ'£+%ÌâçéŽKdOìÙ¹Dt8»Ì0¶ XÏU\20#®+Ì}D`ᬹ,JV9¯W¹+`¹Ž£è…|íTp@dÖé˜äŽÕÔ Û®ú-×yo2pœ€BrZ!xFÝ*šÏb¦³’‡èÎ¥­ ¢Ê42 ™i«]£tx \σ¨ÚcqÑ)6MÌ)×+Þ{t娶Óqa¡ÕŒ´Ñ0Ú°õ10’‘l`†!!7FÆe­BÖ3OaÜÐæ Éþ-<Ȫë癨 +¹" ¶$.Z$XD @kv^ÙRq¬ðgˆj¼/Y‹üÂîUòÇ(u fñê 0Œ‘Ðw¬AÇÙU±Fä´äŸ4:EEŸ2aT…ÞR#ɖì»{[½À¦g$ŠJȄO#‘§>n­®ÀQŒ&ÎCkcBÿ¾l¨ +»œQÓ"C©1¬z-‘ƒ1V u°S·u}Œ 8Cw2~(’<Ë·a§u{˙pdŒ(?úVæUa¸¯€‘üë¤%`H)rqˆö fŽªX ì”ÈX¯øγúmô¸C47GyVÿ°¬X²Ã¤`J&2…ÿq%Tð?Œ#1LObÒpŸ„yT„ܦJˆ´ô©©ƒÙFf¹S`+ <-‚Ž´?F&—Pg@3q܇Þ6¸š¸!øß&½ðÄ„êëé(Q#(£d–ClÍ.6€AkkâáŸÌ,‰mÎ/™\öŸ]ˆJƒpbê8ô#c: Ð^O‚{ÄR¢ §1mà¹STš°:Å?#S6‘î7ý6ޗŽÝUà?ŽGÜî“þӏ”]ïWþ‚ +‘P;úᶃc™ÀÎQŸÃÆGH|þ + fKÞÎôS0§º‰üt16&ÅaÅ à6¢Ý ä0m9öÑÜïöyYñPo¨Kh ²‹€±7¸²AóäL½A¬A˜• ¨œ)(HjêUÖµç‚Z®‘®žW¤›çÅsd[l¹â6'å¢lr©–$É`””ÔDíŠ2Áþb¹pJjéœ:=C0ÁTÎoŽ®ƒšˆ„¦úŸ çƙÂDy¶“[¿7^¼sRõ?S=pÀ'I‘Ù]½O¬3e¿³Û SV¡ŽF¼N/ £}!Îjè0QÓ“Y0õ2ÃÀÄX^Œ¼£"LŒ‡Ee1`.ôàá/ô„Å à ¸¹<¹FE@íäΓU±·©^uˆtùb£ ø`¾**5XðöãócN”L‘ëhõâ?ö,°87îrHˆº|Š•©€§ +yFº[à,î]´Ôý9zÒ@‡ÓaÊEbÄ~әu"ˆô €Êjj•ÄÂÁ}/$0åjÑð¶& ÉÑûÙ`mâå·êó£YX¾‚À%3»ן¸NTŠ¦K9sYè6«»'t¨²>ŠwÐ2Aeóåïh†€=1±Úë…›ýâKŒ{™û_nžÿááþæöûÍ/¶ÛÓ««w¯÷p‰Êë8³rÉ Ä‰Ñ,ª4¼.dÅ)ô]‘µ’e˜è  MBïYêxMp£ÝÆN«)“õA$-)…ýÐÁV}zé³Þ÷õþ<¦ §œ"Õ¿B1‘cRP‘J|:Qñ3 pԓ™3žJÛë¶ÁXÃь˜R¬>ø‰+@1jÀԇ¬)Gªj¹V$c7*ìbeT\æ?¯wÄ-<0ƒC–0Þԁ5º¿9SŸ8Ât0¼!+’›×T –©‰ˆ£YÁƤ`bè%ïi-F¼@§òVb‹yR÷ `Ĭ«…~gÈj_#¥û©÷Yçf½&›H{Ê98nôNÄØëiïÐ#ÂNè!1 ÷Æ»r1^C§÷íU€:oÂââêÕSC˜´ž²Rÿüªã>e^RÏzGÐ-äa†ù÷å® +Êx]~£Šmª'–4‚6˜Kß,<mÕ»SU¿ö¦íÞ,*´’‹³”q§ ¦ˆõ9Çês¦U•æ•@?Q•Ù£T &ê“þÆYMcŒžœ)o©IN¿¸yÞO£þ{ø=`GÍ°¶2]›Ó‚9—´3†Îx¥Îs_Ò +¸Û5Ȓ®ê@ÊCJbq„õª XZ?ݒ¦í´¢áöÂÜv»xäù¡É< ÛԷ̊·èíÚZ} g\`þwÚZ×N,x±=+A‘ öTVðla€Œ`'G†   =p ÍÃ3‹%2WD†i +„ë E£ÛÑ.meމ¼7æ¡ ªºÞÏô©aö .hú„k!˜Ð3¹öG’ŠRB¼Óax궛­Äæã<ÇC Áž`Ï-+ öó}w¹Ù8$“CyëÅÓp,³´>A]FØ/àõn`Áýxʚ!~'xLî ÖãÖð4Àç{v?ör)K®Ô¡¸r3•Ãã÷ú9 Þ¯K)+t|,zƒ'ÀÆàMºF† 9zê½ð‰®`ò ‹É(gã¾"*F‹‡V|ŒxV­†–vÝ/þæ +‘Ýòk.€ÕJK^#þ&r¸Ǚ˜*;,H2±5`n\ù ÞÆyqøóe0&U…x3¥5@^ÐrLáE朁ð$‚<3kþÅS£ßãyŸûU‡êqY0Ðc|\RžûñVʏ™•t8ˆu™Eõ˜ÐË@k`JSqe•ÿˆ˜Ô Þ_=¬~ðѳG#g°@¸¡¢@ÖO·Eì­Sc«˜æ¤j ùðŠQ[´ HÆLÂù}eŸzüÁõër£TQ‡éJVûÙGúÚɦ7KXFË&ÂàK<OQ¡;¿ÇãV)ªÜ'h•añ@ѽÉ ‘³¹Ü©¨R¾ôX]!Ô3gCR=¸ï1­²Ìf·ž†Ä’©¬¸nD:ïG%p¬ê¥»Ô]/Ém¦ EngóãàêZÅâ²òøû\+&ÂVÔÄ ›“„ä.¯‡êk ˜(­eªe¨ÁÄC&}Mt ÄOû³¨¸Rpt9oZfUJ—P"Ž Œ±fãñ»ëù¥JÔA; ªá&ò í¸çbôpõÁá¡*u>Ô½r¶~üNÇV)pJ(€a«?-ü´[E¨Ê|CŸúâ‘DyTJ ½„Ãë:².“P¨Qóž9çrÿQµC‰„R‘yva2?}qv™P"Dƒüí Ì°ÐèÝmúòͳÿñ9Ûÿ˜£ýwCÿ >þG?õ l*¤ÛÈøz¡?þqiª¢ ü1‚Ê$*®ôãk(Áðc´¾å‘Í>†O Õʊ>ƺü¹ž$ci‹bÂc †uÏÆ=†™ÈCcñ7Î6¨Çø…]õ˜;É%`Ø Gî8îR;7â1¤•/ð±\H Ä;¾!0Ãç»àŽ¡ý>땴cT‹RˆPR­ÛÚaÇ«•_tm…&:QÇõ2bw#×1éL~º$:®ÎÅï¤cfúœe KAœ¤@Ç·gÚ t 9¨°Bæ3 _ÏÉ9FH#Š9F$•¿I9f3§§NÈ1ÕåycC @”I ŽoBpÌ¿ÛޘÆ1&݇)Ï=áÆ·o;ÛݓÈñ0ڲ͋iD£±°sb%‡¦5ÁÆÍüïä7•ÌíTc¬®{2;ܪö$ÒÓôq¾9›ßcòŒY®vžsmÝýYì@ãüñŒQ×Ç=qÆ0 dd§Ã#V +Ö0c4ºÎ:Yƽ*ö´¡Œá^bdËÙ¿_žÉ5dŒÌ?2õÇ¥]ýMzý=P¿cü}öaŒ}Xø-„1Ž‹ÚŒál¡Îb?MÑàã£FÍmà‹qîøB6z1„d¸Ú€³DŸNÀ‹9#‚“¿Á‹5Oªu‘H”‘ðbIÞL3Nxo§‘Æ]í>êy'»˜Syùl0°&)K°‹qûØ v1ÚO!ã½¢‹qٗ±”‚êÃ~mäbN⨲ÙÈŲ>5Ã0А´–ó6t1ߛ .¦‹™é²S;[Ù¹ÅXI T;°Å]Pµd -Š •Ù ÅåßI,æÚéåK°x<–y­¼bñm®xx +Z1ÎYaÅP `V1>ƒCÇeRÒ>êqRñ¸ô©¨˜ï¾dqŠ1™ÂEÞ0Å Äb-”â{ˆè”âÛø“ R|[­bÀðÃÁ(ÛZ» Q|;ª„b”<㗂PŒ¿ÑD'²™`‚OLõüõ$ž^üü•NLL×ù$œ¸)?hbDؑÖØÐÄ,1n%ÈĐN¡þ:têÕ—ùZˆ‚K „\W­uÄ ¶g§#aPE8æ.BÓcfwñ®g4'€…A$ffúJ‰k‡xã_7GŒ°7T;¦Ããºññmò ̬Rí±²'¥@¿»r3êi93&ñ§´DŒÊȏ„!aãf RJú%kY)Ääi°¾Qy& °ãíÇNEÿ>«‰ok[ƒ@Œ_"ñßdỘ7¶ò‡Y2&¥˜Eͳ‰>Œä9–+|ÅøWÉFU»î‹2ՀîÞÁÃ`¨âý2gøf×àå/ +ü6è0 Ә¥‚9Œ¿]iÉHþf©êJFòdŒó«EՋ@‚ùçŠF± æ«  ¿V^¤~l};/NÖ0rîp5 qs'³Kñh^œÍà cŒaâĘaü;ÆF¾xÆ0vpÜ1|Wy6Â0ŒüÈ×½“„Ñóï¶AÂHbõ Žðeë†FÍΗ¸‰)tàöòÎÑÇte7£ l;¨ç†Sl‚ðÁ7áoá×ÛK؈ÂM3q⃡¨õ|ˆÃ—ð`W&;øP6uG›h—ä`Ü¢:¹Á‡¿L©µ„C½y©—¥jò* 2à_ÌI FB¤¶ â4í¼`k¿Œ" š¬àbá6ñ"§Š‡¨`nt•I +F [¿»€‚»Æ¨ä7$o”à0$x(6`ü/ø«ô•Dp±c›xí€àü{å‡1ðÀ¨pÂq“ìWnƒæ±k²€ChàƒËi}½Sy™J¨@\ Ԓhàƒ"·ëÙÑÀø^Ų6ø;ü¬èµ†, >¯ŒrXÊ\‚ ?ìê‰f`ú¾w20’ã üzo86&˜ëñë Œ‰Ç™Tàƒ +óZ’ +ŒQƒ• +Œ[JÇ%¨ÀéÜRØq0ðñ©ìœLàÃÀ¾@#xs=;1jĬ MV4æc4ákÃcÂÁ22hÀ 0°P*ꃆº®\ÜÃË(`V|m þ†çº€q ëîÉF²[\& PoV +07ςŒ[-=·‚èJ"¸³1€Ãà‹¢ÏDó®\²Há!ŠÂk`(08ÿÿN`éÊÿ½a üïå÷ ÿ"ÿOÕRGT7²!fÿ @Ҭѿ@ +Óß[É¿ðO0ø#ê;‚é{#’€Wð/ýk™÷^À¿ñ÷þM£Á¿7¦Ž:’ûûîæN?ñhƒÏV쯝ô3¹¿'õCæÒsý½ÄèÎ\$ø÷„öŠB£ÿb;ùü‹^jœowð/ͧï£ì‘ì×ÿž,¼Ëø"aʯ÷Ä­Éý¥å9Ÿ7î/XnÂ{Íý¶ÕÔ4%h¨ô(íûKüõŒäþbϋ¼àþeÛÏëûK3Û÷ÿñô6±¿üVÛöW´ßëšØ_^àóŒ‰ýå?þ§É+¨Ñ½êÄþ2 Ɨ$°¿|@äÑmØ_dªÄ6ö÷ê`?æÀþꀚcÃþ2CWÚ¤þ3 ˆEPÙ>`0ѹRñ ÏÍ6ƒ¦þâ”"ÿ‚ú˃÷±SÏXÁ þR¥UÜ[,ê¶Fy£þrWU “¿Á×?¨¿°œO臒úKZ.hè/¢Š3õ—ñÅv¿A™¨Óweê/ÃGBQ›ú;^ÿφ8õ˜ŠëNæ/ø“åìù‹îd<эø +Seüåfힼ_èö;Ü #Y¿ z©ˆÄ¸_\§œ÷;†¿‰ ýŽSńý"'¡²’•õ‹XäaUSîu7“ô‹¿K¹ß@¿֜“òûØeJÈ/³&}¼1~Q¿~·s"~›S¸±D )^Þ¿¼êrœ“ñËÇÇ2›È]Š|nˆß¡šL~c¾Á€_ü pÎÊ÷… U4÷Åè™îK +*"Ê+Ü÷¤àh ÷U`Þ© µ4ìZ'ît_jÍmÕTŠ€§%ݗw úF÷e A¥ ûÒÀ¬—S4`…¼Ñ}•ÿ©=é¾JÐÌ·:…úìF÷Åi³DÐ}Ye„BÒ ûâRéˆ&ܗÝ)Š +ò”*Fa>;Ó}y_X0¸â}i…‡a¼/³övÞ¦.6¼/¬Anªuï¢ËޗfV¼/•›ýn‰÷ewŒÁ÷Åh‚õÕÎ÷•–$ƒ_¹KBÍ÷=‹“%àV®9ð+ɧ6ë¥Ñ¤eãûÂHo#ø¾4 D|_° ß¿ÉÅ.6àW}ô%mã1m€_XY9€ß“ìÖëJÀ/ {7¯¬ÏHÂ/ÄêK~a }#ü²‡¬AøUYjÚEøeoØ"ià$üª™Ú]“ð‹>DœÒƒð{’‘)*ï$üRè=ú™ˆß³ºlÄ/ÿæû½"~i­% ¿Ò‹å›¯þß¿ˆŸJwPI¶NC…‘$üJû}<;á—þß]4ôI¬Š& +tw‚ñ‹:ÒÝvÆ/Ìçe¢/¿°xú2㗖ÈwNÆï™ý'Œøå±"ªEPÃLàmˆ_\¨œ±@ür²¦ˆ_x@¬¿Ü¿Ôfq‰¶&Xᨁ­ ¿¸6Â/DúF›ð‹wìn×= ¿çí%ÖNøe‘]Á ü²÷šÅ&üÒyWˀ…ð{F> ¿´tëã dúìö/KŒ³øž7¯¸睄_ ¼¯‰¿áW¯ÁÓvÂ/­xƒð‹£KÈ_~aàĵ~™À„XAç0n>¿2´º~ñ{äíá—_Éq%à“ÇÑÛÆ÷e¦ïî-ù¾L“žgÂ{1B= +ÀNÄ/†;ç9ia÷À߆Áç¸v¾/Œ‡A¼¶a†Gt_ˆŽád®p_v%T™¡<¤¿0yü‰Ñb#û¶ž 2»á¼fö¢³03 חÜg„ BGöÅóžñ÷ŠõM›±¾§çàõ‚a‹åíFõí·¢Ô¹‘IÓÁô¿W¤oÚLô}‡šÅDßçPÿхçûxÈžïshè œ/þÆMÝh¾Ø‰ËsÓ|k]æûz“7–owƒ£@ùv‹€ƒä 2ȗT×z%Ǘ xÈâÝH;l_ñÞÄ㥠†/‚â„ü®ß~89j„owkš ø2,^Îà‹ÌÎ=ø½øQBüލV|/°\M M…„±Nª-á½­H¿²{iå˜ÙlìC¤É½ )Ýêm—RLpÇ®v'·ùUdąís Ø¥ÚKÍ#êy íEÆXmÅìí^ZnÈ^ö¾e®ˆ½Íë¤öâ<@½ßx½<0͌ëm^5­—6ˆ VX/«ÝðršÕ˚8(•ŒêYH½Ù½Ô Þè(~ä×mN/èpÓÛônü.öy7H/Äh\èÄFƒ ¯ ô’(†dÛ +èåpŸ6Ö&‹ÏûXY±áya¢ñÏ u?â÷AçnÃêçEÝÄÁ«›«W6îpõtü½’yÓf0/h9 š”ÄsÁ²ay‡Y;AåŲNÍi­€ %‚+ý•Ê «Ú (&F!Êý$•—«Nÿ+•—È)6ê ?äu©¼Ü‚tÿ•Ê‹ÉŽ¡â òÂ#-â8²¬«h<üÉ‹e¼â`òòœm¥úhø)º³`>Æ­;À î…š‡„ Åýڙ¼ò0ʓL^8Ü“—6;X™¼tÓxòfòD:˜¼Ÿ•/éÃü1™¼ Ö¡(bcòÒÊ,¢™¼ +ᕞ^æXº2ywl&˜¼äfððbòŽªwcCòâÒ¹ú$o®0£–6RP6$¯cÊÓ!’—œvÍðaSX³nÑC³?É«ø€¿Em?‡‰ÈËÞÏ ò2ƀµ[y$Á\²yÓµ4‘—/¤E " Ð'Fâl%ò®ÖâÞ À‘—” ^‘—*û*à«ð¤"Ÿ=‰¼B”±y©|¤váœÊoƒÈ‹GɅÓFäE +V§äE™Yתÿe¿©Ç eUÓ÷H×>-F‡€ñ2JUU:9a¼Œ¨´§$7Å´A㥁­Ö ÉғD‘ǹ ß q-‡æÆːàMø¤ë§°ÎD°Í8^³Îsçñ"ÚÃêIãxÈDI4ÂÚ¥ñ'Œ%Tu¢x;’2ýL/`ûϵƒxa»ˆž‘®ŸÕfõIo÷w±ax¡²CþÁ^ü‰¾á…J õÆàínÛގj¹“À‹Hb#€·;ØüÝó8“¿ÛÛÛð»€<SbünsÐ0軤Bõ½Ë&1P½½ÛÕ îns¦qÃî6óƒ¢è Jú ê.NýRƒð Ýeÿj$íÌÜeúù$r·Zêµw)=»h!‰ÐSðv½Ëo«Q|âÛŚ ©‚¶‹¿áÄo°]¨`ÞÖ.ÔYÈ jhغsvQ Šèv`voԗ&cZ¬¸7Ä.ŒˆÝaÄm” 9y³ðþ®Ê‡^÷VÏÑeŸ×‰?;[¥ô”©Ò ².ªj(Ù^Áº€và‡‚«{»9p`uQ„%ñFՅ_QPuoO:Õř\†óe +‚wDõŒÔE‚³›° ŸL…Kís&×˵µºX!á½ ž.ªjàÚpºãtÂáÂáÎLӅd™|½¦ #†Ý`鲦hÔDéBƒ`ßJÒ¥Xû¾¤;BŽ.þŽJŽ.‡[]AMáÆè¢Ö °«¢‹úÅzMŠî0L1 ºÃq䍡‹¬„^“ˆeŸb·Wô¬Rv†.­šØ ZB´é9’¡ËP:ÜÛ ¢ËVéˆ5Dó>Ã~Ñ¥q¾¢;Ö¢ câË)Š.‹ìØ(ºpuâåPÆ ž;AÑÍ|ñFÑ¥‡ÆÞJ}–rF +Œî'Ïnž1Fw8×µStò= fðˆˆoopM4¬4Ú º¨%8Ü Muq#Z|™Ÿ‹ý˜ÌÙð¹¬Ü¼ä“ž;P\Ææcß๪Œ¨eÙ}»ðÊ'=w&šV|.}xê +ŸË‹MÏeÄ°¹´n2p7l݅>—*2BH1ðç9/&ËØñ¹u Wàs•†?Ïäç"IÀáfã璖R%ØÑX ì!â6ÁÏUrA£ÙäçRtj¯àçÒp‰—«öØ·ð½+> >Ýsãs +d¢ñ¹Ø‚·iÃçBŸÁæöÏe1ç Ÿ¡pÈÐь™ôÜ ÎæÅè"×eèÂZI%@ü%:AÐEʈ!¨ KÖ®AЅn^ti€Âu#蒉T®æì(HRòs¹Ë~V~îyÛ· ~.ʂ¹( ~®úÁoô\fÓNùÃT2òœ«õOBcHÈ÷7z.¬ú1ÓsOB®‘ô\ŽÙè¹°V<ð çr3ÞÓsyäSxèIÏEr’c]Ðsñ|)¬ |n6~î´ ‹Ã3¾dܓ*êrí]$ué©åfÅ  èNà +ÐMktO‚Òà& ›/æ†ÐevvL‚. ®‘G‚.ÓkE¥_S8H+–vÁÐer ëš`è2C†@óÆÐåk5-º,æF +Ê ]þ+V¢D—x1¸ÒÑe²PÝWcÐ¾Â¢KTãqJQÒõ©¨y@tùq9Ͻv©ô" Ñş éŀèÂÐXš¥Ê°2S]Üǖ/¨.OQ*×]怙¶Š.”w¬Ü)ºxà’E—D„®F²¤èR††Yy£èRۀÅq`táþ)±]¼„l¶cta&Ü91º´àÑ$F—jó6Œ.XcUù¢AþÇ:ÞÀè˜؊ѥoÊ­1º„ˆõÛÙ,PÉ!lµbtӘ]NWÃÝmõ$qÃØ|pÃè¬×Ë]>HŒ.7‘ìdÅèÒÌG]qغÁº¢[ ˆô±St©¤T (ºP®püHŒ.áÅ­Ù'F—áaVvF—ÝXø¸üxå+F—+Ÿc‡E + ÑMÃÆНVcÐ¦$:éò=üä›ÿV¬Ñ"Çc!èª8ÿL€.œ}®Ö‚ŸÛ4ÚìøܦXFÒs›Ôä Ï}äììܗ±‹”+裒è$ç>Ñ®rç>ä"/ûtV]5×Z֝šû8bj.š©ˆöâ~RÅ©€•™ 9ò»fæ"¼†hgÀh‹_1Fø€ÌE,ðx—‹zÌÖ-zt¥¥ËÅßÊH –‹¿Qg¶±rIF§=£r¡¸Çë“gç&å)—ùxÔ¢)AMÎbz½8ø‘-œ\臭Ò`{ þɽ®¯„\øHþ —=ùŽ+ù¸€ "̽ãq/ë%’Ž ù;¸YB ;VÌXÁƽܼ Ù¸×%U֎ƽu²ã"I‹¨z¼1H‡³ ƊŭÃÂSqjWBqàyeâ"îQ'U7šŸ¥¤iŒm<\)˜2;Q m®b)c‡áÞk ÷vcÂ@áÞ1-$\èe½7à ç†ÁEؕ¹6Sp¡3“‹Y¬™7.òô¥&‚Äü[샷pãßB¦SÜæŽE›è×ÙzÐo¡*+ÂÃNø-.Å(Á¾ÅMàwäh(‚•§úÎÅ."|BY2YÀtz}’{ی<Ø°·Í-‚zµÕ½m†)lÌ[vµ¸j"o³@ÖÄÛËUÝñJÄ"¦¤hÜt×àÝ"î‹AwÃÝÐqŽ¤ÝÞn-°ÛÛ̍u #bº¯ÞZnñK§É·éœW—ç>üšÀÜ¢"¬¾An©€¶ÂŒ[pPðq‹»€÷k#ÜÂÈ®)܂‰°}ðm/'^6¾mko‹¿2Þ"È°ÑmqKà¬ÜöjÖIÚrs°¡mQÅz8••\VØ5Vø7®-‹°ïÑF!€ Ú"iÚúδ-v‚i‹¿Ü ¤-þFz#ږªÅ_m«_ ñlo@o8[dX\RfûInÀl©cxîe{£ÙQ³ê s'¼È Ù"ò„èÃF²,»?'ȶ*ä–Û®Þ;ÆöVx=)¶§çTClé¥7†­êÎDØ>|›'Áö!)ã ` öá÷æ×>*Y0½ö‘fè]+ÙO¢k»Å:&××GíäÚ&ÞH‚k-‹Mn-EÌïØZ†3ê¤ÖjfIf-2®g{cÖ"æ=d-Þ[¶‡0±–zŸë X{ÉË ^mñì¸ZÖBßu§ÕBÒz²j±ö ž0PµMµ&o¨Ú×3¨5Iµ7c‰g€jµî©eÕJLõžAµTºƒ·”.Kƒå€NR-³ý·¬†÷Ÿ‡¨ÿ¦!}r¿½÷1µ{©›¤Zð +¨6¸UÁ©E2ÐS‹•=\¬ Ô¢bîl@jo×#nŒZ PCzQ³¬ B-þîúç¹ú¸‚>-2–ùž–œ–Vw:ííÏNP…1 ³Àª8_6Ѵϙ©Y±öæ}P'X@XÞo\Z»³œ'ð÷©\7"¶€x¢¬j£Ò"‚ŽÙ1 ´¨ bøÌ!™‡D׆¤}­ IKëӓ5 Ræ H‹(ܑ0¶GR×àÑÆߎ6ŒA£íž‡ƒ2 *–¤‹ +RFVl|NErƒD›¯ Ú0‡–øÜg$†¶ßmlZÈh«Ð´‚0‡Ðr0hIœS߲Ň¼UÌÚnuNðfñª_ÚiFšp…”.ð³ˆ#²'˜é³í5õ6›üYñ.Å&âàߥ%}–1ËãÞá³´á öìãîKÁž}ÜM|CÏ2HZGg™¯–³"3´çظ³ÁL +ììó¸1PPg‘;tœa¼ÁœÒYÈ@Îâï¢õ$ÎÒx^ œX/‹Õ#ªvà¹m¸Ù1»Ê±ô0ßÖ6˺—óÞY³4¥ž£¬O…¤Aš}¼ÜA³hZ‰™±è Ê,+ÓÜKgj‘If«³8'VNbµ8·á´1‹$'µÂû¥*ÌÎc¬|Ù'’›ÆË>NöL6>ù . I§Â‚Ë>§î`"c{5nC˂¯Bê`X‘ò“+KµtoXYFö ª,Ñ#.G&Ρ³j7…Ìý˜…»‚ÞŠð'QöeP%ë”mŽ1'P¶Qiê‚å4¬HÙiS¶™‡“HS,;¹Ðވ²Ûp3/&Pn=:"Õb;QJ{ÕU(Ky¾ã†¸µXÃD °™ÊDšé¼|0ý 8¢Ñ%Õ)ú%{[à(YäØP@$Yʖ˜w^I²Hlbõ Y.¬¼Šj «tŽ9Õ(˜º|X›\‹„X‰‘ŲE1¹•"[±d?˼ã0¨®Ü Ùjy←E—D¹€‘y +‚ì»;óå›;LÿDý‡dÙ­‹9@Œºðb~J3Ä6åú¤&‡e(iX]µÌY®Àh>ÎÑž¬Ÿx,—hÂtäOŽÌø6c›ØÒ^uæće1žòÀ%uÈ`mqO¹+ÃL(Zsá±Ü\ö4÷]Ñé+i?—y¬šTóÇóJY ɟÓè HÎÉ ¼Š;‘3ùäõ©[K”ÃÑ0q vWìíxÚ%Oçb.ŠäV Y”ÔA „‘`¹ÎeWŠMO×YÀà6&XóB²« &bàO6eÀ*€ÍR)gÀŠð¡ɔ¢âCŸÁnÅ)[‰«Tä§H$`µ—z;`ÙT)Ž~„YàÅÎöHØ ­õÅ´ԆÖ×$Ʋ?—¯€)åâK}œ t-.‰"´š²\ð†ÿ¦œ–E¶s?Ab°à$ªG‚ ®”ø“ìÏK‹:9õ»ô“,¤âCg·®ÃÍŸ¨*Ý{f¦.*aØ8ž]-¡ýè¦I{ ‹Tň¸?øBÇ µ>Æ£¢³B%þ¦º£éãÚ:ÜF>pç9º{—ãYG—U‚ù½†·F˙g o‘]9#‹ÂJø’`)žÜ™L|¾\¨ãÁû7Pyy\|7.¶…|Š¦O´…\4.ãhjs,JžÙâz°s·ˆáãaŸâZ$)}½HKïڐñf /,,™Í+ÍO0Ó§(AH ÆÂÒd|ˆ´dùfôññ²SVDl¢!¨“ §Ó Йv†LC“¡‚?ϼEÇåë$4Ùû©Â8öC•8ÃI>òñXXÀÅ/ :»à\!y>Y^,Î3”_ðUžþI,˜ Óƒcœî ÈhŸ5^,Ûkæaf§Ã^´Z¢…s!4o[ðÄx°^¤ÖÊ]YUI3³7ÐØRÍѝn‡åQoˆ"ʍw-B±±ÛÒaùÄ. À³™´œÊ¢z,+" à}S‘e‰?ªÔ0ú+I|·u„™É,‚Ùñ§Î“ i4PÏQn˕37j=t—/vAšGâڍÓËЄÅy&GlÞOºÚpa¢'![ôà˜£TxoIðÔh„º +’j°:æÇD(rÓ£×¢a¾ ExÏøÝ/×c2³¸U·?*ÎÇ5pßÝåjö3†ð9Ý¡c$†é*6 d)U·Z"=õ€àƒ‡`ö‘ÀO &@ QxËD¸ðà٘«Ö:¬å•üö°ÉÜÉèY\)Šô9n&¾_WÚҙ¤ÜôqÍøéuŠ]VåÓÐÂGI©X´—ÝÖuµb™Ž*’NvinÑõ·EÆfŠQZà° Ä …AÞ.ú«'#t̄@ÀÂJ9Aè¯ÁBÿøo/vêW.ÄOõë~çµT'`ýÁÔÇû]·¸ä†ÚJfaaT6ž¡§y[$Œ²´Ã­NÔČ]⊻™±¨òº$¹ö ~Q/¯qz”¦o–“ƒwÍižlÍ®#20Èf5ÁÂ29nCU5ªŠzO%X3’Í(&ÂÕó¸Í_],¨}éK³(gÐ.©š¯Ñh…9lx²É“r·ÍjО‚5V±³ïeÈK4p«8H¹§–ÛXóžC{r5‹`#lbÿèÙpRö¥>–õ°¿ +ªÔ쏫«Xrٝò—¾çGÉmZ¸ïÀCÚ¬ff†«å®º "âý†ª?Ù èQ#Xõ ƒåžë†„Z ]oíÑ{ƒݸæ¤×—Xrˆý×­ª÷Œð@è´Ãñ’m\½âaM…wr–àvß©Ôó´;Tz2éW4_‘JåaÄ~ôã%ïÉXæɦ’Ôy`v'SvÝuGâeáø~(ˆÃ]©C }~7õ ïÁõyg5Áÿd֏µø¾µÂ!ÝæåfÝ:p}ÞUC(ÓbPŠ¹5°-NˆU%eç†h§ÈɲÇûxdKÛÕÇMiÛy¨­¨ö9¨%À‰"¡qò+Gú«`¼†È2dÈôaFÐôŒàX orWÑE̹„åSV¼Rê$òĸj­à]Ãc¤ŠæpÉ,®4 Ê)÷c™»á$º½Ô¢]Š:°¯@êéÄGSúsF”? +ómú¡´Âð1u#º°¿»%L›¢íŠ,DðX¢BYÝå]›ÇLj¤”™ò|žEZ.••{Ï4»”q^FAК)hAåFÚâ?ü¼¹¡Whô³H™œ b¼gXoºÉ.äOàëçÊ9ß^ aàuø™v)iÔ´Y^È4’ùRX’¼k÷¤ ¸·®9ÂkGoPå„ï€*_Xêdõ¨ª‹‡^ÝxPLÀµ žèAa££Nåþ£" ·“f¹"$ÆﶺìîK¼ *Rƒ4NŸÚãÖ6—,á‡:ñŒØà-§X"_ 'âiñ®T±sך €±¸áX^»ÊLi!ϵ£ÔôaW†«Hw™ŸÚ©âCÑÃø~¼…ßF©vénú :N.[( h¬…{yZ‚ê—Á[¯S'àQ°¨á'†CU0‚«âŽC¨ÇŽwä?L!ÿµÀ0õòºÙ)ßE²T±k´úcöÚ³ä;Äfx?ŽÛ#u~ÎraÜá;B<Ôi •.³2Ç<_|™:n!ðOjódÍÈñ OFw.l‘þý¡%" ­ºòô.šŸKÛ í‚c=]2®]ØHñ)¶”å+#<Ž÷ªœÃªfÑL–âFè¸U6î'jG%tü6D£0àûY\\Aå¤è1áV‰$«Å_´¸Õe¡üx=à6³ ¸fô´×mʚ‹6dÿnîh:cþÊs…5¢Å;C=ªM<§zá+'ÜÏtx= 5†’ uvqïžÓàQâ7gîè2WrÎ>€ú¹K{…Õ´Á’bb˜õq>ñ +Ò/+“Î$w-'oˆÒ¹Ð¢¨¯jumO!R÷a'ÖòjŒ)0ëߏè­zìϑY†Â, Uƒô%ݏ¥/æâYò7cÔËoV¹àȈ1L€ÓÕ{w˜ +WI9S8#ØWÑ+üˆoW{Ƀ=ö²îàa}“Q!˜6Û*½„!&˜ÓÃ&J÷ ¥枬hÁÏë¹ïH¤ )ý +ƒyC£Û»Z+ +³[Œ59—É8 ±ƒì)ÃÈ|Â},<5!ÜB +£ Ò'¥íê4 C¿ÙÜ|fuü-bûr"&ž«y ËZsP”ýfFï4Fa6êjb}-óWoC4´Ô¤TÃ'‰–9…˚G^¸½v M¿Á„!lü¬f +»ÑÃÖô¥Dâ¼Kè“1\‰†Pêqjcî½0ô˧P|ðCøúÔ—h›Pù…ÏÊílaàr¹«ä¡Z‰/\3¬’3AíúÑ})±,30Ô\™¿Þl-3Xñu((ÅNƒ°H–ÞÂA„€á‹ÞT*éý”莡GΧùßÝÝ{`áœÇMzsÏ£XfÀjÎʺ¶µ‘=l˒ »ºÕ¥ 5yؒ\PÁ†ù¢º<ǐ[Å)Ï\ïÍÄ!õ pD$ã‹h•úŽ {4ôÝ2¡§ÒÒCˆþLNò/˜%%DQ5†ÍT?X'€\)ý ˜…Áo®¹PîªsCæÒXÞ=Qïz[é=ã\„ý:Я(ÛcRHìs™ï9·¼¤AaQ@:ˆ—VÃt1ñÑ`I>Ñ¢N”> ¾¹—“s;×½àÙ©p0- Í'~aš«çÃÛåü†}aÆT`ö~–Dµr­EÖa]„€<øŠOȏïþ=Ö0ÓãÎÌ]7o')¸JDu?¢Ê’Qúä\Ÿ `&ž1H”˜†‰7WO +g ç¢ÎEß¡Åç˒4j 8aCO”8-X/êŸNȐBe¨š"Lg7ïùd bBZÙ(ZÛ)÷ F +ӟäª]:]UBáX5‘UèMʸÒbt6˜É½²cèú‰oʸLHíl+úÉC µ˜â`µûàzJ~+‡Ã@ šLG¦`Æä‹bu°\ë®nlp©?AӔ¤Ak}*„Í*=XÖks‡¢z9šÆFތ’…œ}´‹ðQ\|ûRÙzñG µÛ81V´³WL‰xze)‰‡À9ÇXXûÞƤþܹg‹¶H·pЂårF/ïz¬s¹¿îaʾé¥ëmPڍ~ȹ (aЕ2Ëu«ÃŽšê ÏûKø*å-fd§ÅCJuÜpê†t³nõ/ÄsÝsr?F—[)]ælŒÈêÄ̟{^ÆïŠÕ0윒ÛË%Ê8ýp›Çб¢ÞÝϥۋ=Ïèß´Š;>d$Àæa•*ûÎ ‡™Íº… –ñFu¦¹[:‚[ †¹¾m§ZtI¬*qÆeϾH¨8DFä¶u>£!0,ƒ˜lSٖZx—p®`AýCÁ +!•(ÀÈŎ% 5}úïä{22O*%kl“áàP^'՘ÐP·ˆ•$ï6ÃËtÄNwÑÀ=»¢K<ÍÌy³²ŸaÆS - +žž.0xŸ4ÜIª{.½[4°¡zŠâØáï¶@¡Þù£‡»SÕ#:F*AP¬þ>ùb_ÒOûcr™åTd»É½þ)ÍT0´fƒŸG³ªèr˜“ 2’K]b§(ž¥}ºvŠ~k‰§w\í¹é^vš89Î%7°÷âÞÂ͗ ˜«TܹºÂàÎ(lµåÞ£°Õ²Ú;šJâ7¨‚E¹2¥ W(v`iÇKÕÔÇjîS®òI¶4 wÕjPêA¬ǼÖð©£3³ÞØ¢·šÊ“ÂÜ[é:®:òu! àÌE H¨l>Ü#Žº›«Ï]å N‰2cv[¹\CGËi±£Ö?DÄåb:dgl»¥7ÆçJŠãp¬%FÀ5Õ"4Ætx¥Lhސž]™Œã6ÿcœ¡ T¬x)‚µ5ÇRE›n*%(€Š‡Š‰éPÔ£•©rg†™± 8Âҟ%ü¦ÄáaQ/\AHRˆ?É!–ž Oʀõ ‚Q ^ÇâeX0ºâNsf ð³ VŎPˆÆhHN±E«<{w8ÒlŠJK’ì®` =r¸VònXüpªÿΌkžê> KÁ¹«—-ôšY;ÈLd!Ä&wðr<‡‚¸J)K°$†Içž\›j ››6k9)­NP·JY DN!¬ÂŽlTOªÐßÊJ$ßJÅÇCYW.št´ª†wpF¬…ESiw’“IIofN¥µú:ñ|Gk §'È°Ìì!‹]×Kâl’êRX¥î& 3LyûUP¯j²2š‹22Ž3!j¶½õM*°T—çmHaæÄE“ÇF3Ý{fíب§)lM|ZÚ5Ë9àkJÝüðG«$í·:&½û­3®ù±Óô^ØëXƒ~ +󣢦ž^×2›–V]…¢îácÑ~1>Yí·©8,-‚Û· X¨ëfµØ= ‚LŸá³gN„¿z(£Ä›É+s¶a±cÓÔÂ|nç`=kÞ´6ŒDcSï»/±#)gªâ#È¥Š¦ÃÅ$f„Vè¸Ùç ¼]R}ž\?‡-EN#µöï»N«ž]Ñr+ïҢӕO§zYç‚ÔU‚ÝÙü3f8®™V +&Cé‹=ÅUARŽ«žÓ’+¦j‡iWɔöùH¹DgчÛ!Òrû!XÀ]ŸvÎ]É#£™V“³&,výèåj1Îí¾ÐKLCz‡ºÐ >‘ÀÇq£KÊz(Þ;e¥4[™'BÕ&u܄¡´eÏÚ\ñqé­î’ ‡›nó'—èœkª¾SÌ:†óu[m5æK®Ù9œ .î4…à‹S ·µìàx£<#wEM°”·‘xþdƒj¢Äc@p&$.w¢™c+êÖëGˆtªÅoݼ\Pª6ó'>8É#.ɞò—[ÀÒç;¹M+n’VTōK©«VVkH£ËRä#¯PªˆÀɹàԘé0äP}Ja·ù·SW=ÜƒØ Y$*¿\eôáöì§7UÈ*/ª,dhcOv+q¿Íå8Ù"/Õ"’‰Ä· ä—°Ñ<v¶ÅdËhoî*j>œia¡s”Ô'aWŠ-a9žüÕÇÂ`$#p‹îaE1ú½BþWõݽ)Õ¥»Ë¤j—¼]ÝÈÈ#Ìé²è Ëv.œàvôŒ‡  +C?ZUõ •½N.ʒaaVˆþINƒ5‚× àÑs;ޑªtN ðpBÓ{Þ.ÆÀðÆ)¤’˜Q+Ab.þ~Lë÷~aX¬›èŠƒ]„äX©gˆ Î¥J ‚* †rC µù>æ†,gç²9ÍäñÂF–ŒÊÕ³ûÍeïº3^-‡Ÿâ>;´‚~\Z‰œ oXªW™se”|g ìûsª^ôÐnRãï,¿â—¥¿Œ^—f=ŸõA°p°ªë臲¬ÇéÆÇxž¦NE2à Ép¦áK¼ +’0»zJ÷é"Üӟéÿà +ˆ¼AXiD¾\€ÉœErǛAÐÖ³y¥¤¢‘¤üèi†‚bh”8¥×ð{Ÿªœ?•ä¸!‘7aÝoñ—¢ÆRˆ(çZ‡*H>4$¨cƒ^•êFŽò¨WTŒ!ŸÅ£ßpS®î1áŠá ø’ âÕùbuúb—[ÐÁ|ëÅ}ü¨¨Z¸$u•FçKÈ(%ü=‰K "àï…”¡Dn“}éé +3£ÏI® »ÅáâY_H¡¦ÒÙ]á—ðÈe>­ö¡¤é²øNõŠí³X¡PjŒgXœò¢…:âÊ0îJiY© b‚f>2H1æãIp -ñ"°6(<]K))LU Ý\'ü{+ +x>ZµKV çÅB:'o^7Ž,¥ðËmã2±gÒ¹©t»,±¥e±˜©Þ)¼7—À ӂ–65cºÓÜ\t)Ð)õ…^ËO+‚o¿ø`! —(ÎÁ‹®ÒQv%ºU‹#r„쏂õ!3›PS'mÎ\³–ê` Wœ¤‡íˆdœkˆša%§'­ë p¢{©Î—Ê|VdœHÿTB†6 +r@lÑ8wVBñ²8§–gþ(3R§iÆPȵª +¦®² e½½„‡­ëD6ƕ!ÊX@0×¢ß#‚ˈ«Rx¨àY­W]Í+(*£as3uI¼”XS¹^ô÷®w¤‹3èDýě{O\ â*{ +bñ£LœìŽ†Í˜›çúXƒ¯û˜={Ïÿ0хVÏĐEájmVƒ€þ?+ÂPõÁ¸÷i‚,,‡ÊÜ°—9ëùª/ÊϝQ²Z™æD°è5Ñ +fo֊w ‘Ìt‘F@ìâtŸnÂ7 +µs©f”æÏ ¿Pl`‰tuc7¦šg¾üŸëP½‘RÍ(æRÖ/Æß]·{úlJù›* +YñDðͨ}º˜Tôú×TH¾D˜Ý£— ^´ð„‹k'rWQⱘ åôËch*T«gêPڏºЦ8ñ‹Ê;ÊE©yæÍáËr ¶úëÀçÕMzx'DLY…Ãß?jfpe­ç£‚$j% a!ŸˆM¥i1áÚêc`¦‡Œ[×͒Ct¶˜ÇêÊ>0àäØdU&§Tǽ4iqQðeMê¿ÄCU]¾(!ŠDJÕáeÊD¯eYÜ+HËä¬1ãc8õűt#læQ;™±Ô‡ý ŠÊZ&á!hÝÔZ–7étô°æb½‰kì£çD5hârîBWZÝûƒƒ•DèoB˜§+ç5 ˜¹nÔ"vý1~¢E·•êÕ&7L¾?:­¹g°±øu&¡Ÿ•Ë´Ì^/Ý]£À»;«¥6©Tçn¹?«j´§Ÿitîe…ç%p”>Ôx è\ù–6” +΁¥Ye‚Ú,j³k³¼ˆÕZÌ×;›ÖÜ]#÷TY)Ì*ak½4ç3iPû‰®@Œ÷ìFÆ@X¢†“£Èä«LTmaágŠ’µ¬®Øâ†Íi’êZm~ñ­¯)dT™cƒ™1‡+ 8]*³ø¡S7ؕ·È]«·SIÿ}mÐÁJ?Éb)ò´Úœ /c$È9Š[¢T=PiYãXiÑ®ˆi©´[÷tº\†7ÜŠ32ՑµÜ•½-²tUÚ©[—j_êƒïò£Ýøh½ñê2È}¸ò°ctÄ[O­±}ªË vßb'²ÃB½¢½±X†9ñŒ/±• +0W7Wñ×q:¿x¿Ä)ï˜Ú¢¡×)ú+FꟘ¤?£vuÝ©}ªÓÒ5]õœknin„8+.^Œôez‚6±Êm¨xœ\Êd؍pé‚ÅלÖ0O³#õé:ÎÜ.ÐfÄW՝ž÷Zu¬~\ÏD¢Ó„Äô;B³æõH^§<´aºé +¿„uI^¨vŸ¨·•äàOq6¬Õ8„Ck%ŠèÍê0¦õçÌ*ªK€%o!7#OÅôe=îva§3‡èñãvçªEaô¸ªª_Mìa9T¬ß¦@-Õ%,Ž(-~ç‡;ÀÂ"z,Ó'AËÒÓúva쑷åÒÂá ‡O‰ oµ!^ãrIi‡¢AlÚ'ZL>ƉˆîºlÇnâx' ùPf ,º-{¶¨Õ‹^aý¥„YÌu; û™rsC¦n%tîºþ},2Á4ó‚9õA­Þyr—}Àç²¢h”5ïþD7/˜QqA u£(þB 9 c÷§ âe<½yCñî†Û´ðWû¹X¼k7Ðf,®Q‘Y#>]Ì UžÉ ½¶ÃÅ)Œ<“jELõ©“UÈo4G1bís’gh™õuîÀ;Ô¨ _†‘JjÃü²‰7¥"`(bÊ;J} ,Cb\©kΙ Ïh<‘wèfžAçþÔ ›M¤‚¹¾1èÒeœ¤p³ +ëä;rZ¥3œ™ô¯žv¦‡Ý +îZ¼8‹Ž%wu¸B<÷”v) Öø†£sÃê¢É“Å6ì‡Ý–4oaû tÓU5pa)’Vē!Í <3Åc7+š»WoëHÖ Þlíqª$ÂcY ³C"’{†ôĈp»‹§Q¨ê.ю+÷¤+3ÅÞ´¿‰¦[Y`Çzòöž#ráõ0­h2XÌM_1†”´øJOˆX¶ÎíðÕâö²Ü’>p´‹‡”nvmnˆÙ+W„‰ÇU5CSíã¬icÙC­º½{ºy‹&-–¡²‰%’KaÁ£†Ù¬=¿¬Æ`¯Z茀u_Þ&We (ùî2Cɸ"ÕeVñt% —œ0žîØÍcÙ[VCŒ—(n»Ÿ)W"‚‡ùpâ­P'¸êåR‚² >Ç¢ãbŒ`Bb°²ⶠ+¯ ÐÞ±R—8\~Lùâìs›¸I!éà’ü5§lN@Ì}?V$‘ ÏT=gûG|‹guÉiø,a§¢éÕ*Ý ¹¨Îq +Ž¸ÔlQ\MŸÿfïf .…Ò;ÌÀ·ou?’£‡ðÈq.Oà>4Úò'$ïsŸ ê#rìãòЗ yàv_6֟RÕ÷æ‚}ùæNÞ?!ÍÿaHó(œØ‰æˆ¾±Þ €æœ—Ä—³ï¢(ÎüÎýÍø~Ý0s8Èägn,sT¦>—9 Ì£ÕX’̱ܣHy™£KØQs̋{e'Æ>ƜûªÄaÀ‡ï‰,ÔoÄß ìHvÌnbà5æh-ü\šG&¿<:%¾¼: ’øòjÕÜN/ŸVÃË«;ª&»øG2u6t9PðÇ]^¯hfåøMµŽaG—3ãix4‡„T¥mrùSòJ.‡„WpmÓ©`¨Jþ1ÎËr‡*S’ +îȂ¶uãÌ絜ڊò¼AËٍï~&³õÊÄrþÕv^9mcL\9ŽQž{ÒÊoK wXù]NcV9ÂZê¬hV9Ýd‡ ée^ºž“TÞLùOPySIæŽ)G£Ë.“¡‘lîA½ɟæ'€äÀh4û¶ä‘w«$wùxT£—4rVÚqÊ9»«µÑÈÕ$¤Ê±ÅþˆmÐÈa!df§‘Ÿáx'öý 9 ’Â>+/Eþ†‘cÎFÀȱbb}ÑÆ"G}ãe¤³È´(çãv"g?‰¯(r™YTo`8,Š˜usýŽ({]Yä0÷…DÎN/ç^ªó D”:)jÁ!™³‘ÔE(”mrÌ$ ‚|xòñ„¾nÃÑ­IXàÇq:<ÐFGcp®¾>>¢è$tÖ£›‚¿¡ÇG …ƒ<þܱ +1xÕË\ÎoÜq0¹Ø ìø=Â/3v<«Ë7êøm=©©ã —ðç:r‰úr¬Ìñ;Â~¿çMä8 Á«œ8PäTMlàx´ƒ Þ8ՙÔë­¸q&DN—¿"Pۜ¼ Ö8ýLál¬qä¡øújrµ£]³aèÛ,ƒ Gڊ•¾¯B%gå ·5¦3ŽŒH=CJÿåþh~ 8>ÀÐrŸ!&õ.FŒ3Ýô™Q¶Ì" Æ@À8†zUÌG6S%QƋõ# |£‹—6ë¤Ô0ÅS]²Å?yŽ3bkU:<Jä7²8Š€¥iù¯Ë°Œ!¸âp8„nXqBdNÉ [aµ¸|Ž-n#¹1űb"Ð7âø=.ÎfŽÇýGö…¯OXYž5”Ç$ì-ï4qä{”^6L¼ÊWJ”8ҁԱl$qÀÊù6gµ‚Åá#WÃÁ'Eü6>-!â0Du/sÏ0ˆP°"Ä¡¦¸Í馗˩$âÓ°òã4ñáwÄ;ƒ~ß íðð;º’;xòf8 Ûð›ÉY¸Í‚âB NJR)#sÃI_zŽ³ºË„†ƒÁÁúý`†ßÕ9³ «¾MÃa8M¹`ˆc“fðI 'À¥˜!ÎK©Fþ+'A%VT8ÒÅÛM +¯ÁPx=ƒ>¿rÂk¨uŽ\Üåâ`ŽtWLÅ$Âò‚ƒ^-UODøðø~…ø%áhQ«ºMÂÙ³ÖzˆÉ/í +^Ô¬1áàØíÒafåÞwMç&ƒ# ÔXUf0øbå• ˜@‰æ ddqiÀ¾›ÚxïPð¤5®S‹è^]ãMq¯Š ÎÞ=‰à- +Å?œ5Üqà®Î4ð¨cNøá$ôÎ7Mr¢Àú¾/ì|ÀÓWkzàL-Wö_UŸU¹äþ0ä­Z)!ÀaÆ&|8³ÀCôüo.&üR}±ÍöŪöds3“c”`@3Q» ùÛáÀ7ÕÔOîw6ìwZƒú=ê–7c‘gŸfxX¹™ýé$~OÃüNcð¾KV¾î;^ˍö=( +¨ûÆZ‹z¸`}Œzê=å³8†Äbb}‹åPËd}¬A¾ž7Ö÷A$&Å)†}‡¬ŸÙÓ¦}ƒä Ix£}ÃMin«!ÉZ‹ÞžA® €ø†úƊ)’ }ú¸’Iáb`áúxã|£Üè¨÷I€„;YZõôâµl˜oxPJ!æû œ?ÄÛTw 6Ê÷Eä¨d|fp¿Nk-UP!%ýŽø.¦5$áû**ÍHÀ73©ŸV¾7D-·Þû*NÝ8u‰=W¸w‰F„Áö.nho¢ÍêLâh¨Y°7Ä-´ÔߎmXoø’ÒHâùG×ËH"wÛó±C½Óå?Ðk°¾:˜Þ¼OöÚfQù0WŸDïË5X ôÆ\bl@ï+â‹Áó†J‚ÅãóÆXB3k< ëΠ󾆏`y§(oEyCEÇ,HÞ( a5P ºÁdâån$o®O®Åڂµ Ø4l$ïi5ÉûŽÓÈû“#>]u L®ÙZ9Þê·ÔÏ ò¦ÂMæƒäMy# 6’7>^Æ’ä …Í ’7<'õäM+ë ‚Ç­×½Ô$yŸ¬Æ½ËÉïÛ0¶Û;6¦òæߏiÑÇÃwF3Aސr–à*vLýTQQÆy“!‰Aޔ…ŠÄb7éH,\Ù@Þ4  o>©Þ&Ǜ"æ€7Ž7…5QîÁ44$5¸œäxs~²Çf6¿NŽ7E·GÉñ†dH€ÈãM;¦.s¼Or–û˜o¼¡ªÚ8ÞÔj»„#03Œ‘o¦Œ0_úDfÁr`¼!—:á Œ7…Ϥülo˜Ì Œ7¥r äã-í«ÕVŒ7÷dUM`¼Ï^ÆïvŒ7.¬û€¢< ´Ë{`¼) bøJñfÿåø¬.@XLpyc¼æ¸ë¹c¼–»î ñXa}¢‚Ñ[‘'º"¼‡‰fIðVÓ'ÀÇy§w'ž®áÝ æ1Èün\'¤ß +¨êŒ0Î.™ÞMòñ¥J¦„w#êJÐÀ»¡Èy¼¦éç +TôJîFƒwE´I~ìk%µ{ñ½Ý ÝRqÌnFYËÌnö†'îhcvó¢Ë¡]•ÃÃ{\`Ì© Õ¿-‹²ƒm3.×Âù3g;v§ZH”†síÀnXYE¼nGqgáºñk*%ZhÝ'E‡JÔÜI(ø³ëÖã$ÍÄu‹²miÙَDŠGŠ\ ø®fU<®›Ò׌릡X¨6qÝ4³+pÝü‰špnLÁL¦ëcÇu#°­zÕÀu³vC‚X7£ÊÛʬIëf½+}׍ + ýzàºy“TjºòºÏ€$¯›Úë^7‹7T§°òºYB“¨o9 Ý%Á릅Ôč×MA-EÁëf(.؍¹KŸ°[[JÍ ì憪2~¢ ½óH;±›®W4Aì–×Ö˂ÖjîövÃ*·ÄÀnšÅgù› ïÄnFø$4±[ýXixD>BÜêqK‚IìæªJmHŠHôòå,[‡…Cõ†ì–ù‰‚ÕKº˜WÈnD¿ßÝlnC|@ »µn0Ä[ké+úlÈnu$¬ÅÈnÆÃôìæ2'ÛÙMí¹°4fvSŸ®oÄÌnZô1¬Ìnš«3¿ + vÁÙÍeeä†ì–äÿT)­²¾‰ì––ÿpÖDvÓ}d˜  Ý¸o·¨†v+,â‚ØEà„àÈeD·9ÐÕÓ_@»*¹M:Ih÷™ýhÌìÎ@K2»œaâscvãRå̳›¾"\ðbòeïÆìÆ¢òä¢ýVN*‡%²›¨;¾H²[‘åÑ&²o?‰ì>ï;è8 ²›EcR‡ƐœŠÙM×_DVd÷™*†@vÓÂÔp »?¯–Ff~ç²™È\)ORˆÊ£Âs‘=Ó7d7Ílpfd7~‚ªµDvÉoGvÃL8O"»iQvÒÈnY˜t[‘ÝøQR:ٍ)Å[AìFJQ½ W`73¢$]°{8—–,n €¬‰Ø˜ÝýŠü°­Àhéþ˜ØÝj)­ÀnXG¾8ûÀ@ÚIàº[Bö¹$hÎ÷$¬»ÅØ›5ƒ®vTws§ô$uƒWw8ºÎØÚ°sÚ@Ý$]?cZŸ43sºÓ°qº§Õœî§DË0ã·ÁÆRÃÞÓÝo‡ás3sæҝ†Ñ=­Bt÷hJˆn€8|]ݤ•_  QnUÄ™Ï ƒ¦‘ύý8ïžû ™QйŸÃoÿçîÑ@-ØÜ`à¨]¤Ñܾp˜ÚÈÜd1W…ðxi8u9œVúi|åŠå†‘”Ë rÃP]¦@×1åàvO&w?¦òiÒînW‰ä†:ÃÈ äë#ȍ0+Yääîñ!/É&>ÇGB±™“ Ï½Q±aV^)¨ØDp~¤Ù`s›Çų´rÑXlX”ß +,öyFþ†ÅÖºiԉÅfœ.Q`±E0Ú}é+QÍãŒÅfâYÍã¢Ø'Ws¿1.nXì¡bð„bƒ5 N´fbkÂv$öðžDl 4{½¸ó°Y=|µ‰ÃÁ´Ê5£—L‚n4lB1H®Î ÁádW×Àa/™¼•‡Íu…:ˆ˜‡ÍU]o‡Í¨js]çdZ3¶J}wà°yv×5iØôϯq}eOå,ƒ†M‹ø¡=j[ŠËnV6 YTzf6/½QovZ66ö4äÁ8l|¨ '.XUÉΊÆùRÕ"JP‡M¯jÃaÓ©#»2pØ]¨òO4lnÁG·á°yr×5iØçáJɤa³ +†£òJæUiØ´47À`±âq*¬¸Ó°é’×%\ZŠ¸r)iØ°¨2cÃas1}™{¢q‚¥Eše +Ê66—×%êÝå¸ ÄVŠ¦JÉ9Ø¿ðß Ä¦á2þº©CÞm,÷ÊÃF.ÕÏ!bg”¡Ûè¶mX»)ŸTlx “ŠÍ˜;]lTlFœØ^-°Ø´h¢›‰"V,6ƒ:À÷ÝÑøÚXlÄTèºa±‰«îȨò¤ŠYJXl ‚úê6,6µ(ÔPΦ›˜‹Í@ Ñ.f.à“‹M Vp±iQûŕ‹Í#RP\l†cT>âZ]Û´s±é 3m\l²ùØ30¸ØÌ`¨¡æÊŞæàbsd+ÀàbóƱÿÂÆņٝwœ€‚EZ¯àbsj¸6.6Í|fÁÅ갟ŒMEd{ÃbSçÉ +ôÀbCsı&¹ØÌ wj™\lÆÈÉ*.6«šÇŠ»†×ÑÕqåbãHҚ͕•š† Š=­æ~¡ÿQt-ç;ùi5ðGXwð¾÷ǎľx—Ϗ$bãa“¢•@ìæáhça7‡_‡ÝšNöc_c‡a?Ž>&ÐÚEþ…ýÄ ¸‘°õVXv¾81؏‹kv ö #c°ù¾Ü%(ØP»(?²B°ƒIœlhÐ8ÖWºXÌ·!°atÓl¤ Žgò¯™Ì×þº´Hæ™~ Ãp—\ M}vø5±âX‰}^'T¨å9ŽXK¯èkÔkÐá òu°¨’|}E£ð | ùҁ½¦ú¹^“z TÕؑ××~§‰×Wtrà5S\ÇóÆ»¾Bà¸kA0x¸ëËø“v #]Ԁ]_¡\ Ø5Òbìë½±®Q 4Ê$]#½¡…_%TÜ°³Îƹ®ÃdõÀ\3x8®I¹n¡LÝ ×HÕ1א̐®„ëfà¸n^$ßû1xk˜ñ¿n}÷xœÜßэ5ØÖ·ç°mv‡‘Í`Ô š›Þƒw‹~ðœ7®5jJV +k‹@C­»Q3;ÓkGÇïéFq-Y• ¯ŒÝø–n@k„r²àƒ5ÅÕÚÄÀYC.¨)s¥Y㊛û»2aJAÍ­>a”Š0ûµ²¬]@—$kŠœ`b¶²s¬[t} Œur‚bÝP¸A¬Ù%çÒ„ ÓYØí‰ó +pÁ†°†•“b¬TfÂ3Ö·ùB¿šÄþŒ¯¾ƒ ôê;¤¸¼Vä»TÆÿ]_;“e]æ÷£ÐQ€«áӑºÜjfÔÇÇN­Fò„‘¿€VƒÄÏ.˜Õ—åB;²úÊFŽ&V£.E€S«¯HQmÀêD>¯MŒNÂÀHɆ«¾¢?@ЪA÷ãh°ê„µo¬jTØ©Ó%I—¥è&U—æÏwU—P§º„‚"0Õp>ZƒT{" ©†A\1ªKôMÝÕ/O@‹Ó$T×x¿ ¨¾9‚½ó©oŽ“ žš… Mê_.¯()y,êÍ4ݍҿ£ÎrK §$šA+2‘74õ`^öüH2uu+´Sww°Ú¹Ô· ‰¥>=o•ÚÚJ­R[1©ILx$’ú!UæH D gúñB0pÔ›ƒQ[¿•,êÝ'Œ¢.Q}·£¨›=I¢¶Æ2AÔL>|âP32åšø¸=i%„ïÇéJ¾ ¡FmÑAÔÁËí%Œ>ŽˆZMõe÷*Ô%ü„àO³°ßàíÄO£þ¯©•ÖC|=“=ÝÜô=mùz §o†ÎIžÖ’¬–7ò´4.ýšäi„ioö@ò4õ©GXR«EÍElÈ8 ,êŸèéÏ.û·_`hî±&ôtu–/ÉÓŠKðô]B'¼r§›ÓØi°CÔqÚÔé;Êb7è4"ôd‚9 4ˆÒ°FNÃнÅ\ Ý!~0p)`Š»‚7Äit+š*ž;J¯‡ –#ª)Òh^‰ÆdM?gd½e$η^“4=NE$vÐ4¬`4 ƒX»Îp¹Ë +ô 3= ÅIÊ4ÊÓ"ôfø}6ÆôãrÎdL¨üô‰ŽéƒÓÐF˜î&a¤µ¹5ÓiØøÒaM¼t÷\ŸÐhˆ”¹–ÞàÒ+DdësºÓ˜ÐÒóϕ,ÖK÷ÐWºtuÃJCp]6‰ªßAO6T†hƸø²Ñs&Ò=ôT„ë·«PÀ/ƚ̓F­•jñ“ÆwÔܯq¥ŸÛŽxð¤i(mâ¤/?î7š4ÀGü “~j`·“f/úû~cI©ô¹QҐ™ƒ!âÇð•$¸²àH' +30ҏ¿Þ"ò­ÓK£²•hɐ†¡8b?Ò#"P45ö}¼q¢‘Çb|Әhü͊)S¢ûÅæ+$ù±¨8§ò0,ÑHµ±{#D7‡×“Ý¢ì.ÑiØÑÓjHt3K* ÅX!3ê´!¢Ñí@}”=X¡Ð+À˜« wD4x]·o&“rX8•6ùÐXQ©qኇƲ ~\⡱zS½• ̪e;ú¶Š$ÙР:©i±ÑД”1•?ÑÐÍj¯$Cs™çâ?փ2ë¬ý”ÛЏ;ÏɅŽ¥qr¡¹xný …6qÏk (‚¡ÐÕJӝ nWœ;?˜ÈÊ%úÝ5úò͝¯ÿ~‘Ð_#=ÿâñëÇ?ÿW?ÿ~=<÷»¿áÿýåÿý×?êg¾ÿÝ¿þß~üÿü ÷ññÏÿâÇ¿üë¯ìö?ýö§_ÿùóÏ?ÿ~ÙádAøëµý¥ÝþÍo_¿ôï~û›ßÿUüÄ/×Ÿÿ͏ÿïoüÃë´þúo™½œÍëüûãß®'ó‹›ÿãüý¯_wöþ›ßýüû¿sëó»ÿüiã¨<ù¯^çÿòãoÿÓ_ýþï{¡ñ»?üí/>Ù?}ýõ/þÕõë?ýù7ޝ††_ÿÙï~þó×Û÷û× øÝw¶ÿËÿÓ뜗ù՟üÙæ¿=ú·ù7ÿåoÿ*õÏþìÇ?|ø¯óøÕññ/~õ'ÇÇ¿ÿïþä¿à?Vì÷ññ¿¾þëÿyÙþðQ?þõÇÿù¿yíñïÿâWò]úñ??Í¿·½ýž¦Ã…‰¿líôýv¬×_?ã‡ÿ÷×ÿ¼Ffâ´ -ú¬vQ¦Ðá¥ÌôZ^¾Öxø×Þha„ 8.9V€Ÿn˜¨³%™ç\í0>’½Œ(À(o6¬nt›#iýÄvTzQ¯Ñm;…0êX„ÃOÜ7>ýÚ;û9,ö<ßyÔåÂ>߅×þ#nqG÷4àì^«~øuláƒÉ™hø—3ô fäµÜ¾î‹¬ï 7÷<>þõ¯âav%;}‡!h:îÕ£+Ú^FŠú¯7£º¼Å^æØ _ìõ2ìç`ãóEÛÎí¯yÝñOíå„ xE@£8þµÚ}&¬]äµv¾!.ÈçºØ‘Å+íc?,Ù×Ç~6þð 疧ýOïóý}®O-ÆÙ= 㼖ùã¯í¨¯òÍ6»¨ãíOÅ+}iñxQÜòûýþB9€Åv§×\ëù.¶íÚ¦}¹ó¨Ë-›§°ß_àÎû}ã"ªþþØÒøöŒ§}¾yÔõÅùtþÛNjïx6]ÄøýæâÔÛñìçp8g´žìbÛ.lڗ»0ºÜ¯y +ûÍÅoÀß7†7[Þ^Þi|{ÀÓ>_†<êúÖ|º ßìå½ÕÌó}L+à¯öï4ä d¶i‹qÓûӖÃÎ1m9‡mLÏ ú°oÜ!y?ì4îç0íË ÏÃ.—öé>üã'f˜zœŸnf˜ãz;&“ÊïeùÅŸÞbŸ×²v^õrÛ-”ØñÜ6E«»í°Ó¸ŸÃ´/'<»\Ú§û·hÞ½}BŸ{™Ð狱Lè‹q›ÐûœÐ—ÃÎ }9‡mBŸ{Ý8_Œõ°Ó¸ŸÃ´/'<»\Ú§ûð•·h¿Eóq/Ǚ/Æò‹‹q;½Å>¯e9ì¼êå¶[4÷ºq¾ëa§q?‡i_Nxv¹´O÷á‡ÏŽ +IxŸý›7׃Ĝþndueÿä§`òDža÷~µœÚßý”uãézÌÃNã~‹}žð<ì¼²O7á›L£svÞnít&æ L¯c9ÓŸ]ÖâºÌ{°8>ón-þÁvkgbÙxzËKãÛãöå]ÈÃ./ÍûMøV“蜞·»;½‰yÓíXNv1nW¶ø.ó6,žÏ¼a‹ƒ°ÝÝśX6žnÇòÐÒøö„§}yò°Ë{ó~¾É‹;?|A=Cóó ûö¡_|ï£Zy}Šõâû'iãû¨°n݇9ïCï?>{—Õ>›ÿ‘ ”›§±7·d±Of9ìôv–sØ\£Ïç6ã*ŸWM<ôõ¶jâIh½1=쟹ã‹}úîËa§—}^0m¿¬óü·ëþéϿكº¯`ïõ ‚½¼Ÿ¾KXïÝ/Y½÷÷ŸŽ·}ÿÛ#’ûr¦ÅûõVÍi¦(žh»g°G½l?ßlë2ÉÈÌp@¯ÛA8xÊÇvaœ“Ìèýmc‹Ý·ÃNãv +‹9Ïvt¹¬Ï÷à[N1Øàýîžæl§!j÷½ïb[/mš—Û0ºÜ°yûݕOSÞ6.âí-ûžæù.äAחæÓ=øVÓ +YÞoíáÚ£íx×þâ.¶õº¦y¹ó Ëݚg°ßړmÂÛÛÆFPíO,ûӝæù"äA×7æÓ=ø–Ñ1Z<ª^c‰k@C9íßi,.½Æ8õ7#ŽÕ×è˜íUõ3ûa/‰<÷s¸-þ~äf×Èuã.õï~ØiÜÏaڗž‡].íÓ}Øâ·<æíq½ߎùµû/.Æíôû¼–å°óª—sØn<„ço»ln?ì4îç0íË ÏÃ.—öé>|›…{¾'sé3Mô ö7'ˆí©…ñýÍY7Ηa9ê´ÝŸÞۗ)]¡ù¨æòašòxóá-?|e0ØoÑ|ðËqæCZ~q1n§·Øçµ,‡Ýƒœ>‡OAN½OoAÎú~‹ã~Ó¾œð<ìriŸîÃ7 è_Ÿo/2Å$„­ç€œ2Þóílãvi‹}އå°{ÞÜçð)o¾ŸÛ–7ï-9EàøgYí>“öÜûˆ»·áy±Ï±|9ìõ—sئˆÏçö­†‹éNËGü´¢°y[%Ðut6bí:¾/)äéf4ÛëûÄ»Coãû’bÝx.æa§q?‡Å>Oxv^Ù§›ðÍ¢Ùò¥·[;=ÿys‰°œébÜ.kYfÌ{°,RæÝZ¼ùíÖ.®ÿ²ñ\#,O,owڗw!»¼4ï7áF³íNoww:ÿóæ*a9ÙŸ]ٲҘ·aY§Ì¶8ôÛÝ]¼ÿeã¹LXZߞð´/¯CvyoÞoÂ7‹f·ˆï=ýü<(„}ûÐ[+o£q÷óiT`•çÚGÆ÷Þ>HšÞG„¹áüÄç§qÿõÅ>Out¹¨ÏwàÛö{;¿ßå4旾œðbÜ®n.æ­X›¸e˹ÜÛåÛÍ ç7¾<¬4¾=Ùi_^ƒ<èúÂ|ºß8Ä°ßØùé.ç0?òålãviËH1ïÃ2ÎÄýZ>ÆåÆ.Ÿmn8?ïåI¥ñí±NûòäA×·åÓøá\ý·?ÿü—?ýø›þXý‡ÅVëÁŵ|迎B¨öw×è¬ZYíß¿ÙÑ"ŒÚïߎóKöå8?û<¿Òv;Yð%&–É.Ú êüm|ý¢Œä2ÞǸeÀ¼oáK<Ÿ痓z?lҘ_Ñú5Ñ›Æ&¶ƒí½çÆÞ´b¢Ö1ÖüÚ ÌsC—W>è×!Z¯WœJälE_*›®û ã¸ÃxðžÝ䨱-jl|â+_¿~ØcÈaÓ¶àØøô«—0o)JœÎxeîR㖢Ìîna?GÜR|ÈÍÏqœúà`D ,OƒjCÆûôëÁF_~áç@‰Ò»xy^Z‹[ý ‡zôžÀXÎæçˆÁÍÆzÇsóV=*yöÆýöÆG«'ÎâÁ h†#^dÁóñh=øØ8¾‹'óÕ«Xߥ׉>:jóUb¥£Ì(æý>í5ímÄÛ@š‚Œ1d¿x>`–·ûl„û)í×9l¯-`DªŸÙ¶»øyuïæ5ó±©6Þó ûøäh8ß&´*:¿±½ú3`ð'Œñº¼Byqã¾XjhûÃ3áJnüôü¹²a=‡<½ÅU”J`4Ù ô´³ð0]›òÜ~4wÅ*ÒÆφõˆŸŒ—çã¯ýb~ƒ>ül®³Æ8; h¶w ¢MíÏÆr‡qÄ«=€jÞ¸ …=~Ž_ÒWÏ!ï ‡O lÏùSØ__–þšœú‡ŒvøòUÛn}Kü/ß Éb®:¯âmO”©.óÑ×Î`ýîؖF#(fÑüðæðyûC*éûÜÇÃzÉü>Î9þ–RsÐ܊ŸzFmcÿ·Ÿ_oÛ~Õ?}͌aö“ñåþþ‡¼õÎÈcµìãŠñ >äˆ9ñu;Ÿ_º÷:?ð¨KÌƜ{~JûÙý&ܗ«:ßú»ûq…±1ó-^uÚË÷?w¶ê ý|Ó]éÒþxf¸Ò•ˆ©ÆŒÀÁ÷aÚéC½Ö[ò±ºê}m´ãôéÈóž@$>ʲýOa·gÁÑïѽŒwŽ~¬å ñ¾òàwÏ{†Ã¸óôrã’#í3g‰‘Úƒª㥏|Å)Ôø0Lÿ_½ˆy}èuôåJû1'68¨4¶óW6ö¸‹¤/q„l/-6.鵖'€5uû¿znßçd‚nw‡½z!?…ýBk~y_Sìgã}—y\¯‚âqVW»|±t²d|]¯«Üsÿ×MŠÇÎ)蛆Îæ¯ç\^.FE–3¹`ou^ZÍï†Þ“ï×så'öZ eÃî©;‰—S··²áRuêÆ×'v.Æ<Âqäz][\8šÕ /øâ#W+~Uk[®â†&ÂGnË'Њ¦O´Œkq+ô–ó%q€öûu·z÷]ï zÓå“Ðô[k~˜pòõE§½Ñӕ{ž¸¶ EÂîÃÎ8 åYmœÖèÏràÚóÊûð G=òôœPp€ÚÃ~·ËϜW!Þr´˜¥®«Í#Ìx`¬ik.³ðî#¦¼œÏùYp†Œwj¼îú÷a¿Î§™®“±Üq'Î82òg†Ïü\üŸЕŸË9^µf+ÐmkœÞåõ +Éá‘ÁxJ‰è݇Ü̗±‹‘§§á5?èiOxáµä}»€u«“ÀˆÆré¿ñ¥$%í‰@ϙ¯5Ð^÷vMÉXr WhšÆ9jܯEÓ× Rbÿüø»âv1üά䈂ý3364ècÛ;?ñÙ±§ñ\æLî;Aî<@±ñq<éIjŠºØã"‹AÏꛆÐñ÷a>ï旘ÎŒ§Ác6Êx¨V/îz^ÊõbFC—Ûrd½¯ñÄr1û:~L&h{ÇPó”ùb"£/D ä€ìÞñØìàéx֖î7‘Ü÷º•ñ¾îœ`ü2 àh·àõÇ¨_ê<±+ç´³ÕG%B¹Ž ªJÜ3„`çËò# +‚ §×•:dŒi}s‘`¿´Žƒ'=b¬C+s»ëp4RîÛ»8Ç­ÇQÂ7Àp’_!¬%rC½É-g??c‹0¢qsøµ·W¼²×ŒŠ{õªš¬¶½# QΥɓÞ6dgÎgöNÀ O¼Á ”ñ:âÍ«9Îá¹b‰¹-ÇrÛטy¬gä=¸3R‰äD<ù¹ê¬Ð%Þ¥–c}©Êúí?½iϑš`s1ŽÄ<ÀýÄëqå¶õ|òë™Æ«¯¾N ö¼]w|ì~¶ð–ñ}†¶Ä‡}Š˜ÚÀƒ¼ã +ž6o-FŜñÞ~ö«±Ð=Û4gIGJoñéë‡ÜĂó‰Ie~'=‡"ãZB:”äAö;ņëæÓf`þp +ãµfå–Ý-xRvìÑ+È9ÌÆ£„–·äà†Iéû°Ÿy'=sÃVÞãBèΨ¼éÖDFàCp"„¤ÆÙmà¦MÆ]€‹#ۃ}x܀ʉÚE)b<¹‚¤ä™6ÄÆsÚ)±³@‘'ëÍÇ6c@C§Ÿ6%hBít¢ŽQVž°NŽúËxs‹<%  ‚n’ó !¼‡T?4Н¸{ƒ8Âï¹$2~)7P±-žRŸó‰8 CÊGqB¬ô +ÏÓWBÖ(„ûàŒTxÓ¿fìÀ*Râ)Ï\+Á"†âòþe^¬KœMĵô±žÐÒ9œù”nd vHc<,rìø›@í£qóÌ÷Ãr$°‡m¦„™ažR  ´L™ @ká”bD‚ŸlZKXaXp 5µŒSû¶÷ë´ !#€=C1)(5©B’¢d ›Z… wˆ°}IÈᷚíŸÄ"áV æÆ„@°‡U{ä!0j¬™™Ê4# a ý&ƒŒ|yÎh‚#rñ¶ˆÔ%Ÿ`<4è#­åcÄrïôdt< Z²£Z‡ûpwË)Á3EüÝM!Ðd$ìYv*=Pyâsspº¡šMB¾AÂh9®&."/FÞ8`Â}0°Ž0d8×~Ž1(CÎþqÈÉð±=…ÓI=Ð-ž ÊËњŒ( R +”P’‚¤ E¢©Ôš€«O¸NA–’´'óŒxV†×çòÔ2ÀÃæPZ0«àXö¹.VL.[áBñ3HòN)Q#u5W|ã48¬üPàjê5¥7Ðۆaû2)²È½¢ +î‚Hsæè>4s½qì?ã,ƒJ‚W0žº¢c:Ò¹2ȋgî+X¦xF ”‚Cc¯*í Ôì—åÀ„ ͑ü¹ãžÐ8“̾S²De:¼3 ó̀dMˆÌ§-À•O|ØJzՑå^('Ñà ?9•æ åþ´ÅPâ\ԞsvNJ UÐB‡èß¹1 YÂë;™r׎ùcHR̜Ԋ¶k%F·P, ¥’Û2ã2yˆ¯ËãcÅc€ô Ég¤Æ$åa”#¹ ,ݰ̐Á-Ԕ0F9Z˜ÑV9ýeUžHp/É:×¾-ì‚(R¢‰Ý‘4µyõÀ.g–í9+%8•ö„ÄEâX:dYIw«?žÊÈ +ǕI3yãð%ŒBÄߊ(iM„~-’òׂiý/‡Z[Y\…ž Cö +äB¾»l[’(.Ó mg" H¼!|ܚϼ#Î÷LõìW¤Š§D´jè¼Â FNéP’™·a½ ÖtByZ9çýÈ'øµ›{D7/t£HóQŒ Äz§EFQ ™P¾:ãHÉk’¢‚¶pQÊQÆ´ä\D#s™ÒˆíéΑÒxŒæL N͋\µ»_ÍÁAõ}3ljNœ—È5¦Ð)`RžA’É2q~ÉB€^Q„ÉÁxÉ9‰Ñ:‚‡¬Jù2.þØȇêZ‰<£ª<•A†˜§ñY7™áP­ÄÝjêÑfü×ÝþŸÒ䜢”A¥ÏRg¢rTcý.môþ¶ÄłøC,S<℀b€ç4yðš<¶ržËfà$"þ€Æ>ˆ¥—êá¶VA¯+8ûFM¤w'‘Ê‚ru [(ŽÐÈ\؉Z›&iíhÊ$Î9Ëv9eu‚K‘ŸÏ9ùL²d—&Ô}e^ÂMi·¡¥*H¾!–hÊ9…0ٙeê‚òßdæÌÐˈÇÖ'½€æzá Ë xçtÂ¥Hƒüz`’XåY‘;H¢dâcۜ¢iå%HK˜Žì4ôÚ%a¤â)©iÞÉg%¢Ã”(,%e¨QÖfH}õðLðb7¤ÓFçmA¹¬°!œ„“å:£ÆñZ£3ʇ ùͨÉöƒ Ý ‡9Þ˜Ò1’RìI'kÜNrÄì¬S‚«„(Æûffs ¨ù–ÌtcV¬mJ/væ’ò­p¡qß´w¸$e7B¶& •Ü1—R ýbnÛ~$G‡',³åp÷)M±fkÓ =\.•ø̮бºÒsÆ*ò0ÅÁŠ›ø9l\„tÖ`¢ð9…>¿HÅ[Öýb¼Ù‹€¼‚qÌ©æ½éÍ2Šüš˜ömCrą ²‚¸Câ•k0ÔÈ<£ + (-=ÙÀ4Ì+²¬¼ ¼jJ$IÆÛÊ3¸¹’ZFF$R“®ªi¶Ü&z04ãÎd¹f-ۿ׀´²H<ÃÆ}àä©!˜rÿѶÁ¦ºPF@f~”ÅlŸrÊþH®{ÌÐ=c¸Ãþb:Â¥«ƒ0E¢©n7°7,Í`À#Cž¿ÝT™f™x¬šœ !ý¬ðJ¯æ9î'þLŖtú±ûÒ5Në÷+&#%3…5ÙWeA„LbK*ª->-Nø¦>n ž§­”GIg9«¡`ãÍ8-4T#Ë­‘tZÒnÊ#U4ñIñ9XF²x×0æ<§Á4xNàew`CB,ùB’ˆg+#Ȃžºp<¬`À, ïù¦Š(…·ú=¥¤\2äÃ€g“ž©ˆ˜äˆHRΙ$Ÿ­  jÆÞÃ)š”ÖÀ”–¤K+@ÏM"(+W2c°;Ã,õ¡`õEysø~4IÇÂ%Ø'D±GÅç}«2Îô6h¬^ÁŒ)I" >dy¼÷ÈA,¯jéNˆ5¥2¼KS|~¦Dj"ƒt–Z”¡Ú¸‚#-I µWÔ ïР¯s‚.:J’•{3Õ¿XƒÀ7T+,€÷СXVÃPaoÁƒ p¬¨Ö‘j:Q\¬¢sn:kÕ5 –î §˜ *™Ÿ¶Ø|ËÙS¶sꌃº¡Âªdƒ¤r±ñÂgDÆO̱H˜õacðù¨rf¦`Ÿ¤ñVŸ¨!o Ey!2g@H,³fàQ†rA…$_ž%žÈ’ÃñNÀi™A@zÇ A"1—~R‘§)U9a0Jò)ëŠ^ðºÑ9ËEÁ^pÝ®BjÊwÚª”g&X°}Æ'ô|ƎÕ$w<Â}‰ â2è]³Hšx¤ÞÅñƒ|”ù¼ ÌSšŒ(‘|ș0Š‚6妉X1,B`溣®²$&Qžmâªã8`¨A‰rÇ`¨8Õîm)Q•B†A˜0†Œðâ é÷wî¢ä;J%UüòjtœÔ ŧS«*1–¯ñùˆ¤ÅøKAºöÕPªq=0 Aß=,*‹ƒS˜p¶›— "åÜ‹KHKÄJ +(™ñ†©• 1jTüï•I´’¤• aFå)1& ¬ÈÃm™h)G¨: ¯%€*?'È@±l6-aâ®` %btàY±Túœ=]¤TÒ/ϘlÎäû&ÀdÉـX?Ƶ§Ä?(òJK—ÊlX`ÆuÑ0›Ùc†jŽôFj€@»´Ô„Öç5 ÆÍëY‚ÌGSê И-IjH!9]3W*ýó:b„Xzà”àAmÁI8”Qï”uò¬‡y)=±¡¸@ |¦£2wô6# k82u8J¥!¹à§½^hTƒDŠ­@2òé(M´YÑCï—:K²[B†3rSVð]MÌó•‚ÝLi˜¸,2OR±™QÞ·[®œj,¹Nd2O9ú 9S‚"› ëƒ%y$” -‚n¥Ö'‘é@%n+)H¦¾Ÿ9ÎNCS¸ÝçpAd€ûÔ|I +(Û#\j>[40š‚dyÁÝu/SœGô :÷/.~^QŽ)m ®{ 4É ’jN@´à <̇àȸTs¬˜G(9¨.ԑ0‹ú +eiTãj<æ428’¨¥/L* `Sò88ó`Œ]ô]Ë\p¹ŠrJ‚”tš`7¿`”Éyíñ6´-}t,§VoÛKVÞ(‡ª‚„BÖ>§[´N#¶ã KÁx~ª 懶ï%`r³ 3çÊÕXöž“cƒ‰f€g\ÏR9Á€†Ì\ڗAÓI  Êé*ß-"/—ðe¿´ ò18¡ðŠˆB,”pB‰–T··€ï¤<\R†<ˆXQó”àÁ*—¾( Yõ•BØj[p.1ԪḉqBY¦b cÁ¶ùBóδÉêäb@‚%°J•öÃâ›øyÍ«ËWF•€¸¬±¯Á À„]}FQwó,‹µ4YS]Röð"P‡ Ÿ³ªÁÀ. ¨Ê‘¦ú.HEgm*G’tPAô֑Û,’Î$IêZ»Lb‡Ö% 3’˜¾†¢¨M°ø`ù%Ô¥W6´‰ãˆ +Ö¦Î6Ë«^šsÿ¼šŠH%ÌPb` ¡†'„C;˜Ì¸˜©Î «J‚,›G]p’J«"ÄøfhÉҜŒJ"ª$„ÒŠ¯À”RKê¯jÁ"iÂj)À„ó„‹^iI©ÚSÊ<ãŽÂó’ü˜ìzJðpZ £Ë™y˲@_­%¦B̙Ò,,gԘ8¡ñ%ÐÒÈMŠÜAå/ö±;×ËkXÉցBñXLÌõσ­‡6Zæ xêŒb»wd,bµ@œñN /l–JuÊ_ý`|¥rF YbÌ57®:ÓH‘PsF€“ÀHŨC4NÀÀŽ#4›0_/#nœFb>•ÁI`©7—ñê(ØMOՇ-Û ¹L y>ã²a§ &®´¢§cJ:A çaâ±È‡#ªð²­Îc›T®¸âßà`´ˆjÞeLœÔWÔ±õ*¥Êg`à☚P + +rŽÔ‚ùFæ †˜P60s&íè{Xw\R0 ó$t“P ¯èˆ€ +†q\:Ñ ÖaÊ¡:ü¼ˆ¢.“ÌÔ&‰j? 5˜oÊSJš&Tc 3 +ƒubH!õ3TæXÂʌFA¡ÔQœ|ìØ4d™Ã¨V 7cª¸f†¯¯jjœEÅᜨ`bm„cFd¦Ü3š;æKrfÎí¡Øèðࡸyû-ç´°=%y€g† ¶Ä +Aàb·¥ñ՚Üg#0‹•§If¥ˆöž—Qð0pa\ԅԭug® Ö:Zëh†§©#Ó=RCØÜB…n§³Äþ/oÕ¦ü1œN÷š(ÈÆ­Y JEDeéKa~ûƒ¤“RAI˜N%>›b…‹ l»Æ’¯.‡ +Õ8$-AiØ1Fåb¼ÜáA¬ºEöLꗌ‚ÓMðð¬¹pA)®@ëQ,Gä¤"*m–§lÅÃ**®i˜üµñ@qexÆÕr°–{Dc*õ拺ŽP-Îiö˜ÀÃuK«\.5ÞçKs¦‚ï +å1õò݊”}š)$ER]«p²`–8kX +v(Êö¥Š›Ð2>ÍYI}x¼¼¦õU õ5~ÁÐ’‹¹Ò:d)· …,¸æ¶S•ÑÉ*.²ŽK‰jy ­Ð¹ŠE®Rª8YŒÝô^ঠ®Ì{‡ñ à¢îÄÔ +…¥Á6vT )'35=7áädã«Tš5÷‘pm,’{Mîñnȉ¯XG¥Ä0+ã„8ZᙄôÙ󌊆zÓ}ñ4é +Ešr Dï +–­)?¹ >âJX¨á$Hᶚ ã›\•„i*J΃ªnB ¬`‘Í€|˵trM@s±ÎLG4oe4`:`(m@žláI„C3=C&}ÇðA*ü >à¨Ú•È˜i¼5ìÜÒ3&.®kü䘨b)v‹1„ŒÏ\2ŕw2¯ýZ äk¡”‰Só¦îF•¼4UTϹMªYè3:*èƒ%‚}cAõ…¯æ5ÙS./h²€@QÌ.Tzÿw,/:OHÐ œZÃzSgM*æ²XDŠLÈN§ØJUb¼dï(V¹R_G»ÏxQãY¡]Å ØGM“Ö f"Þ<ãÄlMÅw  !0%Õ]‘¡e¤ˆ'”Îì˜%¶¥Z7R +ƚ ï{hœÐ:ôUý [œ¬tFƆ—¹5áÔ@8xþŠ‚̹äo }\B²²‹ÕŸ,cpµ|ðu Œ&eÝ ëáU:RÃ(TÏå: &½›,Õ$ù4•‹à0Èå×qD²¬á.ÐÁ‘è_†ë+Ÿ°JVUXoαÈÞ¨‰06û êJ QÐõÂE5¬,úËMˆPZ£,JåÈ…*3ëÁk«T^™¸_7\ã‘T—Z*œD÷ø-¤–lºpQQ %Whðºr®¨äd“ú¼’šôP¶Æ…6,}dmÌÊC)^n¸¦t]̇Òèi=–Óèj¾…²|5Ÿ*x›ûÃJÙ ¬ƒï\d^ÅU7èÒLh«3FÀupérᾪo¡\_ÕgX Q‡Å[x(rF5¿È‰üŠª7Ô¢ð/“g{Ó!âà\MÑ- «¸Äá֕†Å•ŽG\A!r !"՞ÆWTUkßñU”Z pCQ¸A §ˆRðæqaæ,M}¾ ĺrá ghòA¸\å3áêyËå÷|ï– +iÝ<ãqRº]!(¦&áêZ¡–ä¸TÁéÇPMÁ­Gx—Áp˜ÚœÄw +ùÍ']4ptÑU–$ëE¥1ÝF²¦%•ë÷<0š­¸|¨¶ga¾eTÀVB;Ý5ák$dAc/¸¢3¥å®$h‘Rñ*éó£ É­Te¹a¡Çõü¨k2*ªG…ê=œ/¥ŒjÒR7T»BDÅBøʈšƗ"/<úQI }á²÷ÀŒ…+ª|R× +endstream endobj 23 0 obj <>stream +~i¨FŽ…À7¾4cœïÖ\ۋ/\Â{Ýû•ê ‹èÞ¯”•1,Fîü4TL˪6’jâø>‹xox¥vå£ÜO)_“›Aa~¾q6ç» sÖb] ~‡œÇÃÅc×v:TÙ¢û³øwÉS]ßB·!µ’S°“ÐmC~/:빚B¡8w—²å¡¼ ›Ç|±GÀ Ù žˆ¨‚ +©~t+¬áZdI¨Ž´Ô·øPJC@œV2J>꛽€¾q0T*7‚ÌrÞñó}Cá3Èac…Î;µ=’Væ8€fãæ Ã{oò”“m§Cø¢/فâ;½Œ9¼´p!²îŒLùi,ÖWðÆTQÎfÎÅl$ÝêR‡'0Ù$Š~0a\P¼Ð)ÌOLTü0 ŠpºÏit b_±f'ßóÿ +Ž‹„‚Í*øÓ]m( +&Ãp¡ZÄ|àA,gÆ!b†ïÅØOC‹ä/‡pNvñ¦Þu#`‡f R·o|ÕþfIDË ©¾õr‚Ä«#¿fUÝ<ÜxŒqÍ.œÅèèÓxÕ­Ut¾þ¦óëߖ>õø‡üüûÑåñd>½~ћÍÊÉ¡ ç?G/&ƒÑl0z}täáÇåëÁ(þåË/~ºÅßDâ~<ûåÙÓÁТúò‹Gü¹ó­ýö돧?/KüüdП Æ£Þäý†Ÿ¾ë|ýÛÍpd<²œ .æ³rúMçO¶áãɤ·Ø¦=^NʶG?ŒfáGøgöþ¶Ä¿:ùê›Î£ŸGƒ¾…ŸYÜ£×Õ¶o{ùoünp9»^ßzÔ»qmw|ó?ÝÓЎd‹¡½o>¬÷{2¤ßšé·ûÒãÎ_¼.¯†½þõ¬üko4+ÌÎú×°Gç¢ñp—¶é¦B£ûi«­v]^_ÏšÏ µÿS³ì:Ï'ýòñðöº×|ÂGÍÉ3Ýß¼_ ç“ƃš”Óù°Å¼Sûûœn<²éìòIùvЃn5_õ©†«{ÕPĺ¡Ô3hWå³Þ|:ôFÇg4Âú™ÙñI»lqˆ\Þã)ÒbD-NúË{<ê[q}a…ã««i9Û¼}î†!Þ'«xŽ#Ýg&ašsöùäª×/Ïú½aق³Wžº¯9± t»þx8ž|ûîz0Û0†Ê‘ö¾Õˆ]óG¹ÃAMoËþóù†¶Çò•Hš¯FKŠù°7ùþ·Ûñ¨µäò“÷6ÜÖ£=¦³Þ6£ Oî©Òt$ûŸÆû½9‰~¿G‡h5¨=±Û˜6cjm¸¹OAçÅx0š¶2VüéãõæÌïíS¬ï³¶MD¶9·åým‰MF4¨ñm9éÍÆÍUîè‰}‘KòÖN©o'ã›Ûñt£.°Û ¤¹0õ¦×xsL£ùúfÃà+#{1¢ 6®Êˆô>ˆðoT‹©ýáyûs÷&ƒÙõM9ôôaì$©g“Þíu‹‘îˑ<Ì^ô›4àټ͌ìڑ¾…}‹e|Ÿ³üc9y]]÷Yòj½%?‡Iú¨ÙŽ`ŒWã~¹˜ËQ¿¹×Ù=ܔ>üª{Þh|6ÌúN…ŠKš¿ ˼µòн±¢nÒüi<˜ÔÓ½WO›[”ö[;mΜÚéA;Ý¡™:h§íô nîÇ~h§VX~R^ÊÑù†0·-¥å}(›SbÒ»Ì[ËÔþ¾XÆå`Øk‘9xàŠ;ÊOn¯ÇÃñëærï-nÇÓ[ôãkN‰[<°Å[|˜lñûÉørPNãg!0–v¶ŒñÀŒ±c<ˆŒ_d<0Æc<0ÆFŒñYoþÇLû×åäoå ý;ü3*'É=¿lòPžò°é>Ѧ˛Ώ¯9%›î°é6¯'aqž+fzã<Äƒ‹ôl5¤½‰õüËxøûMoZNæ› +©íUÀgnò™|>ìB)‡Büw)tíþ"+jº.›‹Û»&Iî9Ü.ÐpD‡Û>Vq¤IyÙ®nê¾qûqƒëö—îÿå WÃñøÒß)p1ìõß|×q ñm¯?˜½ÿ6é¶9°÷éšôƒÝxíF·gûî),Ñ}Þvp’/vÄ;Úr‡d“]c‘ÓëÞåøÝÉCf”ŸYyp·¢ZÞïTyè¾Öb»ûœª—A5êâs÷5Úæ3z9¸ºšOËö—ç,=x_cý<®'{zº_Cöl;¾tøíÜy£šïÙÞy?.?p_“ž6¿É¡Úoí¬ïÑ#÷5@<äšWþÛ3‰îÉϳ¹Èê‰ã!á«ÏK;È%{+—ÐՇûD+ä8Ü'Úl´{ŸèA@Ûí Ÿ}ùìpÑèÁ]²î’m„–ƒ@¶såî„G¡Åe–{ráh‹Ë,Žîþˆ6”“¨ŒHÝ߈Z÷æ0>\8úŽåÅ£{t&.?œÉ;½êöäLÞNÏ:œË;u.Š{y÷c`‡#¹ñŒìډþAAέ—ó}Îöá.ð‡:Iµ3û¼ZWî,n¯Üù|.„mU°¯wîlç$Ûé±é];û/?>Œ[…nz]óRAût<ˆNâÿ[÷‰!ÇŽ[°j¿G[q_¸Ì3ûôts°ãþ3L}û±ÁÝm.óO¼Ï"óPütwÝÑÃ+ŸsÔ\ ڗú9ŸÊúv/ƒ{~/¹ê÷É<ö¿àÌÌÙþx©x(g{y_8 +¸m`m¾ú ..~Q#[MØ>®Ææ ­û&ý‹n‹Tăü¿+;ïa¿^•“§ƒÉΘ€vmög½‹3¿O†]Ùiî#B*üÒÒr[y螙ÑÓù¨ÿrŸ¹ÐÃ]‡Ý¬“t>¯•øì°wr%ŠÏ%ïBˆêgP•àÕ¤7š^µ¸-gwǶ‰&‹ÏNX|¶‰÷IÞwës—$þƒÙg͔aøäãápW&k×è³å’>Dô~`gv #òb½6ז.Ö[3ÚݸXO?¼‹õLóíͽzýã¿®‡åñ¤Mˆÿî_«×fñ}f×ê‰n 7Sïr0oÁy¨ý}Íûå`ØkQÞsµ´‡ùp£[ÌÕ~•Âûq<¹½ǯ›á;¨jxâ^óÄ‡Ç ?I`ҎìÀ w<â{O£^ÌØEÛےöˆ=4ڞñ‡ýë>”XÜþ–HZH¼û] yàé¾VhÃ3÷å„{¸¡Ð-†¶g'Üèg°¡`Ìý[^–sÏ·ä´Xw{’óY_ó¸w¬¯ùж`}÷2¤ Õ±Gðäº7•Ã³rXö[ؖŸ¼¯Ñ>nîÑÝz´ËOÞó±öd0½öúåM9šýØ»Ýç³í×ê õx:KEåcãáï[¹ž6ìu_ÃææȽ; ›mÏô€Rr¨ÍíËvjn Ù·íÔârÅ»É/Þõ üL.ò¾š”åïÍÍÑWƒMå ‘”Ã}XÒW“ñM‹QaëûUó<·>Ç÷(zncSzùºÍYá›ß×ÀzÃw½÷Íg€YoÒîÌpÜÛZl>¸Ë•\ãûTóó-÷á'FӁ.jgv #±‚«I:¦¹†êH𲍒=r_BÌçXÊõñç/¿•Ãéí ž· sxÀ¡ç“òf¼)ÀnOCÏ£Ëòj0ÚXA¾¢tݖ½Ù“6a²Ñ#÷5ÐCì6«Ì{»-ZLÝþo7<Läöôb·‘Û‡ÈíV‘Û÷Ãq:â;™t„±ÿ&ûÿïìgû÷;ûCó[Ü>À3sZÜñê»&­=äÂÙ {lÏ> ëx«)<ØÇ.¸ûr?˄·Ûb{ÂúûtÕÛóùž~7GÀý:çÀµvÍígoZð7÷È6šÛ|ßl|eDb/F´!Т2"}ºKómˆÄªŒHÝ߈¶“ç÷å(îM³ë›rÖBÎØÇ#y«ÓkæO’÷úÎæ}tm7áwþvf:rpçÜùG¼Sîü–wþÁ¿Z9¸ó?š>ppçÜù»ïÎ?b;¸ó÷ŝò-8ôeò];Y÷àÂß'“ß~‹.|lypá˜RupáߕÄ홳vur*Ý×:|_‡ãw:¼¾žÙG}È}n>ÖÅçîMsh®7 ®®æÓòd<²ÊΨÿ\zðÞd–æŒt>¹²bjËõ[}j?éžð~ =Ø3¾íø>“û)VŃUñ`U¼7ÙàAÞðÐFb;˜¦Åƒiñ^4°ï^OÊrô•fËïìY9x=þîí`<,gßMÊËïƓÞhSìÂÁæxïò›È›Û…{¿næ³ EØ+k•¸¯…š6\9´ßڙå¢GîÙ|õd€Šû)œ;.dûƒÊÒ©?È÷yƒX^öù˜šö—½µ¿Lo˾ &Ÿ(Ofçק'Ç÷¿ÝZ‰¬1tùÉ{nóӋ:ÝÞö»üäÁu°D,QKÔÁu°D,QKÔ.[¢¼ÝÉY¢¼Y + RKÔ¾)ÚKÔ]Y¢î屮oïøçb_;óJÛC0°=ìD÷^sf«ÓÁ¢öà³Ûw½ªÉžTžiQÕäPyf÷G´'•gZG:îÍaü™TÙ¶Žß~ËÃÁìEo°ÉÅq8“wâL>Tƒ;œÉ;½êöäLÞNÏ:œË;u.·>¹öíH>Tky&ïcœEûÉ>T€ûÀÎì@Gb¸Ï´:ÚYÿÚ"-G‡«Î•7îð\¾—Á5/ïwG•7îó`z(E*š_Þ~Ùü–zl{_˰ň޷Ñû=áû +ÇWWÓrÛgR^¶ãö{ª°<ÇÆÚÊLùç ¶ìÚt}2×ÅÞÍÔAÁÜ?Sèä«Æ‹øÝà²MD£o~oGég¨; Ó|:[Èy÷(æµR aüeñØÂñqª¿ß/Q-xÉuÙ*R•ÛÌ7ëd†ÝWÄöÍ|“Ì7û'£çÎ|ÓbDóÍÁ|s0ßìÔF]›®ƒùæ`¾y8æ›ÏÑÆÚóÌÊËÓþ[Ôgp5éõg½áOãA‹¬÷xÓ¹ç—ÝS©€³Ù`ÖbƧØüÕ`Ø&Q¾òÐ} 5é6¯!uћ–O'åÿž—£~ ¹á±{35ëÍožÛþ¶ÍlÆÏÜ×û5ñ~†ÔÜd¹oƞC;Ï_!UJ–í\ɲÊÕd|Ób±õý«ù­V³q Ig|czðUØd¶bØ¡[Óqj°=Äl÷gÛ¢ÙÇ2‰½šO.æCË,€)õPi/3=Û¨:ûeüÞ*ò`snaµ9„ > sz‹É܏€ÁڛpÁ_ÊÉ»Áä¢ÎG¯Ï7„Ø«Á6¼ä3 œ5Ý÷è$Ÿ‹K§yœÚ¾zt`[>ô ®ƒ~zÐOïY?mµÍêAC=h¨ õ ¡î††Ú\Ú=h¨{¬¡¢’ŽÚ¼BÌ~«¨ÍÇyPQ*êAE=¨¨uUÔ¯ÿ ’óïG—¬ª"Ìèü§ñè…Å‚gyø1Ü¿ÿòå?Ý:<Úýxöþæb<´]:./åèª^B!‡á üã?ÊÑÔtή†ügÿº|þÖöùˤóøË/’ίï¾übNÿû×9Pä ÀŸÃ?¢“à}ßþÍ~ú§…½ëèΏ¿ÿ#é\~):¿¾„ßlÒn’$ºèû þž~ùÅȺ©É¤‚¯ð?øšJƒŸÓΉmPtRlXtø7zÛÐ +þœ†—áj_ÃgDŠžâ_ú%zqÔeÛö +bŸÛGoàOÖ‰ÑþÕ¶ücWá¯ýršåîÝö¯{9|€¥Ñ~Äýz”»Aån ü[ôHî ”;ú_À$}ýóVÖeçõ¤3>ë¨op®Ž +˜77sôﱝž£›$¢s$,F);Rw²Bëί7•–RÔ·LMç¸ßçq3œ2Eœ8 ÇÇv1þ Ӗt³h"¡nܪªÎÀNA 3íÈS-úËóÍÞÂÄVÿ„váa?Ç+Ítԃ¨c4Í«fN6Ÿ9‹J&UÚ ²Zœ9QÔ·LåÒÌ­ÆyÜ §Ìª3‡÷õ7_ÿã}l9UÒM Ã¤§Ê®ûG +#Œý`r• +ø!üÿ×Þ2ï.#»¹Ì…êè®ÔJà=‚Ï2…µç„)†Ï…íþ(EÐGû“² Et§8‚¯Îí 6«žÓ_m©åFyd8>~ „/dzP"ã«sàïç¾g€–^sÞX×±ºD͖Эï­ì*“ŠB7ííÏ«P‘˜aOõÊMFßÿv;žÌ^Ñ!ùÕyÒyt<«F½‹aùl>¸ôrÁWçbÕK{tMgìP„PwMG(ú¾ÁBxô²ì ìÙáü*ˆŠ³á _žõ{C;Ög“Áå_Ë÷Õò‚üC5»1Ô gxé N`xқÍo¦(0ŒkƒÄí_”ºF¤:ƒMj—¢.Lü!É,W°¡Q¤uܶNºù +¡B$,U¸ýn^Ïë3’$p—fü7óÛÀ"͌J5¼L¦Úï°ý³Tœ"*“ÆÔð–ԝöG™?à\p¼Ÿþk°RϗÞ}u> ;1áïÚcÚ¬gööà´¦ÊesàÇy|ììhbºî`^‹åx–¤ÊÎqd7ÑPáƒöcÕñØ·MÖô6Ù :‚Gí¹íLÀ i„€Q_×½±ð¸_k¾ïÑ DD ¼‹´;YkݳçA–dEÚÔºç˜õ4STJL‘2ÌÒ5ʺ)þÀ€¨g ‹§5áQ¤”Cm?ø¹á)ÌÃL¤a50*xRº9ԞJaÔùâª;üòâ# …ÐÒXSžƒ0²E5µiÀÿ‘›‹T墛ªؖ*’”8«À)¼Œ?€G ìè]øb?(”c²ö‹Å¡V>•ØW‰$CnÛö]ÇMÞ¥ÍÂk˜ýÞÕ2ýו|¼®Š‹½óè§ñìeÙO.íÔyv¿r¦–XôÉãžùé~u5žÜ¸ß¨Ó–…_Ž/ÊóÇ?ç¶Ïg³÷Ãò<¼}q ZæyéV“ÜÆB„N逹ÍMį—ÿMśti#-l´¥ÝXá¼Ñ­.oùE¦°Ä96²“˜¯ƒ1ÃZbi‹{zÅ>_d#"Ð2GYâڍ\| ¸E¶j;)(¥¬cn!Vî`|*ÑÌ-tÌ-Z¾ë¸É»´^xÍÝq‹=Ý᜼ ;[¦iùDšft@Bv•ÌE®p»êA`IŒ= íî–Æ´+Uæð:@ÞͲT;†žV™?R¢[¤™ q–!„çÔËF•W-væh±ÃpÊԌë(:~_¤ÍQL¹£˜ªÀ¬á»´}ÀøûÅvHYýáßÝOv¨if Âc6 j‹Léã ÐçG¨ýÚdð¥ú¦¨¡w'n9P¿ã1½ VKðÌ@(‡_¥J•bmŠ: ™uó¤@sÇғŽI™ÐGr@8¹®¡=þL ž£UB|ºü.×l½þ¨`DÎ>^¾ø½ŠÔ’ßöèzã§Æ¥™ÊàiY„©]„Ž6÷­k´*d‡sXˆ¼ Ï¼†ì·®‘Z 8'–¿îR@±€=¼ú„m_»eÊiGçmÉo„Fn»ÿ©yû÷ƒÑ›Þüjú®÷ºžÃæ.ìë 5DðBN„³[$’—2Ša±Ùu›)¡aiä–I úWHZià2¹€•–Øݕ¹ƒäȤ»c?OðõfyK’;c³e¹fßg$œ1î»´ß-‡±ïVørå¬>®‡:A©3ôLÈ ¹h¢SÇ~ +‚­}«Î-›€-’`à9@ïˆÄ 4ôªnšË'à‘2öÀ(w¡%P 7ŽËÌö*…0{¤x<îeôÝ7n,:tÀÀ£Ðw€=·,+. |°;±È3…c…‘ ԇ<ñ3C߁ò¾/âûj7‡VJ_¾×†¶)L/=íÖRea96 Áæ®rXIž$žsZÝ0ѶßöÜȍ,v œ¯ÜyïèÑcs\4µp¥Rnjßai’å7ž n¦sGS~2uJY†g‘UÛuk9ˆ]ËJC ¼%÷(eWf™BÉ°¨ßôh ˆ°¹—€‘R'JÅCal=‹:^ëvñË\Uölô’%lÁ/aUk·í/ ×à{¤OæÅzBÇîJ+r¥á»Æ‡ê¦‡äôwšÜKü÷>*!™eZÜÂêtij™N@A€è-¢ŽxÔυ¡8Õ>Ÿ™xxöéB%ü”ý“Û #œô•ßJß/zÚ÷Ûcã²íð˜÷%ð%ô4}eìðo§§}ߪ}wãÙ±ÃÔvMjÓ1V̔cUšÕÌ$ò“«OÛú4ˆÊ±ÚüDLjUÁž;ð·ðAÊö3Æìì4‚Á•Ž øgë`ѳW^§ƒ­“9é%,)- +{T¦ö ­ѓkìÜÚÛ-t½ÝBëÒx胇¦Æ@à„NMŠ.~{Ž‰\w)œ›V:ƒ•†®fJjYÿlfw‘=)í³F5;ߟåýiî4%må™ïµË †k“uqê7Ο¥¢@{£*ÉW<+³ÄÈ°÷á£Íº,@ï3.3±§öøiœ×ðs“€äG?ö¦oÌ!?ŒÞ–“Yy¹¸IO†ƒÛ[»/áOSزÔþ×?ÿsø‹ì(¿åo¸?^ö¦.!éÜöOt~}ælnåÛÞMõ¾óëOù;¯‚#Œ-Âþº‚­üëõšFr Ýÿòh]é:½±O_a‡žôf½oín“ù—_üúÃÿòÁÿù¿ÿ½ò?ÿ~_ýóÿ÷§ù}EÇ¿~ÿ—]XŸëß´¿>ì?ÀìÉ\9Ú_˜}Yh`^?­âª‘¸è<ÿþûûðÙª$ñÕ9rå PœÿúÿyÄßP!:µú9sØïñù2JÇÞ$°Ô͂D‚®„Ø°(‡,´ðLý_ç®gÛ§Às÷ç5B—%“¯Îëd“K"C=´‚áÊ¡YP"h$X,ËBJFbÊWç ¨À[‹*VîÝ^XùêüCĕ¯Î?D`ùêüD–¦¯Z¾:êVóÜ9ýj…s¿­ððø‡ÎãùlÜq[rð{|BËÞµçÓrò¶¼<·2ý¹k5­n;ߏGãQ§…[ñ‹¡LIäæHTN+ûÁjv¥…à§Ábµø·¥A ÔäTåÆIYÒº˜@RŸý›'näÎpd—4þB€/³'Jà©J¡uü¨]PÎ$@Ø#öÁ#ó@Ù0£§ @•aX¡·œ%ˆ{AÄ&øUó7¨ð(›ÑGìÅIÍH™áP´£ 2ÊRž»Y:ôà&î‚U½$uǝ·»½Hó¼Ú{0o!*FÓnnRmæ@´ °@»#dÌDz{D:îdD: ÁÂXâø;‘n‰Fþ¬Îë“.†á…‡¿Û¼Â +¦yõ@?ƒÖUÚÁûUÌ.¡ƒ©ŠhˆvhÃ`ˆŒ™hÀ¯7-u3"…äÑzÌÑw"Þ•‚§‘Ù¿ÂäYEf,¬ š{IÅ«¢k%‹<ˆŒô=–  Œá9/ôÌ@¯ÅETÊÒ¬"-Â_§ïyÔà«Éü!…ï'@$*(–ÃsDÆøú“*y⑘`BË wǔ£>Ƥ£ðƒ<|B˜t‹4Zþ*›ÖÃÂÖòÇtØ|^’ŠIG"WL:ÌøAÝ5bâ1,¢^sc$ÔLze×ú~V¶­LضDÞ¶¶íªÒ^D=É´r#$¹ˆH@²SD:–±"Ò±$F0–Õ1"ÒX ] Ãñ1j¢¿?"u3¢„@2ñF߉l‹ô©ŠwÕDƒ#ˆFOBSD5’­"¢‘üE ’Ï+}(Æ @°„ã"¬4nzqD-ê^D-xÐkô¨µH—ª<Q‹@4®œ +7n’“"jyi*" \"ŒÒ÷ˆX +Ċ@8,ÂJÃöïhE‹h•V ²G}'Z-R¥*ÀE´" ‹Dޏ^,ŠhEÒSD,’°ø)/1Vÿ="ƒ±"3*{¬4nzq¼}÷"jÑø)4a ߉Z‹t9Ý’øqý³‰7âß©Ÿ6éà?ÿèH«Š%+ü´Ü@®¡û·‰Ÿ6Ïô»i½+‰þ÷ßáû‡þø/ÕÿѧÃÿáÿÔ¬¡¹›Õ·úÇmÿsp†Ö;C´ÖI³nî¦ñžËEGoãªqO.9kÀmÜ5ðè²Ãƍx+—M ãÈQä“ˉðäzFoŽ}ºÎŸ³náѱOÖùt,x[¯>ºì×Y·ðìàà–|;ÝÊ»SGõ3PëöY·qüØGë\?ÞÆùƒ.¹ªÐ Ù² Á[9ê(¸žàuÞ¡pÿ}´ÎC„àí|Dø貗hÜÂO„£[ö!x+_Q׽ΉT…6w#ÙÔ9’¼¥+ ­q&-€[¸“,C­q(Á€·p)ÕPo-­ë|MUhsodÍ.û› hÎ6'xnÙçT…6ö:Á–ýNÝÂóTCµµ4®sIU¡ÍR.´ä–à6Ž)ˆ\ZvMU¡MS0 e÷@·pPÕÐl½dR㹪B›û®ìs5Þ+„ná¿Âç–>1BÿAJW-Ibp~8Å*GôkôÃtâªE¯¨vÀ÷Œ>¦h$~€'.`jq`˜LÙüÆ®xéÿ‚A'…O|å;~>Šž:r¨°mQéàòWÎ,wM]çoèkê‰ß9 +¸é¾4Å¿ŽbG‚Š¿pƒøIðÄ÷"ÌSõëׂrⓗ+xñüL½z|öêû{*¤¡˜¨JnqH+/),À¡»…2.Š`ʾH+\_B­I`»©ÛÞX>Ð¥ªY¨R¾ˆŽve„àՒëXÙýcÔÁv~gKƒ¥MPt]¤DŒ®"@`û.AðÁÄU9ÄÄè àãÛ÷(gqT¡Š¤r YÔ×ÜWNªƒ…'±¼ô¾ +W¢]ÍF¦›€2H®Nõ,j·ÐٝÝfYWY^•B¨s£3¨’º:bé§/Àõb|ûómå +ÕÚÊêíoOê†¨Ôv®2§+~ïfMEŸeø|7:Ry7øíHCáyșMò„¿úWøìâEñ#6Â󇧫ÀjLôñ4ôÏË¡\~« ñè!öпô”>Rzzú$TD‚©qÝÐGŁûŒÕÁ€¯r,ÖÁE ++{qCÆ[ÕOßIegÇþ(^«è/ZÑ?MiÔX_$uô÷WµÎÒzú¯Ä}Ü÷"ý?°j4”³Ã åf×¼/c(±ÌgÎpÎâN< +ÿ¥+?eŒX‡e±b{b“è£oqÍ1•>¥‡Eu,¯ˆuåÐö¡Ø´ê™eœ)Ô×u¡·ŸTzyv¶öf؏¨xÀ¥&MñFíBå”Æî`–?h ‹•Ê3eÐ씣Ž÷pí¥ÐG;Õ" m +o e, Wõ1¡ËÁì´va_ˆº ÞD€>¦2¹îp#ê0cYUMaõG¿þxúóO:ßv¾î&ýay®Î¿é`t¥:û€ý±:»ª›äM¦i¦•³£$]• »÷èT.-±\sfå3“ ¤à˺kaƒå&…®ÂéÕ¾$c^$pPÚƉò䆘Ÿ«ìjé–ø)¿FHŸ1ç€P:KS¯¢Ùþˆ/ñ.ÀÀ߁¿YÑ+)–Û^ÍÉòÝ·s%,ŠxØ©Õ%4:¸aڕi‘ÀÒÌSœ¹#¸NÃÅ=Ùß²T¡“2Õ ÓA‰barê¾¢®"€"± +WSF¶~WÜþ¢t¦Ú©“å~n`P÷£…Áíª£…åòhð6,Dã¬ž‰H²£‡QêCBÒ{èܦ'Þ䒲 -Âe[û‰ʝi=i^‘£ð’“z§®e½Æ³g¾S×r•¶S¹ë'¢ÙM•–,ý®øÏFež˜ÀGDáÊ4/­·2¥åClÍò¼t‹™ÃȺ¥¹sák­gÏ>V3‘´Å º ÇÅ9ô5[Ïb Õª2?» q³õÕy4_4K9Ö¥‡ÛL‡ðG¸ ŠÛ+Y˜0¡ ÄId].ýïš*±ð*MÐ*ÚÕÀ+Ç/y,?Ç~ùŒ‹~¯œé +ô÷À,Ø5 œÆcL"#XÖ-^¿‡W6àͤ²@•îؕ/`Á«4N²Õb48¹•J𶢤/ŒÅ~:{-u©Õ×4¸v]¸3¬² Ý4oWeôýÄÕµ@²«UQÀ ¥¸P­Ê”ÁüٞK)¨RqhûØ("Æݶcס¸kœ¢‘¤.|>q:jž¢¼c²Œ‘Îtg’f‰~'X©Ոð›r‘¨+ow \3B #¸_Ânpr]ƒ¥²«Ó/t‚2ý®#VÅN0¥ÉùÜ-Dˆ<ÅÇ}šŒeºÀk*¬ª ›ìKj9ìgagTdxå>gE'ǂ¤7À5mªp>»¶Œ…÷ØW!§Ñ]#„T<)ôµQ«Ç¨‚å׎H,A*`gçÚ_´€²Ù ތaUaÐnàn"wšQ®å0ÊU”µ,ËÙKÐa OaMTn\P{^™`保÷D»P¼†1—TŒÖ»Ša¶„v°ÔqF`I"ÌÌÒìÔÌh(\jggM@ÝÑf—Úi¼¨{ù Û%ÝÞØÀ26A°oÖÑAl܅]Ò|úà†W½‹ÓÒv´<²Ÿj•ûd ÅÞéY]'€Iºw­òªº¤ÿp‚†d¼…¿;2Þ ÄßáA“»ïRûƄ—©Ç濃‰ÞßÈ#ÍJ>ÏݝH€V:—)˜ú¹Kø-î3Pӓñí¬腕i@‹_|OÜ•<áÞ ³ø•z·Jû2-”oáG`üHƒ‡ÉÊ%™û /ëcx!e¾éÑ´À+UU´ï]Ôٚ½·öÆÓEee•ÜDßyUY¼kV(¯^ü\]ו%o¢É®®¿šUª«Kò.\hD{UCÀœi¯kæÊpCfðúGÓ¬vÎ[¼wIOoôÞÚ9÷Þ0¼ÙF ˜W¤o+Ù@Ùéô¿*¼Ÿ,)j– MËMí¶Œ.™§j@ÑCWþUªæUôäÍnøš/ã­Eí¿ÏÍÊzxQþîv•÷sÅë«ò·ÙE9)ýëó§ã7óé*‡ÜKÔ9ò4¨hä ç´ô[5Cc*E.••}¼êHƒµP–-Ÿ¬\K‰|«0ò·SúvD_k¾Ñ—©[‰iôj`йÝï¾ÌÀ¹¬éðßNéÛ}­ùF_¦{¾ܛi…2¼?³SÀ-ˆ æ°çɧ‚ûŸóÎÓÞÛñd0+GëÁè÷ùÕÿUs#姱±A.@*áRQz«7²Á5|‰Ï‹î¢S¸ÛÿÀD‚IZ¦ë°E79ÅGP€Ë1ÉHp²Êdîϼ1éºTp8rÌÆPEé.„Ti᜿ UgèÑÐ{¥ƒ85ۀÆ>˜ 4jf5u&îžF)\fŸ«_wQ:‰iJ¨}1zU5hØ&4<EJN‡ +²-àw~*þñËû¨å¹[*¹‘±3—Ë04[²B0¤@u"“ýk5ñ,PæÅ`8¼§·–Œ&Ƈè'ˤ¸+þ”«¢b£lì¢\ Û »“3ô¬éœÌpß&jš ‘s…¾øÌäPt@¸{MÐæJ<Ä»ø>)ô÷ž¸ê{áÃh.hG;„ydâ|'8#v¡©@4h؃å* ¹Ú´‚ƀ´–9@eNÐǪ„.-œ`ʒD¸Ûza‚ÑÎA ÂÎu +I;3Úm|3dá|÷„(,Êèu°š‘ÒQ38Eú÷²jUlåL$ž¾DêRéHÉ°ï✨¼C9ÙáÙT½±2›MPÒÅg%Ù­8}®†×!¶-¸¤ÏlÃï0ms+Ž‡IéÛð<·Þ·ázn“mÅ÷ÀÍSÃù¼ ïƒlæ¶ÜòZ—øˆ¡K|7[ð@L¨ ޒ”½%Þ²‡—g¹+4*X7F”–€)¨3®Œì Z9րœ™¨…Ñ£§N0E u X@¡Uüh i˜¥>ô;RŠę…)[E½XçéšS£†&SÀg¶.Ð%@£—9Ü"m"hÔý€ ‘#t«Xy¼†NXéS ­âÕµ“V÷¼ZEGÛ ™æhuÏ$ŽUjùÑ +Xôü§ñèÅd0šYGGŽz^ü˗_üt‹¿åî·ùý÷ùÅ?­zl5ALYîOæÓëΏ½Qïu9é<Ÿ\‚Ñ~Ï÷ëIo8¼žôn¯}ßô•¥ô£ÎËùè²sÔQ³î£¥Æßtl¿®ÄjˆµÏ,´~êp {ýkû‰Ÿ±«äùȒúºòÀ_Ç×Ãr:\ͨÝå±Ã*M{³ßK«^—ÔÖÏ\ ^‡ã¯“r0-}ÓézrÛ)ªû#LÜåñB×af¢ÎÃW(ð ÷Üb?í7ÕyüÃùñÄ®ïa‰(Nv[ŸœÙ–éùÓaovî÷bl;õi‡¶bÞaDOã9€°]\]ÿóÿ]ßá-_^Y¤îåö3þÏý?XÎ?jTx¿ê¨ÊÛ ÿ®ç«nÏájä]ß,³îë!{Ô¡ÿÅu|ªI° þ”€âSgÕvÿ†·: ç§òµîˆêWµôþ ÛPÛ#8s{ 6¤±ß$ÄŠÜŠ´ÒÑ"YI‹0µ…ûÍÎâÙ콝°/¿xô×ÑøÝ¿ÁAûõãáûé´wþìì›Î£ŸìÂqõè±=‹ß–ÜèÑÉøævlèÓÁП;¹î F×ā§é‘oó'8èý2˜ìqŒHkœÍzý7­÷¦ƒ~Ãdü¦lƒBâOÃçÿ(`…K†ñìeÙÛ#ñu =5:-l $>zR^u¾ë|ùEçëJßuðå+t½èMfµ£<.çƒY³®GcoEñõ´t2ÏyA}³¼º;ÝÌ{ÔÜ'N:ƒv£²•±tn[ٙ¡é¹OHaž–ß¿-GÏ//[Pþc“ Žî$×lœæ!d?˜L¸›pS«¢£ Þ*áxKn^h!ò¶¶ø»¥Ñz‚K{ÝÅß{/k@±vPö™ï+ûsèŒûQÔ°LÔ^ö[ÞIOg؝¤ž{>¿ºš–³op^V¢øú‡ápŽêÖxÒ-ƒKîtƒ[SˆŒV¤Í擷ådÚ¿”VÐý¶sj {ôýÕUùƾãÑ«ÁlKþõóùljUÂ(BìÉ`z;ì½w_¿ù茞·˜ûÁÑ퇑ëTcv´¿»ëãœnetž¿ÊŠ¶;ÇÞCXgu„­Î©ŽÌU|V nn‡á¬âõ˜C]MCëbLuñ«ò…݃³&Ó;‘ÍFaDBŽùØ.N! ™¨«ÝBZ!©øØ=F“øáè?ý‡£ÿpôo£î}Đ«ƒLp ɘ÷‘±ú£ã%à휌'#Ëëïäèø¾ÿ¦uz‹¸Å'ÅúÉ]¡Œtî¼Î×.?Ÿ®Ù ãåƒ7^~eæ´fIù~ÈՇ=¼Ë{E¬De ª„‰4 šÍ騉jy,þÝaƒº;8ã«_ïàÔü$©”¿öF³²ù™ ¹À&§3óå¦3óóåeŁ—xك”GvŠåP½àÀVr£ãaonGòS9Mz×7åžx-w-aŠ¦’‰»ÔJd2+|>nÈÏ̌„[›‚W~)QS؉˜¨™šš$MqW,íÞ(d’4ƒLÛ®ÌdžJLÀI¹P8D¸ÂÆ„R…éB‰‡J¨4Má^ »¦ŒÉD²Ê@@5dÌ +ø´†BP1ù!(ËS\7]-ñÚoÅh XFa}e)ØF׊d=H +å™R¹À°Â¤È¨%˜²Q³†2ú.ÉòQŒ„÷·=UjÆQ…W|C] Çñ»Ê­8K÷,Õò{ˆæ”k(ýQàG\ì€?žèò`IU^À"Q‰‚¢¨~kºó®ÉP DV%üV/t¯—Ž4‡µÓzíhçpòIˆw ǐ`ú(‡Ü8;ÕÊu“í÷ºù$Ëæ` 8x&ÚèÏÿfäCfÄÁ˜w7Ž \Nµy¡ñBqŒ QZ¦]¸h»# ++vU‘|~i‰H T˜“B:Ù¼(R#)@1· +u +ÄÚaÏÍgÀ!OýkÊÉõd|³Ÿ|r×BÐÖgŠn0·¯x¬ÛÜ®ˆ¼ô\ ÊÛÁhZ?(Öòѳçÿ|i—Ê·…tÞΦq=Šóáæ$üWi‘‘ÿñèuئÞî0*§Îôoüd`GˆÔw]xüIyk÷Àôù¨Šû¥7„zÁ•Ç^–Ã,éWcümqx~ úã˲EˆéËå'הL¤îûöÒ?¨µ‚6LãzúðÏ+'ìÕ§wDóð%}jÕã n#²ZgV&Ã& +cRÁô ú¨7×/~X· MžåÛ-ÂOh_t<È`Cþöõ¸/_\õ.;¼Þ&‘Šœüs4»EZhÚ37ÃÁ B ¸9\äáã«é¬Åö9&p˜È=;Lü¾ô7{®Ù«*•yz82¶92$ú5?ɑ±Ÿ íU1(].ëJ—'Éúâ宐÷>f;ȅ‚ó‡Eôñ‘¿tîA®!s?Y[{4ÿ*ÿdÓÿÙƒÎú×¥å,#ezó?þ£E"ÍZ†ô ö¯ƒÌ+”søþl8~w'úduý/¥²mtʋáè²j»ν +¥I¡¼íõ¿YÁ†[]Žò!&øièzÆ4̧勳Ócê±HI}B‚CZ¸¨ï»íY¦z\^'e竁°3üd2¾íœ]÷.ïŽW7OÓÜbϬúӉã­l¾»O~wL™M—½É›j£·ådV冷½óÇs?0wÏÜÿnyëÈ®ŸË4(ñӉlƒ8§w⪲è¬,ªƒ5I¿]FI7—6}Ñ–vºa¼¸hÞï¯ÿþ¢7–“»ÇÊÑ?¾A +üú;®ú×_¼è×Q R“þøú¹Å–Þñ®g7;c®/ùõõËgǝ—ã¿"IÜû‰¤Fè¼Cš+7V/¸}*³ ’A¹ 'ü׈[‘îV´®F¹$0Rxàä}/´Ïs•bÌj–"Jö†ö`ÄíeZ¸”Z¸?Ûß^'ªí콶Jyia‡ CÍò"à ™I¡±f¦}–MšcH¶ táâ°Ö?ÃÍÏþ¬ŠÎñŸµ dLìÓ©»!MK¯Pp׆vXp³|XŒ%[|цa—³´Ôzög™[Ì*&2³­Nzšg.Ñ8I„[Œ¯¸³U”öìÏERA [Rc–C‚®ºEnRã–—ÂÏ  „^ +û¯Å™Ä8!•† ŒaZ2¡\b…E¯þ˜Úu[¤{*”Âi ›Ðïã?›"àÔF(ß+Ã<2Ÿ£Q(ø./$,#“@F…tTaîá’ãÜOaè´]÷ʅÜçT÷4ƒŽ.c81vZ+ ¤ —ƒ¤Üj*•»%o|¾wFT´tKLÁ«H'0â:™”™N…3²Y\®¸`ât»Ò…rÛF´|¤£¦Gip^ra1f:ìªTAÁ[XÅR~°¿ÊŽÜåL™Ì—3“®Ç…Ó0i˜; ÜÍ·[FL[è°Ý,¯Œ8ºL&¸6DՏq‘i‚Ñ];}YÂëE˜Ü"ƒ¡{v:bêBº«as¸Ì²={¤t½dö"‰–Eà^;›ÀÍî´QÂâ˜2„SÀšª! +§EŠpTÊö§ÝäZ"ã·§±v‡~Fk&…ShÆiI ë9ǝQͲsÓ¢UnaÛábIsW#uPd-VR˜ +ç§PwpqSå¦ÒR ÅK|·-ß+áóaG'€ªv–Àa“œGxá‚3`¢ⵓ‘#:{”kÄÇ<ÐϏ4\¥Ãâ͡ø«S‘4Í7ÌñÂtÌérBZ"æÍ1ëçl-ãÉîo)aRÜDÏ*a +Œ@ՅÈÇWöüÃ5UäFÓP¥n팁ËQ궺À+—s*•Û™Ns®ûO—x`8¸ÙþÜ©\xnEÌRY‰ g/ՖÍãáªìvÀ%»{EXpjù…&f–.Š‘¨b§Ì%!ZôŽÌvWHܨ–:Æ ÄÁG¬ß±v£Ed.€ŽÈÆ:ËóÌìa–º]š Ü·©•'‘‡Iê± M—ø¸$‡i¬QÓVón!”âÿÔ!™<óëB‹Týeps¡-‘ø†•‡ŸOú׃˲lð87 H?¾Fdgcû‚IT¾áJDÏÆÃK[²7uÈVµG0xݵôO­»$`ñ9ߖŽÇ¯ŸMzóél~Ñyñº¥bætàÈÑ1)ciš"‡·šW!gØÅç‚ã@´5ˆÓÃ⓰ª#I#-´cuÊåÁ[ž€lÃXÕ +pø?  ²àm&©QXƪxjۃCõ,‹sÝSÔ«Åo†›t„,bŖŸ£èbðødâ“öLÇÃRóÿ+Rü \2ð2+_h<€M&þdÆËԹń["F•Ëþ¸ƒ´ÌÇ«³Ü±W{,wª[Ñ&ó'\Z9.ÝÁfÔâqiUKäÕÒ*†©²ìì;e&£Ž-~ ¤™;ƒQrÉÿ²GWŠ= ûeøÁ(¯nçüZ,‰F ŽûoP°rm +w„P¸þ¬ Ÿ¥^å¢-~`Y#A= –¶Œ5ÁíÊa¡j‰‚†©¶ÿ†-ø·òâª7¹ˆw _â–åkJ%+ô‹Š˜*–ôe$`ÚS$ÉÈ‚Å*/ d$lH‡”—ŽÚP,È"©ÍUá±dI•*o)Y©LS£L»ž¸i-`z¥Ç"à‚R+:‘Ã"a\*îŠÝ«™ËiQ2ƒôN'žºkÞ)׳Ú‰«7 ÛLZ^`p¡ÉÌ B¤Yê…GJÄ\¢O^„%'ߋã`c+[»;…NÓYÕ¹l9_ðe]¥š¥ä’/C>ޗñµEË6E×£-oLI|«: ú×ûÞpv5üã?í0ÎÇoÝey¯z§¥mQÙOZþ6»('PÓèüéøÍ| +Àã۟o뱀×ârünĀãbW®Êáå9ÐqPµŽ*?§g{³ùÍ›ÒÓOC$ÖË3$ÔÙÜ6ùû­.³7½É /¹ú~0zӛ_Mßõ^»ß_†÷Gòö|uþõÿIJW#?¥pÚbà/Øô}kAãyñø¥Ù³[tŽÀFºñ²¾¿t=p]z1ž`ø³ôiiÕ÷¢“‰æϊÐçÆùajwÜÅØîù'åUo>œEÝýŽþ|Mm¨Dá_<ýɎsíS¿Ý G¶Á‘å“ÁÅ|ƗyV&瓠¹£·Dí¬\o…è’–­múþ™…KI¿þGÓó·½Éô»¨„}Üöm´°ñ‡éŠ†£x~¨åŸ©FãQلJñe`—ÈDMïrán?À‹ÁèÒvX4¤]3–AºMÙ` qó»\N±ž(ÍH1€{íŒ&3}ï ¡=Søöms¶mwcÁÃ8ûVßßìûû¨KôÛi÷ Ù}Ø|¥~Š}s½ìVÖVž^½Ûõ½œ| +W¬?˜¹—VIïæ¹ä¢Ú+Çýnp éª &Þ·Ü ö}”æm 7Žï}£±Ý±±ý¸¼þ´iT¿5Ûª;2ªL¨f“u]^_7:¸éN Uו#»Ϭ¨æÒâŒqù¡‘*]žç“~y Ù»!VØÓn'úqSÎz—VÞºƒÎܙÿçқµ­¹¨õŸj7“Jißö.Iåë¬Ý^…ModzEXo8 %›Ñ溼t=LS¤óØÇø:“ϝÇóÙ¸ó²7•“Áïå"V´âÑ:oFVÅÏg×“ql¿«k;˜Ž‡½YÙ¹€PZʆ¯´.:·½ÛrҙnæÐ;– 4éy£TÇv|L=—QƒÙ¤7šÞöìüößÛ~ .->‡‘NìØ:ÒönÞ¸íëIɋhcã ["Rc”YÝTÄ}ØØ6îÃÆÆ¡"U¹â¦d•=éÞö¦g\¢2•/&崜¼-;`'ï|9˜õ.ÃÁŒŽö¯—Í uFߧCt-؉F„³Nl+ Ñõ0‚Ëé5¯E\—¥]Góhq¨¤òÈóùìÖ.È UmÌ/á [02G?¿ßÆ?rŒþ³áø¢7|YÞ·ÓU¨ñ€‰_–d«ÊY9üKofiv:î÷†@›iÅ»¢µÊròÓJÛø÷W |Á«i²„î&Ý$âXoÿðt>Òlù¸}û+Zfiæ×Ì ûãm‰¦÷gv‹#ŸEk1Y×ð¸~×¶}Ék6,Ú†Ïo{ý°µYÛøi¯_†*"뚃l°Ô:_ٕ_å;KÍ'ƒé¬7êÓ9Ôy¨¶E·Ãâóg³›íÐýép<žDäÜض 9±a•œrÎW‘B”BÔr}3 b¼:L^äbMÛãÊVd”v®˜wôF³AǞq½)óªÔµ;jё´ØÆr°Y´8×ô² -Q´¬®ÌˆC{VÛïÌ{ÀJ;§å[Qª²’úò·øzƹªíI9žXrÆ´_¿¾ÿmdµ²- NŠ5X¤r5¹þ2¶<{<úK¬zh“g«"^YATòü̊E'pöý8¾¬;Ғh=Y)f8•)¦NkV_]ë™= [>ú¢7qUp¦/ž<…ÌJ»©+G%-¾JÛïo.ÊË“ñÕ`Xþµ|¿/ µ§çtYHª4ûÛõ ½„²9;‚¹{1ìJwŽÅl)Ëìю˜š ù¥7L¯íBQ¬š‹[4À3~ nh–dƒ|Syb‚ÇýÑ[ûV+éØS9b¾«ÞÒn­h–Û߬hôڒ’yI)*ä<›_Ø-÷tl;ôøt iÒ92ôÐRPù(\·µ4ÁX™\‰t3.Ø#89°+;lí鋏`ö®H8q*çTV4X“•Ž*ýo¼¶Šåŕ§YÃÅåe·Jf…iHI^åÍ ¢~]–¿•ýñè²åCO“é¦áBY3c«žã!}èD3¢…yþž I– ríRæ6 ÄÑNíæ¦X„žüú÷ËËÁü&’íÿ ³Àÿ;V›]§lTE P}A¦x 2EÐOcîO€mœx¶ñ²Ê6Û>÷ÇÄÙÊC¥ÒìU8MbF‡mœBóèÇáŽ9\¥íóE¶¹™X¢óý‹³Ԃ֛Èåp6¤—k¼™`Õv+(æ5$™Ç¸H3&Fãpu#<6 ¦V©«YüÖ‚AñÑ?ÇÝ[»ê'võ/vl©¼º7nh6}3¸½°}³ÀÛMJ({YB'šöÇÃaà5Jþâdwh3,z&ò{y›PüßÆ?Œ®ÆHÝDñÖxô·òâÑ/ƒËrüèDZe…ÿX?n‰¨«1\KݟΆÝK>…£`Bn <çˆ ƒMº½¼±?GÍûu{Ù½óՇGêÖÃííÄ·[Óhä;@ÚAaº\“s±iìõʵèæ«VE7[‰qpc7UwhO.R!ºÅ†Æ³1:&7QO¢Žä‰éšt}{çf ©x2Ÿô¯;¯&åàÂrZK©Áh€…#ÖÍ U¸ñò û‹ä\ݪBË5ÈƱ’¹Ýb»¥EÍÐ6»Ý\–ÓÁëQlþ•ëxDž÷¬Å‰-Q jÒ°7½Ìnz·Í9^ub–Ç>œto‚ +ºª‰!¡€ó× šòady}Ÿx}&k›O.»V«†ìýª´¶å•=­¹Ô Ú:k›ÝúðÒµ _üº»~1úFµi^‹Í¦`¼al¾Ý0ÒiÿvØ¿†¹FýђŒ¾ØhfÅë؟±b”vʆ½Ûäð × àöõ͛n9›îZv ͦ\¶dãZÆöŽ¿G›¥ÉCvÌ Äuî«c‰ÐÖr<ÞU}ç/Àˆ¾©Q2¾ÝÔ䬁•!6µC–Z¿WÜ{Á¶tћL×Mi†å‘ñ¡Ô õl¼¿ºq|(՟GÐê¦LzÒ uèIƒÆqOêvÖÕhÖ½nàˆ®Ñíäjê¯[5®‘7#ðÊÙp‚àC½ÑˆƒêÕel¶QûèßIJÖ×'c«»^vž>öò±*:ÿëëΞw„Luv$¿•I¢ÿ×7ôÁ+Ʋc8jBW1m×5"Ëvÿæý: =j9ž]oÔН¸Z·g6Ťg¯´¯e£ôóiùdÜGGx½bÿ˜žŒUûØ,d‚¥ðÅà·rø¢œ@¹˜ïßÙ¾žQýh(AçâÖF ¸§NÁ˜ôxâžÂð†¥§ªïrF£Ö/s5x›¼–\˜£ÞR ÍR›ëñ»¿ .—m]Å¢Ýõ¶7âSq³E%*½x°» kŠ%Ž~ñäé9­—5K& š¾šôno7µÐ€ÇAP[ÑlˆÀm]†â`­µÚ>íMg+/ @€ ƒrÚ±‡ÈeÇ®¢QÔr‘鬴¤½.G‹rpÓ9»Å„Ãɨc,'x"žXþžðiǾåèÉø Îoê.¾+G—řEn_0-;ßǨÿÔ±¿ó¯‡gzûÇBæî`¿¤cgaðú›Îiïýx>³\ñõ¤wsÓygŸþ½Û9îv~=AíÝö’Ì1õæÿÉÀ#‡þo{õúÿίKê¥íÐô÷weÿ 6p]™.Ê7öT€Ð±º»Uꖄ}}2¸ÝÄ+ó÷rƒ´‘êOÖ)„ÿ{ï•ÜL¯$ +¾w„öð‘”èM½÷ވ¢è)Ñ;Iôîöí—YÄì`^f!³šYÆ(‡*–£é‡‰è8'¾Ÿb3D"‘ɼý9_ŠQYӀ7Œ$.Z•_oȚ<Ì«Àê)È[=Ì«ãï±)™VU=Ú2glÈÁ¥’·ÀcÀÁtÔŠÝú—5ÕEµÐÂÁâú)3ÚÊn»›Âªuppý疪ë¹> +ä(NŸÛØr€cSã=•/÷;WCczþ…íB)A$~¨œÐ zƳ¢9ñ²`ö€Çÿsw\%•Ž{æ—à ü/,%Nf‘7XÔgë‰Û <á~çj‰-w闍äÊ­B›BfÅÕòÜFels¸eg +Gˍ³]ˉɎ5F1 EHg5‰”÷ìáÆ&2QCì°÷*-Æ78ée)ùíö%W™ý¡`­ð…¼ü¹B à¨=ÿ.~Ymý6&P +ñIÆßjN§„t¡Úÿ¸Um‰åR!Óãn2>ía~¼Oq‡žüD"áj¦7­ðÕqÄ Á£ÈÚ ð‹:/‹^­ÔÆ<b-\'æ–)ÉiqI'{*ryO(íI *uóG´nžæÈ$lœéÒú4E³–Ê@½lü\6“íøw}R!¦§F6‰Ê&ªÊêkT\êaXj­Jvý¤\×ÿõ®:ªŒ©Í@C«3ӄ¿à|÷ÉN…¨PEmÏo–¢üVs:KV)ÖFe,áä/c'ê©BÁïIÏáŒÐSw¬ªÿ²„ÛChܱ]úª-?æ6?ÁåVSÌj¬FCêwl?½z›ùŒWŒ7sъ;,*ñãeêËfœÿévëâ”þK/­Äk<4°›ãaëþ?•œ€&*kŽÌ[Åsr™¯•ãa÷¼žúD§i»Ý°¼ÂUžuB_:ûôõrçô_?éîÙ¬‰Í®|JêçKÔ«»dÓî×vòomh4éQœˆB{õ¾Víë;ÑHÙ[ÒXñ÷‚ýxx•íǃ'ûƒ¶¾]²ÆÜlÐ zeG`ÝӋ~ۗ\Çםà"ùsNýøz$"#}zJ–ñpÌЦAŸRƒå`>é鬠IÚü¯‰ºM·¥ÑÏ.MàÏh™f¦žš1õã†Â‰7—Þ’|·Ž,ñ”¡™MÍ/æh«¨û M§ãüôkÉ,Ê?j’pŒ}Çß×QðwPœ%×o1ƒíhù¾$ÊuýNÀ\7ÔêÇÛ©ac‰TBßæ;òëó9N Wâ8-–UdANÓÅS PÎg˜ûÚ.büM9Æ`‘ÉJÄh³Î“kßdžšC·üOºvÆðÀÛõӅ/¯.êKí–pkötNt}7º}SŠzÍ:¸,_Þ¶·¶…¤Š&W&¯fÐÖ¬L}]%í‡õY¥w„h¼ðÁAA¯4ÄD[p£?,Ñl˜þngJÔû)kfDAsvÀÁf¬Îtl¡µ#áÐìï}€V“1€WMz4à­d‘BŸiŒ|·ænôG“L¹Œ‰¹½=ïß4ÑHÿYÒ G鐏 ¯Iï¤Y |¼uš‰j*ù‘^ÔñC?¸h’încH´çõ2CÒÒJº;‰j6ýצ~ÿ¼ŽÐbó¶Ì¦fÐ0:òù>g;¡¿~ؔÕ²¹”M›f%Š: ­©-Y༷×,±Öø@M)êõã¡ÆY›hϗëÉ ˆ‹Q‚YŒÎQÀªƒTMÁ„ÌLoö¶tŽÂ±4‘ýŽ»„GálðˆÙjIîázñ‰‹/.³ûÄ~ND'8œTÅr.1,’ˆo–}h”5.Jönôœ¦×A˜ Ÿ"ÞËg`ž5ê÷¦Ô÷s•±”íYŽ_Á>è©gfQã`wmô`r:Sjù“9ùBÓægÂ×s¶…ëð‘_·xÀµ¹ŒÍ: ˆ-K`5/¥šD£2³a ¤“åîJl¼èUì½\×·›'ã$œ9wåš}ÎYÓÇ:”M{zNK47‚W¢qSóš.²™´Ç—ôÚª-${ìd¾eEXӎÑޜü;Ï6Éõ¶µK4~:¯FÉÂØg¬»wgVoó}%>?ð³¾>鵔hÑiJ/ y/ï™V'ÏHt€¡Ôo¸²ñe¤åý(=qÿ´Í·é‰ÿž>ñÙøZûÿÖ¶0’nܹÑp/ìŠD8¹2î³áiÄD}ïÓ<ÆÉÎLt“Ää’1Fmîä<… m<û–`€óúÕ þ‘%T8-€üžêÁ§1ó~‚ ô#ôuñÜ€È%€aìD±Q’ã8ó'DÃÁEh¨ŸÁ¦Àýù—B¯PhþÒÌ àGô8¾b¸WÐÚ°kÎÍæ!@ ÐŸ ­eÑ·E–µ×¶wS“cР‘ A|1; <àö 76Ä-,4šÒ|j:UÄA̬«ޟˆp°…™Ù°²!Ý£œàï[ŒK؟Á!–gÇ:·o)4b¯â¤åÑUì;ãƒÁ–ç鳤KL +°ì©z XÑR{Íl^–¡ÅF©Ä¼–Hpb—Di†[Á‚~óuMs¢Ñ*m³qü싅?—‰-8•—åì¨Ò f5fû1ŸýŒZa{h€ž”^ÅÛºæ2õ;Æ3ÓÕAO™˜îâ9H›Q¸Žci˘QæôÒfŠQºæGÁôͦ<;ÐÅ[c õsùì¥K¥CŸRr8O|nÓÕx}pœclC^¡± “%øN¬‡aÛ(»ã^ ž:´¦/`·ö™©µáHz­Nf²’ÉÉ2=7gò˜*×(^aZëûöW±éâ °‹¡aXgw 1@Ç ~fÛ9*Ÿß 800<=Î"‚ÁÍFÑíR n5Šn¶ˆ Ö çGì<Ë{°â,#ÿÚ~ÌÓëÐ|[ÑêX§˜Dš3ŸT4(¾5C©ƒÏ7hÖ â´ÿƒñŒ—ÿ††G)é5 ¦I²ÿ2'koý3RÁ‰bŽô‰ +7÷G½%{ºðç (GÓ?±ÍC†n­ËDµYl¶©p0R¶ EÒ¨×kf÷A.¹ö.¿6§ÜbCWÓ¹ÕÛì³ZºU¦à“õœÛk'€%ä~çÃ-KØFaš¨¯ãðÛå !§Ÿ±ª3ÞÔh3¹ažz­Ü +Ngo¥Ký|k‚`ÐÃ!Ã};˜°½”\U,ÀúùX¸™Ù@‚¡=2H®œ ÷Œe{"8Û¬ ¸TEž…îMfÙo;»Ý|ÙA߬Ëf¶—‘ó-°ñSÌe}u|4~ß´\LÖ>âNSwóNõÒ}KÔÞë-hê3Ú.š#vz·ºL>ˆò޾Νªó£é¾$ ÒÚØàiÆ?j‹ù¬Ùdu4@tµaemÁqõ™ÍMš8]W<<lãíšEü±ÔÁøCìŽÉê+Jޖ.Í#ÓÐR Z“‰R¯²;™-ÿ­f;½ =}$ò¶1<¤¯w²‹ór;Ylc#ÛX¡»Eê÷ôëM/l_@ËRÏ¥ªÂˀÁ­iÀaÎlc™K•Öè• é×¼gMݏs¢Ô%g¬„Ž”ÞgéÙ&`e¸Ð¨M/ 1"Êë(’Úvš¨rDPgV;â ÎGú9Mªü‡#¹¶’n}Ëé"Á÷¦¿ŸÞ¾(gÊR?$Föûa¹È`ïë F Ï efâèýò5$¿¿ë€>ÂËKÀU•};ÌîU_ؕ™gÕÉh,!({¦ÌÔB|'ÜÆ@ HöŸÒhü.]<kêӅÍïWÒÓêØ5óÇ2ñÙ°dso¹¾/¹"gG¤½ÀíI)0Ôq¤ _e3Ô@>Ñ[@V‡ëbÃ÷7ô¯õìP§ï¦€dɵÿ՚.MFNå¡u‹åÛ +î›ßS@Z¼Öpµ‰ÆêÇêç)c1{øy×k?Lâ­×ó™E]˼ÔxÏåìgÒÓ°Û¸ 4Dá+¦a°G.òWþ‹à¯¡Vºž5‘Mwóf±ÉñÞóXBýÝ×7÷ +sHóÞj™}ïÓPU(4˜Vȟ|_†~3Ö]bÒC&êžl?·9› ð½?JØð‰R9t'p¶T~($æíäRï©VŒUøh^¢b*GÍP©Ÿ`¥ãLm¤Ù‚° +·÷((#Pnéu°ƒZòz#ÙC>œ^—=œ‚L¯å@§I/ê£]êWûêüí®&¶ÑÂNdIãUwÓ} ²ppßTƒ™R<”Üãj9=¶°1~´.PBǾþì=½Œ™Þü¬4ðw44€.0è&v?U³€_ .À¸…Ñ7ßÜðÁ°bŒ¢¯KŒK«D¦‘ð>‘>9L/j§%2èÁæѱ–Jô—ÙT|ù™…DÀ±JÞ¢_I˜ÿâ­Faœ §ÏØp€\ÖiãÁö|÷ïCÌEÊC“qšÌhÉ/}ü¦+9WJÿãF¡„sëÊÆõåòñC/Ôe— +IèÙ&s‚¡ƒà‘?}¼µh\0àQoñ’¶Îlñàûß +ÓÜÁ? ¯6»MÑ!!vßÎrrC^` 3¬?óÁˆ!7­ÐÓÉW/éüàtJ['ÙLØôúÖÙ=$7Õ¨çšijZp¢­zÉUˆ4‰ç~ +\ÁΛÆ؃ÄbƒmÅ©?ʽe5¥øQ78§»£]„oà]š`Щ“M-b®ëmÔ÷AŸp¢ªWöµó÷K8=«Ÿt.ú6zGÀKy„§­Þ‰…Ê ³64@¿¡´è¤çá4$.¡Àt™&¿çjM)÷‡ö ™tk<¶Š‡£{¾)í|š90ÄÉÚóF›îLÂc+Õ È …hÐ+hœƒ¬³9MìÒfËÛÌÔ³¨mv“½ _½’ëÐýHì‹+ñÑҗüdkF TË`ÅâúJ4z oË&w·ÿÉÈ4Þ.`ƒÄìéÆ6A8cÙ௑™vžt<¿?0/[wPáóR\•ëÆ×(¶‰ôK¤Ø+òxõ“k_ü™t´Õ Ã>óʏϠm>²Æ•¼‰H®×û‘ÐØgsúfÎóIfB„ ¸¦MƒôRëñLt0’D$>wåsÚZ=Ì-jua—;t¨rd¦ZoX<šc6ãÿÌ Nß!ÿYF6uh±Ñ끕ÿçåëIÕ „xÆ.àü¼aµP;c©,€†›Øa¼­€MYz¨³vYÔmD´uքkéBhu™]6ô!õž Œ¨S&zê8‰¦1ÖL]èLfÌ»ãW Ó:/óVv¸vxÔô®ã¾Î2“ðçNg¥·eE[+E67§Ð<¨ß€YšpÔÑÆÖ1cÓ9¡¡ü¼$ü“ý;) îÕÆy  îˆÐâ2? +¥ñΜv`¿`Ý5ˆs¼2PêxÆo²ñ%`öú¥1Sfc/²1 ©PlÔvM%\IÔ­q°6KóVÀ ™éE;„2Ío³k¡¾è08¤¶ó¤{5›y[Í~Ëò©Ÿ¯™šbÚx¸æ¤K¥°– j ʎõ™x¨ß\õYûjÂi=Läï­ÀY¼Ø'>מ6O.;ñ“©£M—Š.Àýºä^LÄ2=_cxق÷R‘ôÒãÕB3ÊzùþõFæ °•Ì‡l8;¥™’Õ1ØÔ9¤i]äDzK$îÓ¦Q¦I?å«ÏváÜþu`CLN[™àl6mcóGrm#¹N¯³ksNrN@ê•÷Áä’õ/?0=Ā,(ÛÖÚp ÖÊÃ1µ ‡ î°úMcb;YžXQÇ9pnÐш%…ð඀r;¸v߀ˆ«]øOۉFÓ×@h +Vñ¿2˜ü¦ÍóuBJÚààÚ§~ßcÞTD¯¤!ÜH›Ó°µ[J&üÖ„§ÿåC֒– >³@´þ—ŠVrš¨–ò0¨»ìBJ8ycªiÁY1ÿ +Û»¿´#óô³ÀîŠÎAç§ Ä­+òþÈÛ¬~ýѦœý–ž5C»ÌÔkò$+&Ó¯o[¨Y8G6$ó*P*Yàê×^ÆÖõ/“î¶Ë†±ÀïÀºL4Ò'³÷PÇ"ÀŒ6,Lò²P̑Ð$¸Š¤û¿]²ÖX˗„|à ÚHÁpÕR?ñ™-]X§Ú]€pÖ¾uYc)éO|ô¬;4šÓœ|7:'&~¡­êÉL'&y¨{P©Èϐ»›ñ¨ôȃ‹ì‡2qÒ3ãџ5±i>²#cß 7Åwº¨YØiàÃA¨PÍzƒæÌfž¥HÀp´Ü(K¨šøo??ÍÔõU¥DyCK¦b € h±‚½Ô8e¦Ñ¼-jê÷¯fæë5°lÁÀòЫo ÷ÃÏô GùD_ØêA'¼è_•ùœ`µÐ˜© æ±»°ð×°¼~».«>þ_óÊe}þݯ牫+–®Gza{2 +ýAlT@X°È<|ù”k‰%ž5i‰zF>K¬5qKÅf‰ýœ]ð“Ó®]ìƒû =¹bs(V¹U^÷Cû(Ê>uZ"ŸÞÑ6:k¬ÃÜc[10Ðض5ŸÆúó×ÓXMñ¼ÆRÓ|kŒ¯_FµÒÉÙ]å€ÆÍiôî“뵆FâŽUGQ"?*Æà8ý”þÖ>@sì·&ŸbÖàÐӜ-¢X¶Æ»$VŸcQ7pX!§aˆÃÓñ´œÄ±~ø _a=¢]R«fæ™ ÉyN|ºnSßmÄçªÍŽ=ºƒ÷RÃJdKµ$‡® iß<~OLkwHdw†8ÖÜkD_žÿ4Å°B™–«ù[RDÎëmû…5ó½Êò(¬5 q+¢°ù +k~¸ñÌ{`õÁvÀÂé– ï}k×fÌÕç±Û{âXݽ$QÞÔ|bXš“¶ ½øËÝ©!b­®çyI¬%ûao•Àúe!êåÃaEœ&˜nÉ5(g³1(ÖFá· ‰µ^ñ6FbXᾈÓD‹ĉ\¶é³¡9$Šµ5ˆœ$±¶Œóáa…åëéVˆ¶-–”Àš±´ãþcJkÏÚˆa¥i¯îOÛ('%ˆüí%úã‘Eë{ów|{·Šb :C„7×ÓÝÍcÆ¥Ö +1ʔÓâX³MRÛ9× +¬(Ö%Ôñݦ£§;q™›Ç0g\Ö±öœã‹§àñâJ«õ +k5b< 28ܞ3}ä(˜®%¸ëZi¬«€Y€õmñ¥] ¬Îd—,ðÅ'‘yÿÊA¬6+DC´ï¶×­+ô°¦ÎB"g2v +k̘± +ä¢af¡Å“ë5˜*ñ…âÜñ¿!Ê]w\ïÞ7m¤›Ï¬E«Æ™¬þÐXƒ5»`®»HfEa5Ëe„•ÒÓ("ƒô÷³C-P®>Rø°œçÆÜN$ž^ô×l³ê6í© #Ï\ê…#àˆÊ¯ÄÓî‘ W3ÔÓ+ý !Êq—=…ÛóJÞ÷bDù3æF/ˆ©“¥š¶(ñtº#ßWÎ_i¢ÍLd÷¯¤ÿ¹g°m„ÂçžøSçéCc0ßÑS§!jÌóŸ& íiÏÇ£Ô BAè<¯5awñ{š²™?qÍ8kX’»Ó;%Š( Îmý„â) ¸oždŽµh ÿú‡þÀŒ‡cŒ|‹;ΆT¶óuÓ½l·‘îeÂvð‘M%íÓT*é(Ypûnô¶†ÃqQ1Ô:—2£Š$ô )ôÅ BGÅ¿5ŽHç÷Ȑ•‹0kÎê¿‘‰ ì%mæä¯?x²÷¨u"6êLv_Oƒˆ¬žh +íıº»i¬ÚìÌ!À +Ðpˆ‘)$h½ÀKaÉ`ÍÙ|=m¦×ë8¬È6`±ºxXýyh„¬¹5ÂZ#ŽÕ]‡ÙÆb`5’vI¬È6ÀêÕAÛà[«»ûE™¸8b‘7NI¬È6Ä +mƒ‡Ά‡x.Õÿ^ëHc…Š†$…a<(C©éÖ®–V´ÒøÑ'šÝƒòï!aC¿RÒý]V÷žéƒzÊ ÊZ+{ù^$Þ&Î^€InøJqΤÙQr†!.·÷㤵IZÙ¾˜µ¡•@sHÚ=ÏYfÙBŸ˜ï.ú¡ßÁBU½ÇeÄ_ô¼½¡à’¶9í˜Ù7ئ#JCó0‹ÞâyçÒ«h ×üêßèÆL›¦}lÌ/¥ÉLÿ”£ÕAzÎØ £™7úkeGˆRéÞA0À‡) qÒ'?óôdhð_À™1¢ ?,ö‰1Y3Vꚤ$æ@ÄÜá/*þ¡gˆloÑ~h¸òì$Ù>q#Gd ]QZÃᙸôð)³Gà%¥X‹]é{×Ô$C–é%Í!«çè’c{qžÏu÷òüÅ1ÍÐÒüE,HmWõåIt@}%nU½ƒB„陵Q¦_ +ÙwWR¨kÝó0°óà!šV$'’Ã`°ƒæI!“ñ¦äöìZϒ#¢GD=ú‡&ŸXx’/óÝnO\Ž‹oOÊ´™\Œ,•ULŽZ|~¼ÉÙtò“£þ™ØõT(B”̹ Tn%Î'n^zj^âóƌé3iNþeŸ0ÃӏÓ:Õ9H%Lw`å¾’A;!ÕÓKv³‹Ñ AA~èkzݸÙyôâït;s¬ñ6û¦Èßìfœ¢/ÊõÔjU9Sd›¢Œ)xíÈ¥i ý>FR%‡²#ÒAÒð GeStÅZŠä䨴%_ˆë5p q„ÐR дvOIxÊâž[y¿o©Š¾€Wí$â76žÛÜ%¾¢À·#ÃÐ:q—_͎?Î5Ûk¾iôg³Te5íëuؗnò±q†ÏZ±&)ï6jÉRçb ‹Ìé)çU¡%ïKüsñÎ}kFL°;ÅÐû’ð@TéÆÆÙ=XÓðBlJÜlÔLéÍ}§(À9­tuÞ! +a'“D.qøI¨¹@ü“Oá\BhMWäð3Ô:ÔŸRà;ãFyÖØî“v?têwF7ðyå>6x4JÍ (ãނÐX/­ü¾Qá¥Ðäw¡: 7ù¨®œÉ(€")Td¾i8âvÈò”yášÍC€l*†C'Àȟ…šýc•%£›L×fg§ñpx6šÀ2»ûøãETF +%©9Ó;ÕD²/‡ÀŽ“nÀ´ñ˜Ò |T¡ÞéP`EA½è4–nhm€Ây“~/'Ý(éF'Y܃Ðn’n +th»–0®o~†¸N¨æ4E@jĉ<*:¤F’(Ç!iû#ƒ}g‰0¼tå Y4‹\L‰Ž@ÂœâÂ÷rPG³e Qd持ïÔ,†ªŒ®xV d«ÔØ:-NⲧçÝ1aMYâr¾N%¡ÛR›P!&q8)ëîånj6Z9~”´°Q$©øKBœž, G³*((¬Ù-ÈW¤6§‰ÍL‘܏Ú}NnîpÄÄpç,Âóq¬-«°yloÊ(촟¡ýKçApªºêó@“ÕþÅG)Ï-„v§ö¯+©õ<åXk+Ï9Ö ÇO#ªø¢òprŽ´g—m§ ˆ”<åG1aCjm·Ÿ2‡cЈ²»…çcÐx£‘!‘h˜#ù:³~…Ô,.µCRÒ&+¢&ڞ)¶ĝJ°HŒA»yŸK mry÷ƒœäåÍ+¿šü(®¬É´¥Fÿ ÃâFaGÖç-±'5&Œ-ø¾Nå}&fÆ9“®MpL ’1Tù¡%͸®Ü1…§ÆA™&’'$A²ó#ô`ß´Éø>›EÊ®`<©ÍƂ È6¢TËÐ<§œÏ"[Ë÷‚-=T·gh]×ò½àWLV·a©åÕ*瓯å{ÁK)瓯åã+P”óÉ×ò½à¥‹”óÉ×ò½ðKï/瓯壏µÇËùäkùC?£œO¾–žÍmå|üh™<ÖÀ†ð”>é:°ƒŠ1©qƒa)åŠWvòš;–FîN¼ýJócç#âÃMùë2‘¯4ß!u©˜ú¶«2ŸëT6žQ&W(›ò')”¦”å%1ëŠE|ªgxåèz€ðCùÂUjLX~šÌ°”]2cÚ tè[ë÷n;xG×ÃG0üêY>¿„6¸²=UòroL/ì%§¢ÃºÉ{#3&”dñ®’óÞ¼°7Ž©ÖmÞ¡Å÷GÎBï ,‹zÄ{ƒqÚ¦ø°÷Æõ4¾ŠYz¡2Î~¬yRey/,Î{vežÄÚ<»2OÁZ“Š åZ»gþÃ#O!]uê%EªÔ:U¤^hÎgH@󺊠—¨j€'\6Ÿ¡c (WyÈw‹ ¾‰­8QŸ ôð +½UdÞ+J7É ŽE3ïU¥X-=jîÇÌwJž†týØ}è²[Ö×¹0(Ýñ¢>Úpî 2M2ÚpP]à*£ª§Ä²%nf·Ö“®:F€”îÂQcâ"@7îGñc­õ”ýؒ<qŸJÅA›Üt1¤E೤L€^%,Áïn6»q4ü:¨OÉû™ÕÒ°ýÔ"ÙöS‹dÛO*’ý><¡H–ÔڞS$ =§Hz¼HByJ‘,,£S¾èZ˜;(YF6ŠÌU°ªò—øé…ÒpaM_¦­\-þ‰a´Ð ­›ï/’Å~žs¼mÞK•¢uåÊî–„ë ¿Oa?/]ì÷¶r´&RXÇ2XsD¯u +k—E$VÍ·Î۔¢°U¶ØO›-èK ÷­ áGŸ˜¢ÀËLÕ{UÝ\A,õª¶Ѩy¼ Wømãp֜ŠÊùӘM ~n5 +ÎX9Ÿ³r~ïµrû¡ßóó…~Ø»Š‹^¨ž^{I?•¸ƒEº§W\ô.jéŒ.éâ"Å5×ñ3QïàcíõøcºüŸÕ^OlùÔºí> ÚGŠ31ñWZ¹Û +/wP¦·›°­ž +·Ý õ$gø¢Ü O©ÑŠš¾ˆÝwwU¬ª+j ¯Ð~â†}C,ÊîoU¤Âý¤Ò]ù8£ði…}bÖÇ­>…}bV‚¸Ûî¡Â>±ª>IúþÂ>1/"í ~faŸXUÚ7Ï-ìc6¶ö¼Â>iw÷S ûÄÒS0 ý¬Â>ÅLÈçö‰Åy$¢¸öñוªê“ ¬Ü[Ø'Å}vaŸLÅÊ3 ûÔÞÑõ`a–ïÏVõá&î“ +ûÄ'ÊõÔÂ>±1á¡ï'ö‰Uõ 2ºžQØ'¶†ì¾y^aŸ(&XüÄÂ>±ª>±Š• ûî&Úm…}JD{RaŸXUß­DSQØ'VÕ÷"Qéõ@aŸ˜Nú"¬ú~¼°OLö`‡ô³ +ûĂ-”íùÔÂ>>½¢‰{gaŸØZKVî.ìÃW‰‰Ìȝ7wöI؞’¹³°#«c¾H”Ý[Ø'6¥ìæ$)}ëA‘Êž®Ê‡ŒiE½C®PÄ_و¸uõ•¢Ü¨Ïè⧤r<©‹_T¤…Ÿ¨Ê¡ŽTŠ=€1V¥œÒÍòKõÕñd¹RÏ^³ºåû‘>~ÅüåZî)õêÓuÊ–š­jLŒªVØȐÊ{ƒ°‘4™\¯•ƒo2…&Óub“Ðg&a{ +úÿÝY<ǹ™%ólTêë*›ÿ1œ&¿7ÿ£¼JýÿTÖô=ãŠð‡šÿazšLÿ?õ¥RÍÿnuBÞÙüOÜ )ìÿwc½Ôu󿗫 ÏÅúÿݑAŽ ¬=Sã!™”+S<÷¼}é9w’£µ Ö®&*Éçwp —Š5}bŽ·fwŸKPI2Óø*F±mŸtfˆêò8Ô±O!N]’¤ŽOCKöãÅOLÆksòN>žµvSÀzõUחɥă¡ºå}é·¤Z!‹à9©Vèn‚Ç9 Ð\M–•šBÌ'DRž*+Æ*ÝrJ'ŽA@wmÅ+(ÀÎå+íqhҗ$ªi^/¬öý›¯ª}ÿæÊÑ(õhsUý‘Eô>‘$rͬJ°a‡™$5ë[DMkƒ›rÁ) Å]§l·¨ë|å㞪œ…©«|”; cšOmîØ|^sǦ „â^)ÐÚݤÜK˜Q¨Ý#:E>}ô@O¸Æ€t_‡o¾}Éd#ݖ 6ŠH Å#Áb “]ïGðH Å=Îû;úþ‰f¦à­ÿî܏¨'öúVêû§RU´ï£ªK¶þ»±ôG¢ïß­&î}ÿDŽ5~ë¿Gæuå³¹­YŸšrß?ƒX¶Ú÷®¾ª¯oÏ}®/ƒ,´>…›7ÔWû’ZQӒeèÛª}Iímýåŝ)æsuŠ…˜Lé=gÜ H•óK!£ z¬ÚA¡NÏÇ«}Û²wÛÅÑéyKõýU֎ª.‚<ÍFXKuµËȚò'š¨L,ÏÌ^f?ÞXHÕA±*écM¼–J®Zn"íí£9Mµ ý¨ÈIZ÷Û@[©Øž* +©:ÈÄ’í9<ÊÛùW¶§Ä!4Úe2&5F¡û K¶–êVqBn…hÀ×ϸ~ÊÍ°›àùQÜ;ênSvéT>N(¼©L{äV­k¢=­æäąr%£Qj5›”ݧâ}QÙ@°3Tß(U2…úô=­&“ì-#ªën¹mõT¶¢éE(ŸŽGçÖFуÅ@–6à?qej/Âê3´»ÊWvùô¢ÑŸx5rÇùvä°"†æ·¦Ó:ƒñʼ°V/Y™w¼ŒìÒõ€Mعvâ³p­éDº²Õj=¹*Ä?R`ß +ïuI¬z²8œJaIÖÈ4'ÿ{²ŽM—_#wÒýÌ¥*óüùèáuÃÎUP™gÂê_Øîq‘#NI¬D6@¼K`õê^?7΁V€NW¦üQ›=¹¥±æ¬£–$VÃÜèûÁ]’@»Ö²AëñԌjÄ°4T!b¼okð–v`ð£Oôb˜R½ÙFÍ{ƒËfË6¯zu‡A¦SUéù¡¹>8a‰ÎwB ŽbIÆ͕&{9JŸYìɧ";“6ØE"J_駴]HCc,+z)e#Étåã©Ã¢mÝÔKmÂçu¬Œw€ÅËÊß!¤V N œÀ/"iTû¾ÒŠ`°„KyRݒ¸¥Tg–4Àn+“Ê}ÜA¬Š«n̓΂3TL„W[trù}£¾P!]ŽÖÓÔ KúŠž[÷MH:–Îu.߹ܓj„ö K##Ï®ZÏm×z~ÄÆ'Zæ»%Ÿb£6žyN˜¨kÓ=ÁŸ–yÆ%”°‘ÙÆ/R›©+ITë¥]ª’%‰ +Wª«GT_·¦dÕddsÀÔùÓø©(äuphâ<ÈÏZµ°gŸhIO\Z5‹¡¢J¬­`rë:çƋº½d.þgœ9/Tá¿:ÌÊ¿öÕú$%””êÚÅ:; ÒIœª +Ú°€ä,'¯ÒÝPÐæ¿Ž“—G*½& +W1pî5JtJ×ÙI_Å BUç)PW^Ò[ë±5D%EïP][ªØõçj %³†Vþ£b©jŽ8^éA“,¡}aû­ÝífƗ#šb5ÑMD{Öý(šdô.¢ÉTÆ]U1óƒÅw–$ªUñú›;JùÛSºñEäúJùƒ®G|ô“¾±$Qm="sHÚHR0nk4([»¡$QBì]Õ#Šì7”$*5RÙ7•$JôªQ @ÝZ’¨Ê<†WùSº©rI¡Qڒ®6ÅçuW³B\ +ü76+Äͨ«ÚÆç5+Tr?<©Y!w(ˏš +eÚS³BÚ¥zoc@µÍ +Y·Ýo³BÄipXÿ½Í +ñÌûÿÆf…âî8¬¹hÛQ¤WSÃQºÕ +ïvȦÁ=ÚðaUñn‡·fÛI6<¼çV«;JNî·Zq ʁRßðP¾ðå ·Z¡†‡O¸ÕJMÃCuõž7<ä$æôcè»Fe»b†Çc o,(»·á¡-øݯ`îmx(?¹Ùþž74<”ïv(ãë¼­á¡ü”(Uý “aŸÓðP¾)-Óox(¿YU]XukÃCù“O¨§ÝÝð—þtÕíPÔ¾¹§á¡|^–výXÃC¥$Ïhx(ßí=omxxcŸÂ{ò¡»^;ˆïlx(®F£yNÃCùx -Óox([Cåª?«ZMºÛ!n<ÔðP>΃tg4<”Oñ–ôÜÞÚðPª E›{ÊCy‘ìSøxÉÖíð±R’¦¤….ˆ6«KíUÑðP>‡ö…½_€Ý÷5<”¿y„3<lxÈ~‰Vl¿àEKêK ®ªiÏhx(ßíðqUnxø„rl5 ՘¸OhxÈ@·¸¯Žµ[*¶(”6w4<”+ôø>жçã E™Œívø˜Lk«U~ð¸çC å•,û᱆‡ÁÅJƒoõJ6<¼½÷®†‡¢PXQ,_±rCÃÃû3ºDÞ[ªÿBWH>Ü𐷯ºRhžÐ𐩪ïvHË´ÇÊ'QQÊíÊ[÷ ўVx%Þíð_'Ÿh†‡÷۞75<”’‡T·Ãg¥(¦ä»¾®Ö¿»á¡|·CZåx¼á¡|‘®ø!}GÃCùn‡Jzšú"]Ùn‡¸ò¡†‡÷h6w4<”\M⇾å )4jÞ¾-z ôi ƒüÆùKXBÑCÀ}v-ßՎÈdþDæÏ$²¥ ¯ÙÝo™ÈÕ6¢\xåÍbIT×ó¢^qˆFá·E4O? ¢Eœ×Dk¹m[ËHô¬Mџh«Ä`ÐYÃOי¹:bT1֎ÇcÆq<}ïBÇ ¹m4ÇËÐo<|z¨'|žaµ©Áö;ËWóïE¼Õï-5fý[çãÕZ'ß>ê¹¢þgõ¦ÕïFÝzúVpôÕÉ_'63E‰š‹uï~¡eA%p&‘m4ވ×ù |ý±'ôÚ ’×Ó ¸–5¶d׍5Ȥ;,“z!bA¢åjA7 Èå@ŒÂÓñøn³pÓ½š«ÛÔ±„]†8‘M–’Dv1-¹êûæ¤x'°˜VC#Œ2–ˆÿý‹pd‡šªB²FdZ¾!êH8ªs«@ ão#^+ÑqÃyi±Éq§§ Põ¿z)üîÖ؆,Núߪæ5íÏÂO¥¦MRµÀ–µ»Ì¾W֘:0×ñÁO³vö%¹Ó…è+iN‘!€&õ;vpjÃx¨¬9¢Êfœ?øTߓÖå2 +>µÈü'+­ýÜõ؜ Âhw ?¡„4ҟþæfð‹¼‰jhº0,Ô¾É[èo‚FüÓFÿYvÓ0€<8g¦«C€px +Db³+Ÿ¥v»Oä'…Nvhú*‘Vb;bÆY2[ÒÖ·K֘/HkêmаϬø³&9cØñ˃0ZÆãiŸ¤ “ šÀ¢éLÄÌh ¢ïÐÚäâöý™ÃÌûY÷eكïÊJwräªt[\¯Á7Î;Õö•œ ÞÆÌkÔÊʴɞ„¤ªÙX^z"Æuš½EN½)'ü“@ iä4_EÒp§½/’^¹nÖâ¨ÔW.ð´aEO&op†­a§Ð¦W?á\×ß2րi­W\ì±å§ÈȺV}Y¹Üppð ў’À†H:t§°¥:z£M÷{Âןi] é4õêzi»_NvEF®×px„xÉiºÌVÌÔÛ¿8Óùˆ~g§¨”îHÄ Îô´êAŸà!^7ôח¯:ǜÓxHr.áú¶=Œa/Aöì¨Ù–s¸Ê?úíðòI™:?ÌpzN4€†Ñ(4ûcŸ¹-™V'g3Áf3jkRpŸ‡\±Æù3¹¶/͉é¢œ.4uΌ$˜>¤)ÖM¢Çõ4Îg’t½] +sk߁&âÒ;›nJèC_úSzü˾ç¢ßkm‚á4‰jªÑϦ×Úiâ³ñmÈLlñ6ÐÊatƒ?½GÎ{/%€”e*Ó{µuàYӝÅQï[ê’îe睴nvɤúE]>sü +=ëIl—9ö[¥làµ9OLk£r¦<´À±ž,Ãý2w¬CQ`àR=Å =h°”Xk‹H`Xh†¢ÐÜYUŸàS»†ßàO҈KàŸÈüé3#\”µVwÓ2h<02nCòP~ö€&Ö:Rû|þá SJ§_¢–ébÿ¦wó“&­†˜:S2áb2p¶Àï,øwe ”L%JˆCIêHÃ;HÒ¬“¤¯Õ:¹Ön³¤íµðƒ ›wZKJÍʕµvgÚöeA‚._²…Ì|ÇwH¦" Äé灧žI .î;AáÏ{Ëìæy§n² Åªí6ú>qltí~Ù Hë~³ÄœNiYù ´Õ¤¡Eºõ+ù…þÔå­NãrSv%Â.'1Ÿ¸½â%¬H!¸ò#qÄ¿HÿŒ8þ®‹˜œ˜k=ÎBß½¹ßÓ5bö¶Mƒ—\A±:ã `¾­v>ŒŸhshÎ0*â©É»ƒƒÒØtà;ÿ…ꈮï9‹˜f‡n†È„«¤@9OµkŒ¼>ëIî:u§âÀîïNöÜgÍ[à';û}÷ ø°‡µXæl‘íç?…œö±yÓêÛÇ9 ù½ÄZó8§µ¶sZww“ ¾09rœ&Ã(=¹‰ü¨¦¦4§­.­Hwˆí[šhbЅ1¹M +¢cMc~|lEº?'_1DSÏZÝÕüýÂëˆín/Nä¨Û Ð;¨~"흃àtèžN§´Q§o†ÆÐúáÝ7™H ø!-GŒÉüðÈ ¨şYk²:=,:'Û³¢Ø“=—&‡ ®CßµÙ' þçT§åý©×!C‚vB)]XÒÎ<Ñ¿Ìnu8ëh¬‡}Yc­tª”vˆü”ŒÙہF©GàªeM  tZÈtÁ56¿­®±¶úYþŌ\ÇyÝþe=ÂÆö-Ø©àò$Pa Jë„F!éدœÅwÒô iڒæ|ÃÐ;Ó'ì´;ƒöFØ(3jž0F~KÔk*úk.›¨¥¾g ŠäÇhd’ŽYêtÌ8ë‘úSÀKŽO:)¿“Ž(v?á *6ÒÚÜPWë[{X–·†»’qF·-—«é9 ×€Áî°..E8Cè¶Kv-ܕsÞÙX¿µEèe=ŒÁåÖÐ̆3î½÷M=uçkÚwÒèO'4^Ïx ß@Ç r°3¼ÑtEüš$ëÃûd¬pL.ÎCÀEÎðr32™øn³$䐫ǜœ¥[¸’~—?8ëź,[´ùž[²`!?ÎK°ðHŸIVàPmäd¿Œ°)Iðº”ÎIˆpŽv9g²çÊsXCÉÏV…qw žòÝ LùJØ[|F]‰cæl孀~]Žßɦý>$r‰Pi ï:_Ìñk-ç`’±97]ú0Qã̼3)#Â!ô7Ã"çáƒþJ’rÚbå(òêSSâÿÌ÷gÈGÙÀ´Öi²âd>+‚}…Û“Ì•Ë —Þ•/òÇ;Dx›ÑÀsZ5Ðñ„ýåƒàOÿôõ†Á*ÙQ"C÷Jnd‡zgÚ6³ãǚÇՅõŽßê6Șĕ-iYœ™¶±ßèJ˜ .èV2ºbÍr™NNÊå(ÿg&ä ÞÝpŠ a”ngVÚâÿÀ›€(–=»ÈYæz›nlÎQ»VqüæR@ä§Y(QÔ³ö@ÿ”äôÍì…À¿Q™"99¼Â‚ˆ(« ¢ø·µfèD¿žr:ê½Ît\w%ÁäéœÝ ‚€‡ªG«b÷M4²ÇJŠà]¢ą€š ‚ÁmÄ_à•Á…Ý{FÎ} –Ûaá3¨-8ʇfxúUMWák:̼—zÀx,#]÷ÿ„ðþ'„÷?!¼ÿ áýÿ0„%“‡§f: §32²Ê–þYunf×Æ©£˜ =Ü·ïqÅڙ1"”ZvZ¯‡¾tpî[iŒ$©uЁ%OÄÊE(·¬•’ž”¦KuØX˜‰ÎÝódâùÛ@°áJ“Š Û3 휜ßͨÆL1Ѹ}G+\ÑÑâK·}Š`ÂjU’J3PÄÍEÌ$Ð„~·àaµʞw:H—Ûá øþñµò©Ñ*1t=-÷‰§ÏÀ¸™É©:ýº/àòüCÿ8>/ëù±zü]þnÿY_þœAŽD$›ÛÙ.{œÏóÿ}N聯Í|{þüçHÔS…‚ß“žOw³ù?ªq‚gäc¢ž ­µ»¤l%ĈÉô"[åuŸ‘qzAt£ehæÔÌa_˜óͺ/Õ™­kŒù“þÙ¥¬LJ ¤êQ» ;f]z~L^2–J¹-؃(L5r€&ÓNÎ?ãŽÓ2ìÈ'z¥t/ÛªÇgbÇD¬0ƒE!ïG2éÎæ5íwh¬¦xœ20-5í;œá;|ÓØ®4\ó*ò~$5jmž¥4Hj pK¨QÆç³a|&î>‡hĂ=¿¦"̃´^¹g@oƘg£-ÌÁ.{[£ †é ê\ʊ@4膚í@N›@ø¶PÁëþéú“Ûe,ð!Êße‘p03–wz#ý~”²é,û)uÖñQu@hE9¸àÏ&‚k¦ÈññåbU 4t()`°ƒsº[æ4œÏÀïA¢¥㰞5yÿ°¼IÜ¢e¥"#™,Ür€É›¤AŠÁ5’e@2Ï 7ÌéÂ,¢¹v4ç¯i=Ô1ÚÄØÍÎ~Œ3Ù¤Šò ¬€®¾-ø³é ¹Ò!€]T0O@£«ÉÀ œ`½&cT•Hÿ1s#ôú®>HÊäv˜#rõE0ŸÏM8£<˜¹°kgC© +•Ã=›ÕƋ³ói‘úñf«Éµ_çDŽ#% ¥L§‰0ÿPE‚œËåܱãûfJ³Ìy@92nŸÆ$óiÆ©eSú(;ÿ¹¯†ã9·²fS4äkÙ´•ì¨ò@ç@ãÒO>¢˜³@M«ï¥Õ¢¡SÈ䥌ËAi¿: Ìý,dx t4ÖÖ $d»£1½÷Œ´½? €ÍÁkhL¿ë¨Æ¶­}CÁk©B/Z¤K‰=°yF´ñ^Ø;d€ü¤ß ÐëÂÔ7¤—ª*Ã3«‡(g$íz‚¢ê0˜èìîìÈOå4Ä5}´ôHt¦ìVÔhÌÙ¿„ ŽßÎÙN©‚¿Ö ™æ@¦eŠb• À.z/ X%±ÐiHŒœ¥eZŸÞ +)«-쑀¥t˜þi²¢r|¬«n–V͘ ¬1.Á‡ªàñSú3™kᙵ¬B-ÅJ+-K7$Ú»Nôy3‰FÀ£$)&¿sM'Z 6­›»x‡5噃þmÍÈ™ÀyJ¹ +¹“±ÖkfàaSb¨tÌ#G¹„mxFËÔ_dÅh4g#Þ9}\¥Ä¸Í9»;Ÿ`2D";³ ã€Jà±U¸Ô§1Ðuñ²w¼:Í[ò5ÍÀ˜ê¯2€’ ™íäHäw` 1ZŽGººã7ÚÌ ²[±;ó]ëÀ|×=Bw”…³nãq¤ç<þ‚èœZ§?gpJtºÝHÅo›ÇLâ içFaâ ºÇáþÄ“XŠ™(æŒ0t ÕdÈdzÐÕÞâ.Œ(Ÿ‰¦ƒÛÁÑg…¹¾P)”Øm,¸Ú2t0¿ñé`{0‹*r~4x ~œÌ¢‚†£‰!$Ê{c(dNIRی º +uLyƒÔZÔ‚Î×»†4Z›HÊn㶓çzãDP¹âŠÈnOkàl~„µ¡CÑ"ÀM-1 ãÑv{bÚ ~a²âE'¢’š0u–DNÚ\>ia»KÑùzìÕ\ò`¢_…íÐØWaèèꆮÇ8 ¨-ÆÇ8­ì¶s¤9MÆ N<Ìi†ãcœFlMRœ¦FÙbUäš…€Ó>û#+‚ò¸Å@NS #WÖ*ï[q/tÔU BñA ìâԄƒ ¢ÚŠ+TOŽ/7Ü[¨ðÊS“:oä&’·eoÛ#Wƒð–QÌä‘=’}:qŒ:HüÎ»Ïöfƒ1¼=v$L– {HˎCf{Ršµƒ`¤€pÓWŸí!¶˜Ú"vŽš¸èT3 ãN¢›]r"¢s+Äð?óÕ8þg­™ c˜9Çm‚Y¿M3u§c–a'}çÊ©~‘J ¤|ž8㧂.8@~´Éˆê0 m2`ÌÎʖó§±Q–0¬×v:œ€üüÀ@ M¹w»œI~±¸4m¡­`¦(‡6€=+eœ';_GI`~–u°&>gƒyô ?¬ÏUXdÆ…•6Sö €Ûš}jÉ>#±@?€^Úw<ð +„í„-žÁ£®@²QWh€› Ê4 ’¨Ð,p¼“´qû„Öpà`ÇAâÖhs0~¶\¬•¦¼ ¹¯æ Ã¡±퇮Ñp!¸.̑™ߨ¨›Éæ†<ÚÀhã4Åâ!¡4Êý€EÓ®.,`NS>¾9:÷†_Xu ²VŽp Ïùãužë÷üËDýòú›éÍ> /5häì_qÚÕѸX_§›ïëLÇ|,Ë´mt´–‚"©í`6̧šô¡Û&ÇUÅ#`Ü¢íb?¹)™ÐÆ þìQfŠˆNÑê÷ÌÏ{û ã9çÈ9`ƒ‹=þ ½ze¼˜f6=/ë ¾-ŒÍý#Œ9÷± šKoªBºöÁ?ݶ‘â´>‰þ€Ÿœø«•¥~牪ײ£V7•¶øMÙl¦Òbbç‡˜O‚^È¥vÖýÑ£÷>µÞÄ;]‰H¦ÝàM¼Ó•øò·yït%âÙ j¼‰wº©luÞÄ …¤ðf¶3<Ø ¾~_Õçç˽â&çËßmyü_spܐÿ¨ÿàð¿N ¨Âÿÿ<ðËòäå?Œ…énkúW†wZ ‰ã9ý;=ÿî¶ããý ¢ï:•r³þüG¿úgƒ!†à]ð½ X‡pˆÃ—ÿ þ%à?ÿ¤C´p´ ñÏ#µ0b ßGŽ7óÂv6ÿßôõóîø_ìÎøÛÄöü;^ÿŽO¿Û%ú•';jÂ`ÿÿ*‚Oà»ÿüGÿ*ÿ¾úÄ¿Ù xø ‚ÿÎ^þÃûÏhú×iC‚%öðë*õŒ¡ù¯3~ùwÀõÏæñþSËæòSŸËÔg— ~‚opŸ˜ç …¤€ö„Ýïvy\î„Ýë÷x½n +¿púÜ0#»Ëéqƒ…³œ¤Ç@#ry|ÿln¿ŽÈíñRŸËôg§Ûî÷‘$ü½Gºüv/IøÙ/è—%‡‡­{òw9<þ.ÎÃén}Ù(ð=!0V?é÷»=hA°)PcwÁ1yI»¼'àôÁA»H»×G º¡/èA¢·ñÏì/UΠ¾¯×·ÏáŽE!0‹‚­ ³$ž³ýíqÛ=./É~áòD^üq:v'÷ç +Vž/ÎÏñùGÍ4ËIZxY‚D‡ ž¹oãå¼qÿ®¡,YžÆÿkþo¼ÝîÎãó|ý[ç'°gçÿN?»ÿ„ßÀ±?’© +LÅÿŒÈŸÈ +endstream endobj 7 0 obj [6 0 R] endobj 24 0 obj <> endobj xref +0 25 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000044463 00000 n +0000000000 00000 f +0000046571 00000 n +0000046388 00000 n +0000168557 00000 n +0000044514 00000 n +0000044880 00000 n +0000055560 00000 n +0000055447 00000 n +0000045262 00000 n +0000045826 00000 n +0000045874 00000 n +0000046455 00000 n +0000046486 00000 n +0000046828 00000 n +0000047096 00000 n +0000055634 00000 n +0000055830 00000 n +0000056898 00000 n +0000062550 00000 n +0000128139 00000 n +0000168580 00000 n +trailer +<]>> +startxref +168773 +%%EOF diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png new file mode 100644 index 00000000..bc25641a Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg new file mode 100644 index 00000000..aa301583 --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange.svg @@ -0,0 +1,89 @@ + + + + diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png new file mode 100644 index 00000000..a5a40d10 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_1024_white.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png new file mode 100644 index 00000000..955beb71 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_128.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png new file mode 100644 index 00000000..e2e6a010 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_256.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png new file mode 100644 index 00000000..dcd898c8 Binary files /dev/null and b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_512.png differ diff --git a/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai new file mode 100644 index 00000000..321e40ee --- /dev/null +++ b/plugins/net.mograsim.plugin.branding/raw_files/logo_blue-orange_clean.ai @@ -0,0 +1,1350 @@ +%PDF-1.5 %âãÏÓ +1 0 obj <>/OCGs[6 0 R 26 0 R 45 0 R 64 0 R 83 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + icon_blue-orange + + + + + Adobe Illustrator CS6 (Windows) + 2019-07-16T17:02:54+02:00 + 2019-07-16T18:26+02:00 + 2019-07-16T18:26+02:00 + + + + 256 + 68 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9IeUfNmk+adEh1bTXrHJ 8MsLEc4pB9qNwOhH4jfMvW6KemyGE/7R3tODPHLHiinOYjc7FXYqkWt+cdJ0nWNK0aVvU1LV5RHB boRyVN6yv4L8NB4n6aZmn0M8uOeQfRAbn9DRk1EYSEf4pJ7mG3uxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KpDeee/KNnqJ0+51OKO6U8XWjFVbwaQAopHerZg5O0tPCfBKY4vx15Oyxd j6rJj8SMCY/jkOZ+SfKwYBlNQdwR0IzOdaQ7FXYq7FXYq7FXYq+Pvy5/MDUfJmtrdw8ptPnomoWd dpI6/aWuwdf2T9HQ56n2p2bDV4+E7SH0nu/Y8hpNVLDKxy6h9a6NrGnazpdvqenTCeyuk5xSL4dC COxU7EdjnmOfBPFMwmKkHrMeQTiJR5FGZUzY55987af5P8vyapdqZZWPpWdsNjLMwJVa9gACWPh7 7Zn9m6CWqyiEdh1PcHG1WpGGHEXzn5H1/VNf/NzSNV1OYzXdzeBmPRVHE8UQdlUbAZ3naGmhh0M4 QFREXndNllk1EZS5kvq/PNHq3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXzxqf5f eb7fV5LMafPdlnPC6jQtE4J2YyfZWvfkds4DN2XqI5DHhMvPp831PT9taWWIT44x25E7jyrn8nu3 lzT7jTtBsLC4f1J7aBI5GBqOSrQgHwHQZ2+kxHHijE8wHzfXZ45c85xFCUiUxzIcR2KuxV2KuxV2 KvhPPZnhXoP5SfmfceUNT+qXrNJoF44+sx7kwudvWQe37QHUe4GaLtrsgaqHFH+9jy8/L9TsNBrT hlR+g/i30xqnmPSdO0Q6zNOr2JRZIXjIb1eYqgjp15ds8x1eYaeJOTbh+/uey0WlnqZiGPcy+7ve D/ml5jvfMPkCLUbui1110giHSOIWgKoD3pU1Pjm6/wCB9q5Z55Zy868h6Wr210MNKceOP80We83L dhX5T/8AkxtA/wCYof8AETne9s/4pk/qvG6H++j731X5n8zaT5a0afV9Uk9O2hoAq7u7n7KINqs3 +e2ebaTST1GQY4Dc/i3qs2aOOPFLk+b/ADb+evnXWriRdPuDo+nmojgtiBLxIpV5qc+W/wCzxH68 77RezunxAcY45efL5frt5zP2nlmdjwjy/Wx/T/zO/MGwm9aHzBeu23w3EzXCbf5E3qL+GZ2TsnSz FHHH4Cvupx4a3NE2JH7/AL3uH5V/nXB5muE0bW0S01lh/o80e0NxQbihJ4Sd6dD28M4/tjsA6ceJ j9WPr3j9ju9D2iMh4ZbS+96qzBQWY0UbknoBnNO1fPf5jfn9qk19Np3lKUW1jESj6lxDSzEbExcg QieBpyPXbO57L9m4CInnFyP8PQe/vLz+r7UkTw49h3vOofzI8/w3IuE8w6gZASeL3Ekib/8AFblk /DN7LsrSkV4cPkPv5uuGsyg3xS+bLrv/AJyD86z6BBaxSra6xDMDJqEcULLNDxI4vHIrqrcqGqjf 276yHs1pxlMiLxkfTZ2PvH6XLl2rlMK5S73oH5Eee/NXmmbWl12++uC0W3NuPShi4mQycv7pErXg OuaP2i7OwaYQ8KPDxXe5Pd3l2HZmqyZeLjN1TEvzQ/Nfz/onnvVdL0vVPq9hbNEIYfQtn4hoEc/E 8bMfiY9Tmz7I7G0ubTQnOFyN9Zd583E1uuywymMTsPIdzHPOX5zecNbvVTT9Rn06whCpEtqxgkkY ABpJHj4t8bb8eg8Mz9D2FgwxucRKR7968hbjajtHJM7EgeT6G07Uj5Z8hWt/5mvHeaztEk1C4lPK RpWFSn+U3JuC+OcNlxfmNSY4Y7Sl6R5fjd6GE/DxAzPIbvn/AM4fnp5y1q6lXTbltH02pEMNueMx XpV5h8XL/VoP152+h9ntPhiOMcc/Pl8B+t0Go7TyTPpPDFJNI/Nb8wtLuBPDrl1cbgtFdyNcowHa kxelf8mmZmfsbS5BRxxHuHD9zRj12aJviPx3ZH5g/P8A87XtzBNpFz+i4vQRbm2EUEyeuC3N0aWN 34sKbE7ficDTezengCMg4zexsjb4FycvauUkGJ4dvJ7V+UnmLVte8i2mq6xcfWLyR5xLOVSMcUkZ R8MaoooB4ZyHbemx4NRKEBwxAH3ebuuz8ssmIGW5YB5v/NPW9RvpYdJuHsdNQlYjF8MsgG3Nn+0K 9gtM811/bWXJIjGeGHlzPxfUuzPZ3DigDlHHk8+Q8q/Wk2mfmD5w0+cSpqc1wK1aK6Zp0YeHxkkf 7EjMPD2pqMZsTJ9+/wB7n6jsTSZRRhGPnH0/c908p6+2vaFb6k1u1s8tQ0bVoSpoWQnqp7HO20Oq 8fEJ1VvnPaWi/LZjjvir8b+byLXfzK87WuuajbQajwgguZook9GA0RJCqipjJ6DvnKantfUxyyiJ bCR6R7/c9xo+wdHPDCUobmMSfVLu971jWtSvbbybc6jDJwvI7L1kl4qaSenyrxIK9fbOp1GaUdOZ g+rhv7HidLghPVxxkegzqvK3kukfm15rg1CKXUrw3dknIy26xQIX+E8RyVAR8VN85XB25nEwZy4o 91D9T2+p9m9NLGRjjwz77ka+3uS7WPzG83anO0h1CS0irVILVjCqjfaqkMevc5j5+1tRkN8RiO4b OXpewtLhjXAJHvlv9+yY+U/zR17TL2KPU7l7/TWIWYTEvKgJ+2rn4iR4GuZGh7Zy45ATPFDz5uJ2 l7PYc0CccRDJ0rYHyI5I7zj+bWq3d3Ja6FL9UsIyVFyoHqy0/aqa8F8Kb+Phl2v7cnKRjiPDHv6n 9Tj9l+zWKERLOOKZ6dB+s/Yxix89+b7OcTR6tcyEdUnkaZD/ALGQsM1uPtLUQNicvib+93GbsfS5 BRxxHuFfc9s8i+bU8zaN9aZBFeQt6V3EteIalQy134sM7Ps3XDU4+LlIc3zztjsw6TLwg3E7g/ju fIehqr63p6OAytcwhlO4IMgqCM9w1BrHL+qfufNMX1D3vRvzn/Kl/Ld42t6PEToNy/7yJQT9VkY/ ZNBtGx+ye3Twroewu2fHj4eQ/vB/sh+vv+bse0dD4Z4o/Sfsa8uX15cflE0E8rSRWmtrHbIxqERr V3Kr7cmJzhf+CXjjEwIG8qv/AGT2/wDwO5E5Zg9In74qHmv/AMlTa/8Abdf/AKg1yf8AwMv8p8f9 6x/4Iv8AfQ/qj75pB+U//kxtA/5ih/xE56P2z/imT+q8Bof76PvZn/zkjr9xc+Z7PRFci1sLcTMn YzTE1JHsgWnzOar2W0wjhlk/ika+A/a5va+UmYj0AZH+Qn5c6O2hp5p1O2S7u7p3FikqhkijjYoX Cnbmzqd+w6Zge0famTxPBgeGI511J/Q5HZekjw+JIWTyesa/5c0TX7B7HV7SO7gcEDmByQn9qN/t I3upzmdNqsmCXFjJifxzdtlwxyCpC3yF5o0a68pecLzToZmE2mXIa1uOj0FJIZNujcSpz1HR546n BGZG0xuPsIeRz4ziyGI/hL6D8/ecp5vyWOtwfurnVrW3jPE/Ya5KrMAR7cwM4fs3QgdoeGdxCR+z l+h3+q1BOm4hzkB9rxD8p/Jtv5s84Qafd1+oQRtdXiqaFo4yq8Kjpyd1B9s6/tnXHTYDOP1E0Pe6 TQ6cZclHlzL6wsdJ0uwshY2VpDb2YHH6vGiqhBFDVQKGo61zzTJmnOXFIky73q444xFAUHgv/OQP 5faTpAtPMWkwLaRXcxt723jAWP1WUukiqNlqEblTbO09mu0p5bxTPEYiwfLudF2rpYwqcRV80X/z jB/vR5j/ANS0/XNlXtdyx/53+9Zdi85fD9LBPzr/APJn65/rwf8AUNHm67A/xOHx/wB0XB7R/v5f D7g9w/I/y1p1j+XtncGBGudVDz3bsoJdeZWNTUfZCKNvGucf7Qauc9URe0Nh+n7Xd9m4RHCDW8mJ /wDOTOuXCW+j6JGxWGYyXdwAftFKJGD7DkxzZ+yenBM8h5igP0/ocTtnIajH4pP/AM4//l9petS3 fmHVoFureykFvZ20g5RmbiHd3U7NwVloDtvXsMyvaXtOeIDFA0ZCyetNPZWkjO5y3Ae/X2kaVf2J sL2zhuLKgX6tIitGABQUUigoOlM4nHnnCXFEkS73fyxxkKIsPk381PJsPlLzhcabakmwmRbqyDGr CKQkcST14urLXwGemdj646nAJy+obH3h5TXacYshiOXMPdfyOg9f8qrWCvH1Wu05eHKVxXOJ9po8 WqmO+I+56HsefDijLuP6Xl6LeeXPMSi7tlkudOnBe3lFUbgajr2I3B+nPHQJafN6hvA8i+1Ew1WD 0yqM48xz/He9Ttde/L7z01vDqUAttTR1ZI5SEZyD/drMtOat04mh8BnTw1Ok1tCYqfn919XjMmj1 3ZwJxnixkdOnnw9D5vQ4444o1jjUJGgCoigBQoFAAB0AzfgACg8tKRJs83zP5n/5SXVv+Y24/wCT rZ5xrP76f9aX3vr3Z/8Ai+P+pH7g918xf+S8vP8AtnH/AJNDO31f+KS/qfofN9D/AI/H/hn6XhPl zShq2vWOnMxVLmZUkYdQlatT34g5xGkw+LljDvL6RrtR4GGeT+aH0fbaPpVtp406G0iWx48Tb8AU YUp8QP2iabk56FDTwjDgAHD3Pk+TVZZ5PEMjx9751826XDpXmXUbCAEQQTERKd6I3xKPoBzz/XYR izSgOQL6r2ZqDm08Jy5kb+969+VXlnT7Dy7bamYlfUb1TI07AFlQkhUQ9hx3PjnWdi6OEMInXrl1 eF9o+0J5M8sd+iG1efeUi/O3RrOOGx1WKJY7h5GgndQBzBXkpanUjid8wfaLTxAjkA3ui7L2T1Uy Z4ibiBY8lL8i5H9fWIq/AVganuDIP45H2bO8x7v0s/a+IrGf636Hz5oH/Hd07/mKh/5OLn0Tqf7u X9U/c+JYvrHvfa99ZWl9ZzWd5Cs9rcIY5oXFVZWFCCM8jx5JQkJRNEPaSiJCjyeLeafIi+TfJ93Y wS+tY3WtJc2RJq6xtauvB9uqlTv3GYXtr2j+aw45EVIEA+/1O+9iNL4OpmByMTXziw3zX/5Km1/7 br/9Qa5tf+Bl/lPj/vXD/wCCL/fQ/qj75pB+U/8A5MbQP+Yof8ROej9s/wCKZP6rwGh/vo+9kf8A zkRps1t5++tstIr61ieN+xMdY2H0cRmB7MZRLS8PWMj+tye1oEZb7w9U/ILzDZ6j5Dt9ORx9c0l3 huIv2uLyNJG9PAhqfMHOb9pNNLHqTP8AhnuPlRdp2XlEsQHWL0h3REZ3YKigszMaAAbkknNCBewd k+OvzM12217z3rGqWrc7aaYJBIOjJCiwqw9mEdc9U7J05w6aEJcwPvN/peP1mUZMspDk9q85eWb+ L8grewKH63p9ra3M8XccCHlH+wDN92cjodXE9pmX8MpSA/R83dajCRpAOoAeVfkv5rsfLfneG41C QQ2V7C9lPO32YxIyurMey841qew3zpe3tHLUaYiO8oniA7/wC6rs7OMeWzyOz6wR1dQ6EMjAFWBq CD0IOeaEU9W8N/5yR82afLaWPlm2lWW7jnF3eBCD6YVGREan7TeoTT2987H2W0UxKWYio1Q8+/7n R9r5wQIDndlQ/wCcYP8AejzH/qWn65sl7Xcsf+d/vWPYvOXw/SwT86//ACZ+uf68H/UNHm67A/xO Hx/3RcHtH+/l8PuD6K/Kn/yXWgf8wi/rOcJ2z/jeT+s9Dof7mPueW/8AOTmnzC+0PUQKwvFNbs3g yMrgH5hjT5Z0fsllHDOHWwXWdswNxKZf841eYbNtJ1Ly+8gW8jnN7Ch2LxyIkb8fHg0Yr/rZj+1e mlxxyj6a4fjz+2/sbOx8o4TDrdva85F3T5Y/PnX7LWPP0gs3EsWnW8dk8imqmRHeR6H/ACWkK/MZ 6R7OaaWLSji2MjxfcP0PLdqZRPLt0FPZPyE/8lnp/wDxluf+TzZyntH/AI5L3R+53PZf9wPj97I/ M3lDy95lDQ3igXsAAFxCQJow1SobrVT2DD5Zyes0OHUbS+odRzD0mg7Tz6TeH0HoeR/Hk8Y86+Rd Q8r3ERklW4s7gkW9wo4mq9Vdd+J+nOP7Q7NnpiLNxPIvf9ldsQ1kTQ4Zx5j9T1L8qPMN5q/lxo7x zLcWMno+sxqzx8QyFj3I3GdN2JqpZcNS3MTTxntJooYNRcBUZi68+rxrzP8A8pLq3/Mbcf8AJ1s5 DWf30/60vve/7P8A8Xx/1I/cHuvmL/yXl5/2zj/yaGdvq/8AFJf1P0Pm+h/x+P8Awz9Lx38tv+U3 0r/jI/8AyabOR7I/xmHv/QXvO3v8Tye4feH0Pnfvlj54/Mn/AJTfVf8AjIn/ACaXOA7X/wAZn7/0 B9T7B/xPH7j95e2eSP8AlENH/wCYSL/iIzsuzv8AF4f1Q+e9r/41k/rli353f8o1Zf8AMav/ACak zWe0X9zH+t+gu59kv8Yl/U/SEn/Iz/evV/8AjHD/AMSfMT2b+qfuH6XP9r/px++X6Hz9oH/Hd07/ AJiof+Ti59Fan+7l/VP3PiGL6x7327nkD2zz787f+UVtP+Y6P/kzLmh9ov7gf1x90nqPZP8AxmX/ AAs/7qLx/wA1/wDkqbX/ALbr/wDUGudT/wADL/KfH/eun/4Iv99D+qPvmkH5T/8AkxtA/wCYof8A ETno/bP+KZP6rwGh/vo+99Ifmd+X1r500H6sGWHU7UmTT7luisR8SNTfg9N/DY9s4LsntM6TLfOB +ofjqHo9bpBmhX8Q5PmKaHzj5G1whvrGkanFVRIpKh1rvxYfBIh+kZ6HGWn1mPpOB/HwLzJGTBLr GSK1380fPuu2TWWp6xLLaOKSQxpFArg9n9FI+Q9jlen7I02GXFCAEvifvJZ5dblmKlLZm35Q/k3q Woajb675htntdLtmWW3tJlKyXDqarVG3EQ67/a7bb5qO2+3YQgcWI3M7Ejp+37nN0HZ8pSE5ioj7 f2PouaKKaJ4ZVDxSKUkRhUMrChBHuM4OMiDY5vQkXs+ZPzJ/JPXNCvZr7Q7aTUNDcl1WIGSa3B3K OgqzKvZx260z0Lsrt/HmiI5CI5PPkfx3fJ5rWdnSgbgLj9zCLHX/ADhaIdJsdR1C3Tk0ZsIJp0HL oy+krDfahFM3GTTYJeuUYHzIH3uDHLkHpBl7t0VrfkfzLpGhwa5rMDWi30/pQQT1Fw/wl2kZDuo2 p8W/tlen7Qw5chx4zxcI3I5e5nk004REpbWfi9R/5xgVvW8xtT4QtmK+9Zs5z2uO2P8Azv8Aeu07 F/i+H6WB/nX/AOTP1z/Xg/6ho83XYH+Jw+P+6Lgdo/38vh9wfRX5U/8AkutA/wCYRf1nOE7Z/wAb yf1nodD/AHMfcifPvk2y83eXJ9JuCI5T+9s7ilTFOoPFvluQ3scr7O10tLlExy6jvDPVacZYGJfK WsaF5p8ma4sd2k2nX8DFrW6jLKHC7epDKKch8vkc9KwajDq8dxqUTzH6CHlcmLJhlvsU0uvzZ/Mv U7QabJrM8kctIwkMcUcr1HEL6kSLI3Kv82+Y0OxtHjlxiA+N18iabJa7PIcPEUh1/wAuavoFxBa6 rAba6ngW5EDfbVHLBQ4/Zb4a07d98zdNqseYGUDYBq2jLhljNS2L6Q/JH63/AMqotvqXD63yuvq/ qV4c/VfjypvSueee0/F+anw/Vwivk9T2NweHHjvhveudW83vtQ826P5guLq6muLPWGYmeQkgtX/h WTw/Z8M8hyZc+LKZSJjk6/ju+x9lw4dLnwCMRGWLp+OYP2qWr+YvMfmOeBNQuHvZU+G3iVFXdv5U jVQSflXI59Xm1BHGeI9P7Az02h0+lBOMCA6m/wBJe0/ln5YudB8vcLxeF7dyGeaPugICqh9wBU/P Ox7H0csGGpfVI2+f9v8AaEdTnuH0RFDz7y8S8z/8pLq3/Mbcf8nWzjNZ/fT/AK0vvfQ+z/8AF8f9 SP3B7r5i/wDJeXn/AGzj/wAmhnb6v/FJf1P0Pm+h/wAfj/wz9Lx38tv+U30r/jI//Jps5Hsj/GYe /wDQXvO3v8Tye4feH0Pnfvlj54/Mn/lN9V/4yJ/yaXOA7X/xmfv/AEB9T7B/xPH7j95e2eSP+UQ0 f/mEi/4iM7Ls7/F4f1Q+e9r/AONZP65Yt+d3/KNWX/Mav/JqTNZ7Rf3Mf636C7n2S/xiX9T9ISf8 jP8AevV/+McP/EnzE9m/qn7h+lz/AGv+nH75foenLoWiKwZdPtlZTUEQxggj6M7E6jJ/Ol8y8H4U e4I7KWanPb29wgSeJJUBqFdQwr0rQ5GUBLYi2UJyibiaUX0rS3iEL2cDQhuYjMaFeVKcqUpWmTxH w/o9Pu2RkJn9Xq9+62LRtHhkWWGxt45UNUdIkVgfYgZZLPkIoyPzaxjiOQCMypmoXun2F/Abe+to rqBq8op0WRDUUNVYEdDk8eWUDcSQfLZjKAkKItBWHlTytp83r2Gj2NpN/v2C2hibbcfEig5dk1ma YqU5SHnIlhHBjibEQPgmmYzak3m+78w2Xl28vPL0EV1qluvqRW06u6yKpq6gI0bcuNeO/XbMvQwx TyiOUkQPUdPvadRKcYEw3k8Ls/8AnJbzcl3Gb7TLCW2Vv30UKzRSEeCu0soU/NTnYz9lMBj6ZTB8 6I+4fe6OPbGS9wK+LME/5yW8mmCr6bqKz0P7tUgZK9hzMoP/AAuas+ymovaUK+P6nLHbGOuUvs/W 8m/M78zr7zvfQfuPqemWfL6rbcuTEtSskjbAsQOg6fjnTdk9kx0kTvxTlzP6A6rW605jyqIe0fkD 5UutF8oSX17GYrnV5BOsbChECrSKo6/FVm+RGcn7SayOXPwx3EBXx6u57KwGGOzzk9OznXZuxV2K qF7YWN9Abe9t4rq3avKGZFkQ1BBqrAjoSMnjySgbiSD5MZREhRFoTTvLPlvTJTNpuk2djMesltbx RN0I6oqnucty6vNkFTnKQ8ySxhhhHeMQPgmWY7Y7FVC80+wvY/SvbaK5j/kmRZF8ejA+GV5MUZip AEebbizTxm4SMT5GlKy0XR7Bi1jY29qx6tBEkZP/AAIGRx6fHD6Yxj7gAzy6rLk+ucpe8kozLnHd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVYD5y/JXyd5muXvmSTTtRkPKW5tOKiQ9z JGwKknuRQnuc3eh7e1GnHD9UO49PcXA1HZ2PKb5HyYTJ/wA4voXYx+ZCsZJ4K1lyIHYEida/dm3H tca3xf7L/jrhHsX+n9n7WU+VfyD8maJdJeXZl1e5jIaMXPEQKR39JR8X+zJHtmt1ntJqM0eGNQHl z+f6nKwdl44Gz6j5vS8592TsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir/9k= + + + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:551D098FDAA7E911B425F35AB770E4C7 + uuid:6a8ecdeb-674b-4af8-abe2-024c292e2d29 + + xmp.iid:541D098FDAA7E911B425F35AB770E4C7 + xmp.did:541D098FDAA7E911B425F35AB770E4C7 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:A61F418A7C94E91197BDD9C8DFBF9319 + 2019-06-22T01:30:22+02:00 + Adobe Illustrator CS6 (Windows) + / + + + saved + xmp.iid:551D098FDAA7E911B425F35AB770E4C7 + 2019-07-16T17:02:54+02:00 + Adobe Illustrator CS6 (Windows) + / + + + + + + Web + Document + + + 1 + False + False + + 2792.000000 + 736.000000 + Pixels + + + + + CenturyGothic-Bold + Century Gothic + Bold + Open Type + Version 2.35 + False + GOTHICB.TTF + + + + + + Cyan + Magenta + Yellow + + + + + + Standard-Farbfeldgruppe + 0 + + + + Weiß + RGB + PROCESS + 255 + 255 + 255 + + + Schwarz + RGB + PROCESS + 0 + 0 + 0 + + + RGB Rot + RGB + PROCESS + 255 + 0 + 0 + + + RGB Gelb + RGB + PROCESS + 255 + 255 + 0 + + + RGB Grün + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blau + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Graustufen + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Webfarben + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + + + Adobe PDF library 10.01 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 88 0 R/TrimBox[0.0 0.0 2792.0 736.0]/Type/Page>> endobj 85 0 obj <>stream +H‰|’OKÃ@Åïó)昲™?›ÝìµµBqÁƒxj«`”¶‡~}g×j+ˆòæ…Ùß{ é¯çØ/焳‹9£”˜»2ížáßa–IDr*ƒÝ“î6Ð_ÞnöÐçLȘ×Ðٞ +應°\E}#Çó÷ÍGÛ±¸ÐlÚNƒé®%›Çö!_Ǖ¨¦x—á€âDló“ö¯FpÚLõè"ÃÍÿ•·Èµ£ŽTû¬&(&HÉ䭈âX’Bõ£Ó±Ì/°6ú¯vg´`oJê>stream +8;Z\t9t%q^#_hHc=A1XALg@6UBB8O0VJ0CY1+PLJMH]QAJuV'4g5)6AFB>,p>9qqj +$:KhHFH&hG]UWKc.M+c4rRZe:%^Zns62rH^8*%8i?R7b>7Bn$G.AE[ZS%%PRhHJrT +IGHRm-^l*8%,5@V=\L#Lol1D-IBL'G$IAapr:Y;>NVfG6%Ra!R7%@c/PJ4L[`^ZWp +"]>:Cd8iZ,LIGi`8J6H2S7iETbcsW)$*PS7:je@3Q\\n3:PeW]OmOWj&?XVl)hdlnq1`smp"drMl +endstream endobj 89 0 obj [/Indexed/DeviceRGB 255 90 0 R] endobj 90 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 83 0 obj <> endobj 91 0 obj [/View/Design] endobj 92 0 obj <>>> endobj 82 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <>stream +H‰|V xM×þ×>çÞD„äˆ8÷ƹf‰ð )!}TB‰YÍ"ƒˆD"ˆ%†ˆyz%ÄÜ(¥EñÌóX­ž{sbzÞ«(%¹ç­„Ï×÷ZÝûÛß>{¯µ÷ù×>ÿ¿ö¨†4HèÖ×/ ©îž±pžxÕks @€>("y¢rðTfÀ!G'ŽŽï]â\ pf»|rt\jô˧7Û®/ØpLTxäÑZñg^¼_ëž0´ujÂã¹<®?1e©ñ¹·N1q á;B +&žÓµŽOIÔ¯®R4ae\x|T(ö®ã1c’'&L˜¨uÕó»šô­°'&E%>ê<ˆÇÇM éŽ8ïµZג=Òßö ÑÂMÈ¢ªƒ¨,2ÏÍÃoJ°žaP ¼zØàžC)P€u¶•fªìkò©ñÕæ¦Ç»IîE¥Ïÿ6J²NïàXÅ©ªsµê.®·5k¹{xzÕ®ã]קžb4ùÖWÍ 6jܤi³æ~þ-Z¶úKë6mÛ~Ô¾CPÇNÁÿµs—Oº†„vëþiža½z÷éÛ¯ÿ€Ÿ }FÚÌY³ç¤Ï—1?3+;gÁÂÜE‹—,]¶|ÅÊU«×ü틵ëòÖoÈ߸ió–­Û¶Y°ã«»¾Þ½ç›o÷îÛÿ݁ƒ‡þ~øÈÑcÇOœÐ"ÜD1nóhEnÁ†ÝØ#>¡@ìÅ>œ]ñ ¾Å)ÌÂqÌÃKŠUx‚؄ÅŠ…Ô]Ì¡O©õéøNdâÅ1’©·X‰5ºx3ÃՊ&w‚7«ô6·’ŠÞž¤•TØ+z‰ï~†°jOtWQƒí?‹çpû-ß´^ÕüϹü֏x7rû Ó6òÃkþÖô‡Z0ör$OQN°…Z;†‘+¼˜ËKPB.š…íAÌôEäAžÚ,-GËã“zM.‰Réö%ƒ3y¢%ZñìVæ˜A¬]Bæh‘ÐbYý:pšªÀM‘Í>^ä#Gkùp@tÀæõzlbv¶ƒ YCh¯&§jÇ´'Z9œÐ˜wÅjæH36Æ /©…´^ã?¸p$Ñ=ÎÚZκËǞŠÈHböÒ@á-ÆKodƒîQ…[‡ßˆN¬ÁDVL²YËkY¥ùØÌ*=Ϻ»ÎŒ{Á¼³3§ëQ{ +¡PÖK2ˆ1H,›¥iÒ!‡Hm ¿¿£ D7ôc]&ðŽKy§­8Æ|»ÇÊiMm(¸R”Kûèý@÷¨LD‹b“8% ’õººåì/µÆÚCíd>gfÿ«pÌ]ÐCg4ŸPë|2«|6g¢,Î@kùÌ6rNÙÉlÞ˸Ïr¹…g|>‚«Ž«#£7°ݹ¶dm9’`F2„>Š•šÊÊ¡­´‹¬tŸÒkÆÕH„ˆ±\ñ-W’%ɗkˆ´RZ#m“vJeO¹™ ·”êæë;ésô'ôOÊËæÚSí5ƒ–ÎT…;|PkC´FW„1ß"9†Ñ•Yl笩œ›fó¹/ãï•ÏœÚÏ·Ãù®ئ®+|ïû³c;ñ³›ä9˜€íòŸÔ#b‡Ø!àd@ì(¡NÈŒŽ¤«ª)`J[è# ŠZ´Ýؔ•6íØ53bë"­›Ôj•ÐV&­hR;eVj¶nÑ-<ï¼çA5-ïùåÜ{ßýÎùÎ9÷øç}×Ák7µ,ýý*ím¨…ÿ†ãOµÁ U¡¯ÇP¥âP‰&ý+ø$Nâ[”*k9µ‚ +R#ÔqŠPÃõu‡Î«”^OGéô^8íOAÇr‘þ5= –‚8ù»˜aæ»Ì!æC˜̟XÄnb#l{ý{“çr¸w;®3éÞÓÛõbÎ- åkÙõgê]ˆsø#¨?%Ã/C9…Ô:ԀÚ…]†ÿN¼•Ò¢'‹)üèleþ€ÝmݐYP“öá/ASAÏCä•@̏ÁÙ1 +ul¯C]ø°å€êUyŽY8WðÝ«xÝ¥,!'5$›À·ÕY—à„:‰…ÌÌiˆ—ßd8ô“õׯߘ¹Á¥Ð[Ô µ·•ó?ÖÔØP_S]µ¦ru…ÏëYµ²|…»l¹XêJŠ—9EKí…KlùV oÎË5 9zÇ24…‘7(¶ÆâŽÆ-¶µùÔ±ØýMĉS­ê!®© jJ 9ü5M)«)=ÐļàG~ŸWŠù0 +)ÜÓùh@Œ $­ÉšÌ¸µA. \.ø†´‚ãB´>=*ãx_Òhh[† >/JŒ A"­âX·®Åš@µ›’Òç*A*B—ûI¤3 8\®˜ÏKpËq€ q=1{4Ô¢mC¸¢Ó¶vªæ #BÒ;#O¦x4÷˜ÅÁþÞ(¡ûcêÙ Ȇ½³vŸ7…ßØ%9-)Œ¶D¯¢p&‘ %˜º›µ%zèau-í;u(ˇr¶3úðªK}ÆbðRŸ·½+êÔbpRPÍèŠjÀK±}5€TçT3³‰Au&¾K 9âzqTÞ²Šd‚ºžq]( +KW3Ÿ pP·DEivˆ±þ€3Y€ä®g.†$!ôèŠÏ›ä-YO'óÌ ‚)÷aaèÁš&iꪨ]UDbB„;@ UÖ >†¼£Ôà/†Á£;Áq™oR‰`Ë ?—炘þâљþ…®ŒŸCª¨†ËƒƒõE™x’’Ð H¢3š hÀqI«=1BÅՕ™ÅÛVu%±¸òàëqÂù’ÖZۈÞýà6óKòƒ£M/ù?ËCÙuHŸ dØ29u÷ËGî¸<jZ!e¹UZå¸ÜŸÊ$Dåd{»<Œ/š”Êď8ÈÙÉØ(§’ê¬7H~K”vP±¬D9hÚ¿)¶wöDH#LÜ¡A18¸B(1° ø‚»R6—Ì“Ð]—ªG•ñ×Å÷¡æåTÀì×`c‚ò âC„.l€E¢TC¡r#Dà I²L +{/ Nw {…0þÛešFŽMaÏš¦Â9:Ðð\Â(¤O]Å"²{6ñwüsþMü]?çGÍ~þ¾ÎâšJ—Åe)ƒ†ãm^ gæ%S™Ö E3³Ì»L/tN‘*˜BšG–î\âhCa·ÎXtÑ1Šâ‹1_/Æ# Ãue-ëyJÛv¼#=Û> ûÞ÷Ï¢ætsssÚÒh±6®©Ä°kmKQm ª®ZRȖr¶‚%ÕUuµ5nú<æ•D~¸ý÷ÊoñªO÷¿ùöāéiFúÏÌw6¶à ÿšÇëÃáы“G¯\|é¼=Ê6 o ò ÝRIáòºå”Õm+A‚ÁÜÝm3°3ÆOŒ”1…¯þ,¯›3[K¬LádÄaŸ8byÀw¤zÇý;à°tº¯%zAÊè/¦‘Æ`‚f t—. ¯ã\¥x…«WW­Å –ñõuÿË´=¯(ýøärì+ß·íÛ/Ô·}ð¦ò»³/½¿ýÜå/Þ|çÙý?~ƒ‘æ{•/ž%‘W÷T¬ì~®­ûÿ‰é׏7ë'ŸŸ–O«,m€³nŠCН˜Ñ¸”÷û•Žâ$gqc†Ã\Š²K¼)é‚MœÙ°Ùò¸…¢¯QKQ.Ê¡–J¢)7/f6'LÇM”dŠ˜â œ5±¼I0UšhSˆÿQÖ}ãYùY~¶‹}üíqjz~ œXê®­©£Ò¹¶‘á ¡‘áuتÜæÐh84²³½mXÖÄa„tF`ȍž—VRzdºY[·ÑÈ5eGQ‘Å€ÊñãåûË©’r¡œ2óVKŒOQEWK‹œŽXˆ’ӍËbn7¤½y±ÇᧅB+ÆÑfÁއϳ¯o\{¸šá_šOs@]¾Ë¶« ©Ïblƒl¨q‹¥yY©/ˆ‡±µõí¡á©ªu¿{Št(éÞÞÖ=uJÚ³í=õÊmFšèØ8î>ÿÞýg©ò«#G_Sl”ùÄA©óÄëŠSåi+dÓ`{*BU’£žÇæn¤³uëö&촎$ŒØrôL,¦Ž~i5iҐ-}¸Š±Ú +(FK˜úºü‡BŠzñ 6Ÿ:­ÜûÁçÊåkSÜÿÖ¹DbúÓ{F¹wúŒrç{¸ãvfúe%“”‘ ““?&Â鄖Û’[_i]Öø„nBwTGӕ&Kãeú²‘š¢§Œ”ž§°A¯3#ΐÊ\‘ ù†c¬Ž7èR™ɞcjԅ­›­Ÿ3Çx>oYz~™¥Aea¶oÿ™B¦#íi^L›lÖôaOŸ'¿Zc Pnçl…Wøs÷¾öÚ¦­•%ÍÝXù’‘^ìÜâ¼em¶Viƒ·×À/ÎÀý_ö«=(Ê늟ï~]ä±±ò)¢A‚»ø¨2a•‡Pð 1eË.y,,«©!c$†&š¤$©E&5Qƒ8™h-­4ñ´µÆÆÔ±Ó6:còSãXë¤3Õ¯¿s÷[ªØi§f¦írç÷sï=÷ÜsÏ=çÜ%þ˜7{EÂê ΁T­ ¾hBIÚ:¥<þ©´GuvôŔ+Ρ”ØÑB©NoMß+vÇjneþ)yîeêz5¨>§v«úRɪª¹ª£NPŧêgꗪ…ÿVOr˜ ž‘Àkæ繖»ª]­®­.=ߥ¤¹f¹„p%¸ÄG®³®K®k.͵:n4u&׍YœÞ®uûºã•eñëãE|ɔA%뇑›­ª*»ñ§*y¹(‰·ªÚÚÚBWª†¾ë6vNÄ#‰®TÉ)6m.×\¸[™‚lCتSúë*f̞”ïkÓ¹]ýÞaOçÌo<½ööW§÷møP=Ü_;훮tsæÒwš_ÿù'æ-š=yA_už¨"ù‚Š5=¥¿´$m Ó㭇¦[I·^‰Itþ²£¥¼\匽í%ŠñZI–+&Ñþ=†=$¼Ãh—)U;C^­ƒ7.Ót½|Ê/h­CUÀµ‹fc¾²+Ôµt ôyõ}zò9ÀQ€y^?ð XÀ”åå¬côm}ˆœ@¶v^Z¯÷P¿–Aýêzÿ)ÔŽ>¬Û‰þTí&‡³hÖôc¾:ú$=Hb]lû†žJoAÏ<)×FX·@#r‹nêÇÜPöoÖȺùÇôbz؁¹JɧÒjìéÿ$ä^V†¨H$ZýØãð͎.z ãQù¼:³D­ôãvؕdÔÒXPëÆÂWqbÆhgÄ81hYñó¹|n>sôLÒþˆM÷‚÷„}w6ÍU†¬m@°}ضv݉zDEù @6ШQfaîÏëCÖW Ä]~ú>ü¾æ§ùðkìôé´›ûÃà{ï¥'Ô”…¹gŒ]ôÆId—áÿ˔e¤Ó\çAZƒ³làûçؓ±à§èƒºµÏi<ü•ÌÀރ£Ã¾‚œ´:Êùþœ|‡è°r+ûØØàf¿óÝ+ÅVtÇÀO) íÒ$:hš—ûx}Œ—2d,fÐ~›ÊXÄ|µðZߎ—Õ+ˆ†ïËô7iåôô-Ï^­Äúnœ}î¿BïQJ@߶e27å2n»7ˆQŽÄH²~fòÝÊØ=(㨏cÍ͝â­€‰°á)S¡“dÞ vy_[÷l™[ˆ(åXbÿ‰#":â¥9¾¢´>8 +;dl²-65i'l-â\Äy˜Š.j–ô45sËŒÒtëŒí§JÎSÎПŠnëhÔ>Î[ÎI?£Tö¥ŒA›û&Jː÷5Tí¨‡Þbœ§º×€~ºŠ& 8jØ6ø~‘ÖI-â$•Ê£>Çš®þ’[Ë oﺇá8§lÐ~BÒßçè qzðÇA[Å|ZõÕHßÞᯃwù;—‘”kœa›¹öó9õWIDë¾öµÈó°ßšŠzs°mÆ%*ãšo¼AÏÈÏ9Ëãl§ÚI«Ø7°½´EæÀŸajµö Uò¼ú[ØÀ1ë¥J™ËÿŽÅØ ,Çó2j)WŸG-ÚQð'±¶‚rY§Q £æãÀÿžÊízÜb×_9&㡋ù̈™j¾ >'ÛÊw븎³î‚?:(Q»:‰’ù¬ÒW¯â¼¶¿ŒLŠe]Žš¨=Nãôç Üå/ۏQ_qŒÊ7: 'y¤¯sWi±cúœÙÔ­çP¬qc/KùRçoÀ§•².ÌÅ9P‡ðnl×çÐ×íÖj|S#ïJ)êÔZ2Œ…üÞÉ’oOôÅú ö©3Ž–²¯t?Ö´“Ç1qÆëßÅۙšܦ%Æh&%É\:c]å½1^Éuƒßfö±H²úùØóglƒuUÚ¹·íðiŸÚF;¢1<’FcÚàzè¥wµë<¿‡ÎË2‡žŒÖV`°c{#uXLÄ{©èØï¦ò±> ¶1/ åTdŽ)ãιÿtü~ ~‡÷¹Qòx/¸¾ñoKǐâÌ(Åßž¦:3•=ÎFeб +µ·ï÷*ªÕ"#î?¢\Äãx')q„°f=TzÿOÚ®4%­ÖnW”+"S¶Õ¬íA{дÿm#¿{è:åÒÒIP¥Ñ|"µÙyˆTž¥XÚ-)ÿm"¼JÉèEx ü›6o€?fóhú5kÑF¡÷7Åaó +ÍªÍ zH̱yã…6¯ßhóø>›wгâbÅæÖ@­¯&`ö›õ³,Ø cÈ, †Zƒ!_¸!Øb¶6ÕÌ0ú¾#dºMVg® 6mä±v³¤+³sr Ùj4ƒµÿúxTA›©•TK>ª5©¨ zɗQZ€°-eR!z!ðüõa¼AJ˜iÂúàÊqß×Ôd’[®ŽJ¯Älm–kÇX hdÏlÊAóP¾ÙèçC¶ ´Òu° ,åË¡©Ñ&|ýTIET -•´ˆ2aOúÂØ#„]‹¤­õX_­rw¿ÔP‰&Xºõÿw˘wI™ø²'øvÂÒï~H7ËÓ4b,ˆ8ø:·¯FrÜZHƒôOþòãÈ#ª)X>Η€k¢zÀ™j*”_(Æ#Å»ÅúpPÑ+E¯éþšÈfHn*0 ÜVp[%.Nr‹\J܀Š^z9Rb™€G–T၄ãg…[37$}Â}\E'ÁòR(û±êütâÉ_& +p†¹kí.*ôEƗ˞!’¡í |o‚Nã{^r}øžÜ‹ø¾)¹:|Ÿ–Üj¹nƒGςÄú h¬H¡|@üñ² £ãø<“ko.——Ë ÃƳ·›\•B ¨|)ØÍåîª,š4—voÓb/9ô>Ùk´Ø„"¤VJÛ T¡ÁZk)ºw v/­m¿ˆ_Ú/~D°E¨öMÚB|fïZ*Fqîvž™çÿ›çٙÝÙ½#€õA_ÝDcH°þJ¶Ð˜ú8l¸Ë@wÀa  + ¹t#‹d™Ðä0¡ +Fž\'ôü §-å¬<(Î'ŒW#Œ­óX_ò[?RñØ¡µ BD"=”E¤H}߃x•Éï× ¾ü•c|Ï*ï¹°Šò[^—|˳»8I§ñêwv0õ4ÜÆVNU-EìFñÝ!C¡¯G[Á…ˆJ8œ$&DH/¶>tͽîÁxÕê–=0êfkÕzÍXÕê—›as#Ð ÄlZGr8,éšG»øІ~&Ï¢§Õ5—e V›ÍýüºuN¾fxt±*ÿjzô 5<Ä/Y\¾h­“¿[‚Q¾@Õþ`kè;% wˆdzŸÜ#ü(ڝî>þŽé­VCçøs¡“6½¦unŽ¿iaäSòN‘rGfÜMO´IÅù#÷ yó¸³*ž§S#ÚXBržî×30G¦}fz`¢9ªÏè:2EÝgà*Ñ}F‡«"΃ÈƉ×½Îtk÷˜n (árÝÊd«éÞtê@Ç4]½ ¿Wµ +éÔT<•Kþ7fÿ["Ó¸„ ’¬p3Ü»þ]º_ + 7v~&UÀXñTœs`fJröN*Jeþ¬§éÑÜd~J؉‚s6^H:óñ¤RÉϬ Ï9OVÈLj,[™Q Éj^ͧâIÃ-•Çgÿ–ëíû¹ÆË++‹`ã"WivyVÈ%‘kVäš¹JjÉÏ©WÅ^ÉVICÛëÖ¥áfÜY¹h¯‘à‘Òsþ6ÛÐ+ÍE—Ž“p¿á´ÄN+BR€øRºÛ’4·¡7ºÇRݸϫN¬—ñƒ¥\ÆoyW½²Ê¾Ç/~χ„SÜ9V_n©)¦RSŽz ç(ñ¤³Z8Ò G_<¹ ¬¿  +åì +endstream endobj 87 0 obj <> endobj 86 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 16.0 +%%AI8_CreatorVersion: 16.0.3 +%%For: (Christian Femers) () +%%Title: (logo_blue-orange_clean.ai) +%%CreationDate: 7/16/2019 6:26 PM +%%Canvassize: 16383 +%%BoundingBox: 56 -668 2732 20 +%%HiResBoundingBox: 56 -667.918 2731.9385 19.8062 +%%DocumentProcessColors: Cyan Magenta Yellow +%AI5_FileFormat 12.0 +%AI12_BuildNumber: 691 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0 0 0 ([Passermarken]) +%AI3_Cropmarks: -23 -665 2769 71 +%AI3_TemplateBox: 256.5 -256.5 256.5 -256.5 +%AI3_TileBox: 957.0195 -584.8799 1757.6592 -8.87988 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 6 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -2915 1691 0.25 1586 946 26 0 0 51 123 0 0 0 1 1 0 1 1 0 0 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 97 0 obj <>stream +%%BoundingBox: 56 -668 2732 20 +%%HiResBoundingBox: 56 -667.918 2731.9385 19.8062 +%AI7_Thumbnail: 128 36 8 +%%BeginData: 6246 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDFCFFFD04FFA9FD11FFAFA9FD6CFF08A9FD0FFFAF0885FD4CFFCA +%C2BAC3FD1CFF0F30FD0FFF310FA9FD4CFFC2B4BAB4C9FD1BFF080930FD0D +%FF5A0908A9FD4CFFB4BAB4BABBFD1BFF310F0F5BFD0BFF5B0F090F85FD4C +%FFC2B4BAB4C9FD1BFF080F08095AFD09FF8509080F08A9FD4CFFCAC1B4C2 +%CAFD1BFF310F31080FA9FD08FF5B08310F0F85FD2BFFAFFD2FFFCFFD10FF +%080F080F0831A9FD05FFCACA5B09080F08A9FD05FFAF5A310831305BA9FD +%09FFA95B0E0F0E5B7EFF855B5A85AFFFA9855B7FA9A9300F30FD04FFAF5A +%3108313085FFA95B7F5AFD05FFC2BBB4BBBBCAFD04FFC9C3C2C3CAFFFFCA +%C2C3C2FFCAC2BABAB4C2CAFFFFFFC3BBB4BABBC9FD04FF0F08310F0F0837 +%FD05FFBBC261080F080FA9FD04FF85080F090F080F08317FFD07FF5B0F08 +%0F080F080F5B5B080908FFFFFF080F09850E0F085BFFFFFF85080F090F08 +%0F09853009080FA9FFFFFFBABAB4BAB4BAB4C9FFFFFFC2B4BAB4CAFFFFC1 +%B4B4BAC9BBB4BAB4BAB4BBCAFFC1BAB4BAB4BAB4C2FFFFFF080F080F080F +%085BFFFFFFC2B4C95B09080F08A9FFFFFF5B080F080F0809080F08095AFD +%05FF7E09080F0809080F0809080F080FA8FFA90F080F0E09080985FFFF85 +%0809080F0809080F080F080F08A9FFFFBBB4B4BAB4B4B4BAB4CAFFFFC2B4 +%B4BAC9FFFFC2B4BAB4BAB4B4B4BAB4BAB4C1C2FD04B4BAB4BAB4C9FFFF0F +%08310F0F08310985FFCAB4BAC261090F080FA9FFFFA9090F080F315B5B31 +%090F080FA9FFFFFFA90F0831090F315B310F08310F0F0EFFFFFF0E310F0F +%085B37FFFFFF0F0F080F0F5B5B5B090F08310F31A9FFCABAB4BABAC2BBBA +%B4C2FFFFFFC3B4BABACAFFFFC2BAB4BAB4BABBC2BABAB4BAB4BAB4BBC2C2 +%B4BABABABBFFFF080F085B5A09080F0885C2B4B4C95B0F080F08A9FFFF08 +%0F08095AFFFFFFA95B080F0831FFFFFF5B080F083185FFFFFF8531080F08 +%0FA9FFA90F080F085BFD04FF5A0F080F08A9FFFFFFA9080F080F08A9FFCA +%B4BAB4CAFFFFBBBBFD04FFC2B4B4BAC9FFFFC2B4BAB4BAC2FFFFFFBABAB4 +%BAB4BBCAFFFFC9B4BAB4BACAFF310F0F30FF310F080F5BC9B4BAC2610831 +%090F85FF850F080F5BFD06FF5B090F08A9FFFF0E0F090FA9FD05FFA90F08 +%0F0FFFFFFF0F0F0831FD05FF31080F09A9FD05FFA9090F0831A9FFCABAB4 +%BAC1FFFFFFCFFD04FFC3B4BAB4CFFFFFC2BABABAC1FD04FFC9B4BAB4BACA +%FD04FFBBB4BABACFFF080F0837FFFF0809085BC2B4B4C95B09080F08A9FF +%5B080F08A9FD06FF7E0F08095AFFA90F080F30FD07FF3009080FA9FFA80F +%080930FD04FFAF080F0837FD07FF37080F08AFFFFFBBFD04B4C9FD06FFC2 +%B4B4BAC9FFFFC2B4BAB4C9FD04FFC9BAB4B4BBFD05FFBBB4B4BACAFF310F +%0F31FFFFA9080F5BC9B4BAC26108310F0FA9FF310F0831FD08FF0F0F085B +%FFA908310985FD07FF85080F0FFFFFFF0F0F085BFD04FFA90F080F5BFD07 +%FF5B0F0831A9FFFFCFBABAB4BAB4BBC9FD04FFC9B4BAB4CFFFFFC2BABABA +%CAFD05FFBABAB4C2FD05FFC2B4BABACFFF080F085BFFFFFF85085BC2B4B4 +%C95B09080F08A9FF31080F30FD07FFA931080930FF850F08095BFD07FF7F +%090831A9FFA931080930FD04FFA9080F0885FD07FF85080F08AFFFFFFFCA +%BAB4B4BAB4BAC3FFFFFFC2BAB4BAC9FFFFC2B4BAB4CFFD04FFCABAB4B4C2 +%FD05FFC2B4B4BACAFF0F080F31FD04FF5B37C9B4BAC261080F080FA9FF30 +%0F0931FD08FF080F085BFFAF090F085BFD07FF7F080F08FFFFFF080F095B +%FD04FF850F090F5BFD07FF5B0F090FA9FD05FFC2BAB4BAB4BACAFFFFC2B4 +%BAB4CAFFFFC2BAB4BACAFD04FFCFB4BAB4C2FD05FFC3B4BAB4FFFF080F08 +%5BFD04FFA985C2B4B4C95B09080F08A9FF5B080F08A9FD06FF7F0908095A +%FFA831080F08FD07FF0E0F080FA8FFA90F080F30FD04FFAF080F0831FD07 +%FF31080F08A9FD06FFCAC2B4BAB4C2FFFFC2B4B4BAC9FFFFC2B4BAB4CFFD +%04FFCABAB4B4C2FD05FFC2B4B4BACAFF0F080F37FD06FFC9B4BAC261090F +%080FA9FF850F0F0F31FD06FF37083109AFFFFF5B0F080F37FD05FF5B0F0F +%0F0EFFFFFF0E0F095BFD05FF37090F08A9FD05FFA908310F31A9FFFFFFCA +%FD04FFC1B4BABBFFFFC3B4BABACAFFFFC2BAB4BBCAFD04FFCFB4BAB4C2FD +%05FFC9B4BAB4FFFF080F085BFD06FFC2B4B4C95B0F080F08A9FFFF0E0F08 +%0930FFFFFFA95B080F0837FFFFFFA9080F080F308585853009080F080FA9 +%FFA90F080F30FD05FF5A09080F0885FFFFFF85080F080F08A9FFFFC9BAC2 +%FFFFFFBABAB4C2FFFFC2B4B4BAC9FFFFC2B4BAB4CFFD04FFCABAB4BAC2FD +%05FFC2BAB4BACAFF310F0F30FD06FFC9B4BAC2610831090F85FFFFA9080F +%0F0F0E5B31310831090FA9FD04FF5B080F080F090F080F090F080F0FFFFF +%FF0F0F085BFD06FF0E0F0F0F08373731080F090F0831A9FFCABBB4BABAC2 +%BBBAB4BAC2FFFFC3B4BAB4CFFFFFC2BAB4BACAFD05FFBABAB4C2FD05FFC2 +%B4BABACFFF080F0837FD06FFC2B4B4C95B09080F08A9FFFFFF7F080F080F +%080F080F080F7EFD06FF5B0809080F080F0831300F080FA9FFA80F080930 +%FD06FFA90809080F0809080F080F080F08AFFFC3B4BAB4BAB4BAB4B4B4CF +%FFFFC2B4B4BAC9FFFFC2B4BAB4CAFD04FFCABAB4B4BBFD05FFC2B4B4BACA +%FF0F090931FD06FFC9B4B4C25B080F090F85FD04FF850F0F080F090F0831 +%85FD08FF850E0F090F085BA97F080F0FFFFFFF090F085BFD07FFAF310F08 +%0F090F08855B09080FA9FFFFC9B4BAB4BAB4BAB4CAFFFFFFC2B4BAB4CFFF +%FFC1B4B4BACAFD05FFB4BAB4C2FD05FFC2B4BAB4CFFF305B307FFD06FFC9 +%C1BBCA855B305B30A9FD05FFAF5B310E31307FA9FD0BFF84857FA9FFFF30 +%090831FFFFA9857F8584FD09FF5B31083130A9FFA97F857EFD04FFCAC2BB +%BABBC2CAFD04FFC9C9C3C9CAFFFFCAC2C9C3FD05FFCAC9C3C9C9FD05FFCA +%C9C3C9CAFD28FFAFFFAFFD07FFA931090F30FD70FFA831080F085BA9FFA9 +%FF7E31080F087FFD71FF5B09080F09310E310F0F08310931FD73FF300908 +%0F080F080F080F080F85FD74FF5B0F080F080F080F0931A9FD76FFA98530 +%3730315AA9FDFCFFFDFCFFFD55FFFF +%%EndData + +endstream endobj 98 0 obj <>stream +%AI12_CompressedDataxœì½ms%¹‘ú}"ú?ØÉáaW +”®ãFð’Ú±%̈́4ò®½×ÑA±93ôv“m6[ò쟹?æþ±›Ï“‰ªÎ9löËheï4¤éfTá%‘/O&þîß}ó‡/O_ÞýéúËpÒmž}ñw·»¿¾|¸»ÿՆäÍW¯^½{ûpÒ/~ÿËM?t¨uúU~a5ÿËõýۛ»Û_ñw'¿½Àó¿ØýpóöáæòvsqýZ*ýró‹_â·ßÞ<¼º–ß¿ºûþîş^½»þòîþòöûëW¯®/oO.o~éï!íž]>Håô¼Ÿž]?o¦_ Óæ›ß²ÊåíŸ/ß¾½ù—kt2ûÞÞ½»}ysûýöîýj§Í—Ó”7C +Ãfà›ÿýÍï¯ß¨”Næžû“9ä¸éç“ÜM9»»z÷úúöá›û»«ë·oww¯îîßþj³ûQ>í·—ßËo.7ÿõúÕ«»¿´µ/înPKþùîþÇ_ß=üpsõåöîÕ˶Òﮯ_^¿|¬êéWñÅÅÍ«kÓח›~àœ~Õ/¶ïn^½üݻ׺–ážæžôð‚ï÷Ç·òbÒ$þMzzñÕk!ýáúáA>\zãhüþ×Ûö«„Êò‹úFöZz¼ÿçëÛÿþËÒòýݐäé/‡€Q‹2bÓ¼I¥ïo¯_¿y%3Ɓât¥&ÿj(•å³XqŽéDæV~óx’Ó<¿¾}yùö‡çׯù׃ìÉëçÂ1_^c«HcoWêÃw×Ï_Þ #þ%ë`~þ__Þ\ßË¿Ý<ûæòJ†cŸ_½»¿¿¾½úQ~˜žÿéþN6ãŸ.e?÷S~^ê?¿º{ó£µyÿò»ë×7·7·òxžËøß\]¾º½{xþÏo~¸¾}~/SñV>íúåóחWx-V™¤ço„Í˓ïÞ>øËÝÛw2h7w÷Ï~¸¿¾öŸ.¯Þ=\?ýnÓç𜴗W2ÿlíêúåÍ«W—Ò’lGB^èõåÛ«w¯øF9ã—ÿóÝå½<ƒþpùê;íÈo…íÏO¹¤©Síñ´™ÍSßSÿúS|ÀóÓóç;{…çç|üù9–VΛÇÏý¹¯´ÖWÚÅWM¯¼ÎùÃÏÇ¥™¯õ¯õ¯›¾Öwúڟ{ýîÕÃ͛W?>ÿúí+¬‰?–ú£>üÇæá?úSÿUùíw÷²ZÀ|oe©½}~©_–ï¹lž¾Ô®/½‘KÇåõó«2×úøµ¶~]–¦®ý¹­u£µnš.n¼Îµ Ç­vx§ÕïÊ;Ý5ÜYîå͟o@ÐÁx§¾ÓžÞ-Þç?ó£þúƒñc!?ûâÛse…ñ?½øö­ ÿ/ÈhÎo¯îp¶ÿjóbÿ@=xÆþÓó5ŸxXó·ÿí{WúÚ|{ÿîúÛߔƒˆ/òBÞ왎î°ß½áïò‹o^½“_þúþîݛ¯n¿»{öÅ/TÒú/×W"MÉñõróõŸþ‡ü òÒï.¯~øþú_®o®~¸½~¸ÙÊÐ +Ý늴ôæ—ïiXúýõF+ÏòGùû;üý”çÏ®¿Ù£6 Ô¿ÿB…ÿÝ~ù߄·>üË뻗ï^ÉoÏoÿ|ýêîÍõFVïæ.ïß<¥‹o^]Þ^Þoø‹ÒCÛîæ+°™Ë~¸ùóæõ¥t*•~s#gÆ7—2¾OêA˜Ë5>Ä:ËÞ«ÐüêI]]>ü°ÙÊK¾|뭟⨓Y|'rîzÄø!Zÿ)ÍÿáÇ׺{uóöµ7ÞRüßO|SÖÛ¯oõ•ïß½ýaóíÝÝ+où·ïpX¼¹¹}{ýjõÖ"(ésSyåC`óüoÑÅîRDa“o„óêå?Ûï¿»¹>Øّ矴º®8U‡zýÛë¹¹|u°ÇýÇþæ:³5¸@xç&ðh?üåòáê‡Íonþt/Çìõ{v+&û»›Û—ò¢xwópíàc 8ýöúá_„A {›‘.šjógM{œ|ùåãM?m¶·m•_ßCD¸}µû×r’AH¦ë¿E/H›íKÊç]ó¿¾üoÜü݋­HžÿQÈë?ýª M VF+‘ÿ/eÂÿ¥ÅiQ’—Ü͋rڔ­”•³¦œwÒâE)‹Wkÿ M M%j‘1Àß©Ÿ¤$þ›2/Êi¿õ²ó²íϤ”ŸÎ¤Å³þœ´³þ¢-íðñõʟД±)q˜Pž}¡©)y˜¥èO›²Õòì‹ÿûðœ›Õ°˜×±™Ý:ÇR¤Å2Ïc3Û:»í,g)ø³›ó<73-ÿ•uÎˬo}¾õoÌöy;ëò_ýÓœóAf ñ ó‹¿1Øë‰%s¶Ój¦O­,çsŠ¿ÏYÎV³Yº œË:w(:Weæf›3™'™S+ÌÙÎÊ˹• ”²Íð9«9í9[£æ¸n¹g.8BG`â7Îüž3¾uoo9qõœb­°oô5„Æ0…r˜ÃVÊY¸iïÇ0ŽcӘÇy<·ãÙx>^Èp1Ä1N1Å9žÆmÜÅó(ûT^©—%;Nqš¦<ÍÓ鴝vÓÙt!‹BTØ4¦˜¦”Óœ¶i—Î҅,˜>yÌ1O9å9Ÿæm>ËçùBŽÌéæq–†æ<ÏóvÞÍçó…,Ÿþ4œŽ§ñt:ͧóéééVÊîôìôœKjO·q›¶y;˯¶ÛÝö|{!ËLF“ƒvã.îävóît·Ýívg» Yv='c<‹gә¼ÞY>›Ï¶g»³ó³‹óN¦'œçÓy:Ïçó¹tv¾;—Ur~~~¥q!ƒv/äc/äõ/N¥H§òèÅêç´ã´:í¼)gMÙ5e»(§M™K‘g龖ԔiQbSƦ„¦Èj”/-g«\¹k_þ¼ýs¶(;-2dø{۔Ӧ̋’›’š25Eúyô2.JhÊД¾)][t؟}aÐ~@ûgה­–²Uó¹œÅåܕY[ÎÔrvdF¤Å±‘f&–ã¿uíÕsTe¼æ՘ÚH.Æp9n«ÑZŽŒ×r\tLN­Ì,ÙJ²2±D+#K°"뎛ÑÎT=|+”ÓÎʟ-Ë©•™%[‘Í.›?í&+ÑÊȬ(O.g€ðÕfNÏ9[Î[æFæÓ±Úʟe#o]¾.¥jLy¡K%Ó¯´Ä…fz™´Œè•ù*ñRÛ+§•ë‚®M°È(.´È%ô¢yàïyUòªTUÿ5™.ۖq¯„½2(öGZlÿ쩎؝­ìçŸ,ÂZdî¼l½œ)óђ‹†)-¦U™žXªöÛ"-.~v Gý÷~ G +—†´8<±äEZ|ZÍ'ÿ9h+ø¤?Ÿ¯Åæxí}`Uú-Rü™•ÛŠ-¤ØF²éÞÅvbû^vµêée·{LÝ +ë½]dß²—ÛÝ»µ]]¬û{7¹Õa²Ý&QíR¡Ý­nÍxdŸÊ¿ÜRmc«½Yv珦bcimlۃ{s»°ÌíïÎbÃYïÖ¼°òU«P± Ú¯þóÂv÷ʸ°6ߕKËÕÚfyhß>¶›W{•»úÈï>|G?º«ÿöàçoñˆÐÛªWû +–J-û +V‘U:*ìç”HfS0'“IW¯.©$-¤’¡Q±v¢dQÅzö…(YP³TɂšÕQÅR%kG«“*ZÙ­`ŠT­¨Y[*Z™6,YT¶zn” êßgèBÈ¢j©²ukPu‹ +י)\[*\™ +T.°2Y;¦v]P—†â¥ª”¯Lå ê×Hõ«ç¶º  +¶£ +% jX’nQU4-QÑ•1QÇh:§Bv& +T2(ePË ˜¥1R5ƒrȺ:*h¦Ãoµ#Dù^¢”7၀?=¬ÊÙ!ë„T9Ne·Lõ e$oywõ)¬Øsõï–'·2å%á·ãžläœuÁK’Í‚k.x¤ì˜VfAYq»ƒ|îùâ€<ñ4®q”›|æ]íª¨–ÖBÖþYSçÒWÎ\ª½©´µ„EYÚüâªL‹"À’˜6ÆLkYNWe».fÑlËÙ^Ùÿs±_Êjٞäý2,á`)VÄý”éhq{²´˜V%?Zæ÷)VíÃeûÄBŽ/-îžXΞV¤Å}ê¡©|r‘ýî#ÿ8^?º%7u®µæDÑ2ZQ{j±¯&+Åþ:[1무¨ÖÚò§°Šº…Ê´~[të"õK±Úe}Ó<¥eòRlÍÙËlåÔËöÏ:ƒyicâUՏp˜;5|iá§Xð¤#Üèj9ϖö ã¼çž³à1ÆghK;Îcp–÷qiñQ>ò²âôr9×øhNÑìþ£|â‰\aŸ<²«/Å]ýAfۅáV»ÚRé(†,Fك"NÃx+ŒAÆ¹á8Žtg<‹ûø d9tԁ(²Â‰,g ÙâJ†3ùœîdu(H¡t*ã˧•á\ÆfR3\̐?éf~ö]ÍR9ÝÍ[aOgîtîDJ„Ä Çó(/Y:Q„ŸEœ?¥z'ìãÜ\ÑÝ©ìú +ÿpJÃ-=&ªs㞦ƒZ +&䪶Ê@g5ÜՐݝÖYT™®ku^ïȜ°Ñ/èÆîœ þ[8oḕӏ~[¸k媅›V>Z¹g嚕[¶<òÌ,ÔÎÜ°òÀ¥LÖr»%‡“^V9ے—­¸×ÉhŸ?µ2Ïa¹æ×YI%m‘á"ïåO=ý?~Ws8 _MìI¿ä_Ó&w'£ìM +ˆÃPùϾø»O©»}{ Í“(5c·Éý‰èÓñ×ÙÚI?¥yDMÅx(-1ça”¤8د‡>Nó´•á$tq¬Ý}rKú>(µq’jlû Šf.ª;›ÇØ͌´N9F„ýàï¾i,œtÂiš×úL ÚÛMðY4û.&>˜…?kc¢[fí`>‹Ædúâ¼h,vÝܾÝçiðærH'9„Må˜æOÐus‡Ö¬½ü<ŸŸ?º`—µÐÎö¬â7 ó,óïo^¿¾~P¦ýK $ó?:ë¼0†9«ŒææKÆOžµ>[cs£¡&(bzœ ë O5ò¢jËÃí‚æ=Ô&g§<ÈÎÉဧÂÁ¥‡Ö)m[gЄŠ,žµíª§IgØKuyì$§Ž@‹`ý9ŽFm-·±±?Ð8¦ˆb•°6%C'(>Á +4FaÝíù8ö¢A^< w±v\úÉޛ¾uÄWWüNOïÆ?úi=—ü™Oä3ƒñA*ËÂGYL|™òä.H]QF’ÖNÖ`Gé*Xï,¹7YGÙP ×°@F˜ñ¬s·àŽæ15‡%3{f@ï«QøÉؔ'áRܓ^Áê¢Od8¢3ǝb¨‡£!ƒÔñ¸?ßs:7ÀM‡nª%Q½ÇÁ¥çH z¢(IgšFO)Oo©NËìQpº d]ek…bbU¾V »Êؔ² œ©ðLÈِ´E⥴)myûl!s¯¤n“¹± +„“rw‘¼e—-eo¬’Ù`;ŠŽçî(yˆg+yï(yŸC䒹WÉ;4’w2©{K©ûŒR·Â?«¼=6ò6dm—¶E*?£Ä]äí}‰;šÄM™Ûåí-enJÜά òfÐä,HwÚþ¿ÏýßKª’éŒ3³²¹ìΫó®ü«ýÛÐ-ð]ÔþÜ»Ù:8 ¾þÆ¨ T::8^MâÂ8wÐÀã H>Ù՘®ÿU·gýïéÂô~f0ê’'ŽNÕH]aÔÁLû“©'sܪ  ßw +xoÀÓuÿÕ}(Yï9.OΡcnÿ:ôïåñ´÷ Ýz­ñ½wƒ}kºßwî»Gw¬–û?µ¯ÿÝÒ¢ûk(Çxöpÿ„Q”ŸÆ•C£usvñÖß»Ã×Þq=&}〭#[G¹ÎÄÒ=±€Šn@E“D+<´C ªÇ äðÞR,8¥ÊžÉN&Šß°7!aé=ꤸR°`…ë]ïù›ò~@w5›XDˆS7¯AÌÉMÍK se¶Ò™¥Å5˜ùlf>¾>³Ö§å*••]Ì-Œ¹ó5{a¶ý8í`ë«W×ïÌ£«XV¶®ä‰Ge]ÏÁ`vÊåÕõYÖö¹ Ù®ñë:—"+[W{²?Që £<™¼]Ïu¤ê8ç.à>püÀ!gÖ:|a]»Ì†=³÷^€ÃÁ@‡%è~/èAÖá^èà +”8b?ÂÀúÒâ¡Pˆ´rpN+÷çñ€ˆ@4í᠈þ‘]tl|p'mwKÝKí~jv՞!ëd¡4À>2%ÈýÐú…{d¨ÿ]/,,Ò6¢p)Ø)â<ô1-”x©ÝX»>WƒjøÈÓ4÷xtœEtÎfHÝV¡vžj7™NDÒÊÍû|túi Âa¡ IN{¸ï“( øHü _›Gá¥ÍwÄIí«Ý'·d¦ Ü…ÀÁŒaÎ4ÉQœCÍW“ÐŒL:ÄÖÎ|c‡ô9èS›ú@ÓÍ×÷W?ܼ¼¾†ñÆÿ-Í mDíÉ$’1¢äm ‡g‰¯•£±Œu`Ê[[díÉMyPóÙS{È °2¬"¾´ªxÚ,`O}c7N'"8/¦ácøÀÁÿ’Ýcèí_4ÅՁoåô"=·p˜šŒX`Œ[/>/ú–Á¡„(ºÞ“\»©¡¡%Ä·Õ^j8/•u˜Øi¡Ö@]…¬*€õ¸Í Òj@݅Q.E{Q›ÁÜh1[“4΋å \(Ë®lˆÖ]TóeYR}'œK- Ś°-ò‹Ņ¢¢ù`(s3gDk6ŠI{Ñi´,e³9h1¢„]E—–Ü^QŽ’¥©%x‰^êŸä%{9õ²­EZÜ5¥Â–n¡§Ú/Jh +‡ïÙiôeÿO^•ù@a3î•Ý‘röHqç ÃGœíÝ.hQ(†ÏQ7×ðæäÎÛºgûelMæÝÖPmìKفjOXÄèpÏ]4öêϞ-6謱ºe¯ÀÖ&ûE÷ǎÎÌÎà£BgÚROmeŸÓ®†µh]Ž¶JaUÛrMžq-_öÀUýاôcÛ< +ÚS ´z;Z¦yv4ȄjCë̆iAS¿õì^ë33øƒ%·« ‚ùì64ú«iC{Ìg]½Ösc?Û1à6ísÃHº¿ZԔ¥Çz¢*S‘BÅs­úIEU$PÅqˆû¸Ÿñ3ïá}^ìßãÈS —Xž">¯;ûH}”à®ÁÂå,9GÑ9 åd•}ûwLIZ"tÆ#øÀcØÀGK±µôËXè]¢ŸKÜsy.oR5SÂ5K•ªeTs/ªPU{jü²+4sf(¯e¼rUKö£”«Z¿Ré[UÞ°KUþ°¡iO_©ð¦Äþn©Æ/ù¥*¿Tæ³Y¹“„2K®ÒWµ¾(öƒg<éõþ¢QòÏ]—ópká¥óúgö’½Ôc­ÒÑËX‹´šRcúúEiq×KèF«AsR…CV†°[”í^9]•CD ]–ƒ;vNj JÒb§Ÿ&OÌgÊs*œ£f‰ùɳÛüüÖË·^85˜b‡díCR/ôûD“û‰Úµüã0ãü m‹jŽz’jã â'óÚ®;Ìm…Žœùk~;Òû}GL ™h–ÂQ “œ[,D¤rªÎ)Oü6™ÎQ²ï‚Ÿ˜®'eG-CPš{Zޅƒöã"﮺š +|»u3æ(…§ØöÉƒ\¥ð•Ä´Ê]NœEmðkÞRùË`Êe¢™>å´n8MùS—ë’Ï,ÀCk˜Tá8*G-¸Î1î3)+´2FçHïãO^¤ÅG~ûåq®÷QåçÿZ-~`\ԓÿ<Úâ„öì,ia2Ësr“–šÄ–m”­AjW)rSq¸OfÕ"\E%'†—¥SÚ´.\~iœnë”Ÿ‚,%2(r(LãÙt§+¬¦võ×ÄèH†ÃÛQŸü¸Ê»‚;Ñ£ò&á(úggqsðôvæH×Rö|™ÓÂÀŠ[¬ ©m1aïE£YµšS« -õ—µtÛü1,úف²Ÿ³F=ÓÝ£e°|éO+ãSŠá”ß_¦§iñÉuÿ-µØ˜ÉÎöÒ oeù¦ó([¹tÏ,oÚÄ|i3¥miòšhîê-3ÚV֛:×`䂉 æ-¸ÓàJS7šÆ-œ1û™F+ĒõŒ®2O/S ቢÄ%<%µô:¹´§—®ÑϾ07Wqq÷V°¨„ޝZgMlÂi“Û¬º±èÂ5,rœ-]WÅqUVÕeÕ:¬BuVYfËþ@f˵›jí¤:âžzöÅÊAuÌ=µpN=昒8¦9¥žà†Ò °§–ÝSŠÝÓñþrÌ µW˜Ïó³–ÿ3Zü™£üÌQ~æ(?s”Ï×âÏågŽò3Gù™£|¾nöG/?üø_Ò{Ÿ†1÷3éãœe‚’RTg|ß!|ïÀ?øÏé#ÿ³6[|úëÃ&ö'p»…gõ+Bº•ßLý MlÂx2õMº­Gª¬ZHÒp¦ÍН„aN‡ZXW©-¤tŒÐÒ?0Á# À#„àßÎWì³ûh)§ÝéÙ^Ù}Xñ–Ö€küyÌó³ç¥ò˜ù +é æÀøý+¼ò~¼QcÁlo)L F®½ç³½ãsUþf[jS6í<1cµ¯Ù +ñÙYÎÚbƽÎ!ìÆiÁnx#¿qÉ.5ò۝š55ÍRn,5é•>K% SV&•Bì3ÙV72ß]ûÀÜv]çn8ð#P¦ÏצÅFÇnèٜdÚ.<û€˜vý4žÕ¬ApÎh y¡kÀzÿ,_óùÇçÓYçaÆ9|löܜîËrȬÁ6y1.Á¦O‹¦=°è!˜ë +¬kB¯€}´‡Ã_sB»ø.»êÌð×}/˜ü¸TüìEz°°÷ôð Ìe54dŸ÷䘸ä ëßüu áà~ëý`Àºa•÷·Í@¦˹çú­™~cs=ŸfÜ2¥‘eömâ#k>ßÉóøžZÜ£¯k:Ù4¦{ â©„&ƒ,Ít¹m-^ûÜ ¾šHl¸áD˜˜4ÞþDUŸ[u0 e¤;®omó +ê>ð|GëŒGmΣÈ‚Žxƒ’÷¨Í|ÔàXö£!8~³J ÀÉ%ç3BŒìɧCŒ¬üM²Úó¸žfò`×!ýGèûÀú¨ð·)OmÞÔ¶Ãyê“wa>¼ ó:«g,ùیÝ>kb[Y{ ¤·BWÖëϜ;¸k1õéò¼ü)Ï,òsîÌå¸Ç¶æ䶗¼Ÿ#w¨I¶õW|¦š14mDê:½Ô¡SýS–\Š +PUyJt)æ³Ä’úá·¨õI¨,ŽôlÁ–N1WvµS‰í,‘C ô¾k?ñ`oÃ#)¯¼ÇÊ +¥ïe$â`+«s–èóEóè ¬äœ[ͼÐ*l{Ï3櫝äMéVÍ4…iFP?ƒ°K˜”+”˝/!åzúr›E½£½,¹½J~Þ[þž +”· ¾ù½µ¾$ùèeë}éúßÌ2ÑË ôróH›O ‰Ë–›B3SxVŠÇo+2W5¾»ukaxß6y¯Šá½ä¾jMï}î(6u<ÎÝfÙL·fŒ?õœXÅ,ŸÍ8_þ4)_yãS[ƽŽ”ápáí6‡Jÿ±…×´Öòá-:Уº+Z‡EqYô{ðþȞ ±Í„!sXdA¬×<%ÿá2"s»yˆPð҆-s«¥ƒ½žó†­cå ¤ûž²sÈg+ -®mˆÿú‚ôOÒâ£*‰´xø7‡/ Ù¿è ½ð€êØûW‡L{™E—ÙEû½]UöԖ·gŸšË0û…5£;kv¢Ãù‰úÕ) Wsàô\4Z½AŽû yñ-9ü$<}È~æüë ҟÔâaÅb<¢Š˜¢Bûõ²ì)9«\Û-R®ªM®J ?/9ÂËɦ9ÆõäQ±HSï `¾¥—,ûãH™p @ą¨a”w–é1¸œy-›#l‡ +&‡åv΀ñ¨œ*)ªµP¥Ä-ó"ª„HÙÐ$BH‚ÿ ïAÊ;¥‚yÍ}oÿúÒ¿ù—ª…}0²ÞIßÔþ·*‘ûüŽ®¥š:S-Šj^)ªi¡âZiTœOŸ½?¥W(ŽÝ_j…ÚúþµoëkÛZ5ÈÕ£½Á¤:%-Φ`mWØV¿„°¹Fph põê‹ì÷·n-{bqg¶ÍÇ\šû9,kK½~bvwÕ2#ێ9’Zªp‘¯#õ;nÿÕéOjñˆÊq¤˜¢Âl˲¯ä,• FA:t…´èNXÙZ˜z­Äy“¦óœ0e…9æÆm¸ÓâbÏ]s©ç@Çg<ÕË~q—öîüìš. £ìM¸®0r8\ñ/ÂR£y˜R>ÁG›4žô1µÁOkGj±fBÌ»~˜xϖ0Ó>jÏ1ÌCO˜7 ç­#±›1Ãn^瓛²»Í>è«rÚ ãIZ¾ÉG7ñ©Ž¼xБ׈܃õ‘öäÄÀ㸇ÖYãuúæ†f$óZ¦=.·Æ–®ÊëM§Ë»b«LÖ?7÷»®oy]‹ÐD:[Þò]`«Z5½s•W¦sy[zÍÂÔi@Üö.‹æšÅý»@ææ‚Äåm £ß"orôFªÑŸ6¶/•S×A€¢3ñòÀnÈ)•Ëò¦Nv×Àp уæߺNÚûáOÛýz²_è—U2ÉÍ%ØcVï8îG<üÉ;ñ08>þŒŽ‡Pø3:þgtü_?Í÷¡EmõOˆÚ:~݁)ŒŸß´<£ž¸Ÿ¾YÖõΪ3»¥¹Ü[Uo®Ê~sÕÔÜ£U/æ-]Όf¿ËõùQÛå{7w,—â± +ŸºêÒaA,íIbnP÷yîÅ×=rÍÆy}4~¯ÊCÓ¡uÝôPÌ#q!øH\`m3¯b×WTì½óñhÀã û8],ïGyöS¹öã›æigÁ“®b8tt/§YÐÐ@é¦y¶õoÜÙ7Âú‚âõ.úäÆ~’¨Â¸¾ùÿþßÿ°ùÃÕ¹¼ÿl›å¯u);Iï#¯¥yöÅ^Úâ’½$-nŸù˜Ëè%QñŽ³sKR<4Hýe$ÁñKÚ+¶MôÀ§DHìšk!AIö#c$¬xÞPOî¹6­Ì8?õ•?{æߏ¾ô‡‰ŠŽ¯™’ø5Úͪºjjºë"cהא­gIéúÜnò}BýUºk3j>jÐ|Z\ʁË=>62e™¢¹Ücäìpš‰'­‰¹P©û\W*µ×@ùŠXD8уٮˆö®Ý²š$菮‰÷%B_¦A7s7=ɟ ´^gMÜÒÇ5k¥Y1vQÁádÿ‹´"ŸO"/rù_±ÅCNµC7Á§%Ǔ÷9ÞÍå`*ëe"k‹ÀzöÅ'Æ`%Âª1X²Ê>: +Ë\![µzÐÞÎäT—²L"s~8ÌOv§ÖÇXުŴÙO¶:~± KŠ¿³šäOÆ[!LôçiþΞ”èo™æÏb·Dæù¤è-ž6Ô.£·d•}tü»@iL†ÔF{ëb•ì'N ôóšøyMü¼&~^®‰eZ°ȘµŸÿëÃþIÍ[Byñ»»Ûoîonnn¿ÿòËVuoóì‹ß½áï‚þî›Ë‡‡ëû[ÑêO_ýøöí%´yû×fžOæi˜á§)l†q<édv6C?ÈâšôOõ¯ü þ~§?ê?þ¨?ÿ'ù÷ÿê_d(6¿ÝüÓï6/Ÿñ©ß£Bé©4¼y ê^›ß,Èå½~Ó6q¸làÿy~zÿpvsõpsw{yÿãæWjy¾½»{%cñ•Ë‹ó—7w÷/¶—Wÿ,£÷âۛW×/~}õðËÍÀÿþãßýïßi+gúÑ_ëZpí¥Cû!rՌ²Z²e‰´Kƒs¹÷rœsæÍ?^j[ˑ }҅©ßÄ|DI°’嵐MœO&‘É6ÂNÐZL¸¢xÜ Yª 3ØÄxÒËÜ\ñ±Od“‡MN&؊q2Sތó‰è¸4y:éƒÔÉìÈ¡<7Ÿt) › ¿Ml>±»!ŸÄn‡ÜÄϧ“C°>–ÆÑg6ÄÐgém’^D(݄A_ +„ œkä3DB¶Ç„Ú‹†³‘iϽ¬Â)ˆÈÚ0#Wt*™Ü8€0„\>nê¤ÕaÜŒÓ ®¨Ú 28ý,+cìOä“ðV#ēџêODÚíý͇)žŸŒš4Éé¦édìó¼é£Ìì4•ç¦“Y¸Ñ}à·x©1Íq#íå·AÇ sÁh`aHþœ|FîËþDøF,ä“Nô½Í(C)ÌRò&Ó$¬€\'Ús2ô&¦Oö1£°ž/.3?Fþ<&¼7f~.3°!ðÁ½0ß Z]4o¤SŒèF·1ž[+óúùAÖÜ$ãÛË·Éó¢®L›i” ŒòÒã 3;ϛI:Ãës²úúaÚ¤ ñ™C)ÜzÆcr† Aöj h#ƒ—„§×Õ5`OHcˆ­Þ„N>i–G™ðyƒ=ÀÅ,‹SΛ9y±“©“‘µ¯˜¬*t'Ýdy<ÊPYx\ÝiШÏÉL‹ÆŸåž&¬F©Ÿ§ˆÍÓE¬òõžãsßé?ÓÙÏ'yì2á¾y½ Ê:C–J.9Ë~‘E†8ÿl+IÞn–‰óJ²—Ʀ þX:ò¥š,ãyBkAVœh€Cí§ê’ÅÛÔjå+¼¡ÕgÕ}>®#c„Èòz½¤ŽºÀ‚,O9ÆGäPNBÝ8ɲ.›;Yo¢œ6ÕFí¹6T֟=W¨Ã‰èÁ2wÞP2Ê*hú3‚=W^Ë«•÷†VßW?ýßÿÿýãœ!_½}ñÛK9†wwo~|q÷ϔ_ßß½{c‡ÈáG~ýæúòáúå éd}Ứ_üróÿpäà‘•§Ž°*‘Nfºm;aj'Ž°©4ÄöÄIz_½8c>¾%cƒ}4ÚZ®T¤‡€ÇWVMÈ!l„ÏMY¸p/ܗ5kYäF±^Î0ë‚Õçd›jCQ›wÂl5ô¹Bí»Ùp°¡ô“Q„3ÊáÞPôÑY¨Â¸ü«3øá¼Ù›=N kO†% ¯d|…é¼^RErKë…aŽ"F–ÖãL’ù±í;'{ªu0”Aؗ7â뫎8©½LlF_¥Nw±wÖ5»º¾‘×*ïìí¬>m½%V‹0áƀïur”Ð{%çZ?YJíŽ)`³Âäó(g¼-ÁAÎZ^a¸#ÈÑØ)ööÀ,àr¸ +»êF$Œƍ%†¾“cIŽ"¼q×vÚ ǁÈSL­>/ÊÏfå Îr@ÊVŸEØÌr^ˆøaÏá°2³09#6<{y™Y„%Ñ]„ ¼B–'œyÊé%TÑ®ôÔÉò „"9Ý0°"‚ õ³ ¨°–.Œå9¡Žƒô.‡$ °ìO´‹„S73ž[Êþ1„MÓIÒw줇×K*>Ç·|p¹Ø°Œa†¸²¼ü|åƒ-šb­$’°‰¦‘B°¾ì±B•Ù–aØx; ƒ%Ûí9¨rÂñ!¬ÙρzH +"ò“±}ÊţΠãJdAþ¨“E´†ù…'Ԍ9ۅ¯fƒægN+E•YDöÜT”×Lqy@R!j(¢}Ì},2YK ŒŸ€eªdw‡€Oè1Wå…e®i9R'H2É'aı$‹³“ãDf ÇfŸša:™«MÍ6,O¤‰6»¬¼„»¹9g¹ úš€gÀ`wÐ0¦!Ðµä8O²ÕÀ£sחý$?“¼¢(ÅA4 yUIᩛ¹ÓX/ÖýcºWl®R‘Š*b¦|ÒC¹÷Âϑ*§R|­ŒSS+2Sß´åëӞt² G%­iKÄÙI¶QÓ©QìQ;¯èà­¿´F?s˜x“ú1Ï9bq²¨Ù"Çc`;Y s\PDÌ˃O“±×rÜ4Ééñ«Ú«QìÑp2«o+ʁ ´YӘS–½:Ù_ÏóOXk3²o8F¢&‡,=¿^Rš±ë‚÷ˆ×Q¢u#`Y‚s)d ªÕ¦¬3ì 9Áú»*‹O©AÖ @ØÞÐ`_åýÁv}y-¯V^¼4´þ¾÷HzŸdà‚ÚÁTÕ´ÀýD¡p{”‹Üi1hõ£Ho¢Â- ZlE›Ý ¥ê‡¬¦bЂ˜+ëm\´ÐÚ<ÂD`-ðRöW,Z=-%ÂC-²SðÄbҒÏ?iÝMZ òB ‹V?Œs±hý†AÆ X´È1ó ‹+ìWfСÒMÓì­R¡±g£Ž#NJ{otaâéݞÕ²ò<-íY ¦,'B±g¹ìPìYØv,íY`Í87hÉ΂AßíYØiPOæ,ِ³R¬YÂòē€Æ,ù1Œxç֖Fºj̒6Bx̖%¼¶0e‰¨žä¤qK̤Y¡²äüðR ;V¯âG5da »,bd1dIÿ'ðS, Y½t͍V Y½¬Þ¸vÑè„s/ Y=4ã4» Gm—åÊ«œ‹zaÇ¡Fɸر¤g9ÂeG;ÖÞVÛ?æÔԏK;–S‹ +‹#c1™‰ª˜`raƹ6L¹Öéa6…­¯4R ãR¥š ÊÛ)VªÒÙ–åoTk•/)í¬?mÉÎEŠ—¶¬J5øf˜£Û¨D`EˆÚ¼4eç"¢ª©ÖiǵBhMK•j¨ÚÙ¨j­)ËßÊk•×övV_÷¿•%댆 1´yçLq•Y¶ú„#Æ]rà^+„^ ÂàT1c6T”Qz›™;8dàû™v„ÌZŠN*+sç…ù&`RŠtW ¢±p›Ê)/ÞON0¿„}5Úh5ü“°õœÍëQóŒÜü`Tl“nÂ{ÊÑ',I5 +2°ŒÚ(ûÂ,ê 8¼Wô!Ä®RK)ƒºo„HZ\qbˆe&°Jæ)úĨÖe:6ðפöq‘¦J±1„²i­8ÀÑ4¥?—ݐ>«Nщh»©Í@ãz…b–óŠõ›Jc{_ùÊH¸,þ¸òúAí!‡/n?Ô °àÅï7ÆÉxæø“³]dH°… +Åôœ¬Jo­(Œ)Cw¬mUJ×°¡J–¡0W…U ýØôZ(WeRùvµ^ùokïKß#}5¼K\K5ìÉ:ÝÅI ¿B7®]¼Ô½O0H¬ÜÔ´YóÑâ€_Ñeç”ÛEæä±,²â©âXÖ§yª²ôT׊Å=pW„–R³Ê*Ó[ß4μ.Út-‡é¸»z€(‹!^¯È8¼‡©:¬ýŒ-^d',Öµ^ñG׶*Å:]:®yÓDàAȦ=¯tZKßuSÏ?ÀÛZéOæ¾G¶‘Wš§“‹æé¶È¢yb™Ð„³Ð<Á^Dg\ó„~&2çìš'l4º-TO7"ÕÓmE§„U<ÁºP=¡Ov‚ +ÛdQ<ËÏ ½³]í„Ù¦.W&é p-´N˜Î҈·óŠ>|EëÜЖ«I#K­³’‹ªH;íE™Ä?èÐ_j´3A¿©ûÂ/½1§,´À†lêbm¬¨”µ×…îY_¯Vô/óÆÖßzÜþI¦ù1âVpø«_¯ÈàHô<ŽÅ©9©F‚ÝÖAìqŠÛçigm*B €±6æëÕ‹‘g˜)Æ¢É©%lnjz-·î›sÕ+ú'xcëoý }ã6ð4¨zØa« ÊȜ:e ”9†@ãú@÷C@^,°û” ·Ž2;ZEV ½f°ó½òVWuÁ ;À?,ÝÓ4萍>Sájö!ˆ£O”t2q½"èÊûöÔUã8s¯s&_¬öQ“>šfØ&„ûÐ茖+ëf„€>D^èáË¥S.“7ú‰è'úíáfw|¨è‡r–$zï*BŒC¯Ns$‹ì/ò(WU”ÉÔc‰jÏÏÀ)•;´5ase…ÀN¸~F‰Á½lù˜Q¡QòâišÕ]G»<,yà ž'ªS®]÷k¡ðvY§&Ù^?ŒnÉý±¯:°)ÀZ"i,ÐïJ.V +,£ÖŸ„ jÁÓT ¶f‚"Žšz¬mS…`]ڃ… \[ôl­=ÍaÛ¼™×ó·÷¶ÖŸù +’C¸@ƒÔ’N>€pú±W$C.óEB<é†â‚ÁúÊŒ½0ÞPu…u +~Á®<¥t¢|Ù7â$VZm!LÂéŽE®Ø ¨6 ±?ŠºÑȐðaá֊i.@ÉY»à +U Ǽ!ӊ N©*˜¬Pz"©Ê•œB‘SÍÏ' Ð‡)›@a˜y!i'×ÀШï;•÷•h§¹³O-çiAVc%Ž+å{ؙ66·Jøߊ€~êlS ‰NMßr§†ªà½rµw4 +ÀÓA4£N‰nhðØ öIšSýIe.©?¡y³4Ú§.,iS›’Qu^šÊFK£YûiP@E°Z¬8Øޔ¯;’ê)̀¾È[¬ûË~ŸÛ`y·‡O¢ÕîõŠ,ÇO¦ÙE䘚=ðò.<>F~e¡ØæO`¬µ¢œe±mÊ~­°#n\ë7M30DÁtWû3Š=è/æýå½±õW6^AY¿ô¿aåó({½"ÏjBü†ž;(â€e9 +ÏsŠ6zE%5eóqјS¬WÔÈI%àÚÜ»0´Ö^ Å-¯W+ú'xcëomÆA¦gŽ8—E$óõ’ŒvRîZ5Ë`Ba9L™('8èˆ_¨õF¤ M[N)Ú£N†¨D×Ai €H1¥OûÙ8GyµR«~Tihï3ëÀæ+"^æTO¡xˆòÉYq‰"¼©y‰’9¬²YC¡?‚ÝÆúB&tm˜¦ÚXC±^íQ'ó¦i n‰Û^rU^Ø^Ï+ú'XcûßڌC€KzP´–è?ŵçdØô ÃCvÓ +£t´HS¥\é%Æij+Α›ÆœRzuaÂÈf© We —wjsZ”—+Õêg•–ö>ô'38ª‡I# vÇy61ïlA»ã˜š"Yî«GÈî(€w¨ +tI9âØô˜hñ6Èû BÑ@>ļC@…,å˜wŒ™z^ èuCt’Þin§±¢Þ)1ê¯ÀÞÁtü†½ãûÈrÜ;Lq×þ8® ŽP¡[Bß¡ U‚hÎSðZÇ£;åÊÇ'CSÑ íM[…R:u…ÊÈù ²Ú–ô5$J¥ÓBqù1Ž¡­çŸUšZçqÕÿ³ààéžïZɊ:)s,1YKsE¦;Å,"†`o*Ƚ6åëҞt²üS6M[ÉÌѵÓԚ­ý弞¿¾·µþΆÛÁxjE„ù"2€Â•%4»'2>‹ €²ÔD™–àºÁ<:2Ҝ†¡†8ÅD#¨õ +ò»ä e‘Ém!S{ŒåNÕk,HL¶ +è%W¿ª"ü‰ Z)Ìþ¨“Eꆜk”@Kx”€SLr²(Z±€ÿ‡d€‰J) ºŒÜŸ#]‚:¡ÂTƒ6šêû– ¸FÔ0W‚àñɼçTt¡”4jL N€H ö`4)ah¾ª1&èM:%€yèû>×0œ5ÈwT$+‹€v?å&N§_bõî[¢ €³Ù#ìäõŠ,*.åv4>¿|nB +Á× Ñýµš4-9ź´'Ü}º´PØІ'8Å-ïV+úû{cëm”†‚žŽmì=Š´€ûìØ ôá4”ØFÈT2,dxcØa¨½Å5pSњƜ²ìÕÉþzޘÂú[›q(Hz,¥4º ½’…¹ëâ |‘O:"Î xß)γò¯K@m¬R¬×«²Ü›­¦6ÖÙçÕ^b<À_Ï+ú'”Æö¾õ=Bóg XBâJ܀#âà˜8Xbâ<€ÀAqAà ¸B°ÄÄy câ<ŠÀ1qî\bâJ˜€Câ<À!q^eˆs¢„G8"® 'hqOàˆ¸PPqQ°@ÄyDCâJD#â<¤`ˆó˜‚‚‡+A‡+aK4\‰+p8\ ,p4\ -X‚áJlcáJpCáJtÁ çá…óø‡Ây€Á +ç…óƒê~/1K(\ 2p$œG8Îà –H83p$œ8nwp؉„kÈ_sh¿ÜJÀ灵^‰%¨mUJ LkȆ`óÆåV:]¢áüåšzþ¥­½/]žç/Ñp Ù0læ_Pn °ÃyÌ@­fQMCNi‘i Ù lµ-C¹Õ.[0œ¿˜×òW÷†ÖßxLg­îNØù„yû’“a­H* Å¬¯4KOîٙQ̺€c`HmEaa!Lm[N±N«aBɲÉÚS¼1š^[¡¡¾]©W? ´µ÷¥Íù$Í}z‹šbu$0‚×+r¯ÁI°ùˆlu⺠z‹H¡RÜØcš™WÄÙ9…¶1§X¯WÅRhä ÁMcr@l{5Š=ê¯çý¼±õ·¶£ú :+ܕ]Rõ%¦¹H³• sӊã¸{ª±3Àa¡˜&WÒ¨xEF(Æ©i¬R¬Wcú… Å-ïV+úgycëý©$dðÔɒúôŽt©ÔÁð.†Ýk\ ²^I +ÁT€[ÑR[Û®ŸÛ¶œb}º6id8kÕ¨!mŸ›N`OúËy½òþÞÔê3šJCOG½Ić”ˆíd˜µ¢ +ijRD®'$QÆfæ 1Š}³+mÅΌMµ1§X¯þ¨‘eµ1¡ˆv>6½ŠÏ…¾^­èŸà­¿õ³ÂÀ,uøüþõ’šKjˆÉŒ– ’Õ Œk*ń‘±d[ôŠ"œ!TӘS¬S·÷(Y†ŽùñjcC§!Sµ×B¹*﫯W+ÚÔ¶VZGðsFȽ'ðí3ú7sIí¶€vâF UAvËgw©ÏØ Ïê®;#V%WT7,3¨;arhvm1ݲ-„i¤ +éFÖNàŒÑ=!-!Þ- ;2]öXñÜ0ÖÒ©\àÜðŽ}·@sÃÞüD»‘¸ÌP±ÜÈ|*œ-”[úӈ†‚äžLGq ÷Üì$-Ž;­æ +ãN³lê*Š›’6˜ÞÄ S²¡Æ ÄÝ+в¯ nb€`±\‚¸:ËËF_#„9Êæý7ó{6Ï 8ñp-‚»RͨŽ„›)7¸lÄӇ=üv‚{ƧBMòŠÙҝ²¡Jh¡Ô•jëڐ¡²k-z»¾V©æ/n í}ß{@Ÿ†Pet°aÝvrnÏÈ¢#?ä6|ü¹nÃà nTpÛÂàå܌¶Í|@d- +>*2µgí̱ØØÈd[¶üÌШB HØÀ°εÆj‡–ÔU€v·Bfw’ ´4W‘=@ÝY㱡½W,ö`oRÖȇeReíbŒŠí/D¤ãÂXAØ£µ²€`‚ƒ„hãëØk`"0¾Kè5Vj犼Fœ—¼ÆŠc4ñx²±Ã]c€hI*°k¦(Žq…ºæ{f26Ð5 ׬V0×9a¹î™jU\×ÅY ×ûËu;€w˜®âºR %ÍdR ¸:3ÙmL©Ï«!ž ›j;•ÐBŸ+Õ Òµ!CQ×þZ´µ¿•ëk[;{_W¿†¾ã +h]©mVuO#¨!­1Ö"ä2²¦B¬å|žÚfœ°XjD—†5mÝ-ÁÕöN…X_ښÙû¶úفñØ Äùõ‚Z Ð؂¸üÓÑÒa´d™ T5ls}njáàƒèåíÂß\©†ƒ.íPÚ;káÔþJ¥’Iidýiõ«‘~‹ÉPêJ5ð3´oaÓýÄ0­D´@L¯6ªW§6ä„Î\©{® 2ºö×"¨ëk•jþ⥡õ÷ÕO‡ +~úxº ÚYö‹æá,€hǘ_uœƧ¡±^MD¡.6l', ̕jPgoÈÀÐÞ] ™ö—*•Ê—”FV_vÌÁÿÀ\â He%$}{Êe))çxNy\!*ábï§T©Ùº™ÞZrÂÛèԂô† +LÒû[À)ë{r}÷ÒÔþGþ4:Í'eý8ú"ãæùW·nÀÁ_—zu­ï󛻫ÿùúGë!v›ç¿¿¾4XüØtô1Þ³ó7/~(]{¯oî¯ÿ|sýy­WoLó6òþ7×oۗ9Zý7×ß=¼)¸¸¿»}xoíoïÞìUpï‰FõèwþýõÍ÷?<<õC÷—·Ggöü™Þít~ûÒvð²§ÿtóçk\õÄ¿©æ1Zq¾aV"ÏtʪrLKÖ¿7=ÜüCo|*]–*~kѯ^ØädÁß´m¦.›ø«ÞùD¹œ'³£Ž¸H ZNî‡N/ïÊåÝã2yNԘmäŽ=û<¨kAÖxv€ òÍn_#_J‚£µ |äAÕoàžØ|.¦áØ rM¨X;•„z ¯–£BVôèÞ É5`z”ã]T3:{D¦ó{'L•ôît³]ÏÁp! L B¦O(ØøXGê¡’£õ1tJÈ!ÍJCý:½i (€"mÍàízþRÏCÎeý69Õç˜Óbæ̊”̳ôç‰y Dš•okÉãÔëƒaœ•9+9µ c£Á°y4¢e¡rx@ §€õ¢…Ç%U6Çq*³‡”ô©ïy [Ô`w|’‡Pù¢ŽßÊ»‹ÈæµFv¯I3Ì¢Zßé"*L]³Ä‰¦•‚‡JL“ÅŸ3NJš‰“J&g5ÏÖkê&¦öuo“~FßلM½ d†`’bA]p!ÕGGjÂ=îÍ͔>1·1•Ùz)!!Òí1·¦ ªq„Õ›†>$µ¡wŒž×8Ð H úr#V Ù`ÿè&‹£ƒ™ÐÑnWVPŸ)è ‡œ54˜fåFÏ!Qï)·é‚´¶4Àb,”¨?rkfÛ<¤Lþ²À†Î*FVË}V¡NQãšGRbð« 2ÌU4p…ÒÄدÀµ!Jê@|î‰ÄâŸ`íÜù“#²Íð~MíÅ wêÈÌ~0òaí!#ê䱅îò&8b; Ôp;ê~°‡94υ)ŸS´uxåˆÔJ‘ã&ýyt·<¼Þ1cÂx“9ËÛÍ£¥ÀwäHfœË2SF ½…1˜ IO3Ó­X˜XÁԎ'©]àd\" 0õ,C#îmë-yS߄‘qÐ@MŠiJÒ,Û!N³:ÌÓ{:F#MäÔ¡ ü0R:gø\àr‚P];° 뻣y%k-D²ôFf Æ ç©ˆLî9fž9k¢;°Iü<ù˜t–Ô`‰r17e`mzoøªÌύ`F1ÅÔh"STtFBh{š•‡ÛçõÚ_JºBiš{Þâ5¹Bëò/ Ì¡ó<ž bóMÀD2™ŸhBà9Ê7BC ´uidcÌ)½ñPF¥-þ\ízT*Á–º’S6 Ö7•5EÀ8´1â†Ò•Í^:Ô«“‡ Ò|‘å ½Â¸\™¨zÅ!œöoô>Ò= ˆÛ‘€‹c+·O)3“|ʳ ±ÙðÎ=%dÙ +ažk¸”šò·FhºQ×öŒ½:•˜‘|QNjå(˜ç,ӓq"ÏêÞËÒlW,LHè7cH˜ÔÎêd‹§§ßžfç1r§(«e•"q2Æ?¸·Ô s,ãV1He?œ¨SP6æâĜmM€©‘€# ­ÓÍ=fML"FywÝl[0‹“ÛêkëmOHe/â”~œ ¬.“^±-012âÞÆQ5}ÖlãÓTïˆú0Xwê–á—Œ_ìI{VFÊ8F…ñážÞ&«ÁÀ‹RÑåé?0Õ&®?в!x»ä8z(úÄÄe¤’_Ð!à«7y +n±^ùµ='L/ã,ÊvZÂ×Ò{‡ÐN•LøTÂUQôÜ-ÕpÏ÷b´DDH)#ìVX»òؔp–Ìú2DÉC<‚m²„ üǀò8‰©Óˆ„z&œtàÑÍϲâ'>ÕûÑ ù9%m‹ÔÄxaĦ©ò‘f°•A÷júÀp!$¿gqCósÖt‘VôŠˆÛ<"£Ú#@c#¯œÍª–/")¨0<{Í õaá#ªy¢av !Ìz­LîdPñ\ç—! ¾°“mÃFIŸ£¦#rU>‡Y +£ž•öyòZr2ƒ¥t˜!fáu´Î+Ó”‹`ƒçÔzº1!*E5½Í¼m ›Év‚¤œy¦Ò¯âÏñí§¹|Π‡ Ñò'DøžA誼žt!³s´MAÖ8®ˆ`JlpȄ1kN¬]ó9Ú±/É©˜JS]¨dr#C!x[#Þí99û0¸Ô'‚¡O‘| y¼%)dã ½šb¯Ü°ÈUº4kb®!荖" hV鞇j§*?F„Ž§+> àÅÄÿÏúNœÔéç›ëu+ð Ps0xŒÖ¦cÄ9gsˆ˜G=Cz­’½efb¸º".ð4‚ö&û›§ WAbÄ1F¶”K*ÜæÐʒ¼.J n{᎟Àɨ0Ïǒ á¦öÞ´4+mª™¿; Aª½˜ÏQ€òü¹k,W€L4^sfä¾!{”ForZìôuaÄÅû’s̚ˆmÀ«Á§t0E䜐‚Œ^ÆN[Fà ‡¨1ÃàHýçx嚃…€ƒÊ Š´Ø0 䒰T–Üò´S53Ÿ±Ö@ÂÀ$hGN²&C€Ýa!C5ÅOP e‰Sâ©lû ìÔlj$ã-&Þ‚¥ŽX9Ûôg[Ð&^y%SsŠ5 x#Çݶ ªñLq+Pq$••9Ìͦ9ôFRÕç)Êe d4£VfÆQ†AÁ¤8|€Ú¶PCQਯ€@–xNä> 9ÐÔþŒˆLŠfp‚þ¡W5L )6 óÜM†™+]µ+šŒ°™r4”%6OCŠ[aƒ.L¢Ç£…¦ïû™a˙ŠQ<«gÈ4fz®µ»ÙC:â?2©X’0ɊBŠûyT˧±Íê4@âmåüxOjq jú˜¨·;5šf]5€Tdº^G¸1©WÀýë¯Æ +…G–Ç '³²rpOÄ癅 «pœ™:Q3­øÚe‹¢VæÚ :+À’^<Ö3ˆ ·CÍõ1Jf¾‚&|ã  Å\‚Eß3G=ù†±h,e*=f}AÔbÒÄF F,ð•«*òÓDsjЫ—8u#¼-"ic.«©„’峁¹“1Q0I•3LGK€Â„¾X¿HnÊ¡Äñ8a©'¶ì9Ès0¸¨NŒ ™°EªŸ(yªCú骻y¾,Õ!4òh”Y󌌾MØÇ<–„$vqEœéôÈV;%3õótÐO Y%{œôÔWFz?5š–3¤Í»Yƒ)ؖv +Ã+ +ø ‹Ãúiìõ¢¾ôä£ ÒÅtôÖbäØbvÓDMʘ;4§¦Ó¡× ¾äú¨G3³¾/â/é¢âR)¯Ú£ÀôÏ&›$Íî2Làь©óìêŸ!ÖÔ°Á6#³£¦x éc¼‘{74<76V„7ê½(8FF›Ê +¥a êcffØ^5D{]ÌèijÉQ^D¾$ΊÛ×Ul[)58}®4¹ +ØXHú¨ð? Ÿ¤š”Ùo´§úF堎 æKMÂ-CP×EV3ÁˆÜËúÞ÷4CÎþÙc½[7…³~R¯ËU±¹)›ì*‚:¥h!ÄÕÅ ô–‚‡–Pr̝’iUcÅ!ªÏ9©…«d…»9.:ÐP­ÅÈG†BÏćᾃIÃya_°³ %ËmË+3™c ¦?ºî! 2b·ÌÙm›cç˜QG£ öf,‡±g5®W¥6Ý1qB“zÓdöÙb^g“µxܧhö¹~ö# n™’>Õ²„á‰I'š¾±Û³%3Ÿ *è§bÀŽº –N(Áb`†©Ž6]šÖª/p0ó¤€ÕÌwf¾bû9¼9~öÝ1P1‘U£ڙs¹´8ªÌǦºzàƒ€=vŽ–B¤×<°³1ìé8ê®ajYý:$ïÓê:5;a]SižyeçÌà\š„•s¶ÿ ¬a ö½ûN8ÇgÓÛH€UéRID*Lð¦A›dCvÓn˜F¦á„¾ÙW ScrçN?«e6§ CD’lÕ“b²Á¾EâF¥šÆ /I#ŸÇ¸(ü™»Ï¶?®om‹¼áÀI†ïŒÉpw%c¿ýÊ4d%†ä„Æ0Hm§V58ÍFM’0ρ5û÷ÀÛ;#‘6Ð%ÀF‡™W½ÑÀ#œH4•ÞæŽéøvFÝp(|VÔíÈÂ=¡õ“@FÆU4 v¼¤ ÂvžÎù²øýš§òhW#¥4ߤP;ƒdŌR~$ÃvA€Æj¬CˆW¸ìhfЕˆ"ù¤ÜîIÑXƒId Jí™ ÊŽR¤ì€íT ¼¹  žvD‘xll‡Û`TaŽÝÁªQ|Qö~=p͉‰ØàŸèx¡Å|Ü€ßæ L>Ê:BÈÌ\zP 9OÙä%¨7}t“ ¨€|á“Aî­.ÑSFOA +øúY­êõ)L3ü¸Gëšö8™¾Qaš™cœÕçK§R‚º{‡ÑÚÄ Ô­J[0S+L§J{eV +Pj¯0ƒðõ¨Öa·E¨ ЬìÂÉ>iµ4ñ/êšÇ§RéÑ ÎúdŠr¶tQ4ˆAÈαá^ç}W}ÐtªXcsÇ,£zõζ ÉI§¹… GÚÜ@&£¡éR'+E„àLJòµ@LB¯õè˜#…—3Bò‡ïl_hôðô±èË%YÓKâHØÁ 0íi4ñ·}ã̞&›5֌¸'aw0é)çïu—ðVD{Žga +õ¹R +¨½4314¯jjgž²©Ñt˜ª¬>1¨w’K +· 3Õü€ð½^ß]d3óÒ.J&mÁ*ÀŠÜÀ¨… bט W«!Édê¨ØÁÛFóRøwn§Cì<¹È(«†f:ފ=¨•?—u" ä` ©0 j”³Zôì!û?Z­ðäܓó“¸SÍÞ©w+ª]Ètö£‰CAE˜R‡™Šh:žh?C+ô±(´^±@ˆà1-ŠåhбŸmƒêµ¤"ùŠÕ»åÜ1ç:ðJíwDYd®L¸(à“ç6çêgà Z4Çý/ wšè;ë㮩®} raê¬y5N*‚“‘YcÖÇCvÆm°ð̺֘:4Œ¨„ø¤¬ŠÊhŽµ$3`,ÖðšPŒ³^'9âdš'ùå= à{ F6é8²:Ùw‚j¾ÆYý¿ƒ¹1Ó¬Ž=žU½¾&³Õã±ÎgþÄn¤7Hoº`Æ™È ÊiêͶY!`aoïÊr±*nªÝuj{ +ƒ"Ë@ Ä‰Qq‰=‰ôäó1ø®˜ +"i´'M` ÌÍc<Öa^×ô9"˜šM„qÍ6Nà ¢Ç +œªà"ϼ›JýMZÎ8ô\÷þރ³Œ^)ZšL͂DÅEˆÏ±É˜Ic:\¬aRo7E$Ük ¨¦YNXíõúÉzdͤÚTɑ slŠT-­?ó"öÜC#?‡Ž¦Î¹AW0:Ê¯ñDw¢Âò&Ãaå¹ ®”`Œ`´4©¥"£ À!)Y̚üŠ*U +Ó¡;¨~ÁŸåp@îð¸žQµÇâ£1Rlš˜S®W¼÷è&ÊQm§ãÂB9ªi£a´aëc`$#ÙÀ )BBnŒŒ ÊZ'„¬gžÂ¸¡Í’9ü[8xU3ÖÏ3QrElI\´e¨ +½¥F’-Ù;vö¶„{MÏH• ŸF"O}ÜZ];£Lœ‡ÖƄþ}Ù Pv38£¦E†R;bXõ.Z:"c +¬@ë`§nëúAq†îdüP$!y–7nÃN-êö–3áÈQ~ô­Ì«Âp_#;ù×I=JÀRäâí2ÌU±@Ø)‘1°^ñgõÛèq‡hnŽò¬þ3`Y±d‡IÁ”Ld +ÿãK¨àGb˜žÄ¤á>?: ó¨2 ¹M•iéSS³ŒÌr§ÀVxZiŒ,L.¡Î€f⸽lp5pCð¿M.zá9ˆ Õ×Ó!Q¢F QFÉ,‡Øš]lƒÖÖÄÃ?™Yۜ'^2¹ì?»• àÄ:ÕqèGÆt@ ½ž÷ˆ¥D)NcÚÀs§¨4auŠF¦l"/:Ýoúm¼/»9ªÀ¸Ý' ü§(»Þ¯ü"  vô%ÂmÇ2£>‡ +øü1@͖¼é ¦`N9 tùéblLŠÃŠAÁmD»AÈaÚrì£#&¸ßíó²â% ÞP—(Ð@d;  $1bopeƒæəzƒXƒ0+AQ9SPÔÔ«¬kϵ\#]=¯H#61΋çȶØrÅmNÊDÙä>R-H’Á()©‰&Ûe‚ýÅrà”ÔÒ9uz†`‚©œÞ]'5 Mõ?ÎŒ3…)ˆòl'·~o¼&xç¤ê?~¦zà€O’"³»zŸXgÊ~g·¦¬Bx^FûBœÕÐa¢¦92&³`êe†96ˆ±$¼yFE˜‹ÊbÀ\èÁà ^è<‹ÀApsx(r;ŒŠ:Úɝ'«boS½êéò ÄFÿ@ñ+À|UTj°àíÇçǜ(™"×!ÑêÅí602X`qnÜåuù+;SOòŒt·ÀY0Ü;ºh3¨ûs2ô¤§Ã”‹Äˆý¦3ëDé•ÔÔ*‰…ƒû^H8`ÊÕ¢ámM’£÷³ÁÚÄËoÕçG³°|Kfv®?q¨M—ræ²ÐmVwOèPe}ï e‚Êæ!ÊßÑ {bbµ× +7ûŗ÷2÷¿Ü<ÿÃÃýÍí÷›_l·§WWï^ÿþîá•×qfå’ˆ£YTi2x]ȊSè»"k%Ë0Ñ@›2„Þ³Ô5ð"šàF»V R&ëƒHZR: û¡ƒ­ú õÒ'f½ïëýyLN9Dª…b"Ǥx˜Z&šÁÒ±¨Þe~°IC¿vå9Õ99FBÍ«/ϼ%¦W¤ ݁ap­7 Æ°SMÁ]*fÌÞâ«';=XA&؇Æü¤ Òkˆ +(äX®ïiWV÷§T(a@ö3Póà0.óʳ"ÀáÊ$Ú¹h“I;w\wÖKÏgR-ÙÊAèmn‰ÕÁsãësôÇ3«â¨Ï] 0–$$þÌÓؾ.h‚„ÕþŔӰ¢¤bÛóßÅaV1&EeÆ˘ÎDm‚¼Î4€/7ÇPàÄ˃ª‹Ü¢€ë¥ìÞ©üì£Ò‹] ϞÔË8Y»Ë”n3žu;ׁ'Dw& ƒâ×4<>™c¶c.È7«?7ÉɸaÖ ¬cêE3-á*2e:SךÔiÒ‰Ù¿„ˆˆ4Tã\Òÿ¡<B½kkŒ¬ÀÙÇ»1Ê)!@×c;@÷Nv’Ûcà‘cÕ^ˆcB˜‘W\Ád% ÃêA̾.+"€ô¬¬‘s@«›KÍ4O óT+᱗N¤ õ%CjéáÚigàô#ûÑ@M5îíÜÅõ£ + ­óOþÊp.{24CMZ®?ÊÌ +:ÔKӐˆBXÃy@‚ nÙ ”Ïeá9Èp2MÞ_V,uÑèÁ4#™ðiñ!]3Bþ®žèñV +i›* ^ëÚ,@¼¦ó<ê‚ÕîÆ`ݍ +!ó­Få5$À‰9¢b€@ŌCã!b‰Õ0 +%µ%Z` ÊÍäs©X{flŨw§nxõÙÏ"?R®·§Œh–C| M&¸[DïëéÍãÞ7¡4sÅA#e´Zˆ +žH† ®„Y16öœQsTÿÀ@Ÿ„4Oô¶.K¸>f¿Ä˜¸~äñê (†\ª°ðC\d8” !‡=Ò÷<œë€pýM=#óh²£ÿ.©¤W#e¸æ³N@dYtJNÇ ;ö0g•sa«ÃtßnÙ\}IW X°ÿfÚÍweª5„¿cT1¾³ ƒ>¥;‡ rVo»¸oÈê™çg a~`<¥J̟’ý‚Ç<Æ| "•øt¢âg8@á¨'3g<•¶3Ömƒ±†£1¥X}ð W&€bԀ©YSŽTÕs­HÆnTØÄ8ʨ¸Ì~6^ïˆ[x`‡,a¼ ¨ kts¦>q„é`xCV$7¯!©",SG³‚IÁÄÐKÞÓZŒxNå­?Äó¤þîAÁˆYW )üΐվFJöSï1²ÎÍzM6‘ö”spÜ蝈±×ÓÞ¡%F„?œÐBbîwå”ÐüɄÆ`*kÀŸ¬gª·Möz †Ù"²' W( „3ÃØ ‚Ëü´¡Cã 8§ý:Š ÁüŒ”ÇA +b˜lò̍I6Ðk2î¼haÿÀ)ÆiiÆ'¬Ä¬ n^# 9Z¬?Fä9¨~41wCTÄq-½†=•4\%šÑH~” >£e°–<ŦnЀËQ£nX Ǎ·¼çΌ½1µf~øtà8ÂK‘Ó!€ÀÐ.àÛÁÍj ŽZK㢃Éà1ÕîÈ̐£p˜<’8h¨ýX.K ù ñ¼¡Ê‚å¦ÐÇ ³YdžŠz snŽ4TF0û“?ÇöD’@hY*Ñ°&:üÜtg·‡‡bv¤Ù…“YÚæzÎ +.5 '¨™`„°@bÔÃ;”Øމ‘ @:¹E†B æðç2ˆW½AÜHàúîU¤ñçhf@dâha!|ˆô£þLP@°@pz]ÐJT†Q,Ó áeÅçâsÎ0)k¼&Ù7£‰FÃ÷v„ç·Ç`. +81´3ٕJH`؆yª!Ñ£5f»¾· cA3‡ø×é]5³¾n_®x +º†Áê£rL,}“ß&]æ`fš Z¦rbb+ÄU:OÔhs0›s1›×7Œ+¢Š¾éšuin%*ØO³¾e§öÝl™½f…õ@°nCŒ¸ÄeQ„ad:d›ºµÈþh`Ò +§!ÙréÉRââu¬“zQyb¥X²ƒuŸšËÁŽ€N¿æAF2Á¼ézÕßÉÄ8à˜b+5‰À¸ƒ@µô´#£õXtèÅF=BëÔá÷î,,¼ ×ÛèDð#cèëœ4ß?š7]‚›N%Œ +VXsñ‘`Ž¿Î]ÎZmN6,M[ï êÕôçþBŠåÅo€ZXÔ°üÁ%ÔÐìí¡ + ³¡Q³…bþÿì½[¯.IržwO`þú” 4T•••Yy)mÓ°ìM’%Á0tOKƒÝ##üïý½‡ˆÌüÖnñ =€.x3Ó+vU}ǔŒxã ¦1ŽÅf4`¤ÁqR^–.ÝkM¶—ĝîÎ0´Œé¦?ô|r+ì$¥„x§ÃðÔm7[‰ÍÇÿxŽ‡@ƒ=Áž[Wìç=úîr³qH&‡ò"֋§áX$fi}‚ºŒ°+^À'êÝÀ +‚ûñ”5Cü8Nð˜ÜA<¬Ç­ái€Ï÷ì~ìåR–\©Cqåf*‡Çïõs¼_—RVèøXôO€Á›t AsôÔ{ à)\Áä!’QÎÆ}ETŒ>!­øñ¬8Z -íº_,üÍ"»ä×:\&«•–¼FüM8äpŽ31UvXdbk6ÀܸòA¼óâðçË`Lª +ñfJk€¼  ä˜Â‹Ì9áIygÖü‹§F¿Çó>÷«Õã²` Çø¸¤<÷㭆3+ép:8ë2‹ê1¡—ÖÀ”¦âÊ*ÿ30©¼¿ +zXýà 4¢ f-ŽF,Î`pCE¬Ÿn‹Ø[§ÆV1ÍI1Ôò᣶hŒ™„óûÊ>õøƒëÖåF©¢ӕ¬ö³ô-´“Mo–°Œ –9L„Á—x:ž¢Bw~Ç­RT¹;OÐ*Ã⁢{’"gs¹SQ¥|鱺 +B¨gΆ=¤zp%ÞcZe™1&Ìn= ‰%S-þXq܈tޏJàXÕKw©»^’ÛLAŠÜÎæÇÁÕµ0ŠÅeåñ÷¹VL„­¨‰A7' É]^Õ× 0QZËTËP'‚/ˆ †Lú ›*舟ögQq¤àèr޴̪”.¡DcÍÆãw×óK•2¨'‚vTÃM8äAÛqÏÅèáêƒÃC#Tê| +¨{ålýø:Ž­Rà”PÃVZøi3¶Š Q•ù†>õ/Ä#‰ ò¨”z ‡×ud5\&¡P£æ=r8Îåþ£j‡7¤"óìÂd~úâì2¡DˆùÛA™a¡Ñ»Ûôå›;fÿã/r¶ÿ1Gûï†þ|ü$êØTH·ñõBüãÒTEøc•IT\éÇ×P‚3àÇh}Ë#›} Ÿª•}Œuùs=I>ÆÒń>Æ 랍{ 2‘‡ÆãoœmPñ7 +»6ê1w’KÀ°ŽÜqÜ¥voÄcH+!^à1b¹ˆw|C`†ÏwÁCû}Ö+iǨ=¤¡ ¥Z·µÃŽW+1¾èÚ +Mt¢ŽëeÄîF:®bÒ1˜ütIt\‹ßIÇÌô 8Ë@–‚8IŽoÏ´èrPa…Ì9f¾ž“sŒ0F„sŒH*“rÌfNOcªÊóÆ8†€(“@ß…&à˜·7¼1cLº1Sž{o Þv¶1º'‘ãa´1d›ӈFca'æÄJ6Mk‚›ùßÉ5n*™Û©ÆX+\÷dw¸UíI¤1¦éã|s6¿Çä³\í<çÚºû³ØÆ=ø!â£8®{âŒa@ÉÈN3†G¬¬aÆh tu²Œ{UìiCý>ÄȖ³¿<“k$È™dê7Ž1*J»ú?0šôú{ ~/(Æøûì;Ãû°ð[cµ&ÃÙBÅ0~š2¢Á/ÆGšÛÀãÜñ…lôbÉpµ/f‰0>€sF'ƒkžTë #;>(#ጼ™fœð*ÞN#»Ú}ÔóNv1ÿ¦òòÙ``MR–`ãö°ìb´ŸBÆ{Eã²/!b)ՇýÚ(ÈŜÄQe³‘‹e}j†a8 !i ,;4æmèb¾7\L2Óe§v¶²s‹±’@©v`‹º jÉZ%@+³A‹Ê¿“X̵Ó˗ `ñx,óZyÅ0âÛ +\ñð,´bœ²ÂŠ¡À¬b|‡ŽË¤8¤}Ôã.¤âqéS P1ß!|Éâc2…‹¼aŠA‰ÅZ,(Å÷Ñ7(Å·ñ'¤ø¶Z1 ŀ;à‡ƒQ ¶´v¢øvT-Å(yÆ/¡¢‰Nd!2#ÀŸ˜êùëI<1¼ +øù+˜˜®óI8qS~2ÐĈ°#­±¡‰YbÜJ‰!BýuèÔ« >6.1òµ —¹®Zê2ˆlÏN%F ŠpÌ +\„¦ÇÌ$&þîâ]ÏhN ƒHÌÌ +ô•×*ñÆ#¾’=ŒªvÝ-eªݽƒ‡ÁPÅûeÎðÍ®ÁË_ømÐa@¦1Ks»Ò’‘üÍRՕ8Œä?ÈæW‹ªóÏ7ŒbAÌWA~­¼Hý +Ø0úv^*:¬aäÜá$j ãæNf—†b6Ð0¼8›ÁÆÃĉ1Ãøw<Œ2| ðŒa$ìà¸bø®òl„aù‘yœÂßHl_£JÝáÂðÐÈg5[ZB|˜\’,Œü'a…!­„”3¸ÂÕ})6¬0uGMª04ƈrxºØ—òܙ€XBÈHa.p¶& +ƒʏ{ +C5wՒ@a?ï;yÂø›³ÝŠ.CxŸ  …ƒ%Œ}®{' £ç%Þmƒ„‘ĆkáË× #ŒÜ]›/qS éÀí坣éÊnFAÙvPÏ §ØáƒoÂ5Þ¯·—°„›fâÄCPë=ø‡/áÁ® Mvð¡lêŽ6Ñ.ÉÁ¸Eurƒ5˜Rk †zóR/KÕäU.6d0À¿˜7’Œ„Hm<ÄiÚyÁÖ~.E@5YÁÅ:ÂmâEN5PÁÜè*“Œ@·~wwQÉ n"H&&8þÞ(Áa HðPlÀø_ðWé+-ˆàbÇ&6ñÚ!Áù÷ÊcàQá„ã&دÜÌc×d5‡&ÐÀ—Óúz§ò2•P>¸¨%ÑÀEn׳£ñ½Šem6ðwøYÑk >X@|^;尔¹~ØÕ ÌÀô}ïd` %!Æ7øõÞplL.0×ã×-3©Àæµ$£+·”ŽKPÒ¹¥ °ã`àã +,RÙ9™À‡}Fðæzv"0bԈYš¬hÌÆhÂ׆ƄƒedЀAa`¡TÔ! u]; ¸¸‡—QÀ¬ø&Ú@*ü Ïuã@×ݓŒd·¸L Þ +­`8n ž·ZznÑ!”Dpgc‡1À;DŸ‰æ]!¸d‘ÂC…×&ÀP*`p þ/þÀҕÿ{9ÂøßË5îAÿEþŸ +ª¥¨ndCÌþ@€¤Y£¦¿·’áŸ` +ð/F<ÔwÓ÷F$;¯à_:û×42`ãï ü›FƒoLu$÷÷Ý͝~0âÑŸ­Ø_5:égrOê‡Ì¥çú z‰Ñ¹Hðï í…FþÅvòø½Ô8ßîà_šO3Þ%$FÙ#Ù¯þ=Yy—7ð/DÔ_ï‰%Z“ûKËs>oÜ_°Ü„÷šû+l«©iJÐPéQÚ÷—(øëÉýŞyÁý%ʶŸ×÷—f¶ÿ +î/þãémbù­¶7ì¯h¿×5±¿¼ÀçûË:ýO“VP£{ՉýeŒ/I`ù€È£Û°¿ÈT‰5lì/îÕÁ~́ýÕ+5džýe†®´Iý%f‹ þ²}À`¢s¥þâž›mMýÅ)Dþõ—îc§þž%°‚Aý¥J«¸5¶2XÔmòFýå®,ª&ƒ¯Pa9ŸÐ%õ—´\ÐÐ_„Egê/ã‹í~ƒþ2Q§ïÊÔ_†„¢6õw¼þŸ q6ê/0םÌ_ð'ËÙ'òÝÉx¢ñV¦ÊøËÍÚ=y¿8Ð;ìw¸AG²~ôR‰q¿¸N9;îw Aû§ Š ûENBe%+ë±Èê0¦Üên&é—r¿~¬9'å÷±Ë”_fMúxcü¢~ýnçDü26§pc‰>R½¼!~yÕå8'㗏d6‘»ùÜ¿C5™ü"Æ|ƒ¿øàœ•ï ªhï‹#Ð 2ݗTD”W¸ïI5ÀÑî«À¼SjiصNÜé¾ԚÛ8ª©9OKº/ïôîË>‚JA÷¥1X/§hÀ +y£û*ÿS{Ò}•  ˜ou +ôٍî‹Óf7ˆ û²Ê…¤A÷Å¥<ÒM¸/»Sä)UŒÂ|v¦ûò¾°`pÅûÒ +Ãx_fíì¼/ L]lx_Xƒ +ÜTëÞE— ¼/ Ì>¬x_*7ûÝïËî. ‚ï‹Ñ뫝ï+-'H¿r3–„šï{'K6À/¬\sàW’OmÖ5J£IËÆ÷…‘ÞFð}i@ˆ0ø¾4`A¿~1’‹]lÀ¯ú0èK0 ÚÆc Ú¿°²r8¿'٭ו€_0ön„_YŸ‘„_ˆÕ—&üÂ@úþFøe ,Xƒð«²Ô´‹ðËÞ°EÒÀIøU3µ»&á}ˆ8¥á÷$#STÞIø¥Ð{ô3¿g5tو_þÍ÷{EüÒZK~¥/Ê#6_ü¿~%?•î ’„m† +#Iø•öûxvÂ/ý¿»hè“XMèîãu¤»íŒ_˜ÏËD_2~añôeÆ/-‘ß3ûOñËcET‹, †™ÀÛ¿¸P9cøådM"¿ð€X¹!~©Íâ,mM°ÂQ[~q3:7l„_ˆô.6áïØÝ®{~ÏÛK¬ðË"!º‚Aøeï5%ŠMø¥ó®– á÷Œ4|~iéÖÇÈôÙí_–gñ=o„_q%Î; ¿x_¯^ƒ§í„_ZñáG—¿$üÂÀ‰k#ü2ÿ±"‚ÎaÜ|~ehu'üâ÷ÈÛ Â/¿’ãJÀ/&£·ïËLßÝ[ò}™&=τ÷b„z€ˆ_ wÎsÒÂ ƒÏqí|_ƒxmà è¾ÃÉ\á¾ìJ¨02CyHa4ò6ø£ÅFöm= +d:vÃyÍìEgaf6®/!¹Ï„Žì‹ç=ãïë›6c}OÏÁëÃËۍêÛoE©s#“¦ƒé¯Hß´™èû:ÿ5‹‰¾Ï¡þ£ Ï÷ñ<ßçÐÐ8_ü›ºÑ|±—ç¦ù>ÖºÌ÷9ô&o,ßîGòíÉd6/©®õJŽ/ÿð,Ä»‘vØ(¾0⽈/þÆK _Å ù]¾ýprÔßîÖ4AðeX¼œ;À™=œ{ð{ñ ¢„<ø½=?¬ø^`¹š@› + cT[Â{[‘0~e÷Ò&Ê1³Ù؇4H“{ASºÕÛ.¥˜àŽ]íNn/ò«Èˆ Û æ°Kµ—šGÔóڋŒ±ÚŠÙÛ½´Ü½ì}Ë +\{›×IìÅy€z¿ñzy2`š×Û¼j Z/lA­°^V»áå4«—5qP*Õ;²z³{©A½ÑQüȯۜ^Ð=ষèÝø](ì1òn^ˆÑ¸Ð‰^Aè%Q ɶÐ+Êá>/þl¬MŸ÷±²bÃóÂ8Dã%žê~ÄïƒÎ Ü0†Õ ΋º‰ƒW#6/V¯lÜáêéø{%ó¦Í`^ÐrA5)‰ç‚eÃò³v‚Ê‹ešÓZAJWú+•VµPLŒB”ûI*/W+œþW*/‘SlÔ~ÈêSy¹éþ+•“CÅAå…GZÄqdY%VÑxø“Ë.xÅÁäå9ÚJõÑð/StgÁ|Œ[w€Ý 5 )Šúµ3yåa”'™¼0p¸ &/ lv°2yé¦ñäÍä%ˆt0y?9*_҇ùc2y¬CQÄÆ䥕YD3yÂ+=¼ ̱teò2îÙL0yÉÍàáÅäUïƆäÅ¥sõHÞ\aF-+"l¤ lH^5Ɣ§C$/ 8íšáæ°fÝ¢‡f’Wñ;‹Ú~6‘—,¼ŸAäeŒk· ò2H‚¹d#ò¦ki"/_H‹D OŒÄÙJä]­Å½1€"/)¼6"/UöUÀWá;HE>{y…)c'òRùHíÂ9•ß 4‘’ §È‹¬Nɋ2+²®UÿË~S;Žʪ¦ï‘®7|ZŒãe”ªªtrÂxQiOIoŠiƒÆK;Z­5@4’¥'‰"s¾âZ͍—!Á›ðI×Oa‰`›q¼ fçÎãE´‡Õ“Æñ‘5ˆ ’h„µ#JãO/J¨êDñv$eú™(^ÀöŸkñÂv=#]?«Íê“ÞîïbÃðBe‡üƒ)¼ø}  •&êÁÛݶ'¼ Ôr'‘ÄF6ow°5ø» .æq&·9¶·áwy"¦ÄøÝæ aÐwI…ê;{—Mb zz·1ªÜÝæLã†ÝmæEÑ/” ôÔ]œú¥áºËþÕHڙ¹ËõóIänµÔk#îR0zwÑB¡§àí$z—7Þ.V£øÄ·‹5RmÉß`»PÁ ¼¬]¨³ +Ô.аuçì¢@ÑíÀìÞ¨/MÆ.´8Xqoˆ]» Â.4<ˆÛ(sòfáý]• ¼î­ž£Ë>¯v¶.Jé)S7¤9$d]TÕP²½‚uíÀW÷vsàÀê¢"K⍪ #¾¢ êޞtª‹3¹ çË2ïˆê©‹g7a> ˜ +—ÚçL®—kku±BÂ{<]TÕÁµátÇé„ÅÝ™¦ É2ùz+LF »ÁÒeMѨ‰Ò…Á¾•¤K±ö}'Hw8„]ü?”]& ¶º‚þšÂÑE­`WEõ‹õšÝa˜b@t‡ãÈCY ½&Ë>Ŝ-®èY¥ì ]Z5±´„hÓs$C—¡t¸·D—­Òk ˆ.æ}†ý¢Kâ|+Dw¬EAÆėS]- رQtáêÄË¡Œ—+&šžËˆasiÝdà2nغ |.Ud„bàÏ;r^Lx®Šƒžò‘ô\ZØÃw£çr–™žË Çtcznþ½ÑsNF>蹪gî#é¹Lª±´b¥ç2Ïց=$x‡D«AÏ¥»Œ'´ÑséhA›ô\$X‡ãÃÂʍžË³º®„ç²Ø!€ç²n£ìÏ¥•_»á¹4p´1<—# +'6x.ýCœ{Àsa(øJž ö=—ËÓK€fPa`=ø\rTŸËå*î]àsñ–³f!ð¹Ê|–±ãs ê@/®Àç* žÉÏE’€ÃÍÆÏ%-¥J°£±ØCÄm‚Ÿ«ä‚F³ÉÏ¥èÕ^ÁÏ¥á/Wí±oá{W|.|ºçÆçÈEãs±oӆυ>ƒÍíŸË< cÎ#@?Cᐠ  ¢3鹜 ̋ÐE†/ËЅµ’2J€.øKt ‚ ‹”CPA—8¬]ƒ  ݼ è҅ëFÐ%©*\ÍÙQ¤äçr/–ý¬üÜó¶oü\”sQü\õƒßè¹Ì¦ò‡©dä9W9ꟄƐïoô\Xõc¦çž„]#é¹4 ³Ñsa­xàAÏåf¼¦çòȧðГž‹ä$Ǻ çâùRXøÜ4lüÜi5@‡g|#ȸ'UÔåÚºHêÒSË͊@Н† ›Ö螥ÁM2@7_Ì ¡Ëìì˜]\#]¦×ŠJ¿¦pV,킡ËäÖ5ÁÐe† æ¡Ë×kZ2tY̍”ºüW¬D7ˆ.ñbp¥¢Ëd¡º¯Æ¡!|… D—¨Æ㔢¤ëSQ;ó€èòãrž{í$RéE¢‹?ҋх¡;°4K•ae¦ (º4¸- ^4:P]>ž¢T®)ºÌ3m](ïX1¸StñÀ% Š.‰]dIÑ¥ ³òFÑ¥¶‹ãÀèÂýSb70ºx ÙlÇèÂL¸sbtiÁ£IŒ.-Ôæm]±>ƪòEƒüu¼Ñ……1±£Kߔ)Zct ë·²Y ’CØjÅè¦11ºœ®†»ÛêI↱ùà†Ñ…Y¯—1º00|]n"ÙɊѥ™*0ºâ°uƒuE·@éc§èRH©@Pt¡\áø‘]Š[³OŒ.ÃììŒ.º±ðqùðÊWŒ.W>Ç4‹¢›†¡;­Æ¡MItÒå{øÉ7ÿ#¬X£EŽÇBÐUqþ™]8û\­?·i´Ùñ¹M±Œ¤ç6©ÉžûÈ/ØÙ¹/c)WÐG%ÑIÎ}¢]å +Î}ÈE^ö鬺 +j®µ¬;5÷q:ÄÔ\4SíÅý¤ŠS+3säwÍÌEx Ñ΀Ñ ¾6b.Œð˜‹Xàñ$.õ˜­7Z.ôèJK –‹¿•‘,£Îlcå’:ŒN{FåBq×'ÏÎMÊ7R.ó1ð¨ES‚šœÅô.z-pð#[8¹ÐZ¥Áöü’{56\_ ¹ð7ü @.{òWòqD˜{Çã^ÖK$òw„q³&„v8.¬˜±‚{¹yA²q¯Kª¬{ êd ÆE’QõxcgŒ‹[‡…5¦â2Ô6®„â"À5òÊÄEÜ£N".ªn4?KIÓ,Ûx¸0R0e.v¢Ú4\ÅRÆý-Ö +îíƄÂ½c"ZH¸ÐË0zo.$ˆ%>Î ƒ‹°+sm¦àBg0&5²X3o\äéKM.þ‰#ø·ØoáÆ¿…L§¸Í‹6ѯ³õ ßBUV„‡ð[\$ŠQ‚}‹›ÀïÈÑP+Oõ%œ‹]Dø„²d²€éôú$÷¶y°ao›[6õ6j«zÛ Sؘ·ìjqÕDÞf¬‰·—«º7â-”ˆE,LI!иé®Á»E܃% ãI»½ÝZ*`··%˜ëFÄ,u ^¼µ Ýâ—N“oÓ9¯.+Î-|.ø5¹EEX}ƒÜRm…·à à;2âwï×F¸…‘]S ¸!aûàÛ^N¼l|ÛÖÞ#d¼-þDa£Ûâ–ÀY ¸íÕ¬“0´å2æ`CÛ¢Šõp*+¹¬*°-j¬ð)n\[? `ߣŒBAµEÒ´õi[ì Ó#¸H[ü,ôF´-U‹¿ÚV¿@âÙÞ€Þp¶È°¸¤Ì4ö“"܀ÙRÇðÜ;ËöF#²£fÕæNx‘A²Eä чd;XvNmUÈ-9¶]½vŒí­ðzRlOÏ©†Ø>ÒKo [Õ œ‰°}ø6O‚íCRÆÀì Âïͯ}T²`zí#ÍлV²ŸD×v‹uL®-®ÚɵM¼‘×Z›ÜZŠ˜ß±µ gÔI­Õ̒ÌZd\ÏöƬEÌ{,ÈZ¼·lab-õ>×°ö’—¼ÚâÙ;pµ¬…¾ëN«…¤õdÕbíAþ"wè,8Ãx‚9 ¤-²œÅßE!êIœ¥ñ¼8;°(2^«GTíÀsÛp³cv•céa¾­l–u/ç½³fh*J=GYŸ +Iƒ4ûx5¸ƒfÑ´3;bÑ”YV¦¹—ÎÔ"“&ÌW3fqN¬œ Ä,jqnÃi'b1HNj…÷KU˜ÇXù²O$7—}œì ˜l|ò\’N…—}NÝÁDÆöj2܆–_…ÔÁ°"å3&W–jé>Þ°² 0ìTY¢G\ŽLœC?fÕn +™û1 w½;áO¢ìË JÖ (ÛcN l;¢ÒÔËiX‘²Ó(¦l3'‘¦Xvr¡½e)¶áf^L Ü& {tDª+Äv¢,”öª«6P–ò|Ç qk±†‰`3•‰4Óyù`<úpD£KªSô;Kö¶À!Q²È±¡€8H²”-12d‘ØÄê'@²\Xy+ÕVésª?P0uù°6¹ ±#‹e‹br+E¶bÉ~–yÇaP]¹²ÕòÄ !‹.‰:s'#óÙwwæË7w˜þ‰ û#Ȳ[s€uáÅü”f +ˆ!lÊõIMËPÒ°(ºj!˜³\Ñ|œ£'xw"gòÉëS·–(‡£aâ@?ì4®2ØÛñ´Kž:ÏÅ\9:É­²(©ƒ@ ;#ÁrË®›ž®³€ÁmL°æ…dÿVLÄÀŸlʀU›¥R΀àC’)EÅ#†>ƒÝŠS.¶W©ÈO‘HÀj/õ>vÀ²©Rý³À‹í‘°A[ë‹#h3¨ ­¯IŒe&._SÊŗú8AèZ\Eh5e¹à= ÿM9-‹lç~‚Ä`ÁIT+Ž…,\)ñ'ٟ–urê)vé'YHŇÎn]‡›‹qQUº÷ÌL]T°q<»ZBû+ÐM“ö©Šqñ…Žj}ŒGEg :…JüMuGÓǵu¸|àÎst÷.ÇÝU7³Ž.«ó{ o–3ÏÞ"»rF +…•ð$+ÀR=¹3™ ø|¹Pǃ÷o òò¸øn\l ùMŸh ¹h\ÇÑÔæY”<³Åõ`çn7ÃÇÃ:>ŵ I"Rú0z‘–Þµ!ãÍ0 ^XX2›WšŸ`¦OQ‚@ …¥ÉøiÉòy”ð ø³$dÒrêÂ{\»™†¬Hª‡ØóÀ½’Ø·“čq‹\‹÷Bò®¾Þ`šYè9Þ¾@­aÎ^€kqmŽs°í:µó]/n¨Žø Œ´0„$aïiá'b”ô3N=#ÄâÑ'C- 0TøR/5dû ˆì°§6|Ìèããe§ ¬ˆ2ØD3BP'N§ 3í ™†þ&Cžy‹Ž!Ê×Ih²÷S…qì‡*q†“|äâ±°€‹_tvÁ¹Bò|²¼Yœg(¿à«<ý“X0¦Ç8ݐÑ8>k¼&X¶×ÌÂÌN‡½hµD çBhÞ ¶à‰ñ`½H­•»²ª’ffo ±¥š£;ÝË£ÞE”ïZ„bc+ ¶¥Ãò‰]€f37"h9•EõXVDÀû¦"Ë~T©aôW’ønë(3“Y³ãO&Òh ž£Ü –+gnÔzè.3^ì&‚4Äµ§—¡ ‹óLŽØ¼ŸtµáÂDOB¶èÁ1G©ðޒà©Ñu$Õ`ȕ‰Pä¦G¯E 4Â|Šðžñ»_®Çdfq«nTœkྻËÕìg ásºCÇ0H< ÒUlÈRªnµDz(êÁÁ,ì#Ÿ@L€¢(ð–‰ páÁ ²1W­uXË*ùí+`“¹“ѳ¸R#è%rÜL| ¾2®´¥3I¹éãšñÒ뻬ʧ¡…’R±h/»9¬3êjÅ2T$ìÒÜ¢ëo‹Œ'Ì£´Àa!ˆ +ƒ¼]ôWOFè˜ €…•r ƒÐ_ƒ…þñ%Þ^ìÕ¯\ˆŸê×%üÎk©NÀ:ûƒ©Ž-ö»n7pÉ ´•Ì¨lŠ)|COÿò¶Hei‡[¨‰»Äw3cQåuIrí>ü¢^&^ãô(Mß,'îšÓ<ٚ]Gd`-Ì j‚…er܆ªjTõžJ°f$;š%PL„«ç+p›¿ºXQûҗfQ?(Î> ]R5_£Ñ8 +sØð +d“'ån-šÕ  <k¬:bgßː5–hàVqrO-·±æ=‡öäj ÁFØÄþѳá¤ìK},ëa +T©9ØWW±ä²;å;.}Ϗ’Û´pÞ7€‡´YÍÌ WË]uDÄú U²УF°êË=× = µºÞÚ£÷ºqÍI¯/±äû‡/[UïáÐi‡ã%Û¸zÅÚ +ï +ä,+À!í¾5R©çiw¨ôdÒ¯h¾"•ÊÈüèÇKÞ’±Ì“M%©óÀìN4¦ì.ºë<ŽÄËÂñýP‡»R%†úünêރëóÎj‚ÿÉ9¬kñ}k…CºÌË̺uàú¼«†P¦Å sk`[œ«JÊÎ ÑN‘“e÷ñȖ¶«›Ò¶óQ[QísP9J€EBãäWŽôWÁ(x ‘eȐéÌ éÁ±@Þä® ¢‹˜s ˧­x¥ÔIä‰pÕZÁ»†ÇHÍá’Y\1h”-RîÇ2wÃIt{©E»u`/^ÔÓ=0ˆ¦ô%æŒ (æÛôCi…ácêFtaw1J6˜6DÛYˆà±D…²ºË»6™Ô.H%(92åù<‹´\*+÷živ)!㼌‚ 5SЂʍ´Å/~øysC¯Ðèg‘29-ÄxÏ°Þ&t“]ȟÀ×ϕs¾½@ÃÀëð3íRÒ¨i³½i$ò¥°$ x×îIp o]s„×ŽÞ Ê ßU¾°ÔÉêQU7Ü=K½ºñ ˜(€…k<Ñ9 +‚ÂFGÊýGEn'7ÌrEHŒßmuÙݗxT¤iœ>µÇ­m..=X(Âtâ±Á7ZN±D¾NÄÓâ]©bç®5cqñ¼v•™ÒBžjG©éî W‘î2?µSŇ¢‡1ðýx +¿RíÒÝôtœ\¶P@-ÐX ÷ò´& Ô/ƒ·^¦"NÀ£`Q)$†CO ‡ª`WŇPïȘBþkaêåu³S¾‹d©b×hõÇìy ¸€ì}ùM¢ïȸáåx ,xzï…ýW?è*Ñ;µü"ãBt&r@J3aTÉRÊæ/玻Æq¿‹3“sŒÞ8˜"ÀC' ‡`1å€+ÌÜS Vž;rú5g牧¸t„úŵ ß÷³ë‘3W„’h•G`â凸—Úýä ÎBxÈ¥sÜ·XíÍ(.0:¥OC®ì¢OŸ7S7g•AÑý¶ÂÄÑÒÿ kurŒÝJ.å©ô:~ZÌÕCi†7È ñbº²_ˆæy1YÌu+˜4Äñ·ˆM8kù_ Û+—u+ßC¬ˆA¬åõÒ0!S®gFNaUhž î,̉ÒB&J½.íÈç˜{Ry¿íI8áôßh&}Y7;Ò*”S"2÷¶/Tq"…åü¢ëŸ ïhÁ:åâU™ÝT®Öt•Xò,jÈ>a–TˆWÉe·–§ÈÂw–Ù0FÿpD¹é©:hp‚‘š—z‡¨…?Ê'×­ÉÒùÐùâ_¬Ã%3å=]õ‡GÏ&1µ@ˆJâ?È*(¹®a®]Içu>ÍR¦€øUç…éåSW0Ì|ÏÄvÊyð!PPˆ"祕ÃòԐÀÌu ͈¤Ã¢v/h» |ë9”ŒsîÉ&̌8òXWÀB/–? +y¡,¡!+lÎÅo=•PgÔ¾¿rD°wáspÝπ"c](ŠFDD1@Ä_ „gÐë"Ɇ?ŒŠ†£ ‘l àL•É·ð¸´€YK+uîI ¬ r»Âù6ÿ°¼…–ìûP÷¼/äˆu¤o~.j.sz¶â“î¡MD|»E.ƒpXö´fø +Vý  Ú]´ Â5Ž-Ÿj/#ë@Ð_¹0 0<¥CÀÔؽç‘23÷d]I¡«Îx¬4Xœî²æ–6{†ò‚‡‡L"$£ßÎiÀΛõ(%h])nÀ­=Y†ËÇY|§è1±Sïq)þË8É DòE9 W a¥œù6‡Ób°Üóㆹ3;𨢘ÇRXýáôÀT\}´gÉwˆÍ>ð~·G êüœå¸Ãw„x¨Ó*]f1dŽy.¾ø$2tÜB2àŸÔæ Ț‘ã žŒî%\Ø"üûCKDZu'ä3è]4?—¶ÚÇzº6d\»°‘âSl)ËWFxïU9‡3:UÍ¢™,Å;-ŒÐq«lÜOԎ:Jèøm ‰FaÀ3<ö³¸¸0‚ÊIÑc­IV‹¿hq«ËBùñzÀmf?pÍèi=®Û(”5mÈþ3܆]ÐtÆü!”ç +kD‹v†zT?šxNõ8ÂWN(¸Ÿéðz4j8 %AëìâÞ=§Á£ÄoÎÜÑe®åœ}õs—ö + $,ªiƒ%ÅÄ0ëã|$â)¤_:Vþ&1HîZNÞ¥s¡EQ%^ÕêڞB¤î7ÂN¬1äÕS`Ö¿Ñ[õ6؟#!(0² „Y@«éKº'K_Ìųäoƨ=–߬rÁ‘c˜§«÷î03®’:s¦pF°¯ ¢Wøß®ö ’{ìeÝÁ5Âú&£B0?l¶3Tz !BL 1§‡M”îJ)Ì=Yтž×sߑHRúó†F-¶wµVf·kr.9’qbÙ'R†‘ù„ûX4xjC¸….F¤OJ ÚÕi†~³¹ùÍêø[ÄöåDLæžG±Ì€Õ&œ3”umj;"{ؖ%vuªK3jò°%¹ ‚ óEuyŽ= ·ŠS Ÿ¹Þ›‰CêAáˆHÆ9"Ð+õö7hè»eBO¥¥‡ý™œä_0KJˆ¢4j ›©~°N¹Rú0 ƒß\s¡4ÜUç†Ì¥± +¼z¢Þõ¶Ò{ƹûu _Q¶Ç¤0Øç2ßsn70xIƒÂ¢þ4€t&/­†éb⣠À’|¢Eœ(}|s/'æv®{Á³Sá`ZšOüÂ4Wχ·Ëù ûŒ©Àìý,‰jåZ‹¬ÃºyðŸœ1ßý{¬a¦Ç™ºnÞNR,p•ˆê~,D•%£ôȹ >ÁLLÁŒÉ Åê`¹Ö]ÝØàR$‚¦)IƒÖúT›Uz°¬ ÖæEõr4¼% !9ûh᣸øö¥:!³7ôâj·qb¬hg¯˜ñôÊRsŽ°°ö½Iý¹sÏmná ËåŒ^ÞõXçrÝÔ}ÓK×Û ´ýsP +e–ëV‡5ÕA*ž÷—ðUÊ[ÌÈN‹‡”ê>:¹áÔ éfÝ*ê_ˆçºç(& ä~.·RºÌÙ‘Õ‰™?÷¼Œß«aØ9%·—1J”#púá69Ž¡cE½»ŸK·{žÑ¿i5w|ÈH€ÍÃ*Uö;3›t …,ãê=h¸“T÷\z·h`5BõűÃßmB½óGw§ªGtŒT ‚ Xý}òž¤ŸöÇä23Ê©Èv“{ýSš©`hÍ"8?fUÑå0'd„%—ºÄNQ,=ž”ë£@¼ŽÅË°`tŝ(æ Í@á!f¬Š¡-ѐœb%ŠVyöîp¤Ù•–$Ù]Áz äp­äÝ°øáTÿ×<Õ}@7–‚3rW/[è5³v™ÈBˆMî(4àåxq•R–`I& “Î=¹6Õ67mÖrR8Z n•²@ˆœBX…Ù©žþT¡%¾•;”H¾;”Š‡²®\4éhU ïàŒ2X ‹¦Òî %'“’Þ̜Jkõuâ'øŽÖNO$a™yÊ.p ó•Ôƒ@ìõY €JPj^ªKõt¡ÐèŠÔaýD9ÚmbÿƒN0{wz*0³H¼Gÿ>ä8)gê®Ø‚E]/¡-sOéAz´ĺBÝ]‹ó—²Æ +sj̱RQ‘üåiºEzVDúã +{ ¡ŠY;¾ÔGåÞ\œqýÓ\kÌ:M>E5+xjËÒ fÔYÂ,%>,é¥pB”#¢´¡ä+،»¤ù¾¥ª£ð~ÛUý•yø©ÕmÀ³ +pèǬç)Vu׉žÑŸäK¬€ô«f²¨ÚbjUºj÷Za(‚2ù¤‹ÁÜ»ðP¸£c…VTÀ_RSùXÏ*(h.u£rOKš&©óm*váÑÓ]áJCñè»MŸ¢·¢3XÕ²´Q©ît—G„…ÚÅP/õˆ©Ìö²ûã%e~zŸ0RO:ܛ‰ÉžDÀÇ`q–ªªú'weY0Ì\g2SÀßĆLzpzў\çx­ŠîFd™¡9›yþÖ³s/¤h-•r =zyÙµ¯dLH’n~Û3¥pTݼ;Ó‡â&SôE.Ýý3ˆìŽ>ÆþDãd|ØC»®—Ä#Ø$Õ¥°JÿÜMf˜òö« ^Õde4edg0BÔl{ë›T`¨8.ÏېẨ‹&fº÷ÌÚ?Š1QOSؚø´´k–sÀה,ºù7àVIÚouLz÷[g\óc§é½°×7°"ýæGEM#<½®e6-­º +EÝÃÇ¢ýb|²ÚoS;qXZ·o°P×Íj±{™>ÃgϜõPF‰7“!VælÃbǦ©…ùÜÎÁzÖ¼im‰Æ¦Þw_bGRÎTÅGKM‡‹IÌ$ ¬Ðq³Ï>xº¤ú<¹~[ŠœFjíßw=œV=-º¢åV(Þ¥E§+ŸNõ²Î©«»³%øgÌp\72­VL†Ò{Š«‚¤W=§%WLÕ?Ò®’)ìó‘r‰Î¢1*8·C¤åöC&°€»>휻’GF32¬&gMXìúÑËÕbœÛ}¡—˜†ôu¡A=|"#€1Žã4F—”õP¼wÊJi¶2O…ª3Lê¸ Ci˞µ¹âãÒ[?Ü%. 7݄!çO.Ñ9×T|§˜u çë$0¶(Új̗\³+r8\Üi +Á§@nkÙÁñFyFî*Šš`)o#ñüÉÔD9ˆÇ€àLH\î(D3ÇVÔ 0¬×éT‹ßº9x¹ TmæO|0p’G\’=å/·$€¥Ïwþr›VÜ$­¨Š—RW­¬ÖF—¥ÈG^¡T“sÁ©1ÓaÈ¡ú”Ân!óo§®z¸±²H,T~¹"ÊèÃ%:íÙOoªU^TYÈÐ(ƞì(Vâ4~›Ëq²'D^(ªE$‰oÈ9.a£y,ìl‹É–ÑÞÜUÔ|8ÓÂBç-(©O®[Âr<ù«…ÁHFàÝÊbô-„{…ü¯ê»{SªKw—IÕ.y»º‡‘G˜ÓeÑ–í\8ÁíèA†~´ªê*{\”%ìý“œk¯A)À£çv¼#Uéœàᄦ÷¼]Œá)RH%1£V‚Ä\üý˜ÖïýÂ%°X7Ñ»ɱRÏAœK•U å†@kó}Ì Y,(ÎÎesš‡Iㅍ,•ªg÷›Ë4Þug6¼Z>Å}vhý¸´9Aß°T¯2çÊ(;ùÎØ÷çT½è¡Ý$¤ÆßY~Å/#J½.Íz>#êƒ`á`U×Ñe'XÓ-Œñ<MŠdÀ’7àL×x $avõ”îÓE¸§?3Òÿ‡yƒ°,҈|¹“8‹,äŽ7ƒ ­góJIE#IùÑÒ, ÅÐ(qJ¯á÷>/T9*ÉqC"oºßâ/E¥QεU|hH6Pǽ*Ս(åQ¯¨ +C>‹G¿á¦\ÝcÂÃ%:ð%AÄ«=òÅêôÅ.· ƒù֋ûøQQµpIê*Î9–5‘QJø{—>DÀß (C‰Ü&ûÒÓfFŸ“ ]Aw‹Ãų¾BM¥³»Â/á‘Ë|ZíCIÓeñê!Úf±B¡ÔÏ°8åE uŕaܕҲRÄÍ|dbÌǓàZâ+D`mPxº–RR˜ª@»¹Nø÷Vð|´j)–¬@΋…tNÞ¼nYJá—ÛÆe"bϤsSévYbKË c1S½Sxo.¦-mjÆt§¹¹èR Sê ½–ŸVß~ñÁB.Qœƒ]¥£ìJt«Gä +0ÙëCf6¡:§Nۜ¹f-ÕÁ®8I7ÚÉ8×5ÃJNOZ×à;܄o<jçRÍ(5Ìž~¡ØÀéêÆnL5Ï|1ø?סz#¥šQÌ¥ ¬_46Œ¿»n÷ôٔ ò7U²(â‰à›Q(út1©èõ"®©|‰0!ºF/*¼há ×N䮢Äc1%Êè—ÇÐT¨VÏÔ¡´;u Mqâ•w”‹Ró2̛×å@lõׁϫ›ôð0Nˆ<˜² +‡¿Ô Ìà$ÊZÏGIÔJ@ÂB>›2JÓ"bµÕÇÀL·®›%‡è l1Õ•}`Àɱɪ.4LN©Ž{iÒâ¢à;ʚ<Ô‰‡ªº.|QC‰”ªÃ˔;0ˆ^˲¸W–ÉYcÆ%Æpê‹)béFØÌ£(v2c©û•µLÂC"к©1´,oÒéè7`ÍÅz×ØGωjÐÄå܅®´º÷ *‰Ð߄(0NWÎk6@1sݨEìúcüD‹n+Õ«Mn2˜|tZsÏ`b9ð ê4LB>+—i™½^º»FwwVKmR©ÎÝr~VÕhO?ÓèÜË +ÏKà(}¨-ðйò-m(œK³ÊµYÔf×fy«µ˜¯w6­¹»FR˜UÂÖziÎgÒ ö]ïٍŒ*°D 'G‘;ÈW5˜.¨ÚÂÂÏ%kY]±Å ›Ó$ÕµÚüâ[_SȨ2Ç3cW(@pºTfñC§n°+o‘»Vo§’þ+úÚ ƒ•~’ÅRäiµ9^ÆH5r·D©z Ò!²Æ1°Ó¢]ÓR%h·îét¹ o¹gdª#k¹+{[d骴S·,.Õ¾Ô2ÞåG»ñ!ÐzãÕeûp=äaÇ舷žZcûT—ì¾ÅNd‡„zE zc± sâ_b+& `®n®â¯ãt~ñ4~‰SÞ1/´EC¯SôWŒ8Ô?1IFíêºSûT§¥k(ºê9×ÜÒÜqV\¼éËômb•ÛPñ:9¹”É°á0Ò‹¯9­ažfGê+Òuœ¹] Íˆ¯,ª;=ïµêX-ü¸ž‰&D§; ‰éw„fÍ둼N9xh-ÂtÓ~ +꒼P5ì>Qo!*É-ÀŸâlX«q‡ÖJћÕaLëÏ9˜UT—+JÞBnFžŠ=èË2zÜíÂNgÑãÇíÎU‹ÂèqUU¿šØÃr¨X¿MZªKXx¨P]éø̺OK‰?Âr…2S—`t¬2Ì· 2:žJà‘4‰ïu¿ÄÓÉ1¥ÕB €¾AoŸMÑ.¥Ú4oÂ2¡»Ði‚9(1—òÈÕM‘`Q*´.+8ü†¤‹á¤°¥ì Ç©jBڋL:tÎLé“ÆÍÜÇÇ#dáhÜI!È#r£gzBˆK+›ïÍ%Ör‘7ƒ`ñ;.K2×ÊA|QZ4üÎw€…EôX¦O‚–¥§õíÂØ#oË06¤…ßÞjC¼6Æå’ÒEƒØ´O´˜|6ŒÝuَÝÄñN@ò¡Ì@Xt[ölQ«½ÂûJ ³˜ëv ,ö3å&æ†L!ÜJèÜuýûXd‚iæsêƒZ½óä.û€ÏeEÑ(kÞý‰n^0£â‚êFQü…rÆîOÄËxzó†âÝ ·iá¯ös±x×n  ÌX\£"³F|º˜ª8<“zm‡‹Sy&Պ˜êS'«7ÞhŽbÄÚç$ÏÐ2ëë܁w¨Qþ¾ #•Ô†ùeoJEÀPĔw”ú@X†Ä¸R;=֜92žÑx"ïÐÍ8<ƒÎ5ü©6›Hr|cÐ¥#Ê8IáfÖÉwä´Jg83é_=íL»ܵ:yqKîêp…xî)íR¬ñ9 Gç†ÕE“'‹mØ»-iÞÂö覫jà* ÂR$­ˆ';BšxfŠÇnV4w¯Þ†W‘¬¼ÙÚãT;H„Dz:@g‡D$;ö é!ˆávO£PÕ]¢WîIWfŠ½i!M·²À6Žõäí=GäÂëaZÑ(d°˜›¾b )iñ•ž ±lÛá«Åíe¹%}*4àh)ÝìÚܳV®«j†¦ÚÇYÓƲ‡Zu{;÷tóMZ,CeK$—‚G ³Y{~YÁ^5´Ð#ë¾¼M®Ê@PòÝe†’qDªË¬âéJ.%8a<Ý;±›1Ʋ=¶¬†ÿ.QÜv?S®DóáÄ[¡OpÕË¥>e1|ŽE ÆÅÀ„Ä`e'Äm^A #¼c¥.9p2¸ü˜ò'ÄÙ-æ6q“BÒÁ%ùkNٜ€˜û~¬H"Až©zÎö0øÏê’ÓðYÂN-DÓ«;Tº/rQãq©Ù¢¸š>ÿÍÞÍ\ +¥w˜oßê~$Gá‘ã\žÀ}h´åOHÞç>ÔGäØÇå¡/AóÀí¾l¬?¥ªïÍûò͝¼BšÿÐæQ8±Í}c½AÍ8/‰/gßEP6œù5œû š9ðý:ºaæpÉÏÜXæ¨L}.9r@™G«±$™c¹G‘ò2G!–°£æ˜÷ÊNŒ9 |6Œ9÷;U‰Ã€ßYþ¨+ވ¿Øì ˜#ÜÄÀkÌÑZø¹4L~ytJ|yu$ñåÕª¹^>­†—WwTMv9ðdêlèr ¡à%º¼^ÑÌÊñ›jÎ.gÆÓðh%#¨JÛäò;¦ä•\ ¯àÚ¦SÁP•ücœ—åU§$ܑ l9êƙÏj9µåyƒ–³ßýLf9:ë•+ˆåü«í¼rÚƘ¸r£<÷¤•ß–î°ò»œÆ¬r„µÔYѬr,»ÉÒ˼t='©¼™òŸ ò¦’ÌSŽ>F—yò˜{»}£d”c?„ ŸnçúÛX +¶™.Dy÷g²Ê{PqPŽºË><…"÷BôóeÒ³QD§\´éäA¹N8y¯fÇllr´:L½g„åµbqZ’Éc±°ƒÉ±ÌŸg.ùpÉÀ’Q´v(9Å>—yãø|\&C#Ù:܃z'’?ÍNɁÑhömÉ#ïVIî8òñ¨F/i䬴ã”4rv!Vk£‘«IH•c%Šý!Û ‘ÃBÈÌN#?ÃñN9,ìû0r$…}6V^Šü #Ç2œ!Œ€‘cÅÄú¢EŽúÆËHg‘iQÎÇíEÎ~&*_Qä2³¨ÞÀpX1ëæúQöº²Èaî ‰œ^(νUçˆ(uRԂC>2g#©3ŠP(?Ú(ä˜Iùð2 äã }Ý + ‡5*<¢[“&°Àãtx >ŽÆà\}||DÑIè¬G7C@ yü¹cbð8ª—¹œß¸ã`:s±Øñ{„_fìxV—oÔñÛzRSÇA.áÏtäõåX™ãw„ý9~ϛÈq‚W9q È©šØÀñh¼qª3©×[qãLˆœ.E ¶9y¬qú™ÂÙXãÈCñõ Ô8äjG»fÂзY4Ž´+}4^„JÎ8ÊAokL'f‘z†”þ5ÊüÑüp|€¡ä>CL<ë]Œg*ºé3£l™E@Œ,€q, õª˜/Žl¦J¢Œ‡kG@ùF/mÖI©aŠ§ºd‹ògÄÖªtx”Èodq=JÓò_–aCpÅápÝ°â„Èœ +’¶Â jqù[ÜF +rcŠcÅD o Åñ{\0(œÍû (Žì _Ÿ°²«rÉüaÈ[µRB€ŒMøp:g€‡è?øß\þLø7þ¤úb›í‹UíÉþæf&Ç(Á€f¢v7ò·Ã þnª©ŸÜï4lØï´õ{8Ô,oÆ"Ï> :Íð°r3ûÓIüž†øÆà}—¬| Üw¼–í{PP?öµõpÁú>õ4Ô{Êgq ‰ÅÄúË¡–Éú>Xƒ|=o¬ïƒHLŠS ûþY?³§MûÉA“ðFû†›ÒÜVC’µ½=ƒ\ñ õ;S$Aúôq%“Â7ÄÀÂõñÆùF¹ÑPï“ w²´0êéÅkÙ0ßð ”B Ì÷A8ˆ-.¶©îl”ï‹ÈQÉø4Ìà~ÖZª BJúñ]LkHÂ÷UTš‘€o fR?­|oˆZn ¼÷Uœº7pê{®pí]Ü*:ÑÞ0D›Õ™ÄÑP³`oˆZh¨/¾!Û°Þð%¥ÿ4†E󏮗5Dî¶çc‡z§5Ê ×`}u0½yŸìµÍ¢òa®>‰Þ—k°è-¸Ä؀ÞWÄƒç •‹Çç °„fÖxÖÿœæ} ÁòNQފò†ŠŽX¼QÂj @tƒÉÄËÝHÞ\Ÿ\‹µk!@±iØHÞÓj’÷=§÷'G|ºê˜\³µr¼Õo©ŸäM…›ÌɛòFY{—7’7Þ·al·wl&L äÍ¿Ó¢†ïŒf‚¼!å,Á1Tì˜ú©¢¢Œ ò&C,ƒ¼) ‰Å oґX¸²¼i&(@Þ|R½MŽ7E6Ìoo +k¢ÜƒihHjp9Éñæ&üd7Ž7Ìl~oŠn:’ã ɐ‘Ǜš}M]æxŸä,÷19ÞxCU1´q¼©Õv G6`f#1ÞMa¾ô‰Ì‚åÀxC.uÂo +ŸIùÙ0Þ0+˜oJåÈ5Æ[Ú9V«­oîɪšÀxŸ ¼ Œ7, Þío\X÷Ey@h—1öÀxS@Å:ñ•âÍþËñY)\€°˜àòÆx#Ìq×sÇx#,wÝâ=°Â:ûD£·"OtEx͒à=¬¦O€7ŽóNïO<]ûÌc9øݸNH;¿PÔ'aœ\2½›äãK•L ïFԕ ÿ€wC‘óx#LÓϨè•ÜïŠh“ üØ×Jj7öâ{»A»¤â ˜ÝŒ8²–9˜Ýì OÜÑÆìæE—C»*†‡÷¸À˜Sª[eÛf\®…ógÎvìNµ(9 çځݰ²Š*xÝ8ŽâÎÂuã×TJ´ÐºOŠ&•¨¹“Pðg×­9ÆIš‰ëe/ÚÒ²³‰& ¸ð7\7̪x \7-¤¯×MC±Pmâºif9Vàºù5áܘ‚™L×ǎëF`[õªëfí† ±nF•·•Y“ÖÍzVú®úõÀuó&©ÔtåuŸH^7;´3Ö¼no¨Naåu³„&QßrºK‚×M ©‰¯›‚ZŠ&‚×ÍþP\°s—*>7`·$¶”šØÍ UeüDzç‘vb7]®h‚Ø--®7¬—­ÕÜí ì†Un‰Ý44‹Ïò7 މ݌ðI>hb·ú±<Òðˆ|„¸Õã–“ØÍU•Ú‘èåË=X¶ ‡ê Ù-ó«—6t1¯Ý0ˆ~¿!»Ù܆ø€@vkÝ`ˆ·ÖÒWô;ِÝêþHX‹‘ÝŒ‡éÙÍeN¶'²›ÚsaiÌì¦>]߈™Ý´ècX™Ý4Wg~ì‚$²›?ÊÊÈ Ù-Éÿ©RZe}Ù--ÿᬉì¦ûÈ0A@»qßnQ? íVXı‹À Á‘ˈns «§¿€v+Tr›t’Ðî3ûјٝ–dv38ÃÄçÆìƥʙ f7}E: ¹àÅäËލٍDåÉEû#¬œTKd7Qw|‘6d·"Ë£Md7Þ8"~Ù}ÞwÐqd7‹Æ¤† !9²›®¿:ˆ¬Èî3U ì¦…©á@v^5,+ +ŒÌüÎ7d72‘)¸Rž¤•G…3æ"{¦oÈnšÙàÌÈnüUk‰ì†…ߎ솙pžDvӢ중ݲ0é¶"»ñ£¤t&²)RŠ·‚؍”¢z®ÀnfDIº`÷p.-YÜY±1»ûùa[ÑÒý1±»Õ(RZÝ°Ž|qö´“Àu·:…ìsIМïIXw‹±)6k]í¨îæNéIê¯îpt±1´aç<´ºIº~Æ´>=hfæt§aãtO«9ÝO‰–aÆoƒ¥†½+¦»ßÃçfæÌ'¤; £{Z…èîє0Ýq0øººI+¿@7¢Üªˆ3ŸM#+žûqÞ<÷2£ s?‡ßþ ÎÝ£Z°¹ÁÀQ»H£¹|á0µ‘¹Éb® +áñ.Òpêr8­ôÓøÊË #)—A冡ºL®+bÊÁížLî~LåÓ¤ÝÝ®É u†‘È;ÖGaV²ÈÈÝãC^xÜ@Ö5ÓnÝjÑC9hÜ`´²äaƒqÓjˆ9ÕØOV£¸_EÖ6w‹õAÜýªw›yI"ß0ÜÔ¦²ÍŸ)ÜÈÃ+`w÷bwgp³IøÁÝ¢:Ü8!–mnžÆÍàoãVs@ü6 ôîWúv¾Í²ÊÚ'{{=ÎDogç o÷Ècg;ˆ ¼Ý­WKîvw«ˆ¤i£¨‚£üFÝ~š«r³ÁÕb"·!G¤Öc%n‹.:&pαÜ~Bì²ñ¶aåp¼mÔu0ƒ¸mPÅU·Ò¶QEÃ@À¶±ôfúͬíü{CmO«IÛ ã4·ZdÛѦ³=?˜m,MÝÑ;ºSÁ_Æff­„"®G¹ÐáRz5SWÌ6¬µf +[³Ímxˆ³¹VañÀl³¥’²å‘Ú¾¯í×Eªò% Û<1Þå€l‚ð{VÏÀéäµd›ö%È6èãݲÍÇÊÚlC¶ù~p È6-Š‘®m6 «P€ýx\`bÈögïéKzVLÈ6# –mmš•}5d[‘ÉÒ'R›G• ¯m†Ä¨n +È6³Ðmà0ùÂlŒmÜ×q›±=—ÉÁØÖ·î†K ¸D?é`lÓÂ+¸3BÚ¹ÝÛgÐm’± ‹Ä ÁØf‰í£M&bW*‘] ¶ñ +‹ˆmx….õ^ÛÓNeÞא•ˆ‘qF•Ó†Ø^ÌFl³É33Ø†E*· ±MbãØ>É??U:«nô sàÙÛx…­1b›C5&6bÏY » ±r=Òӂ±º5qî]’Îîy;_9¥¢Œ×†Î!%èÚx]äɯtm‘8œ^›A$uB÷B ׬+][V*’Œ×æ±î€i«<¸xxÙðڌ‹²CIðµñÜsL¾öx‚ƒ¾¶QOåºLæ<Áȼ6ë‹Na´']m~êÂֆ”‘”`k£kÇ£´ÆŒ>ö( ²6Ë«V´Làe[ö•«õ‘3ºP¸âå,ÕbÒAØ ÚÝ-ƒ©Ý]¼–HmÙ ZˆÚhÄq;€ÚÔ¦ÀõlvîÄV Ðör,Ñ_V`öí”äeßîÁ¼ìFÜæËΆKÁÊnŽ•&*úNâ)ÁŸ PöíՃ“3µºZ1Ùw*“}ǜ”lœÑe<æÌÍcªap$٘žº¡Ùô‰nâíˆl8ý +'8d„Óã€l貨¨^ùب·VÆqÔqGûEÓ±Gs:{¥cÃÈ0SÀ±Gô46v03w4ö° $ÉØÃyˆcÃ?7ÁØL´VÝ1t©äbCÁª‰Å~z´Ã0{æ4¨Ø#ð+©½D-“§ûT„X›‹'º›f>Š}’M|Ž„b3'AŸ{£bì¼RP±‰à:ý:H³Áæ6‹fiå<¢±Ø°(¿XìóŒ*ü ‹­uÓ¨‹Í8]¢Àb‹a´ûÒWþ¢šÇ‹ÍijšÇE'°O®æ ~c.6\68Ü°ØCÅà Åk@hÍÄքíHìá<‰Ø0h ö0zqça³zøj‡=‚i”kF/™Ýh؄b\‚ÃÉ®®Ã^2y+›ë +u1›«ºÞ&›QÕæºÎÉ´fl•úîÀaóì®kÒ°éŸ_ãúʞÊY ›ñC{Ô¶—ݬ8l²¨ôÌ8l^z'¢Þ8ì´l8lìiȃqØøPN6\°ª’‡ ó¥6ª=D” &›^;ՆæSGveà°ºPåŸhØ܂nÃaóä®kÒ°ÏՒIÃf G商M«Ó°iin€ÁbÅãTXq§aÓ%-®K¸´qåRÒ°aQeƆÃæbú2÷DãK‹4Ë: *”m½V + 6—¢ÊèL¶Ä ãš8lž=OÃFlL¥fÿdõêéŽb8ã°i¸bÅaÃlD‰pØÜNwÃ8l\#֊ÃæڈܕÀaãÉKiö4l@ìÅl"6~BA›]3 :÷[s…K˜–ト½XV"ö4›«B‰ +LÄÎwwgb3=>$6Á8›IÍârÄ©ÿ¤™ïJ@±™ÕäÛ$(6“ŒJlPl‰òû˜Pl–†0(PlnõóFŖ⺷IŞ}ɂŠÍØóÜoTlâTÕ³ÂTl¦¢Ø¢!¨ØüC|°v-R>©Ø0ð&›13vºØ¨ØŒ8±½Z`±iÑD',6 E¬Xl>u:ï»£ñµ±Øˆ+¨ÐuÃb'VݑQå?H³”>°ØõÕmXljQ¨¡ +.6œM7ÿ0›¢]6.6Ì\À'›>¬àbÓ¢ö‹+›G¤ (¸Ø Ǩ }ĵº¶içbÓfÚ<¸Ødó±g`p±™ÁPC͕‹=ÍÁÅæÈV€ÁÅæcÿ…‹ ³;ï8‹´^ÁÅæ6Ôpm\lšù̂‹-Ôa?'›ŠÈö†Å¦Î“èÅ†æˆcMr±™*îÔ2¹ØŒ‘“U\lV5w ¯£« âÊÅƑ¤5›+*5 {ZÍýBÿ£èZÎwòÓjà°îà}?}ñ.ŸIÄÆÃ&E+ØÍÃÑÎÃn¿$»944ìǾÆÃ~}L µ‹ü' +û‰p#a?ê­°ì&|qb°×ìì'FÆ`ó}¹KP°¡vQ~d…`“8!ØРq¬ ®t±˜oC`Ã(è¦ ØHAÏä_3™5®7üui‘Ì3ý†á.¹›úìðkbű +û½N¨PËs±–^ÑרנÃäë`Q%ùúŠFáøò/¤{Mõs½&õ¨ª±#¯¯;üN¯¯èäÀk¦¸Žçw}…À%p×(‚`ð:pחñ'íFº¨»¾B¹°k¤ÅØ×{c]£h”IºFzC ¿J¨¸ags]‡Éꁹfðp\“rÝB™ºA®‘:ªc"®!™!]/×Í:Àpݼ(H¾5öc >ðÖ80ãÝúîñ8¸¿£k°­oÏa;Úí#›Á¨47½ï!ýà9o\k,Ԕ¬Ö:†Zw£fv¦5֎ŽßӍâZ²*;@_»ñ-݀ÖådÁkŠ«µ‰³†\PSæJ³Æ7÷we”‚š[|Â(aökeY»€.IÖ58ÁÄ4l3dçX·èúëäź pƒX³KÎ¥¦³°Ûçà‚ a *'Å X¨Ì„g¬oó…6~56ˆý_},èÕwHq7x5¬,Èv5¨6Œÿº¿v&˺ÌïG¡£Wç#u#¸Ǫ̃Zä #­3ˆŸ]0«/˅vdõ•M¬F]Š§V_‘¢Ú€Õ‰| +^5 š„‘’ W}E€ UƒîÇÑ `Õ kßXÕ¨°S¦K’.KÑMª.͟ïª.¡" Nu E`ªá|´þ©.öDR ƒ¸bT—蛺!ª_ž€§I¨®ñ~P}s{çSß'<5 AšÔ¿\^QRòXԛiº¥Gå–NI<45‚Vd"ohêÁ¼ìù‘dêêVh ¦îî`µs©o'K}zÞ*µ%´;”Z¥(¶bR“˜ðþH$õCªÌ;‘ˆ6Î õã…`à¨#6ÿ£¶~+YÔ=ºOE]¢únGQ7{’Dme‚¨™|øÄ¡fd&Ê5ñq{ÒJ5ޏӕ|BÚ8¢)‚¨ƒ—ÛK}4µšêËîU¨Kø ÁŸfa¿ÁۉŸFý_S)*=*¬‡øz&{º¹7è{Úòõ@Oß 9œ“<­%Y-oäii\ú5ÉÓÓÞìäiêS°¤V‹š‹ØqXÔ?1Ðӟ]öo¿,ÀÐÜcMèéê,_’§—à黄NxåN# !6§±Ó`‡¨ã´©Ów”ÅnÐiDèÉsh¥aœ†¡{‹¹@ºCü`à4RÀwo‰ÓèV4U¡Ñ)s-½Á¥!.VˆÈÖçt§1¡¥çŸ+Y:¬ –î¡ +®tèꆕ†àºlU¿ƒžl¨4 ьqñe£çL ¥{è© ×o'V7 4€_Œ5™'Z+Õâ'ï¨¹_ãJ?·ñàIÓPÚÄI3^~Üo4i€ø5&ýÔÀn &Í^ô÷ýƒ Sés£¤!3 5Bďá+;H:qeÁ‘Nf`¤½;Eå[§;—Fe!+ђ! CqÄ~"¤GDx‚ ŠÖ¼èÂãÈmÜøÑcm‰/°îÖ&=Ù¦66x4iÅmf£µ«^ÅèèNj؝ýˆo—ÜèáÕYb£YHy_;5š¼p¶Í34'ÅBß`FK‚ä= eIdôˆÊ  F¯šÀè'2ÅÁ‹~œ$K8t ;-J^v Z4èm¤ºGŸÊ ¡I¡aEb}, hjìûxãD#Åø¦1Ñø›S¦D÷#ŠÍWH4òcQq.Nåa X ¢‘jcöFˆn¯'!ºEÙ] ¢Ó°1¢§Õèf–TŠ±BfÔiCD£Ûú({°B¡W€19*V.îˆhðºnßL&å°p*mò¡±¢Rãeü¸ÄCcõ¦z+˜UËv8ômI²¡AuRÓb£¡))c*¢¡›Õ^I†æ2ÏŬ'dÖYû)·¡wž“ KãäBsñÜú m2âž×PC¡«•¦;Ü®8w~0‘•K$ô»kôå›;_ÿý"¡¿FzþÅã׏þ¯~þýzxîwÃÿûËÿû¯ÔÏ|ÿ»~ý¿ýøÿùîããŸÿŏù×_ÙíúíO¿þóÿæ‡þý²Ãɂð×kûK»ý›ß¾~éßýö7¿ÿ«ø‰_:¯?ÿ›ÿßßþø‡×iýõßþ2{9›×ùÿöÇ¿]Oæ7ÿþÇÿøû_¿îìÿü7¿ûù÷çÖÿæwÿùÓÆQyò_½ÎÿåÇßþ§¿úýß÷BÿâwøÛ_|²úúë_ü«ë×úóo¼; 7 ¿þ³ßýü篷ï÷¯ð»ïlÿ—?þ§×9/ÿò«?ù³ÿÌ{ôoÿòoþËßþUëŸýُøð_çÿð«ãã_üêOŽÿ‡_ýÉÁ¬Øïãã}ý×ÿó²ýá£~üëÿóÿ:>~óÚãßÿůþä»>0ôã~šn{û=M‡ ÙþÚéûíX¯¿~Æÿï¯ÿy<ÌÄhZôXí¢L¡ÃK˜éµ¼|­ñð¯¼ÑÂ! +p\r¬)>Ý0QgK2ϹÚa|${Q€QÞlX3Üè6;FÒþú‰í¨ô¢^£Ûv +aÔ°‡Ÿ¸o|*úµv÷sXìy¾ó¨Ë…}¾ ¯üGÜâŽîiÀÙ½VýðëØ“3Ñð/gèAÍÈk¹}Ý1XÞnîy|üë_ÅÃìKvúCÐtÜ«FW´½Œõ_oF *ty‹½ +̱¾ØëeØÏÁÆ拶Û_óºãŸÚË ð"Š€FqükµûLX»8Èkí|3B\Ïu±#‹WÚÇ~X²9®ýlüáÎ-OûŸÞçÿúû\ŸZŒ³{Æy-óÇ^ÛQ+^å›mvQÇ۟ŠWúÒâñ¢¸å÷ûý…r+Ší4N¯¹Öó]lÛµMûr#æQ—[6Oa¿¿À œ÷ûÆETýý±¥ñíOû|ò¨ë‹óé.ü·ßñlºˆñûÍÅ©·ãÙÏápÎh=ÙŶ]Ø´/wau¹_óö›‹ß€7¾o o¶¼½¼Óøö€§}¾ yÔõ­ùt¾ÙË{«™çû˜V(À_íßiÈAÈlÓã6¦-ö9¦-‡cÚrۘ†Aôa߸C8ò~ØiÜÏaڗž‡].íÓ}ø!ÆOÌ0õ8?Ý"Ì0ÇõvL&•ßËò‹‹q;½Å>¯e9ì¼êå¶[„)±#â¹m ŠVwÛa§q?‡i_Nxv¹´O÷!oѼ{û„>÷2¡Ïc™Ðã6¡/ö9¡/‡úrۄ>÷ºq¾ëa§q?‡i_Nxv¹´O÷á+oÑ~‹æã^Ž3_Œåãvz‹}^ËrØyÕË9l·h>îuã|1ÖÃNã~Ó¾œð<ìriŸîß’ð>û)6o®‰9ýÝÈêÊþÉOÁä‰<Ãîý*ëÅ÷OÒÆ÷QaÝx~èó°Ó¸ŸÃbŸ'<»\Úçûðí—/ûž_ñró{_Nx1nW· óV,Cμi˗¹Ýáå+^6žßûòàÒøö”§}y%ò°ëËóé>|ãÌ~{çg¼œÃüà—³]ŒÛ¥-£Æ¼˘3ïØòin·wùŒ—ç¿<µ4¾=âi_އ<ìúæ|ºsއÞ|ö/«}6ÿ"()6Oc1nnÉbŸ>ÌrØéí,ç°¹FŸÏmÆU>¯šxèëmÕēÐzcz؋qsÇûôݗÃN/ÿú¼`Ú~YçùoÖýӟ³uÿ^ÁÞë{y?|—°.Þ»_²zïï?o úþ·G$/öäL‹ö뭚ÓLQ<ÑvÏ`zÙ~¾Ù0×e’‘™á€^?¶ƒ2pð”í Â8'™ÑûÛÆ»o‡Æísží<èrYŸïÁ·œb°ÁûÝ=ÍÙNCÔî{;ßŶ^Ú4/·at¹aó ö»+Ÿ¦¼m\$ÄÛZ÷<Íó]ȃ®/ͧ{ð­¦V²¼ßÚõGÛ9ð¯ýÅ]lëuMóræA—»5Ï`¿µ'ۄ·· ÚŸX÷§;ÍóEȃ®o̧{ð-£c´xT½Æ׀†rÚ¿ÓX\zqþêoF«¯Ñ1Û«êgöÃ^yîçp%Zü;ýÈÍ®‘ëÆ]êßý°Ó¸ŸÃ´/'<»\Ú§û°Å5nyÌÛ-â„{¿‡sk;÷_\ŒÛé-öy-ËaçU/ç°Ý"xÏ3Þ6vÙÜ~ØiÜÏaڗž‡].íÓ}ø6 ÷|OæÒgšèìoN8ÛS ãû›³nœ/ÃrÔi»?½·/SºBóQÍåÃ4åñæÃ[~xÞ¸ý,ç]^7Îç±uÚîO¯Nžå· â߃°o÷‰×1ê›Ñý~Sãí‡Ýƒœ>‡OAN=Ò· §ßzØiÜÏaڗž‡].íÓ}øÊ`°ß¢ùà—ã̇´üâbÜNo±ÏkY»9}Ÿ‚œzŸÞ‚œõý-Æý¦}9áyØåÒ>݇o2Ð/¾>ß^dŠI[Ï9e¼çÛÙ.ÆíÒû¼Ëa÷¼¹ÏáSÞ|?·-oÞ[&rŠÀñϲÚ}&í¹÷w1nÃóbŸcùrØ9ê/ç°MŸÏí[ ӝ–øiEaó¶J ëèlÄ4Úu|_RÈÓÍh¶×)ö‰w‡ÞÆ÷%źñ\&ÌÃNã~‹}žð<ì¼²O7á›E³åKo·vzþóæa9ÓŸ]ֲ̘÷`Y¤Ì»µxóÛ­]\ÿeã¹FXžXßï´/ïBvyiÞoÂ7Œf۝Þîîtþç9ÌUÂr²‹q»²e¥1oòN™7lqè·»»xÿËÆs™°<´4¾=ái_^‡<ìò޼߄oÍnß{úùyPûö¡3¶VÞFâîçÓ¨À.*ϵ +Œï½}4½sÃù‰ÏNãþë‹}žê<èrQŸïÀ·2ì÷v~¿ËiÌ/}9áŸ]Ý2\Ì[± 6q˖/r¹·Ë·›Îo|yXi|{²Ó¾¼yÐõ…ùt¾qˆa¿±óÓ]Îa~äËÙ.ÆíҖ‘bއeœ‰ûµ|ŒË]>ÛÜp~Þ˓JãÛcöåȃ®o˧;ðÃ?2¸úoþù/úñ7ý=°ú‹­Öƒ ŠkùÐ…Píï®ÑYµ²Ú¿³£Eµß¿ç—ìËq~öy~¥ív²àK8L,;’]´ÔùÛøúE Èe¼qËx¢¨èK¡Õ×ëù|â¿——ú²¢µ=Ê´ù½Ú'ƒöÍg‘ýÁÎ2¶ µ +üÝ×ëfã}>™ú\y2,¢õ¢ªm¨ìÒ%¢úJƳ>…׳à@՜Ná9âÒúVê~0× £zÖõn ¼ß¾uåò¦¯“ê>ƒbÓkàûŽjìܝe#º3x²>§žÆz·¸*ßö‹ƒå +·Ï¿^¹íÝ}€yÞ—x>xB¨u9،æè~> ‰½n¶íÍšŒ±xj tˆØ¿¥e?hþ¸Ùg<Œãµ¸ðï¡|Î/';õ~؆%1¿¢1ôk4¢56MlÛ{ύ½iÅD­c2¬ùµ˜ç†.¯|ЯC´^¯87”Èي¾T6]÷Æq‡ñà=»ÉQyâÔ.Ñ7eoºGQâ&#JX¿zŸu×ÇyžjdoW<ªR›LõÛ \{þŽ§ÕÙ8áÒ«ûz×r:õè=±œÍσ›õŽç8æ­zTòìû퍏V=NœÅƒÐ G¼ȂçâÑzð±q|Oæ«W±¾K¯}tÔ8æ«ÄJG™QÌû}ÚkÚۈ·4cÈ~?ð|À,o÷Ù÷SÚ¯sØ^5ZÀˆT?³+lwñóê+ÞÍjæcÿRm¼çA÷3ðÉÑp6¾MhUt8~c{õgÀàOãux…òþâÆ}±ÔÐö‡gÂ#”Üøéùse9Âzyz‹«(•Àh²èhgáaº6å¹ýhîŠU¤‡ ë?/ÏÇ_ûÅü8;}øÙ\gqv@ÑlïD›۟åãˆW{Ô¼qA3 +{ü¿¤¯žCÞ+@Ÿ0؞󧰿¾,ü59õí6ð嫶Ýú–ø5^¾#’Å\u^Å۞(S]棯Áúݱ-FPÌ¢ùáÍáóö‡TÒ÷¹+†õ’#ø}œsü-¥æ  ¹?õŒÛÆþo?¿Þ¶ýªúšÃì'ãËýýyë!œ‘=ÆjÙÇã|>Èsâëv>¿tïu~àQ—˜9÷ü”ö³ûM¸/=Vu¾õ v÷ã +c?bæ?Z¼ê´—+6î56~î8lÕúù¦»Ò¥ýñÌp¥+S€ƒïÃþ´Ó‡z­·äcuÕûÚhÇéӑç=H|”eûŸÂnς£ß£+zïýXËAã}åÁïž÷ ‡qçéåÆ%GÚgÏ#µUÿÆKùŠS¨ña<˜þ¿zóúÐÿêèËþ”öcNlpPil#æ®,lìq'I_âÙ^Zl\Òk-O%j6êöõܾÏÉÝî{9ôB~ +ûyœ^»Ðµ´ñºü÷£Ô0jXA¸¼§0—pŸXd#cõ´b[/_=…ݍŒ¤—žCW—éÚVúêðýÒ bû«W‚Zl´¿ƒ#Œûïò#{\6;t‡±Ù‘ÄññՋX? +ú«šF‡xA²?µ…K¼ïÃnWö'^ÔvDˆÇøêó7¯ 3_ÐSžxQ0Î%ðƒUé÷i?j_âãÃx´¯y^è °ÙW.x´æ¥°Vj2¦‹>(y¤ñ„o$ã±¾Ûg¿ýöŒrǶ£Ä¶5¿¹rÄ«@¼Ä—_8µõã &Ó¯öµ|˯yæÓgðþŽm×ãþüEô{ÿâ*l`‡ç§°—[*ì'!"Þóª<’¼ŒWë#¾ÓŸ$[Wûf74ÓÕ¶g/y[†mGyüK§—£Ü¿7“ÍӓŒ7.A¿uÙÁt=kÞkØkDDÛl<ã|ml¼ãG]Îa~a ´ÝϻĪòGŒK¯å~øöl|ó{:+”ÛËØâ-ºŸ»|õ1å(J×Gî¡FoYæÏÇÎçœÁ·Ñî€vÆSËBº¯Wÿ±1â<§€Ž>©µeÍ ›¾:jŒÖ‡V£0>sïÁ íÝo倓/ó/ï"f‚Ç+nn׸—‚8½cÛËî8xñâŒ+ž<—WŽ U òJœÿН[6Ñg}ÜSw/§noeÃ¥êÔ'Œ¯Oì\Œy„ãÈôº¶¸4p4«^ ðÅG®VüªÖ¶\Å M„Ü–O MŸh×âV0è-çKâ#ì÷ënõï»Þô¦Ë'¡é·Öü0áäë‹N{£§+÷¹™/c#OOÃk~ÐӞðÂkÉûvëW'å:ÓãKIJځž3_k ½î+ì(š’±ä®Ð4sÔ¸_‹¦y„p20€¶énö3§gL…i¿Ó¹õ¬‹{ú nk-á9ZÂ-ñøzQ„Lý]â%ÌQé:7ŸêÐp‰~¥9K>ž6h‚žÕ7 ¡ãïÃ|ÞÍ/1/OƒÇl”ñP­^Üõ¼6”ëŌ†.¶åÈz_ã‰äböuü˜LÐ2öŽ¡æ)óÅDF5^ˆÈÙ½ã±Ù3ÀÒñ¬-Ýo4"¹ïu-*ã}Ý9Áøe8"ÀÑn9ÀëQ¿ÔybWÎi1f«J„rAT+”¸gÁΗ;<äGN¯+9tÈÓúæ"Á~iOzÄX‡Væv×á:i¤Ü·w/pŽ[£„o€á$¿BXKä†z“[ +Î~~ÆaDãæðko¯xe¯÷êU5Ym{G@£œK“'½mÈϜÏ은ž.xƒ(ãuěWsœÃrÅs=ZŽå¶¯! 0óXÏÈ{pg¤+ȉ6xòsÕY¡/J¼K-ÇúR•ôÛzӞ#5À6æb)ˆy€û‰×ãÊmëùä×3W_}<@íy»îøØ!ýlá-ãû„ m‰û1µyÇìW9b¡{¶i>Ž”&ÞâÓ×1¹‰ç“ÊüN +zE,(Æ´„t(ɃìwŠ ×ͧÍÀüáÆkÍÊ-»[ +ð¤ìØ£Ws",˜G -oÉÁ “Ò÷a?óNz憭¼Ç…НQyxÆÏùEÄ œÏ –h¬:Ùñ0£wêCû÷c<4+°Õ á×az¬*Íg'x{”¸<­BôÄÑyª·œŸV®Ð¼Ä^#ü÷“kìüzyª­JL1z Ž×sɯüqŽÆöԊDdáK b<šý žšq¨'ä4bd+Å.ÉGÞnþ/øQç¾¥ôè.Á¶é)ŽçŒ”;k¾ay„㊡¶…&Пii½†±9àk÷QÏæ˜$ëÛ¶ÜvhÒÂQ#¦îcd|­«A‰ßÙ+~í°7ÇVdqØאŸsËÉå@{¨˜¾Çðùb ³l—+÷‹1BÐØ®œ4‚pãâÂÐl2Vvm†\Ž9ɲ¾S0öi9ÅÛîÔ7,+Ti38Yè'âåô4ÄtHÆ æ4†þm¾´å–_¹µd㝠šž‹†ðþÁäÑ6¿'žŒŒÍ·« ¿HÓO„ +#'€¦£™(hŽ¿j÷§ûK-˜Ç“7ì(±FAn¿â–KùrÑq¬ԃ†¡22BnwKz4žk1xÜÝþíçș躽míGúö©{j‹¨?{ÏÆ#ÓBã þ°ÇEIÒڂdෞ™7Æ÷”«¿çj޸ՖÑ«‚ðAÅbƒ×ås]‰·šïV3Õʽ쟞ËL2Í7h×sEšïșðÀn6ú–£!ιœYÉo2(£ýÿì½Ûr9²(:ÏÑÿÀˆ}¢{]@…ªé˜Kn{¼FnûXîž^{ö„‚¢JÇ©Í‹»Ý?³^ög¬·ù¨ý¸2L È"YEË)s.™De!@"oHD¶B¢ + +”{ 8¨n š»:¥¼.H;/k)X{=È\4ǁ©» ­‘:¥Eå5f +u!Ø\<>$f4Ç\v]¡)\Šú^Âtì>Ë +n̎$tD8´A5jÅPڍ a™$cšú䨧O¶µ՟ø”!©±Yâ ÜôÂÊ¡6ܸ82e°Oo€P9!Q¹,EÌG£P”< †ØyN+%¤IÆzó±†ÍÐÑé‡-4O¡v:qG…,+ Oا4gý^Ü"Ϩƒ¢›äL4¤÷é‡ºS‚mÏ51@å³qs㊏{² ì¦@‹)aa˜g”h-3ÐÚg8e˜‘ƒ ”w6%µ‡%l‰‰@\çBM­àT¾mý*+AHdÀ `ASGFBJE¦¤,YÍ®V!hÆÁ"ì_Drú­bÿ'‰H¸U‚¥1&¡¼€$aÓ =ò ˜55V,Lef¨YƒÅ¸‰Ç £XžóZ àŒ\¼-"ó@É;“}¤Ù‘ú±ÜG=Lƒ–¨V!Ã>Oœäz[(Êí8çÍSm.ˆ3Bsjm¡hFEY´¹Ï{çŸÛCCr.渻½2ObqŠ¨c¹'-¤Îccb‚H$ëŲ‚A±±,ü¾˜'î¶/~CZ ³ÐC¢9ÉD +ƐRþ¿VþøAÁö¶í­”œýR¸R֎?pwË)ÁMJòÝ%M!PRö¬8•˜zâÏ 0ætC3›0„ó £å¼š8e¸ˆ¢`˜y〠÷AÃ|8”á\Qú9æ x 9ÇÇáL†Ïí)œMênò(/Gs2â0`È(Q"•”$]¤¤šJ¥hØ|ÂyÊLFÚžÌ É,ƒ×çòÐ2ÀÃâH• +`ÚW!°ìϺX5=„l…KÅ7pÈ;£ƒ™«¹âg!`åI«u¨×t¼€Þ7 ˗Ya¢ðJZpD–³D÷I ÆõƉ؁J‚WŸ0ž¹¢c*²¹ œ‹gé+X§¸!JÉ¡qT•Ö€*ŽËrb…âLþÜIOhl$‹ïŒIŠ0„è èüÓ Y“Âøc påo¶’“^U乩Óèᆟœ’Jó„Èr¿Ûb*I.LjÏùtNF‹´ ‰;ÐpcV²„·wLê®óې¤œ9©RZ®•Ý"em(“Ü–—ÎC~]o+ߐ¼IjLZž€r,—A¤kÖ ÜBMÆ茖áA¼Mý²êœH/Ë:W¾-%ì‚*ÑA»"ihó<ꁝάÛó©”TL•g \$‰¥Â)+é®qõÛsB'²ÂvåUR#¢hÞ¢ä€Sˆä[šC¡Ÿ …¤ókÁ5ƒñ€S­­.ž†ž Mþ +”B¾»ì[’8.³ m$ޑ1nÅûÞç{–õìg¤ Š»D4kh¿Â¤F>ґJޚí2˜Ó ÓÊùÜùˆüa?wsæቮS²|RFr½³ÂP¨©ïÊâžD& ê Ô5rl¡:B”¹´“tíy0IsGÑIâœ0`¢±n—Ó©N)òó9>“¬Ùe 5ÅX™×p3Zmè© +šoÈ¥Þ°aAA!<ìÌ:uAçߤqžÐ3$ã4ۓ^As½pŽe° |ð :áŽHƒþz “ØäYqvTÉÄç¶93DÑÌ© [,a>rÐÐ[Ct˜3OÉLóAÎøT"L‰ÃRÒ 5:µŽ¾z¸<Ù5ÙtAÐy_P.+¢ >„cre¨qA²V+CçáÂùf´dûŒAmá•Ão Ìhɨ v§“Œ5îrÄÓY§O ˜ïK˜Ý¢æ[²pPyŒ9ekSzµ3—tÞ +'÷Mù€K¡tÀ@êF8­ h%wÌ©„~±´}?’³ÃÖÙr¸û”†Ø+³µÇ =\-•ø“]¡1bu;¤æŒUäaˆƒ7ñ)sظÇYƒ‹ÂŸ)ôçہT&^²è÷íÝ^äœ{àæȯMï–I)®‰Ç¾5aÈÂq¡StH¼q Ž™Z°’€2¥©'#˜‚qåM– B€t®š ’Äð²òÂn®¤–‘‰”Ô¤›Ö4[n=šqgL®ØÊöïÕ ­,2O³sä0Yj¦³ÿèÛ`W](# §F±Ø§‰œq<Òïë³¾†; /¦-\º:KI5!ìþƂµLxD`8ço•ñ@S‹ÇšÉyÀŽŸÞèµÀ<§ÄýÄï©Ø’v?_ºÆYý~Æ2âð¤°"ÿª,ˆ‘IìIE³Å‹¾©Ï[‚çi)åÑ¡³œÍPðñ>ª‘€çVKÚ-i5å‘)šøCñ9xFL¼jsžÓÁ,DNàe·aÁXŠ…$‘ÌNµ zæÒñ°‚‹0¼ç›*¢ÞëôŒå’#<šœ€€p“F̤@D’ñ™IŠÙ +:AÀ8š¢ùˆ&ë`FSÒ+ÀÈM"èT0ÎdÆ`W†^êCÁæKêÝmûQ¤+H—à˜åAŸ­Êø ÷Acõ +LIað)»(ã}DrxVK·C¬)•áC:ؘºàÏÇá‘HElÎC“2 ÐT»×B¤%™¦ö)õÂ4èëœ`ˆŽI‚ŽÊˆ½€ê_¬Aà“ª zè¶P,«¡©0‡w„`cÉ8VTëÈí(.WÑ7·ŽêPK¶h„éÝØá”b¦VؐP•¾cŠ‰¾4cÐYØÕ2 +Ûz/O$" +åî8ô³‹ÓXx8eŽé#èÍ;\žƒ¾·¨Ô  ²ñ¡ŒHÓX¸ó Ô)͝¨ð4vI±Pg 0YÕdÛ£4aÌZK1.šÑr-¹e„Xs• LP`ÄÞÖ¸¯Ô¢á:wE0Ã0:UŒfBØb€G¤,ÙiRk§‚û= „P3H© á þdœOØÙ ’ê†ÃNkÈ0©áÆ9ՖP:崃ŒŽn«„U5L} i©”vÂÅZÊS¡BòDÊÓ Ìæ€ÁÇ1î+P‘¨%pmQ79­8ŠMB®Ÿðμ\˜HÔâ’f ÁÄs©­ØØçÂë¼ ÒUx!ã‘2Ncñ‡Jn(ÃƟZÃ×q¼bƒ›7oԐϓ°0ñz7y‡s'ÆÒúó¾±3Kp#!' € é—, ŒKùñŸgpÙl¨ú{Ä9m|0§¨¹¢çi‡µj‰${U~œ\ÿÞ\r@ïKÇñ)˜'¤˜`ýÆPddèRºUîò¸Ýú!IÓùÈŃܮ ֓ðeˆ_ÒGñ +xOô(=¦ }‡§ ”/Œ#; Iê¯õË2LÓj[ù¹ñ6Vðy ï a8… +‚*…(xoñ\/¨+G$+ò{$Þq@If im€•´Ü”MQè@A…¤r ‚ó&®ÖÏ¦3¤fÈ$r÷‚¾)<§Ö)/cŸ¹›$ä½D+ÊëJø{Èé?8O“Щ†$Î?_’ƒá/bðÀ zFg.ž±º“øôJH™% ¦ìÑúZY»1WëЂ¶ »æd EÎgQ,Xïߦ)KgTFyȒã *£Zõ•Sã}‰‘QRºr ’(–SÂ৏ L{©i‡ÆËË<†‚’†jÅõ1 +:õ«“ØS÷F»x@&,HT8_SŽà.ÇÎ7æú\`üLÇcЍéòhb<Æ• û:59ŸZn¡ûéë AºùQow@Ÿ÷†CÌ„ˆÜ‰‰?¶Ø}ÓÙ3ös*ÃIÝPaU²C2u¹ñŸ,ˆœŸxÆ"aч)ŒÁŸD«Of +ŽIjïð5DÊK#¥s!2{@8XnÍ £4’b!¸—x&KNÇOøè IËŽ×yÌ$sé§4Š4eiNt*y—uE/DÝhŸå¢`/¸nW!wXEe÷\Þ»ë‰U©&X°ƒcÆ'ô¼áÀj’;a¾DIô¡YdM8x¤œƒÞÅöƒ~dü¹ Ì3Œè 4.x“ӁŠ‚M±aX„S€™ëŽºÊ’xxˆÎÙ&®:Ž†”¨×y šŠsáVíޖq"U)D` B áÅÒ¯ïÜeÉ9q”Iªøå7´èøP/ŸÎX­N¨ÄX˜¾ÚŸG MÆ _ +²Ý°¯šŽŠ‘Ôc‹ÔñÝÃ2¡²88„ ŸvóšAdœ»bq Y‰XIÁ% Þ0´2!A†Ÿ“½2‰f’tª44TžÏÁ‚ y¸-Óµ ãÍBôµÐäç2P,›]Kxp‚‰+ØÂBØmxV-•þ̞*2*é—f¦3ù¾ pYòi@¬ãÚÓÁ?(òJS—ÊlX áºhxšÙc†jŽôF—j€@Ÿ»¼T„ÖŸk@‹›ç³†Ô9 ñ´$™!…äãšyšÆ +£^E‚Kœ<˜-8GxdÔe>ëa>GFG¬)¯¤þ¤£†2wô6- kØ2UØJ¥&½à{Õ<Ѩ‰Ô”[läÝQêh±b„Þ—9O²›BšOäflà»"šxÎW +3eaàL䞤b7Òйo7]ù¨±ä:‘I8yÊG¡ŠbJ0dM±00Y’çIB´E° ¢£õIä:H·”R8$L}Óþä8 uáVŸGÀ‘îæK2@ÙáŽæ³G³)É î®{YÊç(ƒ½@þÅÉÃϧtƔ–×=ŠôI5' ÛFð +æS +2®Â§,#R¨.ԑÐAŠú +eYTój<æ,r8’ª¥/t¦ +Àfÿpp–Á˜»è»f\r¹#%uF] +GÒi€Ýø‚S&ç¹ÇËжôÙA0Â±zÛ^²ñFgX¡*H(díÏt§ ­“Èý8ÇR0^ކ*(;iá{ 8½Y†‘såj¬xÏ)0ƒÉD3À ׳Lb@Mn.åË ©$ðÐ åtSß%¢(—ðe¿” ò18¡ðŠˆR,Rá”%©n1.ßIçpÉòd´!bEÍS‚¯\^ø¢0d3ÖW +a¯mÁg‰¡V ÀM´SâÈ60± öÍŠW¦mL^'—Š ,UªPsßÄÏ+ž¥X¾2ªÄe} N&êÓ)u77&¶Òx•p9T¨Æ!i +J́1*ãõgbÕ-ògR¿d”œ®C„gͅ iÊhý&Šåˆá¾ +H&¢ÒfyÆ^<"[Ñùä‚ä8¨+a¢† ƒÛ +h,´oZpATR¦˜Ò!à<˜ê:$Ê +VÙ4è·\K'WT9ë4* x)£ÓCiŠdkHO"´˜šé1hré;GL¨ð/xƒ£jW°Ðxjع©§u\\WûÁÑQÅRìc'>sÉR®¼c¼õk’k¬…"P:>š¯u7ªä¥¨¢zÎ5h2ÅJŸVQA,ì ª‡(|5/¨ÉžqyAm‚”j¸Péý?°¼è9p…È% „ˆT{v_QU­}ÇWTÑÑj€kÊ j8e”B4 3›,óç!ו O8G“OÂå*Ÿ WÏ[.¿ç{·THë†à†é¤ãv… ,04 W× +µ $ç¥ +>~ ÕÜ|„—qL‡©íÁI|§_|ÒeGmQeIò^TÓm$kjPR¹~_À³¨éъˇj{Æ[Fl%ÔláÛ]¾FBD{ÁéXîJ†¯’þ|t!#½•j¢,w , T⸞uÍ  ¢ +yT¨ÞÃù‚Q:Q @šêšjWˆ¨X_Q +endstream endobj 99 0 obj <>stream +óÂøRä…'B_¸à1‰¡/\áhX¹¢Ê'u}ᗆjäX|ãK Ûà|·–àÚ^|AàޓèÞ¯L³XD÷~elŒa1²p秦bZZPµ‘L‘Ä÷§ˆ—ñ†W*W>Êý”ñ5¹ +óó³9ßm˜³ëJð;äL]ÛéPe‹î6ñ=º¾…nÃÑJ>‚„nkŠ{Ñ^ÏÕŠ”ÏîÒiy(oÃî1_ì0(v¨'"ª…†£~t+¬æZdI¨Ž´Ô·xSÊBBœJeؔ|Ö7G}ãà¨ÖTn($™å¼â Ë}Mé3Èic…Ê;µ=š–q@±só†á‚£7yƇm§Cú¢/9€â;½Œ9¼´p)²nÌøi,ÖWðÂL£3›9³‘t«Kž d“(ûAº x¡3˜žè¨øaH(@átžÓèÄ ¿bÍN¾ç-ü+8/ +6§!ž.èjC‘P2¦ Õ"æ r9 §ˆi¾r?5%,R¼Ò99ěùЍ€j´nß8Īý͒ˆ–¤újÔË}¯ŠâBxªê†àáÆc<ÇÙ,áÂY̎>]ÇqÝÚPEçÛï:¿üméó7Ÿçç?Œ.'óéõ«ÞlVNFÕ=ÿqš…áŸÙ‡ÛüV¨ä›ï:~ ú~fqÞVÛ¾ï ç¾ñ¯ƒËÙõú֣ލkl»ã›ÿñžH;’-HûМ¬{BÒoÍIúíþHzüüüñÅÛòjØë_ÏÊ¿öF³òÅ`vÖ¿†•8:É\Ú¦›…F÷Ei«¥v]Þ^Ϛ µÿc3 +vM ç“~ùxx{Ýk>à£æìŒîoÜ/†óIc¢&åt>l1îÔþ¾ˆS)›Î.Ÿ”ï=èVsúªO5œÝ«HëH©Wå³Þ|:ôFÇG4"aýÈìø ]¶ØD.ïqiAQ‹þò·úVRc_DáøêjZÎ6/Ÿ»ˆ÷)*^"¥û,$tsÉ>Ÿ\õúåY¿7,[HöÊS÷5#‡ 6m×Ǔ?ýz=˜m ¡²¥}hE±k~(wHÔô¶ì¿œoXh{¬_‰¤ùl´¬˜{“~»ÊQ "—Ÿ¼7r[S{2Mg½m¨ Oî©Ñt$ûŸÆû½9‹~¿G‡hEԞømtšZ;nîSÑy5Œf§­œüt½9ókûÔoëû¬€mç‘mömyKb“‚5¾-'½Ù¸¹É=±/zÉAßÚ)óíd|s;žn´v[€4W¦ÞµïîQh4ßCßm ¾B‘Ø Š6ø¸*©}Páߥ-(J÷GæíÏ&ܛ f×7ålÐЛ±Ó¤žMz·×-(ݗ-y8˜½ê 6YÀ‡=y›Ùµ-} úÓø>GùE9y[_÷Yój½$¿„Aú¤ÙŽ`ŽWã~›GnïVãô`œŒÓƒqºÓÆiótûƒqºÇÆéÕ¤gñáãÁô`žî½yÚÜ£´ßÖisát°NÖéÔÁ:=X§ëts?öÃ:µÊò“òzTŽÎ7¤¹m©-ï£Bٜ“Þå`Þb[¦ö÷%2.Ã^‹“ƒ©¸£RñÅxr{=Žß6×{bq;±˜Ä¢§¯9'bñ bñaŠÅ&ãËA99(Œ_„ÂXÚÑ>ƃ`<Æ‚ñ 2>|•ñ ‚ñ  Æg½ù¿þsÚ¿.'+ýëßáŸQ9ùDáù}“‡ò”‡E÷™9,:O_sNÝaÑmžOBòæy‰—éي¤½ÉõüËxøûMoZNæ› +©íUÂgiò…%|>ìB)‡Büw©tíþ¢(j:/›«Û»¦Iîš9Ü.А¢Ãퟪ8Ò¤¼lW7uߤý¸Áõû+ ÷ÿò„«áx|éï¸öúï¾ï8Ðø¶×Ì>ü)é¶Ù°÷éš$úÁ.¼vÔíÙº{ +StŸ—ÝGì‡Ã;m¹ÂºÉ®‰ÈéuïrüëÉC”_Xyp7£ZÞïTyè¾æb»ûœª—A5'uñ¹û¢¶ùˆ^®®æÓ²ýå9KÞ­_ÆõdÒN÷sèÁn€méûD›ßÎí7ió5Ûû}p3oÇåîkгæ79”Cû­÷=zä¾ÄM®yå¿=Óèž p?ۙ‹¬ž8òî±ú²t°ƒ^²·z ] y¸O´ÂŽÃ}¢Í¨ÝûûD +Úþ+hýìóèg‡‹Fᒝ—l£´²+w÷ " +-.³Ü“ G[\fy¸pt÷)ÚPN¢BQzµv ïÍf|¸pôlˇ G÷hO>\~ؓwzÖíɞ¼uؗwj_þ÷òîa‡-¹ñˆìڎþQIέ§ó}Žöá.ð‡:HŸ´3û<[Wî,·¿Wî|9¶È*Ø×;w¶ ’í‡öØô®ý×Æ­B7=‹®y© }ÚD'ñÿ­ûĐƴãÇ¢†ÚïÑRÜ)óÌ>=ݜì¸ÿB¾½h°Fw[Ê<äï‹8ˆy(~º‡«îèá•Ï9jníKýœÏå}»â^ÞËYõûû_pæ#Æl¢T<•³½‚¼/Â607ß|?ˆ¬‘­lgcó­û¦ý‹n‹£ˆýWVÞÃÞ~¹*'O“qíÚèÏz-F~Ÿ»²ÓK¡‡;»¦“t¾¬™øì0wr&Š/M$ïBŠÚgP•àͤ7š^µ¸-gWǶMŸðøl¥ïæç.iü·Ïš!ÃôÉÇÃá® Ö®ñgË)}ÈèýÈÎì@GäÅzm®-;\¬·†ÚݸXO=¼‹õtsŠöæ^½¿þë¿®‡åñ¤MŠÿî_«×fò}a×ê‰n‹0Sïr0o!y¨ý}ûå`ØkQÞs­´‡œùp³[ŒÕ~•Â{1žÜ^‡ã·Í·ð452q¯eâӄŸ%1iÇ);HÂÏøޓô臗3vÑö¶¤=ÍIÛ3ù°ÿi݇r‹Äío9€¤…Æ»ßåš'žîk5€62s_v¸‡› +݂´=ÛáF=ƒ %céßò²œ{¾%§Å¼Û›”œ‡(úšOÀ½}ÍIÛBôÝ I«ãˆàÉuo4*‡gå°ì·r°-?y_Ô>nÑݚÚå'ïy[{2˜Þ{ýò¦Í^ôn÷yo{ÀµzB=žÎÒGQùؘü}+×ÓF¼îËfØܹw›asÒöÌx %‡Ú о,§æΐ}[N-.W¼›óÅ»>€_ÈEÞW“²ü½¹;új°)¡|!“r¸Súj2¾iA¶¾/ªšÏàÙ¸…ò9¾GÕsƒŽ»ÒË·mö +ßü¾ë í}hNœÝf½I»=Ã=pos±9q—-*9¸Æ÷ETóý-"ûð#’єЅÇî‹äá`TöšßÞï û/Æ-Ž”DO܉“Íôòr0¼o3–üÄ}Ñ8ZØïÏoæ›sÛ*$FÏÜ«‘Ô nÚôüŸª#§VÍQ~È\Úy´ÿp3—Z¶gþœCæRƒq:d.}¶Ì¥ÃM&˄îkîR©¹/{ÜÃÍ]jAڞíq#w©¹ +¼_¹KmæÝÞä.=DÑ÷ps—ZvÈ]:ä.r—¹KÛç.‰/.w©xݗÍðáæ.µ mÏ쀒»Ôf€öe9r—ö;w©Åî™Ðø!´}LÅj3Àí…Î}ðVE(wmxÚä†ç³Ï'-b³w£óI;³yˆ\uÒÑÍ-Tǂ×mŒÔè‘ûRb¾ÄR®ŸŸ¿üV§·ƒrxÞ2Í᧞Oʛñ¦»=M=Œ.Ë«ÁhcùŠÑu[öfOÚ¤ÉFÜ¡‡Üm6™÷,w[´ºýIÞn¸+>˜Ìíé-än2·™Û­2·ïGâtÄ÷2émÿM:öÿßÛÏöï÷ö‡æ·¸}Ddæþ¬¸-òÕwM[{ȅ³/6:÷Ø;n¾ïx«!<øÇïQ„.¸ûz?˄·[b{"úûtÕÛËù™~7[ÀýçÀµvÍýgïZȍw÷(6šû|ßm ¾B‘Ø Š6$ZT(R÷h»4§hC&V…¢ôþ(ÚNŸß—­¸7Ì®oÊY =c·ä­v¯}ܚ?˹ׇ´7ïc@h»?„ó?²3;БC8ÿÎoLñN…ó[žè<„óáü՚È!œÿÉìC8ÿÎßýpþ¡Û!œ¿/á|Ôo! /“ïÛ麇þ>¹üöÃYtácËCÿ㌪Cÿ®â n͜µ«“Syè¾æá‡r8ÿژÐáàíõÌ68êÃÙçæ´.>wo–Cs»apu5Ÿ–'ã‘5vF-äç҃÷¦³4¤óɕUS[ÎßêSû!H÷dƒ÷sèÁîñméûBî§8x^ŃWñÞtƒyÃCíàZ<¸®Å{±À¾;)ËÑ÷V›-¿·{åàíøû÷ƒñ°œ}?)/¿Oz£M¹ Ÿã½ëo"oîîý>¸™Ï6a¯ÌUzà¾&j֜¸rh¿µsËEÜ³ûêÉ ÷SØ8w ]Èö¥S¿‘ïó±²ìËq5ü/{ë™Þ–}«L>Ó9™ŸŸž?üvk5²6ÎÐå'ïÜæ»uº½ïwùɃ'êà‰:x¢ž¨ƒ'êà‰:x¢ž¨]öDy¿“óDy·:¤ž¨}3´ž¨»òDÝßVyßÑñ/Å¿v捶‡à`{ØÝx͙m¼NÚƒ?ݾëUMö¤òL‹ª&‡Ê3»OўTžié¸7›ñRufÛ:~û±-³W½Á¦ÇaOމ=ùP î°'ïô¬Û“=y;;ë°/ïÔ¾ÜzçÚ·-ùP®åž¼yíûPî#;³yˆà¾Ðêhgýk‹´®:;TÞ¸Ã}ù^ˆk^ÞïŽ*oÜçÆôPŠT4¿¼ý²ù-õØö¾¦a Š>´ èÞH}…ã««i9ƒå3)/ÛIû=5X^"Å_°µòCþ%˜-»6\Ÿ-t±w#u00÷ÏÀ*ù¦ñ$þupÙ&£Ñ7¿·­ô ´„n>œ-ô¼{TóZ‘ÔB¿G]<öp|šêï÷#KÒ²äºl•©Êíî›u:Ãîbûæ¾Éî›ýÓÑóç¾iAÑÁ}spßÜ7û0ä_‚S`׆ëà¾9¸oŽûæKôq€õ<³úò´¿Áõe\MzýYoøãxÐâT„{¼éØóËî©TÀÙl0k1âSlþf0lsP¾òÐ}‘št›×ºèM˧“òÏËQ¿…Þ¿ðؽ9Œšçuæ7/í ßf4ãgî‹Äþ'ÍA¼’š»,÷ÍÙӂ´CñüZÅ¡dÙΕ,k±¡\MÆ7-[ß]Íoµš[h:ãû£éÁWa{EØZ¨a‡lMé<Ô`{ˆ5ØîÏ-¶E²Oå{3Ÿ\̇VX<Wê¡,Ò^žôlcêì—ó{«Ÿs ¯Í!eð¹Ó[ æ~$ ¶ hoÒ.'¿&åp>z{¾¡ Ä^¥ ¶‘%_XÊଡ’xˆèì~D'ùRB:ÍóÔö5¢Ëò¡'uìӃ}zÏöi«ev°PêÁB=X¨ u7,ÔæÚîÁBÝc õuølÔæböÛDmNçÁD=˜¨õ`¢LÔ=4Q¿yü\$ç?Œ.ÙTE˜ÐùãÑ+‹/Î<òðc¸5þåë¯~¼ux”ûñìÃÍÅxh»t\^ÊÑU9¼„BÃAù¯ÿ,GGPÓa8»þëÿô¯Ë—ïmŸ¿N:¿þ*éüòë×_Íéÿ6Ž<øKøGtüï/àÛ¿ÛOÿ´°_;ªó¢ó÷$Ë¯Eç—×ð›íQÖM’D£¢sc¿ÁßÓ¯¿:⦛i#Sø +ÿƒ¯™Ôø9ëœØE'ÆE‡£g°M­àÏix~¡æð5|F¤øà)þ¥_¢G]¶m¯€K|n½?¦+­ þU¶ücWᯣ‰~9 +͏r÷nû×½>ÀR«?â~=ÊQG¹#„‹É=ƒrǟã ¤oÁ̺켝ô`Ägô;«£Æ͍ý{l‡ç(b“DtŽ„Å(e'L!UÇJu~¹©´”¢¾e¦;Çý¦8›á”âÄQ8>¶“ñ'¶¤k¢IˆŒºq³ª:G8ÍÄ´#ϵè/S4z [ýڅ‡ý{¬4ÒQ¢ŽÑ0¯9Ù|ä,*™Ty§Ëéâȉ¢¾e&—Fn5Îãf8¥©ŽÜ·ßu~ùÐûØJª¤›*‡AÏR;Sì)´ÐöƒÎÓLÀáÿ¿ô–eHÙÍe.ҎêJ• +\£GðYf0÷ü0Äð¹°ÝÊúhJíhÝ)Rð͹ÝÁfÕ}ú›óo-L®Ó"|ÇǏ!ðõxJd|sòýÜ÷ ÐÒknÂë:VG@Ôl ÝúÞÊnª3Q¨¦½ýi*R3ìN“¾‚²@“Ñ¿ÝŽ'³7´I~sžtÇÃj£QïbX>›.½^ð͹XFõÚn]ÓÙ;!T]Ý)ýß`"Üá¬T•Yiª?(]CšªLʅ'j(’ž ééI<ô÷nç¤Z¹ÊÔªU¦V®²iO‘öѸÐß»œƒjãS«Ö˜Ú¸ÆêèKü”~šI?ï’ð÷§Ÿ¨ —ªþ d U¢2Z O,#-ґ’8 +üŸ»ybÕJ«V’Xµ’êIюgßtü`ø?w9åÄÊ%$V-!±r Ց‚¢ìÿ +¯aÐ_$‡DݝL1§Ԍ‹Wª–©¡'–ÆÅý°D N1íf“vs+¥?w:ÅHQ ¤Ô¬–RÔ&R´#Åëº~0üŸ;œbŸzLbEäöLº…”BäØ10^D!…XÎÛéôÁ› [ð j¢ ËÐâÎvv2ÞÙÿ•¾=8½¼Ë¬—N°SÀ<ò†Ú*75¶ +1«†Àl0>öaªŠ²qShIÙA¥º¦­Î»Ë~ÂÕx—4¡Uxe±4–;dÒ£5ŸÐ?é}˜ô“ñíåø×Q­AïÝüήßÚÙ_t‹T +;FèA¿YÐQÖUø!†å]¡3£:y7ÓÚ@˜À7ʨNÐÏK®ú€ê ´û +´Ó{€d6F}] clôÆÂ7â~¼ù¾ÿE@D4ˆ˜@xyw²Ö»g÷“˜"kêÝsBˆzš‡!.%ºÈfé™n†?0 êÃâa @x9åPÛ~lxó0Y˜ Œ +ž”n •çRAu¾8«À¿<ùD¤Z¢5ã1”-ò¨©OþÒ\di.ºYšØJ‹$#É*pˆƒ,ã?z¾Ø)儬ýbq¤+ŸJì«D’G¡´mû®ã&ïRzá5,~ïjšþÛJ9ÞW%ÄÞyôãxöºì'—v輸_9RK"úäñóg~¸ß\'7î7ê´á—ã‹òüñóâÜöùlöaXž‡·/.A+¿Ê?ï¿+G‹ÊþBBH¾*W>­¢+²Ää9ËL¢s˜^yžIS*[­KÁ ØM´ÎÐ6…¯ÚÊ‘Z£·è¦‰ÀÜ“¤Ö”Yøl…¦•Yfè4€„ì¦2„Âí¬…%I ífhW·h0f]™‡×ò®1™r=)¬1”Šn‘—@â-Cϩ׍*¯:ZìÌÑb‡a—©¡ë(&¿/òæ(æÜQÌUÖð]Ú>`þŠýb;”Zûá?ÜO–ÔÌhȆðXALƒÙ"3úxBúïLpāÚï¡}@_ªoŠ:zwâ¦õ;¦é}ð’X† ©V}•i–:%&Qº Ó’¦›'º;–žtBJ‡–HÉMáຆvûÓ5€xŒVAñéò»\°Yôú£ +€ ØûDxùâ÷*RË~Û[àëÿ•FÊÀÓ²C»lî[W«´ %Æ°yAŸyÙo]-•°O,ÓÜ¥€b{xõ û¾v˕#²ŽÊ;ʲ_ GFn»ÿ¹eûƒÑ»Þüjúkïm½„ÿ Â]ØÖAoˆà‰œç·H$OePÃd³óÖ¤BÁÔÈ­@1ô¯(Tª@ÊäfZbWW^ä’£î +Ìý<Á×;˜•-IîœÍd0s;OKØcÜwi¿[ cߝâ#ÈSçõq=$Ði ʜ£‡`B”¢‰Êœø)4(¶ö­*·bvôHZ€†ç½cƒÐћv³D>Rm7Œq)¢$ªáÚIy‚Ù^eÐÆc·Ç½Œ¾ûíÆÑ¢B< $ +}Gì¾eEq¼Hàƒ]‰EnR¤(hyæM߁ó¾/âûj‡J-”¾¦ø^K l2^zÚÍ¥ÊÄrb@‚Ï=ÍaJ$y’xÉimÃDÙ~Û}#×>³Øp¼r½£Gk@ŒÍIÑÌÂÓ4ã¦ö–'&‡¼ÁðtuÊOùÉÌ©TË +0<‹¢ÚÎ[+Aì\Nä@Á[rRv¥1)ÊH†Eý¦Gk@„ͽœ”*IӘ†ÁÒ³¨ã¹n'¿ÌÓʚ^²„-Ä%¬iíÖ±ýô|ôï1^ýÑ`'t쪴*W¾+\qhnzHN¯ñp… ëÁ½Äï£b¬ÐâÖ¦Ë2+t +Do!uÄã ~.â Tû¼Ñ1yöé"Mø)û'·F8é+¿•¾_ô´ï·Çè²íp›÷TàKèiúÊØ àßNOû¾UûîèÙ±ÍÔvM*ÝÑV4©†mUê·U£ùÙ·Õ§ƒáMý1ˆÊ¶Ú|“ÄÀˆSÁî;ð·ðIÊö3æìì4‚Á‡ÔN øgë`ѳWÞ¦ƒ¥“9:é%L)% +»Ufv#­ѓküÜÊû-T½ßB‚èR¸é›¦UÆS€Àé Cüv „î2Ø7­v+]5·ÀT*Yÿ¬±«Èî”öÙ³š]ìÏÊþ,w–’²ú̊÷ÚÎå…ǵ6Ý$…<õHç7™(ÐߨEšä+ž•€Ybæ øûðÑf]`÷i—™ØÝ{ü4>×ðS“„äG/zÓw îç£÷ådV^..ғáàöÖ®‹Eø“Á–,µÿåÏðïþÁƒEv ”âo¸>^÷¦î@Ò¹íŸèüòÌùÜÊ÷¼›êCç—òwžG˜[„ÿül»–ò/×kÈ5tÿË£y¥:ôÆ>}ƒzқõþdW›Ì¿þê—ç_ýá£ÿóÿ{åþ/ü¾úçÿþïÏóûŠŽ~?üþ‡]˜Ÿëß´¾>î? ìÎR%Ú_X|Yh^?®’ª‘¸è<ÿþû‡ÈÙª&ñÍ9Jå Pœÿòÿz…ÄßP!:µö9KØïñù2J'Þ$ˆÔ͊D‚¡„8°¨‡,´ðBýßæ®gÛ»ÀK÷ç-B—5“oÎët“k"C=´‚áÊ¡YVP"h¤X,ËJJFjÊ7ç ¨­U«÷n¯¬|sþ1êÊ7磰|sþ*Kӎ×*-ߜ?u3ÈEî\„~µÂÂg¿­òðøyçñ|6î¸%9ø½ 1¡åèÚˋi9y_^ž[þܵšV—ïÇ£ñ¨SÈÂÍøÅT¦$ +s$© •ý`- ;ÓÂHðSà±ZüÛÒ!fr–æó‹¤,4YÝ LàPŸý›'näÎqd§4þB€¯³'© +ÀS”B©øQ;¡œK€°GìƒG恲+`DO€©Á´(Bo?8O÷‚ ˆMð«æ=Ž¨ð(ÓÍè#ö⤎gdÌp*ڑe™ +ÏÝ,zˆÀ wÁšÞuǝ·«½Èò¼Ú{po#*µð¬îZτÀ¬dXÄɆ¤2jæ÷ f$÷5æ$“Äϲ=úÀœ\âyØì3W‹9ý¤ïŠœV™_¶#¹ZXS°!DXá¤ýX¤&šÀb0w!à!Ìˌ˜wºØ£gŽp/*’ˆú[‘DDVDL:I¢$Ñ"×NÉ¿›WÔM†´ZY$r±C€ÌÑE…“VùÃÓ'Á+›VØ §@ešG ¼!NFÀÀÉ +H 艡'¹»#™&‚ªîø;qq‰[ÛL‹l‰1 ÉÔ‹Žyfwv¡²ª”Tv·L¤©ð0µ$%iÄ´›)8:ʨc10ÀÿbÈ˜‰üúˆyÜ͈yL Áµsü˜·Ä%ǼÜÊ ,1/†!…y$U‘¹E+²¼Â<ãrbÞY½Mšxͺ¹Î”˜cñ.ÀïbPȘ‰ôöˆuÜɈuL Á­qüX·Ä#¿W uYÐ@!ÂæﯰŠi^ÝP ΠT•wðþ4—ÐÁ,xˆwxÀDÆL<à×Nj–º1iá™Z9úNÌ[âRˆÔ 2ûWèÜTtÆÂ*¢¹×$P½*ºV³ÈƒÊHßc‘`±ÂžóJ_ÀìôúX]D£,3mþ:{Ï£†Xñ›¾Ÿ‘ªH XS ÏsàëOj¸ä™GjNÌ<‚1‰¤C1¼¢3²˜y¤¶ñs¤Ø1fÄÌcXļæH$ÔÌzÌ<ß͘yD +?Ç Ì€™·È¥]0fÁ˜DR›˜ ¤\ÅÜ#-,æéjü Wæ³ÿóŽ@ëÈÑGh™ôî˜sÔǘuD?ÈäêÀ¬[äтòWY´––ߦÃâóšTÌ:R¹b֑bÆ’êƨ 3a÷"˜£‘P3èý•UëûYY¶ž˜°l‰¼l ,Û>Uµ½ˆ{’yå($½ˆX@ºSÄ:Ö±"Ö±&F0ÖÕ1"ÖX`] Cú5q€ß±ŽºqŽ(! ŒD¼ÑwbÛ"ªê]Ä5q¤õ¤4E\#Ý*bé_"ýŒ°Ò÷ˆc + ‹@Ha%ºéÅ·¨{·ˆ1Ñkô¸µÈ—ª>q‹@DWÎ…£›ô¤ˆ[^›Š˜E +H!#¤ô=bƒ³"’EX‰lÿވWÔ¹ˆWyõb’=Òè;ñj‘+U.⁈,Ryx=zµ(âiO³HÃ⧼ÆXý÷ˆY +̊@Ωì±ÝôâxúîEÜ" +ø)"š°†ïÄ­E¾œnNIü´ñÙÄ;ñï4N›tðŸt¤5ŒqZn ×ÐýÛ$N›õÑaZJ¢ÿýwøþ±?þ¡ú?útøÏá?üŸš9ô‡»™}«Üö?‡`h}0ÔÅAkƒ4 àæa¹\ Ô8ð6¡÷äR°fÜ&\.lÅ[…lêxˆGn‹¢˜\NŒ§Ð3FsìÓuñœp‹ˆŽ}².¦cÁÛFuðÑå¸Î¸Ed‰[Ší t«èN׎@mØgÜ&ðc­ ý x›à>¸þ©B[€²å‚· +Õqp=Ãë¢C à6ñ!ûh]„ÁÛňðÑå(ѸEœ©[Ž!x«XQ×2½.ˆT…6#ÙÔ’¼e( ­ &-€[„“¬@­ (Á[„”j¸·–×u±¦*´y´ NÍ.Ǜ hÎ6'xn9æT…6Ž:IËq'€nyªáÚZׅ¤ªÐæA)HZ +Kp›Àd.-‡¦ªÐ¦Á) h9<Ð-T5<[¯™ÔD®ªÐæ±+û\Mô +¡[įð¹¥VÚ8†…$-E±Ú>ŽUõ [ár€+‚¶ qEÚvädŠ”íVa®H§ŽœMUhóPWP³#ŸS¤e‹6á®®­çqM,‚¶‰„Eêt•Ç[EÃ"¹Êã­"bA®òx«¨X ךéÐUo0‹ôç*“·š-¹Êámg‘â\åðVÁ³ž5Sš$Å6qµHa®rx«ØZ¤W™¼U|-ҔdÅ61¶¾5Ғ+LÞ"üiÈo‚‹Ôà +‡· ÃÕ¸Âà-BqËüj¤W˜»E”.¨ÄÞn© Šo…¯[Dë‚.\aê»e>5҃+LÝ"˜Ç:p…§[ô‚¦[áiû ^P~+,Ý"°·Ì¥FŠo…¥[Äü‚Ò[áéq¿ ÚVxºEì/h»¦nÿ[æÓZ¦®®UøyAäΎnu"ú¯“òr0{כÌÊú2#‹ç,>aÅ,vájø§®Z’, +wÕÖBÀ/îÆ/ühw]W[Á}µßì.LßýløÄý)]µ$‰Éøá«ѯÑCӉ«n½¢Úß3úD˜"J<'.ajq`šL§ùµñÒÿ‡NÿžøÊ=>w<ü|=uäPaÛ¢ÒÁå¯|²Ü5u¿¡¯™g~ç(à¦øÒ ÿ:Ž *þ â'=Âߋ0NÕ¯;\Ê]ˆÏ^®àÕË3qôæñٛ‚b>`J¤¢p“CZ})Ū[¤Ú¥@,µ/R)Î/‘®I»™[ÞX>ÐU³Ð4õEt”+#¯–\ÇÊ®KPÛù•-5–6AÕl‘ +1ºŠTå»ÁWå_£_d€ÏoKÜ£PœÅq…*’zÈi€˜¨¯¹¯œT Oby#è}  ®D¹šÌ7e\êYÔn¡³;»ÌL7µ²*…$PçF¨’¹:bÙç/Àõj|ûÓmå +ÕÚÊêíoOê†¤™/ì$\eNWüލZ}–áóQÜè(Í»Fà·#…çáÌl’'üÕç¸Âg—/Š±îŸø8<XVc¢§¡þ[åºð[G¹‡þ¥§ô‘šÐ£ÐӘè“P r”ˆë†>ú+Üg,¨ü4Ç2a¼QÄ3$ÁÝEúÏÄ5‘¦Ñgÿ0> xsºÖ¿Üu*ô„岃£–époŽÞ ÓêGßîçi<ð‰ç,b…¯Tè1á„;tz—Á‚“óh‰Ï `—)¬]¼V¯jkÄâEkñ.^ »¯T›/…9xSenÌôh,¢Š†.â>1Ÿ†šgC4F'·¨C'wqí«L/^͋ÔñRWÆ´b¼ã®¾µ)–/äX‹û¸9n©/Á¢q¸‰VÚ/µh ‡‰}fö₌—ª¾“ÊʎüQ< Vñ_´â–ÕX_$uü÷Wµ6Y=ÿWâ>nŽ{‘ÿY5ʋÙÎá‚r£Žsޗ1”Xæ3g8ŸâN< +ÿ¥+?eŒX…i±byb“è£oq1•>¥‡Eu,ψuåÐö¡ØtÚ-ŒœÔ×u©·ŸUz}v¶öfØOhxÀ¥:ËðFí"Í黃Yù €/V+7©F·SŽ6ÜÃ]ô—:@ìL‰,´)¼'”±€^ÕÇ]fß ”KûB,Ѕ\ˆð&ôñ(“ë7¢3–Eªúk +«?úåÅéOϟtþÔù¶?˜ô‡åyzþ]³+íÐÙìÕÑM»I.Ðeš•:?JÒMsa×>É¥$–k6V?Ó Ú@*¹¬ºvÖXnR(pà¦8¼Ê—d̋6JÛ8I=»¡¦Åç*»Z¾e~J Ä¯ҟ˜s@(m²Ì›h¶?"ÇK¼ pðwà¯1½’a¹íEjN– tK܎•°(b²3kK( qì+³"©™g8rGp†Ë{²¿™,Å e¦À¦=‚ÅBçÔ}„I!]EEbSœM†|ý®&¸ý%M¡3ÕN,÷sƒ€º+ nH;JXÉ—‘ ¼¨º(tþÙ%Ð'¶¿ìfæns7[ælWES»“y \yÁv’¬¾HR^d‡í/÷˜H°\.às֎ûpʯT Y&Ñ!ºƒX½›Ñ#~+ šº{zÑYS Îp¤ÎJX…NË¥w'Ô£„ˆ¦OÐÖH®ô|äÑàmXˆélž‰H³£‡QëCFÒ{hߦ'Þ咱-Âe[û‰'åܞ,¯èQxÉI½ÍSײÞâY³ÆÞ©k¹ÊÚ©Üõñì¦ÊKÖ~W|ŒG£2NÌà#âpe˜—怛'ñD©û@Sk†Ö,™U~úðì‰=ž Éý»²§´hpÅÕhóP|¬®e–7Ðã çâè¯À¹¨Áïµ¾ª:Yªjúù7Š¹Ý –êäóÿ>ƒÂ +u ­Ê[¥U}µ ¼+Óƒ—…ÆBá¹sËBÂYêJp%\lRíõU¡T¹¯I!ÁyŒÕ‰ ` JÄJ¬~Rdv'°çWƒK VœU׌Hâk? «çÁ_„ˆ,ÛÐu•ôڗI!g÷Vxª€Øªµó¬‚ã. ±ÝµÓUCIæÂu ªjx2‰põ “f®5fCR‘D€eŒÇ´À¥!é@u'~ŠÊéŸúâ‡þØäKŸ™Òr€!·fyܺÅÈafÝÒعôµÖ£g«?ÌHÚb]Òãâúš­G±†kˆ M™ŸÜ€¸Ñúæ<¯¥ëÒCŠ­Q!ý.èâö©,t80‘jȓ0].ýïÍRбð*EÐ*ÚÕÀ+'/™–Ÿâ¸¼á℟'*§»ã=0 +v¤ÎâÑ:‘Ìt‹¯ßÃ+ðfRY ÉwìJ…°àÕF +ÙZ1 +‚ÜišàmEIQ‹ âtv#ÓJªÜ?#3k¯)íºtg˜eÃ4ogeôýÄÕ³@²«Ò¢€Êp¢Z“ÉÀøٞK)¨R$q(ûX¨"Úݶc硸jœ¡™¤.|>q6jž¡¾c'²† Œ™Îtg²f‰'X©͈ð[ê2Qᬼ]1ṕŽà~ »À)t žÊ®Ê2¼Ð Êô»ŽX;Á#M.æn!Bä>îÉX1¡ +¼¦ÂšÚ°ÈN°¤F‘ÃzvD…Á+'ð9«:9$½ó®iK ³±sKk8ââ=öU(iTW !SúŽÖ¨µc҂é׎H,A*`eçÊ_´€ºÙ ތaMa°nàn"wšU®åЩ«(kE–ó—`ÀžÂš¨.\»¤ ÷¼2ÁÌ;ï‰v©:'x c.©­Ãh å`™“Œ ’D™¥Ñ;©ÑP¸ÔΎš€º£Í.µSxQ÷ò¶K¶½¶;€lÊ@²¯é(È ÖîÂ.©?rÛÞÅii;ZÙOµÆ}²…aï쬮SÀ$] +«6õ¦†¤ÿp‚Žd¼…¿;2Þ ÄßáA»ïRùƄ—™Ç濃‹ÞßÈ#õJ>ÏݝH€Vº)¸ú¹Kø-î3Ðғñå¼…•Y@‹_|OÜ•<áÞ ½ø•z·ÊúÒ-Œoá)ОÒa²z‰q?b!âe{ /¤Ì7=šx¥Ê¢‰Ö⽋6[³÷ÖÞxº¯¬Ì’›è;O£Ê$‹g`Í åًŸ«óº2åu4ØÕùW3KUuJÞExŸÖ00gÞ«š1‡2Üp2xý£™©óï]²Ó½·vÌ}4 o¶¨ææÇ[EÀj6Pv:;ÀÏ +'KŠšiBÃrS»,£KæéPôЕUZó*zòf 7|͗ñր¢‡ö?æfu=¼¨ÿ‚ w»Êû¹âõMùÛ좜”ƒþõùÓñ»ùtU@î5Úy– 44rȄsVFƒ­™¡ð(E.S«'þòxՖ +k‘Z9´¼³¸–å$Vaäo§ô툾Ö|£/S7³èÕ  s»,~ýÚ@pYÑ澝ҷ#úZó¾L÷| +¸7Ó*exf§€[<Þ'Ÿ? îÎ;O{ïǓÁ¬u®£ßçWÿú¯š)? Îd.`·z'\×øsÂ]ô  wû¸Hð–îºlÑÍDNùÑrL )N֘Ìý‚÷1&]w¶†ÏaCª¢tB¦YႿ`Uôh5ؽÒAœ™­ÁG£L05³–ºÊwO£îdŸ«_wÑ:‰yF¨}1FUXØ:4<C*œœ¶€Üù]høÇ/çn©äFڎ\.i.¶(d…à:ȀëÄ&û×Zâ&pÆEc:¼ç·S–ŒƧ¨KgB»+þRWEE'*GÝØe¹¶?À;¯v'9žÐ³6¤ 2Ã}›hiF0HGÎSŒÅCÑáî5AŸñïâû”b¼÷ÄåÀPß ŸF›â„v¼C°G&.v‚#b'ŠÐ0)˜“{0]®¶0•Â£A[3Pô±*¡;N°Ô²D¸Ûza€ÑÏAŽuI;7úm|3 ²p±{B&eô:˜ÍÈé¨l„„~㽬*­Ë'u.ÏL_"ó ¹t”Ê°î₨¼BS +²Ã³™„{ce7› ¦‹ç ¸8UD3u&ä4h¼S1“àßߊK¦†“>™]"J[[[uHa`žA‰»ñãûºð×9È.SQ¯—ÌEz¸NS¼;;CÒéd¥sû›óZYÎÇ-¥8>k䀷”h®3[É4w¼} ©ó%–kp\rI²Á‘¸¶²Ín¯[I7ûÜVòÍê5ÎAÛË8|nIÊYhœ³šìV’Î>W#ëÛÒŽÏl#ïðØæV¥o#óÜ|ßFê¹E¶•Üƒ0Oäð6²N3·•~p®uIþº$!v³… Ä•!Z’q´Ä{öðò¬"w…FÛƈÒ20sƕñ#áB¥N4à N#jaôè©SLÑC]P¨4~´„<4™O=ŎԀ¢qdaȖAQ/é<]³kÔð$cø“­ | Ðèe."·È›u? ¨FìݪV¯áSVúTëxví¤×=ƒ¨VÑQvAf9zݍDZ¥’ŸÜ¡€5AϏ^M£™EqtäáhçÅ¿|ýՏ·ø[î~{5œÛ_^üӚÇÖÄ#˝ãÉ|zÝyÑõޖ“ÎËÉ%8í7üØq¿žô†ÃÁÛIïözÐ÷MßXN?꼞.;G´ójÖ}´Ôø»Žíñ·õX ±ö™…ÖOŽa¯mÒñ3v–¼YV_WøëøzXNgƒ«µ»/i+Æ(z9„ýèòê +üŸÿïúoùòÊ$u/·ŸñîÿÁsþI;†÷§´òöFäßõxÕ­9œ¼êà›Ö +=˜Gú/pìQÇ5 ¾#ÁŸˆO|NrV-÷ïx©9?–¿R뎨~M—¾Âa*»·¶`AjûMB¡È­J+/’•¼øC[¸ßì(žÍ>Øûú«Gá7Øh¿}<ü0öϝ}×yô£@Ø®=¶{ñû’=:ß܎í}:Z’ñ¹“ëÞ`ÔqMØEšù6„þÑσéÀnLj´ÉÙ¬×× +Éqo:èW0LÆïÊ6($þ4|9ñÖXù°lÏ^—ý±Ý/ñW×Ðs£ÓÂJJá£'åUçûÎ×_u¾p¡fð}_Þ±úAçÑ«ÞdVKåÉxt9̚¸Ðފãëyèg^ò„únyvwþ.ºÆGÔÜ' A:~š±tn[ù™¡é¹OÈaVš–?¼/G///[pþS³ ¶î$W˜lœå!d?h#ÜM¸™5ÑÑop¼%7/”y[_üÝòh=·¥ÝÈîŽcˆo‹µÑP¬%Ê>óÃoeq?"Š‘‰ÖË>HË;éÉ⻝ÔKϗWWÓröŽËJß>çhn'Ýò7¨±äv7¸5…ØhUŠÑl>y_N¦ýëAyaÝ?uN-c~¸º*ßÙwÍîöI&ø'—ù«¼h»³í=„yöP)lµOuÒ<÷ª³ÁÍí0ìU<s¨«©i>BŽ©*>bV¾²kpÖ¤sÅÆÎAf³N1#!ÇóØ.O!$™¨«ÝBZ%©øÔ=F—øaë?lý‡­ÿ°õocî}”«ƒNpÐ éx +îobõ[ÇkÀÛ9OFVÖßÉÖñCÿ]9êô.&q9ŠwŠõƒ#º"Õ҅ó:ßBºü|ºf1œ—Þyù1œ9¸Ó>Z$åû¡WÖð.¯aT±’Ô$h&R'è6§`&*¨å±øw‡ên㌯~½ƒ]óopH¥ìüµ7š•Í÷L8 ¬sÚ3_oÚ3¿\YVdÙA–=H}d§¤QÕ Òh¥4:ö斒ËñhÒ»¾)÷$j¹ b h¦2q—Z #MáÏã†ó™FK¸µ)Då—j +;ðjfºæ¦¸+‘voÒIfà¤mW™g`‹¤À³P8D¸ÂƘŒJ )²5Œ•QY–Á½vNimDî§Rjd@AÕä4|ZÃ!¨˜üdò çMWI¼6Ä»Fñ 40<£0¿L¾Ñ5 ‚"Y’C¹IÓ\`ZaR*D`擄ìB”Z¯áŒºK¶|'áý-Ï4Ó)æQë¯ø†ºNâwS7ã,ßM¦ Ê{Èæ”k8ýI'à'V\,ÁŸNuy°Hgi^À$I“Š¢ú¥éö;¸&S@ +PYS(á·zêd{=u¤>̝ÖsG©<‡OBŽ¸›8šƒÌg9äÚù©Vγßóæ³L›ƒ'à™hc?ÿ»5'#μ» Làtª=ç!^(Ž9!©’Y.ÚîˆÂê£Ý´H¾¼c‰È +4˜“B:ݼ(2-)A1·uÌÚáÈÍ !Oýk åäz2¾ÙO9¹k)hëOŠnp·¯x¬Ûܮȼô\ ÊÛÁhZ?*×òѳ—ÿ|m§ÊŸ: Çy;›èzŸw„›“ðGœ¥EBNþÇ£·a™z¿? À¨œ:׿&𓁥¹ï»ðø“òÖ®éËQþöso2õ‚+½.‡=˜ÒoÆøÛ"y~ úã˲EŠéëå'הL¤®ûöÚ?QHÜZÁæq=øçöêÓ;byø‹’>·éqŽ + ·Y«Ó…6øA'"ŜTp=ƒ=êÝõ‹ÖMC›|»Iøý‹N¹l8¿}}'áËWW½Ë'¯·IB¤"'ÿÍn‘ŠÖÌÍppƒ(nWyøøj:k±|›ÉGl&rÏ6¿.ý͞kÖjšÉ<;lÛl㚟eËØÏíM1(].ëJ—'Éúâ宐÷>žv ç“èÓM"é܃œCú~NmíÑø§ùgþ/ÞtÖ¿.­d.ӛÿë?ËQ¤Òì¡gèàAßàÿ:Á¼A9‡ïφã_ïЬ®£ÿ•¦f›òb8º¬úÄ.†soÂ@©@2(o{ýïVˆáV—£|Œ ~Úºžñ óiùêìô˜z,22Ÿáp,ÜÔ¿Ýö¬P=.¯Æ“²ó³µÀwÈRØ™<콝ö¯¡XÝ!ÿ÷ ‡²~2ßvή{—w'ˆ«‹§éÙb/¬úӉ“­ì¾»O~wB™]—½É»j£÷ådV•†·½Ëǃp?w/ÜÿneëÈΟË4(ñӉ|ƒ8¦wª%YtVÕÁš¤?Œ.£Š¤›K›¾ê K»¯.š÷ûÛ¿¿êM§åäÆ®±rôï¿ü¬«þðõW¯úu\‚£IÿúOú¹Å’ÙñkÏ.vÆ\_òëÛ×ώ;¯Ç3~E’ ¸÷È´Py‡,Wnþ¬^pûLš ’Á¸ 'ÿú¯·ÔÂîV´®:u‡4¥ðÀɇ^hŸçi†9«&+D•ì í့—YáŽÔÂýÙþö:Qmÿ¢÷Öå=~Dd…%H5ya0ÉC)VÃ4ʟ²ÉrLÉtÜF¸‰2LR-ºÄç%9ÄÈã5-5B-þÒÉ#5¿> ´ø@Ù_77Ú²‰oXyøå¤=¸,ˏsӀ€TðãkDv6¶/˜4@å®Dôl<¼t¹%QqS‡luR{„“×]KÿÔºKŸómi{üöÙ¤7ŸÎæWà‘Wo[fnC‰m“R;eJxkye†|.9T;Qó$=L> ³:Ò4²B9Q—ºsðV& ØÐÖ´Â þOJ#¨,d›ÛE¦Sƒ–¶¦îÚv£ÆT=+â\÷RêÕâ×àbÁD¢ØÊsT]´™cŸ´{:n–Šÿ_Ñ +à_’A–YýBáöbªÐñ‡Äh¯_Pç?n‰M.ûoÒ +s¤W™Ü‰W»-i·«[ÕÆø.«l—ncÓéâviMK”ÕÒ†™S²ìè;cÆPÇ?Rãö`Ô\L_vëÊ°‡t?ƒtêÍíœÿO“%Q¨aÀv`ÿ V®táî‚)Î?«È›Ì›\ԣŬk$hgÁԖ±%¸]9,4-QR0Ôöß°ÿV^\õ&ñ +ôS܊|E‡@ÉĊý¢¢f)kú2R0í.’ò€à‚AµÊ놔 éòÔqJª&ÒÚ,©)nK–UYê=%+i­kŒi×7¬ ¯ôX\ðƒJjÅ&rX$ЕÆ]±kÕ¸3-©4p¼Ó©§îšw:ëYí‰ÄÙkÂ2“VhœhÒ8AˆÌd^y¤c£‘šKüɋ0åá{uüoìekw§Ðé`:«ú"—=ç듾®«T³t¸äëpïëøÚ¢eŸ¢ëі7&‰$¾UPýÁõ¾7œ] ÿõ,çã÷î²¼7½‹ÓÒ¶(ì§-›]”¨itþtün>à«ñíO·õX jq9þuĀãrW®Êáå9ðqP·Ž*¿¤g{³ùÍ›ÒÓOCdÖë3dÔÙÜ6ùû­.³w½É /¹úa0zכ_Mí½u¿¿zy&ŽÞ<>{ó|[}™<ôxUW¿[ºÆгk ëýäy2îÏí(Ïlÿ{x$Àc _nƒTÑu¢ÃÏÊÙü¶sÚ½[*:–ÉóÛp7¤‹Ëòò´¼šýÜΣ›#݉åýãIÙsÁPÿã£Ç“Iïʞ˜ÂnÜîFüx…ž»òõ|XN^N–¼…·øüÝéùæüÛÿ‰%¯F~8á´Å¤_ðçûւhyõøµIc×þøgC7^—Ã7ã×®®K¯ÆÓô–þÑ#+SŒhþœ½pá›çS»Ò.Æv­?)¯zóá,êê÷ôç[jƒÌ$ÎþòâôGKã +ÞÚ§~»Žlƒ#+7&ƒ‹ùŒ/ñ¬ ÊgAsGo‰ÚY}Þ*Ï%MšÓô3ü3 —‘~ûÿŒ¦çï{“é÷Qéú¸íûhBãÓ GñøPË?>$VÆ£² —†c+¸.±‰šÞåÄݞÀ‹ÁèÒvX4!ÒÎ+Ý¢l@hÜü.'ÅÇ3E¬gJ3V à>àF+£ÉHßûDh/þô¾¹X€¶»1áÎ¾µóÇ7; þ>éýÓ´{P…ì:l>S?Ǻ9ƒ ^v«?k)O¯~݁ù½’| +W«?˜±—™ÑÝÂ^³_I÷¯ƒK8¦Ú`à}˝ßÖ21ÝBäÉûЈ´;¶¶&Kg ú­Ù"Ý‚²Üt $¥l"뺼½n´pӝ Ö•”]ŒgVÉÙî h\~hgô ”gãù¤_C*öÉÌb+&5?W8ëMޖ3«i€ÛjúüI£ ±üÐNLÿo_ýøLª§ãÉMoÕâ­Ð~5–k[W©Ž›?$B²QjÌ&½Ñô¶g1ö›maÕvcrü§øŸ&ãù'ãáx҈ڸùNкyD£Y9öú ÝCqó=¡p4~Ñn«ì •W˜ÞßpCãÙ¿7KìÏkzWw¶èÒøv6¸üŽ…Avªc֚߉~ܔ³ÞeoÖ»ƒÎݙÿqéÃuVdÔúµ"&eì¶wy¹(nðNš*lz;ž-ÂzÃ-lC"çòvÐõ0E'¸ÆÃIèÛãçÇóÙ¸óº7µRcðû’PÂè$Ðy7÷ߍç³ÎÛÉ8ŽKÖµLÇÃÞ¬ì\À!ªòSi]tn{·å¤3Ü̇¡&N˜.Фçƒn~$³eÔ VCl¿—Ó¡¥’ùJli{7oÜöí¤äI´±qÁ™Ö©^ÝTÄ}ØØ6îÃÆÆ¡"Kó”›R´ù¤7zߛžv‰ÊP¾š”Órò¾ì@ü¿óÃå`Ö» 3Òö¾]ñÖ³Ÿ1eÂ4"œuâ8p85¼(§×<qFt^—vͣɑ&•G^Îg·vBnx¨; æüBð<úùÍø6þ‘=Zφã‹Þðuy;N+“•xvöôo“áà¶ófÜ¡`qíŽÑ؎_²l0T7ç³rø—ÞÌrötÜï ƒÓJzEëç Ó=Riÿþ\ÐðjR¡ºI7‰äÚ»Çϟ·CSjÑþJÃ!MfüÌze¼-1ñà™]ˆçÈçgьMÖ5<®_µm_ǫ́¶áËÛ^?ÌX¥×6~j•ßPCm]sð“,µÎWvåçAù«åæ“ÁtÖõ遪\bNÿbâÅâóg³'/4àûÓáx<‰Ø¹±mvbÃ*;å +œob·0œÙªoLŒg‡Î‹\¬i{\Y°,¨²ÎK˜Þh6è؝°7åÕـ»vE-úRÛX97‹&çš^6á%ºÙª33’ã^`Âòûÿæ=¸Óò=$hWEIýa)H¯«Úž”ÃáÉxÎÓI¯ž¼¸4~øm4˜te[@í'k° *Håjvýel%ûxô—Ø «tnVM,dD<³‚B!äù™UžÐ|a7®š/‰æ“Õu†ƒQٙb„iÍì«k=³ûå"b+G_õ&®àôՓ§PWÂ.êʆJ“¯Òö‡›‹òòÕd ž©¿–Öâ¤v.«R•f»ô¯—P6G0v¯†½Qéö±X,cÄÔÉϽÑ`zm'zŒbÕXܒ:y·„ÇúnЂ*OLP)8zoßjõ!»wGÂwÕ[ú°÷Ç¿þÍ*Po-+Y–Í£Âγù…]rOǶC¯AN–&#M­aÏÄy[ËÌÎS‘mÆkÖbe…­Ý}ñ¬€3vœÊ>eŠ#`²:T¥ÿçV@±<¹òÌ4œ\^ëá¤)tCNò,oÎȐ/ù|tYþvVöǣ˖=L¦›^„e͈­zŽIú؁fD ãœT•á~»Of Ÿœ­Ôt HþòæÅi‡œ"gãSÛ ’žKûvÝ#gv§EAz;ûc9mðÌó›ÞÛòEïöM%ð¶²ù›'ƒXue‡’ Ѓ6™)j3~/œõ†ÍŸ±JûlÐï ›ð +KXT" bÝp<õ‡óK°¦ÇXV»}Ö{êÔªAó°ƒe—F`DÂt2Ò½Z=¥jGbÓS”U,ŠV¥ô²¤Õc”‹Üôevˆ*öz‹W%ÔÃvüÈé±vCf¶{LÇΩ ¬X5Ûf „7²2iöŒëä +ÒÖ?ô¿’„'dÞòÁUsrãƒbÛ®¦Û>¸<€+ù_;‹ŸÌoíà9 —×v°ûoaƒð2¨óˋW«fĂ ã~ôfkÙýV/éâVŒ.Ç¿Ö‹ _øúT¢Ÿ«úþ·ÇƒáeG®žÖ’µ¸o…64é:±:³ÈÖÅ'ܛܥ ÞKjŒ‘Bo~O-ÅQ£â¹]ì­6x—æZ`×Ré®mŽ÷N­QDÎIÎêøöï/ÊËÁü&òœþ£2-…ì<~¾Ö•[uÉ@`|1Á¼ÿ±Õ…Ñ]zâÍ­×Usk±íKo^Ÿ­4Æ+ÍÞ+<6±s?úÙY†Ç‹–a¥íËEss3³Dç‡Wg-¸­7±ËálÈ/×x3êíVpÌ5jÈ2q‘g"ûŒÆÁ†ï FhnÃù¬ZgxÍä¼~‚ڏþ9¾èÞÚY?±³±cKíàÕ½ápC³é»Áí…%4 +ÀÕ¶›”pYJ ]œlhÚ‡ADՄP ¨N²è™ŠüÁˆpüßÇÏGWãNä÷ßÄñpöèoåÅ£Ÿ—åøы±ÝÍþ±ž ·DÔÕMl©ûÓÙ°{éß!ÌÈ ,‚çüQصÉC·—7öçá¨y¿n/›£w'=Â#uóáövâÛ­é4ò ¯j¡»|“ËbÓ8g:W¢›¯jXIj-ºf%Æl“Ý¡µøÉâìÏÆ´ëè\oD=‰:’'ºr’ëÛ»TUŠ'óIÿºófR.¬¤µœŒXntݲQE/¿°¿ÈÎÕ­*¼\ƒl;ç× [l·4)°F¾7ˆ›Ër:x;Š} rì¸ðùµkqbKt7i؛^ f7½Ûæ¯:0Ë´'ݛàº_Õ¤?AÙYH•XG4åÍÈÊú>Éz#k›O.»ã \ÄЫ†—k[^Ùݚ äb$¹¶Ù­?œ¼vbà‹ßv×OF߈μEëÅfSz1¶ ßo tÚ¿ö?¬c®Q´äÛ\l4³Rœ-²‚Ê÷«xۀ¾á:nßÞ¼ë–#ˆ…¯×ÐlÊÅn7Îelïä{´Xšßî +¹ÂóeVÐ×@*ÄeG1q4‚ +/$@¬0^ÿGNCÇZnO¿Š:%®Ší¥3ƒ§˜¨àì¼ö¢l”×ýù8MoÇ(€P\±O0¿ÄU{Ü,äå,…ï‹ÿš®Þ§X™g Ld%eûÊ1UÇ`á*:S6“úU“êW(xôâW|X”Ñèj`ÔÏÔ@£q[oå`˜†ÀëÊÄ.Ã6Ë ç‹6¿Ûç“KKXPh•Ý 7왩loÁÊyØñ¢°µÔyÞÓÙCM2.)lÚ8 w;¥–$l‰ìãINŒ“j˚ U´¥n½ZÈÚ☶ÙáñԞŽ`Ø%k&XLÏàˆ™<{f0 +xÌñ4¨Þ̧›çÑt±~®ïÐEV‡Í3x9=<㠑ÜÆŸ{z»Dë뀵<þ=ÝL@uÐ9pœ>gð®mÏà=ûö™êç¸ûïÿ Þ·Øà@ž·ê¿~.ÿ³=ŸÏœ†ëõó¿Á¯ÿ§ã9éx.lÒH·£†¢[ÍÖÿý¿ásªø0ªùÿ?«Ób>eF tüŸÿžŽ—¨5”óf4]‚3†í‹Õë# ~|Xì”X$oý>dYŽˆ(‘/qS™ÖÓ9¼‰LVqà #‰3^åæ Y…ˆiút¢‚¼NÄ4mk|Ĩ@hfHUõh˜*"×/8^ +¦c!Ûxß®¬"/*£^d'.½2£­l7Û1¼ kÿÞPwÆH²nQŒÓ§:¶{`– ØÔpGå*,¦jpLÏ9’(ÐC‚Ä•ÃDE%–õ!_ÌÐø¿·‡eRI`~ ŽÉÿ`žtˆ°¼:£>SB\‹à1÷WKl¹K‹ ï®Øú °)¤t\,ÏuXÆ6‡Gv¦p´Ü8‘«81Ú²ª*&¿ñ¬&‰åՃ=ÜØðpÊ­ˆö>¥¥ÃèG½,& ½]¿ä*cjt>³‚吡´ŽÚÓb¶`eùëˆ@ý)ÄG«¹\ÜQkôãQµQ$–KKLŒÛÑð¤‡éá6~Äzò°„‹™^µÂÇ3¯"i7À/Dâ¹TpmÌÞ!fîÂeaŸçt²§"MŽ‚ÉU!‚R7„ëæqŠƆÀÔ.-OS8k\Þø ‹ˆe ^6~ÏëÑf¸XU°)Á醡Mb€²é?²òå5†r嫒\?(ÃöÞTûœ1±H(Cujšð¼“ï6Þ©àSŠ¨íé5ÌR”ÞÃ@kNg©Ã*Åꨌ&œ\0Zp¢ž*ÞôνõĪ†Ok¤ýj ;¶¢ÛPµ'ã‡Üú74ßhŠYÍdL-†Ž£Þ×Ìg|ºP¼™‹V<±PùËX‰Îc6ãª^HGGÇô_zn#ôñpßa‰Gl»cüXr9˜x¸¬90­Š§ä<_+Ç#ži=µxŽÓ‡q~«<é€þtö%äïåNé¿ï¤§g·%ÖÛò1Q¨Ÿ~­QŸîœM{ôíäßÊØ`Ò3¢8íMïÎü­ÚçW¢‘r´¤¡âíBßñÈ2ûkkÚörΚr“ƒð•ý랞}·ýÉU|Õ Í’¿§Ô¯¿Gò0òcHÉò>‰ÛTG`ÐÇTÞ߂O†}º0)h’öÀŸ>Q·ë6Ô :ÃÉ€ þ™¬ãÌØ[3¥~=ƒp$ñâ6X“o¶kC®‘îõݼ€)E}\–O_ÛWÛ@TE“K³ÏNhkR&Èo]%íF Yµw€`|ðEõ‚š0ÄH[ð /Öh6BŠ´3%ª}ʖù¡zsu]@Áfl®tlþJwÔ~„'o}´šìˆAÕ¤—Z%‹ì¾¹!¦×ØjêAϼšdz€Ð xLÌãëùþƉFúϚž9KûÌphÔ'}£f-øþÒi&ª©ä{zV_ìãûïЀIzº…ОoÒË Hk+éé$ªÙô_{ZüùœáÙúežMÍ,$ÀaôÇïÿ˜l9€ú~]JT˖R6mž”(ì0¸¦¶$ÓÎQ³ÆZÃ=5¥¨/0Œ‡'m¢Q</''@.† f1: ÓUì j +¦¹dz“—¹ë'KÙ¯¸ÑAä'’M±Ø¬Ém°/\/>rñÅeƒ"ŸØïñŒðgƒ£ªXÎ%EÑMĺ ÿdM³’#AD=—YߏP#ácÄwþN³&ÃΜúõ},3Ö²#ËÑ+ØÝ-b6õÌj쮵LNgNÍ3GxÜüHø{®¶pÞó«¯sm.c·‚bË\NK)&ѨL¬€ÙDƒéd¹»/jŠµËuý3°y2.•óT.Éçôž5¿¯ÂÙ´·ç²Fs?ðš}nj`^ãY6“öú“>{µ…xƒÌ·ljÚù³³$ÿN“urµimßŽôQ²²ì2¶í›+k°û?³_#øÙ·!鳖iÖiNόyïö—b‰™V'Ïpt¡ôÝpgãó×ä÷?é‘緝h¾Œüv†ÄGãsø[Ù#ˆ»qçÃ5؉HriÚ-²‘iÂX}ïÃ2ÄÑÎŒu“Äèœ1½îÛÜÉ#x ÚtòÏÁ§õ‹k¸pœþ=Öy“äyõ™¨ÿSôÛ`â'ɧ ÉO ðƒ²!Iö΃DýÜðpoQcÈÓÀ“uü0¨%Ã7ª­‰US¿¿4ÔÅe3F”L»,ø3I%r’ ŠÝ× õ‰zaŽ}€OCæü_@0èGèqñÔ‘sЇ©Å~D}%‡qæ+Ãõ‹ÀP?ƒ/ÌÁwúù—BM(0i¦ø=ŽÏ¯·H7’Ï(þÖԇð×fšp8XW“$†›.ӊêr9I_Œ9594Mø՜¬Ó¿íé+ †é·,Ò,:Âê—Á~ñTP¿,.?xG¨s³¯Ê ̚C ‚_ìß º£aŸ3¹Ëàí¹a‘A¡¥þšcT FP'~Õª^,iOSf?DšԎŽó „S£Rþœ½sMÐÚ°kÎÍæ.@]¡¯ ®eÁ·…–´Wö7ŒK“cÀ ‘ A|2; ¼àö 76D-lo4¦ùØt«ˆ‚˜YW_y_à`) 3³ay(ºG9.Àß·•°?ƒC,OunßR`Ěâ¨åáU와ðÁ`ËÓô³¤sŒ °ä©z HábkŒf6/KÐb£T"^ ‹HÄ8¶Ë° Â4C­`A¿ø²¦%Ñh•6Ù¸qÚúÅ̅ŸKÁÄœÊórö§Ò e5Ç/1…ŒXa×0@NJ/ãm]sžZôñÌx¹7Pg&&»xOïÒj.ãXÛ2j”%=·›c”¬ù^0q‡)OÏ#tñ–ÑLýž?zéRiŸÄ§”L›t5^ïF@[“`¬He ½«AÄþ“Ýr ¨·N­ù(À­]flk8“>›ËŽ©¬dr4OO-™<&Ê5Šç ‡†–ú¾Ulº¸Äôb¨XWÙíL¬ÐAÇ~fß:+_ 80;P¼=N#‚ÁÕJÑõ ®UŠ®Öˆ Ô çG)ì<Í»¿ä4£ÀÊqÈÓëÐ|YÒâX§˜D’3UtW|m†¯Ð´Diÿ€Bƒ”xFËAÅ£”ôó(Y‹Z’µ—ïÁ‰bŽô‹  +WõG}%Gºðç +0Gã?±ÉC‚n­ÊDµYd¶©p0Rº …Ò¨Ïga÷A.¹òÍ?:'ÜbCVÓ¹åËì³ZšUÆà“í”ÛiGÁ 5ìyã÷[–Ѝ"F5Q_Å­à·ó=CŽ?bUW¼© ÒjrÃ2øZzŒ®ÞR—úý҄À †¾`ŽRrY±íç}æaf‚úH?¹t½j¸w,Ù¡ÉzEÀ¥*ò4t_2É|9ØíæÏö¿-ºlfsþq½×Š¸lzç'ðËÅdí=þî2w×oôPÏݗDí­Þ‚ª>ó¢ýç¦)bk üËóè(ï«Ü±:=ȃ`Ä ßš!ËlüpømB#d¨ÒŽ!a"þŠeŠ˜S¬óê.™OzÎI‚´5Þ:|öÁpÉξhxöŽE¼ÍØâm1Ÿµ˜m°®6P¬l“ 8®>²ÙYó §ëŽGFýM¼]³B¿ÖúˆÁ?D0¡äíéâÁò# š €Ak2Qª)»“y½å¿Ôlc—/a DÞ6†‡ôåNvsöOn'‹mcl$p-t;K-Ž _zfÿ²XfŸBýñLª*¬ X¿5 8̙mì&s©Ò +5 ‘Í[ÖÜ}?%J]rÂrè×ÒÛ$=Ym š´é™1F¤Sy…RûVuP†êÌj¿zCÓÔFUþݙ\9>HÐo}ÃÉ"¡·fà;3è¿|RƔ¹&¾OöMìöËRàÁ>ý @F°Ï yfäì-ø’ âߟÈt@áå9 ªÊ®Îæ ×Ôqg¦™~u4Kòž™93¶_ )XÜ° ä¾[Äš†ta½øLz[G¢fyŸ'>Ölî%÷íO.ÉÉI/p{R uÀ¼:ӅϲJ ¨àՑºØ𠃾žè Ýô  ,¹ +èmé¢ÉlâDZ¶˜¿,á¾YƒÚðL_ÿÅÅ&ª«njÕâ›áç\¯Ý ُ·ô§ º –y®ñÊُ¤·á°s/(0jˆÂg.B÷Á¹È^\ù›ÍB c­d=["›îæ-b“ãµóZÃßÛÏ/® sHóZµ,þ·q¸*è(<훗Ȟz›‡Û¶G6é%uoö;·>YŒ°ÝÅlø„D‰º#8[*¿”Lóur©·T+Æ +|4-Q>•ƒæˆÔû°Òñ=&6ÒdA8†Û;ä”·ô:8ÀF-ù|¯Ù}>’^•½œ€L¯e_§IÏê?ÛÔB«÷úöT›ha+²¤NŠðªÛñ.X™9I¸oª¡L)Nîp±œ[Ä?؃gÈ¡ã ÿ÷ä-= þ83½éÉ @iðï`lY ßMl«½@Y€1 £'_ÜðÁ°bŒŒ¢¯>·•—‰L#á~ yržÕŽ%ŠeЃͣc-•øžgSñùG^ÿJAç2!hE7IXþâ­Fa˜¤OØp_Öiã¡ötìÌDÊ“q™-hÉ-½ÿ +¦+9WJþãF{‰äV•µ5êÏåãû^¸Ë.âГuæ]5@#†xkÖ8cG}ÅsÚñ1±ÇCoKLr>mv“¢]Bì¾Ý'\åä†<Ç +g\9§ýÝ´@Oc$_=§óýã1me3³þ¥ (²»O®«Qï%ÑÔ´àD[ö’Ë0iÏ󸆝7Ð‰Ùۊ…ã÷Oî%«)źþ)=Û"tçèÜ Nljs_n£o?´ !(zeõ¿áò.Ó¹èËÈAe·zG¶ßpÖT˜´¡ú¹E'=ô¡"q¶ +¦Ûb2¼‡pHJ¹?´oȤhã±e<ÝéðMÉHGàÓĉõAm=_´éÉ$¼öR ² R5Aãìg] Hib‡”6[ÞdÆÞ mw˜EðeLøë•,X‡î{b›˜]° ¾@@¸ìÄ*bªXݟ‰FàQµe娀ámÖ@œÀvnl„+–­Òú!2ãîÁ›Žçw{¦±m e=EP¹n|…ÜšHä°¾{œV÷‰œ^åìwråë‘¦A;Z}Ðãᷜ!ëøÙg‘;WÜVQɛ‰äjµûêùüsù=׋QfDDŒ¸Mwé£^$VÃ)ô•è ‰H|l˧´­ºŸ0Ôò̎œ;oCf¬õ}CJ«¯4‡l&ð‘0þ}þ£ŒÔéðlm0ÿÏÇ‘RAðïŒCŒhhý†4Â팵j´öíbçÓ.Zû±¤ ³YÐíxd•5SÍ +èÂÞê2ìå}ê-ü¡˜è±äx%šÒ«©fîBõZ՝ ](B‹»L«ì`åô†é[Åýy&ÈOÐAoϚŠöVŠl®áiÈ°³þ0ã £û5-^ÆÆÓ ÖyNF»9vH öÛ« ó@ÜáÙyz2â­%íÄ~ÁZjåøöd°$ñz6ŸÇWˆ΍‰2ûrŒµ„ + £¶ )‘J¢n‹ƒµ™[6͌ÏÚA"`wh!AQÑ' 2p>m¦IÏr2ñµšß­€?–ʧ~?'Z¨…i㑚»Ÿ.•"Z֟-üY8;4dâáï&Gý5+”\¶ý0ýÞó]âcåmóXò°?š;Út©èþNÔuɝwe‚ Þ{þÆà¼íR¯é¹×§ØÎ_ È¢{K¨I–}6’ÓDÉò*–M1ŠæiGZçx7X_ã~m9€‘|§üõÉ6’ÛéûvN`B“ɸr -ïɕlä:½Î¬Í)ÉÙÿ¨&oýÑ9ûó}þ…‘!F¤<Ù7¶†çb͉Ó­áím°ôM$Íh~dY¯Ë¾kNE,„×o ȵý3Àa÷°¸Ú™ÿ¶h4ý „>HƒÁeü¯ &¿nó̜Ó?mpfíˆc‚ˆ¼í0C*ÂWÒi¤- ç8b떒‰€­WÄ°Ȅ¸8(À>³@´è—2Vrœ¨–òП;ïBd¸xcªiÁY1ý ÛÛ¿´3óD³àv‘éwù°{W¤ý¯Yýü£™M9û%ÙyÖ| +o3cŸÙ›¬˜Í ÿ¦P³ +lؔFP²@%kT­ïeìÝÀ<éi»í ,ú¶y¢‘>Z|ûÒ0ö +4hо"$ ۋå5< +-_Óߋ®‘­{b!õœAk©>ܵÔo|bOV©¶@ \µ/]ÖTJï=ۖ›¿@ÀÙĪ©Þ̨‘ñrl’ºå‰üYºcJ/ˆÌ/(¦ˆãýŒ=-3üù³%61Í{öÇô킛â+]ÔÌl€tçƒ~¸PÍøBæÌfš¥eG@p4ß(s(ü™„/ÊÈÏF?øBºoUÑPÞàÀš©Xƒ`Zm`/5Ž™q4zkvú`3ó©ÎÛ0°<4è;ú‰Æïø‡ø¿¢OlN¡ ^ô\Eé=G˜%4drB®’„ jJL¶£)ʓjmóáh +o5ØR …W‹á}`A‘JYrbѝ‹Íru<9ÆØÝæ¦ÿïÿþ?þßÿS>X’þÙq|˜ö‚äÊÂfù\^OxV%~{ÝðL+çÕi±[M‚‹—ØfõVî}>D¥‚‡éFš‹­d›Âš,¥éá"A¼jL×;ì),³]Nåˆþî¿NÕ vٝ‡û%ºô¿´ët0Æ co`„2ö7÷æý0/Ž"ù•à]ç2£ÎÒ +*j/¬‡EÅEŸ¸±„E(" O™BpÙL˜ìKHºè)I’Óùb1Á¼|úŠ_ʼnG¢Z£Þ¿5Ö9 §µb·Æ~OnøÉå‰ÔBnöEý„^„ݱÆ) $ÖÜ2¯ûxB3ʾuY_?|¿“ý礱 &]Fc/ûû¦æ×Ø~ÿz›9ž×Xkš/IÿiÒØ*œÃ]j¬ÑœÆà9ºõ54O¬ú%ò?Åg€RL¦‡ä9c­”ÛéRASgÞ¦¡ÍÌá謗šn>ZóoZâP=æŽ5<®VÄ Î?!“å%¢ùá Bç ˜È±ˆTŸNςP»_D¶‘¬‰ÎU›ÝÁÛD_ª‹Ê‡Øt‰œn[–„j,–=) 7_cWB5#¨O([ZmÛýâ=Á/=ۋ¥ é£4Ôw£Q@Pž†?·BPÁ®eøP¡¶|øn>8À<¨¡·9™;E¡öí7I¨~ç¬nä BJÃG4æÃ1d=ŠC}÷÷2¾€z4F»¤T/’ÌÆä4'>]ùÛ ¯ÅçªÍ½º½ï\ƒJdKµ$® i_¼oLjw@d·†8ԜþÕPžþ6Å Bž–«ZRHÎìÇ/5óµÌò0¬5q°åj~°öî-;@õïát˅·oj×nÌÕïu8zâP=½$Q^×übP˜£¶ =ÊÝqB­®¦yI¨%Ç~g“€úi%êåýAE”&˜nÉÝ/g³1(ÔFaQ„Z¯ø?bPá¾€ÓD‹èő\¶ë“%, +µÕ=JBm™¦ƒ‚ +õ—Ó­m{,)5cmLJ”(Ԟ­ÑƒJÒ>ݟ¶QNJ ùËG|¬âPߚ‹eèåÍ& +µßï TtÞ\Nw;™æRP+ÄO¦œ‡šm’ÚΩV@Eþ3È¡ov=ݑÛ,Ø<Ö %㦠µ§Ÿ=…gwŠ€PmP«¯¦}?ӉÃí91¼Óµ†¶] u´ ¾Ì>µ3Օì’>£ø 2oŸ9ÕÎA…`èƒöͮ߸Ãïjê$Dr&óç  ÆL›€/'Vš=¹õ¡T‰Ï§Ö×ÀÛ' ,×i­q…6#‰·gƒÆ=YïÄßzÌ;*jË;•jpQYH¼í¾™H5C½½z¯D9îv¡·p{^ðû^Œ(Ä<¨ÈÛQž”|RoSDEÓÞrHóô2Du\øúù€¨§–'‰·Ÿ6¢ÞÒi¤Þ: ˜F¼b’jà%šš½CümDCÎ?ýö’eå‰VSóÊ"M¸ã<ŸE¢5·Ç¨Ÿ_¾-m}0!õöhû2)Á[ iŸïDOçÿ–úùñÝéY$Þ~ù‰ï¿™Mêm‚é7Ãn©qbà%Þ¤ÃRòJ¼šÈà«"´‘ŽLúY‰Ÿêd©¦-J¼oÉ·¥k!´‰™ìþ• â?÷ö7päÔë:¾kŒæâzë2FMyþÛÔ=ùx”j d„®ÓJñÿ°·)»å×ÑL“†5¹=¾Q¬ˆÒà<¶Ȟ’€ú¦IæX‹óú?ôS1ò%î<SÙFÌßM÷²ÝFº—‰8À3"›J:Æ©TÒY²âúÝÏË +ÇMÄ@ëÜFJ*®ӃªÐ'ǝ•ÀÆH8_;g¸G>¯œEXuVç\¼ŽÌ`/i3Ç@-ôÎã½­Ëøún§Î¨ñå4˜êý…ªÐVª§Û‘†ªÍNœ¨ ©BPÔ ô ¡Ô¨9{/§M é,T7j uƒ05·âaXk¡zêzäØb­‘tHBEºTŸê_âP=ÝOJÅÅó¼vIBEº$T¨L8¨p6<ÀSi¨·ZG*4$1 -ç@ÐHM·v±´º†>Ñä’o‡˜ Ý4¬ªKÏWY];ó;Õò J[+ûøV$Þ&΁JnüLqÆ$ÙQ|†A.·÷㤭IÚØ?ŸÌÚÐÂÀ9DíŽg,³n`˜í.únØÂBQ½Çy„_ô¾¼ ?pIۜtÌìlS‚¥¡z˜E­xÖ¹ô2Ì5ßÁWà ýgØÁ¤iÚÆÆì`Ðø3Mf¾9Z¤çŒ :šy¡ÿØ*[ +A”H/°‚9:Lñpˆ£>éü¦_ Aƒeƈ‚ü°Ø&c²elÔ¥$f@ÄÌâÏ*þÐ3Dº·è ß5Ü ùFHv’ìŸ\ÉYC CW”ÖppF*.=|JíXI)ÒbWúÖ5DŠ5É°õJ|ISDØ&èŠ3tɑ½8Íçº;yú∋&hiú"f¤¶«ûò¨G²À¾µªÞAaB õÌÚ(ã‹Ï…Û .ÔµíxØùƒî!˜+V$'’Ãú`ÍãBf¢MÉíÙµ$GD°zô‡FŸ˜{¢/óÕnOœ‹oOJµ™\Œ,•ULŽZ|~¼ÉÙuò“£þLßÊ!ŠæÜû +·ç7/5/qšïgˆéqٖŸšÍå’ (ì Üâäž+‚<ÒÀj¥ÀÍ@úà†³™žšNš‚X‚¦4ÑÞFGÉÞ$»Âiþ$wpäÚ«˜µØîãk`DYhr*È,èàlB`ÅƲ'“m ³®ïs²„&L;V$Vþ¡‡OY°/ ̐Ïy]ْ&4&JñÀÆf•1K9>%¦Y­‰IgÜ +ÓHã/‹g±,ËÀAþГçB¼c Ì«s”:©D¥I¾(É­pNÀb©íÉ?©T/ò$GõƼ +¡ +9H1Ç,ÄWP£„¯×‘I~LHaÃr%{Á¢ø°X1OJÖãI'wzr+¨â0(]êe¥ ’F€/£‚¬wÅ"ž64Ó1ý›¶Äº¢ÖæêÞøŒòÀpÖyÑÛ̸ï<i +ß5Ӝ…L½Ç!MÀÝ®Fm cl6§è^ Ýº’¾$?JΜØL³Nþxçyþá/'늟ÙyèžÉËó4\ú À”–ÚGmÏ\*߅ e͐rÉ#hàPmo™$‡¸b©¢Z 7FñŒ?P 9À`\w£E’ ‘P-ÐC{ñ3ë=ÊbÊ#òm2jÂÄEÁaqvp0¢¿àÌz<ó_²ù>n4×p©òWÈ"¥PqX¼1tjY Ôêbïà +¨ƒà¯ žÈÏðd5ŠÍÎæjÄ+IBÊõl¹ƒ€O¼1SúDZ’ÙÌðøë¤NuR ÕhD¹¯½$EÐFHõø’ÝìbøB½ ;ô%¾®Üì<|ñwºƒ9Öx›}]äov 5NÑåև´ZUÆY£Ãº(£ +^r©CZB¾‘”EAÉ` lÈE‡tˆ4ÞiQYݱV£"99*,AÉâÖ÷Ä=†š ˜Ööî) OYÜr+o×ã-UñÌgðªD¼óâÆ{¹D¶SØvdZ'n’à‹Ù±ÐûI f»c͍ÿl”ª¬¤}¹»ÒU66ŽÙðI+Ö$å͆B)Yê\,¡s‘9=å,¢*¤ä]‰.Þ¸obÍWó=äNô®$<Uš±qrÕ4üƒ›75SzñÜÈ +pJ+]œ€7°€ÁÉÇÄ‘K~b.DÿäS8—FÒ9üŒ´Îˆ9uÁ§xfZ+ÏÛ}Òæ‡NýFï>¯Üû÷F©9eÌ[°7ÖJ+¿oTXiAoò»P‡†›‡¼×ŒWÎlô"á)TîÈrÕpÄ=ì¨#ëCæ…K6wudW1:Fþ,D½9î8VY¤1±Ù|©vvw»'0fzhf7?p`<¯‘JO¡$6'—OcåèñbÜ ¨6^³€»g!â9VċNónî†ÖœWÉ÷rÜ t%ÂÝè ‹k}P ·«¸›„ Úôë[Á.*¤)M±#5ìD¾*:¬†“(Ç)©û#…}k}ehéÂ&²hV9Ÿ큄œœà·rPG³e RdƌgjCUDW +¼+H:²UJlÇqÙÓófŸ0èM™ãr¶N%¦ÛRP!Æq8.ëîä•nb6Z9~À”4³QìHRð—ìEpz²ÝUAõªÝòŽ|ŎÔÆ4±‘)’ûõv›‘›;q±œÅ9«ð|jË*tݛR +;íGHÿ_Òqœ¨®ú|½ÉJÿb‡£”åöv£ô¯+©õ>äXj+9Ö@G÷ŸFTòEåîà$4iË/ÚN¹#Rò|”?Ř ©µ_>ÊŽ!Šîž!ӕJ†D a +ŒäóÄÚB³¸ÐI~2I«¬›h{ +w¦” è7 +Á">ÔÛÕû\r`h“Ë›ä8/i>ùÕä{qeU&° -5ò§˜W +;²6oéˆ=©1adÁ·u*ï315Εìtí‚cJŒ¡Ê-©ÆuåŽ)<4ò4‘è8! +’_¡ûªMÆ·ÙÌRåIm4ìÊ+·6W¹`o +´|…1ŕìj ×ÈÂ@Gœ »È0§¶7‰m?:ŠEúb`pÊPŒ¿Dc’¶& 7³6‹¾=~áõ6ف(UÓë€òö¢Õßܪ5¤u“s&ÔÇûÙFô=ƒrù˜Ç¤óYesùž°¤¥»Òùð­Ë\¾'üŠ‰{Òùäsùž¸ÔÅûÒù0¨"¹|x ò]é|ò¹|Oxêâ=é|ò¹||êŽt>ù\¾'ù\¾'~êâíé|ò¹|ô±v:Ÿ|."èG¤óÉçòѳ¹.-“€ÇÚXž’À'¶W1&5b0,¥XñÊV^r§ÃÒB/À́·Ÿi¾`ìºÇ@ün¼*~]ÆSø™æ¤n@“ßv‘æsÊÆSÊäòeCþD=…2½)EyIÌð"cEEŸê^ºî@ü@>q•Ÿ&3,%C—̘vúÚü½+ØNÞÑu·Á ¿z’/¡!&™{|< +Íïnó˜Ü—N09ñpÅ´»kãKÄì0íîjKóå”Ò•j”RڝúøiÖ p#br“–‚Zm¢˜š¯èȵˆÈÂü¤ˆ©Ž\gEcŠê¼×¡v U^ Ñ¤× •Ï¨¼ÊÐ͖.91Ï¢"ahãÛ¡lã[Tr1AÈÈ9rÒGž§*-pR’1®É)쟯Jx‘É)ä dbù70¢ ³qIçÈM%“p„b¶Rä}N.ò¾úÁZ¤Öð‰Î)TŠ¼WŸS(”þ„gä_‘S(°z*Qd!ݛB†ÚQštKÚõ4•¯1¸¦7ißÇ-HSÈÿ¹iî{zãۋ© /yATT +–BúŽ*17/4‹$-qÛ^]êž ßè­’>ˆö9©È«çy1}P,æV…>xŠ)$Ÿpr5×î“F}®ïƒ×AôHˆÜã"PqÙå–B‹RʞÄ*áÂmþ±"£¨I¦ý‰î[PĈjC„¤U])aï⼓gà”<‚)]F©ò0¹Sú ÌÔý>ÎObXÂ2½ø¦AƒÃô*‡rõtZÖEpÒÍrÚ_Arïs{žåŠ¨R½oÅBœ0Jû+\g ’É`ã{\èž*é@9G7¦'ö’SÑa]e½‘ +²x UÉYožØÇÔ ë:ëPâۍ_OBë L‹ºÇzƒQÚºx·õÆ­™ôbšÙ¨Ô*Š×[o¤íëâÝÖ09I&dD}>œJë͓Ü=P(î^ë L†scFÈ[㒊*¬7ô¾QÌ”¶Þ¨Êb%ˆ «„d/œAú‰ÉôRHU%H—$c.ž®É ÕRRs¸Œèrǚ~ɬ*®=+qQº’Ī&gVK¥Èž&N¨%•ÁJil0‚oë¼1ÅO™ãRº§BŠŸšŒVÙL%bÊØéԄ`’2› +Zj' ÂÃ4 +²à™4EàcÊ®‹›3óÚ“œ÷èÌ<ù°ë‡eæ)RÚc2ó(ëàErÞõÉgæ] {Of.CcÉyÎÌ»T +ÕF^•™'jÅ¡ÈÌ££$óD”™GGÞ “ó™'±6ÎÌSÐÖ¤üB¹Öö‰ÿðÈSˆ_Wz º"UJ*B/Ao®Gp€óº +§—¨h€\6!c ^.âop£Žø*¶âpDm6¨£»¯@½Ð›QEä½"w“¼àX4ò^Uˆ5Ò£á~Ì|¥äqHǪ؏ݻ.»em3£Ò/êC¡{áRÁÓ$C¡{Õ ®2¢zJ,Zâjrk=èªcԑÒ]8jT\ÔѕûQüXk=d?¶$GÜf£RðG½®ºÒ*°ÙB&À /–೫Õn ?êCò~fµ8l?4I¶ýÐ$Ùöƒ’d¿öH’%µöÇ$ɂŽ“$ ;º?Iöò$Y˜F§|ѵ0vP2 l™«`UÅ/ñÃy ¯¸ÜƒÃÝf0šÙ`yywÇ +‰%åñŽ55±BüiªÕî±µ‘T𐔇mO:/ïIÊ»]÷¼*)OÚxÿФ<:ÈB!]ó't3l_þlQ©ÁŽ’<Šn1¾ .ûŠs¡|ûý[=Nd‘…'ß|%´½¨ éjÃ3ØITî»E²é +¯PVöL ¹›‡!cw¢3ðI*W9ëZ0&Á}æ|²ÀîåÃ]9i>‰î È+(ÿ¡Gåãë FÁÌb=`h,¥0©±¥?Ú[«_‡åÖK#ჟÞaӔÆ^x gg駧×í4cŸâ—У2ÂpË-/íîÝIà˜æ%Àú-^œ–Ÿvgé?–’É~ó—\Ú]ß. •È&}U ¨>ÊÍz’NöëË¥Ýi¼ÒPs¹C—…ê©S(Ñ|˔•«Å?0¨‚záUóíI2ÙÏûk‰·-;©T´®\Úݜ@}â×)üÎK'û½,­‘Ô¡ ÔâKÂÜÆyQ' Uó¥ó5¥0l“MöÓf ÁÒÂ}kGðÑ'&)ðµf»w£öžäLÌ@ü™V®¶Â‹”©í&,«§ÂlwEe=É>)×ÂS*´¢f†Ob·Áݜ«ªÆŠZÄ+”Ÿ¸bß³²çKªp;©tU>N)|XbŸ˜öq­ÍFEbŸ˜– n¶»+±O,«OR†¾=±O̊Hˆ™Ø'–Õ‡öÍcûÄȇõ­=.±OÚÜýÐÄ>±ðŒC?*±O1ò1‰}b~ /î=‰}üu¥²úd+·&öIxqØ'“±òÈÄ>µwtݙ؇Åû³Y}¸Šû Ä>±Ã‰²@=4±OlL¸ëûA‰}bY}‚ˆ®G$ö‰­!»o—Ø'Öã,~`bŸXVŸXÆʝ‰}7#íºÄ>%¤=(±O,«ïZ¤©HìËê{’Èôº#±OL&}f}ߟØ'Æ{°CúQ‰}bÎJ÷|hb¿ƒ¢Š{cbŸØZK;VnNìÃW‰ñÌȝ77&öI螒¹1±C+c>I'”ÝšØ'6¥'ìæ$)yëN‘Š/҇LiE¹C.QÄ_鈸u{ö•"߈¨â§$r<¨Š_T¤„Ÿ¨È¡UŠ5€1R¥ŒÒÅòSõÕÑ$©RÍ^‹ºåû•>~ÅüåJî)ÕêÓeÈ–š­jLŒª–ÙÈ Êw³‘T™ÜúàÒÉW™ŠB•é2°Ih3“Ð=õÿnLžãÌ̒q6*åu•ÅÿJ“_‚»‹ÿQV¥ú*súqEø]Åÿ09M¦þŸúT)‰â×!o,þ'n„Öÿ»2_ê²øßÓŅçbõÿnˆ ÇVƞÉñ ʕIž{\ŽÇ®ô˜;ÉÑڄjwg•äã;¸€KŜ>±Çk£»áÂß]%¨$i|£X¶O:2DuzªØ§@§.H bǯŽ %ëñü'fÓ¥: “y'O[»Êa­úªóËäBâÁP=ò¶ôkB­Fð˜P+t7Áý”p®&ÊJM"æ<)¨ž(+F*;ºæ ”ƒÝ´/zz.ß\i÷&}I¢šâõÂlß¿©é"Û÷oªìRŸ€ö7UUYDî "½YT16ì0“Äf}ƒ°©bmpeSÎ9¤¸Ëíu¯¼ßS•±0urcbLó¡Å›+îؤPÜÊZÛ«„{ 5 +Õ¢»GÆàz‘½¦£\c@ut[…o¾~;’‰Fº.,l‘Š{œÅ@&»Üà™H +Å-Æûêþ‰F¦à¥ÿn܏XW¬õ­T÷O¥¨~oÝ?FT—,ýweêDÝ¿kUÜëþ‰küÒ÷ÌëÂfs]±>aoÊuÿbÙlߛêþ©¾¾=÷µ¿;¿ ’únÞPŸíKjEUK– ¯Ëö%µ×՗7¦@œOUä}(&b2©÷œFpkGªŒ_ +]¨£û²}Q/Ôéy¶o[ön»8:=¯É¾¿ˆÚQUE'Ùs©.£v`YSþD5ƒ‰ÅـÙËìÇ+©:ÈW%}¬‰çRÉeˍ¤­}4¥©VðAo¿*b…Ú½Äö½-UlO‰T¤â?H÷äõü ÝS␠+™2“Š£Ðü†%›Ku­Ä8¢·B0àñ#®Ÿƒ‰rì&x¾÷†¼Û”C:”c +O‚;ïe2Óî¹Uëi+†9:r®\Io”ZÉ&åð«8GŸTì ÔJ•ôF¡:}+† Æ${ˈê¼[nG½•(@zÊÇÃÁu‚¹QtÂ`1؅©† ø'®±ŽE˜b˜By†w9¨g—Ï @ý‰—#w8’/*"h~i:­+Ï̋h ’™y‡óC:‚‰¸æÂJ|V®4HÕA6[­'—…øG +ôA"âì­. Õ@c)¨É9æxKÖ±éòs䎺ߩTf^ Ýë×ì\™yf,ð‰­‡!ùÕ% •È‰7 ¨>þcíê‹A`àteÒµÙ£GjÎöӒ„jœšü¿˜¡K˜萃Z6JB=›QT†JDŒÛ¼¥øè½æTo²VÓ®^oxÌF¢©O·ïg:UÅ.½¿4õÑ'LÑùJÄQ,È´¾°ÀdÏé3‹=ùTDgÒ +»ˆGé3ý² i¨ŒeN/¥h$™ª|"sHêHR}\WhPÌ·vEJ¢Û»ÈGSدHIT>j¤¢®JI”@éE>¢@€º6%Q•z(t¯ò§tUæ’B>¢´&]mŠÏë¦b…8ø‹âjÔEnããŠ*™T¬;”ùÇÅ +…<í*VH›To- ¨¶X!k¶ûg‹"JƒÃúg‹â‘÷ÿ`±BqóÖT´ì(’«©á(Ýj…W;dÃàî-xȐªxµÃk£í$ Þr«Õ %'÷ˆ[­¸‚‡wÅ@©/x(Ÿøô€[­PÁÃÜj¥¦à¡º|Ï» r3zˆôM£²Õ1Å㾂‡W&”ÝZðPHüj‡0·<”ŸÜ“l}Ï+ +ÊW;”±u^WðP~J”¨þ€‚‡ŠÁ°)x(_Œæi÷<”ßƬ¨.Lº¶à¡üÉ'”Ón.xÈ º¨v(ªßÜRðP>. »¾¯à¡ŠT’G<”¯vȞ7÷<¼²Ná­ù½«^ˆo,x(®FƒyLÁCy ÍÓî/x(›CŪ?*[MºÚ!®ÜUðPÞσdG<”ñ–´Ü^[ðP* wEܙrzS`#<. r1•+xx¸§à!Kn¢Õ/l6·<”ïåI²Náý)XµÃûRIš’ºÀÛ¬.´WEÁCùÚ'ö~v?ÞVðPþæNñ¸³à!›ø%š±ý„'-©Oº,x¨‚§=¢à¡|µÃûEuºàáÒ±Õ à!Ӌ¸Æ}q¬][ðP±D¡ ³¹¡à¡\¢ÇמÖ=ï/x(JdlµÃûxZ[­ðƒû=ï*x(/ü`Ñ÷<ä.–|­uP²àáõ¹¸7<í…eÅò+W<¼=¢K¤àá­©úOt†äÝyûñ¢Ú!晬:ñj‡4O»¿à¡|%Ü> à¡¼vÏ ía‰WâÕ¯°uò‘&,xx»îyUÁC)~HU;|TˆbJ¾Úá“àjý› ÊW;¤EŽû Ê'éŠÒ7<”¯v¨$§©Oҕ­vˆ!ï*xx‹dsCÁCÉÕD ¾ë[®7…‚‡ªâ:ï/x(V “ªð¸˜ž.e7ðLú¬ ‰‹0ÖÌH6Ĭr +-Âà™ ¿—÷ç'QR©$Uí&/°@ï)Žðü´Ö Ž”ŸÀæa µ›RЕ 8i0MяEÜyŠd ]w£Ú4j³ºòÖÆûð yù²4Ðj¤1öó¿Çë_ÂŽîƒÖHø£km,–["“ùs™?{ˆÈ–jнJd·‹2‘«íD¹ð6 Êëٜ¨®¦¿D½âÂ¢E4¿3¢EœVD«ÿz&Úö–‰èٚfâ{¤­ý~gF >Ü'âÇÝ1?Síp8dœ‡ã×6|8“›s8¦£Ño€rÂÇ f›í‹I¾š Îâ­ïÞ\c1¼tÞõð*ùò^Ï ¿Ë­6è|3éV㗂'h¨Žþ:鈅IJԜm;ÏÛZ”ÀhÙFã…ÐO'àñûV”ÐkƒR^G˜àZÖؓ]V “®°J +ð…‘–«…<#ç=ñ雇7»•›îÅ\=æŽ5â6Ɖl²”$²³q‘ÈUßÖG]ß7‚É´`tŸ±¾Þ> gv y¢2$kD¦å ú‡„³:µ „0þ6â•2ü1­9+-69î4âd*ÿ× 1GÞ<»Ó؂iÀi˜÷[ÕèӁ,ü”ÑXkÚ$• l]yÊl»²Æ²×¹÷š´³gÈÉ]VÈDõ¤%E†˜Ôbè$áÔñpYs@ ”͸*ð©¾#móy|jí‘úO8—Zú¹[\ŸÂäp¢¯CšèOS øEÞL4÷Vjßä­ô“É¿Úé¯eÝà§Ìx¹NoH¬·åc¢ÔnùQ¡“˜?K¤Øü0ã,Y¬iÛË9kÊ +¤-õ2`Øw6ü]“œ°/ø‹ù+0ZÆåi—¤“ ™Á¢éÌÄÄd +¡ghmrq+Û¾Ofú¡Ó>kç^ ({ð¬ì¤d'g®J@ó±Õ­½xÁpÞ¨²¯ä¨ÿ2d†X³¢RŽ§v$DUÍÎҒ°”jԊûR.ø•@iä8_E_é~ǽO’^¹nÖê¬Ô—nð¶aCo]f_h‚!­á Àf}€p­ê/[Ð܏‡‰–g{lú)R².E_–/7œ\iè’À†H:uLjµ>ø¢MÏ[Âÿ=1Ѳ@ÒeîÕ5ôÒv?]ìŠü¸õ‘È¢%—ù½8ì²ç@Ŷ\ƒþÑoçºósç—Nυ†ÀP#ú OþØwk¦ÕÉÃٌ°Ùü´5)¸ÏÃîXãô‘\9æ–ÄûxVN— +š:§FLÒk&1àrg3Iº_΅)õۉ&â6¸šŠŸ^úSz¸`Û¹év­uB0&QM5¾³é•vœøh|3#{¼ ä„rÝàOï‘ÓÎG1 ežÊÔ^míy@uFgqÔ÷’:§{Ùi'­›œ3©ï¢.Ÿ9|FÞÕ(¶Í¾[¥lPߜ&ƵŸr¦Ü·À±ž,Ãý2w¬CV`äB½Å5=h°[j‹ˆaXi +†¬àÜI&Uá['»†_à«ð/iBŽ%ðçu¾ú-¥­Õ=4‡ ™ö ‡ŒÛQ‚<äŸ= ‰µÔ>Ÿ¾û#”PØ駨f:ëÇ¿èÆüa|Ò¤Íø CgJfœMOVø̊?+[!g*QLrRgºÙ€“f'Õ—«äJ»É’v}ác6of´–”˜•+k®´ýӊ+\¾ +$ ?™ùŠoOE<°Ó=ÅN½£\Ü7‚‚Ÿ÷•ÙÍóFÝdA³UûdôuäÈèÒü²î“¶Ý:f¹\^Òºôi5ªI÷öÚ­_ð/ôU38£Ý;QìŒÌ†IZքêKÙ+4ÂbvaF>%a¾Ö3bò²I¯c~Íd(FJ”v»R‘‡Ó’Ð3X»‚:@’Íëϋ°óè}Ä¡À™*wn蹊˜Ø†ži^»kF€<6y7t@ÆÓ}ç:€â Á»Í +ûp>¹>êT´Q¦˜(Øþ ÜiF—yôC¹ËDæúsJQfúÙpoAÏҖZ+`,#/»Ù&˜˜E•[‡˜;ÿ=„W¢{Ϛ¥î1za6Å>WX 䤐Ґ” ¯?؋;àýA-WU+¸Ñƒ[R´Í֙¡dèC²ûɈÏTYö/Š xr`D¤ƒ'M¢Ò©ig '´j<ÇO’W‘˜ _è¸áàê*ýH!!îfx…‡—ˆæ‡ÁƒÇÉáAP(žºñŒBBúXçՋg‘pþ¬²Hè0|<ØTàÁ¯™L4†±* ¨0%ÒqH€³¡–E1²x¤·QÒ\b‘ÿvhÿšòÄÀ(…ð #hZöW—4\gÇøZ‘":®€B¤k^PKiò} _èíIŸ79«ä8T §‰àläû@&º;&‚jÁ0H»mELøŠÈ‘6b6 u ûÀVïC-6M6!딜H,´Ü0}XûËDÆQƒMJŽGßD>]±w#møí̔ˆD]BÔH²«Ï¿Tˆ¢4®é”FI³wR8!÷ !æNJÃ1q+¥áÈPLj…¤Ên|Ä:% ïã‚Z±}«ˆM J»wEÌL ¤‰!C®yn,ÖÁűf–ÚûjWÄÌ­GWiêIˬ‚‹u€ÚñU½i"ܒ +6…4U‘bbjAËÐf‡´Æ˜þªÑ}¸Ž}þ ,ò•;¤eaáÈóÆAPænUG“ä pÚ¼‘uZÄÈóšsɂh““¡oÙìW²K°¯ß§P‘ûêևR%ÖY<ý›BA6o㛛á͊==`ïACj^c«šmH3…^ÚvHÙkqåх©/¶ß¿ +4½á! :ªkl­ï,ÿNƚ𗸎”^°Æ`/£ö”ß(='d!f¨®œ.wÔ|Ó´͙…‘dˆúhKmˆ°ƒAL“”pû°F}æb  䲉Zê•@G¯ùÃ!ú:JǬõF:fšôÈd0éG¢º”ÉIG»p;ik®¬më!mmZ{¸ð2ÂÙ퐌º ´ü\ÍÀ¡€ZÆ9Æ÷ àËBáYà’]k†õFQVœ•Ó˚¬­Bû'k\ Í7Æf6’ñl靹k¨K8õiÿIc8#P»=ñ$ZWÏujt¬Îàl¢§{aÒ$Yõt¯’±Á1¹9ç¸cÖ:oÄyši+|‹Y÷ò}`ÈÊcIN҈,Üɀ;šôb]–,Ú8 +Æ0G`Âi æ2É +ªíæ¯l4¼)¥sväúÙæ\ɞ;ÏA '?ZdÃF/³zÌwÏ0Ú+a'J¦j +üéd©}́}²u²î¤ÁèCE*"áMç‰9Ý*²{!ãªÁýr>f‰YÅR¥l²`ÂßëA‘3îÁ†²'¹Œ±rô©)ñGîÿ3棬OZë2ëwq·Aã˂Nn—E„Þ(2ï |`0Qw"“¯ÑÁ#eËsÙ4ÐÜ‚UåCàkàZx#H‡¥îËÈ ÄtŠÅã)ÄèޔßÓºkñ@ØtÖÿ‹»~\ý×ÔùfóÄ܆Ê<‰=«lM>×`œ}ş}í=и§ž±1·Ð-71ô#mØ?[ÖHA‰…äh¯‡) a?ØÐw¢Ý~‡›×á6üä+'nC;Ÿc׺'d^ƒ³¡,læpÀeš7ÓdÞïóÓQ3EŽÊ˜;±h.Nï_Ð%ûE;üyYqŒ‚ +ðwm}UȅEõ}ݽ`&BÐäÄY ˆ‰é£‹,í0~ÝÈ[ó¥^íåt¹~Ú³(áŒzL”~Cí¸ÖÌ·»ðaó^0¾ëâšï1!ƒ#´1ö3geƒÌ¬ÐªXǀe"?`O­àÁ¡³ÑöGo—¶ ;O&…šÕ;ŒÓGlš¶±1Ög€¢4F¿Úm H‚ŸÐZr0¿Ì:6'p±ñwÍøÖüfÎ"ŒüŽ´¯,újÅ^ õ©WÎ!Mq~´o°›1æEXÂBû2f\FÃ\Y˺ÕÞ0ó5¤´\ß1fßÙ±Žr»Ÿ9 >42CW[ÞWöQÞ»XSs&œïq ;ÄŠ÷ϲ6ˆ' vz¦—ÐP€d hÎù^uŽl(~|m’èG”SÕùþéf=uà\ÒEtÈ¡ 81tËb~„‡tϞv#öÌúÃbð#‰HeÂRYt‰y¸èz£në’a±<9"nœ6҅ɫFpÞS³i¸0‡œy5Ð1μ¡‡ý€9i²U‘ÀFSð¨é¤i~Ô!ó(˜Á§O’&ÚQ߅¢» .°d£¡›ù4ñ >èõ]~ .íHÐ_;Œ‡jùI0Ÿú$;œwj€7¾=G®¾Æ= =u•ý =›åڇFÓ¾y–úõe«ÉU@ÀDÊs:ÚÅÃü¡ü±[Áïpî—1M2§>Aæȸ |’̧ çӇÿéÏs1突µ˜£aË®…¶ÎìOå%Hù ƒ£Ÿ(æ¬ÐÑùí£P‡Ð!æÄð¯—ä_F:æ 0"O³µÞ·4";K*,…áÑÆ{‡s¡}7°‘GÆóå ¬ƒôŽóz(]š½!+ $ž(%.°^6ð‹ÜÕyŠ@„‰ôŽ':岘ÞwJä—ÆÆ÷˜2/ GïÝ Ã(—Xêe„žQ]²Ñ›$äÁ%À]ü­|êg™˜ð¸[™`|[%gJɽü +ù€ÐÝ"o¦nŠ¦i 2¤lÔcŠqS„éï”.oÏBgÇÞy>ö™MÍÂ%‰ü¯èÓ¿üA·÷ýq~œWÓCõ°˜/6Ïà,B¡3Q Éæf²Í¦ÓÆô¿Néíø¼žnNÏ¡gg¢ž*Þôt¼LŸm4ƒò³œÃN+Mán) y“éY0·Ìë>^‡éэ +U/ã®±‡9”í úö¢± &Ÿ›+[טòGüÚ¥ÜÔ/Σôě,ºôô’a>p6útÀ©±™ãq¤ZÂHŸ78Ã7ø"¦±'܍­ÒÉ«ˆô‘ ó¡ÖæQ‘>’a>HÃSéÃ1ô+¤Nd€ìVJjÀ½Òáy‚yQå8xŸæW¹W ܃Û çê}:Ük@„²€½öe¥vÝ÷ñ#¹tº›ÕJ œÈ€‚4ÿ)©;â˜Njàú£õÕFjàD6h某8‘“/5p"œÍ?&5p"¾o.5p"#-5ÈÇî2šXHڜ†NËw’<:[«Ÿ²Ýјßz&š‰žCïÁæc54æÅ*ª±oj_±Ŋ¨Ð‹öÚ¥ØØ< 䯱<±·ÆþI·îíŒÂå1q +«"‘ÀÀXœ ëšÎ:éƒÝè2Æ5ßhéëL9lÈXêú>G +ÎEçä ‘…-dEº9ài™¢Xî§;Öz+ H…­ÐG Ÿ¥yÚ7½\‰€Á±!͒'l}?#Ô1V¦„Pr!=TÎN€ +z#sMS€kh )7÷@¤½9èÐ}œ -ÊU Š“bü;×t¡Å`¹¹«v¨Ðr.朶ìÄÌd›)e!äNjDZúL߈¨Ô„^ʔlÇCeƁÒE¨ÌÉtdûx¿ •±äž|b̈́ôl-ŒlNjê±W°¨S°ëæEõøtš—¤>-”tbÙNŽDv&z’f€â)“Ð"ÚÌ ‰’[‘;ó¬µgžuÎEucåBáñÔ:Dƒöùhp÷¾ŠPÄΨP•W—D¼’­é F²Ã9MnsӚÅâT?î2dG"^ݏNᡏ#¹>h$ôp$€áð¯> .ófBvnˆ×a}ybH`1r~;‹*WH^OH¸#n)z?©ˆ×¡„[‰ø­éqi¾+ pm :§’(/ú µVµƒxBõŒDú™l÷M$å°s[‹¦z"(ÁçŠ*‘íi ž,÷6Ô¹­‚¤©ETÐíJFÞ¸ܟ+’ÕÙ>v)Bt"*± ™$êà¨Íå“V¶žcù<¸÷XÓ\ro¦›ÂhlÓÏ[úçâN®û( ˆ-¦û(­ìqpHSšlý8q7¥M÷Q±1KQšê>ÊV›"•à Y(­ïwܳ"(r[¬HijûȕµÊûV>zJ‚ª¡ø úqlÂA@ƒ¿Š¢§âޗò+ìB÷­xå±I7rÉÛ³×푋AøÊ(Ñéž=’}¸qˆ:IüÎ{NŽfëcÔ¹ïHÍ­V.¾]n2ƒØ‘Ò¤%Äãëýö»ÈblupØÄY§Âф÷áK‰nvÉAˆ°Îq¬ÿæ«qük­™ ¨^’Š$Å욱'³:éó0WN}ƒ:Î}á3v*ʑ ÞªÂ ŠBît„ªð‚ÂÙð¡¬ÍU˜VÃ:'…¹5¬g²„{&yʶSf—š³ïžh¥}ó%³±¾O§êu?à5„“<ý‹xNÀ?ÓÎ_ˆ8@âÙ }ÀÐ Û£¯Ãõ´°™Lÿ‹~P?mÿa¸žð·‰Íi1\-†ÇÅfN;•¥0ÀŽ€B%Äà·"øôžýû™$ž+ϟßÄóä ¼ü€/Á¿“§ùžMæçN.EbWÁGÀãöº=τÃðú|ªSáò{¼‚ÃíòzÀ9‚.Òë >w†Oÿr{ýÏvOÀÿ Ô<×G}.ӟ]GÀO’ð;jGºIØt㙊N.æƒÃbþ{Œ·«óz#±Ú4FÀ¬6h²Žx¼Aب±»á˜|¤Ã šÀ ¸üpÐnÒáóA80ô€$jf©rõõpµº~7, +év³‹‚­ ³$Þ ³ }÷z^·d¸ýÏ ¿£n\® ÃÅ}½bÅÊÓÙið><ýª™f9I³ À5ÐV³ÃÓõå}8Ÿ6ÃÅ +rùqø?¦ÏÃÍf{ž¦;ðêy~˜Áš>·ÿ†OàØTJáÿ1¶—_ +endstream endobj 6 0 obj <> endobj 26 0 obj <> endobj 45 0 obj <> endobj 64 0 obj <> endobj 72 0 obj [/View/Design] endobj 73 0 obj <>>> endobj 53 0 obj [/View/Design] endobj 54 0 obj <>>> endobj 34 0 obj [/View/Design] endobj 35 0 obj <>>> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 84 0 obj [83 0 R] endobj 100 0 obj <> endobj xref +0 101 +0000000004 65535 f +0000000016 00000 n +0000000201 00000 n +0000045144 00000 n +0000000005 00000 f +0000000007 00000 f +0000170608 00000 n +0000000009 00000 f +0000045195 00000 n +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000017 00000 f +0000171227 00000 n +0000171258 00000 n +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000027 00000 f +0000170675 00000 n +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000036 00000 f +0000171111 00000 n +0000171142 00000 n +0000000037 00000 f +0000000038 00000 f +0000000039 00000 f +0000000040 00000 f +0000000041 00000 f +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000046 00000 f +0000170743 00000 n +0000000047 00000 f +0000000048 00000 f +0000000049 00000 f +0000000050 00000 f +0000000051 00000 f +0000000052 00000 f +0000000055 00000 f +0000170995 00000 n +0000171026 00000 n +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000060 00000 f +0000000061 00000 f +0000000062 00000 f +0000000000 00000 f +0000000000 00000 f +0000170811 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000170879 00000 n +0000170910 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000047239 00000 n +0000047055 00000 n +0000171343 00000 n +0000045567 00000 n +0000055928 00000 n +0000055815 00000 n +0000045927 00000 n +0000046493 00000 n +0000046541 00000 n +0000047123 00000 n +0000047154 00000 n +0000047455 00000 n +0000047723 00000 n +0000056002 00000 n +0000056198 00000 n +0000057266 00000 n +0000063713 00000 n +0000129302 00000 n +0000171368 00000 n +trailer +<<025EC4A9513F8B4B84067E8D2E8B1981>]>> +startxref +171562 +%%EOF diff --git a/plugins/net.mograsim.plugin.core.nl_de/.classpath b/plugins/net.mograsim.plugin.core.nl_de/.classpath new file mode 100644 index 00000000..bc3587db --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/net.mograsim.plugin.core.nl_de/.project b/plugins/net.mograsim.plugin.core.nl_de/.project new file mode 100644 index 00000000..8863fad2 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/.project @@ -0,0 +1,29 @@ + + + net.mograsim.plugin.core.nl_de + + + net.mograsim.plugin.core + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..cd95f141 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/plugins/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF b/plugins/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF new file mode 100644 index 00000000..4a3f56fa --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: German translation +Bundle-SymbolicName: net.mograsim.plugin.core.nl_de;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Fragment-Host: net.mograsim.plugin.core;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.plugin.core.nl_de +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Bundle-Localization: OSGI-INF/l10n/bundle diff --git a/plugins/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties b/plugins/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties new file mode 100644 index 00000000..5f8222d7 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/OSGI-INF/l10n/bundle_de.properties @@ -0,0 +1,34 @@ +#Properties file for net.mograsim.plugin.core +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim Basis +content-type.name = Assembler +category.name = Mograsim +view.name = Beispiel AsmOpsEdit +e4view.name = Simulation und Visualisierung +extension.name = Mograsim Project Builder +extension.name.0 = Mograsim Project Nature +category.name.0 = Mograsim Project Nature commands +command.name = Mograsim Project Nature hinzufügen/entfernen +command.label = Sample builder deaktivieren +command.label.0 = Sample builder aktivieren +extension.name.1 = XML Problem +decorator.label = Resource Decorator +themeElementCategory.label = Mograsim +colorDefinition.label = Simulation Hintergrundfarbe +colorDefinition.description = The Background of the Simulation Visualisation +colorDefinition.label.0 = Simulation Vordergrundfarbe +colorDefinition.label.1 = Assembler Kommentarfarbe +colorDefinition.label.2 = Assembler Beschriftungsfarbe +colorDefinition.label.3 = Assembler Operationsfarbe +colorDefinition.label.4 = Assembler Zahlenfarbe +colorDefinition.label.5 = Simulation Farbe 1 +colorDefinition.label.6 = Simulation Farbe U +colorDefinition.label.7 = Simulation Farbe X +colorDefinition.label.8 = Simulation Farbe Z +colorDefinition.label.9 = Simulation Farbe 0 +colorDefinition.label.10 = Simulation Textfarbe +fontDefinition.label = Assembler Operation Textstil +view.name.0 = Simulation View +view.name.1 = Speicher +view.name.2 = Instruktionseditor +themeElementCategory.label.0 = Simulation \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core.nl_de/build.properties b/plugins/net.mograsim.plugin.core.nl_de/build.properties new file mode 100644 index 00000000..34520a00 --- /dev/null +++ b/plugins/net.mograsim.plugin.core.nl_de/build.properties @@ -0,0 +1,3 @@ +bin.includes = META-INF/,\ + .,\ + OSGI-INF/ diff --git a/plugins/net.mograsim.plugin.core/.classpath b/plugins/net.mograsim.plugin.core/.classpath new file mode 100644 index 00000000..4a00becd --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.core/.project b/plugins/net.mograsim.plugin.core/.project new file mode 100644 index 00000000..29dcdb4f --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.project @@ -0,0 +1,30 @@ + + + net.mograsim.plugin.core + + + net.mograsim.logic.model + net.mograsim.logic.model.am2900 + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..3c8fadd6 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=false +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=true +sp_cleanup.convert_to_enhanced_for_loop=true +sp_cleanup.correct_indentation=true +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=true +sp_cleanup.never_use_blocks=true +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=true +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=true +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=true +sp_cleanup.remove_redundant_semicolons=true +sp_cleanup.remove_redundant_type_arguments=true +sp_cleanup.remove_trailing_whitespaces=true +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=true +sp_cleanup.remove_unused_imports=true +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=true +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=true +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.plugin.core/META-INF/MANIFEST.MF b/plugins/net.mograsim.plugin.core/META-INF/MANIFEST.MF new file mode 100644 index 00000000..6dfa9547 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/META-INF/MANIFEST.MF @@ -0,0 +1,36 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: net.mograsim.plugin.core;singleton:=true +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.plugin;uses:="org.eclipse.ui.themes,org.eclipse.swt.widgets", + net.mograsim.plugin.asm, + net.mograsim.plugin.asm.editor, + net.mograsim.plugin.asm.editor.rules, + net.mograsim.plugin.nature, + net.mograsim.plugin.tables, + net.mograsim.plugin.tables.memory, + net.mograsim.plugin.tables.mi, + net.mograsim.plugin.util, + net.mograsim.plugin.views +Require-Bundle: org.eclipse.core.runtime, + org.eclipse.ui, + org.eclipse.jface.text, + org.eclipse.ui.editors, + org.eclipse.ui.genericeditor, + org.eclipse.core.filebuffers, + org.eclipse.core.resources, + org.eclipse.e4.ui.di, + org.eclipse.e4.ui.model.workbench, + org.eclipse.ui.themes;bundle-version="1.2.400", + net.mograsim.logic.model;bundle-version="0.1.0";visibility:=reexport, + net.mograsim.logic.model.am2900;bundle-version="0.1.0";visibility:=reexport, + javax.annotation;bundle-version="1.0.0", + net.mograsim.preferences;bundle-version="0.1.0", + net.mograsim.machine, + net.mograsim.plugin.core +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Automatic-Module-Name: net.mograsim.plugin.core +Bundle-Vendor: %Bundle-Vendor.0 +Bundle-Activator: net.mograsim.plugin.MograsimActivator +Bundle-ActivationPolicy: lazy diff --git a/plugins/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties b/plugins/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties new file mode 100644 index 00000000..856144a6 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/OSGI-INF/l10n/bundle.properties @@ -0,0 +1,35 @@ +#Properties file for net.mograsim.plugin.core +Bundle-Vendor = Mograsim Team +Bundle-Name = Mograsim core +content-type.name = Assembler +category.name = Mograsim +view.name = Sample AsmOpsEdit +e4view.name = Simulation und Visualisierung +extension.name = Mograsim Project Builder +extension.name.0 = Mograsim Project Nature +category.name.0 = Mograsim Project Nature commands +command.name = Add/RemoveMograsim Project Nature +command.label = Disable Sample builder +command.label.0 = Enable Sample builder +extension.name.1 = XML Problem +decorator.label = Resource Decorator +themeElementCategory.label = Mograsim +colorDefinition.label = Simulation Background +colorDefinition.description = The Background of the Simulation Visualisation +colorDefinition.label.0 = Simulation Foreground Color +colorDefinition.label.1 = Assembler Comment Color +colorDefinition.label.2 = Assembler Label Color +colorDefinition.label.3 = Assembler Operation Color +colorDefinition.label.4 = Assembler Number Color +colorDefinition.label.5 = Simulation Color 1 +colorDefinition.label.6 = Simulation Color U +colorDefinition.label.7 = Simulation Color X +colorDefinition.label.8 = Simulation Color Z +colorDefinition.label.9 = Simulation Color 0 +colorDefinition.label.10 = Simulation text color +fontDefinition.label = Assembler Operation Style +view.name.0 = Simulation View +view.name.1 = Memory +view.name.1 = Instruction Editor +themeElementCategory.label.0 = Simulation +Bundle-Vendor.0 = Mograsim Team \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/build.properties b/plugins/net.mograsim.plugin.core/build.properties new file mode 100644 index 00000000..7a5784ee --- /dev/null +++ b/plugins/net.mograsim.plugin.core/build.properties @@ -0,0 +1,9 @@ +source.. = src/ +output.. = bin/ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + OSGI-INF/l10n/bundle.properties,\ + OSGI-INF/,\ + icons/ + \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png new file mode 100644 index 00000000..51707352 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_128.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png new file mode 100644 index 00000000..a0584969 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png new file mode 100644 index 00000000..3589af36 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_16_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png new file mode 100644 index 00000000..0eef2dd2 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png new file mode 100644 index 00000000..5fecefe8 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_256_white.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png new file mode 100644 index 00000000..a0dc941a Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png new file mode 100644 index 00000000..5b287ad0 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_32_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png new file mode 100644 index 00000000..4d5f38ff Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_48.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png new file mode 100644 index 00000000..2b6b2e83 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_512.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png new file mode 100644 index 00000000..cbb88e68 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_64.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png new file mode 100644 index 00000000..ff9c9bfe Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png new file mode 100644 index 00000000..bc2386bb Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue-orange/icon_blue-orange_7x8_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png new file mode 100644 index 00000000..8ae04cda Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_128.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png new file mode 100644 index 00000000..d7cc656b Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png new file mode 100644 index 00000000..dedba0c0 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_16_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png new file mode 100644 index 00000000..771b0091 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_256.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png new file mode 100644 index 00000000..2018a5a4 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png new file mode 100644 index 00000000..9b294e7c Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_32_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png new file mode 100644 index 00000000..63e2e040 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_48.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png new file mode 100644 index 00000000..934402bd Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_512.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png new file mode 100644 index 00000000..2582dd58 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_64.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png new file mode 100644 index 00000000..06daaaf3 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png new file mode 100644 index 00000000..250e61fc Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/blue/icon_blue_7x8_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png new file mode 100644 index 00000000..849cc254 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_128.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png new file mode 100644 index 00000000..b99adf87 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_16.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png new file mode 100644 index 00000000..be406743 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_256.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png new file mode 100644 index 00000000..f5793ed7 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_32.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png new file mode 100644 index 00000000..c2d6dc32 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_48.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png new file mode 100644 index 00000000..6860ac7b Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_512.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png new file mode 100644 index 00000000..5c0f9493 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_64.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png new file mode 100644 index 00000000..9723b914 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png new file mode 100644 index 00000000..abd8fe4e Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange-blue/icon_orange-blue_7x8b.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png new file mode 100644 index 00000000..8972d910 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_128.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png new file mode 100644 index 00000000..881c9948 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png new file mode 100644 index 00000000..1c3c070d Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_16_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png new file mode 100644 index 00000000..54295a26 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_256.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png new file mode 100644 index 00000000..1bcc361f Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png new file mode 100644 index 00000000..c842fdfd Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_32_old.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png new file mode 100644 index 00000000..25f277e1 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_48.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png new file mode 100644 index 00000000..edf5f726 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_512.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png new file mode 100644 index 00000000..92cae0b7 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_64.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png new file mode 100644 index 00000000..6a9510f4 Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8.png differ diff --git a/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png new file mode 100644 index 00000000..1818767c Binary files /dev/null and b/plugins/net.mograsim.plugin.core/icons/mograsim/orange/icon_orange_7x8_old.png differ diff --git a/plugins/net.mograsim.plugin.core/plugin.xml b/plugins/net.mograsim.plugin.core/plugin.xml new file mode 100644 index 00000000..dccf76c8 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/plugin.xml @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %colorDefinition.description + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java new file mode 100644 index 00000000..8ff21f49 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/AsmOps.java @@ -0,0 +1,45 @@ +package net.mograsim.plugin; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; + +public class AsmOps +{ + public static Set ops = new HashSet<>(); + public static Set>> listeners = new HashSet<>(); + + static + { + ops.add("add"); + ops.add("mul"); + ops.add("mov"); + ops.add("inc"); + } + + public static void setWords(Collection s) + { + if (ops.size() == s.size() && ops.containsAll(s)) + return; + ops.clear(); + ops.addAll(s); + update(); + } + + public static void addListener(Consumer> con) + { + listeners.add(con); + con.accept(ops); + } + + public static void removeListener(Consumer> con) + { + listeners.remove(con); + } + + public static void update() + { + listeners.forEach(c -> c.accept(ops)); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java new file mode 100644 index 00000000..cc96edbb --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MachineContext.java @@ -0,0 +1,66 @@ +package net.mograsim.plugin; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +import net.mograsim.logic.model.am2900.machine.Am2900Machine; +import net.mograsim.logic.model.am2900.machine.Am2900MachineDefinition; +import net.mograsim.machine.Machine; +import net.mograsim.machine.MachineRegistry; + +public class MachineContext +{ + private Machine machine; + private Set observers; + private static MachineContext instance; + + private MachineContext() + { + observers = new HashSet<>(); + } + + public static MachineContext getInstance() + { + if (instance == null) + { + instance = new MachineContext(); + // TODO don't hardcode the Am2900 + instance.setMachine(new Am2900Machine((Am2900MachineDefinition) MachineRegistry.getinstalledMachines().get("Am2900"))); + } + return instance; + } + + public Machine getMachine() + { + return machine; + } + + public void setMachine(Machine machine) + { + this.machine = machine; + notifyObservers(machine); + } + + public void registerObserver(ContextObserver ob) + { + observers.add(ob); + ob.setMachine(Optional.ofNullable(machine)); + } + + public void deregisterObserver(ContextObserver ob) + { + observers.remove(ob); + } + + private void notifyObservers(Machine machine) + { + observers.forEach(ob -> ob.setMachine(Optional.ofNullable(machine))); + } + + @FunctionalInterface + public static interface ContextObserver + { + void setMachine(Optional machine); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java new file mode 100644 index 00000000..c17f5304 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/MograsimActivator.java @@ -0,0 +1,14 @@ +package net.mograsim.plugin; + +import org.eclipse.ui.plugin.AbstractUIPlugin; + +import net.mograsim.machine.MachineRegistry; + +public final class MograsimActivator extends AbstractUIPlugin +{ + + public MograsimActivator() + { + MachineRegistry.reload(); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java new file mode 100644 index 00000000..5fcc1688 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/SimulationPreview.java @@ -0,0 +1,103 @@ +package net.mograsim.plugin; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.themes.ITheme; +import org.eclipse.ui.themes.IThemePreview; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.model.LogicExecuter; +import net.mograsim.logic.model.LogicUICanvas; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.atomic.ModelNotGate; +import net.mograsim.logic.model.model.components.atomic.ModelOrGate; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.preferences.Preferences; + +public class SimulationPreview implements IThemePreview +{ + private LogicUICanvas ui; + private LogicExecuter exec; + private Preferences oldPreferences; + private Preferences currentThemePreferences; + + @Override + @SuppressWarnings("unused") + public void createControl(Composite parent, ITheme currentTheme) + { + oldPreferences = Preferences.current(); + + currentThemePreferences = new ThemePreferences(currentTheme); + // TODO this will change the global preferences; so if another LogicUICanvas redraws, it will use the "new" colors too. + Preferences.setPreferences(currentThemePreferences); + + LogicModelModifiable model = new LogicModelModifiable(); + CoreModelParameters params = new CoreModelParameters(); + params.gateProcessTime = 50; + params.wireTravelTime = 10; + + ModelManualSwitch rIn = new ModelManualSwitch(model, 1); + rIn.moveTo(10, 10); + ModelManualSwitch sIn = new ModelManualSwitch(model, 1); + sIn.moveTo(10, 70); + + ModelOrGate or1 = new ModelOrGate(model, 1); + or1.moveTo(70, 12.5); + new ModelWire(model, rIn.getOutputPin(), or1.getPin("A")); + + ModelOrGate or2 = new ModelOrGate(model, 1); + or2.moveTo(70, 62.5); + new ModelWire(model, sIn.getOutputPin(), or2.getPin("B")); + + ModelNotGate not1 = new ModelNotGate(model, 1); + not1.moveTo(110, 17.5); + new ModelWire(model, or1.getPin("Y"), not1.getPin("A")); + + ModelNotGate not2 = new ModelNotGate(model, 1); + not2.moveTo(110, 67.5); + new ModelWire(model, or2.getPin("Y"), not2.getPin("A")); + + ModelWireCrossPoint p1 = new ModelWireCrossPoint(model, 1); + p1.moveCenterTo(140, 22.5); + new ModelWire(model, not1.getPin("Y"), p1); + new ModelWire(model, p1, or2.getPin("A"), new Point(140, 35), new Point(50, 60), new Point(50, 67.5)); + + ModelWireCrossPoint p2 = new ModelWireCrossPoint(model, 1); + p2.moveCenterTo(140, 72.5); + new ModelWire(model, not2.getPin("Y"), p2); + new ModelWire(model, p2, or1.getPin("B"), new Point(140, 60), new Point(50, 35), new Point(50, 27.5)); + + ModelWireCrossPoint o1 = new ModelWireCrossPoint(model, 1); + o1.moveCenterTo(150, 22.5); + new ModelWire(model, p1, o1); + + ModelWireCrossPoint o2 = new ModelWireCrossPoint(model, 1); + o2.moveCenterTo(150, 72.5); + new ModelWire(model, p2, o2); + + Timeline t = LogicCoreAdapter.convert(model, params); + exec = new LogicExecuter(t); + + rIn.clicked(0, 0); + + ui = new LogicUICanvas(parent, SWT.NONE, model); + + ui.zoom(3.5, 10, 10); + exec.startLiveExecution(); + + currentTheme.addPropertyChangeListener(e -> ui.redraw()); + } + + @Override + public void dispose() + { + exec.stopLiveExecution(); + if (Preferences.current() == currentThemePreferences) + Preferences.setPreferences(oldPreferences); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java new file mode 100644 index 00000000..42da25d1 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/ThemePreferences.java @@ -0,0 +1,65 @@ +package net.mograsim.plugin; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.resource.ColorRegistry; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.ui.statushandlers.StatusManager; +import org.eclipse.ui.themes.ITheme; + +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.DefaultPreferences; +import net.mograsim.preferences.Preferences; + +// TODO proper getInt/getDouble implementation, maybe via own preferences page? +public class ThemePreferences extends Preferences +{ + private final ITheme theme; + + public ThemePreferences(ITheme theme) + { + this.theme = theme; + } + + @Override + public boolean getBoolean(String name) + { + return new DefaultPreferences().getBoolean(name); + } + + @Override + public int getInt(String name) + { + return new DefaultPreferences().getInt(name); + } + + @Override + public double getDouble(String name) + { + return new DefaultPreferences().getDouble(name); + } + + @Override + public ColorDefinition getColorDefinition(String name) + { + RGB rgb = getColorRegistry().getRGB(name); + if (rgb == null) + { + StatusManager.getManager().handle(new Status(IStatus.ERROR, "net.mograsim.plugin.core", "No color for name " + name)); + return null; + } + return new ColorDefinition(rgb.red, rgb.green, rgb.blue); + } + + @Override + public Color getColor(String name) + { + return getColorRegistry().get(name); + } + + private ColorRegistry getColorRegistry() + { + return theme.getColorRegistry(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java new file mode 100644 index 00000000..580c3249 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmNumberUtil.java @@ -0,0 +1,211 @@ +package net.mograsim.plugin.asm; + +import static java.lang.String.format; + +import java.math.BigInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public final class AsmNumberUtil +{ + + private AsmNumberUtil() + { + + } + + private static final String sgnPat = "([-+]?)"; + private static final String binPat = "((?:[01]+_)*[01]+)"; + private static final String octPat = "((?:[0-7]+_)*[0-7]+)"; + private static final String decPat = "((?:[0-9]+_)*[0-9]+)"; + private static final String hexPat = "((?:[0-9a-f]+_)*[0-9a-f]+)"; + + private static final String preferredBinPat = "%1$s0b%2$s"; + private static final String preferredOctPat = "%s%sq"; + private static final String preferredDecPat = "%s%s"; + private static final String preferredHexPat = "%1$s0x%2$s"; + + static final Pattern numberBin = Pattern.compile(format(preferredBinPat + "|%1$s%2$sb", sgnPat, binPat), Pattern.CASE_INSENSITIVE); + static final Pattern numberOct = Pattern.compile(format(preferredOctPat, sgnPat, octPat), Pattern.CASE_INSENSITIVE); + static final Pattern numberDec = Pattern.compile(format(preferredDecPat, sgnPat, decPat)); + static final Pattern numberHex = Pattern.compile(format(preferredHexPat + "|%1$s%2$sh", sgnPat, hexPat), Pattern.CASE_INSENSITIVE); + static final Pattern numberFloat = Pattern.compile(format("%1$s%2$s(?:\\.%2$s)?(?:e%1$s%2$s)?", sgnPat, decPat), + Pattern.CASE_INSENSITIVE); + + public static boolean isPrefix(CharSequence cs, Pattern p) + { + Matcher m = p.matcher(cs); + return m.matches() || m.hitEnd(); + } + + public static boolean isBinary(CharSequence cs) + { + return numberBin.matcher(cs).matches(); + } + + public static boolean isOctal(CharSequence cs) + { + return numberOct.matcher(cs).matches(); + } + + public static boolean isDecimal(CharSequence cs) + { + return numberDec.matcher(cs).matches(); + } + + public static boolean isHexadecimal(CharSequence cs) + { + return numberHex.matcher(cs).matches(); + } + + public static boolean isFloatingPoint(CharSequence cs) + { + return numberFloat.matcher(cs).matches(); + } + + public static boolean isNumber(CharSequence cs) + { + return getType(cs) != NumberType.NONE; + } + + public static boolean quickCheckForNumber(CharSequence cs) + { + if (cs.length() == 0 || !isStart(cs.charAt(0))) + return false; + return cs.length() == 1 || isPart(cs.charAt(1)); + } + + public static boolean isStart(int c) + { + return isDigit(c) || c == '+' || c == '-'; + } + + public static boolean isDigit(int c) + { + return ('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'); + } + + public static boolean isPart(int c) + { + return isDigit(c) || isMarker(Character.toLowerCase(c)); + } + + public static boolean isMarker(int lowerCase) + { + switch (lowerCase) + { + case '.': + case '_': + case '+': + case '-': + case 'e': + case 'x': + case 'b': + case 'q': + case 'h': + return true; + default: + return false; + } + } + + public static NumberType getType(CharSequence cs) + { + if (!quickCheckForNumber(cs)) + return NumberType.NONE; + if (isDecimal(cs)) + return NumberType.DECIMAL; + if (isHexadecimal(cs)) + return NumberType.HEXADECIMAL; + if (isBinary(cs)) + return NumberType.BINARY; + if (isOctal(cs)) + return NumberType.OCTAL; + if (isFloatingPoint(cs)) + return NumberType.FLOATINGPOINT; + return NumberType.NONE; + } + + /** + * Checks if the {@link CharSequence} is a prefix of a valid number, and returns the NumberType it is a prefix of. If a String is a + * prefix of multiple different {@link NumberType}s, the one with the smallest radix is returned. If no valid {@link NumberType} is + * found, {@link NumberType#NONE} is returned. + * + * @param cs The potential prefix + * @return The type the {@link CharSequence} is a prefix of + */ + public static NumberType prefixOfType(CharSequence cs) + { + if (isPrefix(cs, numberBin)) + return NumberType.BINARY; + if (isPrefix(cs, numberOct)) + return NumberType.OCTAL; + if (isPrefix(cs, numberDec)) + return NumberType.DECIMAL; + if (isPrefix(cs, numberHex)) + return NumberType.HEXADECIMAL; + if (isPrefix(cs, numberFloat)) + return NumberType.FLOATINGPOINT; + return NumberType.NONE; + } + + private static CharSequence extractSignAndDigits(NumberType type, CharSequence cs) + { + return type.numberPattern.matcher(cs).replaceAll("$1$2").replaceAll("_", ""); + } + + /** + * Computes the {@link BigInteger} value of a {@link CharSequence}, by determining the {@link NumberType} and parsing the number with + * the determined radix. + * + * @throws NumberFormatException if the {@link CharSequence} does not match any of the expected number patterns + */ + public static BigInteger valueOf(CharSequence cs) + { + NumberType type = getType(cs); + if (NumberType.NONE.equals(type)) + throw new NumberFormatException(); + return new BigInteger(extractSignAndDigits(type, cs).toString(), type.radix); + } + + /** + * Formats a {@link BigInteger} in accordance with the pattern associated with the supplied {@link NumberType} + */ + public static String toString(BigInteger number, NumberType type) + { + String pattern; + switch (type) + { + case BINARY: + pattern = preferredBinPat; + break; + case OCTAL: + pattern = preferredOctPat; + break; + default: + case DECIMAL: + pattern = preferredDecPat; + break; + case HEXADECIMAL: + pattern = preferredHexPat; + } + if (number.signum() < 0) + return String.format(pattern, "-", number.abs().toString(type.radix)); + return String.format(pattern, "", number.toString(type.radix)); + } + + public enum NumberType + { + NONE(-1, null), BINARY(2, AsmNumberUtil.numberBin), OCTAL(8, AsmNumberUtil.numberOct), DECIMAL(10, AsmNumberUtil.numberDec), + HEXADECIMAL(16, AsmNumberUtil.numberHex), FLOATINGPOINT(10, AsmNumberUtil.numberFloat); + + public final int radix; + final Pattern numberPattern; + + NumberType(int radix, Pattern numberPattern) + { + this.radix = radix; + this.numberPattern = numberPattern; + } + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java new file mode 100644 index 00000000..cc0d0ffa --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/AsmOpsEdit.java @@ -0,0 +1,212 @@ +package net.mograsim.plugin.asm; + +import java.util.Arrays; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.eclipse.e4.ui.di.Persist; +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ITableLabelProvider; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchActionConstants; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.ViewPart; + +import net.mograsim.plugin.AsmOps; + +/** + * This sample class demonstrates how to plug-in a new workbench view. The view shows data obtained from the model. The sample creates a + * dummy model on the fly, but a real implementation would connect to the model available either in this or another plug-in (e.g. the + * workspace). The view is connected to the model using a content provider. + *

+ * The view uses a label provider to define how model objects should be presented in the view. Each view can present the same model objects + * using different labels and icons, if needed. Alternatively, a single label provider can be shared between views in order to ensure that + * objects of the same type are presented in the same way everywhere. + *

+ */ + +public class AsmOpsEdit extends ViewPart +{ + + @Inject + private MPart part; + + /** + * The ID of the view as specified by the extension. + */ + public static final String ID = "plugintest.views.AsmOpsEdit"; + + @Inject + IWorkbench workbench; + + private Text txtInput; + private TableViewer viewer; + + private IAction saveAction; + + class ViewLabelProvider extends LabelProvider implements ITableLabelProvider + { + @Override + public String getColumnText(Object obj, int index) + { + return getText(obj); + } + + @Override + public Image getColumnImage(Object obj, int index) + { + return getImage(obj); + } + + @Override + public Image getImage(Object obj) + { + return workbench.getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT); + } + } + + @Override + public void createPartControl(Composite parent) + { + parent.setLayout(new GridLayout(1, false)); + + txtInput = new Text(parent, SWT.BORDER); + txtInput.setMessage("Enter new Asm OP"); + txtInput.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + txtInput.addKeyListener(new KeyListener() + { + + @Override + public void keyReleased(KeyEvent e) + { + // TODO Auto-generated method stub + + } + + @Override + public void keyPressed(KeyEvent e) + { + if (e.keyCode == SWT.CR || e.keyCode == SWT.LF) + { + String in = txtInput.getText().toLowerCase(); + if (in.startsWith("-")) + viewer.remove(in.substring(1).trim()); + else + viewer.add(in.trim()); + txtInput.setText(""); + part.setDirty(true); + save(); + } + } + }); + + viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); + + viewer.setContentProvider(ArrayContentProvider.getInstance()); + viewer.setInput(createInitialDataModel()); + viewer.setLabelProvider(new ViewLabelProvider()); + viewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); + + // Create the help context id for the viewer's control + workbench.getHelpSystem().setHelp(viewer.getControl(), "PluginTest.viewer"); + getSite().setSelectionProvider(viewer); + makeActions(); + contributeToActionBars(); + hookContextMenu(); + } + + private Object createInitialDataModel() + { + return AsmOps.ops; + } + + @Override + public void setFocus() + { + txtInput.setFocus(); + } + + @Persist + public void save() + { + AsmOps.setWords(Arrays.stream(viewer.getTable().getItems()).map(i -> (String) i.getData()).collect(Collectors.toList())); + viewer.refresh(); + } + + private void makeActions() + { + saveAction = new Action() + { + public void run() + { + save(); + part.setDirty(false); + } + }; + saveAction.setText("Save"); + saveAction.setToolTipText("Save Changes To ISA"); + saveAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK)); + } + + private void contributeToActionBars() + { + IActionBars bars = getViewSite().getActionBars(); + fillLocalPullDown(bars.getMenuManager()); + fillLocalToolBar(bars.getToolBarManager()); + } + + private void fillLocalPullDown(IMenuManager manager) + { + manager.add(saveAction); + } + + private void fillContextMenu(IMenuManager manager) + { + manager.add(saveAction); + // Other plug-ins can contribute there actions here + manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); + } + + private void fillLocalToolBar(IToolBarManager manager) + { + manager.add(saveAction); + } + + private void hookContextMenu() + { + MenuManager menuMgr = new MenuManager("#PopupMenu"); + menuMgr.setRemoveAllWhenShown(true); + menuMgr.addMenuListener(new IMenuListener() + { + public void menuAboutToShow(IMenuManager manager) + { + AsmOpsEdit.this.fillContextMenu(manager); + } + }); + Menu menu = menuMgr.createContextMenu(viewer.getControl()); + viewer.getControl().setMenu(menu); + getSite().registerContextMenu(menuMgr, viewer); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java new file mode 100644 index 00000000..7198a27a --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmAutoEditStrategy.java @@ -0,0 +1,38 @@ +package net.mograsim.plugin.asm.editor; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.DocumentCommand; +import org.eclipse.jface.text.IAutoEditStrategy; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; + +public class AsmAutoEditStrategy implements IAutoEditStrategy +{ + + @Override + public void customizeDocumentCommand(IDocument document, DocumentCommand command) + { + if (!">".equals(command.text)) + { // NON-NLS-1 + return; + } + try + { + IRegion region = document.getLineInformationOfOffset(command.offset); + String line = document.get(region.getOffset(), command.offset - region.getOffset()); + int index = line.lastIndexOf('<'); + if (index != -1 && (index != line.length() - 1) && line.charAt(index + 1) != '/') + { + String tag = line.substring(index + 1); + command.caretOffset = command.offset + 1; + command.text += "= natureTag.length() +// && text.substring(offset - natureTag.length(), offset).equals(natureTag)) { +// IProjectNatureDescriptor[] natureDescriptors = workspace.getNatureDescriptors(); +// ICompletionProposal[] proposals = new ICompletionProposal[natureDescriptors.length]; +// for (int i = 0; i < natureDescriptors.length; i++) { +// IProjectNatureDescriptor descriptor = natureDescriptors[i]; +// proposals[i] = new CompletionProposal(descriptor.getNatureId(), offset, 0, +// descriptor.getNatureId().length()); +// } +// return proposals; +// } +// if (text.length() >= projectReferenceTag.length() +// && text.substring(offset - projectReferenceTag.length(), offset).equals(projectReferenceTag)) { +// IProject[] projects = workspace.getRoot().getProjects(); +// ICompletionProposal[] proposals = new ICompletionProposal[projects.length]; +// for (int i = 0; i < projects.length; i++) { +// proposals[i] = new CompletionProposal(projects[i].getName(), offset, 0, projects[i].getName().length()); +// } +// return proposals; +// } +// return new ICompletionProposal[0]; +// text. + return AsmOps.ops.stream().map(o -> new AsmOperationProposal(o, "", offset)).toArray(ICompletionProposal[]::new); + } + + @Override + public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) + { + return null; + } + + @Override + public char[] getCompletionProposalAutoActivationCharacters() + { + return new char[] { '\n', '\r' }; // NON-NLS-1 + } + + @Override + public char[] getContextInformationAutoActivationCharacters() + { + return null; + } + + @Override + public String getErrorMessage() + { + return null; + } + + @Override + public IContextInformationValidator getContextInformationValidator() + { + return null; + } + + private class AsmOperationProposal implements ICompletionProposal, ICompletionProposalExtension4 + { + + private String asmOp; + private String desc; + private int offset; + + public AsmOperationProposal(String asmOp, String desc, int offset) + { + this.asmOp = asmOp; + this.desc = desc; + this.offset = offset; + } + + @Override + public boolean isAutoInsertable() + { + return true; + } + + @Override + public void apply(IDocument document) + { + try + { + document.replace(offset, 0, asmOp); + } + catch (BadLocationException e) + { + // ignore + } + } + + @Override + public Point getSelection(IDocument document) + { + return new Point(offset + asmOp.length(), 0); + } + + @Override + public String getAdditionalProposalInfo() + { + return desc; + } + + @Override + public String getDisplayString() + { + return asmOp; + } + + @Override + public Image getImage() + { + return null; // TODO image? + } + + @Override + public IContextInformation getContextInformation() + { + return new IContextInformation() + { + + @Override + public String getInformationDisplayString() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public Image getImage() + { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getContextDisplayString() + { + // TODO Auto-generated method stub + return null; + } + }; + } + + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java new file mode 100644 index 00000000..91946bc7 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmDocumentValidator.java @@ -0,0 +1,77 @@ +package net.mograsim.plugin.asm.editor; + +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.text.DocumentEvent; +import org.eclipse.jface.text.IDocumentListener; +import org.xml.sax.InputSource; +import org.xml.sax.SAXParseException; + +public class AsmDocumentValidator implements IDocumentListener +{ + + private final IFile file; + private IMarker marker; + + AsmDocumentValidator(IFile file) + { + this.file = file; + } + + @Override + public void documentChanged(DocumentEvent event) + { + if (this.marker != null) + { + try + { + this.marker.delete(); + } + catch (CoreException e) + { + e.printStackTrace(); + } + this.marker = null; + } + try (StringReader reader = new StringReader(event.getDocument().get());) + { + DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + documentBuilder.parse(new InputSource(reader)); + } + catch (Exception ex) + { + try + { + this.marker = file.createMarker(IMarker.PROBLEM); + this.marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); + this.marker.setAttribute(IMarker.MESSAGE, ex.getMessage()); + if (ex instanceof SAXParseException) + { + SAXParseException saxParseException = (SAXParseException) ex; + int lineNumber = saxParseException.getLineNumber(); + int offset = event.getDocument().getLineInformation(lineNumber - 1).getOffset() + saxParseException.getColumnNumber() + - 1; + this.marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); + this.marker.setAttribute(IMarker.CHAR_START, offset); + this.marker.setAttribute(IMarker.CHAR_END, offset + 1); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + @Override + public void documentAboutToBeChanged(DocumentEvent event) + { + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java new file mode 100644 index 00000000..50ab95cd --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmHoverProvider.java @@ -0,0 +1,44 @@ +package net.mograsim.plugin.asm.editor; + +import org.eclipse.core.resources.IProjectNatureDescriptor; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.ITextHover; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.Region; + +public class AsmHoverProvider implements ITextHover +{ + + @Override + public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) + { + // TODO this is logic for .project file to show nature description on hover. + // Replace with your language logic! + String contents = textViewer.getDocument().get(); + int offset = hoverRegion.getOffset(); + int endIndex = contents.indexOf("", offset); + if (endIndex == -1) + return ""; + int startIndex = contents.substring(0, offset).lastIndexOf(""); + if (startIndex == -1) + return ""; + String selection = contents.substring(startIndex + "".length(), endIndex); + + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + IProjectNatureDescriptor[] natureDescriptors = workspace.getNatureDescriptors(); + for (int i = 0; i < natureDescriptors.length; i++) + { + if (natureDescriptors[i].getNatureId().equals(selection)) + return natureDescriptors[i].getLabel(); + } + return ""; + } + + @Override + public IRegion getHoverRegion(ITextViewer textViewer, int offset) + { + return new Region(offset, 0); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java new file mode 100644 index 00000000..655160e0 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmPresentationReconciler.java @@ -0,0 +1,61 @@ +package net.mograsim.plugin.asm.editor; + +import org.eclipse.jface.resource.ColorRegistry; +import org.eclipse.jface.resource.FontRegistry; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.TextAttribute; +import org.eclipse.jface.text.presentation.PresentationReconciler; +import org.eclipse.jface.text.rules.DefaultDamagerRepairer; +import org.eclipse.jface.text.rules.EndOfLineRule; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.RuleBasedScanner; +import org.eclipse.jface.text.rules.Token; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.themes.ITheme; + +import net.mograsim.plugin.asm.editor.rules.AsmLabelRule; +import net.mograsim.plugin.asm.editor.rules.AsmNumberRule; +import net.mograsim.plugin.asm.editor.rules.InstructionRule; + +public class AsmPresentationReconciler extends PresentationReconciler +{ + + private final Token comment = new Token(null); +// private final Token std = new Token(null); + private final Token op = new Token(null); + private final Token label = new Token(null); + private final Token number = new Token(null); + + private IRule[] rules; + + public AsmPresentationReconciler() + { + RuleBasedScanner scanner = new RuleBasedScanner(); + rules = new IRule[4]; + rules[0] = new EndOfLineRule(";", comment); + rules[1] = new AsmLabelRule(label); + rules[2] = new InstructionRule(Token.UNDEFINED, op, true); + rules[3] = new AsmNumberRule(number); + + scanner.setRules(rules); + DefaultDamagerRepairer dr = new DefaultDamagerRepairer(scanner); + this.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); + this.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); + + ITheme current = PlatformUI.getWorkbench().getThemeManager().getCurrentTheme(); + updateStyle(current); + current.getColorRegistry().addListener(e -> updateStyle(current)); + current.getFontRegistry().addListener(e -> updateStyle(current)); + } + + void updateStyle(ITheme current) + { + ColorRegistry cr = current.getColorRegistry(); + FontRegistry fr = current.getFontRegistry(); + comment.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_comment_color"))); + op.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_operation_color"), null, 0, + fr.get("net.mograsim.plugin.asm_operation_font"))); + label.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_label_color"))); + number.setData(new TextAttribute(cr.get("net.mograsim.plugin.asm_number_color"))); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java new file mode 100644 index 00000000..efee8a31 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconciler.java @@ -0,0 +1,37 @@ +package net.mograsim.plugin.asm.editor; + +import java.lang.ref.WeakReference; + +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITextViewer; +import org.eclipse.jface.text.reconciler.Reconciler; +import org.eclipse.jface.text.source.projection.ProjectionViewer; + +import net.mograsim.plugin.AsmOps; + +public class AsmReconciler extends Reconciler +{ + + private AsmReconcilerStrategy fStrategy; + + public AsmReconciler() + { + fStrategy = new AsmReconcilerStrategy(); + this.setReconcilingStrategy(fStrategy, IDocument.DEFAULT_CONTENT_TYPE); + } + + @Override + public void install(ITextViewer textViewer) + { + super.install(textViewer); + ProjectionViewer pViewer = (ProjectionViewer) textViewer; + fStrategy.setProjectionViewer(pViewer); + WeakReference tv = new WeakReference<>(textViewer); + AsmOps.addListener(ops -> + { + System.out.println("refresh"); + if (tv.get() != null) + tv.get().invalidateTextPresentation(); + }); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java new file mode 100644 index 00000000..a3253a43 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/AsmReconcilerStrategy.java @@ -0,0 +1,173 @@ +package net.mograsim.plugin.asm.editor; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.IRegion; +import org.eclipse.jface.text.Position; +import org.eclipse.jface.text.reconciler.DirtyRegion; +import org.eclipse.jface.text.reconciler.IReconcilingStrategy; +import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension; +import org.eclipse.jface.text.source.Annotation; +import org.eclipse.jface.text.source.projection.ProjectionAnnotation; +import org.eclipse.jface.text.source.projection.ProjectionViewer; + +public class AsmReconcilerStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension +{ + private IDocument document; + private String oldDocument; + private ProjectionViewer projectionViewer; + private List oldAnnotations = new ArrayList<>(); + private List oldPositions = new ArrayList<>(); + + @Override + public void setDocument(IDocument document) + { + this.document = document; + } + + public void setProjectionViewer(ProjectionViewer projectionViewer) + { + this.projectionViewer = projectionViewer; + } + + @Override + public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) + { + initialReconcile(); + } + + @Override + public void reconcile(IRegion partition) + { + initialReconcile(); + } + + @Override + public void initialReconcile() + { + if (document.get().equals(oldDocument)) + return; + oldDocument = document.get(); + + List positions = getNewPositionsOfAnnotations(); + + List positionsToRemove = new ArrayList<>(); + List annotationToRemove = new ArrayList<>(); + + for (Position position : oldPositions) + { + if (!positions.contains(position)) + { + projectionViewer.getProjectionAnnotationModel().removeAnnotation(oldAnnotations.get(oldPositions.indexOf(position))); + positionsToRemove.add(position); + annotationToRemove.add(oldAnnotations.get(oldPositions.indexOf(position))); + } else + { + positions.remove(position); + } + } + oldPositions.removeAll(positionsToRemove); + oldAnnotations.removeAll(annotationToRemove); + + for (Position position : positions) + { + Annotation annotation = new ProjectionAnnotation(); + projectionViewer.getProjectionAnnotationModel().addAnnotation(annotation, position); + oldPositions.add(position); + oldAnnotations.add(annotation); + } + } + + private static enum SearchingFor + { + START_OF_TAG, START_OF_WORD, END_OF_WORD, END_OF_LINE + } + + private List getNewPositionsOfAnnotations() + { + List positions = new ArrayList<>(); + Map startOfAnnotation = new HashMap<>(); + SearchingFor searchingFor = SearchingFor.START_OF_TAG; + + int characters = document.getLength(); + int currentCharIndex = 0; + + int wordStartIndex = 0; + int sectionStartIndex = 0; + String word = ""; + + try + { + while (currentCharIndex < characters) + { + char currentChar = document.getChar(currentCharIndex); + switch (searchingFor) + { + case START_OF_TAG: + if (currentChar == '<') + { + char nextChar = document.getChar(currentCharIndex + 1); + if (nextChar != '?') + { + sectionStartIndex = currentCharIndex; + searchingFor = SearchingFor.START_OF_WORD; + } + } + break; + case START_OF_WORD: + if (Character.isLetter(currentChar)) + { + wordStartIndex = currentCharIndex; + searchingFor = SearchingFor.END_OF_WORD; + } + break; + case END_OF_WORD: + if (!Character.isLetter(currentChar)) + { + word = document.get(wordStartIndex, currentCharIndex - wordStartIndex); + if (startOfAnnotation.containsKey(word)) + { + searchingFor = SearchingFor.END_OF_LINE; + } else + { + startOfAnnotation.put(word, sectionStartIndex); + searchingFor = SearchingFor.START_OF_TAG; + } + } + break; + case END_OF_LINE: + if (currentChar == '\n') + { + int start = startOfAnnotation.get(word); + if (document.getLineOfOffset(start) != document.getLineOfOffset(currentCharIndex)) + { + positions.add(new Position(start, currentCharIndex + 1 - start)); + } + startOfAnnotation.remove(word); + searchingFor = SearchingFor.START_OF_TAG; + } + break; + } + currentCharIndex++; + } + } + catch (BadLocationException e) + { + // skip the remainder of file due to error + } + return positions; + } + + @Override + public void setProgressMonitor(IProgressMonitor monitor) + { + // no progress monitor used + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java new file mode 100644 index 00000000..8b0b5736 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/ValidatorDocumentSetupParticipant.java @@ -0,0 +1,29 @@ +package net.mograsim.plugin.asm.editor; + +import org.eclipse.core.filebuffers.IDocumentSetupParticipant; +import org.eclipse.core.filebuffers.IDocumentSetupParticipantExtension; +import org.eclipse.core.filebuffers.LocationKind; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.text.IDocument; + +public class ValidatorDocumentSetupParticipant implements IDocumentSetupParticipant, IDocumentSetupParticipantExtension +{ + + @Override + public void setup(IDocument document) + { + } + + @Override + public void setup(IDocument document, IPath location, LocationKind locationKind) + { + if (locationKind == LocationKind.IFILE) + { + IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(location); + document.addDocumentListener(new AsmDocumentValidator(file)); + } + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java new file mode 100644 index 00000000..b55e0b3c --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmLabelRule.java @@ -0,0 +1,52 @@ +package net.mograsim.plugin.asm.editor.rules; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.jface.text.rules.ICharacterScanner; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.Token; + +public class AsmLabelRule implements IRule +{ + + /** The token to be returned when this rule is successful */ + protected IToken fToken; + + /** + * Creates a rule which will return the specified token when a numerical sequence is detected. + * + * @param token the token to be returned + */ + public AsmLabelRule(IToken token) + { + Assert.isNotNull(token); + fToken = token; + } + + @Override + public IToken evaluate(ICharacterScanner scanner) + { + int c = scanner.read(); + int i = 1; + if (Character.isJavaIdentifierStart(c)) + { + do + { + c = scanner.read(); + i++; + } while (Character.isJavaIdentifierPart(c)); + if (c == ':') + return fToken; + return abort(scanner, i); + } + scanner.unread(); + return Token.UNDEFINED; + } + + private static IToken abort(ICharacterScanner scanner, int i) + { + for (int j = 0; j < i; j++) + scanner.unread(); + return Token.UNDEFINED; + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java new file mode 100644 index 00000000..728030dc --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/AsmNumberRule.java @@ -0,0 +1,59 @@ +package net.mograsim.plugin.asm.editor.rules; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.jface.text.rules.ICharacterScanner; +import org.eclipse.jface.text.rules.IRule; +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.Token; + +import net.mograsim.plugin.asm.AsmNumberUtil; + +public class AsmNumberRule implements IRule +{ + + /** The token to be returned when this rule is successful */ + protected IToken fToken; + + /** + * Creates a rule which will return the specified token when a numerical sequence is detected. + * + * @param token the token to be returned + */ + public AsmNumberRule(IToken token) + { + Assert.isNotNull(token); + fToken = token; + } + + @Override + public IToken evaluate(ICharacterScanner scanner) + { + int i = 1; + int c = scanner.read(); + if (!AsmNumberUtil.isStart(c)) + return abort(scanner, i); + StringBuilder sb = new StringBuilder(); + sb.appendCodePoint(c); + while (true) + { + c = scanner.read(); + i++; + if (AsmNumberUtil.isPart(c)) + sb.appendCodePoint(c); + else + break; + } + if (!AsmNumberUtil.isNumber(sb)) + return abort(scanner, i); + scanner.unread(); + return fToken; + } + + private static IToken abort(ICharacterScanner scanner, int i) + { + for (int j = 0; j < i; j++) + scanner.unread(); + return Token.UNDEFINED; + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java new file mode 100644 index 00000000..df0f80b4 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/asm/editor/rules/InstructionRule.java @@ -0,0 +1,48 @@ +package net.mograsim.plugin.asm.editor.rules; + +import java.util.Objects; +import java.util.Set; + +import org.eclipse.jface.text.rules.IToken; +import org.eclipse.jface.text.rules.IWordDetector; +import org.eclipse.jface.text.rules.WordRule; + +import net.mograsim.plugin.AsmOps; + +public class InstructionRule extends WordRule +{ + private final IToken instToken; + + public InstructionRule(IToken defaultToken, IToken instToken) + { + this(defaultToken, instToken, false); + } + + public InstructionRule(IToken defaultToken, IToken instToken, boolean ignoreCase) + { + super(new InstructionDetector(), Objects.requireNonNull(defaultToken), ignoreCase); + this.instToken = Objects.requireNonNull(instToken); + AsmOps.addListener(this::update); + } + + void update(Set words) + { + fWords.clear(); + words.forEach(s -> fWords.put(s, instToken)); + } + + static class InstructionDetector implements IWordDetector + { + @Override + public boolean isWordStart(char c) + { + return Character.isJavaIdentifierStart(c); + } + + @Override + public boolean isWordPart(char c) + { + return Character.isJavaIdentifierPart(c); + } + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java new file mode 100644 index 00000000..581b4a6f --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/AddRemoveMograsimNatureHandler.java @@ -0,0 +1,82 @@ +package net.mograsim.plugin.nature; + +import java.util.Iterator; +import org.eclipse.core.commands.*; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.handlers.HandlerUtil; + +public class AddRemoveMograsimNatureHandler extends AbstractHandler +{ + + public Object execute(ExecutionEvent event) throws ExecutionException + { + ISelection selection = HandlerUtil.getCurrentSelection(event); + // + if (selection instanceof IStructuredSelection) + { + for (Iterator it = ((IStructuredSelection) selection).iterator(); it.hasNext();) + { + Object element = it.next(); + IProject project = null; + if (element instanceof IProject) + { + project = (IProject) element; + } else if (element instanceof IAdaptable) + { + project = ((IAdaptable) element).getAdapter(IProject.class); + } + if (project != null) + { + try + { + toggleNature(project); + } + catch (CoreException e) + { + // TODO log something + throw new ExecutionException("Failed to toggle nature", e); + } + } + } + } + + return null; + } + + /** + * Toggles sample nature on a project + * + * @param project to have sample nature added or removed + */ + private void toggleNature(IProject project) throws CoreException + { + IProjectDescription description = project.getDescription(); + String[] natures = description.getNatureIds(); + + for (int i = 0; i < natures.length; ++i) + { + if (MograsimNature.NATURE_ID.equals(natures[i])) + { + // Remove the nature + String[] newNatures = new String[natures.length - 1]; + System.arraycopy(natures, 0, newNatures, 0, i); + System.arraycopy(natures, i + 1, newNatures, i, natures.length - i - 1); + description.setNatureIds(newNatures); + project.setDescription(description, null); + return; + } + } + + // Add the nature + String[] newNatures = new String[natures.length + 1]; + System.arraycopy(natures, 0, newNatures, 0, natures.length); + newNatures[natures.length] = MograsimNature.NATURE_ID; + description.setNatureIds(newNatures); + project.setDescription(description, null); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java new file mode 100644 index 00000000..9fc0ea41 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimBuilder.java @@ -0,0 +1,195 @@ +package net.mograsim.plugin.nature; + +import java.util.Map; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IResourceDeltaVisitor; +import org.eclipse.core.resources.IResourceVisitor; +import org.eclipse.core.resources.IncrementalProjectBuilder; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; + +public class MograsimBuilder extends IncrementalProjectBuilder +{ + + class SampleDeltaVisitor implements IResourceDeltaVisitor + { + @Override + public boolean visit(IResourceDelta delta) throws CoreException + { + IResource resource = delta.getResource(); + switch (delta.getKind()) + { + case IResourceDelta.ADDED: + // handle added resource + checkXML(resource); + break; + case IResourceDelta.REMOVED: + // handle removed resource + break; + case IResourceDelta.CHANGED: + // handle changed resource + checkXML(resource); + break; + } + // return true to continue visiting children. + return true; + } + } + + class SampleResourceVisitor implements IResourceVisitor + { + public boolean visit(IResource resource) + { + checkXML(resource); + // return true to continue visiting children. + return true; + } + } + + class XMLErrorHandler extends DefaultHandler + { + + private IFile file; + + public XMLErrorHandler(IFile file) + { + this.file = file; + } + + private void addMarker(SAXParseException e, int severity) + { + MograsimBuilder.this.addMarker(file, e.getMessage(), e.getLineNumber(), severity); + } + + public void error(SAXParseException exception) throws SAXException + { + addMarker(exception, IMarker.SEVERITY_ERROR); + } + + public void fatalError(SAXParseException exception) throws SAXException + { + addMarker(exception, IMarker.SEVERITY_ERROR); + } + + public void warning(SAXParseException exception) throws SAXException + { + addMarker(exception, IMarker.SEVERITY_WARNING); + } + } + + public static final String BUILDER_ID = "PluginTest.mograsimBuilder"; + + private static final String MARKER_TYPE = "PluginTest.xmlProblem"; + + private SAXParserFactory parserFactory; + + private void addMarker(IFile file, String message, int lineNumber, int severity) + { + try + { + IMarker marker = file.createMarker(MARKER_TYPE); + marker.setAttribute(IMarker.MESSAGE, message); + marker.setAttribute(IMarker.SEVERITY, severity); + if (lineNumber == -1) + { + lineNumber = 1; + } + marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); + } + catch (CoreException e) + { + } + } + + @Override + protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException + { + if (kind == FULL_BUILD) + { + fullBuild(monitor); + } else + { + IResourceDelta delta = getDelta(getProject()); + if (delta == null) + { + fullBuild(monitor); + } else + { + incrementalBuild(delta, monitor); + } + } + return null; + } + + protected void clean(IProgressMonitor monitor) throws CoreException + { + // delete markers set and files created + getProject().deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE); + } + + void checkXML(IResource resource) + { + if (resource instanceof IFile && resource.getName().endsWith(".xml")) + { + IFile file = (IFile) resource; + deleteMarkers(file); + XMLErrorHandler reporter = new XMLErrorHandler(file); + try + { + getParser().parse(file.getContents(), reporter); + } + catch (Exception e1) + { + } + } + } + + private void deleteMarkers(IFile file) + { + try + { + file.deleteMarkers(MARKER_TYPE, false, IResource.DEPTH_ZERO); + } + catch (CoreException ce) + { + } + } + + protected void fullBuild(final IProgressMonitor monitor) throws CoreException + { + try + { + getProject().accept(new SampleResourceVisitor()); + } + catch (CoreException e) + { + } + } + + private SAXParser getParser() throws ParserConfigurationException, SAXException + { + if (parserFactory == null) + { + parserFactory = SAXParserFactory.newInstance(); + } + return parserFactory.newSAXParser(); + } + + protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException + { + // the visitor does the work. + delta.accept(new SampleDeltaVisitor()); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java new file mode 100644 index 00000000..5422731e --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/MograsimNature.java @@ -0,0 +1,73 @@ +package net.mograsim.plugin.nature; + +import org.eclipse.core.resources.ICommand; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IProjectNature; +import org.eclipse.core.runtime.CoreException; + +public class MograsimNature implements IProjectNature +{ + + /** + * ID of this project nature + */ + public static final String NATURE_ID = "net.mograsim"; + + private IProject project; + + @Override + public void configure() throws CoreException + { + IProjectDescription desc = project.getDescription(); + ICommand[] commands = desc.getBuildSpec(); + + for (int i = 0; i < commands.length; ++i) + { + if (commands[i].getBuilderName().equals(MograsimBuilder.BUILDER_ID)) + { + return; + } + } + + ICommand[] newCommands = new ICommand[commands.length + 1]; + System.arraycopy(commands, 0, newCommands, 0, commands.length); + ICommand command = desc.newCommand(); + command.setBuilderName(MograsimBuilder.BUILDER_ID); + newCommands[newCommands.length - 1] = command; + desc.setBuildSpec(newCommands); + project.setDescription(desc, null); + } + + @Override + public void deconfigure() throws CoreException + { + IProjectDescription description = getProject().getDescription(); + ICommand[] commands = description.getBuildSpec(); + for (int i = 0; i < commands.length; ++i) + { + if (commands[i].getBuilderName().equals(MograsimBuilder.BUILDER_ID)) + { + ICommand[] newCommands = new ICommand[commands.length - 1]; + System.arraycopy(commands, 0, newCommands, 0, i); + System.arraycopy(commands, i + 1, newCommands, i, commands.length - i - 1); + description.setBuildSpec(newCommands); + project.setDescription(description, null); + return; + } + } + } + + @Override + public IProject getProject() + { + return project; + } + + @Override + public void setProject(IProject project) + { + this.project = project; + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java new file mode 100644 index 00000000..c94e440a --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/AddressLabelProvider.java @@ -0,0 +1,19 @@ +package net.mograsim.plugin.tables; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.ColumnLabelProvider; + +import net.mograsim.plugin.asm.AsmNumberUtil; +import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; + +public class AddressLabelProvider extends ColumnLabelProvider +{ + @Override + public String getText(Object element) + { + @SuppressWarnings("rawtypes") + TableRow row = (TableRow) element; + return AsmNumberUtil.toString(BigInteger.valueOf(row.address), NumberType.HEXADECIMAL); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java new file mode 100644 index 00000000..dde6b015 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/DisplaySettings.java @@ -0,0 +1,49 @@ +package net.mograsim.plugin.tables; + +import java.util.HashSet; +import java.util.Set; + +import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; + +public class DisplaySettings +{ + private NumberType dataNumberType; + private final Set observers; + + public DisplaySettings() + { + this(NumberType.HEXADECIMAL); + } + + public DisplaySettings(NumberType dataNumberType) + { + this.dataNumberType = dataNumberType; + observers = new HashSet<>(); + } + + public NumberType getDataNumberType() + { + return dataNumberType; + } + + public void setDataNumberType(NumberType dataNumberType) + { + this.dataNumberType = dataNumberType; + notifyObservers(); + } + + void notifyObservers() + { + observers.forEach(r -> r.run()); + } + + public void addObserver(Runnable ob) + { + observers.add(ob); + } + + public void removeObserver(Runnable ob) + { + observers.remove(ob); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java new file mode 100644 index 00000000..1b371e28 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/LazyTableViewer.java @@ -0,0 +1,64 @@ +package net.mograsim.plugin.tables; + +import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.ILazyContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Table; + +public class LazyTableViewer extends TableViewer +{ + public static Color highlightColor = Display.getDefault().getSystemColor(SWT.COLOR_YELLOW); + + public LazyTableViewer(Composite parent, int style) + { + super(parent, style | SWT.VIRTUAL); + } + + public LazyTableViewer(Composite parent) + { + super(parent); + } + + public LazyTableViewer(Table table) + { + super(table); + } + + public void highlightRow(int index, boolean highlight) + { + Table table = getTable(); + if (index < 0 || index >= table.getItemCount()) + return; + table.getItem(index).setBackground(highlight ? highlightColor : table.getBackground()); + System.out.println("Infinite loop!!!"); + ((ILazyContentProvider) getContentProvider()).updateElement(index); + } + + @Override + public void setContentProvider(IContentProvider provider) + { + if (!(provider instanceof ILazyContentProvider)) + throw new IllegalArgumentException("Content provider must be an ILazyContentProvider"); + super.setContentProvider(provider); + } + + @Override + public void refresh() + { + Table t = getTable(); + ILazyContentProvider provider = (ILazyContentProvider) getContentProvider(); + doClearAll(); + int startIndex = t.getTopIndex(); + int numRows = t.getBounds().height / t.getItemHeight(); + int endIndex = Integer.min(startIndex + numRows + 5, doGetItemCount()); + + for (int i = startIndex; i < endIndex; i++) + { + provider.updateElement(i); + } + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java new file mode 100644 index 00000000..a1d81072 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditingSupport.java @@ -0,0 +1,62 @@ +package net.mograsim.plugin.tables; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TextCellEditor; + +import net.mograsim.plugin.asm.AsmNumberUtil; + +public abstract class NumberCellEditingSupport extends EditingSupport +{ + private final TableViewer viewer; + private final CellEditor editor; + private final DisplaySettings displaySettings; + + public NumberCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings) + { + super(viewer); + this.viewer = viewer; + this.displaySettings = displaySettings; + editor = new TextCellEditor(viewer.getTable()); + editor.setValidator(new NumberCellEditorValidator()); + } + + @Override + final protected boolean canEdit(Object element) + { + return true; + } + + @Override + final protected CellEditor getCellEditor(Object element) + { + return editor; + } + + @Override + final protected Object getValue(Object element) + { + return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType()); + } + + @Override + final protected void setValue(Object element, Object userInput) + { + try + { + setAsBigInteger(element, AsmNumberUtil.valueOf((String) userInput)); + } + catch (@SuppressWarnings("unused") NumberFormatException e) + { + setAsBigInteger(element, BigInteger.valueOf(0)); + } + viewer.update(element, null); + } + + protected abstract void setAsBigInteger(Object element, BigInteger value); + + protected abstract BigInteger getAsBigInteger(Object element); +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java new file mode 100644 index 00000000..e0b445dd --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberCellEditorValidator.java @@ -0,0 +1,17 @@ +package net.mograsim.plugin.tables; + +import org.eclipse.jface.viewers.ICellEditorValidator; + +import net.mograsim.plugin.asm.AsmNumberUtil; + +public class NumberCellEditorValidator implements ICellEditorValidator +{ + + @Override + public String isValid(Object value) + { + return AsmNumberUtil.NumberType.NONE.equals(AsmNumberUtil.getType((String) value)) ? (String) value + "is not a valid number" + : null; + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java new file mode 100644 index 00000000..6ee2c2b4 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/NumberColumnLabelProvider.java @@ -0,0 +1,25 @@ +package net.mograsim.plugin.tables; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.ColumnLabelProvider; + +import net.mograsim.plugin.asm.AsmNumberUtil; + +public abstract class NumberColumnLabelProvider extends ColumnLabelProvider +{ + private DisplaySettings displaySettings; + + public NumberColumnLabelProvider(DisplaySettings displaySettings) + { + this.displaySettings = displaySettings; + } + + @Override + public String getText(Object element) + { + return AsmNumberUtil.toString(getAsBigInteger(element), displaySettings.getDataNumberType()); + } + + public abstract BigInteger getAsBigInteger(Object element); +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java new file mode 100644 index 00000000..b72df0e9 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/RadixSelector.java @@ -0,0 +1,67 @@ +package net.mograsim.plugin.tables; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; + +public class RadixSelector +{ + private final Composite parent; + private final DisplaySettings target; + private Label label; + private Combo combo; + + public RadixSelector(Composite parent, DisplaySettings target) + { + this.parent = parent; + this.target = target; + setupRadixSelector(); + } + + private void setupRadixSelector() + { + label = new Label(parent, SWT.NONE); + label.setText("Radix: "); + combo = new Combo(parent, SWT.READ_ONLY); + + String entries[] = new String[] { "Binary", "Octal", "Decimal", "Hexadecimal" }; + NumberType corTypes[] = new NumberType[] { NumberType.BINARY, NumberType.OCTAL, NumberType.DECIMAL, NumberType.HEXADECIMAL }; + combo.setItems(entries); + combo.select(3); + combo.addSelectionListener(new SelectionListener() + { + @Override + public void widgetSelected(SelectionEvent e) + { + int index = combo.getSelectionIndex(); + if (index == -1) + target.setDataNumberType(NumberType.HEXADECIMAL); + else + { + target.setDataNumberType(corTypes[index]); + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) + { + widgetSelected(e); + } + }); + } + + public Label getLabel() + { + return label; + } + + public Combo getCombo() + { + return combo; + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java new file mode 100644 index 00000000..46b7c5c3 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/TableRow.java @@ -0,0 +1,23 @@ +package net.mograsim.plugin.tables; + +public class TableRow +{ + public final T data; + public final long address; + + public TableRow(long address, T data) + { + this.data = data; + this.address = address; + } + + public T getData() + { + return data; + } + + public long getAddress() + { + return address; + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java new file mode 100644 index 00000000..46eefcd9 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryCellEditingSupport.java @@ -0,0 +1,30 @@ +package net.mograsim.plugin.tables.memory; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.TableViewer; + +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.NumberCellEditingSupport; + +public class MemoryCellEditingSupport extends NumberCellEditingSupport +{ + public MemoryCellEditingSupport(TableViewer viewer, DisplaySettings displaySettings) + { + super(viewer, displaySettings); + } + + @Override + protected void setAsBigInteger(Object element, BigInteger value) + { + MemoryTableRow row = (MemoryTableRow) element; + row.getMemory().setCellAsBigInteger(row.address, value); + } + + @Override + protected BigInteger getAsBigInteger(Object element) + { + MemoryTableRow row = (MemoryTableRow) element; + return row.getMemory().getCellAsBigInteger(row.address); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java new file mode 100644 index 00000000..aaecc754 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableContentProvider.java @@ -0,0 +1,79 @@ +package net.mograsim.plugin.tables.memory; + +import org.eclipse.jface.viewers.ILazyContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.widgets.Display; + +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MemoryObserver; + +public class MemoryTableContentProvider implements ILazyContentProvider, MemoryObserver +{ + private long lower; + private TableViewer viewer; + private final static int limit = 10_000; + private int amount = 0; + private MainMemory memory; + + public void setLowerBound(long lower) + { + if (memory != null) + this.lower = Long.min(memory.getDefinition().getMaximalAddress(), Long.max(memory.getDefinition().getMinimalAddress(), lower)); + else + this.lower = lower; + updateItemCount(); + } + + public void updateItemCount() + { + if (memory != null) + { + long size = memory.getDefinition().getMaximalAddress() - lower; + viewer.setItemCount(size > amount ? amount : (int) size); + } else + viewer.setItemCount(0); + } + + public long getLowerBound() + { + return lower; + } + + public void setAmount(int amount) + { + this.amount = Integer.min(amount, limit); + updateItemCount(); + } + + public int getAmount() + { + return amount; + } + + @Override + public void updateElement(int index) + { + long address = lower + index; + if (address <= memory.getDefinition().getMaximalAddress()) + viewer.replace(new MemoryTableRow(address, memory), index); + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) + { + this.viewer = (TableViewer) viewer; + this.memory = (MainMemory) newInput; + if (oldInput != null) + ((MainMemory) oldInput).deregisterObserver(this); + if (memory != null) + memory.registerObserver(this); + setLowerBound(0L); + } + + @Override + public void update(long address) + { + Display.getDefault().asyncExec(() -> updateElement((int) (address - lower))); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java new file mode 100644 index 00000000..81ee6e65 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryTableRow.java @@ -0,0 +1,17 @@ +package net.mograsim.plugin.tables.memory; + +import net.mograsim.machine.MainMemory; +import net.mograsim.plugin.tables.TableRow; + +public class MemoryTableRow extends TableRow +{ + public MemoryTableRow(long address, MainMemory memory) + { + super(address, memory); + } + + public MainMemory getMemory() + { + return getData(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java new file mode 100644 index 00000000..09368807 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java @@ -0,0 +1,175 @@ +package net.mograsim.plugin.tables.memory; + +import java.math.BigInteger; +import java.util.Optional; + +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.part.ViewPart; + +import net.mograsim.machine.Machine; +import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MainMemoryDefinition; +import net.mograsim.machine.standard.memory.WordAddressableMemory; +import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.MachineContext.ContextObserver; +import net.mograsim.plugin.asm.AsmNumberUtil; +import net.mograsim.plugin.tables.AddressLabelProvider; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.LazyTableViewer; +import net.mograsim.plugin.tables.NumberColumnLabelProvider; +import net.mograsim.plugin.tables.RadixSelector; + +public class MemoryView extends ViewPart implements ContextObserver +{ + private LazyTableViewer viewer; + private MemoryTableContentProvider provider; + private DisplaySettings displaySettings; + + @Override + public void createPartControl(Composite parent) + { + provider = new MemoryTableContentProvider(); + displaySettings = new DisplaySettings(); + + GridLayout layout = new GridLayout(6, false); + parent.setLayout(layout); + + createHeader(parent); + createViewer(parent); + + displaySettings.addObserver(() -> viewer.refresh()); + + setupContextBinding(); + } + + @SuppressWarnings("unused") + private void createHeader(Composite parent) + { + Label fromLabel = new Label(parent, SWT.NONE); + fromLabel.setText("Address: "); + Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH); + fromText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); + VerifyListener vl = new NumberVerifyListener(); + fromText.addVerifyListener(vl); + fromText.setText("0"); + fromText.addModifyListener(e -> + { + try + { + provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue()); + viewer.refresh(); + } + catch (NumberFormatException ex) + { + // Nothing to do here + } + }); + + Label amountLabel = new Label(parent, SWT.NONE); + amountLabel.setText("Number of cells: "); + Text amountText = new Text(parent, SWT.BORDER | SWT.SEARCH); + amountText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); + amountText.addVerifyListener(vl); + amountText.setText("0"); + amountText.addModifyListener(e -> + { + try + { + provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue()); + viewer.refresh(); + } + catch (NumberFormatException ex) + { + // Nothing to do here + } + }); + new RadixSelector(parent, displaySettings); + } + + private void createViewer(Composite parent) + { + viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); + createColumns(); + Table table = viewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + viewer.setUseHashlookup(true); + viewer.setContentProvider(provider); + bindMainMemory(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE))); + getSite().setSelectionProvider(viewer); + + GridData gd = new GridData(); + gd.verticalAlignment = GridData.FILL; + gd.horizontalSpan = 6; + gd.grabExcessHorizontalSpace = true; + gd.grabExcessVerticalSpace = true; + gd.horizontalAlignment = GridData.FILL; + viewer.getControl().setLayoutData(gd); + } + + private void createColumns() + { + String[] titles = { "Address", "Data" }; + int[] bounds = { 100, 100 }; + + TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]); + col.setLabelProvider(new AddressLabelProvider()); + + col = createTableViewerColumn(titles[1], bounds[1]); + col.setLabelProvider(new NumberColumnLabelProvider(displaySettings) + { + @Override + public BigInteger getAsBigInteger(Object element) + { + MemoryTableRow row = (MemoryTableRow) element; + return row.getMemory().getCellAsBigInteger(row.address); + } + + }); + col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings)); + } + + private TableViewerColumn createTableViewerColumn(String title, int bound) + { + TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); + TableColumn column = viewerColumn.getColumn(); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(false); + return viewerColumn; + } + + @Override + public void setFocus() + { + viewer.getControl().setFocus(); + } + + private void bindMainMemory(MainMemory m) + { + viewer.setInput(m); + } + + private void setupContextBinding() + { + MachineContext.getInstance().registerObserver(this); + setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); + } + + @Override + public void setMachine(Optional machine) + { + if (machine.isPresent()) + bindMainMemory(machine.get().getMainMemory()); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java new file mode 100644 index 00000000..54d71762 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/NumberVerifyListener.java @@ -0,0 +1,26 @@ +package net.mograsim.plugin.tables.memory; + +import org.eclipse.swt.events.VerifyEvent; +import org.eclipse.swt.events.VerifyListener; +import org.eclipse.swt.widgets.Text; + +import net.mograsim.plugin.asm.AsmNumberUtil; +import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; + +public class NumberVerifyListener implements VerifyListener +{ + + @Override + public void verifyText(VerifyEvent e) + { + String text = computeModifiedText(e); + e.doit = !NumberType.NONE.equals(AsmNumberUtil.prefixOfType(text)); + } + + private static String computeModifiedText(VerifyEvent e) + { + String modifiedText = ((Text) e.getSource()).getText(); + modifiedText = modifiedText.substring(0, e.start).concat(e.text).concat(modifiedText.substring(e.end)); + return modifiedText; + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java new file mode 100644 index 00000000..c3318b58 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/BooleanEditingSupport.java @@ -0,0 +1,53 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.CheckboxCellEditor; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewer; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.BooleanClassification; + +public class BooleanEditingSupport extends EditingSupport +{ + private final CheckboxCellEditor editor; + private final BooleanClassification boolClass; + private final TableViewer viewer; + private final int index; + + public BooleanEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index) + { + super(viewer); + this.viewer = viewer; + this.boolClass = (BooleanClassification) definition.getParameterClassification(index); + editor = new CheckboxCellEditor(viewer.getTable()); + this.index = index; + } + + @Override + protected boolean canEdit(Object element) + { + return true; + } + + @Override + protected CellEditor getCellEditor(Object element) + { + return editor; + } + + @Override + protected Object getValue(Object element) + { + return ((InstructionTableRow) element).data.getParameter(index).getValue().getMSBit(0).equals(Bit.ONE); + } + + @Override + protected void setValue(Object element, Object value) + { + ((InstructionTableRow) element).data.setParameter(index, boolClass.get((Boolean) value)); + viewer.update(element, null); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java new file mode 100644 index 00000000..b8021b74 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableContentProvider.java @@ -0,0 +1,38 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.ILazyContentProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; + +import net.mograsim.machine.mi.MicroInstructionMemory; + +public class InstructionTableContentProvider implements ILazyContentProvider +{ + private TableViewer viewer; + private MicroInstructionMemory memory; + private long minAddr = 0; + + @Override + public void updateElement(int index) + { + long address = memory.getDefinition().getMinimalAddress() + index; + viewer.replace(new InstructionTableRow(address, memory.getCell(address)), index); + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) + { + this.viewer = (TableViewer) viewer; + this.memory = (MicroInstructionMemory) newInput; + if (this.memory != null) + { + this.viewer.setItemCount((int) memory.size()); + this.minAddr = memory.getDefinition().getMinimalAddress(); + } + } + + public void update(long address) + { + updateElement((int) (address - minAddr)); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java new file mode 100644 index 00000000..677d1668 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionTableRow.java @@ -0,0 +1,12 @@ +package net.mograsim.plugin.tables.mi; + +import net.mograsim.machine.mi.MicroInstruction; +import net.mograsim.plugin.tables.TableRow; + +public class InstructionTableRow extends TableRow +{ + public InstructionTableRow(long address, MicroInstruction data) + { + super(address, data); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java new file mode 100644 index 00000000..3af070f3 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java @@ -0,0 +1,249 @@ +package net.mograsim.plugin.tables.mi; + +import java.io.File; +import java.io.IOException; +import java.util.Optional; + +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewerColumn; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.part.ViewPart; + +import net.mograsim.machine.Machine; +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.MicroInstructionMemory; +import net.mograsim.machine.mi.MicroInstructionMemoryParseException; +import net.mograsim.machine.mi.MicroInstructionMemoryParser; +import net.mograsim.machine.mi.parameters.ParameterClassification; +import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.MachineContext.ContextObserver; +import net.mograsim.plugin.tables.AddressLabelProvider; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.LazyTableViewer; +import net.mograsim.plugin.tables.RadixSelector; +import net.mograsim.plugin.util.DropDownMenu; +import net.mograsim.plugin.util.DropDownMenu.DropDownEntry; + +public class InstructionView extends ViewPart implements ContextObserver +{ + private String saveLoc = null; + private LazyTableViewer viewer; + private TableViewerColumn[] columns = new TableViewerColumn[0]; + private MicroInstructionDefinition miDef; + private MicroInstructionMemory memory; + private DisplaySettings displaySettings; + private InstructionTableContentProvider provider; + private int highlighted = 0; + + @SuppressWarnings("unused") + @Override + public void createPartControl(Composite parent) + { + provider = new InstructionTableContentProvider(); + GridLayout layout = new GridLayout(3, false); + setupMenuButtons(parent); + + displaySettings = new DisplaySettings(); + new RadixSelector(parent, displaySettings); + + parent.setLayout(layout); + viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); + + Table table = viewer.getTable(); + table.setHeaderVisible(true); + table.setLinesVisible(true); + viewer.setUseHashlookup(true); + viewer.setContentProvider(provider); + getSite().setSelectionProvider(viewer); + + GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); + viewerData.horizontalSpan = 3; + viewer.getTable().setLayoutData(viewerData); + + displaySettings.addObserver(() -> viewer.refresh()); + MachineContext.getInstance().registerObserver(this); + setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); + } + + public void highlight(int index) + { + viewer.highlightRow(highlighted, false); + viewer.highlightRow(index, true); + viewer.getTable().setTopIndex(index); + } + + @SuppressWarnings("unused") + private void setupMenuButtons(Composite parent) + { + DropDownEntry open = new DropDownEntry("Open", (e) -> + { + FileDialog d = new FileDialog(parent.getShell(), SWT.NONE); + d.open(); + String filename = d.getFileName(); + if (!filename.equals("")) + open(d.getFilterPath() + File.separator + filename); + }); + + DropDownEntry save = new DropDownEntry("Save", (e) -> + { + if (saveLoc == null) + openSaveAsDialog(parent); + save(saveLoc); + }); + DropDownEntry saveAs = new DropDownEntry("SaveAs", (e) -> + { + openSaveAsDialog(parent); + save(saveLoc); + }); + new DropDownMenu(parent, "File", open, save, saveAs); + } + + private void openSaveAsDialog(Composite parent) + { + FileDialog d = new FileDialog(parent.getShell(), SWT.SAVE); + d.open(); + String filename = d.getFileName(); + if (!filename.equals("")) + saveLoc = d.getFilterPath() + File.separator + filename; + } + + public void bindMicroInstructionMemory(MicroInstructionMemory memory) + { + deleteColumns(); + this.memory = memory; + viewer.setInput(memory); + this.miDef = memory.getDefinition().getMicroInstructionDefinition(); + createColumns(); + } + + private void deleteColumns() + { + for (TableViewerColumn col : columns) + col.getColumn().dispose(); + } + + private void createColumns() + { + int size = miDef.size(); + columns = new TableViewerColumn[size + 1]; + + TableViewerColumn col = createTableViewerColumn("Address", 200); + columns[0] = col; + col.setLabelProvider(new AddressLabelProvider()); + + int bit = 0; + ParameterClassification[] classes = miDef.getParameterClassifications(); + + for (int i = 0; i < size; i++) + { + int startBit = bit; + int endBit = (bit = bit + classes[i].getExpectedBits()) - 1; + String name = startBit == endBit ? Integer.toString(startBit) : startBit + "..." + endBit; + int bounds = 20 + 20 * classes[i].getExpectedBits(); + + col = createTableViewerColumn(name, bounds); + columns[i + 1] = col; + createEditingAndLabel(col, miDef, i); + } + } + + private void createEditingAndLabel(TableViewerColumn col, MicroInstructionDefinition miDef, int index) + { + ParameterClassification parameterClassification = miDef.getParameterClassifications()[index]; + EditingSupport support; + ColumnLabelProvider provider; + switch (parameterClassification.getExpectedType()) + { + case BOOLEAN_IMMEDIATE: + support = new BooleanEditingSupport(viewer, miDef, index); + provider = new ParameterLabelProvider(index); + break; + case INTEGER_IMMEDIATE: + support = new IntegerEditingSupport(viewer, miDef, index, displaySettings, this.provider); + provider = new IntegerColumnLabelProvider(displaySettings, index); + break; + case MNEMONIC: + support = new MnemonicEditingSupport(viewer, miDef, index, this.provider); + provider = new ParameterLabelProvider(index); + break; + default: + throw new IllegalStateException( + "Unable to create EditingSupport for unknown ParameterType " + parameterClassification.getExpectedType()); + } + col.setEditingSupport(support); + col.setLabelProvider(provider); + col.getColumn().setToolTipText(miDef.getParameterDescription(index).orElse("")); + } + + private TableViewerColumn createTableViewerColumn(String title, int bound) + { + TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); + TableColumn column = viewerColumn.getColumn(); + column.setText(title); + column.setWidth(bound); + column.setResizable(true); + column.setMoveable(false); + return viewerColumn; + } + + private void open(String file) + { + if (miDef == null) + { + System.err.println("Failed to parse MicroprogrammingMemory from File. No MicroInstructionDefinition assigned."); + return; + } + try + { + MicroInstructionMemoryParser.parseMemory(memory, file); + viewer.refresh(); + saveLoc = file; + } + catch (IOException | MicroInstructionMemoryParseException e) + { + e.printStackTrace(); + } + } + + private void save(String file) + { + if (memory == null) + { + System.err.println("Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned."); + } + if (saveLoc != null) + { + try + { + MicroInstructionMemoryParser.write(memory, file); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + } + + @Override + public void setFocus() + { + viewer.getControl().setFocus(); + } + + @Override + public void setMachine(Optional machine) + { + if (machine.isPresent()) + { + Machine actualMachine = machine.get(); + bindMicroInstructionMemory(actualMachine.getMicroInstructionMemory()); + } + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java new file mode 100644 index 00000000..ce61581f --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerColumnLabelProvider.java @@ -0,0 +1,25 @@ +package net.mograsim.plugin.tables.mi; + +import java.math.BigInteger; + +import net.mograsim.machine.mi.parameters.IntegerImmediate; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.NumberColumnLabelProvider; + +public class IntegerColumnLabelProvider extends NumberColumnLabelProvider +{ + private int index; + + public IntegerColumnLabelProvider(DisplaySettings displaySettings, int index) + { + super(displaySettings); + this.index = index; + } + + @Override + public BigInteger getAsBigInteger(Object element) + { + return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java new file mode 100644 index 00000000..d3b48ce4 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/IntegerEditingSupport.java @@ -0,0 +1,43 @@ +package net.mograsim.plugin.tables.mi; + +import java.math.BigInteger; + +import org.eclipse.jface.viewers.TableViewer; + +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.IntegerClassification; +import net.mograsim.machine.mi.parameters.IntegerImmediate; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.NumberCellEditingSupport; + +public class IntegerEditingSupport extends NumberCellEditingSupport +{ + private IntegerClassification classification; + private int index; + private InstructionTableContentProvider provider; + + public IntegerEditingSupport(TableViewer viewer, MicroInstructionDefinition miDef, int index, DisplaySettings displaySettings, + InstructionTableContentProvider provider) + { + super(viewer, displaySettings); + classification = (IntegerClassification) miDef.getParameterClassifications()[index]; + this.index = index; + this.provider = provider; + } + + @Override + protected void setAsBigInteger(Object element, BigInteger value) + { + InstructionTableRow row = ((InstructionTableRow) element); + row.data.setParameter(index, new IntegerImmediate(value, classification.getExpectedBits())); + provider.update(row.address); +// viewer.update(element, null); Does not do anything for some reason + } + + @Override + protected BigInteger getAsBigInteger(Object element) + { + return ((IntegerImmediate) ((InstructionTableRow) element).data.getParameter(index)).getValueAsBigInteger(); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java new file mode 100644 index 00000000..98181c46 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicCellEditorValidator.java @@ -0,0 +1,24 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.ICellEditorValidator; + +import net.mograsim.machine.mi.parameters.MnemonicFamily; + +public class MnemonicCellEditorValidator implements ICellEditorValidator +{ + private MnemonicFamily family; + + public MnemonicCellEditorValidator(MnemonicFamily family) + { + this.family = family; + } + + @Override + public String isValid(Object value) + { + int index = (Integer) value; + return index >= 0 && index < family.size() ? null + : String.format("MnemonicFamily has %s elements, index %s is out of bounds", family.size(), value.toString()); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java new file mode 100644 index 00000000..765e4343 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/MnemonicEditingSupport.java @@ -0,0 +1,57 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.CellEditor; +import org.eclipse.jface.viewers.ComboBoxCellEditor; +import org.eclipse.jface.viewers.EditingSupport; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.swt.SWT; + +import net.mograsim.machine.mi.MicroInstructionDefinition; +import net.mograsim.machine.mi.parameters.Mnemonic; +import net.mograsim.machine.mi.parameters.MnemonicFamily; + +public class MnemonicEditingSupport extends EditingSupport +{ + private final ComboBoxCellEditor editor; + private final MnemonicFamily family; + private final int index; + private InstructionTableContentProvider provider; + + public MnemonicEditingSupport(TableViewer viewer, MicroInstructionDefinition definition, int index, + InstructionTableContentProvider provider) + { + super(viewer); + family = (MnemonicFamily) definition.getParameterClassifications()[index]; + editor = new ComboBoxCellEditor(viewer.getTable(), family.getStringValues(), SWT.READ_ONLY); + this.index = index; + editor.setValidator(new MnemonicCellEditorValidator(family)); + this.provider = provider; + } + + @Override + protected boolean canEdit(Object element) + { + return true; + } + + @Override + protected CellEditor getCellEditor(Object element) + { + return editor; + } + + @Override + protected Object getValue(Object element) + { + return ((Mnemonic) ((InstructionTableRow) element).data.getParameter(index)).ordinal(); + } + + @Override + protected void setValue(Object element, Object value) + { + InstructionTableRow row = ((InstructionTableRow) element); + row.data.setParameter(index, family.get((Integer) value)); + provider.update(row.address); + } + +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java new file mode 100644 index 00000000..5e06370a --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/ParameterLabelProvider.java @@ -0,0 +1,20 @@ +package net.mograsim.plugin.tables.mi; + +import org.eclipse.jface.viewers.ColumnLabelProvider; + +public class ParameterLabelProvider extends ColumnLabelProvider +{ + private final int index; + + public ParameterLabelProvider(int index) + { + super(); + this.index = index; + } + + @Override + public String getText(Object element) + { + return ((InstructionTableRow) element).data.getParameter(index).toString(); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java new file mode 100644 index 00000000..ffa18575 --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/util/DropDownMenu.java @@ -0,0 +1,86 @@ +package net.mograsim.plugin.util; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.MenuItem; + +public class DropDownMenu +{ + private Button button; + + public DropDownMenu(Composite parent, String label, DropDownEntry... entries) + { + button = new Button(parent, SWT.PUSH); + button.setText(label); + setupDrowpDownMenu(entries); + } + + private void setupDrowpDownMenu(DropDownEntry[] entries) + { + Menu menu = new Menu(button); + for (DropDownEntry entry : entries) + { + MenuItem item = new MenuItem(menu, SWT.PUSH); + item.addSelectionListener(new SelectionListener() + { + @Override + public void widgetSelected(SelectionEvent e) + { + entry.listener.widgetSelected(e); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) + { + widgetSelected(e); + } + }); + item.setText(entry.title); + } + + button.addListener(SWT.Selection, new Listener() + { + @Override + public void handleEvent(Event event) + { + Rectangle rect = button.getBounds(); + Point pt = new Point(rect.x, rect.y + rect.height); + pt = button.getParent().toDisplay(pt); + menu.setLocation(pt.x, pt.y); + menu.setVisible(true); + } + }); + } + + public Button getButton() + { + return button; + } + + public static class DropDownEntry + { + public final String title; + public final EntrySelectedListener listener; + + public DropDownEntry(String title, EntrySelectedListener listener) + { + super(); + this.title = title; + this.listener = listener; + } + } + + @FunctionalInterface + public static interface EntrySelectedListener + { + public void widgetSelected(SelectionEvent e); + } +} diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java new file mode 100644 index 00000000..212f777c --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/views/LogicUIPart.java @@ -0,0 +1,62 @@ +package net.mograsim.plugin.views; + +import javax.inject.Inject; + +import org.eclipse.e4.ui.model.application.ui.basic.MPart; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.part.ViewPart; + +import net.haspamelodica.swt.helper.zoomablecanvas.helper.ZoomableCanvasUserInput; +import net.mograsim.logic.model.LogicExecuter; +import net.mograsim.logic.model.LogicUICanvas; +import net.mograsim.machine.Machine; +import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.ThemePreferences; +import net.mograsim.preferences.Preferences; + +public class LogicUIPart extends ViewPart +{ + @Inject + private MPart part; + + private LogicExecuter exec; + private LogicUICanvas ui; + + @Override + public void dispose() + { + if (exec != null) + exec.stopLiveExecution(); + } + + @Override + public void createPartControl(Composite parent) + { + // set preferences + Preferences.setPreferences(new ThemePreferences(PlatformUI.getWorkbench().getThemeManager().getCurrentTheme())); + + Machine m = MachineContext.getInstance().getMachine(); + + // initialize UI + ui = new LogicUICanvas(parent, SWT.NONE, m.getModel()); + ui.addTransformListener((x, y, z) -> part.setDirty(z < 1)); + ZoomableCanvasUserInput userInput = new ZoomableCanvasUserInput(ui); + userInput.buttonDrag = 3; + userInput.buttonZoom = 2; + userInput.enableUserInput(); + + // initialize executer + exec = new LogicExecuter(m.getTimeline()); + + // run it + exec.startLiveExecution(); + } + + @Override + public void setFocus() + { + ui.setFocus(); + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.plugin.docs/.classpath b/plugins/net.mograsim.plugin.docs/.classpath new file mode 100644 index 00000000..bc3587db --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/.project b/plugins/net.mograsim.plugin.docs/.project new file mode 100644 index 00000000..bb1ec996 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/.project @@ -0,0 +1,28 @@ + + + net.mograsim.plugin.docs + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..cd95f141 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/plugins/net.mograsim.plugin.docs/META-INF/MANIFEST.MF b/plugins/net.mograsim.plugin.docs/META-INF/MANIFEST.MF new file mode 100644 index 00000000..b895844a --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Mograsim docs +Bundle-SymbolicName: net.mograsim.plugin.docs;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Automatic-Module-Name: net.mograsim.plugin.docs +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: net.mograsim.plugin.core;bundle-version="0.1.0", + org.eclipse.help diff --git a/plugins/net.mograsim.plugin.docs/build.properties b/plugins/net.mograsim.plugin.docs/build.properties new file mode 100644 index 00000000..0b7cb312 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/build.properties @@ -0,0 +1,5 @@ +bin.includes = plugin.xml,\ + META-INF/,\ + .,\ + html/,\ + *.xml diff --git a/plugins/net.mograsim.plugin.docs/html/.gitkeep b/plugins/net.mograsim.plugin.docs/html/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/plugins/net.mograsim.plugin.docs/plugin.xml b/plugins/net.mograsim.plugin.docs/plugin.xml new file mode 100644 index 00000000..29023f1d --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/plugin.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/toc.xml b/plugins/net.mograsim.plugin.docs/toc.xml new file mode 100644 index 00000000..4a82ec9d --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/toc.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/tocconcepts.xml b/plugins/net.mograsim.plugin.docs/tocconcepts.xml new file mode 100644 index 00000000..d01f925e --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/tocconcepts.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/tocgettingstarted.xml b/plugins/net.mograsim.plugin.docs/tocgettingstarted.xml new file mode 100644 index 00000000..38f27e0b --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/tocgettingstarted.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/tocreference.xml b/plugins/net.mograsim.plugin.docs/tocreference.xml new file mode 100644 index 00000000..660cdecc --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/tocreference.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/tocsamples.xml b/plugins/net.mograsim.plugin.docs/tocsamples.xml new file mode 100644 index 00000000..ddfa61e7 --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/tocsamples.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.plugin.docs/toctasks.xml b/plugins/net.mograsim.plugin.docs/toctasks.xml new file mode 100644 index 00000000..c96b94bb --- /dev/null +++ b/plugins/net.mograsim.plugin.docs/toctasks.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/net.mograsim.preferences/.classpath b/plugins/net.mograsim.preferences/.classpath new file mode 100644 index 00000000..e801ebfb --- /dev/null +++ b/plugins/net.mograsim.preferences/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/plugins/net.mograsim.preferences/.project b/plugins/net.mograsim.preferences/.project new file mode 100644 index 00000000..0f30cb05 --- /dev/null +++ b/plugins/net.mograsim.preferences/.project @@ -0,0 +1,28 @@ + + + net.mograsim.preferences + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.pde.PluginNature + + diff --git a/plugins/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs b/plugins/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/plugins/net.mograsim.preferences/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs b/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..2aece3be --- /dev/null +++ b/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,458 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs b/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/plugins/net.mograsim.preferences/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/plugins/net.mograsim.preferences/META-INF/MANIFEST.MF b/plugins/net.mograsim.preferences/META-INF/MANIFEST.MF new file mode 100644 index 00000000..315ec1ab --- /dev/null +++ b/plugins/net.mograsim.preferences/META-INF/MANIFEST.MF @@ -0,0 +1,10 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Mograsim Preferences +Bundle-SymbolicName: net.mograsim.preferences +Bundle-Version: 0.1.0.qualifier +Export-Package: net.mograsim.preferences +Bundle-Vendor: Mograsim Team +Automatic-Module-Name: net.mograsim.preferences +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.eclipse.swt;bundle-version="3.0.0" diff --git a/plugins/net.mograsim.preferences/build.properties b/plugins/net.mograsim.preferences/build.properties new file mode 100644 index 00000000..b107977f --- /dev/null +++ b/plugins/net.mograsim.preferences/build.properties @@ -0,0 +1,3 @@ +source.. = src/ +bin.includes = META-INF/,\ + . diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java new file mode 100644 index 00000000..621de5f6 --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorDefinition.java @@ -0,0 +1,89 @@ +package net.mograsim.preferences; + +/** + * A way to define a color with the possibility to use colors built into the system (called "system colors" in SWT). + *

+ * A {@link ColorDefinition} is defined either by a {@link BuiltInColor} constant, in which case r==g==b==-1, or by red / green + * / blue components, in which case builtInColor==null + * + * @author Daniel Kirschten + */ +public class ColorDefinition +{ + /** + * The built-in color constant defining this color. + */ + public final ColorDefinition.BuiltInColor builtInColor; + /** + * The red color component defining this color. + */ + public final int r; + /** + * The green color component defining this color. + */ + public final int g; + /** + * The blue color component defining this color. + */ + public final int b; + + public ColorDefinition(ColorDefinition.BuiltInColor col) + { + if (col == null) + throw new IllegalArgumentException("Illegal built-in color: " + col); + this.builtInColor = col; + this.r = -1; + this.g = -1; + this.b = -1; + } + + public ColorDefinition(int r, int g, int b) + { + if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) + throw new IllegalArgumentException("Illegal color components: r=" + r + "; g=" + g + "; b=" + b); + this.builtInColor = null; + this.r = r; + this.g = g; + this.b = b; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + b; + result = prime * result + ((builtInColor == null) ? 0 : builtInColor.hashCode()); + result = prime * result + g; + result = prime * result + r; + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ColorDefinition other = (ColorDefinition) obj; + if (b != other.b) + return false; + if (builtInColor != other.builtInColor) + return false; + if (g != other.g) + return false; + if (r != other.r) + return false; + return true; + } + + public static enum BuiltInColor + { + COLOR_WHITE, COLOR_BLACK, COLOR_RED, COLOR_DARK_RED, COLOR_GREEN, COLOR_DARK_GREEN, COLOR_YELLOW, COLOR_DARK_YELLOW, COLOR_BLUE, + COLOR_DARK_BLUE, COLOR_MAGENTA, COLOR_DARK_MAGENTA, COLOR_CYAN, COLOR_DARK_CYAN, COLOR_GRAY, COLOR_DARK_GRAY; + } + +} \ No newline at end of file diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java new file mode 100644 index 00000000..f6f5d8dc --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/ColorManager.java @@ -0,0 +1,29 @@ +package net.mograsim.preferences; + +import org.eclipse.swt.graphics.Color; + +public abstract class ColorManager +{ + private static ColorManager currentManager; + + public static void setColorManager(ColorManager manager) + { + if (manager == null) + throw new NullPointerException(); + currentManager = manager; + } + + public static ColorManager current() + { + if (currentManager == null) + currentManager = new SimpleColorManager(); + return currentManager; + } + + public abstract Color toColor(ColorDefinition col); + + public void clearCache() + { + // this method is intended to be overridden + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java new file mode 100644 index 00000000..2f5c7c2a --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/DefaultPreferences.java @@ -0,0 +1,70 @@ +package net.mograsim.preferences; + +import net.mograsim.preferences.ColorDefinition.BuiltInColor; + +public class DefaultPreferences extends Preferences +{ + @Override + public boolean getBoolean(String name) + { + switch (name) + { + case "net.mograsim.logic.model.improvetext": + return true; + default: + throw new IllegalArgumentException("Unknown boolean preference name: " + name); + } + } + + @Override + public int getInt(String name) + { + switch (name) + { + default: + throw new IllegalArgumentException("Unknown int preference name: " + name); + } + } + + @Override + public double getDouble(String name) + { + switch (name) + { + case "net.mograsim.logic.model.linewidth.default": + return 0.5; + case "net.mograsim.logic.model.linewidth.wire.singlebit": + return 0.5; + case "net.mograsim.logic.model.linewidth.wire.multibit": + return 0.85; + default: + throw new IllegalArgumentException("Unknown double preference name: " + name); + } + } + + @Override + public ColorDefinition getColorDefinition(String name) + { + switch (name) + { + case "net.mograsim.logic.model.color.bit.one": + return new ColorDefinition(BuiltInColor.COLOR_GREEN); + case "net.mograsim.logic.model.color.bit.u": + return new ColorDefinition(BuiltInColor.COLOR_CYAN); + case "net.mograsim.logic.model.color.bit.x": + return new ColorDefinition(BuiltInColor.COLOR_RED); + case "net.mograsim.logic.model.color.bit.z": + return new ColorDefinition(BuiltInColor.COLOR_YELLOW); + case "net.mograsim.logic.model.color.bit.zero": + return new ColorDefinition(BuiltInColor.COLOR_GRAY); + case "net.mograsim.logic.model.color.background": + return new ColorDefinition(BuiltInColor.COLOR_WHITE); + case "net.mograsim.logic.model.color.foreground": + return new ColorDefinition(BuiltInColor.COLOR_BLACK); + case "net.mograsim.logic.model.color.text": + return new ColorDefinition(BuiltInColor.COLOR_BLACK); + default: + throw new IllegalArgumentException("Unknown color preference name: " + name); + } + } +} \ No newline at end of file diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java new file mode 100644 index 00000000..f2498564 --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/Preferences.java @@ -0,0 +1,35 @@ +package net.mograsim.preferences; + +import java.util.Objects; + +import org.eclipse.swt.graphics.Color; + +public abstract class Preferences +{ + private static Preferences currentPreferences; + + public static void setPreferences(Preferences preferences) + { + currentPreferences = Objects.requireNonNull(preferences); + } + + public static Preferences current() + { + if (currentPreferences == null) + currentPreferences = new DefaultPreferences(); + return currentPreferences; + } + + public abstract boolean getBoolean(String name); + + public abstract int getInt(String name); + + public abstract double getDouble(String name); + + public abstract ColorDefinition getColorDefinition(String name); + + public Color getColor(String name) + { + return ColorManager.current().toColor(getColorDefinition(name)); + } +} diff --git a/plugins/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java new file mode 100644 index 00000000..60b53110 --- /dev/null +++ b/plugins/net.mograsim.preferences/src/net/mograsim/preferences/SimpleColorManager.java @@ -0,0 +1,95 @@ +package net.mograsim.preferences; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Device; +import org.eclipse.swt.widgets.Display; + +import net.mograsim.preferences.ColorDefinition.BuiltInColor; + +public class SimpleColorManager extends ColorManager +{ + private static final Map systemColors = new HashMap<>(); + + private final Device device; + private final Map cachedColors; + + public SimpleColorManager() + { + this.device = Display.getCurrent(); + this.cachedColors = new HashMap<>(systemColors); + } + + @Override + public Color toColor(ColorDefinition col) + { + if (col == null) + return null; + Color cachedColor = cachedColors.get(col); + if (cachedColor != null) + return cachedColor; + if (col.builtInColor != null) + { + Color systemColor = device.getSystemColor(toSWTColorConstant(col.builtInColor)); + systemColors.put(col, systemColor); + cachedColors.put(col, systemColor); + return systemColor; + } + Color nonSystemColor = new Color(device, col.r, col.g, col.b); + cachedColors.put(col, nonSystemColor); + return nonSystemColor; + } + + @Override + public void clearCache() + { + cachedColors.entrySet().stream().filter(e -> !systemColors.containsKey(e.getKey())).map(Entry::getValue).forEach(Color::dispose); + cachedColors.clear(); + cachedColors.putAll(systemColors); + } + + public static int toSWTColorConstant(BuiltInColor col) + { + switch (col) + { + case COLOR_BLACK: + return SWT.COLOR_BLACK; + case COLOR_BLUE: + return SWT.COLOR_BLUE; + case COLOR_CYAN: + return SWT.COLOR_CYAN; + case COLOR_DARK_BLUE: + return SWT.COLOR_DARK_BLUE; + case COLOR_DARK_CYAN: + return SWT.COLOR_DARK_CYAN; + case COLOR_DARK_GRAY: + return SWT.COLOR_DARK_GRAY; + case COLOR_DARK_GREEN: + return SWT.COLOR_DARK_GREEN; + case COLOR_DARK_MAGENTA: + return SWT.COLOR_DARK_MAGENTA; + case COLOR_DARK_RED: + return SWT.COLOR_DARK_RED; + case COLOR_DARK_YELLOW: + return SWT.COLOR_DARK_YELLOW; + case COLOR_GRAY: + return SWT.COLOR_GRAY; + case COLOR_GREEN: + return SWT.COLOR_GREEN; + case COLOR_MAGENTA: + return SWT.COLOR_MAGENTA; + case COLOR_RED: + return SWT.COLOR_RED; + case COLOR_WHITE: + return SWT.COLOR_WHITE; + case COLOR_YELLOW: + return SWT.COLOR_YELLOW; + default: + throw new IllegalArgumentException("Unknown enum constant: " + col); + } + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..781cda46 --- /dev/null +++ b/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + net.mograsim + pom + + net.mograsim + net.mograsim.configuration + ${revision}${changelist} + ./releng/net.mograsim.configuration + + + plugins + features + releng + tests + SWTHelper + + + + + + \ No newline at end of file diff --git a/products/net.mograsim.product/.project b/products/net.mograsim.product/.project new file mode 100644 index 00000000..d95f9637 --- /dev/null +++ b/products/net.mograsim.product/.project @@ -0,0 +1,22 @@ + + + net.mograsim.product + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/products/net.mograsim.product/.settings/org.eclipse.core.resources.prefs b/products/net.mograsim.product/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/products/net.mograsim.product/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/products/net.mograsim.product/NOTE b/products/net.mograsim.product/NOTE new file mode 100644 index 00000000..c63784b3 --- /dev/null +++ b/products/net.mograsim.product/NOTE @@ -0,0 +1,2 @@ +Not really necessary, but you could still build it as an Eclipse RCP product (by using an appropriate target platform). +This would then be comparable to the pre-configured packages offered at eclipse.org. \ No newline at end of file diff --git a/products/net.mograsim.product/build.properties b/products/net.mograsim.product/build.properties new file mode 100644 index 00000000..f63dee38 --- /dev/null +++ b/products/net.mograsim.product/build.properties @@ -0,0 +1,3 @@ +source.. = src/ +output.. = bin/ +bin.includes = . diff --git a/products/net.mograsim.product/net.mograsim.product b/products/net.mograsim.product/net.mograsim.product new file mode 100644 index 00000000..02443455 --- /dev/null +++ b/products/net.mograsim.product/net.mograsim.product @@ -0,0 +1,702 @@ + + + + + + + + + + -XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts + + + + + + + + + + + + + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11 + + + + https://www.eclipse.org/legal/epl-2.0/ + + This program and the accompanying materials are made available under the +terms of the Eclipse Public License 2.0 which is available at +http://www.eclipse.org/legal/epl-2.0, or GNU General Public License, +version 2 with the GNU Classpath Exception which is available at +https://www.gnu.org/software/classpath/license.html. + +Eclipse Public License - v 2.0 + + THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE + PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION + OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + + a) in the case of the initial Contributor, the initial content + Distributed under this Agreement, and + + b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + where such changes and/or additions to the Program originate from + and are Distributed by that particular Contributor. A Contribution + "originates" from a Contributor if it was added to the Program by + such Contributor itself or anyone acting on such Contributor's behalf. + Contributions do not include changes or additions to the Program that + are not Modified Works. + +"Contributor" means any person or entity that Distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which +are necessarily infringed by the use or sale of its Contribution alone +or when combined with the Program. + +"Program" means the Contributions Distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement +or any Secondary License (as applicable), including Contributors. + +"Derivative Works" shall mean any work, whether in Source Code or other +form, that is based on (or derived from) the Program and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. + +"Modified Works" shall mean any work in Source Code or other form that +results from an addition to, deletion from, or modification of the +contents of the Program, including, for purposes of clarity any new file +in Source Code form that contains any contents of the Program. Modified +Works shall not include works that contain only declarations, +interfaces, types, classes, structures, or files of the Program solely +in each case in order to link to, bind by name, or subclass the Program +or Modified Works thereof. + +"Distribute" means the acts of a) distributing or b) making available +in any manner that enables the transfer of a copy. + +"Source Code" means the form of a Program preferred for making +modifications, including but not limited to software source code, +documentation source, and configuration files. + +"Secondary License" means either the GNU General Public License, +Version 2.0, or any later versions of that license, including any +exceptions or additional permissions as identified by the initial +Contributor. + +2. GRANT OF RIGHTS + + a) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free copyright + license to reproduce, prepare Derivative Works of, publicly display, + publicly perform, Distribute and sublicense the Contribution of such + Contributor, if any, and such Derivative Works. + + b) Subject to the terms of this Agreement, each Contributor hereby + grants Recipient a non-exclusive, worldwide, royalty-free patent + license under Licensed Patents to make, use, sell, offer to sell, + import and otherwise transfer the Contribution of such Contributor, + if any, in Source Code or other form. This patent license shall + apply to the combination of the Contribution and the Program if, at + the time the Contribution is added by the Contributor, such addition + of the Contribution causes such combination to be covered by the + Licensed Patents. The patent license shall not apply to any other + combinations which include the Contribution. No hardware per se is + licensed hereunder. + + c) Recipient understands that although each Contributor grants the + licenses to its Contributions set forth herein, no assurances are + provided by any Contributor that the Program does not infringe the + patent or other intellectual property rights of any other entity. + Each Contributor disclaims any liability to Recipient for claims + brought by any other entity based on infringement of intellectual + property rights or otherwise. As a condition to exercising the + rights and licenses granted hereunder, each Recipient hereby + assumes sole responsibility to secure any other intellectual + property rights needed, if any. For example, if a third party + patent license is required to allow Recipient to Distribute the + Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + + d) Each Contributor represents that to its knowledge it has + sufficient copyright rights in its Contribution, if any, to grant + the copyright license set forth in this Agreement. + + e) Notwithstanding the terms of any Secondary License, no + Contributor makes additional grants to any Recipient (other than + those set forth in this Agreement) as a result of such Recipient's + receipt of the Program under the terms of a Secondary License + (if permitted under the terms of Section 3). + +3. REQUIREMENTS + +3.1 If a Contributor Distributes the Program in any form, then: + + a) the Program must also be made available as Source Code, in + accordance with section 3.2, and the Contributor must accompany + the Program with a statement that the Source Code for the Program + is available under this Agreement, and informs Recipients how to + obtain it in a reasonable manner on or through a medium customarily + used for software exchange; and + + b) the Contributor may Distribute the Program under a license + different than this Agreement, provided that such license: + i) effectively disclaims on behalf of all other Contributors all + warranties and conditions, express and implied, including + warranties or conditions of title and non-infringement, and + implied warranties or conditions of merchantability and fitness + for a particular purpose; + + ii) effectively excludes on behalf of all other Contributors all + liability for damages, including direct, indirect, special, + incidental and consequential damages, such as lost profits; + + iii) does not attempt to limit or alter the recipients' rights + in the Source Code under section 3.2; and + + iv) requires any subsequent distribution of the Program by any + party to be under a license that satisfies the requirements + of this section 3. + +3.2 When the Program is Distributed as Source Code: + + a) it must be made available under this Agreement, or if the + Program (i) is combined with other material in a separate file or + files made available under a Secondary License, and (ii) the initial + Contributor attached to the Source Code the notice described in + Exhibit A of this Agreement, then the Program may be made available + under the terms of such Secondary Licenses, and + + b) a copy of this Agreement must be included with each copy of + the Program. + +3.3 Contributors may not remove or alter any copyright, patent, +trademark, attribution notices, disclaimers of warranty, or limitations +of liability ("notices") contained within the Program from any copy of +the Program which they Distribute, provided that Contributors may add +their own appropriate notices. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities +with respect to end users, business partners and the like. While this +license is intended to facilitate the commercial use of the Program, +the Contributor who includes the Program in a commercial product +offering should do so in a manner which does not create potential +liability for other Contributors. Therefore, if a Contributor includes +the Program in a commercial product offering, such Contributor +("Commercial Contributor") hereby agrees to defend and indemnify every +other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits +and other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such +Commercial Contributor in connection with its distribution of the Program +in a commercial product offering. The obligations in this section do not +apply to any claims or Losses relating to any actual or alleged +intellectual property infringement. In order to qualify, an Indemnified +Contributor must: a) promptly notify the Commercial Contributor in +writing of such claim, and b) allow the Commercial Contributor to control, +and cooperate with the Commercial Contributor in, the defense and any +related settlement negotiations. The Indemnified Contributor may +participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial +product offering, Product X. That Contributor is then a Commercial +Contributor. If that Commercial Contributor then makes performance +claims, or offers warranties related to Product X, those performance +claims and warranties are such Commercial Contributor's responsibility +alone. Under this section, the Commercial Contributor would have to +defend claims against the other Contributors related to those performance +claims and warranties, and if a court requires any other Contributor to +pay any damages as a result, the Commercial Contributor must pay +those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing the Program and assumes all +risks associated with its exercise of rights under this Agreement, +including but not limited to the risks and costs of program errors, +compliance with applicable laws, damage to or loss of data, programs +or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT +PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST +PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this Agreement, and without further +action by the parties hereto, such provision shall be reformed to the +minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity +(including a cross-claim or counterclaim in a lawsuit) alleging that the +Program itself (excluding combinations of the Program with other software +or hardware) infringes such Recipient's patent(s), then such Recipient's +rights granted under Section 2(b) shall terminate as of the date such +litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it +fails to comply with any of the material terms or conditions of this +Agreement and does not cure such failure in a reasonable period of +time after becoming aware of such noncompliance. If all Recipient's +rights under this Agreement terminate, Recipient agrees to cease use +and distribution of the Program as soon as reasonably practicable. +However, Recipient's obligations under this Agreement and any licenses +granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, +but in order to avoid inconsistency the Agreement is copyrighted and +may only be modified in the following manner. The Agreement Steward +reserves the right to publish new versions (including revisions) of +this Agreement from time to time. No one other than the Agreement +Steward has the right to modify this Agreement. The Eclipse Foundation +is the initial Agreement Steward. The Eclipse Foundation may assign the +responsibility to serve as the Agreement Steward to a suitable separate +entity. Each new version of the Agreement will be given a distinguishing +version number. The Program (including Contributions) may always be +Distributed subject to the version of the Agreement under which it was +received. In addition, after a new version of the Agreement is published, +Contributor may elect to Distribute the Program (including its +Contributions) under the new version. + +Except as expressly stated in Sections 2(a) and 2(b) above, Recipient +receives no rights or licenses to the intellectual property of any +Contributor under this Agreement, whether expressly, by implication, +estoppel or otherwise. All rights in the Program not expressly granted +under this Agreement are reserved. Nothing in this Agreement is intended +to be enforceable by any entity that is not a Contributor or Recipient. +No third-party beneficiary rights are created under this Agreement. + +Exhibit A - Form of Secondary Licenses Notice + +"This Source Code may also be made available under the following +Secondary Licenses when the conditions for such availability set forth +in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), +version(s), and exceptions or additional permissions here}." + + Simply including a copy of this Agreement, including this Exhibit A + is not sufficient to license the Source Code under Secondary Licenses. + + If it is not possible or desirable to put the notice in a particular + file, then You may include the notice in a location (such as a LICENSE + file in a relevant directory) where a recipient would be likely to + look for such a notice. + + You may add additional accurate notices of copyright ownership. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + +"CLASSPATH" EXCEPTION TO THE GPL + +Certain source files distributed by Oracle America and/or its affiliates are +subject to the following clarification and special exception to the GPL, but +only where Oracle has expressly included in the particular source file's header +the words "Oracle designates this particular file as subject to the "Classpath" +exception as provided by Oracle in the LICENSE file that accompanied this code." + + Linking this library statically or dynamically with other modules is making + a combined work based on this library. Thus, the terms and conditions of + the GNU General Public License cover the whole combination. + + As a special exception, the copyright holders of this library give you + permission to link this library with independent modules to produce an + executable, regardless of the license terms of these independent modules, + and to copy and distribute the resulting executable under terms of your + choice, provided that you also meet, for each linked independent module, + the terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. If + you modify this library, you may extend this exception to your version of + the library, but you are not obligated to do so. If you do not wish to do + so, delete this exception statement from your version. + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/releng/net.mograsim.configuration/.project b/releng/net.mograsim.configuration/.project new file mode 100644 index 00000000..03120f4c --- /dev/null +++ b/releng/net.mograsim.configuration/.project @@ -0,0 +1,11 @@ + + + net.mograsim.configuration + + + + + + + + diff --git a/releng/net.mograsim.configuration/pom.xml b/releng/net.mograsim.configuration/pom.xml new file mode 100644 index 00000000..7a58f171 --- /dev/null +++ b/releng/net.mograsim.configuration/pom.xml @@ -0,0 +1,170 @@ + + 4.0.0 + net.mograsim + net.mograsim.configuration + ${revision}${changelist} + pom + + + + 0.1.0 + -SNAPSHOT + + 11 + 1.5.0-SNAPSHOT + UTF-8 + + + + + + tycho-snapshots + https://repo.eclipse.org/content/repositories/tycho-snapshots/ + + true + + + true + + + + + + + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho.version} + true + + + + + + + + org.eclipse.tycho + target-platform-configuration + ${tycho.version} + + + + net.mograsim + net.mograsim.target + ${revision}${changelist} + + + + + linux + gtk + x86_64 + + + win32 + win32 + x86_64 + + + macosx + cocoa + x86_64 + + + + + + + + org.codehaus.mojo + flatten-maven-plugin + 1.1.0 + + true + resolveCiFriendliesOnly + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + + + + org.eclipse.tycho + tycho-source-plugin + ${tycho.version} + + + plugin-source + + plugin-source + + + + + + org.eclipse.tycho.extras + tycho-source-feature-plugin + ${tycho.version} + + + source-feature + package + + source-feature + + + + + + + + + + + + + org.eclipse.tycho + tycho-p2-plugin + ${tycho.version} + + + attach-p2-metadata + package + + p2-metadata + + + + + + + \ No newline at end of file diff --git a/releng/net.mograsim.plugin.updatesite/.project b/releng/net.mograsim.plugin.updatesite/.project new file mode 100644 index 00000000..4a4f372d --- /dev/null +++ b/releng/net.mograsim.plugin.updatesite/.project @@ -0,0 +1,17 @@ + + + net.mograsim.plugin.updatesite + + + + + + org.eclipse.pde.UpdateSiteBuilder + + + + + + org.eclipse.pde.UpdateSiteNature + + diff --git a/releng/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs b/releng/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/releng/net.mograsim.plugin.updatesite/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/releng/net.mograsim.plugin.updatesite/category.xml b/releng/net.mograsim.plugin.updatesite/category.xml new file mode 100644 index 00000000..18d4a8d0 --- /dev/null +++ b/releng/net.mograsim.plugin.updatesite/category.xml @@ -0,0 +1,22 @@ + + + + Provides updates for the modular graphical simulator (Mograsim) + + + + + + + Mograsim - Modular Graphical Simulator + + + + + + + + Mograsim Sources for development of Machine Extensions and Plugins + + + diff --git a/releng/net.mograsim.target/.project b/releng/net.mograsim.target/.project new file mode 100644 index 00000000..a66292fd --- /dev/null +++ b/releng/net.mograsim.target/.project @@ -0,0 +1,11 @@ + + + net.mograsim.target + + + + + + + + diff --git a/releng/net.mograsim.target/.settings/org.eclipse.core.resources.prefs b/releng/net.mograsim.target/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/releng/net.mograsim.target/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/releng/net.mograsim.target/.settings/org.eclipse.m2e.core.prefs b/releng/net.mograsim.target/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/releng/net.mograsim.target/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/releng/net.mograsim.target/net.mograsim.target.target b/releng/net.mograsim.target/net.mograsim.target.target new file mode 100644 index 00000000..f09ebd3e --- /dev/null +++ b/releng/net.mograsim.target/net.mograsim.target.target @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/.classpath b/tests/net.mograsim.logic.model.am2900.tests/.classpath new file mode 100644 index 00000000..e61c696d --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/net.mograsim.logic.model.am2900.tests/.project b/tests/net.mograsim.logic.model.am2900.tests/.project new file mode 100644 index 00000000..98071c26 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.project @@ -0,0 +1,28 @@ + + + net.mograsim.logic.model.am2900.tests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.core.resources.prefs b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.core.prefs b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/tests/net.mograsim.logic.model.am2900.tests/META-INF/MANIFEST.MF b/tests/net.mograsim.logic.model.am2900.tests/META-INF/MANIFEST.MF new file mode 100644 index 00000000..48e1b9ae --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Am2900 Tests +Bundle-SymbolicName: net.mograsim.logic.model.am2900.tests;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Fragment-Host: net.mograsim.logic.model.am2900;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.logic.model.am2900.tests +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.junit;bundle-version="4.12.0", + org.junit.jupiter.api;bundle-version="5.4.0";visibility:=reexport, + org.junit.jupiter.params;bundle-version="5.4.0";visibility:=reexport, + org.opentest4j;bundle-version="1.1.1";visibility:=reexport diff --git a/tests/net.mograsim.logic.model.am2900.tests/build.properties b/tests/net.mograsim.logic.model.am2900.tests/build.properties new file mode 100644 index 00000000..34d2e4d2 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/JavaJsonLineCounter.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/JavaJsonLineCounter.java new file mode 100644 index 00000000..2f6cd4e3 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/JavaJsonLineCounter.java @@ -0,0 +1,35 @@ +package net.mograsim.logic.model; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.function.Function; +import java.util.stream.Stream; + +public class JavaJsonLineCounter +{ + public static void main(String[] args) throws IOException + { + printLineCount("..", "java"); + printLineCount("..", "json"); + } + + private static void printLineCount(String path, String filetype) throws IOException + { + long lineCount = Files.walk(Paths.get(path)).filter(Files::isRegularFile).filter(p -> p.toString().endsWith('.' + filetype)) + .flatMap((Function>) p -> + { + try + { + return Files.lines(p); + } + catch (IOException e) + { + throw new UncheckedIOException(e); + } + }).count(); + System.out.println("Total lines in " + filetype + " files: " + lineCount); + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/TestableCircuit.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/TestableCircuit.java new file mode 100644 index 00000000..d36d80ff --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/TestableCircuit.java @@ -0,0 +1,40 @@ +package net.mograsim.logic.model.am2900; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; + +public interface TestableCircuit +{ + void setup(); + + Result run(); + + void clockOn(boolean isClockOn); + + TestEnvironmentHelper getTestEnvironmentHelper(); + + default void assertRunSuccess() + { + assertEquals(Result.SUCCESS, run()); + } + + default void assertFullCycleSuccess() + { + assertRunSuccess(); + clockOn(false); + assertRunSuccess(); + clockOn(true); + assertRunSuccess(); + } + + default void displayState() + { + getTestEnvironmentHelper().displayState(); + } + + public enum Result + { + SUCCESS, OUT_OF_TIME, ERROR; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Test.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Test.java new file mode 100644 index 00000000..0d55c750 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Test.java @@ -0,0 +1,302 @@ +package net.mograsim.logic.model.am2900.am2901; + +import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Dest.*; +import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Func.*; +import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Am2901_Src.*; +import static net.mograsim.logic.model.am2900.am2901.TestableAm2901.Register.*; +import static net.mograsim.logic.model.am2900.util.TestUtil.*; +import static org.junit.jupiter.api.Assertions.*; + +import java.awt.Point; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import net.mograsim.logic.model.am2900.am2901.TestableAm2901.Register; +import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; + +@DisplayName("Am2901 Tests") +@TestMethodOrder(OrderAnnotation.class) +public class Am2901Test +{ + private TestableAm2901 am2901 = new TestableAm2901Impl(); + + @RegisterExtension + DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2901); + + @BeforeEach + void initialize() + { + createAndSetup(); + setInputsToZero(); + } + + void createAndSetup() + { + am2901.setup(); + } + + void setRegistersToZero() + { + setInputsToZero(); + for (Register r : Register.values()) + { + setRegisterToZero(r); + } + } + + void setRegisterToZero(Register r) + { + am2901.setD("0000"); + am2901.setSrc(DZ); + am2901.setFunc(AND); + setRegOutput(r); + + am2901.assertFullCycleSuccess(); + } + + void setRegOutput(Register r) + { + if (r == Q) + { + am2901.setDest(QREG); + } else + { + am2901.setReg_B(r.toBitString()); + am2901.setDest(RAMF); + } + } + + void setInputsToZero() + { + am2901.setCarryIn("0"); + am2901.setQ_0("0"); + am2901.setQ_3("0"); + am2901.setRAM_0("0"); + am2901.setRAM_3("0"); + am2901.setReg_A("0000"); + am2901.setReg_B("0000"); + am2901.setD("0000"); + am2901.setSrc(AB); + am2901.setFunc(ADD); + am2901.setDest(QREG); +// am2901.setNotOutEnable("0"); TODO + am2901.clockOn(true); + am2901.assertRunSuccess(); + } + + @ParameterizedTest(name = "{0}") + @Order(1) + @DisplayName("Direct / high level access") + @EnumSource(Register.class) + void testDirectAccess(Register r) + { + assertEquals("UUUU", am2901.getDirectly(r)); + + am2901.setDirectly(r, "1011"); + + assertEquals("1011", am2901.getDirectly(r)); + } + + @ParameterizedTest(name = "{0}") + @Order(2) + @DisplayName("Setting each register to 0") + @EnumSource(Register.class) + void testSetToZero(Register r) + { + assertEquals("UUUU", am2901.getDirectly(r)); + + setRegisterToZero(r); + + assertEquals("0000", am2901.getDirectly(r)); + assertEquals("0000", am2901.getY()); + assertEquals("0", am2901.getCarryOut()); + assertEquals("0", am2901.getOverflow()); + assertEquals("0", am2901.getSign()); + assertEquals("1", am2901.getZero()); + } + + @Test + @Order(3) + @DisplayName("Setting all registers to 0") + void testSetAllToZero() + { + setRegistersToZero(); + + assertEquals("0000", am2901.getY()); + assertEquals("0", am2901.getCarryOut()); + assertEquals("0", am2901.getOverflow()); + assertEquals("0", am2901.getSign()); + assertEquals("1", am2901.getZero()); + assertEquals("0", am2901.getQ_0()); + assertEquals("0", am2901.getQ_3()); + assertEquals("0", am2901.getRAM_0()); + assertEquals("0", am2901.getRAM_3()); + + assertAll("register values", Register.stream().map(r -> () -> + { + assertEquals("0000", am2901.getDirectly(r), r.name()); + })); + } + + @Test + @Order(4) + @DisplayName("ADD operation") + void testADD() + { + am2901.setSrc(DA); + am2901.setFunc(ADD); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x + xy.y; + int res4Bit = res32Bit & 0b1111; + int res32Bit_sgn = signed4ToSigned32(xy.x) + signed4ToSigned32(xy.y); + int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn); + + assertAll("Result of " + xy.x + " + " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"), + () -> assertEquals(to1bitBin(res32Bit > 15), am2901.getCarryOut(), " Cn+4"), + () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR")); + })); + } + + @Test + @Order(4) + @DisplayName("AND operation") + void testAND() + { + am2901.setSrc(DA); + am2901.setFunc(AND); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x & xy.y; + + assertAll("Result of " + xy.x + " & " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3") +// () -> assertEquals(to1bitBin(res32Bit), am2901.getCarryOut(), " Cn+4"), // TODO +// () -> assertEquals(to1bitBin(res32Bit), am2901.getOverflow(), " OVR") // TODO + ); + })); + } + + @Test + @Order(4) + @DisplayName("OR operation") + void testOR() + { + am2901.setSrc(DA); + am2901.setFunc(OR); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x | xy.y; + + assertAll("Result of " + xy.x + " | " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3") +// () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getCarryOut(), " Cn+4"), // TODO +// () -> assertEquals(to1bitBin(res32Bit != 0b1111), am2901.getOverflow(), " OVR") // TODO + ); + })); + } + + @Test + @Order(4) + @DisplayName("XOR operation") + void testXOR() + { + am2901.setSrc(DA); + am2901.setFunc(EXOR); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x ^ xy.y; + + assertAll("Result of " + xy.x + " ^ " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res32Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res32Bit & 0b1000), am2901.getSign(), " F3")); + })); + } + + @Test + @Order(4) + @DisplayName("SUB operation") + void testSUB() + { + am2901.setSrc(DA); + am2901.setCarryIn("1"); + am2901.setFunc(SUBR); + am2901.setDest(NOP); + am2901.setReg_A(r0.toBitString()); + + assertAll(getAll4BitPairs().map(xy -> () -> + { + am2901.setDirectly(r0, to4bitBin(xy.x)); + am2901.setD(to4bitBin(xy.y)); + + am2901.assertFullCycleSuccess(); + + int res32Bit = xy.x - xy.y; + int res4Bit = res32Bit & 0b1111; + int res32Bit_sgn = signed4ToSigned32(xy.x) - signed4ToSigned32(xy.y); + int res4Bit_sgn = signed4ToSigned32(res32Bit_sgn); + + assertAll("Result of " + xy.x + " - " + xy.y + " = " + res32Bit, + () -> assertEquals(to4bitBin(res32Bit), am2901.getY(), " Y"), + () -> assertEquals(to1bitBin(res4Bit == 0), am2901.getZero(), " F=0"), + () -> assertEquals(to1bitBin(res4Bit & 0b1000), am2901.getSign(), " F3"), + () -> assertEquals(to1bitBin(xy.x >= xy.y), am2901.getCarryOut(), " Cn+4"), + () -> assertEquals(to1bitBin(res4Bit_sgn != res32Bit_sgn), am2901.getOverflow(), " OVR")); + })); + } + + static Stream getAll4BitPairs() + { + return IntStream.range(0, 16).boxed().flatMap(x -> IntStream.range(0, 16).mapToObj(y -> new Point(x, y))); + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java new file mode 100644 index 00000000..414054e9 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/Am2901Testbench.java @@ -0,0 +1,119 @@ +package net.mograsim.logic.model.am2900.am2901; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.atomic.ModelAndGate; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.atomic.ModelNotGate; +import net.mograsim.logic.model.model.components.atomic.ModelTextComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.PinUsage; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.ModellingTool; + +@Deprecated +public class Am2901Testbench +{ + public static void main(String[] args) + { + Am2900Loader.setup(); + SimpleLogicUIStandalone.executeVisualisation(Am2901Testbench::createTestbench, Am2901Testbench::beforeRun); + } + + public static void createTestbench(LogicModelModifiable model) + { + ModelComponent comp = IndirectModelComponentCreator.createComponent(model, "Am2901"); + ModellingTool tool = ModellingTool.createFor(model); + + comp.moveTo(240, 0); + + ModelManualSwitch enable = new ModelManualSwitch(model, 1); + ModelWireCrossPoint wcp0 = new ModelWireCrossPoint(model, 1); + ModelNotGate not1 = new ModelNotGate(model, 1); + ModelNotGate not2 = new ModelNotGate(model, 1); + ModelNotGate not3 = new ModelNotGate(model, 1); + ModelAndGate and = new ModelAndGate(model, 1); + tool.connect(wcp0, enable, ""); + tool.connect(wcp0, and, "A"); + tool.connect(wcp0, not1, "A"); + tool.connect(not1, not2, "Y", "A"); + tool.connect(not2, not3, "Y", "A"); + tool.connect(not3, and, "Y", "B"); + enable.moveTo(20, -32.5); + wcp0.moveTo(35, -26); + not1.moveTo(50, -20); + not2.moveTo(80, -20); + not3.moveTo(110, -20); + and.moveTo(135, -30); + Pin last = and.getPin("Y"); + + List inputPinNames = new ArrayList<>(); + List outputPinNames = new ArrayList<>(); + for (Pin p : comp.getPins().values()) + if (p.usage == PinUsage.INPUT) + inputPinNames.add(p.name); + else + outputPinNames.add(p.name); + + inputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); + outputPinNames.sort(Comparator.comparing(comp::getPin, Comparator.comparing(Pin::getRelY))); + + for (int i = 0; i < inputPinNames.size(); i++) + { + double x = 55 + 70 * (i % 2); + double y = 10 * i; + + ModelWireCrossPoint wcp = new ModelWireCrossPoint(model, 1); + ModelComponent d_ff = IndirectModelComponentCreator.createComponent(model, "dff"); + ModelManualSwitch sw = new ModelManualSwitch(model, 1); + + tool.connect(last, wcp); + tool.connect(wcp, d_ff, "C"); + tool.connect(sw, d_ff, "", "D"); + tool.connect(d_ff, comp, "Q", inputPinNames.get(i)); + last = wcp.getPin(); + + ModelTextComponent label = new ModelTextComponent(model, inputPinNames.get(i)); + + sw.moveTo(x, y + 7.5); + wcp.moveTo(160, y); + d_ff.moveTo(170, y); + label.moveTo(x - 48, y + 8); + } + + for (int i = 0; i < outputPinNames.size(); i++) + { + double x = 300 + 75 * (i % 2); + double y = 10 * i - 2.5; + ModelBitDisplay bd = new ModelBitDisplay(model, 1); + bd.moveTo(x, y); + tool.connect(bd.getInputPin(), comp, outputPinNames.get(i)); + + ModelTextComponent label = new ModelTextComponent(model, outputPinNames.get(i)); + label.moveTo(x + 25, y); + } + } + + public static void beforeRun(VisualisationObjects vis) + { + vis.model.getComponentsByName().values().forEach(c -> + { + if (c instanceof ModelManualSwitch) + { + ModelManualSwitch cCasted = (ModelManualSwitch) c; + cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); + } + }); + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java new file mode 100644 index 00000000..d8899089 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901.java @@ -0,0 +1,108 @@ +package net.mograsim.logic.model.am2900.am2901; + +import java.util.Arrays; +import java.util.stream.Stream; + +import net.mograsim.logic.model.am2900.TestableCircuit; +import net.mograsim.logic.model.am2900.util.TestUtil; + +public interface TestableAm2901 extends TestableCircuit +{ + + void setDest(Am2901_Dest dest); + + void setFunc(Am2901_Func func); + + void setSrc(Am2901_Src src); + + void setReg_A(String val_4_bit); + + void setReg_B(String val_4_bit); + + void setCarryIn(String val_1_bit); + + void setNotOutEnable(String val_1_bit); + + void setD(String val_4_bit); + + void setQ_0(String val_1_bit); + + void setQ_3(String val_1_bit); + + void setRAM_0(String val_1_bit); + + void setRAM_3(String val_1_bit); + + void setDirectly(Register r, String val_4_bit); + + String getQ_0(); + + String getQ_3(); + + String getRAM_0(); + + String getRAM_3(); + + String getNotP(); + + String getNotG(); + + String getCarryOut(); + + String getSign(); + + String getZero(); + + String getOverflow(); + + String getY(); + + String getDirectly(Register r); + + enum Am2901_Dest + { + QREG, NOP, RAMA, RAMF, RAMQD, RAMD, RAMQU, RAMU; + + public boolean doesShift() + { + return ordinal() >= 4; + } + + public int getShiftDir() + { + return doesShift() ? (ordinal() < 6 ? -1 : 1) : 0; + } + + public int getI7() + { + return this.ordinal() >> 1 & 1; + } + } + + enum Am2901_Func + { + ADD, SUBR, SUBS, OR, AND, NOTRS, EXOR, EXNOR; + } + + enum Am2901_Src + { + AQ, AB, ZQ, ZB, ZA, DA, DQ, DZ; + } + + enum Register + { + r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF, Q; + + public String toBitString() + { + if (this.ordinal() > 0xF) + throw new UnsupportedOperationException(); + return TestUtil.to4bitBin(this.ordinal()); + } + + public static Stream stream() + { + return Arrays.stream(values()); + } + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java new file mode 100644 index 00000000..bddddea5 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2901/TestableAm2901Impl.java @@ -0,0 +1,211 @@ +package net.mograsim.logic.model.am2900.am2901; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.util.SwitchWithDisplay; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; +import net.mograsim.logic.model.am2900.util.TestUtil; +import net.mograsim.logic.model.model.components.ModelComponent; + +public class TestableAm2901Impl implements TestableAm2901 +{ + private ModelComponent am2901; + private CoreManualSwitch I; + private CoreManualSwitch C; + private CoreManualSwitch Cn; + private CoreManualSwitch D; + private CoreManualSwitch A; + private CoreManualSwitch B; + private CoreBitDisplay Y; + private CoreBitDisplay F_0, Cn_4, OVR, F3; + private SwitchWithDisplay RAMn, RAMn_3, Qn, Qn_3; + + private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "Am2901"); + + @Override + public Result run() + { + return testHelper.run(); + } + + @Override + public void setup() + { + testHelper.setup(DebugState.NO_DEBUG); + } + + @Override + public void setDest(Am2901_Dest dest) + { + BitVector oldI = I.getValues(); + I.setState(TestUtil.of(dest.ordinal(), 3).concat(oldI.subVector(3))); + } + + @Override + public void setFunc(Am2901_Func func) + { + BitVector oldI = I.getValues(); + I.setState(oldI.subVector(0, 3).concat(TestUtil.of(func.ordinal(), 3)).concat(oldI.subVector(6))); + } + + @Override + public void setSrc(Am2901_Src src) + { + BitVector oldI = I.getValues(); + I.setState(oldI.subVector(0, 6).concat(TestUtil.of(src.ordinal(), 3))); + } + + @Override + public void setReg_A(String val_4_bit) + { + A.setState(BitVector.parse(val_4_bit)); + } + + @Override + public void setReg_B(String val_4_bit) + { + B.setState(BitVector.parse(val_4_bit)); + } + + @Override + public void setCarryIn(String val_1_bit) + { + Cn.setState(Bit.parse(val_1_bit)); + } + + @Override + public void setNotOutEnable(String val_1_bit) + { + throw new UnsupportedOperationException(); // TODO + } + + @Override + public void setD(String val_4_bit) + { + D.setState(BitVector.parse(val_4_bit)); + } + + @Override + public void setQ_0(String val_1_bit) + { + Qn.setState(Bit.parse(val_1_bit).toVector()); + } + + @Override + public void setQ_3(String val_1_bit) + { + Qn_3.setState(Bit.parse(val_1_bit).toVector()); + } + + @Override + public void setRAM_0(String val_1_bit) + { + RAMn.setState(Bit.parse(val_1_bit).toVector()); + } + + @Override + public void setRAM_3(String val_1_bit) + { + RAMn_3.setState(Bit.parse(val_1_bit).toVector()); + } + + @Override + public void clockOn(boolean isClockOn) + { + C.setState(isClockOn ? Bit.ONE : Bit.ZERO); + } + + @Override + public String getQ_0() + { + return Qn.getDisplayedValue().toString(); + } + + @Override + public String getQ_3() + { + return Qn_3.getDisplayedValue().toString(); + } + + @Override + public String getRAM_0() + { + return RAMn.getDisplayedValue().toString(); + } + + @Override + public String getRAM_3() + { + return RAMn_3.getDisplayedValue().toString(); + } + + @Override + public String getNotP() + { + throw new UnsupportedOperationException(); // TODO + } + + @Override + public String getNotG() + { + throw new UnsupportedOperationException(); // TODO + } + + @Override + public String getCarryOut() + { + return Cn_4.getDisplayedValue().toString(); + } + + @Override + public String getSign() + { + return F3.getDisplayedValue().toString(); + } + + @Override + public String getZero() + { + return F_0.getDisplayedValue().toString(); + } + + @Override + public String getOverflow() + { + return OVR.getDisplayedValue().toString(); + } + + @Override + public String getY() + { + return Y.getDisplayedValue().toString(); + } + + @Override + public void setDirectly(Register r, String val_4_bit) + { + am2901.setHighLevelState(regToStateID(r), BitVector.parse(val_4_bit)); + } + + @Override + public String getDirectly(Register r) + { + return ((BitVector) am2901.getHighLevelState(regToStateID(r))).toString(); + } + + private static String regToStateID(Register r) + { + if (r == Register.Q) + return "qreg.q"; + return "regs.c" + r.toBitString() + ".q"; + } + + @Override + public TestEnvironmentHelper getTestEnvironmentHelper() + { + return testHelper; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Test.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Test.java new file mode 100644 index 00000000..332f4f64 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Test.java @@ -0,0 +1,211 @@ +package net.mograsim.logic.model.am2900.am2904; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_Carry; +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_Inst; +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Am2904_ShiftDir; +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.CompleteStatus; +import net.mograsim.logic.model.am2900.am2904.TestableAm2904.Register; +import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; + +@DisplayName("Am2904 Tests") +@TestMethodOrder(OrderAnnotation.class) +public class Am2904Test +{ + private TestableAm2904 am2904 = new TestableAm2904Impl(); + + @RegisterExtension + DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2904); + + @BeforeEach + void initialize() + { + createAndSetup(); + setStandardInputs(); + } + + void createAndSetup() + { + am2904.setup(); + } + + void setStandardInputs() + { + am2904.set_CEµ("0"); + am2904.set_CEM("0"); + am2904.setI("0000"); + am2904.set_E("0000"); + am2904.set_OEY("1"); + am2904.set_OECT("0"); + am2904.setCarry(Am2904_Carry.CI0); + am2904.setCX("0"); + am2904.setI10(Am2904_ShiftDir.RIGHT); + am2904.setShiftCode("0000"); + am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); + am2904.setSIO0("Z"); + am2904.setSIO3("Z"); + am2904.setQIO0("Z"); + am2904.setQIO3("Z"); + am2904.set_SE("1"); + am2904.setY("ZZZZ"); + am2904.clockOn(true); + am2904.assertRunSuccess(); + } + + @ParameterizedTest(name = "{0}") + @Order(1) + @DisplayName("Direct / high level access") + @EnumSource(Register.class) + void testDirectAccess(Register r) + { + assertEquals("U", am2904.getDirectly(r)); + + am2904.setDirectly(r, "1"); + + assertEquals("1", am2904.getDirectly(r)); + } + + @Test + @Order(2) + void testBasicStateAndOutputs() + { + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getC0()); + assertEquals("0", am2904.getCT()); + assertEquals("Z", am2904.getQIO0()); + assertEquals("Z", am2904.getQIO3()); + assertEquals("Z", am2904.getSIO0()); + assertEquals("Z", am2904.getSIO3()); + assertEquals("ZZZZ", am2904.getY()); + } + + @Test + @Order(3) + void testSimpleLoadTestIZ() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("1000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + + am2904.setInstruction(Am2904_Inst.Load_Load_I_notZ); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + } + + @Test + @Order(3) + void testSimpleLoadTestIC() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_C); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0100"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + + am2904.setInstruction(Am2904_Inst.Load_Load_I_notC); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + } + + @Test + @Order(3) + void testSimpleLoadTestIN() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_N); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0010"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + + am2904.setInstruction(Am2904_Inst.Load_Load_I_notN); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + } + + @Test + @Order(3) + void testSimpleLoadTestIOVR() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_OVR); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0001"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + + am2904.setInstruction(Am2904_Inst.Load_Load_I_notOVR); + am2904.assertFullCycleSuccess(); + + assertEquals("0", am2904.getCT()); + + am2904.setI("0000"); + am2904.assertFullCycleSuccess(); + + assertEquals("1", am2904.getCT()); + } + + @Test + @Order(3) + void testRegisterContentAfterLoadLoad() + { + am2904.setInstruction(Am2904_Inst.Load_Load_I_Z); + am2904.assertFullCycleSuccess(); + + String[] statusValues = { "0001", "0010", "0100", "1000", "0000", "1111" }; + + for (String status : statusValues) + { + am2904.setI(status); + am2904.assertFullCycleSuccess(); + assertEquals(status, am2904.getDirectly(CompleteStatus.micro)); + assertEquals(status, am2904.getDirectly(CompleteStatus.MAKRO)); + } + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java new file mode 100644 index 00000000..e46561d5 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/Am2904Testbench.java @@ -0,0 +1,65 @@ +package net.mograsim.logic.model.am2900.am2904; + +import net.haspamelodica.swt.helper.gcs.GeneralGC; +import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.serializing.DeserializedSubmodelComponent; +import net.mograsim.logic.model.serializing.IdentifyParams; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.snippets.Renderer; + +public class Am2904Testbench +{ + public static void main(String[] args) + { + Am2900Loader.setup(); + SimpleLogicUIStandalone.executeVisualisation(Am2904Testbench::create, Am2904Testbench::beforeRun); + } + + public static void create(LogicModelModifiable model) + { + // TODO replace with proper LogicModel deserialization + DeserializedSubmodelComponent testbench = (DeserializedSubmodelComponent) IndirectModelComponentCreator.createComponent(model, + "jsonfile:Am2904Testbench.json", "testbench"); + testbench.setSize(1000, 1000); + testbench.setOutlineRenderer(new Renderer() + { + @Override + public String getIDForSerializing(IdentifyParams idParams) + { + return null; + } + + @Override + public Void getParamsForSerializing(IdentifyParams idParams) + { + return null; + } + + @Override + public void render(GeneralGC gc, Rectangle visibleRegion) + { + // do nothing + } + }); + } + + public static void beforeRun(VisualisationObjects vis) + { + ((SubmodelComponent) vis.model.getComponentsByName().get("testbench")).submodel.getComponentsByName().values().forEach(c -> + { + if (c instanceof ModelManualSwitch) + { + ModelManualSwitch cCasted = (ModelManualSwitch) c; + cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); + } + }); + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java new file mode 100644 index 00000000..e41e3fef --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.java @@ -0,0 +1,236 @@ +package net.mograsim.logic.model.am2900.am2904; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import net.mograsim.logic.model.am2900.TestableCircuit; + +public interface TestableAm2904 extends TestableCircuit +{ + + void setInstruction(Am2904_Inst inst); + + void setCarry(Am2904_Carry carry); + + void setShiftCode(String val_4_bit); + + void setI10(Am2904_ShiftDir dir); + + void setCX(String val_1_bit); + + void setY(String z_c_n_ovr); + + void setIZ(String val_1_bit); + + void setIC(String val_1_bit); + + void setIOVR(String val_1_bit); + + void setIN(String val_1_bit); + + default void setI(String z_c_n_ovr) + { + setIZ(z_c_n_ovr.substring(0, 1)); + setIC(z_c_n_ovr.substring(1, 2)); + setIN(z_c_n_ovr.substring(2, 3)); + setIOVR(z_c_n_ovr.substring(3, 4)); + } + + void set_CEM(String val_1_bit); + + void set_CEµ(String val_1_bit); + + void set_OEY(String val_1_bit); + + void set_OECT(String val_1_bit); + + void set_SE(String val_1_bit); + + void set_EZ(String val_1_bit); + + void set_EC(String val_1_bit); + + void set_EOVR(String val_1_bit); + + void set_EN(String val_1_bit); + + default void set_E(String z_c_n_ovr) + { + set_EZ(z_c_n_ovr.substring(0, 1)); + set_EC(z_c_n_ovr.substring(1, 2)); + set_EN(z_c_n_ovr.substring(2, 3)); + set_EOVR(z_c_n_ovr.substring(3, 4)); + } + + void setSIO0(String val_1_bit); + + void setSIO3(String val_1_bit); + + void setQIO0(String val_1_bit); + + void setQIO3(String val_1_bit); + + void setDirectly(Register r, String val_1_bit); + + void setDirectly(CompleteStatus r, String z_c_n_ovr); + + String getC0(); + + String getCT(); + + String getY(); + + String getSIO0(); + + String getSIO3(); + + String getQIO0(); + + String getQIO3(); + + String getDirectly(Register r); + + String getDirectly(CompleteStatus r); + + enum Am2904_ShiftDir + { + RIGHT, LEFT; + } + + enum Am2904_Carry + { + CI0, CI1, CX, USE_SR; + } + + /** + * Pattern:
+ * [microSR]_[machineSR]_[condCodeSource]_[condCode]
+ *

    + *
  • Load = load from I inputs (Am2904s)
  • + *
  • condCodeSource = µ, M, I (and a special case: I and M)
  • + *
  • condCode = the boolean term defining the CT output
  • + *
+ */ + enum Am2904_Inst + { + // @formatter:off + LoadM_LoadY_µ_NxorOVRorZ(0_00), + Set_Set_µ_NxnorOVRornotZ(0_01), + Swap_Swap_µ_NxorOVR(0_02), + Reset_Reset_µ_NxnorOVR(0_03), + Load_LoadForShiftThroughOvr_µ_Z(0_04), + Load_Invert_µ_notZ(0_05), + LoadOvrRetain_Load_µ_OVR(0_06), + LoadOvrRetain_Load_µ_notOVR(0_07), + ResetZ_LoadCarryInvert_µ_CorZ(0_10), + SetZ_LoadCarryInvert_µ_notCandnotZ(0_11), + ResetC_Load_µ_C(0_12), + SetC_Load_µ_notC(0_13), + ResetN_Load_µ_notCorZ(0_14), + SetN_Load_µ_CandnotZ(0_15), + ResetOvr_Load_IM_NxorN(0_16), + SetOvr_Load_IM_NxnorN(0_17), + Load_Load_µ_NxorOVRorZ(0_20), + Load_Load_µ_NxnorOVRornotZ(0_21), + Load_Load_µ_NxorOVR(0_22), + Load_Load_µ_NxnorOVR(0_23), + Load_Load_µ_Z(0_24), + Load_Load_µ_notZ(0_25), + Load_Load_µ_OVR(0_26), + Load_Load_µ_notOVR(0_27), + LoadCarryInvert_LoadCarryInvert_µ_CorZ(0_30), + LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ(0_31), + Load_Load_µ_C(0_32), + Load_Load_µ_notC(0_33), + Load_Load_µ_notCorZ(0_34), + Load_Load_µ_CandnotZ(0_35), + Load_Load_µ_N(0_36), + Load_Load_µ_notN(0_37), + Load_Load_M_NxorOVRorZ(0_40), + Load_Load_M_NxnorOVRornotZ(0_41), + Load_Load_M_NxorOVR(0_42), + Load_Load_M_NxnorOVR(0_43), + Load_Load_M_Z(0_44), + Load_Load_M_notZ(0_45), + Load_Load_M_OVR(0_46), + Load_Load_M_notOVR(0_47), + LoadCarryInvert_LoadCarryInvert_M_CorZ(0_50), + LoadCarryInvert_LoadCarryInvert_M_notCandnotZ(0_51), + Load_Load_M_C(0_52), + Load_Load_M_notC(0_53), + Load_Load_M_notCorZ(0_54), + Load_Load_M_CandnotZ(0_55), + Load_Load_M_N(0_56), + Load_Load_M_notN(0_57), + Load_Load_I_NxorOVRorZ(0_60), + Load_Load_I_NxnorOVRornotZ(0_61), + Load_Load_I_NxorOVR(0_62), + Load_Load_I_NxnorOVR(0_63), + Load_Load_I_Z(0_64), + Load_Load_I_notZ(0_65), + Load_Load_I_OVR(0_66), + Load_Load_I_notOVR(0_67), + LoadCarryInvert_LoadCarryInvert_I_notCorZ(0_70), + LoadCarryInvert_LoadCarryInvert_I_CandnotZ(0_71), + Load_Load_I_C(0_72), + Load_Load_I_notC(0_73), + Load_Load_I_notCorZ(0_74), + Load_Load_I_CandnotZ(0_75), + Load_Load_I_N(0_76), + Load_Load_I_notN(0_77); + // @formatter:on + + public final int code; + + private Am2904_Inst(int code) + { + this.code = code; + } + + private static final Map instCodes; + + static + { + Map instCodesMod = new HashMap<>(); + Am2904_Inst[] vals = values(); + for (Am2904_Inst inst : vals) + { + assert inst.code == inst.ordinal(); + instCodesMod.put(inst.code, inst); + } + if (instCodesMod.size() != 64) + throw new IllegalStateException("There must be exactly 64 Am2904 instruction codes, but was " + instCodesMod.size()); + instCodes = Collections.unmodifiableMap(instCodesMod); + } + + public static Am2904_Inst getInstFor(int I_543210) + { + Am2904_Inst inst = instCodes.get(I_543210); + if (inst != null) + return inst; + throw new IllegalArgumentException("Invaild Am2904 instruction code: " + I_543210); + } + + public int getBlock() + { + return code >> 4; + } + + public boolean isLoadCarryInvert() + { + return (code & 0b001_110) == 0b001_000; + } + } + + enum Register + { + µZ, µC, µN, µOVR, MZ, MC, MN, MOVR; + } + + enum CompleteStatus + { + micro, MAKRO; + } + +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json new file mode 100644 index 00000000..964d7d3d --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904.json @@ -0,0 +1,846 @@ +{ + "width": 0.0, + "height": 0.0, + "interfacePins": [ + { + "location": { + "x": 10.0, + "y": 20.0 + }, + "name": "C", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 145.0, + "y": 125.0 + }, + "name": "C0", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 145.0, + "y": 75.0 + }, + "name": "CT", + "logicWidth": 1, + "usage": "OUTPUT" + }, + { + "location": { + "x": 10.0, + "y": 125.0 + }, + "name": "Cx", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 30.0 + }, + "name": "IC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 35.0 + }, + "name": "IN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 40.0 + }, + "name": "IOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 25.0 + }, + "name": "IZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": -87.66482568016058, + "y": 58.834004835619645 + }, + "name": "I_10", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": -80.0, + "y": 40.0 + }, + "name": "I_11_12", + "logicWidth": 2, + "usage": "INPUT" + }, + { + "location": { + "x": -85.0, + "y": 100.0 + }, + "name": "I_5_0", + "logicWidth": 6, + "usage": "INPUT" + }, + { + "location": { + "x": -84.26853373181032, + "y": 78.72500503091884 + }, + "name": "I_6_9", + "logicWidth": 4, + "usage": "INPUT" + }, + { + "location": { + "x": 145.0, + "y": 145.0 + }, + "name": "QIO0", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 10.0, + "y": 145.0 + }, + "name": "QIOn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 135.0 + }, + "name": "SIO0", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 10.0, + "y": 135.0 + }, + "name": "SIOn", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 30.0 + }, + "name": "YC", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 35.0 + }, + "name": "YN", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 40.0 + }, + "name": "YOVR", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 145.0, + "y": 25.0 + }, + "name": "YZ", + "logicWidth": 1, + "usage": "TRISTATE" + }, + { + "location": { + "x": 10.0, + "y": 45.0 + }, + "name": "_CEM", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 50.0 + }, + "name": "_CEmu", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 60.0 + }, + "name": "_EC", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 65.0 + }, + "name": "_EN", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 70.0 + }, + "name": "_EOVR", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 55.0 + }, + "name": "_EZ", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 145.0, + "y": 65.0 + }, + "name": "_OECT", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 80.0, + "y": 10.0 + }, + "name": "_OEY", + "logicWidth": 1, + "usage": "INPUT" + }, + { + "location": { + "x": 10.0, + "y": 100.0 + }, + "name": "_SE", + "logicWidth": 1, + "usage": "INPUT" + } + ], + "innerScale": 1.0, + "submodel": { + "components": [ + { + "id": "Merger", + "name": "Merger#0", + "pos": { + "x": -30.0, + "y": 70.0 + }, + "params": 13 + }, + { + "id": "Splitter", + "name": "Splitter#0", + "pos": { + "x": -45.0, + "y": 140.0 + }, + "params": 6 + }, + { + "id": "Splitter", + "name": "Splitter#1", + "pos": { + "x": -45.0, + "y": 100.0 + }, + "params": 4 + }, + { + "id": "Splitter", + "name": "Splitter#2", + "pos": { + "x": -45.0, + "y": 70.0 + }, + "params": 2 + }, + { + "id": "Am2904", + "name": "Am2904#0", + "pos": { + "x": 20.0, + "y": 15.0 + } + } + ], + "wires": [ + { + "pin1": { + "compName": "Am2904#0", + "pinName": "C" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "C" + }, + "name": "unnamedWire#0", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IZ" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IZ" + }, + "name": "unnamedWire#1", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EZ" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EZ" + }, + "name": "unnamedWire#10", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I_5_0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "I" + }, + "name": "unnamedWire#11", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I0" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O0" + }, + "name": "unnamedWire#12", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O1" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I1" + }, + "name": "unnamedWire#13", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I2" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O2" + }, + "name": "unnamedWire#14", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O3" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I3" + }, + "name": "unnamedWire#15", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I4" + }, + "pin2": { + "compName": "Splitter#0", + "pinName": "O4" + }, + "name": "unnamedWire#16", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#0", + "pinName": "O5" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I5" + }, + "name": "unnamedWire#17", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O0" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I6" + }, + "name": "unnamedWire#18", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I7" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O1" + }, + "name": "unnamedWire#19", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IC" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "IC" + }, + "name": "unnamedWire#2", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#1", + "pinName": "O2" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I8" + }, + "name": "unnamedWire#20", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I9" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "O3" + }, + "name": "unnamedWire#21", + "path": [] + }, + { + "pin1": { + "compName": "Splitter#2", + "pinName": "O0" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I11" + }, + "name": "unnamedWire#22", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "I12" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "O1" + }, + "name": "unnamedWire#23", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I_6_9" + }, + "pin2": { + "compName": "Splitter#1", + "pinName": "I" + }, + "name": "unnamedWire#24", + "path": [] + }, + { + "pin1": { + "compName": "Merger#0", + "pinName": "O" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "I" + }, + "name": "unnamedWire#25", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I_10" + }, + "pin2": { + "compName": "Merger#0", + "pinName": "I10" + }, + "name": "unnamedWire#26", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "I_11_12" + }, + "pin2": { + "compName": "Splitter#2", + "pinName": "I" + }, + "name": "unnamedWire#27", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_SE" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_SE" + }, + "name": "unnamedWire#28", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "Cx" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "Cx" + }, + "name": "unnamedWire#29", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "IN" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "IN" + }, + "name": "unnamedWire#3", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SIOn" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "SIOn" + }, + "name": "unnamedWire#30", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "QIOn" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "QIOn" + }, + "name": "unnamedWire#31", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "QIO0" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "QIO0" + }, + "name": "unnamedWire#32", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "SIO0" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "SIO0" + }, + "name": "unnamedWire#33", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "C0" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "C0" + }, + "name": "unnamedWire#34", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "CT" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "CT" + }, + "name": "unnamedWire#35", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_OECT" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OECT" + }, + "name": "unnamedWire#36", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YOVR" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YOVR" + }, + "name": "unnamedWire#37", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YN" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YN" + }, + "name": "unnamedWire#38", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YC" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YC" + }, + "name": "unnamedWire#39", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "IOVR" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "IOVR" + }, + "name": "unnamedWire#4", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "YZ" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "YZ" + }, + "name": "unnamedWire#40", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_OEY" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_OEY" + }, + "name": "unnamedWire#41", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_CEM" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_CEM" + }, + "name": "unnamedWire#5", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_CEmu" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_CEmu" + }, + "name": "unnamedWire#6", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EC" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EC" + }, + "name": "unnamedWire#7", + "path": [] + }, + { + "pin1": { + "compName": "Am2904#0", + "pinName": "_EN" + }, + "pin2": { + "compName": "_submodelinterface", + "pinName": "_EN" + }, + "name": "unnamedWire#8", + "path": [] + }, + { + "pin1": { + "compName": "_submodelinterface", + "pinName": "_EOVR" + }, + "pin2": { + "compName": "Am2904#0", + "pinName": "_EOVR" + }, + "name": "unnamedWire#9", + "path": [] + } + ], + "version": "0.1.1" + }, + "symbolRendererSnippetID": "default", + "outlineRendererSnippetID": "default", + "highLevelStateHandlerSnippetID": "standard", + "highLevelStateHandlerParams": { + "subcomponentHighLevelStates": { + "musr": { + "id": "delegating", + "params": { + "delegateTarget": "Am2904#0", + "prefix": "musr" + } + }, + "msr": { + "id": "delegating", + "params": { + "delegateTarget": "Am2904#0", + "prefix": "msr" + } + } + }, + "atomicHighLevelStates": {} + }, + "version": "0.1.5" +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java new file mode 100644 index 00000000..b43f130e --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2904/TestableAm2904Impl.java @@ -0,0 +1,293 @@ +package net.mograsim.logic.model.am2900.am2904; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.util.SwitchWithDisplay; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; +import net.mograsim.logic.model.model.components.ModelComponent; + +public class TestableAm2904Impl implements TestableAm2904 +{ + + private ModelComponent am2904; + private CoreManualSwitch I_5_0; + private CoreManualSwitch I_6_9; + private CoreManualSwitch I_10; + private CoreManualSwitch I_11_12; + private CoreManualSwitch C; + private CoreManualSwitch Cx; + private CoreManualSwitch IC, IN, IOVR, IZ; + private CoreManualSwitch _CEM, _CEmu; + private CoreManualSwitch _EC, _EN, _EOVR, _EZ; + private CoreManualSwitch _OECT, _OEY; + private CoreManualSwitch _SE; + private CoreBitDisplay C0; + private CoreBitDisplay CT; + private SwitchWithDisplay SIO0, SIOn, QIO0, QIOn; + private SwitchWithDisplay YC, YN, YOVR, YZ; + + private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, + "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/am2904/TestableAm2904.json"); + + @Override + public void setup() + { + testHelper.setup(DebugState.NO_DEBUG); + } + + @Override + public Result run() + { + return testHelper.run(); + } + + @Override + public void clockOn(boolean isClockOn) + { + if (isClockOn) + C.switchFullOn(); + else + C.switchFullOff(); + } + + @Override + public void setInstruction(Am2904_Inst inst) + { + I_5_0.setState(BitVector.from(inst.ordinal(), 6)); + } + + @Override + public void setShiftCode(String val_4_bit) + { + I_6_9.setState(BitVector.parse(val_4_bit)); + } + + @Override + public void setI10(Am2904_ShiftDir dir) + { + I_10.setState(BitVector.from(dir.ordinal(), 1)); + } + + @Override + public void setCarry(Am2904_Carry carry) + { + I_11_12.setState(BitVector.from(carry.ordinal(), 2)); + } + + @Override + public void setCX(String val_1_bit) + { + Cx.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setY(String z_c_n_ovr) + { + var bv = BitVector.parse(z_c_n_ovr); + // correct order apparently unknown, most likely Z-C-N-OVR + YZ.setState(bv.getLSBit(3).toVector()); + YC.setState(bv.getLSBit(2).toVector()); + YN.setState(bv.getLSBit(1).toVector()); + YOVR.setState(bv.getLSBit(0).toVector()); + } + + @Override + public void setIZ(String val_1_bit) + { + IZ.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setIC(String val_1_bit) + { + IC.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setIOVR(String val_1_bit) + { + IOVR.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setIN(String val_1_bit) + { + IN.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_CEM(String val_1_bit) + { + _CEM.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_CEµ(String val_1_bit) + { + _CEmu.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_OEY(String val_1_bit) + { + _OEY.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_OECT(String val_1_bit) + { + _OECT.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_SE(String val_1_bit) + { + _SE.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_EZ(String val_1_bit) + { + _EZ.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_EC(String val_1_bit) + { + _EC.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_EOVR(String val_1_bit) + { + _EOVR.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_EN(String val_1_bit) + { + _EN.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setSIO0(String val_1_bit) + { + SIO0.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setSIO3(String val_1_bit) + { + SIOn.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setQIO0(String val_1_bit) + { + QIO0.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setQIO3(String val_1_bit) + { + QIOn.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setDirectly(Register r, String val_1_bit) + { + var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); + bv = bv.withBitChanged(r.ordinal() % 4, b -> Bit.parse(val_1_bit)); + am2904.setHighLevelState(regToStateID(r), bv); + } + + @Override + public void setDirectly(CompleteStatus r, String z_c_n_ovr) + { + am2904.setHighLevelState(regToStateID(r), BitVector.parse(z_c_n_ovr)); + } + + @Override + public String getC0() + { + return C0.getDisplayedValue().toString(); + } + + @Override + public String getCT() + { + return CT.getDisplayedValue().toString(); + } + + @Override + public String getY() + { + // correct order apparently unknown, most likely Z-C-N-OVR + var y3 = YZ.getDisplayedValue(); + var y2 = YC.getDisplayedValue(); + var y1 = YN.getDisplayedValue(); + var y0 = YOVR.getDisplayedValue(); + return y3.concat(y2).concat(y1).concat(y0).toString(); + } + + @Override + public String getSIO0() + { + return SIO0.getDisplayedValue().toString(); + } + + @Override + public String getSIO3() + { + return SIOn.getDisplayedValue().toString(); + } + + @Override + public String getQIO0() + { + return QIO0.getDisplayedValue().toString(); + } + + @Override + public String getQIO3() + { + return QIOn.getDisplayedValue().toString(); + } + + @Override + public String getDirectly(Register r) + { + var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); + return bv.getMSBit(r.ordinal() % 4).getSymbol(); + } + + @Override + public String getDirectly(CompleteStatus r) + { + var bv = (BitVector) am2904.getHighLevelState(regToStateID(r)); + return bv.toString(); + } + + private static String regToStateID(Register r) + { + if (r.ordinal() < 4) + return "musr.q"; + return "msr.q"; + } + + private static String regToStateID(CompleteStatus r) + { + if (r == CompleteStatus.micro) + return "musr.q"; + return "msr.q"; + } + + @Override + public TestEnvironmentHelper getTestEnvironmentHelper() + { + return testHelper; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Test.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Test.java new file mode 100644 index 00000000..18b2578d --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Test.java @@ -0,0 +1,69 @@ +package net.mograsim.logic.model.am2900.am2910; + +import static net.mograsim.logic.model.am2900.am2910.TestableAm2910.Am2910_Inst.*; +import static net.mograsim.logic.core.types.Bit.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.am2910.TestableAm2910.Register; +import net.mograsim.logic.model.am2900.util.DisplayStateOnFailure; + +@DisplayName("Am2910 Tests") +@TestMethodOrder(OrderAnnotation.class) +public class Am2910Test +{ + private TestableAm2910 am2910 = new TestableAm2910Impl(); + + @RegisterExtension + DisplayStateOnFailure failureRule = new DisplayStateOnFailure(am2910); + + @BeforeEach + void initialize() + { + createAndSetup(); + setStandardInputs(); + } + + void createAndSetup() + { + am2910.setup(); + } + + void setStandardInputs() + { + am2910.set_CC("0"); + am2910.set_CCEN("0"); + am2910.set_OE("0"); + am2910.set_RLD("1"); + am2910.setCI("1"); + am2910.setD("000000000000"); + am2910.setInstruction(JZ); + am2910.clockOn(true); + am2910.assertRunSuccess(); + } + + @ParameterizedTest(name = "{0}") + @Order(1) + @DisplayName("Direct / high level access") + @EnumSource(Register.class) + void testDirectAccess(Register r) + { + String us = U.toVector(r.size()).toString(); + String three = BitVector.from(3, r.size()).toString(); + + assertEquals(us, am2910.getDirectly(r)); + + am2910.setDirectly(r, three); + + assertEquals(three, am2910.getDirectly(r)); + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java new file mode 100644 index 00000000..59ac5b14 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/Am2910Testbench.java @@ -0,0 +1,85 @@ +package net.mograsim.logic.model.am2900.am2910; + +import net.haspamelodica.swt.helper.swtobjectwrappers.Point; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.SimpleLogicUIStandalone; +import net.mograsim.logic.model.SimpleLogicUIStandalone.VisualisationObjects; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.Orientation; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelClock; +import net.mograsim.logic.model.model.components.atomic.ModelClock.ModelClockParams; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; + +public class Am2910Testbench +{ + public static void main(String[] args) + { + Am2900Loader.setup(); + SimpleLogicUIStandalone.executeVisualisation(Am2910Testbench::create, Am2910Testbench::beforeRun); + } + + @SuppressWarnings("unused") // for ModelWires being created + public static void create(LogicModelModifiable model) + { + ModelComponent am2910 = IndirectModelComponentCreator.createComponent(model, "Am2910", "Am2910"); + ModelClock C = new ModelClock(model, new ModelClockParams(1000, Orientation.RIGHT)); + ModelManualSwitch D = new ModelManualSwitch(model, 12, "D"); + ModelManualSwitch _RLD = new ModelManualSwitch(model, 1, "_RLD"); + ModelManualSwitch _CC = new ModelManualSwitch(model, 1, "_CC"); + ModelManualSwitch _CCEN = new ModelManualSwitch(model, 1, "_CCEN"); + ModelManualSwitch I = new ModelManualSwitch(model, 4, "I"); + ModelManualSwitch CI = new ModelManualSwitch(model, 1, "CI"); + ModelManualSwitch _OE = new ModelManualSwitch(model, 1, "_OE"); + ModelBitDisplay _FULL = new ModelBitDisplay(model, 1, "_FULL"); + ModelBitDisplay _PL = new ModelBitDisplay(model, 1, "_PL"); + ModelBitDisplay _MAP = new ModelBitDisplay(model, 1, "_MAP"); + ModelBitDisplay _VECT = new ModelBitDisplay(model, 1, "_VECT"); + ModelBitDisplay Y = new ModelBitDisplay(model, 12, "Y"); + + C.moveTo(35, -35); + D.moveTo(10, -20); + _RLD.moveTo(-30, -1.5); + _CC.moveTo(-30, 20); + _CCEN.moveTo(-30, 40); + I.moveTo(-30, 60); + CI.moveTo(75, 45); + _FULL.moveTo(80, 6.5); + _PL.moveTo(30, 85); + _MAP.moveTo(30, 105); + _VECT.moveTo(30, 125); + Y.moveTo(40, 65); + _OE.moveTo(60, 85); + + new ModelWire(model, C.getOutputPin(), am2910.getPin("C"), new Point(60, -27.5)); + new ModelWire(model, D.getOutputPin(), am2910.getPin("D"), new Point(36, -12.5)); + new ModelWire(model, _RLD.getOutputPin(), am2910.getPin("_RLD"), new Point[0]); + new ModelWire(model, _CC.getOutputPin(), am2910.getPin("_CC")); + new ModelWire(model, _CCEN.getOutputPin(), am2910.getPin("_CCEN")); + new ModelWire(model, I.getOutputPin(), am2910.getPin("I")); + new ModelWire(model, CI.getOutputPin(), am2910.getPin("CI"), new Point(100, 52.5), new Point(100, 40)); + new ModelWire(model, am2910.getPin("_FULL"), _FULL.getInputPin(), new Point[0]); + new ModelWire(model, am2910.getPin("_PL"), _PL.getInputPin(), new Point(13, 92.5)); + new ModelWire(model, am2910.getPin("_MAP"), _MAP.getInputPin(), new Point(19, 112.5)); + new ModelWire(model, am2910.getPin("_VECT"), _VECT.getInputPin(), new Point(25, 132.5)); + new ModelWire(model, am2910.getPin("Y"), Y.getInputPin(), new Point(38, 72.5)); + new ModelWire(model, am2910.getPin("_OE"), _OE.getOutputPin()); + } + + public static void beforeRun(VisualisationObjects vis) + { + vis.model.getComponentsByName().values().forEach(c -> + { + if (c instanceof ModelManualSwitch) + { + ModelManualSwitch cCasted = (ModelManualSwitch) c; + cCasted.setHighLevelState("out", BitVector.of(Bit.ZERO, cCasted.logicWidth)); + } + }); + } +} \ No newline at end of file diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java new file mode 100644 index 00000000..5290c5a6 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910.java @@ -0,0 +1,60 @@ +package net.mograsim.logic.model.am2900.am2910; + +import java.util.Arrays; +import java.util.stream.Stream; + +import net.mograsim.logic.model.am2900.TestableCircuit; + +public interface TestableAm2910 extends TestableCircuit +{ + + void setInstruction(Am2910_Inst inst); + + void set_CCEN(String val_1_bit); + + void setD(String val_12_bit); + + void set_CC(String val_1_bit); + + void setCI(String val_1_bit); + + void set_RLD(String val_1_bit); + + void set_OE(String val_1_bit); + + void setDirectly(Register r, String val_X_bit); + + String getY(); + + String get_FULL(); + + String get_PL(); + + String get_MAP(); + + String get_VECT(); + + String getDirectly(Register r); + + enum Am2910_Inst + { + JZ, CJS, JMAP, CJP, PUSH, JSRP, CJV, JRP, RFCT, RPCT, CRTN, CJPP, LDCT, LOOP, CONT, TWB; + } + + enum Register + { + S_0, S_1, S_2, S_3, S_4, SP, PC, REG_COUNT; + + public static Stream stream() + { + return Arrays.stream(values()); + } + + public int size() + { + if (this == SP) + return 3; + return 12; + } + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java new file mode 100644 index 00000000..48b85698 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/am2910/TestableAm2910Impl.java @@ -0,0 +1,159 @@ +package net.mograsim.logic.model.am2900.am2910; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper; +import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState; +import net.mograsim.logic.model.model.components.ModelComponent; + +public class TestableAm2910Impl implements TestableAm2910 +{ + + private ModelComponent am2901; + private CoreManualSwitch I; + private CoreManualSwitch C; + private CoreManualSwitch CI; + private CoreManualSwitch D; + private CoreManualSwitch _CC; + private CoreManualSwitch _CCEN; + private CoreManualSwitch _RLD; + private CoreManualSwitch _OE; + private CoreBitDisplay _FULL; + private CoreBitDisplay Y; + private CoreBitDisplay _PL, _MAP, _VECT; + + private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this, "Am2910"); + + @Override + public void setup() + { + testHelper.setup(DebugState.NO_DEBUG); + } + + @Override + public Result run() + { + return testHelper.run(); + } + + @Override + public void clockOn(boolean isClockOn) + { + if (isClockOn) + C.switchFullOn(); + else + C.switchFullOff(); + } + + @Override + public void setInstruction(Am2910_Inst inst) + { + I.setState(BitVector.from(inst.ordinal(), 4)); + } + + @Override + public void set_CCEN(String val_1_bit) + { + _CCEN.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setD(String val_12_bit) + { + D.setState(BitVector.parse(val_12_bit)); + } + + @Override + public void set_CC(String val_1_bit) + { + _CC.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setCI(String val_1_bit) + { + CI.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_RLD(String val_1_bit) + { + _RLD.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void set_OE(String val_1_bit) + { + _OE.setState(BitVector.parse(val_1_bit)); + } + + @Override + public void setDirectly(Register r, String val_X_bit) + { + am2901.setHighLevelState(regToStateID(r), BitVector.parse(val_X_bit)); + } + + @Override + public String getY() + { + return Y.getDisplayedValue().toString(); + } + + @Override + public String get_FULL() + { + return _FULL.getDisplayedValue().toString(); + } + + @Override + public String get_PL() + { + return _PL.getDisplayedValue().toString(); + } + + @Override + public String get_MAP() + { + return _MAP.getDisplayedValue().toString(); + } + + @Override + public String get_VECT() + { + return _VECT.getDisplayedValue().toString(); + } + + @Override + public String getDirectly(Register r) + { + return am2901.getHighLevelState(regToStateID(r)).toString(); + } + + private static String regToStateID(Register r) + { + switch (r) + { + case S_0: + case S_1: + case S_2: + case S_3: + case S_4: + return "stack.c" + BitVector.from(r.ordinal(), 3); + case SP: + return "sp.q"; + case PC: + return "mupc.q"; + case REG_COUNT: + return "r.q"; + default: + throw new IllegalArgumentException("unknown: " + r); + } + } + + @Override + public TestEnvironmentHelper getTestEnvironmentHelper() + { + return testHelper; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java new file mode 100644 index 00000000..3f68c67e --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/DisplayStateOnFailure.java @@ -0,0 +1,30 @@ +package net.mograsim.logic.model.am2900.util; + +import java.util.Objects; + +import org.junit.jupiter.api.extension.AfterTestExecutionCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +import net.mograsim.logic.model.am2900.TestableCircuit; + +public class DisplayStateOnFailure implements AfterTestExecutionCallback +{ + public static final boolean ACTIVE = true; + + private final TestableCircuit circuitUnderTest; + + public DisplayStateOnFailure(TestableCircuit circuitUnderTest) + { + this.circuitUnderTest = Objects.requireNonNull(circuitUnderTest); + } + + @Override + public void afterTestExecution(ExtensionContext context) throws Exception + { + if (ACTIVE && context.getExecutionException().isPresent()) + { + context.getExecutionException().get().printStackTrace(); + circuitUnderTest.displayState(); + } + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java new file mode 100644 index 00000000..c085c52e --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/SwitchWithDisplay.java @@ -0,0 +1,65 @@ +package net.mograsim.logic.model.am2900.util; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; +import net.mograsim.logic.model.util.ModellingTool; + +public class SwitchWithDisplay +{ + private final Pin pin; + private final ModelBitDisplay modelBitDisplay; + private final ModelManualSwitch modelManualSwitch; + + public SwitchWithDisplay(LogicModelModifiable model, Pin target) + { + pin = target; + modelBitDisplay = new ModelBitDisplay(model, pin.logicWidth); + modelManualSwitch = new ModelManualSwitch(model, pin.logicWidth); + + ModellingTool tool = ModellingTool.createFor(model); + ModelWireCrossPoint crossPoint = new ModelWireCrossPoint(model, pin.logicWidth); + tool.connect(modelBitDisplay.getInputPin(), crossPoint); + tool.connect(modelManualSwitch.getOutputPin(), crossPoint); + } + + public final BitVector getDisplayedValue() + { + return modelBitDisplay.getBitDisplay().getDisplayedValue(); + } + + public final void setState(BitVector bits) + { + modelManualSwitch.getManualSwitch().setState(bits); + } + + public final Pin getPin() + { + return pin; + } + + public final CoreBitDisplay getBitDisplay() + { + return modelBitDisplay.getBitDisplay(); + } + + public final CoreManualSwitch getManualSwitch() + { + return modelManualSwitch.getManualSwitch(); + } + + final ModelBitDisplay getModelBitDisplay() + { + return modelBitDisplay; + } + + final ModelManualSwitch getModelManualSwitch() + { + return modelManualSwitch; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java new file mode 100644 index 00000000..4bae8ec5 --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestEnvironmentHelper.java @@ -0,0 +1,276 @@ +package net.mograsim.logic.model.am2900.util; + +import static org.junit.jupiter.api.Assertions.fail; + +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Objects; +import java.util.Optional; +import java.util.Queue; +import java.util.Set; +import java.util.TreeSet; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.model.LogicUIStandaloneGUI; +import net.mograsim.logic.model.am2900.Am2900Loader; +import net.mograsim.logic.model.am2900.TestableCircuit; +import net.mograsim.logic.model.am2900.TestableCircuit.Result; +import net.mograsim.logic.model.model.LogicModel; +import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; +import net.mograsim.logic.model.model.wires.ModelWire; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.modeladapter.CoreModelParameters; +import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; +import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; +import net.mograsim.logic.model.util.ModellingTool; + +public class TestEnvironmentHelper +{ + private final TestableCircuit testEnvInstance; + private final Class testEnvClass; + private final String modelId; + private Field componentField; + private Optional timelineField = Optional.empty(); + + private ModelComponent component; + private Timeline timeline; + private LogicModelModifiable logicModel; + private ModellingTool modellingTool; + private HashMap idSwitchMap = new HashMap<>(); + private HashMap idDisplayMap = new HashMap<>(); + + private DebugState debug = DebugState.NO_DEBUG; + private Set wireDebugChangeSet; + private boolean debugWires = false; + public int debugEventThreshold = 10_000; + public int debugEventCount = 500; + private int eventCounter; + + public TestEnvironmentHelper(TestableCircuit testEnv, String modelId) + { + this.testEnvInstance = testEnv; + this.modelId = modelId; + this.testEnvClass = testEnvInstance.getClass(); + for (Field f : testEnvClass.getDeclaredFields()) + { + if (ModelComponent.class.isAssignableFrom(f.getType())) + { + componentField = f; + componentField.setAccessible(true); + } else if (Timeline.class.isAssignableFrom(f.getType())) + { + f.setAccessible(true); + timelineField = Optional.of(f); + } + } + if (componentField == null) + throw new IllegalStateException("No component or timeline field found!"); + } + + public void setup(DebugState debug) + { + this.debug = debug; + // Create logic model + logicModel = new LogicModelModifiable(); + modellingTool = ModellingTool.createFor(logicModel); + Am2900Loader.setup(); + component = IndirectModelComponentCreator.createComponent(logicModel, modelId); + setField(componentField, component); + + component.getPins().values().forEach(this::extendModelPin); + + // Create core model + CoreModelParameters params = new CoreModelParameters(); + params.gateProcessTime = 50; + params.wireTravelTime = 10; + timeline = LogicCoreAdapter.convert(logicModel, params); + timelineField.ifPresent(f -> setField(f, timeline)); + + // Bind switches/displays to this test class + component.getPins().values().forEach(this::bindModelPin); + + if (debug == DebugState.DEBUG_AT_PERFORMANCE_COST) + { + setupDebugging(); + } + timeline.addEventAddedListener(te -> eventCounter++); + } + + private void extendModelPin(Pin p) + { + String javaIdentId = idToJavaIdentifier(p.name); + try + { + Field f = testEnvClass.getDeclaredField(javaIdentId); + Class type = f.getType(); + if (CoreManualSwitch.class.isAssignableFrom(type)) + { + ModelManualSwitch gms = new ModelManualSwitch(logicModel, p.logicWidth); + modellingTool.connect(p, gms.getOutputPin()); + idSwitchMap.put(p.name, gms); + } else if (CoreBitDisplay.class.isAssignableFrom(type)) + { + ModelBitDisplay gbd = new ModelBitDisplay(logicModel, p.logicWidth); + modellingTool.connect(p, gbd.getInputPin()); + idDisplayMap.put(p.name, gbd); + } else if (SwitchWithDisplay.class.isAssignableFrom(type)) + { + SwitchWithDisplay swd = new SwitchWithDisplay(logicModel, p); + setField(f, swd); + } else + { + fail("unkown field type " + type); + } + } + catch (NoSuchFieldException | SecurityException e) + { + fail(e); + } + } + + private void bindModelPin(Pin p) + { + String javaIdentId = idToJavaIdentifier(p.name); + if (idDisplayMap.containsKey(p.name)) + setField(javaIdentId, idDisplayMap.get(p.name).getBitDisplay()); + if (idSwitchMap.containsKey(p.name)) + setField(javaIdentId, idSwitchMap.get(p.name).getManualSwitch()); + } + + private void setupDebugging() + { + // Debug code + HashSet wiresIncludingSubmodels = new HashSet<>(); + Queue modelsToIterate = new LinkedList<>(); + modelsToIterate.add(logicModel); + while (modelsToIterate.size() > 0) + { + LogicModel model = modelsToIterate.poll(); + wiresIncludingSubmodels.addAll(model.getWiresByName().values()); + for (ModelComponent comp : model.getComponentsByName().values()) + if (comp instanceof SubmodelComponent) + modelsToIterate.offer(((SubmodelComponent) comp).submodel); + } + System.out.println(wiresIncludingSubmodels.size()); + logicModel.setRedrawHandler(() -> wiresIncludingSubmodels.forEach(w -> + { + if (debugWires) + { + wireDebugChangeSet.add(w.toString()); + } + })); + } + + public Result run() + { + // Normal execution until completion or eventLimit + int eventLimit = debugEventThreshold; + eventCounter = 0; + debugWires = false; + while (eventCounter < eventLimit) + { + timeline.executeNext(); + if (!timeline.hasNext()) + return Result.SUCCESS; + } + + // Start debugging if event limit is reached (if debug is active) + if (debug == DebugState.DEBUG_AT_PERFORMANCE_COST) + return debugThisRun(); + + return Result.OUT_OF_TIME; + } + + private Result debugThisRun() + { + int eventLimit = debugEventThreshold; + debugWires = true; + wireDebugChangeSet = new TreeSet<>(); + Set oldChangeSet; + // observe wire changes to detect, if we are really stuck in an endless loop + do + { + eventLimit += debugEventCount; + oldChangeSet = wireDebugChangeSet; + wireDebugChangeSet = new TreeSet<>(); + while (eventCounter < eventLimit) + { + timeline.executeNext(); + if (!timeline.hasNext()) + { + // no endless loop, but more events needed than expected + System.out.println("run() took longer than expected: " + eventCounter); + return Result.SUCCESS; + } + } + } while (!oldChangeSet.equals(wireDebugChangeSet)); + // if stuck, abort execution and print wires + System.err.print("Problematic Wire updates:"); + wireDebugChangeSet.forEach(System.out::println); + System.err.println("run() failed: " + eventCounter); + return Result.OUT_OF_TIME; + } + + private static String idToJavaIdentifier(String s) + { + StringBuilder sb = new StringBuilder(s.length()); + char c = s.charAt(0); + sb.append(Character.isJavaIdentifierStart(c) ? c : '_'); + for (int i = 1; i < s.length(); i++) + sb.append(Character.isJavaIdentifierPart(c = s.charAt(i)) ? c : '_'); + return sb.toString(); + } + + private void setField(Field f, S value) + { + try + { + f.setAccessible(true); + f.set(testEnvInstance, Objects.requireNonNull(value)); + } + catch (Exception e) + { + fail(e); + } + } + + private void setField(String name, S value) + { + try + { + Field f = testEnvClass.getDeclaredField(name); + f.setAccessible(true); + f.set(testEnvInstance, Objects.requireNonNull(value)); + } + catch (Exception e) + { + fail(e); + } + } + + public void displayState() + { + try + { + new LogicUIStandaloneGUI(logicModel).run(); + logicModel.setRedrawHandler(null); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public enum DebugState + { + NO_DEBUG, DEBUG_AT_PERFORMANCE_COST; + } +} diff --git a/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestUtil.java b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestUtil.java new file mode 100644 index 00000000..5989dfbe --- /dev/null +++ b/tests/net.mograsim.logic.model.am2900.tests/src/net/mograsim/logic/model/am2900/util/TestUtil.java @@ -0,0 +1,100 @@ +package net.mograsim.logic.model.am2900.util; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.types.BitVector.BitVectorMutator; + +public final class TestUtil +{ + private TestUtil() + { + + } + + /** + * Transforms the last four bits of an int to a string that contains the binary ('1' and '0') representation of the 4 bits + * + * @author Christian Femers + */ + public static String to4bitBin(int x) + { + StringBuilder sb = new StringBuilder(4); + sb.append((x & 0b1000) == 0 ? '0' : '1'); + sb.append((x & 0b0100) == 0 ? '0' : '1'); + sb.append((x & 0b0010) == 0 ? '0' : '1'); + sb.append((x & 0b0001) == 0 ? '0' : '1'); + return sb.toString(); + } + + /** + * Transforms the given boolean to a string that contains the binary ('1' and '0') representation of the bit + * + * @author Christian Femers + */ + public static String to1bitBin(boolean bitIsSet) + { + return bitIsSet ? "1" : "0"; + } + + /** + * Transforms the given int to a string that contains the binary ('1' and '0') representation of the int. "0" is only returned when the + * int is equal to zero. + * + * @author Christian Femers + */ + public static String to1bitBin(int someInt) + { + return someInt != 0 ? "1" : "0"; + } + + /** + * Transforms a 4 bit signed integer (-8 to 7) to a int representing the same number. (Adding leading 1-bits if the 4 bit int is + * negative) + * + * @author Christian Femers + */ + public static int signed4ToSigned32(int signed4bit) + { + if ((signed4bit & 0b1000) > 0) + return signed4bit | 0xFF_FF_FF_F0; + return signed4bit & 0x00_00_00_0F; + } + + /** + * Transforms a 16 bit signed integer (-32768 to 32767 - a short) to a int representing the same number. (Adding leading 1-bits if the + * 16 bit int is negative) + * + * @author Christian Femers + */ + public static int signed16ToSigned32(int signed16bit) + { + return (short) signed16bit; + } + + /** + * Transforms the last n bits of an int to a string that contains the binary ('1' and '0') representation of the n bits + * + * @author Christian Femers + */ + public static String toNbitString(int x, int n) + { + StringBuilder sb = new StringBuilder(n); + for (int i = 0; i < n; i++) + { + sb.append((x >> i) & 1); + } + return sb.reverse().toString(); + } + + public static BitVector of(int value, int length) + { + BitVectorMutator mutator = BitVectorMutator.ofLength(length); + int val = value; + for (int i = length - 1; i >= 0; i--) + { + mutator.setMSBit(i, Bit.lastBitOf(val)); + val >>>= 1; + } + return mutator.toBitVector(); + } +} diff --git a/tests/net.mograsim.logic.tests/.classpath b/tests/net.mograsim.logic.tests/.classpath new file mode 100644 index 00000000..e61c696d --- /dev/null +++ b/tests/net.mograsim.logic.tests/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/net.mograsim.logic.tests/.project b/tests/net.mograsim.logic.tests/.project new file mode 100644 index 00000000..b8cd02dd --- /dev/null +++ b/tests/net.mograsim.logic.tests/.project @@ -0,0 +1,17 @@ + + + net.mograsim.logic.tests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/tests/net.mograsim.logic.tests/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/tests/net.mograsim.logic.tests/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs b/tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 00000000..f897a7f1 --- /dev/null +++ b/tests/net.mograsim.logic.tests/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF b/tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF new file mode 100644 index 00000000..4a72ac6b --- /dev/null +++ b/tests/net.mograsim.logic.tests/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Logic Tests +Bundle-SymbolicName: net.mograsim.logic.tests;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Fragment-Host: net.mograsim.logic.model;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.logic.tests +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.junit.jupiter.api;bundle-version="5.4.0";visibility:=reexport, + org.junit.jupiter.params;bundle-version="5.4.0";visibility:=reexport, + org.junit;bundle-version="4.12.0" diff --git a/tests/net.mograsim.logic.tests/build.properties b/tests/net.mograsim.logic.tests/build.properties new file mode 100644 index 00000000..34d2e4d2 --- /dev/null +++ b/tests/net.mograsim.logic.tests/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java new file mode 100644 index 00000000..12df5844 --- /dev/null +++ b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/CoreComponentTest.java @@ -0,0 +1,465 @@ +package net.mograsim.logic.core.tests; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import net.mograsim.logic.core.components.CoreDemux; +import net.mograsim.logic.core.components.CoreMux; +import net.mograsim.logic.core.components.CoreTriStateBuffer; +import net.mograsim.logic.core.components.CoreUnidirectionalMerger; +import net.mograsim.logic.core.components.CoreUnidirectionalSplitter; +import net.mograsim.logic.core.components.gates.CoreAndGate; +import net.mograsim.logic.core.components.gates.CoreNandGate; +import net.mograsim.logic.core.components.gates.CoreNorGate; +import net.mograsim.logic.core.components.gates.CoreNotGate; +import net.mograsim.logic.core.components.gates.CoreOrGate; +import net.mograsim.logic.core.components.gates.CoreXorGate; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; + +@SuppressWarnings("unused") +class CoreComponentTest +{ + private Timeline t = new Timeline(11); + + @BeforeEach + void resetTimeline() + { + t.reset(); + } + + @Test + void circuitExampleTest() + { + CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), c = new CoreWire(t, 1, 10), d = new CoreWire(t, 2, 1), + e = new CoreWire(t, 1, 1), f = new CoreWire(t, 1, 1), g = new CoreWire(t, 1, 1), h = new CoreWire(t, 2, 1), + i = new CoreWire(t, 2, 1), j = new CoreWire(t, 1, 1), k = new CoreWire(t, 1, 1); + new CoreAndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); + new CoreNotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd()); + new CoreUnidirectionalMerger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd()); + new CoreMux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd()); + new CoreUnidirectionalSplitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd()); + + a.createReadWriteEnd().feedSignals(Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ONE); + c.createReadWriteEnd().feedSignals(Bit.ZERO); + d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE); + e.createReadWriteEnd().feedSignals(Bit.ZERO); + + t.executeAll(); + + assertEquals(Bit.ONE, j.getValue()); + assertEquals(Bit.ZERO, k.getValue()); + } + + @Test + void splitterTest() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), in = new CoreWire(t, 8, 1); + in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + new CoreUnidirectionalSplitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd()); + + t.executeAll(); + + assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); + assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO); + assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); + } + + @Test + void mergerTest() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1); + a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO); + c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); + + new CoreUnidirectionalMerger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); + + t.executeAll(); + + assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + } + + @Test + void fusionTest1() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 2, 1), c = new CoreWire(t, 3, 1), out = new CoreWire(t, 8, 1); + CoreWire.fuse(a, out, 0, 0, a.width); + CoreWire.fuse(b, out, 0, a.width, b.width); + CoreWire.fuse(c, out, 0, a.width + b.width, c.width); + ReadWriteEnd rA = a.createReadWriteEnd(); + rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO); + ReadWriteEnd rB = b.createReadWriteEnd(); + rB.feedSignals(Bit.ONE, Bit.ZERO); + ReadWriteEnd rC = c.createReadWriteEnd(); + rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); + + t.executeAll(); + assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + t.executeAll(); + assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X); + assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X); + assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X); + rA.clearSignals(); + rB.clearSignals(); + rC.clearSignals(); + t.executeAll(); + assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE); + assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE); + assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO); + } + + @Test + void fusionTest2() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); + CoreWire.fuse(a, b); + ReadWriteEnd rw = a.createReadWriteEnd(); + t.executeAll(); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); + + rw.feedSignals(Bit.ONE, Bit.U, Bit.Z); + t.executeAll(); + assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z); + } + + @Test + void fusionTest3() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); + a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X); + t.executeAll(); + CoreWire.fuse(a, b); + t.executeAll(); + assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X); + } + + @Test + void fusionTest4() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 1); + a.createReadWriteEnd(); + t.executeAll(); + + CoreWire.fuse(a, b); + t.executeAll(); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); + } + +// @Test +// void connectorTest() +// { +// t.reset(); +// Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1); +// new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect(); +//// b.createReadWriteEnd(); +// a.createReadWriteEnd(); +// t.executeAll(); +// assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U); +// } + + @Test + void triStateBufferTest() + { + CoreWire a = new CoreWire(t, 1, 1), b = new CoreWire(t, 1, 1), en = new CoreWire(t, 1, 1), notEn = new CoreWire(t, 1, 1); + new CoreNotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd()); + new CoreTriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd()); + new CoreTriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd()); + + ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd(); + enI.feedSignals(Bit.ONE); + aI.feedSignals(Bit.ONE); + bI.feedSignals(Bit.Z); + + t.executeAll(); + + assertEquals(Bit.ONE, b.getValue()); + + bI.feedSignals(Bit.ZERO); + + t.executeAll(); + + assertEquals(Bit.X, b.getValue()); + assertEquals(Bit.ONE, a.getValue()); + + aI.clearSignals(); + enI.feedSignals(Bit.ZERO); + + t.executeAll(); + + assertEquals(Bit.ZERO, a.getValue()); + + } + + @Test + void muxTest() + { + CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), + out = new CoreWire(t, 4, 1); + ReadWriteEnd selectIn = select.createReadWriteEnd(); + + selectIn.feedSignals(Bit.ZERO, Bit.ZERO); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + + new CoreMux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), + c.createReadOnlyEnd()); + t.executeAll(); + + assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + selectIn.feedSignals(Bit.ONE, Bit.ZERO); + t.executeAll(); + + assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + + selectIn.feedSignals(Bit.ONE, Bit.ONE); + t.executeAll(); + + assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); + + } + + @Test + void demuxTest() + { + CoreWire a = new CoreWire(t, 4, 3), b = new CoreWire(t, 4, 6), c = new CoreWire(t, 4, 4), select = new CoreWire(t, 2, 5), + in = new CoreWire(t, 4, 1); + ReadWriteEnd selectIn = select.createReadWriteEnd(); + + selectIn.feedSignals(Bit.ZERO, Bit.ZERO); + in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + + new CoreDemux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), + c.createReadWriteEnd()); + t.executeAll(); + + assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); + assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); + selectIn.feedSignals(Bit.ONE, Bit.ZERO); + t.executeAll(); + + assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); + assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO); + + selectIn.feedSignals(Bit.ONE, Bit.ONE); + t.executeAll(); + + assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); + assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U); + assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z); + + } + + @Test + void andTest() + { + CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1); + new CoreAndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + + t.executeAll(); + + assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO); + } + + @Test + void orTest() + { + CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1); + new CoreOrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + + t.executeAll(); + + assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE); + } + + @Test + void nandTest() + { + CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1); + new CoreNandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + + t.executeAll(); + + assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); + } + + @Test + void norTest() + { + CoreWire a = new CoreWire(t, 4, 1), b = new CoreWire(t, 4, 3), c = new CoreWire(t, 4, 1), d = new CoreWire(t, 4, 1); + new CoreNorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE); + c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO); + + t.executeAll(); + + assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO); + } + + @Test + void xorTest() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2), c = new CoreWire(t, 3, 1), d = new CoreWire(t, 3, 1); + new CoreXorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd()); + a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); + b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); + c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE); + + t.executeAll(); + + assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE); + } + + @Test + void notTest() + { + CoreWire a = new CoreWire(t, 3, 1), b = new CoreWire(t, 3, 2); + new CoreNotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd()); + a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE); + + t.executeAll(); + + assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO); + } + + @Test + void rsLatchCircuitTest() + { + CoreWire r = new CoreWire(t, 1, 1), s = new CoreWire(t, 1, 1), t1 = new CoreWire(t, 1, 15), t2 = new CoreWire(t, 1, 1), + q = new CoreWire(t, 1, 1), nq = new CoreWire(t, 1, 1); + + new CoreOrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); + new CoreOrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); + new CoreNotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd()); + new CoreNotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); + + ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd(); + + sIn.feedSignals(Bit.ONE); + rIn.feedSignals(Bit.ZERO); + + t.executeAll(); + + assertEquals(Bit.ONE, q.getValue()); + assertEquals(Bit.ZERO, nq.getValue()); + + sIn.feedSignals(Bit.ZERO); + + t.executeAll(); + assertEquals(Bit.ONE, q.getValue()); + assertEquals(Bit.ZERO, nq.getValue()); + + rIn.feedSignals(Bit.ONE); + + t.executeAll(); + + assertEquals(Bit.ZERO, q.getValue()); + assertEquals(Bit.ONE, nq.getValue()); + } + + @Test + void numericValueTest() + { + CoreWire a = new CoreWire(t, 4, 1); + a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE); + + t.executeAll(); + + assertEquals(11, a.getValues().getUnsignedValueLong()); + assertEquals(-5, a.getValues().getSignedValueLong()); + } + + boolean flag = false; + + @Test + void simpleTimelineTest() + { + Timeline t = new Timeline(3); + flag = false; + t.addEvent((e) -> + { + if (!flag) + fail("Events executed out of order!"); + flag = false; + }, 15); + t.addEvent((e) -> + { + if (flag) + fail("Events executed out of order!"); + flag = true; + }, 10); + t.addEvent((e) -> + { + if (flag) + fail("Events executed out of order!"); + flag = true; + }, 20); + t.addEvent((e) -> + { + fail("Only supposed to execute until timestamp 20, not 25"); + }, 25); + + t.executeUntil(t.laterThan(20), 100); + + if (!flag) + fail("Not all events were executed in order!"); + } + + // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes + @Disabled("Out of date") + @Test + void multipleInputs() + { + CoreWire w = new CoreWire(t, 2, 1); + ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd(); + wI1.feedSignals(Bit.ONE, Bit.Z); + wI2.feedSignals(Bit.Z, Bit.X); + t.executeAll(); + assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X); + + wI2.feedSignals(Bit.ZERO, Bit.Z); + t.executeAll(); + assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z); + + wI2.feedSignals(Bit.Z, Bit.Z); + t.executeAll(); + assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); + + wI2.feedSignals(Bit.ONE, Bit.Z); + ReadEnd rE = w.createReadOnlyEnd(); + rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change.")); + t.executeAll(); + rE.close(); + wI1.feedSignals(Bit.X, Bit.X); + t.executeAll(); + wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed.")); + wI1.close(); + assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z); + } + + private static void assertBitArrayEquals(BitVector actual, Bit... expected) + { + assertArrayEquals(expected, actual.getBits()); + } +} diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java new file mode 100644 index 00000000..a3689a30 --- /dev/null +++ b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/GUITest.java @@ -0,0 +1,302 @@ +package net.mograsim.logic.core.tests; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.WindowConstants; + +import net.mograsim.logic.core.components.CoreManualSwitch; +import net.mograsim.logic.core.components.gates.CoreNotGate; +import net.mograsim.logic.core.components.gates.CoreOrGate; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.Timeline.ExecutionResult; +import net.mograsim.logic.core.wires.CoreWire; + +public class GUITest extends JPanel +{ + + private static final long serialVersionUID = 1L; + + private static final int WIRE_DELAY = 40; + private static final int OR_DELAY = 100; + private static final int NOT_DELAY = 100; + + private Timeline t = new Timeline(11); + + CoreWire r = new CoreWire(t, 1, WIRE_DELAY); + CoreWire s = new CoreWire(t, 1, WIRE_DELAY); + CoreWire t1 = new CoreWire(t, 1, WIRE_DELAY); + CoreWire t2 = new CoreWire(t, 1, WIRE_DELAY); + CoreWire q = new CoreWire(t, 1, WIRE_DELAY); + CoreWire nq = new CoreWire(t, 1, WIRE_DELAY); + + CoreManualSwitch rIn = new CoreManualSwitch(t, r.createReadWriteEnd()); + CoreManualSwitch sIn = new CoreManualSwitch(t, s.createReadWriteEnd()); + + CoreOrGate or1 = new CoreOrGate(t, OR_DELAY, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd()); + CoreOrGate or2 = new CoreOrGate(t, OR_DELAY, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd()); + CoreNotGate not1 = new CoreNotGate(t, NOT_DELAY, t2.createReadOnlyEnd(), q.createReadWriteEnd()); + CoreNotGate not2 = new CoreNotGate(t, NOT_DELAY, t1.createReadOnlyEnd(), nq.createReadWriteEnd()); + + Map switchMap = new HashMap<>(); + + int height; + int width; + boolean sizeChanged; + + public GUITest() + { + addMouseListener(new MouseListener() + { + + @Override + public void mouseReleased(MouseEvent e) + { + for (Entry dim : switchMap.entrySet()) + { + if (dim.getValue().contains(e.getPoint())) + { + dim.getKey().switchFullOff(); + repaint(); + } + } + } + + @Override + public void mousePressed(MouseEvent e) + { + for (Entry dim : switchMap.entrySet()) + { + if (dim.getValue().contains(e.getPoint())) + { + dim.getKey().switchFullOn(); + repaint(); + } + } + } + + @Override + public void mouseExited(MouseEvent e) + { + // none + } + + @Override + public void mouseEntered(MouseEvent e) + { + // none + } + + @Override + public void mouseClicked(MouseEvent e) + { + // If you want toggle buttons, use this code instead +// for (Entry dim : switchMap.entrySet()) { +// if (dim.getValue().contains(e.getPoint())) { +// dim.getKey().toggle(); +// repaint(); +// } +// } + } + }); + } + + public Timeline getTimeline() + { + return t; + } + + @Override + public void paint(Graphics some_g) + { + super.paint(some_g); + Graphics2D g = ((Graphics2D) some_g); + g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); + + checkSizeChange(); + adaptFont(g); + + drawWire(g, r, "r", 2, 9, 4, 9); + + drawWire(g, s, "s", 2, 3, 4, 3); + + drawWire(g, t2, "t2", 5, 8.5, 6, 8.5); + + drawWire(g, t1, "t1", 5, 3.5, 6, 3.5); + + drawWire(g, q, "q", 7, 8.5, 9, 8.5); + + drawWire(g, nq, "nq", 7, 3.5, 9, 3.5); + + drawWire(g, q, "", 7.5, 8.5, 7.5, 7.5); + drawWire(g, q, "", 7.5, 7.5, 3, 4.5); + drawWire(g, q, "", 3, 4.5, 3, 4); + drawWire(g, q, "q", 3, 4, 4, 4); + + drawWire(g, nq, "", 7.5, 3.5, 7.5, 4.5); + drawWire(g, nq, "", 7.5, 4.5, 3, 7.5); + drawWire(g, nq, "", 3, 7.5, 3, 8); + drawWire(g, nq, "nq", 3, 8, 4, 8); + + drawSquare(g, 4, 8, "OR"); + drawSquare(g, 4, 3, "OR"); + + drawSquare(g, 6, 8, "NOT"); + drawSquare(g, 6, 3, "NOT"); + + drawSwitch(g, rIn, "Switch R", 0.5, 8.25, 2, 9.75); + drawSwitch(g, sIn, "Switch S", 0.5, 2.25, 2, 3.75); + + drawString(g, "Hint: drag the cursor out of the pressed switch to keep it's state", 5, 0, 0.0, 1.0); + } + + private void checkSizeChange() + { + sizeChanged = height != getHeight() || width != getWidth(); + if (sizeChanged) + { + height = getHeight(); + width = getWidth(); + } + } + + private void adaptFont(Graphics g) + { + g.setFont(g.getFont().deriveFont(Math.min(height, width) / 40f)); + } + + @SuppressWarnings("static-method") + private void drawString(Graphics g, String s, int x, int y, double anchorX, double anchorY) + { + int h = g.getFontMetrics().getAscent(); + int w = g.getFontMetrics().stringWidth(s); + g.drawString(s, x - (int) (w * anchorX), y + (int) (h * anchorY)); + } + + private void drawWire(Graphics g, CoreWire wa, String name, double x1, double y1, double x2, double y2) + { + setTo(g, wa); + g.drawLine(gX(x1), gY(y1), gX(x2), gY(y2)); + drawString(g, name, (gX(x1) + gX(x2)) / 2, (gY(y1) + gY(y2)) / 2 - 5, 0, 0); + } + + private void drawSquare(Graphics g, int posX, int posY, String text) + { + int x1 = gX(posX) - 5; + int x2 = gX(posX + 1) + 5; + int y1 = gY(posY) - 5; + int y2 = gY(posY + 1) + 5; + + g.setColor(Color.WHITE); + g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + setBlack(g); + g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5); + + } + + private void drawSwitch(Graphics g, CoreManualSwitch ms, String text, double posX1, double posY1, double posX2, double posY2) + { + int x1 = gX(posX1) - 5; + int x2 = gX(posX2) + 5; + int y1 = gY(posY1) - 5; + int y2 = gY(posY2) + 5; + + if (sizeChanged) + { + Rectangle r = new Rectangle(x1, y1, x2 - x1, y2 - y1); + switchMap.put(ms, r); + } + + g.setColor(ms.isFullOn() ? Color.getHSBColor(.3f, .5f, 1f) : Color.WHITE); + g.fillRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + setBlack(g); + g.drawRect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); + drawString(g, text, (x1 + x2) / 2, (y1 + y2) / 2, 0.5, 0.5); + } + + private static void setBlack(Graphics g) + { + g.setColor(Color.BLACK); + } + + private static void setTo(Graphics g, CoreWire wa) + { + switch (wa.getValue()) + { + case ONE: + g.setColor(Color.GREEN); + break; + case X: + g.setColor(Color.RED); + break; + case Z: + g.setColor(Color.DARK_GRAY); + break; + case ZERO: + g.setColor(Color.BLACK); + break; + case U: + g.setColor(Color.MAGENTA); + break; + default: + throw new IllegalArgumentException(); + } + } + + private int gY(double pos) + { + return (int) (pos * height / 11); + } + + private int gX(double pos) + { + return (int) (pos * width / 11) + 50; + } + + public static void main(String[] args) + { + JFrame f = new JFrame("Test circuit 1.0.0"); + GUITest gt = new GUITest(); + f.add(gt); + f.setSize(800, 600); + f.setLocation(500, 400); + f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + f.setVisible(true); + + long begin = System.currentTimeMillis(); + + long lastFrame = begin; + long updateT = 16; + + while (f.isVisible()) + { + ExecutionResult er = gt.getTimeline().executeUntil(gt.getTimeline().laterThan((lastFrame - begin) * 3), lastFrame + 14); +// if (t.hasNext()) +// t.executeNext(); + if (er != ExecutionResult.NOTHING_DONE) + gt.repaint(12); + try + { + Thread.sleep(Math.max(updateT - System.currentTimeMillis() + lastFrame, 0)); + } + catch (Exception e) + { + e.printStackTrace(); + } + lastFrame = System.currentTimeMillis(); + } + } +} diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java new file mode 100644 index 00000000..5056345f --- /dev/null +++ b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/tests/TestCoreBitDisplay.java @@ -0,0 +1,52 @@ +package net.mograsim.logic.core.tests; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import java.util.function.LongConsumer; + +import net.mograsim.logic.core.components.CoreBitDisplay; +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.timeline.TimelineEventHandler; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; + +public final class TestCoreBitDisplay extends CoreBitDisplay +{ + + public TestCoreBitDisplay(Timeline timeline, ReadEnd in) + { + super(timeline, in); + } + + public void assertDisplays(Bit... expected) + { + assertArrayEquals(expected, getDisplayedValue().getBits()); + } + + public void assertAfterSimulationIs(Bit... expected) + { + timeline.executeAll(); + assertDisplays(expected); + } + + public void assertAfterSimulationIs(LongConsumer r, Bit... expected) + { + while (timeline.hasNext()) + { + timeline.executeNext(); + r.accept(timeline.getSimulationTime()); + } + assertDisplays(expected); + } + + @Override + protected TimelineEventHandler compute() + { + TimelineEventHandler handler = super.compute(); + return e -> + { + handler.handle(e); + System.out.println("update: value is " + getDisplayedValue()); + }; + } +} diff --git a/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java new file mode 100644 index 00000000..2b46a6c7 --- /dev/null +++ b/tests/net.mograsim.logic.tests/src/net/mograsim/logic/core/types/BitVectorTest.java @@ -0,0 +1,289 @@ +package net.mograsim.logic.core.types; + +import static net.mograsim.logic.core.types.BitVector.*; +import static net.mograsim.logic.core.types.Bit.*; +import static org.junit.jupiter.api.Assertions.*; + +import java.math.BigInteger; +import java.util.Iterator; + +import org.junit.jupiter.api.Test; + +class BitVectorTest +{ + + @Test + void testOfBitArray() + { + BitVector.of(); // should be allowed and work + + assertSame(SINGLE_U, BitVector.of(U)); + assertSame(SINGLE_X, BitVector.of(X)); + assertSame(SINGLE_0, BitVector.of(ZERO)); + assertSame(SINGLE_1, BitVector.of(ONE)); + assertSame(SINGLE_Z, BitVector.of(Z)); + } + + @Test + void testOfBitInt() + { + assertEquals(BitVector.of(), BitVector.of(ONE, 0)); + + assertSame(SINGLE_U, BitVector.of(U, 1)); + assertSame(SINGLE_X, BitVector.of(X, 1)); + assertSame(SINGLE_0, BitVector.of(ZERO, 1)); + assertSame(SINGLE_1, BitVector.of(ONE, 1)); + assertSame(SINGLE_Z, BitVector.of(Z, 1)); + + assertEquals(BitVector.of(X, X, X), BitVector.of(X, 3)); + } + + @Test + void testGetUnsignedValue() + { + assertEquals(BigInteger.valueOf(0b101), BitVector.parse("101").getUnsignedValue()); + assertEquals(BigInteger.valueOf(0b01010), BitVector.parse("01010").getUnsignedValue()); + assertEquals(BigInteger.valueOf(0), BitVector.parse("0000").getUnsignedValue()); + assertEquals(BigInteger.valueOf(0b0000000101), BitVector.parse("0000000101").getUnsignedValue()); + assertEquals(BigInteger.valueOf(0b1010000000), BitVector.parse("1010000000").getUnsignedValue()); + + assertThrows(NumberFormatException.class, () -> BitVector.parse("00X1").getUnsignedValue()); + } + + @Test + void testOfLongInt() + { + assertEquals(BitVector.parse("101"), BitVector.from(0b101L, 3)); + assertEquals(BitVector.parse("01010"), BitVector.from(0b01010L, 5)); + assertEquals(BitVector.parse("10101"), BitVector.from(-11L, 5)); + assertEquals(BitVector.parse("0000"), BitVector.from(0L, 4)); + } + + @Test + void testOfBigIntegerInt() + { + assertEquals(BitVector.parse("101"), BitVector.from(BigInteger.valueOf(0b101), 3)); + assertEquals(BitVector.parse("01010"), BitVector.from(BigInteger.valueOf(0b01010), 5)); + assertEquals(BitVector.parse("10101"), BitVector.from(BigInteger.valueOf(-11), 5)); + assertEquals(BitVector.parse("0000"), BitVector.from(BigInteger.valueOf(0), 4)); + } + + @Test + void testMutator() + { + var bv = BitVector.SINGLE_1; + var bvm = bv.mutator(); + + assertFalse(bvm.isEmpty()); + assertEquals(ONE, bvm.getLSBit(0)); + assertEquals(SINGLE_1, bvm.toBitVector()); + } + + @Test + void testGetMSBit() + { + assertEquals(ONE, SINGLE_1.getMSBit(0)); + assertEquals(ONE, BitVector.of(ONE, X, X, X).getMSBit(0)); + assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getMSBit(4)); + } + + @Test + void testGetLSBit() + { + assertEquals(ONE, SINGLE_1.getLSBit(0)); + assertEquals(ONE, BitVector.of(X, X, X, ONE).getLSBit(0)); + assertEquals(ONE, BitVector.of(X, X, X, X, ONE, X).getLSBit(1)); + } + + @Test + void testGetBits() + { + assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.of(X, ONE, Z).getBits()); + assertArrayEquals(new Bit[] { X, ONE, Z }, BitVector.parse("X1Z").getBits()); + } + + @Test + void testIsBinary() + { + assertTrue(SINGLE_0.isBinary()); + assertTrue(SINGLE_1.isBinary()); + + assertFalse(SINGLE_U.isBinary()); + assertFalse(SINGLE_X.isBinary()); + assertFalse(SINGLE_Z.isBinary()); + + assertTrue(BitVector.of(ONE, ZERO, ONE, ONE, ZERO).isBinary()); + assertFalse(BitVector.of(ONE, ZERO, ZERO, X).isBinary()); + } + + @Test + void testJoin() + { + // binary + assertEquals(SINGLE_0, SINGLE_0.join(SINGLE_0)); + assertEquals(SINGLE_X, SINGLE_0.join(SINGLE_1)); + assertEquals(SINGLE_1, SINGLE_1.join(SINGLE_1)); + + // other + assertEquals(SINGLE_1, SINGLE_Z.join(SINGLE_1)); + assertEquals(SINGLE_U, SINGLE_0.join(SINGLE_U)); + assertEquals(SINGLE_X, SINGLE_X.join(SINGLE_Z)); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, Z).join(BitVector.of(ONE, ZERO, ZERO, ONE, Z)); + assertEquals(BitVector.of(U, X, ZERO, ONE, Z), result); + } + + @Test + void testAnd() + { + // binary + assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_0)); + assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_1)); + assertEquals(SINGLE_1, SINGLE_1.and(SINGLE_1)); + + // other + assertEquals(SINGLE_X, SINGLE_Z.and(SINGLE_1)); + assertEquals(SINGLE_0, SINGLE_0.and(SINGLE_U)); + assertEquals(SINGLE_X, SINGLE_X.and(SINGLE_Z)); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, ONE).and(BitVector.of(ONE, ONE, ZERO, ZERO, ONE)); + assertEquals(BitVector.of(U, X, ZERO, ZERO, ONE), result); + } + + @Test + void testOr() + { + // binary + assertEquals(SINGLE_0, SINGLE_0.or(SINGLE_0)); + assertEquals(SINGLE_1, SINGLE_0.or(SINGLE_1)); + assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_1)); + + // other + assertEquals(SINGLE_1, SINGLE_Z.or(SINGLE_1)); + assertEquals(SINGLE_1, SINGLE_1.or(SINGLE_U)); + assertEquals(SINGLE_X, SINGLE_X.or(SINGLE_Z)); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, ZERO).or(BitVector.of(ZERO, ZERO, ZERO, ONE, ONE)); + assertEquals(BitVector.of(U, X, ZERO, ONE, ONE), result); + } + + @Test + void testXor() + { + // binary + assertEquals(SINGLE_0, SINGLE_0.xor(SINGLE_0)); + assertEquals(SINGLE_1, SINGLE_0.xor(SINGLE_1)); + assertEquals(SINGLE_0, SINGLE_1.xor(SINGLE_1)); + + // other + assertEquals(SINGLE_X, SINGLE_Z.xor(SINGLE_1)); + assertEquals(SINGLE_U, SINGLE_0.xor(SINGLE_U)); + assertEquals(SINGLE_X, SINGLE_X.xor(SINGLE_Z)); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, ONE).xor(BitVector.of(ONE, ZERO, ZERO, ZERO, ONE)); + assertEquals(BitVector.of(U, X, ZERO, ONE, ZERO), result); + } + + @Test + void testNot() + { + // binary + assertEquals(SINGLE_1, SINGLE_0.not()); + assertEquals(SINGLE_0, SINGLE_1.not()); + + // other + assertEquals(SINGLE_U, SINGLE_U.not()); + assertEquals(SINGLE_X, SINGLE_X.not()); + assertEquals(SINGLE_X, SINGLE_Z.not()); + + // higher length + var result = BitVector.of(U, X, ZERO, ONE, Z).not(); + assertEquals(BitVector.of(U, X, ONE, ZERO, X), result); + } + + @Test + void testLength() + { + assertEquals(0, BitVector.of().length()); + assertEquals(1, SINGLE_0.length()); + assertEquals(3, BitVector.of(X, X, Z).length()); + } + + @Test + void testConcat() + { + assertEquals(BitVector.of(U, X), SINGLE_U.concat(SINGLE_X)); + assertEquals(BitVector.of(Z, X, U, ONE, X), BitVector.of(Z, X, U).concat(BitVector.of(ONE, X))); + } + + @Test + void testSubVectorInt() + { + assertEquals(SINGLE_0, SINGLE_0.subVector(0)); + assertEquals(BitVector.of(), SINGLE_0.subVector(1)); + assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1)); + assertEquals(BitVector.of(X, Z), BitVector.of(ZERO, U, ONE, X, Z).subVector(3)); + } + + @Test + void testSubVectorIntInt() + { + assertEquals(SINGLE_0, SINGLE_0.subVector(0, 1)); + assertEquals(BitVector.of(), SINGLE_0.subVector(0, 0)); + assertEquals(SINGLE_0, BitVector.of(ONE, ZERO).subVector(1, 2)); + assertEquals(BitVector.of(ONE, X), BitVector.of(ZERO, U, ONE, X, Z).subVector(2, 4)); + } + + @Test + void testEqualsObject() + { + assertEquals(SINGLE_X, SINGLE_X); + assertNotEquals(SINGLE_0, SINGLE_1); + + assertEquals(BitVector.of(X, Z, U), BitVector.of(X, Z, U)); + assertNotEquals(BitVector.of(X, Z, U), BitVector.of(X, X, U)); + } + + @Test + void testEqualsWithOffset() + { + assertTrue(SINGLE_X.equalsWithOffset(SINGLE_X, 0)); + assertFalse(SINGLE_0.equalsWithOffset(SINGLE_1, 0)); + + assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(Z, U), 1)); + assertFalse(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(X, U), 1)); + assertTrue(BitVector.of(X, Z, U).equalsWithOffset(BitVector.of(U), 2)); + } + + @Test + void testParse() + { + assertEquals(SINGLE_U, BitVector.parse("U")); + assertEquals(SINGLE_X, BitVector.parse("X")); + assertEquals(SINGLE_0, BitVector.parse("0")); + assertEquals(SINGLE_1, BitVector.parse("1")); + assertEquals(SINGLE_Z, BitVector.parse("Z")); + + assertEquals(BitVector.of(X, U, Z, ONE, ZERO), BitVector.parse("XUZ10")); + + assertThrows(RuntimeException.class, () -> BitVector.parse("01BX")); + } + + @Test + void testIterator() + { + var bv = BitVector.of(U, Z, ONE, ZERO, X); + Iterator it = bv.iterator(); + + assertEquals(U, it.next()); + assertEquals(Z, it.next()); + assertEquals(ONE, it.next()); + assertEquals(ZERO, it.next()); + assertEquals(X, it.next()); + assertFalse(it.hasNext()); + } +} diff --git a/tests/net.mograsim.machine.tests/.classpath b/tests/net.mograsim.machine.tests/.classpath new file mode 100644 index 00000000..e61c696d --- /dev/null +++ b/tests/net.mograsim.machine.tests/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/tests/net.mograsim.machine.tests/.project b/tests/net.mograsim.machine.tests/.project new file mode 100644 index 00000000..c9605526 --- /dev/null +++ b/tests/net.mograsim.machine.tests/.project @@ -0,0 +1,28 @@ + + + net.mograsim.machine.tests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/tests/net.mograsim.machine.tests/.settings/org.eclipse.core.resources.prefs b/tests/net.mograsim.machine.tests/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/tests/net.mograsim.machine.tests/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.core.prefs b/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8bd225a --- /dev/null +++ b/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,456 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=info +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=warning +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=info +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=info +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=disabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=info +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=warning +org.eclipse.jdt.core.compiler.problem.unusedParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=11 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=next_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=true +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=false +org.eclipse.jdt.core.formatter.comment.indent_root_tags=false +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=140 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=140 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 00000000..8f2c0a47 --- /dev/null +++ b/tests/net.mograsim.machine.tests/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,63 @@ +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_MoGraSim +formatter_settings_version=16 +sp_cleanup.add_default_serial_version_id=true +sp_cleanup.add_generated_serial_version_id=false +sp_cleanup.add_missing_annotations=true +sp_cleanup.add_missing_deprecated_annotations=true +sp_cleanup.add_missing_methods=false +sp_cleanup.add_missing_nls_tags=false +sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=true +sp_cleanup.add_serial_version_id=false +sp_cleanup.always_use_blocks=true +sp_cleanup.always_use_parentheses_in_expressions=false +sp_cleanup.always_use_this_for_non_static_field_access=false +sp_cleanup.always_use_this_for_non_static_method_access=false +sp_cleanup.convert_functional_interfaces=false +sp_cleanup.convert_to_enhanced_for_loop=false +sp_cleanup.correct_indentation=false +sp_cleanup.format_source_code=true +sp_cleanup.format_source_code_changes_only=false +sp_cleanup.insert_inferred_type_arguments=false +sp_cleanup.make_local_variable_final=true +sp_cleanup.make_parameters_final=false +sp_cleanup.make_private_fields_final=true +sp_cleanup.make_type_abstract_if_missing_method=false +sp_cleanup.make_variable_declarations_final=false +sp_cleanup.never_use_blocks=false +sp_cleanup.never_use_parentheses_in_expressions=true +sp_cleanup.on_save_use_additional_actions=false +sp_cleanup.organize_imports=false +sp_cleanup.qualify_static_field_accesses_with_declaring_class=false +sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +sp_cleanup.qualify_static_member_accesses_with_declaring_class=false +sp_cleanup.qualify_static_method_accesses_with_declaring_class=false +sp_cleanup.remove_private_constructors=true +sp_cleanup.remove_redundant_modifiers=false +sp_cleanup.remove_redundant_semicolons=false +sp_cleanup.remove_redundant_type_arguments=false +sp_cleanup.remove_trailing_whitespaces=false +sp_cleanup.remove_trailing_whitespaces_all=true +sp_cleanup.remove_trailing_whitespaces_ignore_empty=false +sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_nls_tags=false +sp_cleanup.remove_unused_imports=false +sp_cleanup.remove_unused_local_variables=false +sp_cleanup.remove_unused_private_fields=true +sp_cleanup.remove_unused_private_members=false +sp_cleanup.remove_unused_private_methods=true +sp_cleanup.remove_unused_private_types=true +sp_cleanup.sort_members=false +sp_cleanup.sort_members_all=false +sp_cleanup.use_anonymous_class_creation=false +sp_cleanup.use_blocks=false +sp_cleanup.use_blocks_only_for_return_and_throw=false +sp_cleanup.use_lambda=true +sp_cleanup.use_parentheses_in_expressions=false +sp_cleanup.use_this_for_non_static_field_access=false +sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true +sp_cleanup.use_this_for_non_static_method_access=false +sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true diff --git a/tests/net.mograsim.machine.tests/META-INF/MANIFEST.MF b/tests/net.mograsim.machine.tests/META-INF/MANIFEST.MF new file mode 100644 index 00000000..175305b4 --- /dev/null +++ b/tests/net.mograsim.machine.tests/META-INF/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Machine Tests +Bundle-SymbolicName: net.mograsim.machine.tests;singleton:=true +Bundle-Version: 0.1.0.qualifier +Bundle-Vendor: Mograsim Team +Fragment-Host: net.mograsim.machine;bundle-version="0.1.0" +Automatic-Module-Name: net.mograsim.machine.tests +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.junit;bundle-version="4.12.0", + org.junit.jupiter.api;bundle-version="5.4.0";visibility:=reexport, + org.junit.jupiter.params;bundle-version="5.4.0";visibility:=reexport diff --git a/tests/net.mograsim.machine.tests/build.properties b/tests/net.mograsim.machine.tests/build.properties new file mode 100644 index 00000000..34d2e4d2 --- /dev/null +++ b/tests/net.mograsim.machine.tests/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/tests/net.mograsim.machine.tests/src/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java b/tests/net.mograsim.machine.tests/src/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java new file mode 100644 index 00000000..ae8e8153 --- /dev/null +++ b/tests/net.mograsim.machine.tests/src/net/mograsim/machine/standard/memory/WordAddressableMemoryTest.java @@ -0,0 +1,70 @@ +package net.mograsim.machine.standard.memory; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.math.BigInteger; +import java.util.Random; +import java.util.stream.LongStream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import net.mograsim.logic.core.timeline.Timeline; +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd; +import net.mograsim.machine.MainMemoryDefinition; + +class WordAddressableMemoryTest +{ + + private Timeline t = new Timeline(10); + + @ParameterizedTest(name = "seed = {0}") + @MethodSource("seedsForRandom") + public void wordAddressableMemoryLargeTest(long seed) + { + CoreWire rW = new CoreWire(t, 1, 2); + CoreWire data = new CoreWire(t, 16, 2); + CoreWire address = new CoreWire(t, 64, 2); + ReadWriteEnd rWI = rW.createReadWriteEnd(); + ReadWriteEnd dataI = data.createReadWriteEnd(); + ReadWriteEnd addressI = address.createReadWriteEnd(); + + @SuppressWarnings("unused") + CoreWordAddressableMemory memory = new CoreWordAddressableMemory(t, 4, + new WordAddressableMemory(MainMemoryDefinition.create(64, 16, 4096L, Long.MAX_VALUE)), data.createReadWriteEnd(), + rW.createReadOnlyEnd(), address.createReadOnlyEnd()); + + Random r = new Random(seed); + for (long j = 1; j > 0; j *= 2) + { + for (int i = 0; i < 100; i++) + { + BitVector bAddress = BitVector.from(4096 + i + j, 64); + addressI.feedSignals(bAddress); + t.executeAll(); + String random = BigInteger.valueOf(Math.abs(r.nextInt())).toString(5); + random = random.substring(Integer.max(0, random.length() - 16)); + random = String.format("%16s", random).replace(' ', '0'); + random = random.replace('2', 'X').replace('3', 'Z').replace('4', 'U'); + BitVector vector = BitVector.parse(random); + dataI.feedSignals(vector); + rWI.feedSignals(Bit.ZERO); + t.executeAll(); + rWI.feedSignals(Bit.ONE); + t.executeAll(); + dataI.clearSignals(); + t.executeAll(); + + assertEquals(vector, dataI.getValues(), "seed=" + seed + ", j=" + j + ", i=" + i); + } + } + } + + public static LongStream seedsForRandom() + { + return LongStream.range(0, 20); + } +}